packages feed

transient-universe 0.3.4 → 0.3.5

raw patch · 32 files changed

+850/−27558 lines, 32 filesdep ~basedep ~transientnew-uploaderPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base, transient

API changes (from Hackage documentation)

- Transient.MapReduce: distribute' :: (Read a, Show a, Distributable vector a) => vector a -> Cloud (PartRef (vector a))
+ Transient.MapReduce: distribute' :: (Distributable vector a, Show a, Read a) => vector a -> Cloud (PartRef (vector a))
- Transient.MapReduce: mparallelize :: (Monoid a, Typeable * a, Read a, Show a) => (a1 -> Cloud a) -> [a1] -> Cloud a
+ Transient.MapReduce: mparallelize :: (Monoid a, Typeable * a, Show a, Read a) => (a1 -> Cloud a) -> [a1] -> Cloud a
- Transient.Move: atRemote :: (Typeable * a, Read a, Show a) => Cloud a -> Cloud a
+ Transient.Move: atRemote :: (Typeable * a, Show a, Read a) => Cloud a -> Cloud a
- Transient.Move: callNodes :: (Typeable * a1, Typeable * a, Read a1, Read a, Show a1, Show a) => (Cloud a1 -> Cloud a -> Cloud a) -> Cloud a -> Cloud a1 -> Cloud a
+ Transient.Move: callNodes :: (Typeable * a1, Typeable * a, Show a1, Show a, Read a1, Read a) => (Cloud a1 -> Cloud a -> Cloud a) -> Cloud a -> Cloud a1 -> Cloud a
- Transient.Move: copyData :: (Typeable * b, Read b, Show b) => b -> Cloud b
+ Transient.Move: copyData :: (Typeable * b, Show b, Read b) => b -> Cloud b
- Transient.Move: getBuffSize :: TransIO BuffSize
+ Transient.Move: getBuffSize :: TransIO Int
- Transient.Move.Services: callService' :: (Typeable * a, Typeable * b, Read a, Read b, Show a, Show b) => t -> Node -> a -> Cloud b
+ Transient.Move.Services: callService' :: (Typeable * a, Typeable * b, Show a, Show b, Read a, Read b) => t -> Node -> a -> Cloud b
- Transient.Move.Services: findInNodes :: (Alternative m, MonadIO m) => (Package, Program) -> m [Node]
+ Transient.Move.Services: findInNodes :: (MonadIO m, Alternative m) => (Package, Program) -> m [Node]
- Transient.Move.Services: initService :: (Show t, Read t, Typeable * t) => t -> (Package, Program) -> Cloud Node
+ Transient.Move.Services: initService :: (Typeable * t, Show t, Read t) => t -> (Package, Program) -> Cloud Node

Files

− .travis.yml
@@ -1,133 +0,0 @@-# Use new container infrastructure to enable caching
-sudo: false
-
-# Choose a lightweight base image; we provide our own build tools.
-language: c
-
-# Caching so the next build will be fast too.
-cache:
-  directories:
-  - $HOME/.ghc
-  - $HOME/.cabal
-  - $HOME/.stack
-  - $HOME/.ghcjs
-
-# The different configurations we want to test. We have BUILD=cabal which uses
-# cabal-install, and BUILD=stack which uses Stack. More documentation on each
-# of those below.
-#
-# We set the compiler values here to tell Travis to use a different
-# cache file per set of arguments.
-#
-# If you need to have different apt packages for each combination in the
-# matrix, you can use a line such as:
-#     addons: {apt: {packages: [libfcgi-dev,libgmp-dev]}}
-matrix:
-  include:
-  # We grab the appropriate GHC and cabal-install versions from hvr's PPA. See:
-  # https://github.com/hvr/multi-ghc-travis
-  - env: BUILD=cabal GHCVER=7.10.2 CABALVER=1.22
-    compiler: ": #GHC 7.10.2"
-    addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2], sources: [hvr-ghc]}}
-  - env: BUILD=cabal GHCVER=7.10.3 CABALVER=1.22
-    compiler: ": #GHC 7.10.3"
-    addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3], sources: [hvr-ghc]}}
-  - env: BUILD=cabal GHCVER=8.0.1 CABALVER=1.24
-    compiler: ": #GHC 8.0.1"
-    addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1], sources: [hvr-ghc]}}
-
-  # Build with the newest GHC and cabal-install. This is an accepted failure,
-  # see below.
-  - env: BUILD=cabal GHCVER=head  CABALVER=head
-    compiler: ": #GHC HEAD"
-    addons: {apt: {packages: [cabal-install-head,ghc-head], sources: [hvr-ghc]}}
-
-  # The Stack builds. We can pass in arbitrary Stack arguments via the ARGS
-  # variable, such as using --stack-yaml to point to a different file.
-  - env: BUILD=stack ARGS="--resolver lts-3"
-    compiler: ": #stack 7.10.2"
-    addons: {apt: {packages: [ghc-7.10.2], sources: [hvr-ghc]}}
-
-  - env: BUILD=stack ARGS="--resolver lts-5"
-    compiler: ": #stack 7.10.3 LTS 5"
-    addons: {apt: {packages: [ghc-7.10.3], sources: [hvr-ghc]}}
-
-  - env: BUILD=stack ARGS="--resolver lts-6"
-    compiler: ": #stack 7.10.3 LTS 6"
-    addons: {apt: {packages: [ghc-7.10.3], sources: [hvr-ghc]}}
-
-  # Nightly builds are allowed to fail
-  - env: BUILD=stack ARGS="--resolver nightly"
-    compiler: ": #stack nightly"
-    addons: {apt: {packages: [libgmp-dev]}}
-
-  # GHCJS build via stack
-  - env: BUILD=ghcjs ARGS="--stack-yaml=stack-ghcjs.yaml"
-    compiler: ": #stack GHCJS"
-    addons: {apt: {packages: [ghc-7.10.3], sources: [hvr-ghc]}}
-
-  # Build on OS X in addition to Linux
-  - env: BUILD=stack ARGS="--resolver lts-6"
-    compiler: ": #stack 7.10.3 LTS 6 (OS X)"
-    os: osx
-
-  allow_failures:
-  - env: BUILD=cabal GHCVER=head  CABALVER=head
-  - env: BUILD=stack ARGS="--resolver nightly"
-
-before_install:
-# Using compiler above sets CC to an invalid value, so unset it
-- unset CC
-- export CASHER_TIME_OUT=600
-
-# We want to always allow newer versions of packages when building on GHC HEAD
-- CABALARGS=""
-- if [ "x$GHCVER" = "xhead" ]; then CABALARGS=--allow-newer; fi
-
-# Download and unpack the stack executable
-- export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$HOME/.local/bin:$PATH
-- mkdir -p ~/.local/bin
-- |
-  if [ `uname` = "Darwin" ]
-  then
-    curl --insecure -L https://www.stackage.org/stack/osx-x86_64 | tar xz --strip-components=1 --include '*/stack' -C ~/.local/bin
-  else
-    curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
-  fi
-
-install:
-- echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
-- if [ -f configure.ac ]; then autoreconf -i; fi
-- |
-  case "$BUILD" in
-    stack)
-      stack --no-terminal --install-ghc $ARGS test --only-dependencies
-      ;;
-    cabal)
-      cabal --version
-      travis_retry cabal update
-      cabal install --only-dependencies --enable-tests --enable-benchmarks --force-reinstalls --ghc-options=-O0 --reorder-goals --max-backjumps=-1 $CABALARGS
-      ;;
-    ghcjs)
-      stack --no-terminal setup $ARGS
-      stack --no-terminal --install-ghc $ARGS test --only-dependencies
-      ;;
-  esac
-
-script:
-- |
-  case "$BUILD" in
-    cabal)
-      cabal configure --enable-tests --enable-benchmarks -v2 --ghc-options="-O0 -Werror"
-      cabal build
-      cabal check || [ "$CABALVER" == "1.16" ]
-      cabal test
-      cabal sdist
-      cabal copy
-      SRC_TGZ=$(cabal info . | awk '{print $2;exit}').tar.gz && \
-        (cd dist && cabal install --force-reinstalls "$SRC_TGZ")
-      ;;
-    *)
-      stack --no-terminal $ARGS test --haddock --no-haddock-deps
-      ;;
-  esac
− README.md
@@ -1,122 +0,0 @@-![](https://raw.githubusercontent.com/agocorona/transient/master/logo.ico)
-
-See the [Wiki](https://github.com/agocorona/transient/wiki)
-
-transient-universe is the distributed computing extension of [transient](https://github.com/agocorona/transient).  It support moving computations (Haskell closures) from a computer in the network to another even among different architectures:  Linux nodes can work with windows and browser nodes running haskell compiled with [ghcjs](https://github.com/ghcjs/ghcjs).
-
-The primitives that perform the moving of computations are called `wormhole` and `teleport`, the names expresses the semantic. Hence the name of the package.
-
-All the nodes run the same program compiled for different architectures. It defines a Cloud way of computing (monad). It is a thin layer on top of transient with additional primitives and services that run a single program  in one or many nodes.
-
-Browser integration
-==================
-
-Browser nodes, running transient programs compiled with ghcjs are integrated with server nodes, using websockets communications. Just compile the program with ghcjs and point the browser to http://server:port. The server nodes have a HTTP server that will send the compiled program to the browser.
-
-Distributed Browser/server Widgets
--------
-Browser nodes can integrate Hplayground for ghcjs, a reactive client side library based in trasient (package ghcjs-hplay) they can create widgets with HTML form elements and control the server nodes. A computation can move from browser to server and back at runtime despite the different architecture.
-
-Widgets with code running in browser and servers can compose with other widgets. A Browser node can gain access to many server nodes trough the  server that delivered the web application. 
-
-These features can make transient ideal for client as well as server side-driven applications, whenever distribution and push-driven reactivity is necessary either in the servers or in the browser clients.
-
-Map-reduce
-==========
-transient-universe implements map-reduce in the style of [spark](http://spark.apache.org) as a particular case. It is at the same time a hard test of the distributed primitives since it involves a complex choreography of movement of computations. It supports in memory operations and caching. resilience (restart from the last checkpoint in case of failure) is not implemented but it is foreseen.
-
-Look at [this article](https://www.schoolofhaskell.com/user/agocorona/estimation-of-using-distributed-computing-streaming-transient-effects-vi-1#distributed-datasets)
-
-There is a runnable example: [DistrbDataSets.hs](https://github.com/agocorona/transient-universe/blob/master/examples/DistrbDataSets.hs) that you can executed with:
-
-> runghc ./examples/DistrbDataSets.hs
-
-It uses a number of simulated nodes to calculate the frequency of words in a long text.
-
-
-General distributed primitives
-=============================
-`teleport` is a  primitive that translates computations back and forth reusing an already opened connection.
-
-The connection is initiated by `wormhole`  with another node. This can be done anywhere in a computation without breaking composability. As always, Everything is composable.
-
-both primitives support also streaming among nodes in an efficient way. It means that a remote call  can return not a single response but many of them.
-
-All the other distributed primitives: `runAt`, `streamFrom` `clustered` etc are rewritten in terms of these two.
-
-How to run the ghcjs example:
-=============================
-You need ghc and ghcjs installed.
-
-clone and install perch:
-
-    > git clone https://github.com/geraldus/ghcjs-perch
-    > cd ghcjs-perch
-    > cabal install --ghcjs -f ghcjs
-
-clone and install  transient:
-
-    > git clone https://github.com/agocorona/transient
-    > cd transient
-    > cabal install
-    > cabal install --ghcjs
-
-clone and install hplay:
-
-    > git clone https://github.com/agocorona/ghcjs-hplay
-    > cd ghcjs-hplay
-    > cabal install
-    > cabal install --ghcjs -f ghcjs
-
-clone and install  transient-universe:
-
-    > git clone https://github.com/agocorona/transient-universe
-    > cd transient-universe
-    > cabal install
-    > cabal install --ghcjs
-
-for fast development interactions, use the script
-
-    > buildrun examples/webapp.hs
-
-This will compile examples/webapp.hs for ghcjs and run it interpreted with runghc
-
-
-then point a browser to: http:localhost:2020
-
-See this [video](https://www.livecoding.tv/agocorona/videos/Ke1Qz-seamless-composable-web-programming) to see this example running:
-
-The test program run among other things, two copies of a widget that start, stop and display a counter that run in the server.
-
-Documentation
-=============
-
-The [Wiki](https://github.com/agocorona/transient/wiki) is more user oriented
-
-My video sessions in [livecoding.tv](https://www.livecoding.tv/agocorona/videos/) not intended as tutorials or presentations, but show some of the latest features running.
-
-The articles are more tecnical:
-
-- [Philosophy, async, parallelism, thread control, events, Session state](https://www.fpcomplete.com/user/agocorona/EDSL-for-hard-working-IT-programmers?show=tutorials)
-- [Backtracking and undoing IO transactions](https://www.fpcomplete.com/user/agocorona/the-hardworking-programmer-ii-practical-backtracking-to-undo-actions?show=tutorials)
-- [Non-deterministic list like processing, multithreading](https://www.fpcomplete.com/user/agocorona/beautiful-parallel-non-determinism-transient-effects-iii?show=tutorials)
-- [Distributed computing](https://www.fpcomplete.com/user/agocorona/moving-haskell-processes-between-nodes-transient-effects-iv?show=tutorials)
-- [Publish-Subscribe variables](https://www.schoolofhaskell.com/user/agocorona/publish-subscribe-variables-transient-effects-v)
-- [Distributed streaming, map-reduce](https://www.schoolofhaskell.com/user/agocorona/estimation-of-using-distributed-computing-streaming-transient-effects-vi-1)
-
-These articles contain executable examples (not now, since the site no longer support the execution of haskell snippets).
-
-
-
-Future plans
-============
-The only way to improve it is using it. Please send me bugs and additional functionalities!
-
--I plan to improve map-reduce to create a viable platform for serious data analysis and machine learning using haskell. It will have a  web notebook running in the browser.
-
--Create services and examples for general Web applications with distributed servers and create services for them
-
-
-
-
-
+ app/client/Transient/Move/Services/MonitorService.hs view
@@ -0,0 +1,1 @@+main= return()
+ app/server/Transient/Move/Services/MonitorService.hs view
@@ -0,0 +1,65 @@+-----------------------------------------------------------------------------+--+-- Module      :  Transient.Move.Services.MonitorService+-- Copyright   :+-- License     :  MIT+--+-- Maintainer  :  agocorona@gmail.com+-- Stability   :+-- Portability :+--+-- |+--+-----------------------------------------------------------------------------++module Main where++import Transient.Base++import Transient.Move+import Transient.Move.Utils+import Transient.Move.Services+import Control.Applicative+import Control.Monad.IO.Class+import Data.List ((\\))++main = keep . runCloud $ do+    runService monitorService $ \(ident,service) -> do+       mnode <-  (local $ findInNodes service >>= return . Just . head) <|>+                  requestInstall ident service+       return (mnode :: Maybe Node)+    where+    installHere ident service@(package,program)= local $ do+        thisNode <-  getMyNode+        yn<- authorizeService ident service   -- !> "AUTHORIZE"+        if yn+          then do+              node <- liftIO $ do+                    port <- freePort+                    putStr "Monitor: installing " >> putStrLn package+                    install package program  (nodeHost thisNode) port+                    putStrLn "INSTALLED"+                    nodeService thisNode port service+              addNodes [node]+              return  $ Just node+          else return Nothing++    requestInstall :: String -> Service -> Cloud (Maybe Node)+    requestInstall ident service= do+        mnode <- installHere ident service          -- !> "INSTALLHERE"+        case mnode of+          Nothing -> installThere ident service+          justnode -> return justnode++    installThere ident service= do+        nodes  <- onAll $ findInNodes monitorService   -- !> "installThere"+        mynode <- onAll getMyNode                      -- !> nodes+        request $ nodes \\ [mynode]+        where+        request []= empty+        request (n:ns)= do+             mnode <- callService' ident n (ident,service)  -- !> ("calling",n)+             case mnode of+                Nothing  -> request ns+                justnode -> return justnode+
− buildrun.bat
@@ -1,4 +0,0 @@-ghcjs -isrc -i../transient/src -i../ghcjs-hplay/src -i../ghcjs-perch/src %1 -o static/out
-if %errorlevel% neq 0 exit
-runghc -isrc -i../transient/src -i../ghcjs-hplay/src -i../ghcjs-perch/src %1
-
− buildrun.sh
@@ -1,9 +0,0 @@-#!/bin/bash
-
-
-
-set -e
-
-
-ghcjs  -j2 -isrc -i../transient/src -i../transient-universe/src -i../ghcjs-hplay/src -i../ghcjs-perch/src $1 -o static/out
-runghc  -j2 -isrc -i../transient/src -i../transient-universe/src -i../ghcjs-hplay/src -i../ghcjs-perch/src $1 $2 $3 $4
− examples/Atm.hs
@@ -1,185 +0,0 @@-{-# LANGUAGE   CPP #-}
-
-module Main where
-
-import Prelude hiding (div)
-import Transient.Base
-#ifdef ghcjs_HOST_OS
-   hiding ( option,runCloud')
-#endif
-import GHCJS.HPlay.View
-#ifdef ghcjs_HOST_OS
-   hiding (map)
-#else
-   hiding (map, option,runCloud')
-#endif
-
-import  Transient.Move
-import Transient.Move.Utils
-import Control.Applicative
-import Control.Monad
-import Data.Typeable
-import Data.IORef
-import Control.Concurrent (threadDelay)
-import Control.Monad.IO.Class
-import Control.Concurrent.MVar
-import System.Random
-import System.IO.Unsafe
-
-data Operation= Operation String
-
--- Follows  http://www.math-cs.gordon.edu/courses/cs211/ATMExample/
--- to demostrate how it is possible to program at the user requiremente level
--- the program follows closely the specifications and be clear enough to be understood
--- by the client
-
-main= keep $ initNode atm
-
-
-
-atm= do
-   card <- waitCard
-   pin <- enterPIN
-   validateBank pin card
-   setData card
-   performTransactions <|> cancel
-   returnCard
-
-performTransactions = do
-    clearScreen
-    operation <- withdrawal <|> deposit <|> transfer <|> balanceInquiry
-    printReceipt operation
-    return ()
-
-withdrawal= do
-    local . render $ wlink ()  $ toElem "withdrawall"
-    local . render $ wprint "choose bank account"
-    account <- chooseAccount
-    wprint "Enter the quantity"
-    quantity <- getInt Nothing
-    if quantity `rem` 20 /= 0
-      then do
-        wprint "multiples of $20.00 please"
-        stop
-      else do
-        r <- approbalBank account quantity
-        case r of
-            False -> do
-                wprint "operation denied. sorry"
-                wprint "Another transaction?"
-                r <- wlink True (b "yes ") <|> wlink False << (b "No")
-                if not r then return ()
-                                 else performTransactions
-            True  ->  giveMoney r
-
-deposit= do
-    wlink () $ b "Deposit "
-    wprint "choose bank account"
-    account <- chooseAccount
-    r <- approbalBankDeposit account
-    case r of
-        False -> do wprint "operation denied. sorry"
-                    stop
-        True  -> do
-            r <- waitDeposit <|> timeout
-            case r of
-                False -> do wprint "timeout, sorry"; stop
-                True  -> return ()
-
-transfer= do
-    wlink () $ b "Transfer "
-    wprint "From"
-    ac <- chooseAccount
-    wprint "amount"
-    amount <- inputDouble Nothing
-    wprint "To"
-    ac' <- chooseAccount
-    transferAccBank ac ac' amount
-    return()
-
-balanceInquiry= do
-    wprint "From"
-    ac <- chooseAccount
-    r <- getBalanceBank ac
-    wprint $ "balance= "++ show r
-
-validateBank pin card = atRemote $ validate' pin card (0 :: Int)
-   where
-   validate' pin card times= local $ do
-    r <- verifyPinBank pin card
-    if r then return () else do
-     if times ==2
-      then do
-        wprint ("three tries. card will be retained" :: String)
-        stop
-
-      else validate' pin card $ times + 1
-
-rtotal= unsafePerformIO $ newEmptyMVar
-ractive= unsafePerformIO $ newMVar False
-
-switchOnOff= on <|> off
-  where
-  on= do
-     wbutton () "On"
-     wprint "enter total amount of money"
-     total <- getInt Nothing
-     liftIO $ do
-       tryTakeMVar rtotal
-       putMVar rtotal total
-  off= do
-     wbutton () "Off"
-     active <- liftIO $ readMVar ractive
-     if active then stop else wprint "ATM stopped"
-
-type AccountNumber= String
-newtype Card= Card [AccountNumber]  deriving Typeable
-
-waitCard = local $ render $ wbutton Card "enter card"
-
-enterPIN= local $ do
-      wprint "Enter PIN"
-      render $ getInt Nothing `fire` OnChange
-
-cancel= wbutton () "Cancel"
-
-returnCard= wprint "Card returned"
-
-clearScreen=  wraw $ forElems "body" $ this >> clear
-
-
-printReceipt= do
-    Operation str <- getSData <|> error "no operation"
-    wprint $ "receipt: Operation:"++ str
-
-chooseAccount= do
-    Card accounts <- getSData <|> error "transfer: no card"
-    wprint "choose an account"
-    mconcat[wlink ac (fromStr $ ' ':show ac) | ac <- accounts]
-
-approbalBank ac quantity= return True
-
-giveMoney n= wprint $ "Your money : " ++ show n ++ " Thanks"
-
-approbalBankDeposit ac= return True
-
-transferAccBank ac ac' amount= wprint $ "transfer from "++show ac ++ " to "++show ac ++ " done"
-
-getBalanceBank ac= liftIO $ do
-    r <- rand
-    return $ r * 1000
-
-verifyPinBank _ _= liftIO $ do
-    liftIO $ print "verifyPinBank"
-    r <- rand
-    if r > 0.2 then return True else return False
-
-waitDeposit = do
-     n <- liftIO rand
-     if n > 0.5 then return True else return False
-
-rand:: IO Double
-rand= randomRIO
-
-timeout t= threadDelay $ t * 1000000
-
− examples/DistrbDataSets.hs
@@ -1,41 +0,0 @@-{-# LANGUAGE  ExistentialQuantification, DeriveDataTypeable #-}
-
--- https://www.fpcomplete.com/user/agocorona/streaming-transient-effects-vi
-
-module Main where
-import Transient.Base
-import Transient.Move
-import Transient.Move.Utils
-import Transient.MapReduce
-import Control.Applicative
-import Control.Monad.IO.Class
-import Data.Monoid
-
-import qualified Data.Map as M
-import qualified Data.Foldable as F
-import qualified Data.Vector as V
-
--- Calculates separately the frequency of words in a text using
--- Distributed Data Sets (DDS's)  similar to spark Resilient Data Sets
-main= do
-     let numNodes = 5
-     runCloudIO $ do
-              runTestNodes [2000 .. 2000 + numNodes - 1]
-
-
---              local $ option "s" "start"
-              r <- reduce  (+) . mapKeyB (\w -> (w, 1 :: Int))
-                               $ getText  words content'
-              lliftIO $ putStr "RESULT= " >> print r
---              local $ exit r
-
---     print $  M.toList  r
-
-
-
-
-content= "hello"
-content'=  "the new york times said editorial for tuesday jan new year day has way stealing down upon coming the shadow the christmas week and its own scintillating eve you celebrated midnight last night was easy little illusory think the festivities gesture dismissal warding off the old year and its associated evils and yet hard feel this morning this were really the beginning new chapter some people are keenly sensitive beginnings and endings that new year day they can almost hear the rustle colossal page being turned like the opening some selznick version dickens born says the infant new year and off headlong into january the rest are only too conscious how closely the first wednesday the new year interwoven with the last monday the old year working days both never has been plainer that there telling what the new year will bring the way last year blew off course september might make skeptics all undermining confidence even the soberest expectations the likeliest possibilities resolutions have way expiring their own and last year most drafted new set resolutions mid september consciously not resolutions that had more with taking care the necessities that suddenly surrounded than with the usual jan goals self improvement and better record keeping the shock day like sept makes the conventions our lives look merely conventional for instance the only meaning new year day were purely consensual long established agreement that says only begin all over again here with particular reason why what makes new year day merely saying but any convention grown old enough acquires meaning that hard deny explain hence jan day melancholy hopeful completely secular and yet committed many even ironically ideal renewal that feels almost spiritual are born creatures repetition and out the repetition days like this lighted slowly increasing sun grows solemnity worth honoring what commit ourselves the first the year isn sudden increase talent intelligence native beauty increase what william cobbett the great 19th century journalist called exertion the best application the abilities already have happiness misery the mind cobbett wrote but the power exertion turn misery into happiness ourselves and others this coming year will require more than the usual exertion from will take more than resolutions more than the hope that were good enough begin with should our resolutions fail cobbett illustrious contemporary the rev sydney smith has some words that might well guide into look evil the face wrote walk and you will find less than you imagined and often you will not find all for will recede you advance sydney smith knew much about the trivial anxieties life did about the substantial ones knew that happiness less often matter courage than simple adjustments the way live and think knew for instance that you may virtuous and wise and good but that also helps turn the lights every night the room which sit wrote lighted like town after great naval victory darkness will come early tonight and the newness this very young slightly daunting year seems dwindle the twilight will time proclaim your own naval victory whether not you can manage virtuous wise good there nothing wrong with beginning being cheerful all photos and graphics from the new york times news service are available nytimages com clients who have photo account with the wieck database can use the same username and password access the images there charge for browsing but you would like more information establishing account download art from nytimages com special rate please call our report has also moved newscom and via photoexpress the following photos have been sent part the new york times photo package for monday dec nyt48 new york dec new year celebrations times square midnight paul burnett the new york times nyt47 new york dec new year the usual party atmosphere times square had patriotic theme for many atypical new year eve monday evening celebrating the seconds before midnight times square justin lane the new york times nyt46 new york dec new year yajaira arias ryan pyeatt shoulders both manhattan celebrating the seconds before midnight times square justin lane the new york times nyt45 new york dec new year the usual party atmosphere times square had patriotic theme for many atypical new year eve monday evening celebrations ensued moments after the ball dropped richard perry the new york times nyt44 new york dec bloomberg his last official act mayor rudolph guiliani swore michael bloomberg new york york mayor times square after the ball dropped hearlding the new year vincent laforet the new york times nyt43 new york dec bloomberg his last official act mayor rudolph guiliani swore michael bloomberg new york york mayor times square after the ball dropped hearlding the new year vincent laforet the new york times nyt42 new york dec bloomberg his last official act mayor rudolph guiliani swore michael bloomberg new york york mayor times square after the ball dropped hearlding the new year vincent laforet the new york times nyt41 new york dec new year the usual party atmosphere times square had patriotic theme for many atypical new year eve monday evening justin lane the new york times nyt40 new york dec new year security was tight times square this year people began staking out spot watch the new year ball drop midtown manhattan monday evening richard perry the new york times nyt39 new york dec bloomberg michael bloomberg arriving the minicipal building lower manhattan take his oath office the city clerk office monday will officially replace mayor rudolph guiliani the stroke midnight librado romero the new york times nyt37 new york dec new year some police officers patrolled times square monday night often conducting spot checks revelers vincent laforet the new york times nyt38 new york dec firefighters squad company park slope brooklyn firefighters michael stackpole left and tim rogers discussed the appointment nicholas scoppetta commissioner for department logistical and emotional turmoil aaron lee fineman the new york times nyt36 new york dec new year security was tight times square this year people began staking out spot watch the new year ball drop midtown manhattan monday evening vincent laforet the new york times nyt35 new york dec biz schools meyer feldberg dean the columbia business school says the number applications schools like his sharply people look for place weather the recession while upgrading their skills justin lane the new york times nyt34 shibarghan afghanistan dec attack prisoners over the next weeks american investigators will questioning hundreds foreign and afghan taliban prisoners that have been taken into custody from shibarghan prison soldier from the army 10th mountain division stands next fighter with the northern alliance guarding the gates shibarghan prison saturday alan chin the new york times nyt33 shibarghan afghanistan dec attack prisoners over the next weeks american investigators will questioning hundreds foreign and afghan taliban prisoners that have been taken into custody from shibarghan prison prisoners shibarghan prison saturday alan chin the new york times nyt32 shibarghan afghanistan dec attack prisoners over the next weeks american investigators will questioning hundreds foreign and afghan taliban prisoners that have been taken into custody from shibarghan prison prisoners shibarghan prison saturday alan chin the new york times nyt31 shibarghan afghanistan dec attack prisoners over the next weeks american investigators will questioning hundreds foreign and afghan taliban prisoners that have been taken into custody from shibarghan prison bound prisoners shibarghan prison saturday alan chin the new york times nyt30 shibarghan afghanistan dec attack prisoners over the next weeks american investigators will questioning hundreds foreign and afghan taliban prisoners that have been taken into custody from shibarghan prison some the prisoners shibarghan prison bathe last saturday alan chin the new york times nyt29 hollywood fla dec antiterror course recent events have left many floridians feeling vulnerable but now hundreds average south floridians have taken their protection into their own hands they have signed for counterterrorism course offered retired police swat team leader and his staff former elite military and law enforcement personnel demonstration book bomb shown example how terrorist can hide deadly force and what look for combat terrorism andrew itkoff the new york times nyt28 hollywood fla dec antiterror course recent events have left many floridians feeling vulnerable but now hundreds average south floridians have taken their protection into their own hands they have signed for counterterrorism course offered retired police swat team leader and his staff former elite military and law enforcement personnel demonstration mock terrorist nelson ricardo instructor and special forces officer portrays bomber and what increase the odds survival andrew itkoff the new york times nyt27 hollywood fla dec antiterror course recent events have left many floridians feeling vulnerable but now hundreds average south floridians have taken their protection into their own hands they have signed for counterterrorism course offered retired police swat team leader and his staff former elite military and law enforcement personnel walter philbrick left joins two his employees doreen pluschau and nelson ricardo mock airliner hijacking terrorists you nothing when terrorists strike philbrick says you going die andrew itkoff the new york times nyt26 new york dec mayor mayor rudolph guiliani says goodbye staffers leaves city hall for the last time monday james estrin the new york times nyt25 new york dec new year police officer from the new york corrections department and his unit roam the area thousands await the start new year ceremonies times square monday evening vincent laforet the new york times nyt24 new york dec new year greg packer huntington looks the jumbotron and thousands await the start new year ceremonies times square monday evening vincent laforet the new york times nyt23 new york dec new year security was tight times square this year people began staking out spot watch the new year ball drop midtown manhattan monday evening vincent laforet the new york times nyt22 new york dec mayor his final day office mayor rudolph giuliani the closing bell the new york stock exchange from left richard grasso chair and ceo giuliani and his companion judith nathan keith meyers the new york times nyt21 new york dec mayor his final day office mayor rudolph giuliani said monday has completed plans for his new business venture and judith nathan are love and his regrets are few and far between the mayor even said miss the press corps which criticized frequently during his eight years office for doing poor job covering his administration guiliani officialy leaving city hall the music the nypd emerald pipe band with judy nathan his side michelle agins the new york times nyt20 new york dec new year security was tight times square this year people began staking out spot watch the new year ball drop midtown manhattan monday evening aaron lee fineman the new york times nyt19 quetta pakistan dec afghan refugees the united nations high commission for refugees unhcr said that about afghans from quetta and surrounding villages are expected return afghanistan this month last count had crossed mar gul and her two sons one whom stands behind her are going back kandahar see how the security situation gul lost her husband during the bombings last month and she has means support her children tasgola karla bruner cox news service nyt18 morristown dec sci infertility business infertility has become big fiercely competitive business with billion dollars revenues and with more and more doctors fighting for limited number patients kathy miller and richard scott reproductive medicine associates dith pran the new york times nyt17 atlanta dec trainer atlanta this time year exercise the minds many whose new year resolutions include dropping holiday pounds and getting fit some will turn personal trainers personal trainer lee fidler standing who with the decatur ymca with client deb watts louie favorite atlanta journal constitution nyt16 undated dec calendars texas cox aztec scenes gods and godesses kings and conquerors produced mexico grace the calendars handed out and sold numerous austin restaurants and businesses examples mexican art adorning calendars from businesses austin texas austin american statesman cox news service nyt15 atlanta dec travel child atlanta chanel johnson customer service duty manager for air tran talks two young travellers who were flying unaccompanied last friday gate hartsfield airport the boys expressed interest sitting together the flight bound for gulfport miss johnson arranged the seating sept changed how people view air travel but unaccompanied minors are still flying the skies charlotte teagle cox news service nyt14 new york dec mayor bloomberg michael bloomberg took the oath office monday the first three swearing ceremonies presenting city clerk victor robles with pennies symbol progress the ceremony did not actually make bloomberg mayor was formally sworn mayor rudolph giuliani just after midnight times square then again tuesday the chief judge new york state judith kaye front city hall bloomberg speaks reporters before his first swearing ceremony monday librado romero the new york times nyt13 red house virg dec muslim enclave federal prosecutors the enclave western virginia compound potentially dangerous muslims where guns are prevalent and hatred the strong neighbors mysterious collection mobile homes but the families red house devout community black americans who fled the big cities raise their children relative quiet sign indicating the islamberg campus quranic open university the muslims america ozier muhammad the new york times nyt12 undated dec sci microplumbing part microfluidic chip two liquids flow together for mixing pipes are one fiftieth inch wide after shrinking electronics into microelectronics and machines into micromachines scientists have become microplumbers too carving mazes pipes the width human hair into silicon glass and plastic they have developed devices that shuttle around miniscule amounts liquid mix them together run chemical experiments analyze bits dna floating within they are essentially condensing entire chemistry laboratories onto small chips which promises the usual benefits miniaturization faster cheaper better handylab inc the new york times nyt11 new york dec edmund morris interview edmund morris the biographer ronald reagan and teddy roosevelt roosevelt childhood home manhattan earlier this month morris has written three books about two presidents but says never been much aware politics actually fred conrad the new york times lite nyt10 new york dec detained rights the last month the american civil liberties union has written ten the countries whose citizens have been detained the united states and offered legal help highlighting instances abuse our government and developing systematic litigation challenge its unconstitutional practices pamphlets handed out the aclu advising people their rights the new york times nyt9 ramallah west bank dec mideast palestinian leader yasser arafat center waves supporters during rally marking the 37th anniversary the founding his fatah movement monday night ramallah during these difficult times are living our people are still fighting against all the israeli challenges arafat told cheering crowd the west bank town are the strong people the palestinian flag will flown above the walls jerusalem rina castelnuovo the new york times lite nyt8 new york dec burrows fashion amp fashion designer stephen burrows with model sporting one his designs don hogan charles the new york times nyt7 new york dec burrows fashion fashion designer stephen burrows the studio area his harlem home during interview earlier this month don hogan charles the new york times nyt6 crawford texas dec bush nearly year after taking office president bush has seized the catastrophe sept project himself the world commander chief the center the crisis and aggressively reach for new powers his presidency yet bush has remained stymied significant parts his domestic agenda president bush speaks with prime minister tony blair britain saturday dec from his ranch crawford susan sterner the white house the new york times nyt5 new york dec detained rights the last month the american civil liberties union has written ten the countries whose citizens have been detained the united states and offered legal help highlighting instances abuse our government and developing systematic litigation challenge its unconstitutional practices anthony romero executive director the american civil liberties union one the organization law libraries during interview earlier this month fred conrad the new york times nyt4 rome dec exorcist potter rev gabriele amorth the catholic church best known exorcist has been all the papers again this time for taking harry potter when recently told the italian news agency that the devil was behind harry luring children into supernatural adventures set off debate newspapers and catholic chat rooms father amorth his office earlier this month chris warde jones the new york times lite nyt3 new york dec hilfiger profile fashion designer tommy hilfiger during interview earlier this month chester higgins the new york times nyt2 kandahar afghanistan dec afghan military members the special forces part convoy six vehicles left the area monday unknown destination forces have been searching for taliban leader mullah mohammed omar since dec when kandahar fell anti taliban afghan forces kandahar omar hometown and was the last major taliban stronghold afghanistan omar probably somewhere the mountains northwest kandahar intelligence official said monday ozier muhammad the new york times nyt1 edia khil afghanistan dec afghan afghan men plead for donated food which was being handed out from the back truck the village edia khil near tora bora monday the food was donated ali baba affluent afghan businessman who has been donating food villages surrounding jalalabad joao silva the new york times the new york times news service new york times news service for tuesday pms here are the top news stories from the new york times news service for pms tuesday jan the pms news desk opens eastern time get story repeats before this hour call for reruns datafeatures for repeats upi datanews nyt news service international moved category attack prisoners shibarghan afghanistan over the next weeks american investigators will questioning hundreds foreign and afghan taliban prisoners that have been taken into custody from shibarghan prison they are looking for intelligence the taliban leadership and osama bin laden qaida network they will find odd mix people among the foreign prisoners whose individual stories show there was not much grand design that brought them together carlotta gall national general moved category bush perspective crawford texas nearly year after taking office president bush has seized the catastrophe sept project himself the world commander chief the center the crisis and aggressively reach for new powers his presidency yet bush has remained stymied significant parts his domestic agenda elisabeth bumiller and david sanger art adv photo nyt6 being sent nyt photo clients editors the times has concluded its daily presentation capsule profiles the sept victims which moved the wire terror missing the total exceeds all the missing known dead whose friends and families agreed interviews new names emerge more families make themselves available the times will publish additional profiles business day moved category hewlett compaq undated the dry language business does not sound like much integration risk but represents the greatest single doubt that surrounds the merger plan hewlett packard and compaq and the biggest obstacle winning shareholder approval for the deal the concern simple terms this big mergers the computer industry never seem work steve lohr argentina econ undated news analysis how economists view the long slow collapse south america second biggest economy daniel altman tyson foods springdale ark federal officials have accused tyson foods the nation largest meat processor violating labor environmental and civil rights laws and making illegal gifts cabinet secretary two weeks ago federal grand jury indicted tyson and six employees charges conspiring smuggle illegal immigrants into the united states work the company plants tyson insists has been the target overzealous investigators and crusading special interest groups but critics say that both tyson growth and its transgressions rise from the same devil may care philosophy with which the tyson family has imbued david barboza heating oil undated for the past few years thelma diego has locked the cost heating oil for her home new jersey because she wants both certainty and savings last winter when oil was about gallon diego paid just but the contract that diego signed june pay gallon this winter has proved bad bet heating oil prices today are percent lower than they were year ago many homeowners throughout the northeast are the same situation diego oil prices dip well below the rates they locked over the spring and summer abby ellin with joseph kahn commentary moved category column paul krugman sports moved category fbn playoffs undated pro football column the nfl with one week the regular season and the playoff spots now filled thomas george entertainment moved category morris biography new york interview with edmund morris the biographer ronald reagan and teddy roosevelt bill goldstein art adv photo nyt11 being sent nyt photo clients pope arts grant undated interview with william pope conceptual artist involved dispute over national endowment for the arts grant holland cotter eds note that pope mateo ballet cambridge mass young ballet institution the rise here offers bright counterpoint the retrenchment classical dance elsewhere around the country fed the elegant choreography its artistic director over the last years jose mateo ballet theater has cultivated distinctive ballet style critically acclaimed repertory original work school and member company now with this season nutcracker ballet theater has opened the first professional ballet venue this erudite city has ever had susan diesenhouse exorcist potter rome rev gabriele amorth the catholic church best known exorcist has been all the papers again this time for taking harry potter when recently told the italian news agency that the devil was behind harry luring children into supernatural adventures set off debate newspapers and catholic chat rooms melinda henneberger art adv photo nyt4 being sent nyt photo clients isadora book review undated isadora sensational life the dancer isadora duncan peter kurth reviewed jennifer dunning birthday review undated tlc world birthday new york times and granada joint venture lesli camhi sci universe fate undated until just few years ago most scientists believed that the universe would undergo eternal expansion but now with the discovery dark energy antigravity that seems embedded space itself the fate the universe seems far more bleaker scientists are realizing the possibility that the expansion the universe not just continuing but speeding that true rather than coasting gently into the night distant galaxies will eventually moving apart quickly that they cannot communicate with one another effect would like living the middle black hole that kept getting emptier and colder words dennis overbye science moved category sci infertility business undated infertility has become big fiercely competitive business with billion dollars revenues and with more and more doctors fighting for limited number patients the growth the field has been fueled rising success rates and increased demand from patients many whom pay tens thousands dollars out their own pockets hopes having child some medical experts are deeply concerned with marketing promotions that can shade the truth referring doctors and patients can find hard distinguish between centers with good reputations and ones that promise much more than they can deliver gina kolata words art adv graphic being sent nyt photo clients sci microplumbing undated after shrinking electronics into microelectronics and machines into micromachines scientists have become microplumbers too carving mazes pipes the width human hair into silicon glass and plastic they have developed devices that shuttle around minuscule amounts liquid mix them together run chemical experiments analyze bits dna floating within they are essentially condensing entire chemistry laboratories including the expertise the technicians onto small chips which promises the usual benefits miniaturization faster cheaper better kenneth chang words art adv photo nyt12 being sent nyt photo clients sci house finch undated ornithologists have discovered that the population the house finch sparrow size bird with reddish breast that popular year round visitor feeders has been devastated crippling disease just seven years some million house finches percent the population have disappeared from the eastern united states the apparent victims highly contagious eye disease jane brody words art adv graphic beign sent nyt graphic clients sci lichens book undated lost obscurity near the bottom the organismal totem pole just above bacteria and rotifers lichens have patiently awaited their moment the spotlight this last fabulously illustrated and exhaustively researched new tome entitled lichens north america three lichen besotted authors unmask the vibrant beauty these organisms carol kaesuk yoon words art adv map beign sent nyt graphic clients sci watch undated news and notes science items how horse anatomy causes bounce what makes bones tough and the complete sequencing human chromosome henry fountain words sci graves race undated the debate over race and whether meaningless concept continues joseph graves professor evolutionary biology and african american studies arizona state university has jumped into the fray his provocative book the emperor new clothes biological theories race the millennium graves argues that biological races not exist and that race simply social and political construct that the world would better without conversation with graves discusses genes race and health linda villarosa words sci transgender privacy undated after meeting with transgendered patient who insisted that her sexual orientation left out her medical record doctor struggles with her obligation keep the medical record accurate while also respecting her patient privacy abigail zuger words sci therapist privacy undated for years therapists have argued about how much themselves they should reveal their patients freud argued that psychoanalysts should refrain from disclosing personal information their patients while humanistic psychologists like carl rogers recommended self disclosure way helping patients open about themselves now new study has found that patients whose therapists are more revealing both like their therapists more and are less distressed than patients whose therapists limit their disclosures erica goode words sci brody health undated personal health while nearly every woman knows that modern medicine has developed techniques help women with compromised fertility and complicated pregnancies relatively few seem aware the challenges financial emotional and medical associated with these treatments with their often limited chance success jane brody art adv graphic being sent nyt graphic clients sci book review undated timebomb the global epidemic multi drug resistant tuberculosis reviewed john langone words and sci hypertension book review undated questions and answers about hypertension reviewed john langone words sci vital signs undated news and notes health and fitness thumbsucking pacifier use after age may increase the risk conditions like buck teeth and the eventual need for braces according report the latest issue the journal the american dental association words new study published the journal psychological science offers evidence that caffeine can make measurable difference mental acuity for the elderly words major operation that often performed women with severe inflammation the colon appears reduce their fertility researchers report this month the journal gastroenterology words women who undergo hormone replacement therapy after menopause appear enjoy better mental functioning according study published the current issue neurology words researchers describe world class case jet lag only the problem occurs not this world but off the human clock researchers from nasa found cannot adjust days that are not hours long problem for astronauts extended missions words sci amp undated science question answered the fetus nourished through the placenta while the womb what happens the waste claiborne ray words editors all clients receive all budgets but only full service clients receive all stories please check your level service determine which stories you will receive nyt news service "
-
-
-
− examples/IRCclient.hs
@@ -1,18 +0,0 @@-
-import           Transient.Base
-import           Network
-import           System.IO
-import           Control.Monad.IO.Class
-import           Control.Applicative
-
--- taken from  Pipes example
--- https://www.reddit.com/r/haskell/comments/2jvc78/simple_haskell_irc_client_in_two_lines_of_code/?st=iqj5yxg1&sh=0cb8cc11
--- Simple Haskell IRC client in "two lines of code"
---
---main = withSocketsDo $ connect "irc.freenode.net" "6667" $ \(s, _) ->
---    forkIO (runEffect $ PBS.stdin >-> toSocket s) >> runEffect (fromSocket s 4096 >-> PBS.stdout)
-
-
-main = do
-    h <- withSocketsDo $ connectTo "irc.freenode.net" $ PortNumber $ fromIntegral 6667
-    keep' $ (waitEvents getLine >>= liftIO . hPutStrLn h) <|> ( threads 1 $ waitEvents (hGetLine h) >>= liftIO . putStrLn )
− examples/PiDistribCountinuous.hs
@@ -1,115 +0,0 @@--- Distributed streaming using Transient
--- See the article: https://www.fpcomplete.com/user/agocorona/streaming-transient-effects-vi
-
-{-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable, MonadComprehensions  #-}
-
-module MainCountinuous where
-import Transient.Base
-import Transient.Move
-import Transient.Indeterminism
-import Transient.Logged
-import Transient.Stream.Resource
-import Control.Applicative
-import Data.Char
-import Control.Monad
-import Control.Monad.IO.Class
-import System.Random
-import Data.IORef
-import System.IO
-import GHC.Conc
-import System.Environment
-
-
-
--- continuos streaming version
--- Perform the same calculation but it does not stop, and the results are accumulated in in a mutable reference within the calling node,
--- so the precision in the value of pi is printed with more and more precision. every 1000 calculations.
-
--- Here instead of `collect` that finish the calculation when the number of samples has been reached, i use `group` which simply
--- group the number of results in a list and then sum of the list is returned to the calling node.
-
--- Since `group` do not finish the calculation, new sums are streamed from the nodes again and again.
-
-main= do
-   let numNodes= 5
-       numCalcsNode= 100
-       ports= [2000.. 2000+ numNodes -1]
-       createLocalNode p= createNode "localhost"  p
-       nodes= map createLocalNode ports
-
-   rresults <- newIORef (0,0)
-   keep $ freeThreads $ threads 10 $ runCloud $ do
-     --setBufSize 1024
-     local $ addNodes nodes
-     foldl (<|>) empty (map listen nodes) <|> return()
-
-     r <- clustered $ do
-               --Connection (Just (_,h,_,_)) _ <- getSData <|> error "no connection"
-               --liftIO $ hSetBuffering h $ BlockBuffering Nothing
-               r <- local $ group numCalcsNode $ do
-                         n <- liftIO  getNumCapabilities
-                         threads n .
-                          spawn $ do
-                           x <- randomIO :: IO Double
-                           y <- randomIO
-                           return $ if x * x + y * y < 1 then 1 else (0 :: Int)
-               return $ sum r
-
-     (n,c) <- local $ liftIO $ atomicModifyIORef' rresults $ \(num, count) ->
-                let num' = num + r
-                    count'= count + numCalcsNode
-                in ((num', count'),(num',count'))
-
-     when ( c `rem` 1000 ==0) $ local $  liftIO $ do
-           th <- myThreadId
-           putStrLn $ "Samples: "++ show c ++ " -> " ++
-             show( 4.0 * fromIntegral n / fromIntegral c)++ "\t" ++ show th
-
--- really distributed version
--- generate an executable with this main and invoke it as such:
---
--- program  myport  remotehost  remoteport
---
--- where remotehost remoteport are from a previously initialized node
--- The first node initialize it with:
---
--- program myport  localhost myport
-
-
-mainDistributed= do
-    args <- getArgs
-    let localPort = read (args !! 0)
-        seedHost  = read (args !! 1)
-        seedPort  = read (args !! 2)
-
-        mynode    = createNode "localhost"  localPort
-        seedNode  = createNode seedHost seedPort
-        numCalcsNode= 100
-    rresults <- liftIO $ newIORef (0,0)
-
-    runCloudIO $ do
-       connect mynode seedNode
-
-       local $ option  "start"  "start the calculation once all the nodes have been started"  :: Cloud String
-
-       r <- clustered $ do
-               --Connection (Just (_,h,_,_)) _ <- getSData <|> error "no connection"
-               --liftIO $ hSetBuffering h $ BlockBuffering Nothing
-               r <- local $ group numCalcsNode $ do
-                         n <- liftIO  getNumCapabilities
-                         threads n .
-                          spawn $ do
-                           x <- randomIO :: IO Double
-                           y <- randomIO
-                           return $ if x * x + y * y < 1 then 1 else (0 :: Int)
-               return $ sum r
-
-       (n,c) <- local $ liftIO $ atomicModifyIORef' rresults $ \(num, count) ->
-                let num' = num + r
-                    count'= count + numCalcsNode
-                in ((num', count'),(num',count'))
-
-       when ( c `rem` 1000 ==0) $ local $ liftIO $ do
-           th <- myThreadId
-           putStrLn $ "Samples: "++ show c ++ " -> " ++
-             show( 4.0 * fromIntegral n / fromIntegral c)++ "\t" ++ show th
− examples/PiDistribOnce.hs
@@ -1,56 +0,0 @@--- Distributed streaming using Transient
--- See the article: https://www.fpcomplete.com/user/agocorona/streaming-transient-effects-vi
-
-{-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable, MonadComprehensions  #-}
-module MainOnce where
-import Transient.Base
-import Transient.Move
-import Transient.Indeterminism
-import Transient.Logged
-import Transient.Stream.Resource
-import Control.Applicative
-import Data.Char
-import Control.Monad
-import Control.Monad.IO.Class
-import System.Random
-import Data.IORef
-import System.IO
-import GHC.Conc
-import System.Environment
-
-
-
--- distributed calculation of PI
--- This example program is the closest  one to the defined in the spark examples: http://tldrify.com/bpr
--- But while the spark example does not contain the setup of the cluster and the confuguration/initalization
--- this examples includes everything
-
--- The nodes are simulated within the local process, but they communicate trough sockets and serialize data
--- just like real nodes. Each node spawn threads and return the result to the calling node.
--- when the number of result are reached `colect` kill the threads, the sockets are closed and the stream is stopped
-
--- for more details look at the article: https://www.fpcomplete.com/tutorial-edit/streaming-transient-effects-vi
---
-
-main= do
-   let numNodes= 5
-       numSamples= 1000
-       ports= [2000.. 2000 + numNodes -1]
-       createLocalNode p= createNode "localhost"  p
-       nodes= map createLocalNode ports
-
-
-   keep $ do
-      addNodes nodes
---     option "start" "start"
-      xs <- collect  numSamples $ runCloud $ do
-         foldl (<|>) empty (map listen nodes) <|> return()
-         local $ threads 2 $ runCloud $
-                 clustered[if x * x + y * y < (1 :: Double) then 1 else (0 :: Int)| x <- random, y <-random]
-
-      liftIO $ print (4.0 * (fromIntegral $ sum xs) / (fromIntegral numSamples) :: Double)
-      exit
-
-     where
-     random=  local $ waitEvents' randomIO :: Cloud Double
-
− examples/distributedApps.hs
@@ -1,125 +0,0 @@-{-# LANGUAGE   CPP,NoMonomorphismRestriction  #-}
-
-module Main where
-
-import Prelude hiding (div,id)
-import Transient.Base
-
-
-
-import GHCJS.HPlay.Cell
-import GHCJS.HPlay.View
-#ifdef ghcjs_HOST_OS
-   hiding (map, input,option)
-#else
-   hiding (map, option,input)
-#endif
-
-
-import Transient.Move
-import Transient.EVars
-import Transient.Indeterminism
-
-import Control.Applicative
-import qualified Data.Vector as V
-import qualified Data.Map as M
-import Transient.MapReduce
-import Control.Monad.IO.Class
-import Data.String
-import qualified Data.Text as T
-#ifdef ghcjs_HOST_OS
-import qualified Data.JSString as JS hiding (span,empty,strip,words)
-#endif
-
-
-
-main =  keep $  initNode  $  mapReduce <|>  chat  <|> inputNodes <|> mapReduceServer
-
-
-mapReduceServer= onServer $ do
-   local $ option "text"  "enter text to count the words"
-   content <- local $ input (const  True) "enter the content: "
-
-   r<- reduce  (+) . mapKeyB (\w -> (w, 1 :: Int))  $ distribute $ V.fromList $ words content
-   localIO $ putStr "result:" >> print (r :: M.Map String Int)
-
--- A Web node launch a map-reduce computation in all the server nodes, getting data from a
--- textbox and render the results returned
-
-mapReduce= onBrowser $ do
-
-    content <-  local . render $
-                    textArea   (fs "") ! atr "placeholder" (fs "enter the content")
-                                       ! atr "rows"  (fs "4")
-                                       ! atr "cols"  (fs "80")
-
-
-                     <++  br
-                     <** inputSubmit "send"  `fire` OnClick
-                     <++  br
-
-    r <- atRemote $ do
-               lliftIO $ print content
-               r<- reduce  (+) . mapKeyB (\w -> (w, 1 :: Int))  $ distribute $ V.fromList $ words content
-               lliftIO $ putStr "result:" >> print r
-               return   (r :: M.Map String Int)
-
-
-    local . render $ rawHtml $ do
-                 h1 "Results"
-                 mconcat[i "word " >> b w >> i " appears " >> b n >> i " times" >> br
-                        | (w,n) <- M.assocs r]
-
-
-fs= fromString
-
--- a chat widget that run in the browser and in a cloud of servers
-
-chat=  onBrowser $  do
-
-    let chatMessages= fs "chatMessages"
-
-    local . render . rawHtml $
-            div ! id (fs "chatbox")
-                ! style (fs $"margin-top:1cm;overflow: auto;height: 200px;"
-                         ++  "background-color: #FFCC99; max-height: 200px;")
-                $ noHtml  -- create the chat box
-
-    sendMessages chatMessages <|>  waitMessages chatMessages
-
-  where
-  sendMessages chatMessages = do
-      let entry= boxCell (fs "msg") ! atr "size"  (fs "90")
-      text <- local . render $ (mk entry Nothing )  `fire` OnChange
-                <** inputSubmit "send"
-                <++ br
-      local $ entry .= ""
-
-      atRemote $ do
-          node <- local getMyNode
-          clustered $ local $ putMailbox chatMessages (showNode node ++ text :: String)
-          return ()
-
-  showNode node= show node ++ ">"
-
-  waitMessages chatMessages = do
-    resp <- atRemote . local $  getMailbox chatMessages  -- atRemote, in the server
-                                                           -- wait in the server for messages
-
-    local . render . at (fs "#chatbox") Append $ rawHtml $ do
-                                          p (resp :: String)    -- display the response
-#ifdef ghcjs_HOST_OS
-                                          liftIO $ scrollBottom $ fs "chatbox"
-
-
-foreign import javascript unsafe
-  "var el= document.getElementById($1);el.scrollTop=  el.scrollHeight"
-  scrollBottom  :: JS.JSString -> IO()
-#endif
-
-
-
-
-
-
-
− examples/static/out.jsexe/all.js

file too large to diff

− examples/static/out.jsexe/index.html
@@ -1,11 +0,0 @@-<!DOCTYPE html>
-<html>
-  <head>
-    <script language="javascript" src="rts.js"></script>
-    <script language="javascript" src="lib.js"></script>
-    <script language="javascript" src="out.js"></script>
-  </head>
-  <body>
-  </body>
-  <script language="javascript" src="runmain.js" defer></script>
-</html>
− examples/static/out.jsexe/lib.js
@@ -1,3971 +0,0 @@-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// translated from bytestring cbits/fpstring.c
-function h$fps_reverse(a_v, a_o, b_v, b_o, n) {
-    if(n > 0) {
-        var au8 = a_v.u8, bu8 = b_v.u8;
-        for(var i=0;i<n;i++) {
-            au8[a_o+n-i-1] = bu8[b_o+i];
-        }
-    }
-}
-function h$fps_intersperse(a_v,a_o,b_v,b_o,n,c) {
-    if(n > 0) {
-        var au8 = a_v.u8, bu8 = b_v.u8, dst_o = a_o;
-        for(var i=0;i<n-1;i++) {
-            au8[dst_o] = bu8[b_o+i];
-            au8[dst_o+1] = c;
-            dst_o += 2;
-        }
-        au8[dst_o] = bu8[b_o+n-1];
-    }
-}
-function h$fps_maximum(a_v,a_o,n) {
-    if(n > 0) {
-        var au8 = a_v.u8, max = au8[a_o];
-        for(var i=1;i<n;i++) {
-            var c = au8[a_o+i];
-            if(c > max) { max = c; }
-        }
-        return max;
-    }
-    return 0;
-}
-function h$fps_minimum(a_v,a_o,n) {
-    if(n > 0) {
-        var au8 = a_v.u8, min = a_v.u8[a_o];
-        for(var i=1;i<n;i++) {
-            var c = au8[a_o+i];
-            if(c < min) { min = c; }
-        }
-        return min;
-    }
-    return 255;
-}
-function h$fps_count(a_v,a_o,n,c) {
-    if(n > 0) {
-        var au8 = a_v.u8, count = 0;
-        for(var i=0;i<n;i++) {
-            if(au8[a_o+i] === c) { count++; }
-        }
-        return count|0;
-    }
-    return 0;
-}
-function h$fps_memcpy_offsets(dst_d, dst_o, dst_off
-                              , src_d, src_o, src_off, n) {
-    return memcpy(dst_d, dst_o + dst_off, src_d, src_o + src_off, n);
-}
-// translated from bytestring cbits/itoa.c
-var h$_hs_bytestring_digits = [48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102]; // 0123456789abcdef
-var h$_hs_bytestring_l10 = goog.math.Long.fromBits(10, 0);
-var h$_hs_bytestring_b10 = h$bigFromInt(10);
-// signed integers
-function h$_hs_bytestring_int_dec(x, buf_d, buf_o) {
-    var c, ptr = buf_o, next_free, x_tmp;
-    var bu8 = buf_d.u8;
-    // we cannot negate directly as  0 - (minBound :: Int) = minBound
-    if(x < 0) {
-        bu8[ptr++] = 45; // '-'
-        buf_o++;
-        x_tmp = x;
-        x = (x / 10) | 0;
-        bu8[ptr++] = h$_hs_bytestring_digits[x * 10 - x_tmp];
-        if(x === 0) {
-            { h$ret1 = (ptr); return (buf_d); };
-        } else {
-            x = -x;
-        }
-    }
-    // encode positive number as little-endian decimal
-    do {
-        x_tmp = x;
-        x = (x / 10) | 0;
-        bu8[ptr++] = h$_hs_bytestring_digits[x_tmp - x * 10];
-    } while (x);
-    next_free = ptr--;
-    while(buf_o < ptr) {
-        c = bu8[ptr];
-        bu8[ptr--] = bu8[buf_o];
-        bu8[buf_o++] = c;
-    }
-    { h$ret1 = (next_free); return (buf_d); };
-}
-// signed long long ints (64 bit integers)
-function h$_hs_bytestring_long_long_int_dec(x_a, x_b, buf_d, buf_o) {
-    var l10 = h$_hs_bytestring_l10;
-    var x = goog.math.Long.fromBits(x_b, x_a);
-    var c, ptr = buf_o, next_free;
-    var bu8 = buf_d.u8;
-    // we cannot negate directly as  0 - (minBound :: Int) = minBound
-    if(x.isNegative()) {
-        bu8[ptr++] = 45; // '-';
-        buf_o++;
-        x_tmp = x;
-        x = x.div(l10);
-        bu8[ptr++] = h$_hs_bytestring_digits[x.multiply(l10).subtract(x_tmp).getLowBits()];
-        if(x.isZero()) {
-            { h$ret1 = (ptr); return (buf_d); };
-        } else {
-            x = x.negate();
-        }
-    }
-    // encode positive number as little-endian decimal
-    do {
-        x_tmp = x;
-        x = x.div(l10);
-        bu8[ptr++] = h$_hs_bytestring_digits[x_tmp.subtract(x.multiply(l10))];
-    } while (!x.isZero());
-    // reverse written digits
-    next_free = ptr--;
-    while(buf_o < ptr) {
-        c = bu8[ptr];
-        bu8[ptr--] = bu8[buf_o];
-        bu8[buf_o++] = c;
-    }
-    { h$ret1 = (next_free); return (buf_d); };
-}
-// unsigned integers
-function h$_hs_bytestring_uint_dec(x, buf_d, buf_o) {
-    var c, ptr = buf_o, next_free;
-    var bu8 = buf_d.u8;
-    var x_tmp;
-    if(x < 0) x += 4294967296;
-    do {
-        x_tmp = x;
-        x = (x / 10) | 0;
-        bu8[ptr++] = h$_hs_bytestring_digits[x_tmp - x * 10];
-    } while(x);
-    next_free = ptr--;
-    while(buf_o < ptr) {
-        c = bu8[ptr];
-        bu8[ptr--] = bu8[buf_o];
-        bu8[buf_o++] = c;
-    }
-    { h$ret1 = (next_free); return (buf_d); };
-}
-function h$_hs_bytestring_long_long_uint_dec(x_a, x_b, buf_d, buf_o) {
-    var b10 = h$_hs_bytestring_b10;
-    var c, ptr = buf_o, next_free;
-    var bu8 = buf_d.u8;
-    var x = h$bigFromWord64(x_a, x_b), x_tmp;
-    // encode positive number as little-endian decimal
-    do {
-        x_tmp = x;
-        x = x.divide(b10);
-        bu8[ptr++] = h$_hs_bytestring_digits[x_tmp.subtract(x.multiply(b10))];
-    } while(x.signum() !== 0);
-    // reverse written digits;
-    next_free = ptr--;
-    while(buf_o < ptr) {
-        c = bu8[ptr];
-        bu8[ptr--] = bu8[buf_o];
-        bu8[buf_o++] = c;
-    }
-    { h$ret1 = (next_free); return (buf_d); };
-}
-// Padded, decimal, positive integers for the decimal output of bignums
-///////////////////////////////////////////////////////////////////////
-// Padded (9 digits), decimal, positive int:
-// We will use it with numbers that fit in 31 bits; i.e., numbers smaller than
-// 10^9, as "31 * log 2 / log 10 = 9.33"
-function h$_hs_bytestring_int_dec_padded9(x, buf_d, buf_o) {
-    var max_width_int32_dec = 9;
-    var ptr = buf_o + max_width_int32_dec;
-    var bu8 = buf_d.u8;
-    var x_tmp;
-    // encode positive number as little-endian decimal
-    do {
-        x_tmp = x;
-        x = (x / 10) | 0;
-        bu8[--ptr] = h$_hs_bytestring_digits[x_tmp - x * 10];
-    } while(x);
-    // pad beginning
-    while (buf_o < ptr) { bu8[--ptr] = 48; }
-}
-// Padded (19 digits), decimal, positive long long int:
-// We will use it with numbers that fit in 63 bits; i.e., numbers smaller than
-// 10^18, as "63 * log 2 / log 10 = 18.96"
-function h$_hs_bytestring_long_long_int_dec_padded18(x_a, x_b, buf_d, buf_o) {
-    var l10 = h$_hs_bytestring_l10;
-    var max_width_int64_dec = 18;
-    var ptr = buf_o + max_width_int64_dec;
-    var bu8 = buf_d.u8;
-    var x = goog.math.Long.fromBits(x_b, x_a);
-    // encode positive number as little-endian decimal
-    do {
-        x_tmp = x;
-        x = x.div(l10);
-        bu8[--ptr] = h$_hs_bytestring_digits[x_tmp.subtract(x.multiply(l10))];
-    } while (!x.isZero());
-    // pad beginning
-    while (buf_o < ptr) { bu8[--ptr] = 48; }
-}
-///////////////////////
-// Hexadecimal encoding
-///////////////////////
-// unsigned ints (32 bit words)
-function h$_hs_bytestring_uint_hex(x, buf_d, buf_o) {
-    var c, ptr = buf_o, next_free;
-    var bu8 = buf_d.u8;
-    // write hex representation in reverse order
-    do {
-        bu8[ptr++] = h$_hs_bytestring_digits[x & 0xf];
-        x >>>= 4;
-    } while(x);
-    // invert written digits
-    next_free = ptr--;
-    while(buf_o < ptr) {
-        c = bu8[ptr];
-        bu8[ptr--] = bu8[buf_o];
-        bu8[buf_o++] = c;
-    }
-    { h$ret1 = (next_free); return (buf_d); };
-}
-// unsigned long ints (64 bit words)
-function h$_hs_bytestring_long_long_uint_hex(x_a, x_b, buf_d, buf_o) {
-    // write hex representation in reverse order
-    var c, ptr = buf_o, next_free;
-    var bu8 = buf_d.u8;
-    if(x_a === 0 && x_b === 0) {
-        bu8[ptr++] = 48; // '0'
-    } else {
-        while(x_b !== 0) {
-            bu8[ptr++] = h$_hs_bytestring_digits[x_b & 0xf];
-            x_b >>>= 4;
-        }
-        while(x_a !== 0) {
-            bu8[ptr++] = h$_hs_bytestring_digits[x_a & 0xf];
-            x_a >>>= 4;
-        }
-    }
-    // invert written digits
-    next_free = ptr--;
-    while(buf_o < ptr) {
-        c = bu8[ptr];
-        bu8[ptr--] = bu8[buf_o];
-        bu8[buf_o++] = c;
-    }
-    { h$ret1 = (next_free); return (buf_d); };
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-function h$hsprimitive_memcpy(dst_d, dst_o, doff, src_d, src_o, soff, len) {
-  return h$primitive_memmove(dst_d, dst_o, doff, src_d, src_o, len);
-}
-function h$hsprimitive_memmove(dst_d, dst_o, doff, src_d, src_o, soff, len) {
-  if(len === 0) return;
-  var du8 = dst_d.u8, su8 = src_d.u8;
-  for(var i=len-1;i>=0;i--) {
-    du8[dst_o+i] = su8[src_o+i];
-  }
-}
-function h$hsprimitive_memsetba_Word8 (p_d, off, n, x) { if(n > 0) { if(p_d.u8.fill) p_d.u8.fill(x, off, off + n); else for(var i=off; i<off+n; i++) p_d.u8[i] = x; } }
-function h$hsprimitive_memsetba_Word16 (p_d, off, n, x) { if(n > 0) { if(p_d.u1.fill) p_d.u1.fill(x, off, off + n); else for(var i=off; i<off+n; i++) p_d.u1[i] = x; } }
-function h$hsprimitive_memsetba_Word32 (p_d, off, n, x) { if(n > 0) { if(p_d.i3.fill) p_d.i3.fill(x, off, off + n); else for(var i=off; i<off+n; i++) p_d.i3[i] = x; } }
-function h$hsprimitive_memsetba_Word (p_d, off, n, x) { if(n > 0) { if(p_d.i3.fill) p_d.i3.fill(x, off, off + n); else for(var i=off; i<off+n; i++) p_d.i3[i] = x; } }
-function h$hsprimitive_memsetba_Float (p_d, off, n, x) { if(n > 0) { if(p_d.f3.fill) p_d.f3.fill(x, off, off + n); else for(var i=off; i<off+n; i++) p_d.f3[i] = x; } }
-function h$hsprimitive_memsetba_Double (p_d, off, n, x) { if(n > 0) { if(p_d.f6.fill) p_d.f6.fill(x, off, off + n); else for(var i=off; i<off+n; i++) p_d.f6[i] = x; } }
-function h$hsprimitive_memsetba_Char (p_d, off, n, x) { if(n > 0) { if(p_d.i3.fill) p_d.i3.fill(x, off, off + n); else for(var i=off; i<off+n; i++) p_d.i3[i] = x; } }
-function h$hsprimitive_memset_Word8 (p_d, p_o, off, n, x) { var start = (p_o >> 0) + off; if(n > 0) { if(p_d.u8.fill) p_d.u8.fill(x, start, start + n); else for(var i=start; i<start+n; i++) p_d.u8[i] = x; } }
-function h$hsprimitive_memset_Word16 (p_d, p_o, off, n, x) { var start = (p_o >> 1) + off; if(n > 0) { if(p_d.u1.fill) p_d.u1.fill(x, start, start + n); else for(var i=start; i<start+n; i++) p_d.u1[i] = x; } }
-function h$hsprimitive_memset_Word32 (p_d, p_o, off, n, x) { var start = (p_o >> 2) + off; if(n > 0) { if(p_d.i3.fill) p_d.i3.fill(x, start, start + n); else for(var i=start; i<start+n; i++) p_d.i3[i] = x; } }
-function h$hsprimitive_memset_Word (p_d, p_o, off, n, x) { var start = (p_o >> 2) + off; if(n > 0) { if(p_d.i3.fill) p_d.i3.fill(x, start, start + n); else for(var i=start; i<start+n; i++) p_d.i3[i] = x; } }
-function h$hsprimitive_memset_Float (p_d, p_o, off, n, x) { var start = (p_o >> 2) + off; if(n > 0) { if(p_d.f3.fill) p_d.f3.fill(x, start, start + n); else for(var i=start; i<start+n; i++) p_d.f3[i] = x; } }
-function h$hsprimitive_memset_Double (p_d, p_o, off, n, x) { var start = (p_o >> 3) + off; if(n > 0) { if(p_d.f6.fill) p_d.f6.fill(x, start, start + n); else for(var i=start; i<start+n; i++) p_d.f6[i] = x; } }
-function h$hsprimitive_memset_Char (p_d, p_o, off, n, x) { var start = (p_o >> 2) + off; if(n > 0) { if(p_d.i3.fill) p_d.i3.fill(x, start, start + n); else for(var i=start; i<start+n; i++) p_d.i3[i] = x; } }
-function h$hsprimitive_memsetba_Word64(p_d, off, n, x_1, x_2) {
-  h$hsprimitive_memset_Word64(p_d, 0, off, n, x_1, x_2);
-}
-function h$hsprimitive_memset_Word64(p_d, p_o, off, n, x_1, x_2) {
-  var start = (p_o >> 3) + off;
-  if(n > 0) {
-    var pi3 = p_d.i3;
-    for(var i = 0; i < n; i++) {
-      var o = (start + i) << 1;
-      pi3[o] = x_1;
-      pi3[o+1] = x_2;
-    }
-  }
-}
-function h$hsprimitive_memset_Ptr(p_d, p_o, off, n, x_1, x_2) {
-  if(n > 0) {
-    if(!p_d.arr) p_d.arr = [];
-    var a = p_d.arr;
-    for(var i = 0; i < n; i++) {
-      a[p_o + ((off + i) << 2)] = [x_1, x_2];
-    }
-  }
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// Copyright 2011 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-/**
- * @fileoverview Abstract cryptographic hash interface.
- *
- * See goog.crypt.Sha1 and goog.crypt.Md5 for sample implementations.
- *
- */
-goog.provide('goog.crypt.Hash');
-/**
- * Create a cryptographic hash instance.
- *
- * @constructor
- * @struct
- */
-goog.crypt.Hash = function() {
-  /**
-   * The block size for the hasher.
-   * @type {number}
-   */
-  this.blockSize = -1;
-};
-/**
- * Resets the internal accumulator.
- */
-goog.crypt.Hash.prototype.reset = goog.abstractMethod;
-/**
- * Adds a byte array (array with values in [0-255] range) or a string (might
- * only contain 8-bit, i.e., Latin1 characters) to the internal accumulator.
- *
- * Many hash functions operate on blocks of data and implement optimizations
- * when a full chunk of data is readily available. Hence it is often preferable
- * to provide large chunks of data (a kilobyte or more) than to repeatedly
- * call the update method with few tens of bytes. If this is not possible, or
- * not feasible, it might be good to provide data in multiplies of hash block
- * size (often 64 bytes). Please see the implementation and performance tests
- * of your favourite hash.
- *
- * @param {Array<number>|Uint8Array|string} bytes Data used for the update.
- * @param {number=} opt_length Number of bytes to use.
- */
-goog.crypt.Hash.prototype.update = goog.abstractMethod;
-/**
- * @return {!Array<number>} The finalized hash computed
- *     from the internal accumulator.
- */
-goog.crypt.Hash.prototype.digest = goog.abstractMethod;
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// Copyright 2011 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-/**
- * @fileoverview MD5 cryptographic hash.
- * Implementation of http://tools.ietf.org/html/rfc1321 with common
- * optimizations and tweaks (see http://en.wikipedia.org/wiki/MD5).
- *
- * Usage:
- *   var md5 = new goog.crypt.Md5();
- *   md5.update(bytes);
- *   var hash = md5.digest();
- *
- * Performance:
- *   Chrome 23              ~680 Mbit/s
- *   Chrome 13 (in a VM)    ~250 Mbit/s
- *   Firefox 6.0 (in a VM)  ~100 Mbit/s
- *   IE9 (in a VM)           ~27 Mbit/s
- *   Firefox 3.6             ~15 Mbit/s
- *   IE8 (in a VM)           ~13 Mbit/s
- *
- */
-goog.provide('goog.crypt.Md5');
-goog.require('goog.crypt.Hash');
-/**
- * MD5 cryptographic hash constructor.
- * @constructor
- * @extends {goog.crypt.Hash}
- * @final
- * @struct
- */
-goog.crypt.Md5 = function() {
-  goog.crypt.Md5.base(this, 'constructor');
-  this.blockSize = 512 / 8;
-  /**
-   * Holds the current values of accumulated A-D variables (MD buffer).
-   * @type {!Array<number>}
-   * @private
-   */
-  this.chain_ = new Array(4);
-  /**
-   * A buffer holding the data until the whole block can be processed.
-   * @type {!Array<number>}
-   * @private
-   */
-  this.block_ = new Array(this.blockSize);
-  /**
-   * The length of yet-unprocessed data as collected in the block.
-   * @type {number}
-   * @private
-   */
-  this.blockLength_ = 0;
-  /**
-   * The total length of the message so far.
-   * @type {number}
-   * @private
-   */
-  this.totalLength_ = 0;
-  this.reset();
-};
-goog.inherits(goog.crypt.Md5, goog.crypt.Hash);
-/**
- * Integer rotation constants used by the abbreviated implementation.
- * They are hardcoded in the unrolled implementation, so it is left
- * here commented out.
- * @type {Array<number>}
- * @private
- *
-goog.crypt.Md5.S_ = [
-  7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
-  5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
-  4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
-  6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21
-];
- */
-/**
- * Sine function constants used by the abbreviated implementation.
- * They are hardcoded in the unrolled implementation, so it is left
- * here commented out.
- * @type {Array<number>}
- * @private
- *
-goog.crypt.Md5.T_ = [
-  0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
-  0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
-  0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
-  0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
-  0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
-  0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
-  0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
-  0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
-  0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
-  0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
-  0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
-  0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
-  0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
-  0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
-  0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
-  0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
-];
- */
-/** @override */
-goog.crypt.Md5.prototype.reset = function() {
-  this.chain_[0] = 0x67452301;
-  this.chain_[1] = 0xefcdab89;
-  this.chain_[2] = 0x98badcfe;
-  this.chain_[3] = 0x10325476;
-  this.blockLength_ = 0;
-  this.totalLength_ = 0;
-};
-/**
- * Internal compress helper function. It takes a block of data (64 bytes)
- * and updates the accumulator.
- * @param {Array<number>|Uint8Array|string} buf The block to compress.
- * @param {number=} opt_offset Offset of the block in the buffer.
- * @private
- */
-goog.crypt.Md5.prototype.compress_ = function(buf, opt_offset) {
-  if (!opt_offset) {
-    opt_offset = 0;
-  }
-  // We allocate the array every time, but it's cheap in practice.
-  var X = new Array(16);
-  // Get 16 little endian words. It is not worth unrolling this for Chrome 11.
-  if (goog.isString(buf)) {
-    for (var i = 0; i < 16; ++i) {
-      X[i] = (buf.charCodeAt(opt_offset++)) |
-             (buf.charCodeAt(opt_offset++) << 8) |
-             (buf.charCodeAt(opt_offset++) << 16) |
-             (buf.charCodeAt(opt_offset++) << 24);
-    }
-  } else {
-    for (var i = 0; i < 16; ++i) {
-      X[i] = (buf[opt_offset++]) |
-             (buf[opt_offset++] << 8) |
-             (buf[opt_offset++] << 16) |
-             (buf[opt_offset++] << 24);
-    }
-  }
-  var A = this.chain_[0];
-  var B = this.chain_[1];
-  var C = this.chain_[2];
-  var D = this.chain_[3];
-  var sum = 0;
-  /*
-   * This is an abbreviated implementation, it is left here commented out for
-   * reference purposes. See below for an unrolled version in use.
-   *
-  var f, n, tmp;
-  for (var i = 0; i < 64; ++i) {
-
-    if (i < 16) {
-      f = (D ^ (B & (C ^ D)));
-      n = i;
-    } else if (i < 32) {
-      f = (C ^ (D & (B ^ C)));
-      n = (5 * i + 1) % 16;
-    } else if (i < 48) {
-      f = (B ^ C ^ D);
-      n = (3 * i + 5) % 16;
-    } else {
-      f = (C ^ (B | (~D)));
-      n = (7 * i) % 16;
-    }
-
-    tmp = D;
-    D = C;
-    C = B;
-    sum = (A + f + goog.crypt.Md5.T_[i] + X[n]) & 0xffffffff;
-    B += ((sum << goog.crypt.Md5.S_[i]) & 0xffffffff) |
-         (sum >>> (32 - goog.crypt.Md5.S_[i]));
-    A = tmp;
-  }
-   */
-  /*
-   * This is an unrolled MD5 implementation, which gives ~30% speedup compared
-   * to the abbreviated implementation above, as measured on Chrome 11. It is
-   * important to keep 32-bit croppings to minimum and inline the integer
-   * rotation.
-   */
-  sum = (A + (D ^ (B & (C ^ D))) + X[0] + 0xd76aa478) & 0xffffffff;
-  A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25));
-  sum = (D + (C ^ (A & (B ^ C))) + X[1] + 0xe8c7b756) & 0xffffffff;
-  D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20));
-  sum = (C + (B ^ (D & (A ^ B))) + X[2] + 0x242070db) & 0xffffffff;
-  C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15));
-  sum = (B + (A ^ (C & (D ^ A))) + X[3] + 0xc1bdceee) & 0xffffffff;
-  B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10));
-  sum = (A + (D ^ (B & (C ^ D))) + X[4] + 0xf57c0faf) & 0xffffffff;
-  A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25));
-  sum = (D + (C ^ (A & (B ^ C))) + X[5] + 0x4787c62a) & 0xffffffff;
-  D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20));
-  sum = (C + (B ^ (D & (A ^ B))) + X[6] + 0xa8304613) & 0xffffffff;
-  C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15));
-  sum = (B + (A ^ (C & (D ^ A))) + X[7] + 0xfd469501) & 0xffffffff;
-  B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10));
-  sum = (A + (D ^ (B & (C ^ D))) + X[8] + 0x698098d8) & 0xffffffff;
-  A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25));
-  sum = (D + (C ^ (A & (B ^ C))) + X[9] + 0x8b44f7af) & 0xffffffff;
-  D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20));
-  sum = (C + (B ^ (D & (A ^ B))) + X[10] + 0xffff5bb1) & 0xffffffff;
-  C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15));
-  sum = (B + (A ^ (C & (D ^ A))) + X[11] + 0x895cd7be) & 0xffffffff;
-  B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10));
-  sum = (A + (D ^ (B & (C ^ D))) + X[12] + 0x6b901122) & 0xffffffff;
-  A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25));
-  sum = (D + (C ^ (A & (B ^ C))) + X[13] + 0xfd987193) & 0xffffffff;
-  D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20));
-  sum = (C + (B ^ (D & (A ^ B))) + X[14] + 0xa679438e) & 0xffffffff;
-  C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15));
-  sum = (B + (A ^ (C & (D ^ A))) + X[15] + 0x49b40821) & 0xffffffff;
-  B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10));
-  sum = (A + (C ^ (D & (B ^ C))) + X[1] + 0xf61e2562) & 0xffffffff;
-  A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27));
-  sum = (D + (B ^ (C & (A ^ B))) + X[6] + 0xc040b340) & 0xffffffff;
-  D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23));
-  sum = (C + (A ^ (B & (D ^ A))) + X[11] + 0x265e5a51) & 0xffffffff;
-  C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18));
-  sum = (B + (D ^ (A & (C ^ D))) + X[0] + 0xe9b6c7aa) & 0xffffffff;
-  B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12));
-  sum = (A + (C ^ (D & (B ^ C))) + X[5] + 0xd62f105d) & 0xffffffff;
-  A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27));
-  sum = (D + (B ^ (C & (A ^ B))) + X[10] + 0x02441453) & 0xffffffff;
-  D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23));
-  sum = (C + (A ^ (B & (D ^ A))) + X[15] + 0xd8a1e681) & 0xffffffff;
-  C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18));
-  sum = (B + (D ^ (A & (C ^ D))) + X[4] + 0xe7d3fbc8) & 0xffffffff;
-  B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12));
-  sum = (A + (C ^ (D & (B ^ C))) + X[9] + 0x21e1cde6) & 0xffffffff;
-  A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27));
-  sum = (D + (B ^ (C & (A ^ B))) + X[14] + 0xc33707d6) & 0xffffffff;
-  D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23));
-  sum = (C + (A ^ (B & (D ^ A))) + X[3] + 0xf4d50d87) & 0xffffffff;
-  C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18));
-  sum = (B + (D ^ (A & (C ^ D))) + X[8] + 0x455a14ed) & 0xffffffff;
-  B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12));
-  sum = (A + (C ^ (D & (B ^ C))) + X[13] + 0xa9e3e905) & 0xffffffff;
-  A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27));
-  sum = (D + (B ^ (C & (A ^ B))) + X[2] + 0xfcefa3f8) & 0xffffffff;
-  D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23));
-  sum = (C + (A ^ (B & (D ^ A))) + X[7] + 0x676f02d9) & 0xffffffff;
-  C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18));
-  sum = (B + (D ^ (A & (C ^ D))) + X[12] + 0x8d2a4c8a) & 0xffffffff;
-  B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12));
-  sum = (A + (B ^ C ^ D) + X[5] + 0xfffa3942) & 0xffffffff;
-  A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28));
-  sum = (D + (A ^ B ^ C) + X[8] + 0x8771f681) & 0xffffffff;
-  D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21));
-  sum = (C + (D ^ A ^ B) + X[11] + 0x6d9d6122) & 0xffffffff;
-  C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16));
-  sum = (B + (C ^ D ^ A) + X[14] + 0xfde5380c) & 0xffffffff;
-  B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9));
-  sum = (A + (B ^ C ^ D) + X[1] + 0xa4beea44) & 0xffffffff;
-  A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28));
-  sum = (D + (A ^ B ^ C) + X[4] + 0x4bdecfa9) & 0xffffffff;
-  D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21));
-  sum = (C + (D ^ A ^ B) + X[7] + 0xf6bb4b60) & 0xffffffff;
-  C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16));
-  sum = (B + (C ^ D ^ A) + X[10] + 0xbebfbc70) & 0xffffffff;
-  B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9));
-  sum = (A + (B ^ C ^ D) + X[13] + 0x289b7ec6) & 0xffffffff;
-  A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28));
-  sum = (D + (A ^ B ^ C) + X[0] + 0xeaa127fa) & 0xffffffff;
-  D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21));
-  sum = (C + (D ^ A ^ B) + X[3] + 0xd4ef3085) & 0xffffffff;
-  C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16));
-  sum = (B + (C ^ D ^ A) + X[6] + 0x04881d05) & 0xffffffff;
-  B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9));
-  sum = (A + (B ^ C ^ D) + X[9] + 0xd9d4d039) & 0xffffffff;
-  A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28));
-  sum = (D + (A ^ B ^ C) + X[12] + 0xe6db99e5) & 0xffffffff;
-  D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21));
-  sum = (C + (D ^ A ^ B) + X[15] + 0x1fa27cf8) & 0xffffffff;
-  C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16));
-  sum = (B + (C ^ D ^ A) + X[2] + 0xc4ac5665) & 0xffffffff;
-  B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9));
-  sum = (A + (C ^ (B | (~D))) + X[0] + 0xf4292244) & 0xffffffff;
-  A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26));
-  sum = (D + (B ^ (A | (~C))) + X[7] + 0x432aff97) & 0xffffffff;
-  D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22));
-  sum = (C + (A ^ (D | (~B))) + X[14] + 0xab9423a7) & 0xffffffff;
-  C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17));
-  sum = (B + (D ^ (C | (~A))) + X[5] + 0xfc93a039) & 0xffffffff;
-  B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11));
-  sum = (A + (C ^ (B | (~D))) + X[12] + 0x655b59c3) & 0xffffffff;
-  A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26));
-  sum = (D + (B ^ (A | (~C))) + X[3] + 0x8f0ccc92) & 0xffffffff;
-  D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22));
-  sum = (C + (A ^ (D | (~B))) + X[10] + 0xffeff47d) & 0xffffffff;
-  C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17));
-  sum = (B + (D ^ (C | (~A))) + X[1] + 0x85845dd1) & 0xffffffff;
-  B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11));
-  sum = (A + (C ^ (B | (~D))) + X[8] + 0x6fa87e4f) & 0xffffffff;
-  A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26));
-  sum = (D + (B ^ (A | (~C))) + X[15] + 0xfe2ce6e0) & 0xffffffff;
-  D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22));
-  sum = (C + (A ^ (D | (~B))) + X[6] + 0xa3014314) & 0xffffffff;
-  C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17));
-  sum = (B + (D ^ (C | (~A))) + X[13] + 0x4e0811a1) & 0xffffffff;
-  B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11));
-  sum = (A + (C ^ (B | (~D))) + X[4] + 0xf7537e82) & 0xffffffff;
-  A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26));
-  sum = (D + (B ^ (A | (~C))) + X[11] + 0xbd3af235) & 0xffffffff;
-  D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22));
-  sum = (C + (A ^ (D | (~B))) + X[2] + 0x2ad7d2bb) & 0xffffffff;
-  C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17));
-  sum = (B + (D ^ (C | (~A))) + X[9] + 0xeb86d391) & 0xffffffff;
-  B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11));
-  this.chain_[0] = (this.chain_[0] + A) & 0xffffffff;
-  this.chain_[1] = (this.chain_[1] + B) & 0xffffffff;
-  this.chain_[2] = (this.chain_[2] + C) & 0xffffffff;
-  this.chain_[3] = (this.chain_[3] + D) & 0xffffffff;
-};
-/** @override */
-goog.crypt.Md5.prototype.update = function(bytes, opt_length) {
-  if (!goog.isDef(opt_length)) {
-    opt_length = bytes.length;
-  }
-  var lengthMinusBlock = opt_length - this.blockSize;
-  // Copy some object properties to local variables in order to save on access
-  // time from inside the loop (~10% speedup was observed on Chrome 11).
-  var block = this.block_;
-  var blockLength = this.blockLength_;
-  var i = 0;
-  // The outer while loop should execute at most twice.
-  while (i < opt_length) {
-    // When we have no data in the block to top up, we can directly process the
-    // input buffer (assuming it contains sufficient data). This gives ~30%
-    // speedup on Chrome 14 and ~70% speedup on Firefox 6.0, but requires that
-    // the data is provided in large chunks (or in multiples of 64 bytes).
-    if (blockLength == 0) {
-      while (i <= lengthMinusBlock) {
-        this.compress_(bytes, i);
-        i += this.blockSize;
-      }
-    }
-    if (goog.isString(bytes)) {
-      while (i < opt_length) {
-        block[blockLength++] = bytes.charCodeAt(i++);
-        if (blockLength == this.blockSize) {
-          this.compress_(block);
-          blockLength = 0;
-          // Jump to the outer loop so we use the full-block optimization.
-          break;
-        }
-      }
-    } else {
-      while (i < opt_length) {
-        block[blockLength++] = bytes[i++];
-        if (blockLength == this.blockSize) {
-          this.compress_(block);
-          blockLength = 0;
-          // Jump to the outer loop so we use the full-block optimization.
-          break;
-        }
-      }
-    }
-  }
-  this.blockLength_ = blockLength;
-  this.totalLength_ += opt_length;
-};
-/** @override */
-goog.crypt.Md5.prototype.digest = function() {
-  // This must accommodate at least 1 padding byte (0x80), 8 bytes of
-  // total bitlength, and must end at a 64-byte boundary.
-  var pad = new Array((this.blockLength_ < 56 ?
-                       this.blockSize :
-                       this.blockSize * 2) - this.blockLength_);
-  // Add padding: 0x80 0x00*
-  pad[0] = 0x80;
-  for (var i = 1; i < pad.length - 8; ++i) {
-    pad[i] = 0;
-  }
-  // Add the total number of bits, little endian 64-bit integer.
-  var totalBits = this.totalLength_ * 8;
-  for (var i = pad.length - 8; i < pad.length; ++i) {
-    pad[i] = totalBits & 0xff;
-    totalBits /= 0x100; // Don't use bit-shifting here!
-  }
-  this.update(pad);
-  var digest = new Array(16);
-  var n = 0;
-  for (var i = 0; i < 4; ++i) {
-    for (var j = 0; j < 32; j += 8) {
-      digest[n++] = (this.chain_[i] >>> j) & 0xff;
-    }
-  }
-  return digest;
-};
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-/* include/HsBaseConfig.h.  Generated from HsBaseConfig.h.in by configure.  */
-/* include/HsBaseConfig.h.in.  Generated from configure.ac by autoheader.  */
-/* The value of E2BIG. */
-/* The value of EACCES. */
-/* The value of EADDRINUSE. */
-/* The value of EADDRNOTAVAIL. */
-/* The value of EADV. */
-/* The value of EAFNOSUPPORT. */
-/* The value of EAGAIN. */
-/* The value of EALREADY. */
-/* The value of EBADF. */
-/* The value of EBADMSG. */
-/* The value of EBADRPC. */
-/* The value of EBUSY. */
-/* The value of ECHILD. */
-/* The value of ECOMM. */
-/* The value of ECONNABORTED. */
-/* The value of ECONNREFUSED. */
-/* The value of ECONNRESET. */
-/* The value of EDEADLK. */
-/* The value of EDESTADDRREQ. */
-/* The value of EDIRTY. */
-/* The value of EDOM. */
-/* The value of EDQUOT. */
-/* The value of EEXIST. */
-/* The value of EFAULT. */
-/* The value of EFBIG. */
-/* The value of EFTYPE. */
-/* The value of EHOSTDOWN. */
-/* The value of EHOSTUNREACH. */
-/* The value of EIDRM. */
-/* The value of EILSEQ. */
-/* The value of EINPROGRESS. */
-/* The value of EINTR. */
-/* The value of EINVAL. */
-/* The value of EIO. */
-/* The value of EISCONN. */
-/* The value of EISDIR. */
-/* The value of ELOOP. */
-/* The value of EMFILE. */
-/* The value of EMLINK. */
-/* The value of EMSGSIZE. */
-/* The value of EMULTIHOP. */
-/* The value of ENAMETOOLONG. */
-/* The value of ENETDOWN. */
-/* The value of ENETRESET. */
-/* The value of ENETUNREACH. */
-/* The value of ENFILE. */
-/* The value of ENOBUFS. */
-/* The value of ENOCIGAR. */
-/* The value of ENODATA. */
-/* The value of ENODEV. */
-/* The value of ENOENT. */
-/* The value of ENOEXEC. */
-/* The value of ENOLCK. */
-/* The value of ENOLINK. */
-/* The value of ENOMEM. */
-/* The value of ENOMSG. */
-/* The value of ENONET. */
-/* The value of ENOPROTOOPT. */
-/* The value of ENOSPC. */
-/* The value of ENOSR. */
-/* The value of ENOSTR. */
-/* The value of ENOSYS. */
-/* The value of ENOTBLK. */
-/* The value of ENOTCONN. */
-/* The value of ENOTDIR. */
-/* The value of ENOTEMPTY. */
-/* The value of ENOTSOCK. */
-/* The value of ENOTSUP. */
-/* The value of ENOTTY. */
-/* The value of ENXIO. */
-/* The value of EOPNOTSUPP. */
-/* The value of EPERM. */
-/* The value of EPFNOSUPPORT. */
-/* The value of EPIPE. */
-/* The value of EPROCLIM. */
-/* The value of EPROCUNAVAIL. */
-/* The value of EPROGMISMATCH. */
-/* The value of EPROGUNAVAIL. */
-/* The value of EPROTO. */
-/* The value of EPROTONOSUPPORT. */
-/* The value of EPROTOTYPE. */
-/* The value of ERANGE. */
-/* The value of EREMCHG. */
-/* The value of EREMOTE. */
-/* The value of EROFS. */
-/* The value of ERPCMISMATCH. */
-/* The value of ERREMOTE. */
-/* The value of ESHUTDOWN. */
-/* The value of ESOCKTNOSUPPORT. */
-/* The value of ESPIPE. */
-/* The value of ESRCH. */
-/* The value of ESRMNT. */
-/* The value of ESTALE. */
-/* The value of ETIME. */
-/* The value of ETIMEDOUT. */
-/* The value of ETOOMANYREFS. */
-/* The value of ETXTBSY. */
-/* The value of EUSERS. */
-/* The value of EWOULDBLOCK. */
-/* The value of EXDEV. */
-/* The value of O_BINARY. */
-/* The value of SIGINT. */
-/* Define to 1 if you have the `clock_gettime' function. */
-/* #undef HAVE_CLOCK_GETTIME */
-/* Define to 1 if you have the <ctype.h> header file. */
-/* Define if you have epoll support. */
-/* #undef HAVE_EPOLL */
-/* Define to 1 if you have the `epoll_ctl' function. */
-/* #undef HAVE_EPOLL_CTL */
-/* Define to 1 if you have the <errno.h> header file. */
-/* Define to 1 if you have the `eventfd' function. */
-/* #undef HAVE_EVENTFD */
-/* Define to 1 if you have the <fcntl.h> header file. */
-/* Define to 1 if you have the `ftruncate' function. */
-/* Define to 1 if you have the `getclock' function. */
-/* #undef HAVE_GETCLOCK */
-/* Define to 1 if you have the `getrusage' function. */
-/* Define to 1 if you have the <inttypes.h> header file. */
-/* Define to 1 if you have the `iswspace' function. */
-/* Define to 1 if you have the `kevent' function. */
-/* Define to 1 if you have the `kevent64' function. */
-/* Define if you have kqueue support. */
-/* Define to 1 if you have the <langinfo.h> header file. */
-/* Define to 1 if you have libcharset. */
-/* Define to 1 if you have the `rt' library (-lrt). */
-/* #undef HAVE_LIBRT */
-/* Define to 1 if you have the <limits.h> header file. */
-/* Define to 1 if the system has the type `long long'. */
-/* Define to 1 if you have the `lstat' function. */
-/* Define to 1 if you have the <memory.h> header file. */
-/* Define if you have poll support. */
-/* Define to 1 if you have the <poll.h> header file. */
-/* Define to 1 if you have the <signal.h> header file. */
-/* Define to 1 if you have the <stdint.h> header file. */
-/* Define to 1 if you have the <stdlib.h> header file. */
-/* Define to 1 if you have the <strings.h> header file. */
-/* Define to 1 if you have the <string.h> header file. */
-/* Define to 1 if you have the <sys/epoll.h> header file. */
-/* #undef HAVE_SYS_EPOLL_H */
-/* Define to 1 if you have the <sys/eventfd.h> header file. */
-/* #undef HAVE_SYS_EVENTFD_H */
-/* Define to 1 if you have the <sys/event.h> header file. */
-/* Define to 1 if you have the <sys/resource.h> header file. */
-/* Define to 1 if you have the <sys/select.h> header file. */
-/* Define to 1 if you have the <sys/stat.h> header file. */
-/* Define to 1 if you have the <sys/syscall.h> header file. */
-/* Define to 1 if you have the <sys/timeb.h> header file. */
-/* Define to 1 if you have the <sys/timers.h> header file. */
-/* #undef HAVE_SYS_TIMERS_H */
-/* Define to 1 if you have the <sys/times.h> header file. */
-/* Define to 1 if you have the <sys/time.h> header file. */
-/* Define to 1 if you have the <sys/types.h> header file. */
-/* Define to 1 if you have the <sys/utsname.h> header file. */
-/* Define to 1 if you have the <sys/wait.h> header file. */
-/* Define to 1 if you have the <termios.h> header file. */
-/* Define to 1 if you have the `times' function. */
-/* Define to 1 if you have the <time.h> header file. */
-/* Define to 1 if you have the <unistd.h> header file. */
-/* Define to 1 if you have the <utime.h> header file. */
-/* Define to 1 if you have the <wctype.h> header file. */
-/* Define to 1 if you have the <windows.h> header file. */
-/* #undef HAVE_WINDOWS_H */
-/* Define to 1 if you have the <winsock.h> header file. */
-/* #undef HAVE_WINSOCK_H */
-/* Define to 1 if you have the `_chsize' function. */
-/* #undef HAVE__CHSIZE */
-/* Define to Haskell type for cc_t */
-/* Define to Haskell type for char */
-/* Define to Haskell type for clock_t */
-/* Define to Haskell type for dev_t */
-/* Define to Haskell type for double */
-/* Define to Haskell type for float */
-/* Define to Haskell type for gid_t */
-/* Define to Haskell type for ino_t */
-/* Define to Haskell type for int */
-/* Define to Haskell type for intmax_t */
-/* Define to Haskell type for intptr_t */
-/* Define to Haskell type for long */
-/* Define to Haskell type for long long */
-/* Define to Haskell type for mode_t */
-/* Define to Haskell type for nlink_t */
-/* Define to Haskell type for off_t */
-/* Define to Haskell type for pid_t */
-/* Define to Haskell type for ptrdiff_t */
-/* Define to Haskell type for rlim_t */
-/* Define to Haskell type for short */
-/* Define to Haskell type for signed char */
-/* Define to Haskell type for sig_atomic_t */
-/* Define to Haskell type for size_t */
-/* Define to Haskell type for speed_t */
-/* Define to Haskell type for ssize_t */
-/* Define to Haskell type for suseconds_t */
-/* Define to Haskell type for tcflag_t */
-/* Define to Haskell type for time_t */
-/* Define to Haskell type for uid_t */
-/* Define to Haskell type for uintmax_t */
-/* Define to Haskell type for uintptr_t */
-/* Define to Haskell type for unsigned char */
-/* Define to Haskell type for unsigned int */
-/* Define to Haskell type for unsigned long */
-/* Define to Haskell type for unsigned long long */
-/* Define to Haskell type for unsigned short */
-/* Define to Haskell type for useconds_t */
-/* Define to Haskell type for wchar_t */
-/* Define to the address where bug reports for this package should be sent. */
-/* Define to the full name of this package. */
-/* Define to the full name and version of this package. */
-/* Define to the one symbol short name of this package. */
-/* Define to the home page for this package. */
-/* Define to the version of this package. */
-/* The size of `kev.filter', as computed by sizeof. */
-/* The size of `kev.flags', as computed by sizeof. */
-/* The size of `struct MD5Context', as computed by sizeof. */
-/* Define to 1 if you have the ANSI C header files. */
-/* Number of bits in a file offset, on hosts where this is settable. */
-/* #undef _FILE_OFFSET_BITS */
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// #define GHCJS_TRACE_IO 1
-function h$base_access(file, file_off, mode, c) {
-    ;
-    if(h$isNode) {
-        h$fs.stat(fd, function(err, fs) {
-            if(err) {
-                h$handleErrnoC(err, -1, 0, c);
-            } else {
-                c(mode & fs.mode); // fixme is this ok?
-            }
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_chmod(file, file_off, mode, c) {
-    ;
-    if(h$isNode) {
-        h$fs.chmod(h$decodeUtf8z(file, file_off), mode, function(err) {
-            h$handleErrnoC(err, -1, 0, c);
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_close(fd, c) {
-    ;
-    var fdo = h$base_fds[fd];
-    if(fdo && fdo.close) {
-        fdo.close(fd, fdo, c);
-    } else {
-        h$errno = 22;
-        c(-1);
-    }
-}
-function h$base_dup(fd, something, c) {
-    throw "h$base_dup";
-}
-function h$base_dup2(fd, c) {
-    throw "h$base_dup2";
-}
-function h$base_fstat(fd, stat, stat_off, c) {
-    ;
-    if(h$isNode) {
-        h$fs.fstat(fd, function(err, fs) {
-            if(err) {
-                h$handlErrnoC(err, -1, 0, c);
-            } else {
-                h$base_fillStat(fs, stat, stat_off);
-                c(0);
-            }
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_isatty(fd) {
-    ;
-    if(h$isNode) {
-        if(fd === 0) return process.stdin.isTTY?1:0;
-        if(fd === 1) return process.stdout.isTTY?1:0;
-        if(fd === 2) return process.stderr.isTTY?1:0;
-    }
-    if(fd === 1 || fd === 2) return 1;
-    return 0;
-}
-function h$base_lseek(fd, pos_1, pos_2, whence, c) {
-    ;
-    if(h$isNode) {
-        var p = goog.math.Long.fromBits(pos_2, pos_1), p1;
-        var o = h$base_fds[fd];
-        if(!o) {
-            h$errno = CONST_BADF;
-            c(-1,-1);
-        } else {
-            switch(whence) {
-            case 0: /* SET */
-                o.pos = p.toNumber();
-                c(p.getHighBits(), p.getLowBits());
-                break;
-            case 1: /* CUR */
-                o.pos += p.toNumber();
-                p1 = goog.math.Long.fromNumber(o.pos);
-                c(p1.getHighBits(), p1.getLowBits());
-                break;
-            case 2: /* END */
-                h$fs.fstat(fd, function(err, fs) {
-                    if(err) {
-                        h$setErrno(err);
-                        c(-1,-1);
-                    } else {
-                        o.pos = fs.size + p.toNumber();
-                        p1 = goog.math.Long.fromNumber(o.pos);
-                        c(p1.getHighBits(), p1.getLowBits());
-                    }
-                });
-                break;
-            default:
-                h$errno = 22;
-                c(-1,-1);
-            }
-        }
-    } else {
-        h$unsupported();
-        c(-1, -1);
-    }
-}
-function h$base_lstat(file, file_off, stat, stat_off, c) {
-    ;
-    if(h$isNode) {
-        h$fs.lstat(h$decodeUtf8z(file, file_off), function(err, fs) {
-            if(err) {
-                h$handleErrnoC(err, -1, 0, c);
-            } else {
-                h$base_fillStat(fs, stat, stat_off);
-                c(0);
-            }
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_open(file, file_off, how, mode, c) {
-    if(h$isNode) {
-        var flags, off;
-        var fp = h$decodeUtf8z(file, file_off);
-        var acc = how & h$base_o_accmode;
-        // passing a number lets node.js use it directly as the flags (undocumented)
-        if(acc === h$base_o_rdonly) {
-            flags = h$processConstants['O_RDONLY'];
-        } else if(acc === h$base_o_wronly) {
-            flags = h$processConstants['O_WRONLY'];
-        } else { // r+w
-            flags = h$processConstants['O_RDWR'];
-        }
-        off = (how & h$base_o_append) ? -1 : 0;
-        flags = flags | ((how & h$base_o_trunc) ? h$processConstants['O_TRUNC'] : 0)
-                      | ((how & h$base_o_creat) ? h$processConstants['O_CREAT'] : 0)
-                      | ((how & h$base_o_excl) ? h$processConstants['O_EXCL'] : 0)
-                      | ((how & h$base_o_append) ? h$processConstants['O_APPEND'] : 0);
-        h$fs.open(fp, flags, mode, function(err, fd) {
-            if(err) {
-                h$handleErrnoC(err, -1, 0, c);
-            } else {
-                var f = function(p) {
-                    h$base_fds[fd] = { read: h$base_readFile
-                                       , write: h$base_writeFile
-                                       , close: h$base_closeFile
-                                       , pos: p
-                                     };
-                    c(fd);
-                }
-                if(off === -1) {
-                    h$fs.stat(fp, function(err, fs) {
-                        if(err) h$handleErrnoC(err, -1, 0, c); else f(fs.size);
-                    });
-                } else {
-                    f(0);
-                }
-            }
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_read(fd, buf, buf_off, n, c) {
-    ;
-    var fdo = h$base_fds[fd];
-    if(fdo && fdo.read) {
-        fdo.read(fd, fdo, buf, buf_off, n, c);
-    } else {
-        h$errno = 22;
-        c(-1);
-    }
-}
-function h$base_stat(file, file_off, stat, stat_off, c) {
-    ;
-    if(h$isNode) {
-        h$fs.stat(h$decodeUtf8z(file, file_off), function(err, fs) {
-            if(err) {
-                h$handlErrnoC(err, -1, 0, c);
-            } else {
-                h$base_fillStat(fs, stat, stat_off);
-                c(0);
-            }
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_umask(mode) {
-    ;
-    if(h$isNode) return process.umask(mode);
-    return 0;
-}
-function h$base_write(fd, buf, buf_off, n, c) {
-    ;
-    var fdo = h$base_fds[fd];
-    if(fdo && fdo.write) {
-        fdo.write(fd, fdo, buf, buf_off, n, c);
-    } else {
-        h$errno = 22;
-        c(-1);
-    }
-}
-function h$base_ftruncate(fd, pos_1, pos_2, c) {
-    ;
-    if(h$isNode) {
-        h$fs.ftruncate(fd, goog.math.Long.fromBits(pos_2, pos_1).toNumber(), function(err) {
-            h$handleErrnoC(err, -1, 0, c);
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_unlink(file, file_off, c) {
-    ;
-    if(h$isNode) {
-        h$fs.unlink(h$decodeUtf8z(file, file_off), function(err) {
-            h$handleErrnoC(err, -1, 0, c);
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_getpid() {
-    ;
-    if(h$isNode) return process.pid;
-    return 0;
-}
-function h$base_link(file1, file1_off, file2, file2_off, c) {
-    ;
-    if(h$isNode) {
-        h$fs.link(h$decodeUtf8z(file1, file1_off), h$decodeUtf8z(file2, file2_off), function(err) {
-            h$handleErrnoC(err, -1, 0, c);
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_mkfifo(file, file_off, mode, c) {
-    throw "h$base_mkfifo";
-}
-function h$base_sigemptyset(sigset, sigset_off) {
-    return 0;
-    // throw "h$base_sigemptyset";
-}
-function h$base_sigaddset(sigset, sigset_off, sig) {
-    return 0;
-    // throw "h$base_sigaddset";
-}
-function h$base_sigprocmask(sig, sigset1, sigset1_off, sigset2, sigset2_off) {
-    return 0;
-    // throw "h$base_sigprocmask";
-}
-function h$base_tcgetattr(attr, termios, termios_off) {
-    return 0;
-}
-function h$base_tcsetattr(attr, val, termios, termios_off) {
-    return 0;
-}
-function h$base_utime(file, file_off, timbuf, timbuf_off, c) {
-    ;
-    if(h$isNode) {
-        h$fs.fstat(h$decodeUtf8z(file, file_off), function(err, fs) {
-            if(err) {
-                h$handleErrnoC(err, 0, -1, c); // fixme
-            } else {
-                var atime = goog.math.Long.fromNumber(fs.atime.getTime());
-                var mtime = goog.math.Long.fromNumber(fs.mtime.getTime());
-                var ctime = goog.math.Long.fromNumber(fs.ctime.getTime());
-                timbuf.i3[0] = atime.getHighBits();
-                timbuf.i3[1] = atime.getLowBits();
-                timbuf.i3[2] = mtime.getHighBits();
-                timbuf.i3[3] = mtime.getLowBits();
-                timbuf.i3[4] = ctime.getHighBits();
-                timbuf.i3[5] = ctime.getLowBits();
-                c(0);
-            }
-        });
-    } else
-        h$unsupported(-1, c);
-}
-function h$base_waitpid(pid, stat, stat_off, options, c) {
-    throw "h$base_waitpid";
-}
-/** @const */ var h$base_o_rdonly = 0x00000;
-/** @const */ var h$base_o_wronly = 0x00001;
-/** @const */ var h$base_o_rdwr = 0x00002;
-/** @const */ var h$base_o_accmode = 0x00003;
-/** @const */ var h$base_o_append = 0x00008;
-/** @const */ var h$base_o_creat = 0x00200;
-/** @const */ var h$base_o_trunc = 0x00400;
-/** @const */ var h$base_o_excl = 0x00800;
-/** @const */ var h$base_o_noctty = 0x20000;
-/** @const */ var h$base_o_nonblock = 0x00004;
-/** @const */ var h$base_o_binary = 0x00000;
-function h$base_c_s_isreg(mode) {
-    return 1;
-}
-function h$base_c_s_ischr(mode) {
-    return 0;
-}
-function h$base_c_s_isblk(mode) {
-    return 0;
-}
-function h$base_c_s_isdir(mode) {
-    return 0; // fixme
-}
-function h$base_c_s_isfifo(mode) {
-    return 0;
-}
-function h$base_fillStat(fs, b, off) {
-    if(off%4) throw "h$base_fillStat: not aligned";
-    var o = off>>2;
-    b.i3[o+0] = fs.mode;
-    var s = goog.math.Long.fromNumber(fs.size);
-    b.i3[o+1] = s.getHighBits();
-    b.i3[o+2] = s.getLowBits();
-    b.i3[o+3] = 0; // fixme
-    b.i3[o+4] = 0; // fixme
-    b.i3[o+5] = fs.dev;
-    var i = goog.math.Long.fromNumber(fs.ino);
-    b.i3[o+6] = i.getHighBits();
-    b.i3[o+7] = i.getLowBits();
-    b.i3[o+8] = fs.uid;
-    b.i3[o+9] = fs.gid;
-}
-// [mode,size1,size2,mtime1,mtime2,dev,ino1,ino2,uid,gid] all 32 bit
-/** @const */ var h$base_sizeof_stat = 40;
-function h$base_st_mtime(stat, stat_off) {
-    { h$ret1 = (stat.i3[(stat_off>>2)+4]); return (stat.i3[(stat_off>>2)+3]); };
-}
-function h$base_st_size(stat, stat_off) {
-    { h$ret1 = (stat.i3[(stat_off>>2)+2]); return (stat.i3[(stat_off>>2)+1]); };
-}
-function h$base_st_mode(stat, stat_off) {
-    return stat.i3[stat_off>>2];
-}
-function h$base_st_dev(stat, stat_off) {
-    return stat.i3[(stat_off>>2)+5];
-}
-function h$base_st_ino(stat, stat_off) {
-    { h$ret1 = (stat.i3[(stat_off>>2)+7]); return (stat.i3[(stat_off>>2)+6]); };
-}
-/** @const */ var h$base_echo = 1;
-/** @const */ var h$base_tcsanow = 2;
-/** @const */ var h$base_icanon = 4;
-/** @const */ var h$base_vmin = 8;
-/** @const */ var h$base_vtime = 16;
-/** @const */ var h$base_sigttou = 0;
-/** @const */ var h$base_sig_block = 0;
-/** @const */ var h$base_sig_setmask = 0;
-/** @const */ var h$base_f_getfl = 0;
-/** @const */ var h$base_f_setfl = 0;
-/** @const */ var h$base_f_setfd = 0;
-/** @const */ var h$base_fd_cloexec = 0;
-/** @const */ var h$base_sizeof_termios = 4;
-/** @const */ var h$base_sizeof_sigset_t = 4;
-function h$base_lflag(termios, termios_off) {
-    return 0;
-}
-function h$base_poke_lflag(termios, termios_off, flag) {
-    return 0;
-}
-function h$base_ptr_c_cc(termios, termios_off) {
-    { h$ret1 = (0); return (h$newByteArray(8)); };
-}
-/** @const */ var h$base_default_buffer_size = 32768;
-function h$base_c_s_issock(mode) {
-    return 0; // fixme
-}
-/** @const */ var h$base_SEEK_SET = 0;
-/** @const */ var h$base_SEEK_CUR = 1;
-/** @const */ var h$base_SEEK_END = 2;
-function h$base_set_saved_termios(a, b, c) {
-    { h$ret1 = (0); return (null); };
-}
-function h$base_get_saved_termios(r) {
-    { h$ret1 = (0); return (null); };
-}
-// fixme
-function h$lockFile(fd, dev, ino, for_writing) {
-    ;
-    return 0;
-}
-function h$unlockFile(fd) {
-    ;
-    return 0;
-}
-// engine-dependent setup
-var h$base_readStdin , h$base_writeStderr, h$base_writeStdout;
-var h$base_closeStdin = null, h$base_closeStderr = null, h$base_closeStdout = null;
-var h$base_readFile, h$base_writeFile, h$base_closeFile;
-var h$base_stdin_waiting = new h$Queue();
-var h$base_stdin_chunk = { buf: null
-                           , pos: 0
-                           , processing: false
-                           };
-var h$base_stdin_eof = false;
-var h$base_process_stdin = function() {
-    var c = h$base_stdin_chunk;
-    var q = h$base_stdin_waiting;
-    if(!q.length() || c.processing) return;
-    c.processing = true;
-    if(!c.buf) { c.pos = 0; c.buf = process.stdin.read(); }
-    while(c.buf && q.length()) {
-        var x = q.dequeue();
-        var n = Math.min(c.buf.length - c.pos, x.n);
-        for(var i=0;i<n;i++) {
-            x.buf.u8[i+x.off] = c.buf[c.pos+i];
-        }
-        c.pos += n;
-        x.c(n);
-        if(c.pos >= c.buf.length) c.buf = null;
-        if(!c.buf && q.length()) { c.pos = 0; c.buf = process.stdin.read(); }
-    }
-    while(h$base_stdin_eof && q.length()) q.dequeue().c(0);
-    c.processing = false;
-}
-if(h$isNode) {
-    h$base_closeFile = function(fd, fdo, c) {
-        h$fs.close(fd, function(err) {
-            delete h$base_fds[fd];
-            h$handleErrnoC(err, -1, 0, c);
-        });
-    }
-    h$base_readFile = function(fd, fdo, buf, buf_offset, n, c) {
-        var pos = typeof fdo.pos === 'number' ? fdo.pos : null;
-        ;
-        h$fs.read(fd, new Buffer(n), 0, n, pos, function(err, bytesRead, nbuf) {
-            if(err) {
-                h$setErrno(err);
-                c(-1);
-            } else {
-                for(var i=bytesRead-1;i>=0;i--) buf.u8[buf_offset+i] = nbuf[i];
-                if(typeof fdo.pos === 'number') fdo.pos += bytesRead;
-                c(bytesRead);
-            }
-        });
-    }
-    h$base_readStdin = function(fd, fdo, buf, buf_offset, n, c) {
-        ;
-        h$base_stdin_waiting.enqueue({buf: buf, off: buf_offset, n: n, c: c});
-        h$base_process_stdin();
-    }
-    h$base_closeStdin = function(fd, fdo, c) {
-        ;
-        // process.stdin.close(); fixme
-        c(0);
-    }
-    h$base_writeFile = function(fd, fdo, buf, buf_offset, n, c) {
-        var pos = typeof fdo.pos === 'number' ? fdo.pos : null;
-        ;
-        var nbuf = new Buffer(n);
-        for(var i=0;i<n;i++) nbuf[i] = buf.u8[i+buf_offset];
-        if(typeof fdo.pos === 'number') fdo.pos += n;
-        h$fs.write(fd, nbuf, 0, n, pos, function(err, bytesWritten) {
-            ;
-            if(err) {
-                h$setErrno(err);
-                if(typeof fdo.pos === 'number') fdo.pos -= n;
-                if(h$errno === 35)
-                    setTimeout(function() { h$base_writeFile(fd, fdo, buf, buf_offset, n, c); }, 20);
-                else c(-1);
-            } else {
-                if(typeof fdo.pos === 'number') fdo.pos += bytesWritten - n;
-                c(bytesWritten);
-            }
-        });
-    }
-    h$base_writeStdout = function(fd, fdo, buf, buf_offset, n, c) {
-        ;
-        h$base_writeFile(1, fdo, buf, buf_offset, n, c);
-    }
-    h$base_closeStdout = function(fd, fdo, c) {
-        ;
- // not actually closed, fixme?
-        c(0);
-    }
-    h$base_writeStderr = function(fd, fdo, buf, buf_offset, n, c) {
-        ;
-        h$base_writeFile(2, fdo, buf, buf_offset, n, c);
-    }
-    h$base_closeStderr = function(fd, fdo, c) {
-        ;
- // not actually closed, fixme?
-        c(0);
-    }
-    process.stdin.on('readable', h$base_process_stdin);
-    process.stdin.on('end', function() { h$base_stdin_eof = true; h$base_process_stdin(); });
-} else if (h$isJsShell) {
-    h$base_readStdin = function(fd, fdo, buf, buf_offset, n, c) {
-        c(0);
-    }
-    h$base_writeStdout = function(fd, fdo, buf, buf_offset, n, c) {
-        putstr(h$decodeUtf8(buf, n, buf_offset));
-        c(n);
-    }
-    h$base_writeStderr = function(fd, fdo, buf, buf_offset, n, c) {
-        printErr(h$decodeUtf8(buf, n, buf_offset));
-        c(n);
-    }
-} else if(h$isJsCore) {
-    h$base_readStdin = function(fd, fdo, buf, buf_offset, n, c) {
- c(0);
-    }
-    var h$base_stdoutLeftover = { f: print, val: null };
-    var h$base_stderrLeftover = { f: debug, val: null };
-    var h$base_writeWithLeftover = function(buf, n, buf_offset, c, lo) {
- var lines = h$decodeUtf8(buf, n, buf_offset).split(/\r?\n/);
- if(lines.length === 1) {
-     if(lines[0].length) {
-  if(lo.val !== null) lo.val += lines[0];
-  else lo.val = lines[0];
-     }
- } else {
-            lo.f(((lo.val !== null) ? lo.val : '') + lines[0]);
-     for(var i=1;i<lines.length-1;i++) lo.f(lines[i]);
-     if(lines[lines.length-1].length) lo.val = lines[lines.length-1];
-     else lo.val = null;
- }
- c(n);
-    }
-    h$base_writeStdout = function(fd, fdo, buf, buf_offset, n, c) {
- h$base_writeWithLeftover(buf, n, buf_offset, c, h$base_stdoutLeftover);
-    }
-    h$base_writeStderr = function(fd, fdo, buf, buf_offset, n, c) {
- // writing to stderr not supported, write to stdout
- h$base_writeWithLeftover(buf, n, buf_offset, c, h$base_stderrLeftover);
-    }
-} else { // browser / fallback
-    h$base_readStdin = function(fd, fdo, buf, buf_offset, n, c) {
-        c(0);
-    }
-    h$base_writeStdout = function(fd, fdo, buf, buf_offset, n, c) {
-        console.log(h$decodeUtf8(buf, n, buf_offset));
-        c(n);
-    }
-    h$base_writeStderr = function(fd, fdo, buf, buf_offset, n, c) {
-        console.log(h$decodeUtf8(buf, n, buf_offset));
-        c(n);
-    }
-}
-var h$base_stdin_fd = { read: h$base_readStdin, close: h$base_closeStdin };
-var h$base_stdout_fd = { write: h$base_writeStdout, close: h$base_closeStdout };
-var h$base_stderr_fd = { write: h$base_writeStderr, close: h$base_closeStderr };
-var h$base_fdN = -1; // negative file descriptors are 'virtual'
-var h$base_fds = [h$base_stdin_fd, h$base_stdout_fd, h$base_stderr_fd];
-function h$shutdownHaskellAndExit(code, fast) {
-    h$exitProcess(code);
-}
-// RAND_MAX = 32767
-function h$rand() {
-  return (32768 * Math.random()) & 32767;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// JS Objects stuff
-function h$isFloat (n) {
-  return n===+n && n!==(n|0);
-}
-function h$isInteger (n) {
-  return n===+n && n===(n|0);
-}
-/*
-        -- 0 - null, 1 - integer,
-        -- 2 - float, 3 - bool,
-        -- 4 - string, 5 - array
-        -- 6 - object
-*/
-function h$typeOf(o) {
-    if (!(o instanceof Object)) {
-        if (o == null) {
-            return 0;
-        } else if (typeof o == 'number') {
-            if (h$isInteger(o)) {
-                return 1;
-            } else {
-                return 2;
-            }
-        } else if (typeof o == 'boolean') {
-            return 3;
-        } else {
-            return 4;
-        }
-    } else {
-        if (Object.prototype.toString.call(o) == '[object Array]') {
-            // it's an array
-            return 5;
-        } else if (!o) {
-            // null 
-            return 0;
-        } else {
-            // it's an object
-            return 6;
-        }
-    }
-}
-function h$listProps(o) {
-    if (!(o instanceof Object)) {
-        return [];
-    }
-    var l = [], i = 0;
-    for (var prop in o) {
-        l[i++] = prop;
-    }
-    return l;
-}
-function h$flattenObj(o) {
-    var l = [], i = 0;
-    for (var prop in o) {
-        l[i++] = [prop, o[prop]];
-    }
-    return l;
-}
-/*
-
-  build an object from key/value pairs:
-    var obj = h$buildObject(key1, val1, key2, val2, ...);
-
-  note: magic name:
-    invocations of this function are replaced by object literals wherever
-    possible
-
- */
-function h$buildObject() {
-    var r = {}, l = arguments.length;
-    for(var i = 0; i < l; i += 2) {
-        var k = arguments[i], v = arguments[i+1];
-        r[k] = v;
-    }
-    return r;
-}
-// same as above, but from a list: [k1,v1,k2,v2,...]
-function h$buildObjectFromList(xs) {
-    var r = {}, k, v, t;
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
-        xs = ((xs).d2);
-        t = ((xs).d2);
-        if(((t).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
-            k = ((xs).d1);
-            v = ((t).d1);
-            xs = ((t).d2);
-            r[k] = v;
-        } else {
-            return r;
-        }
-    }
-    return r;
-}
-// same as above, but from a list of tuples [(k1,v1),(k2,v2),...]
-function h$buildObjectFromTupList(xs) {
-    var r = {};
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- var h = ((xs).d1);
- xs = ((xs).d2);
- r[((((h).d1)).d1)] = ((((h).d2)).d1);
-    }
-    return r;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-/* FNV-1 hash
- *
- * The FNV-1 hash description: http://isthe.com/chongo/tech/comp/fnv/
- * The FNV-1 hash is public domain: http://isthe.com/chongo/tech/comp/fnv/#public_domain
- */
-function h$hashable_fnv_hash_offset(str_a, o, len, hash) {
-  return h$hashable_fnv_hash(str_a, o, len, hash);
-}
-function h$hashable_fnv_hash(str_d, str_o, len, hash) {
-  if(len > 0) {
-    var d = str_d.u8;
-    for(var i=0;i<len;i++) {
-      hash = h$mulInt32(hash, 16777619) ^ d[str_o+i];
-    }
-  }
-  return hash;
-}
-// int hashable_getRandomBytes(unsigned char *dest, int nbytes)
-function h$hashable_getRandomBytes(dest_d, dest_o, len) {
-  if(len > 0) {
-    var d = dest_d.u8;
-    for(var i=0;i<len;i++) {
-      d[dest_o+i] = Math.floor(Math.random() * 256);
-    }
-  }
-  return len;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-function h$_hs_text_memcpy(dst_v,dst_o2,src_v,src_o2,n) {
-  return h$memcpy(dst_v,2*dst_o2,src_v,2*src_o2,2*n);
-}
-function h$_hs_text_memcmp(a_v,a_o2,b_v,b_o2,n) {
-  return h$memcmp(a_v,2*a_o2,b_v,2*b_o2,2*n);
-}
-// decoder below adapted from cbits/cbits.c in the text package
-var h$_text_utf8d =
-   [
-  /*
-   * The first part of the table maps bytes to character classes that
-   * to reduce the size of the transition table and create bitmasks.
-   */
-   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
-   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-   8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
-  10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8,
-  /*
-   * The second part is a transition table that maps a combination of
-   * a state of the automaton and a character class to a state.
-   */
-   0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12,
-  12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12,
-  12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12,
-  12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12,
-  12,36,12,12,12,12,12,12,12,12,12,12];
-/*
- * A best-effort decoder. Runs until it hits either end of input or
- * the start of an invalid byte sequence.
- *
- * At exit, updates *destoff with the next offset to write to, and
- * returns the next source offset to read from.
- */
-function h$_hs_text_decode_utf8_internal ( dest_v
-                                         , destoff_v, destoff_o
-                                         , src_v, src_o
-                                         , src_end_v, src_end_o
-                                         , s
-                                         ) {
-  if(src_v === null || src_end_v === null) {
-    { h$ret1 = (src_end_o); return (null); };
-  }
-  var dsto = destoff_v.dv.getUint32(destoff_o,true) << 1;
-  var srco = src_o;
-  var state = s.state;
-  var codepoint = s.codepoint;
-  var ddv = dest_v.dv;
-  var sdv = src_v.dv;
-  function decode(b) {
-    var type = h$_text_utf8d[b];
-    codepoint = (state !== 0) ?
-      (b & 0x3f) | (codepoint << 6) :
-      (0xff >>> type) & b;
-    state = h$_text_utf8d[256 + state + type];
-    return state;
-  }
-  while (srco < src_end_o) {
-    if(decode(sdv.getUint8(srco++)) !== 0) {
-      if(state !== 12) {
-        continue;
-      } else {
-        break;
-      }
-    }
-    if (codepoint <= 0xffff) {
-      ddv.setUint16(dsto,codepoint,true);
-      dsto += 2;
-    } else {
-      ddv.setUint16(dsto,(0xD7C0 + (codepoint >>> 10)),true);
-      ddv.setUint16(dsto+2,(0xDC00 + (codepoint & 0x3FF)),true);
-      dsto += 4;
-    }
-    s.last = srco;
-  }
-  s.state = state;
-  s.codepoint = codepoint;
-  destoff_v.dv.setUint32(destoff_o,dsto>>1,true);
-  { h$ret1 = (srco); return (src_v); };
-}
-function h$_hs_text_decode_utf8_state( dest_v
-                                     , destoff_v, destoff_o
-                                     , src_v, src_o
-                                     , srcend_v, srcend_o
-                                     , codepoint0_v, codepoint0_o
-                                     , state0_v, state0_o
-                                     ) {
-  var s = { state: state0_v.dv.getUint32(state0_o, true)
-          , codepoint: codepoint0_v.dv.getUint32(codepoint0_o, true)
-          , last: src_o
-          };
-  var ret, ret1;
-  { (ret) = (h$_hs_text_decode_utf8_internal ( dest_v , destoff_v, destoff_o , src_v.arr[src_o][0], src_v.arr[src_o][1] , srcend_v, srcend_o , s )); (ret1) = h$ret1; };
-  src_v.arr[src_o][1] = s.last;
-  state0_v.dv.setUint32(state0_o, s.state, true);
-  codepoint0_v.dv.setUint32(codepoint0_o, s.codepoint, true);
-  if(s.state === 12) ret1--;
-  { h$ret1 = (ret1); return (ret); };
-}
-function h$_hs_text_decode_utf8( dest_v
-                               , destoff_v, destoff_o
-                               , src_v, src_o
-                               , srcend_v, srcend_o
-                               ) {
-  /* Back up if we have an incomplete or invalid encoding */
-  var s = { state: 0
-          , codepoint: 0
-          , last: src_o
-          };
-  var ret, ret1;
-  { (ret) = (h$_hs_text_decode_utf8_internal ( dest_v , destoff_v, destoff_o , src_v, src_o , srcend_v, srcend_o , s )); (ret1) = h$ret1; };
-  if (s.state !== 0) ret1--;
-  { h$ret1 = (ret1); return (ret); };
-}
-/*
- * The ISO 8859-1 (aka latin-1) code points correspond exactly to the first 256 unicode
- * code-points, therefore we can trivially convert from a latin-1 encoded bytestring to
- * an UTF16 array
- */
-function h$_hs_text_decode_latin1(dest_d, src_d, src_o, srcend_d, srcend_o) {
-  var p = src_o;
-  var d = 0;
-  var su8 = src_d.u8;
-  var su3 = src_d.u3;
-  var du1 = dest_d.u1;
-  // consume unaligned prefix
-  while(p != srcend_o && p & 3) {
-    du1[d++] = su8[p++];
-  }
-  // iterate over 32-bit aligned loads
-  if(su3) {
-    while (p < srcend_o - 3) {
-      var w = su3[p>>2];
-      du1[d++] = w & 0xff;
-      du1[d++] = (w >>> 8) & 0xff;
-      du1[d++] = (w >>> 16) & 0xff;
-      du1[d++] = (w >>> 32) & 0xff;
-      p += 4;
-    }
-  }
-  // handle unaligned suffix
-  while (p != srcend_o)
-    du1[d++] = su8[p++];
-}
-function h$_hs_text_encode_utf8(destp_v, destp_o, src_v, srcoff, srclen) {
-  var dest_v = destp_v.arr[destp_o][0];
-  var dest_o = destp_v.arr[destp_o][1];
-  var src = srcoff;
-  var dest = dest_o;
-  var srcend = src + srclen;
-  var srcu1 = src_v.u1;
-  if(!srcu1) throw "h$_hs_text_encode_utf8: invalid alignment for source";
-  var srcu3 = src_v.u3;
-  var destu8 = dest_v.u8;
-  while(src < srcend) {
-    // run of (aligned) ascii characters
-    while(srcu3 && !(src & 1) && srcend - src >= 2) {
-      var w = srcu3[src>>1];
-      if(w & 0xFF80FF80) break;
-      destu8[dest++] = w & 0xFFFF;
-      destu8[dest++] = w >>> 16;
-      src += 2;
-    }
-    while(src < srcend) {
-      var w = srcu1[src++];
-      if(w <= 0x7F) {
-        destu8[dest++] = w;
-        break; // go back to a stream of ASCII
-      } else if(w <= 0x7FF) {
-        destu8[dest++] = (w >> 6) | 0xC0;
-        destu8[dest++] = (w & 0x3f) | 0x80;
-      } else if(w < 0xD800 || w > 0xDBFF) {
-        destu8[dest++] = (w >>> 12) | 0xE0;
-        destu8[dest++] = ((w >> 6) & 0x3F) | 0x80;
-        destu8[dest++] = (w & 0x3F) | 0x80;
-      } else {
-        var c = ((w - 0xD800) << 10) + (srcu1[src++] - 0xDC00) + 0x10000;
-        destu8[dest++] = (c >>> 18) | 0xF0;
-        destu8[dest++] = ((c >> 12) & 0x3F) | 0x80;
-        destu8[dest++] = ((c >> 6) & 0x3F) | 0x80;
-        destu8[dest++] = (c & 0x3F) | 0x80;
-      }
-    }
-  }
-  destp_v.arr[destp_o][1] = dest;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-function h$get_current_timezone_seconds(t, pdst_v, pdst_o, pname_v, pname_o) {
-    var d = new Date(t);
-    var now = new Date();
-    var jan = new Date(now.getFullYear(),0,1);
-    var jul = new Date(now.getFullYear(),0,1);
-    var stdOff = Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
-    var isDst = d.getTimezoneOffset() < stdOff;
-    var tzo = d.getTimezoneOffset();
-    pdst_v.dv.setInt32(pdst_o, isDst ? 1 : 0, true);
-    if(!pname_v.arr) pname_v.arr = [];
-    var offstr = tzo < 0 ? ('+' + (tzo/-60)) : ('' + (tzo/-60));
-    pname_v.arr[pname_o] = [h$encodeUtf8("UTC" + offstr), 0];
-    return (3600-60*tzo)|0;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-function h$createWebSocket(url, protocols) {
-  return new WebSocket(url, protocols);
-}
-/*
-   this must be called before the websocket has connected,
-   typically synchronously after creating the socket
- */
-function h$openWebSocket(ws, mcb, ccb, c) {
-  if(ws.readyState !== 0) {
-    throw new Error("h$openWebSocket: unexpected readyState, socket must be CONNECTING");
-  }
-  ws.lastError = null;
-  ws.onopen = function() {
-    if(mcb) {
-      ws.onmessage = mcb;
-    }
-    if(ccb || mcb) {
-      ws.onclose = function(ce) {
-        if(ws.onmessage) {
-          h$release(ws.onmessage);
-          ws.onmessage = null;
-        }
-        if(ccb) {
-          h$release(ccb);
-          ccb(ce);
-        }
-      };
-    };
-    ws.onerror = function(err) {
-      ws.lastError = err;
-      if(ws.onmessage) {
-        h$release(ws.onmessage);
-        ws.onmessage = null;
-      }
-      ws.close();
-    };
-    c(null);
-  };
-  ws.onerror = function(err) {
-    if(ccb) h$release(ccb);
-    if(mcb) h$release(mcb);
-    ws.onmessage = null;
-    ws.close();
-    c(err);
-  };
-}
-function h$closeWebSocket(status, reason, ws) {
-  ws.onerror = null;
-  if(ws.onmessage) {
-    h$release(ws.onmessage);
-    ws.onmessage = null;
-  }
-  ws.close(status, reason);
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-/*
-   convert an array to a Haskell list, wrapping each element in a
-   JSVal constructor
- */
-function h$fromArray(a) {
-    var r = h$ghczmprimZCGHCziTypesziZMZN;
-    for(var i=a.length-1;i>=0;i--) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (a[i])))), (r)));
-    return a;
-}
-/*
-   convert an array to a Haskell list. No additional wrapping of the
-   elements is performed. Only use this when the elements are directly
-   usable as Haskell heap objects (numbers, boolean) or when the
-   array elements have already been appropriately wrapped
- */
-function h$fromArrayNoWrap(a) {
-    var r = h$ghczmprimZCGHCziTypesziZMZN;
-    for(var i=a.length-1;i>=0;i--) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (a[i]), (r)));
-    return a;
-}
-/*
-   convert a list of JSVal to an array. the list must have been fully forced,
-   not just the spine.
- */
-function h$listToArray(xs) {
-    var a = [], i = 0;
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- a[i++] = ((((xs).d1)).d1);
- xs = ((xs).d2);
-    }
-    return a;
-}
-function h$listToArrayWrap(xs) {
-    return (h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (h$listToArray(xs))));
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-function h$animationFrameCancel(h) {
-    if(h.handle) window.cancelAnimationFrame(h.handle);
-    if(h.callback) {
-        h$release(h.callback)
-        h.callback = null;
-    }
-}
-function h$animationFrameRequest(h) {
-    h.handle = window.requestAnimationFrame(function(ts) {
-        var cb = h.callback;
-        if(cb) {
-         h$release(cb);
-         h.callback = null;
-         cb(ts);
-        }
-    });
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-function h$exportValue(fp1a,fp1b,fp2a,fp2b,o) {
-  var e = { fp1a: fp1a
-          , fp1b: fp1b
-          , fp2a: fp2a
-          , fp2b: fp2b
-          , released: false
-          , root: o
-          , _key: -1
-          };
-  h$retain(e);
-  return e;
-}
-function h$derefExport(fp1a,fp1b,fp2a,fp2b,e) {
-  if(!e || typeof e !== 'object') return null;
-  if(e.released) return null;
-  if(fp1a !== e.fp1a || fp1b !== e.fp1b ||
-     fp2a !== e.fp2a || fp2b !== e.fp2b) return null;
-  return e.root;
-}
-function h$releaseExport(e) {
-  h$release(e);
-  e.released = true;
-  e.root = null;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-/*
- * Support code for the Data.JSString module. This code presents a JSString
- * as a sequence of code points and hides the underlying encoding ugliness of
- * the JavaScript strings.
- *
- * Use Data.JSString.Raw for direct access to the JSThis makes the operations more expen
- */
-/*
- * Some workarounds here for JS engines that do not support proper
- * code point access
- */
-var h$jsstringEmpty = (h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, ('')));
-var h$jsstringHead, h$jsstringTail, h$jsstringCons,
-    h$jsstringSingleton, h$jsstringSnoc, h$jsstringUncons,
-    h$jsstringIndex, h$jsstringUncheckedIndex,
-    h$jsstringTake, h$jsstringDrop, h$jsstringTakeEnd, h$jsstringDropEnd;
-if(String.prototype.codePointAt) {
-    h$jsstringSingleton = function(ch) {
-        ;
- return String.fromCodePoint(ch);
-    }
-    h$jsstringHead = function(str) {
-        ;
- var cp = ch.codePointAt(0);
- return (cp === undefined) ? -1 : (cp|0);
-    }
-    h$jsstringTail = function(str) {
-        ;
- var l = str.length;
- if(l===0) return null;
- var ch = str.codePointAt(0);
- if(ch === undefined) return null;
- // string length is at least two if ch comes from a surrogate pair
- return str.substr(((ch)>=0x10000)?2:1);
-    }
-    h$jsstringCons = function(ch, str) {
-        ;
- return String.fromCodePoint(ch)+str;
-    }
-    h$jsstringSnoc = function(str, ch) {
-        ;
- return str+String.fromCodePoint(ch);
-    }
-    h$jsstringUncons = function(str) {
-        ;
- var l = str.length;
- if(l===0) return null;
- var ch = str.codePointAt(0);
-        if(ch === undefined) {
-     { h$ret1 = (null); return (null); };
-        }
-        { h$ret1 = (str.substr(((ch)>=0x10000)?2:1)); return (ch); };
-    }
-    // index is the first part of the character
-    h$jsstringIndex = function(i, str) {
-        ;
- var ch = str.codePointAt(i);
- if(ch === undefined) return -1;
- return ch;
-    }
-    h$jsstringUncheckedIndex = function(i, str) {
-        ;
- return str.codePointAt(i);
-    }
-} else {
-    h$jsstringSingleton = function(ch) {
-        ;
- return (((ch)>=0x10000)) ? String.fromCharCode(((((ch)-0x10000)>>>10)+0xDC00), (((ch)&0x3FF)+0xD800))
-                               : String.fromCharCode(ch);
-    }
-    h$jsstringHead = function(str) {
-        ;
- var l = str.length;
- if(l===0) return -1;
- var ch = str.charCodeAt(0);
- if(((ch|1023)===0xDBFF)) {
-     return (l>1) ? ((((ch)-0xD800)<<10)+(str.charCodeAt(1))-9216) : -1;
- } else {
-     return ch;
- }
-    }
-    h$jsstringTail = function(str) {
-        ;
- var l = str.length;
- if(l===0) return null;
- var ch = str.charCodeAt(0);
- if(((ch|1023)===0xDBFF)) {
-     return (l>1)?str.substr(2):null;
- } else return str.substr(1);
-    }
-    h$jsstringCons = function(ch, str) {
-        ;
- return ((((ch)>=0x10000)) ? String.fromCharCode(((((ch)-0x10000)>>>10)+0xDC00), (((ch)&0x3FF)+0xD800))
-                                : String.fromCharCode(ch))
-                                + str;
-    }
-    h$jsstringSnoc = function(str, ch) {
-        ;
- return str + ((((ch)>=0x10000)) ? String.fromCharCode(((((ch)-0x10000)>>>10)+0xDC00), (((ch)&0x3FF)+0xD800))
-                                      : String.fromCharCode(ch));
-    }
-    h$jsstringUncons = function(str) {
-        ;
- var l = str.length;
- if(l===0) return -1;
- var ch = str.charCodeAt(0);
- if(((ch|1023)===0xDBFF)) {
-   if(l > 1) {
-        { h$ret1 = (str.substr(2)); return (((((ch)-0xD800)<<10)+(str.charCodeAt(1))-9216)); };
-   } else {
-       { h$ret1 = (null); return (-1); };
-   }
- } else {
-      { h$ret1 = (str.substr(1)); return (ch); };
- }
-    }
-    // index is the first part of the character
-    h$jsstringIndex = function(i, str) {
-        // TRACE_JSSTRING("(no codePointAt) index: " + i + " '" + str + "'");
- var ch = str.charCodeAt(i);
- if(ch != ch) return -1; // NaN test
- return (((ch|1023)===0xDBFF)) ? ((((ch)-0xD800)<<10)+(str.charCodeAt(i+1))-9216) : ch;
-    }
-    h$jsstringUncheckedIndex = function(i, str) {
-        ;
- var ch = str.charCodeAt(i);
- return (((ch|1023)===0xDBFF)) ? ((((ch)-0xD800)<<10)+(str.charCodeAt(i+1))-9216) : ch;
-    }
-}
-function h$jsstringPack(xs) {
-    var r = '', i = 0, a = [], c;
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- c = ((xs).d1);
- a[i++] = ((typeof(c) === 'number')?(c):(c).d1);
- if(i >= 60000) {
-     r += String.fromCharCode.apply(null, a);
-     a = [];
-     i = 0;
- }
- xs = ((xs).d2);
-    }
-    if(i > 0) r += String.fromCharCode.apply(null, a);
-    ;
-    return r;
-}
-function h$jsstringPackReverse(xs) {
-    var a = [], i = 0, c;
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- c = ((xs).d1);
- a[i++] = ((typeof(c) === 'number')?(c):(c).d1);
- xs = ((xs).d2);
-    }
-    if(i===0) return '';
-    var r = h$jsstringConvertArray(a.reverse());
-    ;
-    return r;
-}
-function h$jsstringPackArray(arr) {
-    ;
-    return h$jsstringConvertArray(arr);
-}
-function h$jsstringPackArrayReverse(arr) {
-    ;
-    return h$jsstringConvertArray(arr.reverse());
-}
-function h$jsstringConvertArray(arr) {
-    if(arr.length < 60000) {
- return String.fromCharCode.apply(null, arr);
-    } else {
- var r = '';
- for(var i=0; i<arr.length; i+=60000) {
-     r += String.fromCharCode.apply(null, arr.slice(i, i+60000));
- }
- return r;
-    }
-}
-function h$jsstringInit(str) {
-    ;
-    var l = str.length;
-    if(l===0) return null;
-    var ch = str.charCodeAt(l-1);
-    var o = ((ch|1023)===0xDFFF)?2:1;
-    var r = str.substr(0, l-o);
-    return r;
-}
-function h$jsstringLast(str) {
-    ;
-    var l = str.length;
-    if(l===0) return -1;
-    var ch = str.charCodeAt(l-1);
-    if(((ch|1023)===0xDFFF)) {
- return (l>1) ? ((((str.charCodeAt(l-2))-0xD800)<<10)+(ch)-9216) : -1;
-    } else return ch;
-}
-// index is the last part of the character
-function h$jsstringIndexR(i, str) {
-    ;
-    if(i < 0 || i > str.length) return -1;
-    var ch = str.charCodeAt(i);
-    return (((ch|1023)===0xDFFF)) ? ((((str.charCodeAt(i-1))-0xD800)<<10)+(ch)-9216) : ch;
-}
-function h$jsstringNextIndex(i, str) {
-    ;
-    return i + (((str.charCodeAt(i)|1023)===0xDBFF)?2:1);
-}
-function h$jsstringTake(n, str) {
-    ;
-    if(n <= 0) return '';
-    var i = 0, l = str.length, ch;
-    if(n >= l) return str;
-    while(n--) {
- ch = str.charCodeAt(i++);
- if(((ch|1023)===0xDBFF)) i++;
- if(i >= l) return str;
-    }
-    return str.substr(0,i);
-}
-function h$jsstringDrop(n, str) {
-    ;
-    if(n <= 0) return str;
-    var i = 0, l = str.length, ch;
-    if(n >= l) return '';
-    while(n--) {
- ch = str.charCodeAt(i++);
- if(((ch|1023)===0xDBFF)) i++;
- if(i >= l) return str;
-    }
-    return str.substr(i);
-}
-function h$jsstringSplitAt(n, str) {
-  ;
-  if(n <= 0) {
-    { h$ret1 = (str); return (""); };
-  } else if(n >= str.length) {
-    { h$ret1 = (""); return (str); };
-  }
-  var i = 0, l = str.length, ch;
-  while(n--) {
-    ch = str.charCodeAt(i++);
-    if(((ch|1023)===0xDBFF)) i++;
-    if(i >= l) {
-      { h$ret1 = (""); return (str); };
-    }
-  }
-  { h$ret1 = (str.substr(i)); return (str.substr(0,i)); };
-}
-function h$jsstringTakeEnd(n, str) {
-    ;
-    if(n <= 0) return '';
-    var l = str.length, i = l-1, ch;
-    if(n >= l) return str;
-    while(n-- && i > 0) {
- ch = str.charCodeAt(i--);
- if(((ch|1023)===0xDFFF)) i--;
-    }
-    return (i<0) ? str : str.substr(i+1);
-}
-function h$jsstringDropEnd(n, str) {
-    ;
-    if(n <= 0) return str;
-    var l = str.length, i = l-1, ch;
-    if(n >= l) return '';
-    while(n-- && i > 0) {
- ch = str.charCodeAt(i--);
- if(((ch|1023)===0xDFFF)) i--;
-    }
-    return (i<0) ? '' : str.substr(0,i+1);
-}
-function h$jsstringIntercalate(x, ys) {
-    ;
-    var a = [], i = 0;
-    while(((ys).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- if(i) a[i++] = x;
- a[i++] = ((((ys).d1)).d1);
- ys = ((ys).d2);
-    }
-    return a.join('');
-}
-function h$jsstringIntersperse(ch, ys) {
-    ;
-    var i = 0, l = ys.length, j = 0, a = [], ych;
-    if(((ch)>=0x10000)) {
- var ch1 = ((((ch)-0x10000)>>>10)+0xDC00), ch2 = (((ch)&0x3FF)+0xD800);
- while(j < l) {
-     if(i) {
-  a[i++] = ch1;
-  a[i++] = ch2;
-     }
-     ych = ys.charCodeAt(j++);
-     a[i++] = ych;
-     if(((ych|1023)===0xDBFF)) a[i++] = ys.charCodeAt(j++);
- }
-    } else {
- while(j < l) {
-     if(i) a[i++] = ch;
-     ych = ys.charCodeAt(j++);
-     a[i++] = ych;
-     if(((ych|1023)===0xDBFF)) a[i++] = ys.charCodeAt(j++);
- }
-    }
-    return h$jsstringConvertArray(a);
-}
-function h$jsstringConcat(xs) {
-    ;
-    var a = [], i = 0;
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- a[i++] = ((((xs).d1)).d1);
- xs = ((xs).d2);
-    }
-    return a.join('');
-}
-var h$jsstringStripPrefix, h$jsstringStripSuffix,
-    h$jsstringIsPrefixOf, h$jsstringIsSuffixOf,
-    h$jsstringIsInfixOf;
-if(String.prototype.startsWith) {
-    h$jsstringStripPrefix = function(p, x) {
- ;
- if(x.startsWith(p)) {
-     return (h$c1(h$baseZCGHCziBaseziJust_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(p.length)))))));
- } else {
-     return h$baseZCGHCziBaseziNothing;
- }
-    }
-    h$jsstringIsPrefixOf = function(p, x) {
- ;
- return x.startsWith(p);
-    }
-} else {
-    h$jsstringStripPrefix = function(p, x) {
- ;
- if(x.indexOf(p) === 0) { // this has worse complexity than it should
-     return (h$c1(h$baseZCGHCziBaseziJust_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(p.length)))))));
- } else {
-   return h$baseZCGHCziBaseziNothing;
- }
-    }
-    h$jsstringIsPrefixOf = function(p, x) {
- ;
- return x.indexOf(p) === 0; // this has worse complexity than it should
-    }
-}
-if(String.prototype.endsWith) {
-    h$jsstringStripSuffix = function(s, x) {
- ;
- if(x.endsWith(s)) {
-     return (h$c1(h$baseZCGHCziBaseziJust_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(0,x.length-s.length)))))));
- } else {
-   return h$baseZCGHCziBaseziNothing;
- }
-    }
-    h$jsstringIsSuffixOf = function(s, x) {
- ;
- return x.endsWith(s);
-    }
-} else {
-    h$jsstringStripSuffix = function(s, x) {
- ;
- var i = x.lastIndexOf(s); // this has worse complexity than it should
- var l = x.length - s.length;
- if(i !== -1 && i === l) {
-     return (h$c1(h$baseZCGHCziBaseziJust_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(0,l)))))));
- } else {
-   return h$baseZCGHCziBaseziNothing;
- }
-    }
-      h$jsstringIsSuffixOf = function(s, x) {
- ;
-        var i = x.lastIndexOf(s); // this has worse complexity than it should
- return i !== -1 && i === x.length - s.length;
-    }
-}
-if(String.prototype.includes) {
-    h$jsstringIsInfixOf = function(i, x) {
-        ;
- return x.includes(i);
-    }
-} else {
-    h$jsstringIsInfixOf = function(i, x) {
-        ;
- return x.indexOf(i) !== -1; // this has worse complexity than it should
-    }
-}
-function h$jsstringCommonPrefixes(x, y) {
-    ;
-    var lx = x.length, ly = y.length, i = 0, cx;
-    var l = lx <= ly ? lx : ly;
-    if(lx === 0 || ly === 0 || x.charCodeAt(0) !== y.charCodeAt(0)) {
-      return h$baseZCGHCziBaseziNothing;
-    }
-    while(++i<l) {
- cx = x.charCodeAt(i);
- if(cx !== y.charCodeAt(i)) {
-     if(((cx|1023)===0xDFFF)) i--;
-     break;
- }
-    }
-  if(i===0) return h$baseZCGHCziBaseziNothing;
-    return (h$c1(h$baseZCGHCziBaseziJust_con_e, ((h$c3(h$ghczmprimZCGHCziTupleziZLz2cUz2cUZR_con_e,((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, ((i===lx)?x:((i===ly)?y:x.substr(0,i)))))),((i===lx) ? h$jsstringEmpty : (h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(i))))),((i===ly) ? h$jsstringEmpty : (h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (y.substr(i))))))))));
-}
-function h$jsstringBreakOn(b, x) {
-    ;
-    var i = x.indexOf(b);
-    if(i===-1) {
-        { h$ret1 = (""); return (x); };
-    }
-    if(i===0) {
-        { h$ret1 = (x); return (""); };
-    }
-    { h$ret1 = (x.substr(i)); return (x.substr(0,i)); };
-}
-function h$jsstringBreakOnEnd(b, x) {
-    ;
-    var i = x.lastIndexOf(b);
-  if(i===-1) {
-    { h$ret1 = (x); return (""); };
-    }
-  i += b.length;
-    { h$ret1 = (x.substr(i)); return (x.substr(0,i)); };
-}
-function h$jsstringBreakOnAll1(n, b, x) {
-    ;
-    var i = x.indexOf(b, n);
-    if(i===0) {
-       { h$ret1 = (""); h$ret2 = (x); return (b.length); };
-    }
-    if(i===-1) {
-       { h$ret1 = (null); h$ret2 = (null); return (-1); };
-    }
-    { h$ret1 = (x.substr(0,i)); h$ret2 = (x.substr(i)); return (i+b.length); };
-}
-function h$jsstringBreakOnAll(pat, src) {
-    ;
-    var a = [], i = 0, n = 0, r = h$ghczmprimZCGHCziTypesziZMZN, pl = pat.length;
-    while(true) {
- var x = src.indexOf(pat, n);
- if(x === -1) break;
- a[i++] = (h$c2(h$ghczmprimZCGHCziTupleziZLz2cUZR_con_e,((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (src.substr(0,x))))),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (src.substr(x)))))));
- n = x + pl;
-    }
-    while(--i >= 0) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (a[i]), (r)));
-    return r;
-}
-function h$jsstringSplitOn1(n, p, x) {
-    ;
-    var i = x.indexOf(p, n);
-    if(i === -1) {
-        { h$ret1 = (null); return (-1); };
-    }
-    var r1 = (i==n) ? "" : x.substr(n, i-n);
-    { h$ret1 = (r1); return (i + p.length); };
-}
-function h$jsstringSplitOn(p, x) {
-    ;
-    var a = x.split(p);
-    var r = h$ghczmprimZCGHCziTypesziZMZN, i = a.length;
-    while(--i>=0) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (a[i])))), (r)));
-    return r;
-}
-// returns -1 for end of input, start of next token otherwise
-// word in h$ret1
-// this function assumes that there are no whitespace characters >= 0x10000
-function h$jsstringWords1(n, x) {
-    ;
-    var m = n, s = n, l = x.length;
-    if(m >= l) return -1;
-    // skip leading spaces
-    do {
- if(m >= l) return -1;
-    } while(h$isSpace(x.charCodeAt(m++)));
-    // found start of word
-    s = m - 1;
-    while(m < l) {
- if(h$isSpace(x.charCodeAt(m++))) {
-     // found end of word
-            var r1 = (m-s<=1) ? "" : x.substr(s,m-s-1);
-            { h$ret1 = (r1); return (m); };
- }
-    }
-    // end of string
-    if(s < l) {
-        var r1 = s === 0 ? x : x.substr(s);
-        { h$ret1 = (r1); return (m); };
-    }
-    { h$ret1 = (null); return (-1); };
-}
-function h$jsstringWords(x) {
-    ;
-    var a = null, i = 0, n, s = -1, m = 0, w, l = x.length, r = h$ghczmprimZCGHCziTypesziZMZN;
-    outer:
-    while(m < l) {
- // skip leading spaces
- do {
-     if(m >= l) { s = m; break outer; }
- } while(h$isSpace(x.charCodeAt(m++)));
- // found start of word
- s = m - 1;
- while(m < l) {
-     if(h$isSpace(x.charCodeAt(m++))) {
-  // found end of word
-  w = (m-s<=1) ? h$jsstringEmpty
-                             : (h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(s,m-s-1))));
-  if(i) a[i++] = w; else { a = [w]; i = 1; }
-  s = m;
-  break;
-     }
- }
-    }
-    // end of string
-    if(s !== -1 && s < l) {
- w = (h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (s === 0 ? x : x.substr(s))));
- if(i) a[i++] = w; else { a = [w]; i = 1; }
-    }
-    // build resulting list
-    while(--i>=0) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (a[i]), (r)));
-    return r;
-}
-// returns -1 for end of input, start of next token otherwise
-// line in h$ret1
-function h$jsstringLines1(n, x) {
-    ;
-    var m = n, l = x.length;
-    if(n >= l) return -1;
-    while(m < l) {
- if(x.charCodeAt(m++) === 10) {
-     // found newline
-     if(n > 0 && n === l-1) return -1; // it was the last character
-            var r1 = (m-n<=1) ? "" : x.substr(n,m-n-1);
-            { h$ret1 = (r1); return (m); };
- }
-    }
-    // end of string
-    { h$ret1 = (x.substr(n)); return (m); };
-}
-function h$jsstringLines(x) {
-    ;
-    var a = null, m = 0, i = 0, l = x.length, s = 0, r = h$ghczmprimZCGHCziTypesziZMZN, w;
-    if(l === 0) return h$ghczmprimZCGHCziTypesziZMZN;
-    outer:
-    while(true) {
- s = m;
- do {
-     if(m >= l) break outer;
- } while(x.charCodeAt(m++) !== 10);
- w = (m-s<=1) ? h$jsstringEmpty : (h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(s,m-s-1))));
- if(i) a[i++] = w; else { a = [w]; i = 1; }
-    }
-    if(s < l) {
- w = (h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(s))));
- if(i) a[i++] = w; else { a = [w]; i = 1; }
-    }
-    while(--i>=0) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (a[i]), (r)));
-    return r;
-}
-function h$jsstringGroup(x) {
-    ;
-    var xl = x.length;
-    if(xl === 0) return h$ghczmprimZCGHCziTypesziZMZN;
-    var i = xl-1, si, ch, s=xl, r=h$ghczmprimZCGHCziTypesziZMZN;
-    var tch = x.charCodeAt(i--);
-    if(((tch|1023)===0xDFFF)) tch = ((((x.charCodeAt(i--))-0xD800)<<10)+(tch)-9216);
-    while(i >= 0) {
- si = i;
- ch = x.charCodeAt(i--);
- if(((ch|1023)===0xDFFF)) {
-     ch = ((((x.charCodeAt(i--))-0xD800)<<10)+(ch)-9216);
- }
- if(ch != tch) {
-     tch = ch;
-     r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(si+1,s-si))))), (r)));
-     s = si;
- }
-    }
-    return (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(0,s+1))))), (r)));
-}
-function h$jsstringChunksOf1(n, s, x) {
-    ;
-    var m = s, c = 0, l = x.length, ch;
-    if(n <= 0 || l === 0 || s >= l) return -1
-    while(++m < l && ++c < n) {
- ch = x.charCodeAt(m);
- if(((ch|1023)===0xDBFF)) ++m;
-    }
-    var r1 = (m >= l && s === c) ? x : x.substr(s,m-s);
-    { h$ret1 = (r1); return (m); };
-}
-function h$jsstringChunksOf(n, x) {
-    ;
-    var l = x.length;
-    if(l===0 || n <= 0) return h$ghczmprimZCGHCziTypesziZMZN;
-    if(l <= n) return (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x)))), (h$ghczmprimZCGHCziTypesziZMZN)));
-    var a = [], i = 0, s = 0, ch, m = 0, c, r = h$ghczmprimZCGHCziTypesziZMZN;
-    while(m < l) {
- s = m;
- c = 0;
- while(m < l && ++c <= n) {
-     ch = x.charCodeAt(m++);
-     if(((ch|1023)===0xDBFF)) ++m;
- }
- if(c) a[i++] = x.substr(s, m-s);
-    }
-    while(--i>=0) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (a[i])))), (r)));
-    return r;
-}
-function h$jsstringCount(pat, src) {
-    ;
-    var i = 0, n = 0, pl = pat.length, sl = src.length;
-    while(i<sl) {
- i = src.indexOf(pat, i);
- if(i===-1) break;
- n++;
- i += pl;
-    }
-    return n;
-}
-function h$jsstringReplicate(n, str) {
-    ;
-    if(n === 0 || str == '') return '';
-    if(n === 1) return str;
-    var r = '';
-    do {
- if(n&1) r+=str;
-        str+=str;
-        n >>= 1;
-    } while(n > 1);
-    return r+str;
-}
-// this does not deal with combining diacritics, Data.Text does not either
-var h$jsstringReverse;
-if(Array.from) {
-    h$jsstringReverse = function(str) {
- ;
- return Array.from(str).reverse().join('');
-    }
-} else {
-    h$jsstringReverse = function(str) {
- ;
- var l = str.length, a = [], o = 0, i = 0, c, c1, s = '';
- while(i < l) {
-     c = str.charCodeAt(i);
-     if(((c|1023)===0xDBFF)) {
-  a[i] = str.charCodeAt(i+1);
-  a[i+1] = c;
-  i += 2;
-     } else a[i++] = c;
-     if(i-o > 60000) {
-  s = String.fromCharCode.apply(null, a.reverse()) + s;
-  o = -i;
-  a = [];
-     }
- }
- return (i===0) ? s : String.fromCharCode.apply(null,a.reverse()) + s;
-    }
-}
-function h$jsstringUnpack(str) {
-    ;
-    var r = h$ghczmprimZCGHCziTypesziZMZN, i = str.length-1, c;
-    while(i >= 0) {
- c = str.charCodeAt(i--);
- if(((c|1023)===0xDFFF)) c = ((((str.charCodeAt(i--))-0xD800)<<10)+(c)-9216)
- r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (c), (r)));
-    }
-    return r;
-}
-function h$jsstringDecI64(hi,lo) {
-    ;
-    var lo0 = (lo < 0) ? lo+4294967296:lo;
-    if(hi < 0) {
- if(hi === -1) return ''+(lo0-4294967296);
- lo0 = 4294967296 - lo0;
- var hi0 = -1 - hi;
- var x0 = hi0 * 967296;
- var x1 = (lo0 + x0) % 1000000;
- var x2 = hi0*4294+Math.floor((x0+lo0-x1)/1000000);
- return '-' + x2 + h$jsstringDecIPadded6(x1);
-    } else {
- if(hi === 0) return ''+lo0;
- var x0 = hi * 967296;
- var x1 = (lo0 + x0) % 1000000;
- var x2 = hi*4294+Math.floor((x0+lo0-x1)/1000000);
- return '' + x2 + h$jsstringDecIPadded6(x1);
-    }
-}
-function h$jsstringDecW64(hi,lo) {
-    ;
-    var lo0 = (lo < 0) ? lo+4294967296 : lo;
-    if(hi === 0) return ''+lo0;
-    var hi0 = (hi < 0) ? hi+4294967296 : hi;
-    var x0 = hi0 * 967296;
-    var x1 = (lo0 + x0) % 1000000;
-    var x2 = hi0*4294+Math.floor((x0+lo0-x1)/1000000);
-    return '' + x2 + h$jsstringDecIPadded6(x1);
-}
-function h$jsstringHexI64(hi,lo) {
-    var lo0 = lo<0 ? lo+4294967296 : lo;
-    if(hi === 0) return lo0.toString(16);
-    return ((hi<0)?hi+4294967296:hi).toString(16) + h$jsstringHexIPadded8(lo0);
-}
-function h$jsstringHexW64(hi,lo) {
-    var lo0 = lo<0 ? lo+4294967296 : lo;
-    if(hi === 0) return lo0.toString(16);
-    return ((hi<0)?hi+4294967296:hi).toString(16) + h$jsstringHexIPadded8(lo0);
-}
-// n in [0, 1000000000)
-function h$jsstringDecIPadded9(n) {
-    ;
-    if(n === 0) return '000000000';
-    var pad = (n>=100000000)?'':
-              (n>=10000000)?'0':
-              (n>=1000000)?'00':
-              (n>=100000)?'000':
-              (n>=10000)?'0000':
-              (n>=1000)?'00000':
-              (n>=100)?'000000':
-              (n>=10)?'0000000':
-                     '00000000';
-    return pad+n;
-}
-// n in [0, 1000000)
-function h$jsstringDecIPadded6(n) {
-    ;
-    if(n === 0) return '000000';
-    var pad = (n>=100000)?'':
-              (n>=10000)?'0':
-              (n>=1000)?'00':
-              (n>=100)?'000':
-              (n>=10)?'0000':
-                     '00000';
-    return pad+n;
-}
-// n in [0, 2147483648)
-function h$jsstringHexIPadded8(n) {
-    ;
-   if(n === 0) return '00000000';
-   var pad = (n>=0x10000000)?'':
-             (n>=0x1000000)?'0':
-             (n>=0x100000)?'00':
-             (n>=0x10000)?'000':
-             (n>=0x1000)?'0000':
-             (n>=0x100)?'00000':
-             (n>=0x10)?'000000':
-                      '0000000';
-    return pad+n.toString(16);
-}
-function h$jsstringZeroes(n) {
-    var r;
-    switch(n&7) {
- case 0: r = ''; break;
- case 1: r = '0'; break;
- case 2: r = '00'; break;
- case 3: r = '000'; break;
- case 4: r = '0000'; break;
- case 5: r = '00000'; break;
- case 6: r = '000000'; break;
- case 7: r = '0000000';
-    }
-    for(var i=n>>3;i>0;i--) r = r + '00000000';
-    return r;
-}
-function h$jsstringDoubleToFixed(decs, d) {
-    if(decs >= 0) {
- if(Math.abs(d) < 1e21) {
-     var r = d.toFixed(Math.min(20,decs));
-     if(decs > 20) r = r + h$jsstringZeroes(decs-20);
-     return r;
- } else {
-     var r = d.toExponential();
-     var ei = r.indexOf('e');
-     var di = r.indexOf('.');
-     var e = parseInt(r.substr(ei+1));
-     return r.substring(0,di) + r.substring(di,ei) + h$jsstringZeroes(di-ei+e) +
-                   ((decs > 0) ? ('.' + h$jsstringZeroes(decs)) : '');
- }
-    }
-    var r = Math.abs(d).toExponential();
-    var ei = r.indexOf('e');
-    var e = parseInt(r.substr(ei+1));
-    var m = d < 0 ? '-' : '';
-    r = r.substr(0,1) + r.substring(2,ei);
-    if(e >= 0) {
- return (e > r.length) ? m + r + h$jsstringZeroes(r.length-e-1) + '.0'
-                       : m + r.substr(0,e+1) + '.' + r.substr(e+1);
-    } else {
- return m + '0.' + h$jsstringZeroes(-e-1) + r;
-    }
-}
-function h$jsstringDoubleToExponent(decs, d) {
-    var r;
-    if(decs ===-1) {
- r = d.toExponential().replace('+','');
-    } else {
- r = d.toExponential(Math.max(1, Math.min(20,decs))).replace('+','');
-    }
-    if(r.indexOf('.') === -1) {
- r = r.replace('e', '.0e');
-    }
-    if(decs > 20) r = r.replace('e', h$jsstringZeroes(decs-20)+'e');
-    return r;
-}
-function h$jsstringDoubleGeneric(decs, d) {
-    var r;
-    if(decs === -1) {
- r = d.toString(10).replace('+','');
-    } else {
- r = d.toPrecision(Math.max(decs+1,1)).replace('+','');
-    }
-    if(decs !== 0 && r.indexOf('.') === -1) {
- if(r.indexOf('e') !== -1) {
-     r = r.replace('e', '.0e');
- } else {
-     r = r + '.0';
- }
-    }
-    return r;
-}
-function h$jsstringAppend(x, y) {
-    ;
-    return x+y;
-}
-function h$jsstringCompare(x, y) {
-    ;
-    return (x<y)?-1:((x>y)?1:0);
-}
-function h$jsstringUnlines(xs) {
-    var r = '';
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- r = r + ((((xs).d1)).d1) + '\n';
- xs = ((xs).d2);
-    }
-    return r;
-}
-function h$jsstringUnwords(xs) {
-    if(((xs).f === h$ghczmprimZCGHCziTypesziZMZN_con_e)) return '';
-    var r = ((((xs).d1)).d1);
-    xs = ((xs).d2);
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- r = r + ' ' + ((((xs).d1)).d1);
- xs = ((xs).d2);
-    }
-    return r;
-}
-function h$jsstringReplace(pat, rep, src) {
-    ;
-    var r = src.replace(pat, rep, 'g');
-    // the 'g' flag is not supported everywhere, check and fall back if necessary
-    if(r.indexOf(pat) !== -1) {
- r = src.split(pat).join(rep);
-    }
-    return r;
-}
-function h$jsstringReplicateChar(n, ch) {
-    ;
-    return h$jsstringReplicate(n, h$jsstringSingleton(ch));
-}
-function h$jsstringIsInteger(str) {
-    return /^-?\d+$/.test(str);
-}
-function h$jsstringIsNatural(str) {
-    return /^\d+$/.test(str);
-}
-function h$jsstringReadInt(str) {
-    if(!/^-?\d+/.test(str)) return null;
-    var x = parseInt(str, 10);
-    var x0 = x|0;
-    return (x===x0) ? x0 : null;
-}
-function h$jsstringLenientReadInt(str) {
-    var x = parseInt(str, 10);
-    var x0 = x|0;
-    return (x===x0) ? x0 : null;
-}
-function h$jsstringReadWord(str) {
-  if(!/^\d+/.test(str)) return null;
-  var x = parseInt(str, 10);
-  var x0 = x|0;
-  if(x0<0) return (x===x0+2147483648) ? x0 : null;
-  else return (x===x0) ? x0 : null;
-}
-function h$jsstringReadDouble(str) {
-    return parseFloat(str, 10);
-}
-function h$jsstringLenientReadDouble(str) {
-    return parseFloat(str, 10);
-}
-function h$jsstringReadInteger(str) {
-  ;
-  if(!/^(-)?\d+$/.test(str)) {
-    return null;
-  } else if(str.length <= 9) {
-    return (h$c2(h$integerzmgmpZCGHCziIntegerziTypeziSzh_con_e, (parseInt(str, 10))));;
-  } else {
-    return (h$c2(h$integerzmgmpZCGHCziIntegerziTypeziJzh_con_e, 0, (new BigInteger(str, 10))));;
-  }
-}
-function h$jsstringReadInt64(str) {
-  if(!/^(-)?\d+$/.test(str)) {
-      { h$ret1 = (0); h$ret2 = (0); return (0); };
-  }
-  if(str.charCodeAt(0) === 45) { // '-'
-    return h$jsstringReadValue64(str, 1, true);
-  } else {
-    return h$jsstringReadValue64(str, 0, false);
-  }
-}
-function h$jsstringReadWord64(str) {
-  if(!/^\d+$/.test(str)) {
-    { h$ret1 = (0); h$ret2 = (0); return (0); };
-  }
-  return h$jsstringReadValue64(str, 0, false);
-}
-var h$jsstringLongs = null;
-function h$jsstringReadValue64(str, start, negate) {
-  var l = str.length, i = start;
-  while(i < l) {
-    if(str.charCodeAt(i) !== 48) break;
-    i++;
-  }
-  if(i >= l) { h$ret1 = (0); h$ret2 = (0); return (1); }; // only zeroes
-  if(h$jsstringLongs === null) {
-    h$jsstringLongs = [];
-    for(var t=10; t<=1000000000; t*=10) {
-      h$jsstringLongs.push(goog.math.Long.fromInt(t));
-    }
-  }
-  var li = l-i;
-  if(li < 10 && !negate) {
-    { h$ret1 = (0); h$ret2 = (parseInt(str.substr(i), 10)); return (1); };
-  }
-  var r = goog.math.Long.fromInt(parseInt(str.substr(li,9),10));
-  li += 9;
-  while(li < l) {
-    r = r.multiply(h$jsstringLongs[Math.min(l-li-1,8)])
-         .add(goog.math.Long.fromInt(parseInt(str.substr(li,9), 10)));
-    li += 9;
-  }
-  if(negate) {
-    r = r.negate();
-  }
-  { h$ret1 = (r.getHighBits()); h$ret2 = (r.getLowBits()); return (1); };
-}
-function h$jsstringExecRE(i, str, re) {
-    re.lastIndex = i;
-    var m = re.exec(str);
-    if(m === null) return -1;
-    var a = [], x, j = 1, r = h$ghczmprimZCGHCziTypesziZMZN;
-    while(true) {
- x = m[j];
- if(typeof x === 'undefined') break;
- a[j-1] = x;
- j++;
-    }
-    j-=1;
-    while(--j>=0) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (a[j])))), (r)));
-    { h$ret1 = (m[0]); h$ret2 = (r); return (m.index); };
-}
-function h$jsstringReplaceRE(pat, replacement, str) {
-    return str.replace(pat, replacement);
-}
-function h$jsstringSplitRE(limit, re, str) {
-    re.lastIndex = i;
-    var s = (limit < 0) ? str.split(re) : str.split(re, limit);
-    var i = s.length, r = h$ghczmprimZCGHCziTypesziZMZN;
-    while(--i>=0) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (a[i])))), (r)));
-    return r;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-/*
- * Functions that directly access JavaScript strings, ignoring character
- * widths and surrogate pairs.
- */
-function h$jsstringRawChunksOf(k, x) {
-    var l = x.length;
-    if(l === 0) return h$ghczmprimZCGHCziTypesziZMZN;
-    if(l <= k) return (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x)))), (h$ghczmprimZCGHCziTypesziZMZN)));
-    var r=h$ghczmprimZCGHCziTypesziZMZN;
-    for(var i=ls-k;i>=0;i-=k) r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(i,i+k))))), (r)));
-    return r;
-}
-function h$jsstringRawSplitAt(k, x) {
-    if(k === 0) return (h$c2(h$ghczmprimZCGHCziTupleziZLz2cUZR_con_e,(h$jsstringEmpty),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x))))));
-    if(k >= x.length) return (h$c2(h$ghczmprimZCGHCziTupleziZLz2cUZR_con_e,((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x)))),(h$jsstringEmpty)));
-    return (h$c2(h$ghczmprimZCGHCziTupleziZLz2cUZR_con_e,((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(0,k))))),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x.substr(k)))))));
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-function h$foreignListProps(o) {
-    var r = HS_NIL;
-    if(typeof o === 'undefined' || o === null) return null;
-    throw "h$foreignListProps";
-/*    for(var p in o) {
-
-    } */
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// conversion between JavaScript string and Data.Text
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-/*
-  convert a Data.Text buffer with offset/length to a JavaScript string
- */
-function h$textToString(arr, off, len) {
-    var a = [];
-    var end = off+len;
-    var k = 0;
-    var u1 = arr.u1;
-    var s = '';
-    for(var i=off;i<end;i++) {
- var cc = u1[i];
- a[k++] = cc;
- if(k === 60000) {
-     s += String.fromCharCode.apply(this, a);
-     k = 0;
-     a = [];
- }
-    }
-    return s + String.fromCharCode.apply(this, a);
-}
-/*
-   convert a JavaScript string to a Data.Text buffer, second return
-   value is length
- */
-function h$textFromString(s) {
-    var l = s.length;
-    var b = h$newByteArray(l * 2);
-    var u1 = b.u1;
-    for(var i=l-1;i>=0;i--) u1[i] = s.charCodeAt(i);
-    { h$ret1 = (l); return (b); };
-}
-function h$lazyTextToString(txt) {
-    var s = '';
-    while(((txt).f.a === 2)) {
-        var head = ((txt));
-        s += h$textToString(((head).d1), ((head).d2.d1), ((head).d2.d2));
-        txt = ((txt).d2.d3);
-    }
-    return s;
-}
-function h$safeTextFromString(x) {
-    if(typeof x !== 'string') {
- { h$ret1 = (0); return (null); };
-    }
-    return h$textFromString(x);
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-function h$allProps(o) {
-    var a = [], i = 0;
-    for(var p in o) a[i++] = p;
-    return a;
-}
-function h$listProps(o) {
-    var r = h$ghczmprimZCGHCziTypesziZMZN;
-    for(var p in o) { r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (p)))), (r))); }
-    return r;
-}
-function h$listAssocs(o) {
-    var r = h$ghczmprimZCGHCziTypesziZMZN;
-    for(var p in o) { r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c2(h$ghczmprimZCGHCziTupleziZLz2cUZR_con_e,((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (p)))),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (o[p]))))))), (r))); }
-    return r;
-}
-function h$isNumber(o) {
-    return typeof(o) === 'number';
-}
-// returns true for null, but not for functions and host objects
-function h$isObject(o) {
-    return typeof(o) === 'object';
-}
-function h$isString(o) {
-    return typeof(o) === 'string';
-}
-function h$isSymbol(o) {
-    return typeof(o) === 'symbol';
-}
-function h$isBoolean(o) {
-    return typeof(o) === 'boolean';
-}
-function h$isFunction(o) {
-    return typeof(o) === 'function';
-}
-function h$jsTypeOf(o) {
-    var t = typeof(o);
-    if(t === 'undefined') return 0;
-    if(t === 'object') return 1;
-    if(t === 'boolean') return 2;
-    if(t === 'number') return 3;
-    if(t === 'string') return 4;
-    if(t === 'symbol') return 5;
-    if(t === 'function') return 6;
-    return 7; // other, host object etc
-}
-/*
-        -- 0 - null, 1 - integer,
-        -- 2 - float, 3 - bool,
-        -- 4 - string, 5 - array
-        -- 6 - object
-*/
-function h$jsonTypeOf(o) {
-    if (!(o instanceof Object)) {
-        if (o == null) {
-            return 0;
-        } else if (typeof o == 'number') {
-            if (h$isInteger(o)) {
-                return 1;
-            } else {
-                return 2;
-            }
-        } else if (typeof o == 'boolean') {
-            return 3;
-        } else {
-            return 4;
-        }
-    } else {
-        if (Object.prototype.toString.call(o) == '[object Array]') {
-            // it's an array
-            return 5;
-        } else if (!o) {
-            // null 
-            return 0;
-        } else {
-            // it's an object
-            return 6;
-        }
-    }
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-function h$sendXHR(xhr, d, cont) {
-    xhr.addEventListener('error', function () {
- cont(2);
-    });
-    xhr.addEventListener('abort', function() {
- cont(1);
-    });
-    xhr.addEventListener('load', function() {
- cont(0);
-    });
-    if(d) {
- xhr.send(d);
-    } else {
- xhr.send();
-    }
-}
− examples/static/out.jsexe/manifest.webapp
@@ -1,13 +0,0 @@-{
-  "name": "GHCJS Web Application",
-  "description": "GHCJS Web Application",
-  "launch_path": "/index.html",
-  "icons": {
-    "16": "/icons/icon16x16.png",
-    "48": "/icons/icon48x48.png",
-    "60": "/icons/icon60x60.png",
-    "128": "/icons/icon128x128.png"
-  },
-  "type": "privileged",
-  "permissions": {}
-}
− examples/static/out.jsexe/out.js

file too large to diff

− examples/static/out.jsexe/out.stats
@@ -1,181 +0,0 @@-code size summary per package:
-
-base:                    939117
-conta_5w3UY4chXx62LVUOUrXeRm:96653
-deeps_IA8DgGbqfWcHYE0vChdRyn:847
-ghc-prim:                47543
-ghcjs_B7KLFJ07Vte3zPHAgRIBTb:10604
-ghcjs_Kc7TQ2cEDg1F5e5cgY2Vuk:71616
-integer-gmp:             43943
-main:                    882454
-mtl_JY14bYun6zF5fM4QvBys8Y:3322
-rando_3e2beemixydBACmXmsTUb2:27250
-stm_7VsGm7OgW5p80mcVvYsEXN:4953
-text_1ffW5NTi2SPHBcBuYSkgjk:24136
-time_KPHTSoBSjtZ5lswdMFwFfY:11771
-trans_KzbnBSIEqPI2eU1Inn4mzm:11993
-vecto_FNLwpzrmeRC6Ra1RihE2cq:4888
-
-
-code size per module:
-
-base
-    Control.Concurrent.MVar:            6827
-    Control.Exception.Base:             10065
-    Control.Monad:                      963
-    Data.Dynamic:                       4846
-    Data.Either:                        397
-    Data.Fixed:                         3867
-    Data.Foldable:                      5234
-    Data.Functor:                       108
-    Data.IORef:                         1487
-    Data.Maybe:                         1972
-    Data.Monoid:                        108
-    Data.OldList:                       7800
-    Data.Traversable:                   3627
-    Data.Tuple:                         169
-    Data.Typeable:                      889
-    Data.Typeable.Internal:             26174
-    Debug.Trace:                        5181
-    Foreign.C.Error:                    9828
-    Foreign.Marshal.Alloc:              375
-    Foreign.Marshal.Array:              2052
-    Foreign.Storable:                   12211
-    GHC.Arr:                            3706
-    GHC.Base:                           26959
-    GHC.Char:                           1078
-    GHC.Conc.IO:                        404
-    GHC.Conc.Sync:                      16005
-    GHC.Enum:                           18001
-    GHC.Err:                            386
-    GHC.Exception:                      10785
-    GHC.Fingerprint:                    1914
-    GHC.Fingerprint.Type:               1319
-    GHC.Float:                          132638
-    GHC.Foreign:                        12136
-    GHC.ForeignPtr:                     1501
-    GHC.IO:                             5112
-    GHC.IO.Buffer:                      1276
-    GHC.IO.BufferedIO:                  1066
-    GHC.IO.Device:                      1486
-    GHC.IO.Encoding:                    1030
-    GHC.IO.Encoding.Failure:            724
-    GHC.IO.Encoding.Latin1:             3684
-    GHC.IO.Encoding.Types:              1032
-    GHC.IO.Encoding.UTF8:               61149
-    GHC.IO.Exception:                   26920
-    GHC.IO.FD:                          53248
-    GHC.IO.Handle:                      7076
-    GHC.IO.Handle.FD:                   15268
-    GHC.IO.Handle.Internals:            66085
-    GHC.IO.Handle.Text:                 31691
-    GHC.IO.Handle.Types:                4912
-    GHC.IO.IOMode:                      161
-    GHC.IORef:                          755
-    GHC.Int:                            3258
-    GHC.List:                           20850
-    GHC.MVar:                           1787
-    GHC.Num:                            3980
-    GHC.Ptr:                            631
-    GHC.Read:                           60265
-    GHC.Real:                           28235
-    GHC.ST:                             186
-    GHC.STRef:                          648
-    GHC.Show:                           46051
-    GHC.Storable:                       2369
-    GHC.TopHandler:                     10349
-    GHC.Unicode:                        929
-    GHC.Word:                           965
-    System.CPUTime:                     1
-    System.Environment:                 2271
-    System.IO:                          1334
-    System.Posix.Internals:             16119
-    Text.ParserCombinators.ReadP:       25603
-    Text.ParserCombinators.ReadPrec:    6541
-    Text.Read:                          2967
-    Text.Read.Lex:                      89865
-    Unsafe.Coerce:                      226
-
-conta_5w3UY4chXx62LVUOUrXeRm
-    Data.Map.Base:                      96653
-
-deeps_IA8DgGbqfWcHYE0vChdRyn
-    Control.DeepSeq:                    847
-
-ghc-prim
-    GHC.CString:                        4537
-    GHC.Classes:                        40599
-    GHC.IntWord64:                      304
-    GHC.Tuple:                          802
-    GHC.Types:                          1301
-
-ghcjs_B7KLFJ07Vte3zPHAgRIBTb
-    GHCJS.Prim:                         6172
-    GHCJS.Prim.Internal:                4432
-
-ghcjs_Kc7TQ2cEDg1F5e5cgY2Vuk
-    Data.JSString:                      16896
-    Data.JSString.Internal.Type:        484
-    GHCJS.Concurrent:                   112
-    GHCJS.Foreign.Callback:             1400
-    GHCJS.Marshal:                      40837
-    GHCJS.Marshal.Internal:             8398
-    GHCJS.Marshal.Pure:                 506
-    JavaScript.Web.MessageEvent:        2299
-    JavaScript.Web.WebSocket:           684
-
-integer-gmp
-    GHC.Integer.GMP.Prim:               346
-    GHC.Integer.Type:                   43597
-
-main
-    GHCJS.HPlay.Cell:                   44951
-    GHCJS.HPlay.View:                   268143
-    GHCJS.Perch:                        1
-    Internal.API:                       6816
-    Internal.FFI:                       6870
-    Internal.Perch:                     92540
-    Internal.Type:                      5542
-    Main:                               43836
-    Transient.Base:                     1
-    Transient.EVars:                    10931
-    Transient.Indeterminism:            25285
-    Transient.Internals:                190974
-    Transient.Logged:                   16427
-    Transient.MapReduce:                2514
-    Transient.Move:                     150465
-    Transient.Stream.Resource:          17158
-
-mtl_JY14bYun6zF5fM4QvBys8Y
-    Control.Monad.State.Class:          3322
-
-rando_3e2beemixydBACmXmsTUb2
-    System.Random:                      27250
-
-stm_7VsGm7OgW5p80mcVvYsEXN
-    Control.Concurrent.STM.TChan:       4953
-
-text_1ffW5NTi2SPHBcBuYSkgjk
-    Data.Text:                          21684
-    Data.Text.Array:                    1206
-    Data.Text.Internal:                 1246
-
-time_KPHTSoBSjtZ5lswdMFwFfY
-    Data.Time.Clock:                    670
-    Data.Time.Clock.CTimeval:           1528
-    Data.Time.Clock.POSIX:              6196
-    Data.Time.Clock.UTC:                1981
-    Data.Time.Clock.UTCDiff:            1396
-
-trans_KzbnBSIEqPI2eU1Inn4mzm
-    Control.Monad.IO.Class:             747
-    Control.Monad.Trans.State.Lazy:     11246
-
-vecto_FNLwpzrmeRC6Ra1RihE2cq
-    Data.Vector:                        3720
-    Data.Vector.Mutable:                1168
-
-
-
-packed metadata: 458156
-
− examples/static/out.jsexe/rts.js
@@ -1,21404 +0,0 @@-var h$currentThread = null;
-var h$stack = null;
-var h$sp = 0;
-var h$initStatic = [];
-var h$staticThunks = {};
-var h$staticThunksArr = [];
-var h$regs = [];
-var h$r1 = 0;
-var h$r2 = 0;
-var h$r3 = 0;
-var h$r4 = 0;
-var h$r5 = 0;
-var h$r6 = 0;
-var h$r7 = 0;
-var h$r8 = 0;
-var h$r9 = 0;
-var h$r10 = 0;
-var h$r11 = 0;
-var h$r12 = 0;
-var h$r13 = 0;
-var h$r14 = 0;
-var h$r15 = 0;
-var h$r16 = 0;
-var h$r17 = 0;
-var h$r18 = 0;
-var h$r19 = 0;
-var h$r20 = 0;
-var h$r21 = 0;
-var h$r22 = 0;
-var h$r23 = 0;
-var h$r24 = 0;
-var h$r25 = 0;
-var h$r26 = 0;
-var h$r27 = 0;
-var h$r28 = 0;
-var h$r29 = 0;
-var h$r30 = 0;
-var h$r31 = 0;
-var h$r32 = 0;
-function h$getReg(h$RTSD_0)
-{
-  switch (h$RTSD_0)
-  {
-    case (1):
-      return h$r1;
-    case (2):
-      return h$r2;
-    case (3):
-      return h$r3;
-    case (4):
-      return h$r4;
-    case (5):
-      return h$r5;
-    case (6):
-      return h$r6;
-    case (7):
-      return h$r7;
-    case (8):
-      return h$r8;
-    case (9):
-      return h$r9;
-    case (10):
-      return h$r10;
-    case (11):
-      return h$r11;
-    case (12):
-      return h$r12;
-    case (13):
-      return h$r13;
-    case (14):
-      return h$r14;
-    case (15):
-      return h$r15;
-    case (16):
-      return h$r16;
-    case (17):
-      return h$r17;
-    case (18):
-      return h$r18;
-    case (19):
-      return h$r19;
-    case (20):
-      return h$r20;
-    case (21):
-      return h$r21;
-    case (22):
-      return h$r22;
-    case (23):
-      return h$r23;
-    case (24):
-      return h$r24;
-    case (25):
-      return h$r25;
-    case (26):
-      return h$r26;
-    case (27):
-      return h$r27;
-    case (28):
-      return h$r28;
-    case (29):
-      return h$r29;
-    case (30):
-      return h$r30;
-    case (31):
-      return h$r31;
-    case (32):
-      return h$r32;
-    case (33):
-      return h$regs[0];
-    case (34):
-      return h$regs[1];
-    case (35):
-      return h$regs[2];
-    case (36):
-      return h$regs[3];
-    case (37):
-      return h$regs[4];
-    case (38):
-      return h$regs[5];
-    case (39):
-      return h$regs[6];
-    case (40):
-      return h$regs[7];
-    case (41):
-      return h$regs[8];
-    case (42):
-      return h$regs[9];
-    case (43):
-      return h$regs[10];
-    case (44):
-      return h$regs[11];
-    case (45):
-      return h$regs[12];
-    case (46):
-      return h$regs[13];
-    case (47):
-      return h$regs[14];
-    case (48):
-      return h$regs[15];
-    case (49):
-      return h$regs[16];
-    case (50):
-      return h$regs[17];
-    case (51):
-      return h$regs[18];
-    case (52):
-      return h$regs[19];
-    case (53):
-      return h$regs[20];
-    case (54):
-      return h$regs[21];
-    case (55):
-      return h$regs[22];
-    case (56):
-      return h$regs[23];
-    case (57):
-      return h$regs[24];
-    case (58):
-      return h$regs[25];
-    case (59):
-      return h$regs[26];
-    case (60):
-      return h$regs[27];
-    case (61):
-      return h$regs[28];
-    case (62):
-      return h$regs[29];
-    case (63):
-      return h$regs[30];
-    case (64):
-      return h$regs[31];
-    case (65):
-      return h$regs[32];
-    case (66):
-      return h$regs[33];
-    case (67):
-      return h$regs[34];
-    case (68):
-      return h$regs[35];
-    case (69):
-      return h$regs[36];
-    case (70):
-      return h$regs[37];
-    case (71):
-      return h$regs[38];
-    case (72):
-      return h$regs[39];
-    case (73):
-      return h$regs[40];
-    case (74):
-      return h$regs[41];
-    case (75):
-      return h$regs[42];
-    case (76):
-      return h$regs[43];
-    case (77):
-      return h$regs[44];
-    case (78):
-      return h$regs[45];
-    case (79):
-      return h$regs[46];
-    case (80):
-      return h$regs[47];
-    case (81):
-      return h$regs[48];
-    case (82):
-      return h$regs[49];
-    case (83):
-      return h$regs[50];
-    case (84):
-      return h$regs[51];
-    case (85):
-      return h$regs[52];
-    case (86):
-      return h$regs[53];
-    case (87):
-      return h$regs[54];
-    case (88):
-      return h$regs[55];
-    case (89):
-      return h$regs[56];
-    case (90):
-      return h$regs[57];
-    case (91):
-      return h$regs[58];
-    case (92):
-      return h$regs[59];
-    case (93):
-      return h$regs[60];
-    case (94):
-      return h$regs[61];
-    case (95):
-      return h$regs[62];
-    case (96):
-      return h$regs[63];
-    case (97):
-      return h$regs[64];
-    case (98):
-      return h$regs[65];
-    case (99):
-      return h$regs[66];
-    case (100):
-      return h$regs[67];
-    case (101):
-      return h$regs[68];
-    case (102):
-      return h$regs[69];
-    case (103):
-      return h$regs[70];
-    case (104):
-      return h$regs[71];
-    case (105):
-      return h$regs[72];
-    case (106):
-      return h$regs[73];
-    case (107):
-      return h$regs[74];
-    case (108):
-      return h$regs[75];
-    case (109):
-      return h$regs[76];
-    case (110):
-      return h$regs[77];
-    case (111):
-      return h$regs[78];
-    case (112):
-      return h$regs[79];
-    case (113):
-      return h$regs[80];
-    case (114):
-      return h$regs[81];
-    case (115):
-      return h$regs[82];
-    case (116):
-      return h$regs[83];
-    case (117):
-      return h$regs[84];
-    case (118):
-      return h$regs[85];
-    case (119):
-      return h$regs[86];
-    case (120):
-      return h$regs[87];
-    case (121):
-      return h$regs[88];
-    case (122):
-      return h$regs[89];
-    case (123):
-      return h$regs[90];
-    case (124):
-      return h$regs[91];
-    case (125):
-      return h$regs[92];
-    case (126):
-      return h$regs[93];
-    case (127):
-      return h$regs[94];
-    case (128):
-      return h$regs[95];
-    default:
-  };
-};
-function h$setReg(h$RTSD_1, h$RTSD_2)
-{
-  switch (h$RTSD_1)
-  {
-    case (1):
-      h$r1 = h$RTSD_2;
-      return undefined;
-    case (2):
-      h$r2 = h$RTSD_2;
-      return undefined;
-    case (3):
-      h$r3 = h$RTSD_2;
-      return undefined;
-    case (4):
-      h$r4 = h$RTSD_2;
-      return undefined;
-    case (5):
-      h$r5 = h$RTSD_2;
-      return undefined;
-    case (6):
-      h$r6 = h$RTSD_2;
-      return undefined;
-    case (7):
-      h$r7 = h$RTSD_2;
-      return undefined;
-    case (8):
-      h$r8 = h$RTSD_2;
-      return undefined;
-    case (9):
-      h$r9 = h$RTSD_2;
-      return undefined;
-    case (10):
-      h$r10 = h$RTSD_2;
-      return undefined;
-    case (11):
-      h$r11 = h$RTSD_2;
-      return undefined;
-    case (12):
-      h$r12 = h$RTSD_2;
-      return undefined;
-    case (13):
-      h$r13 = h$RTSD_2;
-      return undefined;
-    case (14):
-      h$r14 = h$RTSD_2;
-      return undefined;
-    case (15):
-      h$r15 = h$RTSD_2;
-      return undefined;
-    case (16):
-      h$r16 = h$RTSD_2;
-      return undefined;
-    case (17):
-      h$r17 = h$RTSD_2;
-      return undefined;
-    case (18):
-      h$r18 = h$RTSD_2;
-      return undefined;
-    case (19):
-      h$r19 = h$RTSD_2;
-      return undefined;
-    case (20):
-      h$r20 = h$RTSD_2;
-      return undefined;
-    case (21):
-      h$r21 = h$RTSD_2;
-      return undefined;
-    case (22):
-      h$r22 = h$RTSD_2;
-      return undefined;
-    case (23):
-      h$r23 = h$RTSD_2;
-      return undefined;
-    case (24):
-      h$r24 = h$RTSD_2;
-      return undefined;
-    case (25):
-      h$r25 = h$RTSD_2;
-      return undefined;
-    case (26):
-      h$r26 = h$RTSD_2;
-      return undefined;
-    case (27):
-      h$r27 = h$RTSD_2;
-      return undefined;
-    case (28):
-      h$r28 = h$RTSD_2;
-      return undefined;
-    case (29):
-      h$r29 = h$RTSD_2;
-      return undefined;
-    case (30):
-      h$r30 = h$RTSD_2;
-      return undefined;
-    case (31):
-      h$r31 = h$RTSD_2;
-      return undefined;
-    case (32):
-      h$r32 = h$RTSD_2;
-      return undefined;
-    case (33):
-      h$regs[0] = h$RTSD_2;
-      return undefined;
-    case (34):
-      h$regs[1] = h$RTSD_2;
-      return undefined;
-    case (35):
-      h$regs[2] = h$RTSD_2;
-      return undefined;
-    case (36):
-      h$regs[3] = h$RTSD_2;
-      return undefined;
-    case (37):
-      h$regs[4] = h$RTSD_2;
-      return undefined;
-    case (38):
-      h$regs[5] = h$RTSD_2;
-      return undefined;
-    case (39):
-      h$regs[6] = h$RTSD_2;
-      return undefined;
-    case (40):
-      h$regs[7] = h$RTSD_2;
-      return undefined;
-    case (41):
-      h$regs[8] = h$RTSD_2;
-      return undefined;
-    case (42):
-      h$regs[9] = h$RTSD_2;
-      return undefined;
-    case (43):
-      h$regs[10] = h$RTSD_2;
-      return undefined;
-    case (44):
-      h$regs[11] = h$RTSD_2;
-      return undefined;
-    case (45):
-      h$regs[12] = h$RTSD_2;
-      return undefined;
-    case (46):
-      h$regs[13] = h$RTSD_2;
-      return undefined;
-    case (47):
-      h$regs[14] = h$RTSD_2;
-      return undefined;
-    case (48):
-      h$regs[15] = h$RTSD_2;
-      return undefined;
-    case (49):
-      h$regs[16] = h$RTSD_2;
-      return undefined;
-    case (50):
-      h$regs[17] = h$RTSD_2;
-      return undefined;
-    case (51):
-      h$regs[18] = h$RTSD_2;
-      return undefined;
-    case (52):
-      h$regs[19] = h$RTSD_2;
-      return undefined;
-    case (53):
-      h$regs[20] = h$RTSD_2;
-      return undefined;
-    case (54):
-      h$regs[21] = h$RTSD_2;
-      return undefined;
-    case (55):
-      h$regs[22] = h$RTSD_2;
-      return undefined;
-    case (56):
-      h$regs[23] = h$RTSD_2;
-      return undefined;
-    case (57):
-      h$regs[24] = h$RTSD_2;
-      return undefined;
-    case (58):
-      h$regs[25] = h$RTSD_2;
-      return undefined;
-    case (59):
-      h$regs[26] = h$RTSD_2;
-      return undefined;
-    case (60):
-      h$regs[27] = h$RTSD_2;
-      return undefined;
-    case (61):
-      h$regs[28] = h$RTSD_2;
-      return undefined;
-    case (62):
-      h$regs[29] = h$RTSD_2;
-      return undefined;
-    case (63):
-      h$regs[30] = h$RTSD_2;
-      return undefined;
-    case (64):
-      h$regs[31] = h$RTSD_2;
-      return undefined;
-    case (65):
-      h$regs[32] = h$RTSD_2;
-      return undefined;
-    case (66):
-      h$regs[33] = h$RTSD_2;
-      return undefined;
-    case (67):
-      h$regs[34] = h$RTSD_2;
-      return undefined;
-    case (68):
-      h$regs[35] = h$RTSD_2;
-      return undefined;
-    case (69):
-      h$regs[36] = h$RTSD_2;
-      return undefined;
-    case (70):
-      h$regs[37] = h$RTSD_2;
-      return undefined;
-    case (71):
-      h$regs[38] = h$RTSD_2;
-      return undefined;
-    case (72):
-      h$regs[39] = h$RTSD_2;
-      return undefined;
-    case (73):
-      h$regs[40] = h$RTSD_2;
-      return undefined;
-    case (74):
-      h$regs[41] = h$RTSD_2;
-      return undefined;
-    case (75):
-      h$regs[42] = h$RTSD_2;
-      return undefined;
-    case (76):
-      h$regs[43] = h$RTSD_2;
-      return undefined;
-    case (77):
-      h$regs[44] = h$RTSD_2;
-      return undefined;
-    case (78):
-      h$regs[45] = h$RTSD_2;
-      return undefined;
-    case (79):
-      h$regs[46] = h$RTSD_2;
-      return undefined;
-    case (80):
-      h$regs[47] = h$RTSD_2;
-      return undefined;
-    case (81):
-      h$regs[48] = h$RTSD_2;
-      return undefined;
-    case (82):
-      h$regs[49] = h$RTSD_2;
-      return undefined;
-    case (83):
-      h$regs[50] = h$RTSD_2;
-      return undefined;
-    case (84):
-      h$regs[51] = h$RTSD_2;
-      return undefined;
-    case (85):
-      h$regs[52] = h$RTSD_2;
-      return undefined;
-    case (86):
-      h$regs[53] = h$RTSD_2;
-      return undefined;
-    case (87):
-      h$regs[54] = h$RTSD_2;
-      return undefined;
-    case (88):
-      h$regs[55] = h$RTSD_2;
-      return undefined;
-    case (89):
-      h$regs[56] = h$RTSD_2;
-      return undefined;
-    case (90):
-      h$regs[57] = h$RTSD_2;
-      return undefined;
-    case (91):
-      h$regs[58] = h$RTSD_2;
-      return undefined;
-    case (92):
-      h$regs[59] = h$RTSD_2;
-      return undefined;
-    case (93):
-      h$regs[60] = h$RTSD_2;
-      return undefined;
-    case (94):
-      h$regs[61] = h$RTSD_2;
-      return undefined;
-    case (95):
-      h$regs[62] = h$RTSD_2;
-      return undefined;
-    case (96):
-      h$regs[63] = h$RTSD_2;
-      return undefined;
-    case (97):
-      h$regs[64] = h$RTSD_2;
-      return undefined;
-    case (98):
-      h$regs[65] = h$RTSD_2;
-      return undefined;
-    case (99):
-      h$regs[66] = h$RTSD_2;
-      return undefined;
-    case (100):
-      h$regs[67] = h$RTSD_2;
-      return undefined;
-    case (101):
-      h$regs[68] = h$RTSD_2;
-      return undefined;
-    case (102):
-      h$regs[69] = h$RTSD_2;
-      return undefined;
-    case (103):
-      h$regs[70] = h$RTSD_2;
-      return undefined;
-    case (104):
-      h$regs[71] = h$RTSD_2;
-      return undefined;
-    case (105):
-      h$regs[72] = h$RTSD_2;
-      return undefined;
-    case (106):
-      h$regs[73] = h$RTSD_2;
-      return undefined;
-    case (107):
-      h$regs[74] = h$RTSD_2;
-      return undefined;
-    case (108):
-      h$regs[75] = h$RTSD_2;
-      return undefined;
-    case (109):
-      h$regs[76] = h$RTSD_2;
-      return undefined;
-    case (110):
-      h$regs[77] = h$RTSD_2;
-      return undefined;
-    case (111):
-      h$regs[78] = h$RTSD_2;
-      return undefined;
-    case (112):
-      h$regs[79] = h$RTSD_2;
-      return undefined;
-    case (113):
-      h$regs[80] = h$RTSD_2;
-      return undefined;
-    case (114):
-      h$regs[81] = h$RTSD_2;
-      return undefined;
-    case (115):
-      h$regs[82] = h$RTSD_2;
-      return undefined;
-    case (116):
-      h$regs[83] = h$RTSD_2;
-      return undefined;
-    case (117):
-      h$regs[84] = h$RTSD_2;
-      return undefined;
-    case (118):
-      h$regs[85] = h$RTSD_2;
-      return undefined;
-    case (119):
-      h$regs[86] = h$RTSD_2;
-      return undefined;
-    case (120):
-      h$regs[87] = h$RTSD_2;
-      return undefined;
-    case (121):
-      h$regs[88] = h$RTSD_2;
-      return undefined;
-    case (122):
-      h$regs[89] = h$RTSD_2;
-      return undefined;
-    case (123):
-      h$regs[90] = h$RTSD_2;
-      return undefined;
-    case (124):
-      h$regs[91] = h$RTSD_2;
-      return undefined;
-    case (125):
-      h$regs[92] = h$RTSD_2;
-      return undefined;
-    case (126):
-      h$regs[93] = h$RTSD_2;
-      return undefined;
-    case (127):
-      h$regs[94] = h$RTSD_2;
-      return undefined;
-    case (128):
-      h$regs[95] = h$RTSD_2;
-      return undefined;
-    default:
-  };
-};
-function h$l1(x1)
-{
-  h$r1 = x1;
-};
-function h$l2(x1, x2)
-{
-  h$r2 = x1;
-  h$r1 = x2;
-};
-function h$l3(x1, x2, x3)
-{
-  h$r3 = x1;
-  h$r2 = x2;
-  h$r1 = x3;
-};
-function h$l4(x1, x2, x3, x4)
-{
-  h$r4 = x1;
-  h$r3 = x2;
-  h$r2 = x3;
-  h$r1 = x4;
-};
-function h$l5(x1, x2, x3, x4, x5)
-{
-  h$r5 = x1;
-  h$r4 = x2;
-  h$r3 = x3;
-  h$r2 = x4;
-  h$r1 = x5;
-};
-function h$l6(x1, x2, x3, x4, x5, x6)
-{
-  h$r6 = x1;
-  h$r5 = x2;
-  h$r4 = x3;
-  h$r3 = x4;
-  h$r2 = x5;
-  h$r1 = x6;
-};
-function h$l7(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$r7 = x1;
-  h$r6 = x2;
-  h$r5 = x3;
-  h$r4 = x4;
-  h$r3 = x5;
-  h$r2 = x6;
-  h$r1 = x7;
-};
-function h$l8(x1, x2, x3, x4, x5, x6, x7, x8)
-{
-  h$r8 = x1;
-  h$r7 = x2;
-  h$r6 = x3;
-  h$r5 = x4;
-  h$r4 = x5;
-  h$r3 = x6;
-  h$r2 = x7;
-  h$r1 = x8;
-};
-function h$l9(x1, x2, x3, x4, x5, x6, x7, x8, x9)
-{
-  h$r9 = x1;
-  h$r8 = x2;
-  h$r7 = x3;
-  h$r6 = x4;
-  h$r5 = x5;
-  h$r4 = x6;
-  h$r3 = x7;
-  h$r2 = x8;
-  h$r1 = x9;
-};
-function h$l10(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10)
-{
-  h$r10 = x1;
-  h$r9 = x2;
-  h$r8 = x3;
-  h$r7 = x4;
-  h$r6 = x5;
-  h$r5 = x6;
-  h$r4 = x7;
-  h$r3 = x8;
-  h$r2 = x9;
-  h$r1 = x10;
-};
-function h$l11(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11)
-{
-  h$r11 = x1;
-  h$r10 = x2;
-  h$r9 = x3;
-  h$r8 = x4;
-  h$r7 = x5;
-  h$r6 = x6;
-  h$r5 = x7;
-  h$r4 = x8;
-  h$r3 = x9;
-  h$r2 = x10;
-  h$r1 = x11;
-};
-function h$l12(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12)
-{
-  h$r12 = x1;
-  h$r11 = x2;
-  h$r10 = x3;
-  h$r9 = x4;
-  h$r8 = x5;
-  h$r7 = x6;
-  h$r6 = x7;
-  h$r5 = x8;
-  h$r4 = x9;
-  h$r3 = x10;
-  h$r2 = x11;
-  h$r1 = x12;
-};
-function h$l13(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13)
-{
-  h$r13 = x1;
-  h$r12 = x2;
-  h$r11 = x3;
-  h$r10 = x4;
-  h$r9 = x5;
-  h$r8 = x6;
-  h$r7 = x7;
-  h$r6 = x8;
-  h$r5 = x9;
-  h$r4 = x10;
-  h$r3 = x11;
-  h$r2 = x12;
-  h$r1 = x13;
-};
-function h$l14(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14)
-{
-  h$r14 = x1;
-  h$r13 = x2;
-  h$r12 = x3;
-  h$r11 = x4;
-  h$r10 = x5;
-  h$r9 = x6;
-  h$r8 = x7;
-  h$r7 = x8;
-  h$r6 = x9;
-  h$r5 = x10;
-  h$r4 = x11;
-  h$r3 = x12;
-  h$r2 = x13;
-  h$r1 = x14;
-};
-function h$l15(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15)
-{
-  h$r15 = x1;
-  h$r14 = x2;
-  h$r13 = x3;
-  h$r12 = x4;
-  h$r11 = x5;
-  h$r10 = x6;
-  h$r9 = x7;
-  h$r8 = x8;
-  h$r7 = x9;
-  h$r6 = x10;
-  h$r5 = x11;
-  h$r4 = x12;
-  h$r3 = x13;
-  h$r2 = x14;
-  h$r1 = x15;
-};
-function h$l16(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16)
-{
-  h$r16 = x1;
-  h$r15 = x2;
-  h$r14 = x3;
-  h$r13 = x4;
-  h$r12 = x5;
-  h$r11 = x6;
-  h$r10 = x7;
-  h$r9 = x8;
-  h$r8 = x9;
-  h$r7 = x10;
-  h$r6 = x11;
-  h$r5 = x12;
-  h$r4 = x13;
-  h$r3 = x14;
-  h$r2 = x15;
-  h$r1 = x16;
-};
-function h$l17(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17)
-{
-  h$r17 = x1;
-  h$r16 = x2;
-  h$r15 = x3;
-  h$r14 = x4;
-  h$r13 = x5;
-  h$r12 = x6;
-  h$r11 = x7;
-  h$r10 = x8;
-  h$r9 = x9;
-  h$r8 = x10;
-  h$r7 = x11;
-  h$r6 = x12;
-  h$r5 = x13;
-  h$r4 = x14;
-  h$r3 = x15;
-  h$r2 = x16;
-  h$r1 = x17;
-};
-function h$l18(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18)
-{
-  h$r18 = x1;
-  h$r17 = x2;
-  h$r16 = x3;
-  h$r15 = x4;
-  h$r14 = x5;
-  h$r13 = x6;
-  h$r12 = x7;
-  h$r11 = x8;
-  h$r10 = x9;
-  h$r9 = x10;
-  h$r8 = x11;
-  h$r7 = x12;
-  h$r6 = x13;
-  h$r5 = x14;
-  h$r4 = x15;
-  h$r3 = x16;
-  h$r2 = x17;
-  h$r1 = x18;
-};
-function h$l19(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19)
-{
-  h$r19 = x1;
-  h$r18 = x2;
-  h$r17 = x3;
-  h$r16 = x4;
-  h$r15 = x5;
-  h$r14 = x6;
-  h$r13 = x7;
-  h$r12 = x8;
-  h$r11 = x9;
-  h$r10 = x10;
-  h$r9 = x11;
-  h$r8 = x12;
-  h$r7 = x13;
-  h$r6 = x14;
-  h$r5 = x15;
-  h$r4 = x16;
-  h$r3 = x17;
-  h$r2 = x18;
-  h$r1 = x19;
-};
-function h$l20(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20)
-{
-  h$r20 = x1;
-  h$r19 = x2;
-  h$r18 = x3;
-  h$r17 = x4;
-  h$r16 = x5;
-  h$r15 = x6;
-  h$r14 = x7;
-  h$r13 = x8;
-  h$r12 = x9;
-  h$r11 = x10;
-  h$r10 = x11;
-  h$r9 = x12;
-  h$r8 = x13;
-  h$r7 = x14;
-  h$r6 = x15;
-  h$r5 = x16;
-  h$r4 = x17;
-  h$r3 = x18;
-  h$r2 = x19;
-  h$r1 = x20;
-};
-function h$l21(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21)
-{
-  h$r21 = x1;
-  h$r20 = x2;
-  h$r19 = x3;
-  h$r18 = x4;
-  h$r17 = x5;
-  h$r16 = x6;
-  h$r15 = x7;
-  h$r14 = x8;
-  h$r13 = x9;
-  h$r12 = x10;
-  h$r11 = x11;
-  h$r10 = x12;
-  h$r9 = x13;
-  h$r8 = x14;
-  h$r7 = x15;
-  h$r6 = x16;
-  h$r5 = x17;
-  h$r4 = x18;
-  h$r3 = x19;
-  h$r2 = x20;
-  h$r1 = x21;
-};
-function h$l22(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22)
-{
-  h$r22 = x1;
-  h$r21 = x2;
-  h$r20 = x3;
-  h$r19 = x4;
-  h$r18 = x5;
-  h$r17 = x6;
-  h$r16 = x7;
-  h$r15 = x8;
-  h$r14 = x9;
-  h$r13 = x10;
-  h$r12 = x11;
-  h$r11 = x12;
-  h$r10 = x13;
-  h$r9 = x14;
-  h$r8 = x15;
-  h$r7 = x16;
-  h$r6 = x17;
-  h$r5 = x18;
-  h$r4 = x19;
-  h$r3 = x20;
-  h$r2 = x21;
-  h$r1 = x22;
-};
-function h$l23(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23)
-{
-  h$r23 = x1;
-  h$r22 = x2;
-  h$r21 = x3;
-  h$r20 = x4;
-  h$r19 = x5;
-  h$r18 = x6;
-  h$r17 = x7;
-  h$r16 = x8;
-  h$r15 = x9;
-  h$r14 = x10;
-  h$r13 = x11;
-  h$r12 = x12;
-  h$r11 = x13;
-  h$r10 = x14;
-  h$r9 = x15;
-  h$r8 = x16;
-  h$r7 = x17;
-  h$r6 = x18;
-  h$r5 = x19;
-  h$r4 = x20;
-  h$r3 = x21;
-  h$r2 = x22;
-  h$r1 = x23;
-};
-function h$l24(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24)
-{
-  h$r24 = x1;
-  h$r23 = x2;
-  h$r22 = x3;
-  h$r21 = x4;
-  h$r20 = x5;
-  h$r19 = x6;
-  h$r18 = x7;
-  h$r17 = x8;
-  h$r16 = x9;
-  h$r15 = x10;
-  h$r14 = x11;
-  h$r13 = x12;
-  h$r12 = x13;
-  h$r11 = x14;
-  h$r10 = x15;
-  h$r9 = x16;
-  h$r8 = x17;
-  h$r7 = x18;
-  h$r6 = x19;
-  h$r5 = x20;
-  h$r4 = x21;
-  h$r3 = x22;
-  h$r2 = x23;
-  h$r1 = x24;
-};
-function h$l25(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25)
-{
-  h$r25 = x1;
-  h$r24 = x2;
-  h$r23 = x3;
-  h$r22 = x4;
-  h$r21 = x5;
-  h$r20 = x6;
-  h$r19 = x7;
-  h$r18 = x8;
-  h$r17 = x9;
-  h$r16 = x10;
-  h$r15 = x11;
-  h$r14 = x12;
-  h$r13 = x13;
-  h$r12 = x14;
-  h$r11 = x15;
-  h$r10 = x16;
-  h$r9 = x17;
-  h$r8 = x18;
-  h$r7 = x19;
-  h$r6 = x20;
-  h$r5 = x21;
-  h$r4 = x22;
-  h$r3 = x23;
-  h$r2 = x24;
-  h$r1 = x25;
-};
-function h$l26(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26)
-{
-  h$r26 = x1;
-  h$r25 = x2;
-  h$r24 = x3;
-  h$r23 = x4;
-  h$r22 = x5;
-  h$r21 = x6;
-  h$r20 = x7;
-  h$r19 = x8;
-  h$r18 = x9;
-  h$r17 = x10;
-  h$r16 = x11;
-  h$r15 = x12;
-  h$r14 = x13;
-  h$r13 = x14;
-  h$r12 = x15;
-  h$r11 = x16;
-  h$r10 = x17;
-  h$r9 = x18;
-  h$r8 = x19;
-  h$r7 = x20;
-  h$r6 = x21;
-  h$r5 = x22;
-  h$r4 = x23;
-  h$r3 = x24;
-  h$r2 = x25;
-  h$r1 = x26;
-};
-function h$l27(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27)
-{
-  h$r27 = x1;
-  h$r26 = x2;
-  h$r25 = x3;
-  h$r24 = x4;
-  h$r23 = x5;
-  h$r22 = x6;
-  h$r21 = x7;
-  h$r20 = x8;
-  h$r19 = x9;
-  h$r18 = x10;
-  h$r17 = x11;
-  h$r16 = x12;
-  h$r15 = x13;
-  h$r14 = x14;
-  h$r13 = x15;
-  h$r12 = x16;
-  h$r11 = x17;
-  h$r10 = x18;
-  h$r9 = x19;
-  h$r8 = x20;
-  h$r7 = x21;
-  h$r6 = x22;
-  h$r5 = x23;
-  h$r4 = x24;
-  h$r3 = x25;
-  h$r2 = x26;
-  h$r1 = x27;
-};
-function h$l28(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28)
-{
-  h$r28 = x1;
-  h$r27 = x2;
-  h$r26 = x3;
-  h$r25 = x4;
-  h$r24 = x5;
-  h$r23 = x6;
-  h$r22 = x7;
-  h$r21 = x8;
-  h$r20 = x9;
-  h$r19 = x10;
-  h$r18 = x11;
-  h$r17 = x12;
-  h$r16 = x13;
-  h$r15 = x14;
-  h$r14 = x15;
-  h$r13 = x16;
-  h$r12 = x17;
-  h$r11 = x18;
-  h$r10 = x19;
-  h$r9 = x20;
-  h$r8 = x21;
-  h$r7 = x22;
-  h$r6 = x23;
-  h$r5 = x24;
-  h$r4 = x25;
-  h$r3 = x26;
-  h$r2 = x27;
-  h$r1 = x28;
-};
-function h$l29(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28, x29)
-{
-  h$r29 = x1;
-  h$r28 = x2;
-  h$r27 = x3;
-  h$r26 = x4;
-  h$r25 = x5;
-  h$r24 = x6;
-  h$r23 = x7;
-  h$r22 = x8;
-  h$r21 = x9;
-  h$r20 = x10;
-  h$r19 = x11;
-  h$r18 = x12;
-  h$r17 = x13;
-  h$r16 = x14;
-  h$r15 = x15;
-  h$r14 = x16;
-  h$r13 = x17;
-  h$r12 = x18;
-  h$r11 = x19;
-  h$r10 = x20;
-  h$r9 = x21;
-  h$r8 = x22;
-  h$r7 = x23;
-  h$r6 = x24;
-  h$r5 = x25;
-  h$r4 = x26;
-  h$r3 = x27;
-  h$r2 = x28;
-  h$r1 = x29;
-};
-function h$l30(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28, x29, x30)
-{
-  h$r30 = x1;
-  h$r29 = x2;
-  h$r28 = x3;
-  h$r27 = x4;
-  h$r26 = x5;
-  h$r25 = x6;
-  h$r24 = x7;
-  h$r23 = x8;
-  h$r22 = x9;
-  h$r21 = x10;
-  h$r20 = x11;
-  h$r19 = x12;
-  h$r18 = x13;
-  h$r17 = x14;
-  h$r16 = x15;
-  h$r15 = x16;
-  h$r14 = x17;
-  h$r13 = x18;
-  h$r12 = x19;
-  h$r11 = x20;
-  h$r10 = x21;
-  h$r9 = x22;
-  h$r8 = x23;
-  h$r7 = x24;
-  h$r6 = x25;
-  h$r5 = x26;
-  h$r4 = x27;
-  h$r3 = x28;
-  h$r2 = x29;
-  h$r1 = x30;
-};
-function h$l31(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28, x29, x30, x31)
-{
-  h$r31 = x1;
-  h$r30 = x2;
-  h$r29 = x3;
-  h$r28 = x4;
-  h$r27 = x5;
-  h$r26 = x6;
-  h$r25 = x7;
-  h$r24 = x8;
-  h$r23 = x9;
-  h$r22 = x10;
-  h$r21 = x11;
-  h$r20 = x12;
-  h$r19 = x13;
-  h$r18 = x14;
-  h$r17 = x15;
-  h$r16 = x16;
-  h$r15 = x17;
-  h$r14 = x18;
-  h$r13 = x19;
-  h$r12 = x20;
-  h$r11 = x21;
-  h$r10 = x22;
-  h$r9 = x23;
-  h$r8 = x24;
-  h$r7 = x25;
-  h$r6 = x26;
-  h$r5 = x27;
-  h$r4 = x28;
-  h$r3 = x29;
-  h$r2 = x30;
-  h$r1 = x31;
-};
-function h$l32(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28, x29, x30, x31, x32)
-{
-  h$r32 = x1;
-  h$r31 = x2;
-  h$r30 = x3;
-  h$r29 = x4;
-  h$r28 = x5;
-  h$r27 = x6;
-  h$r26 = x7;
-  h$r25 = x8;
-  h$r24 = x9;
-  h$r23 = x10;
-  h$r22 = x11;
-  h$r21 = x12;
-  h$r20 = x13;
-  h$r19 = x14;
-  h$r18 = x15;
-  h$r17 = x16;
-  h$r16 = x17;
-  h$r15 = x18;
-  h$r14 = x19;
-  h$r13 = x20;
-  h$r12 = x21;
-  h$r11 = x22;
-  h$r10 = x23;
-  h$r9 = x24;
-  h$r8 = x25;
-  h$r7 = x26;
-  h$r6 = x27;
-  h$r5 = x28;
-  h$r4 = x29;
-  h$r3 = x30;
-  h$r2 = x31;
-  h$r1 = x32;
-};
-var h$ret1;
-var h$ret2;
-var h$ret3;
-var h$ret4;
-var h$ret5;
-var h$ret6;
-var h$ret7;
-var h$ret8;
-var h$ret9;
-var h$ret10;
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-/* platform-specific setup */
-// top-level debug initialization needs this. declare it in case we aren't in the same file as out.js
-function h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e() { return h$stack[h$sp]; };
-/*
-   if browser mode is active (GHCJS_BROWSER is defined), all the runtime platform
-   detection code should be removed by the preprocessor. The h$isPlatform variables
-   are undeclared.
-
-   in non-browser mode, use h$isNode, h$isJsShell, h$isBrowser to find the current
-   platform.
-
-   more platforms should be added here in the future
-*/
-var h$isNode = false; // runtime is node.js
-var h$isJsShell = false; // runtime is SpiderMonkey jsshell
-var h$isJsCore = false; // runtime is JavaScriptCore jsc
-var h$isBrowser = false; // running in browser or everything else
-var h$isGHCJSi = false; // Code is GHCJSi (browser or node)
-// load all required node.js modules
-if(typeof process !== 'undefined' && (typeof h$TH !== 'undefined' || (typeof require !== 'undefined' && typeof module !== 'undefined' && module.exports))) {
-    h$isNode = true;
-    // we have to use these names for the closure compiler externs to work
-    var fs = require('fs');
-    var path = require('path');
-    var os = require('os');
-    var child_process = require('child_process');
-    var h$fs = fs;
-    var h$path = path;
-    var h$os = os;
-    var h$child = child_process;
-    var h$process = process;
-    var h$processConstants = process['binding']('constants');
-} else if(typeof snarf !== 'undefined' && typeof evalInFrame !== 'undefined' && typeof countHeap !== 'undefined') {
-    h$isJsShell = true;
-    this.console = { log: this.print };
-} else if(typeof numberOfDFGCompiles !== 'undefined' && typeof jscStack !== 'undefined') {
-    h$isJsCore = true;
-} else {
-    h$isBrowser = true;
-}
-if(typeof global !== 'undefined' && global.h$GHCJSi) {
-  h$isGHCJSi = true;
-}
-function h$getGlobal(that) {
-    if(typeof global !== 'undefined') return global;
-    return that;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-/*
-  set up the google closure library. this is a rather hacky setup
-  to make it work with our shims without requiring compilation
-  or pulling in the google closure library module loader
- */
-var goog = {};
-goog.global = h$getGlobal(this);
-goog.provide = function() { };
-goog.require = function() { };
-goog.isDef = function(val) { return val !== undefined; };
-goog.inherits = function(childCtor, parentCtor) {
-  /** @constructor */
-  function tempCtor() {};
-  tempCtor.prototype = parentCtor.prototype;
-  childCtor.superClass_ = parentCtor.prototype;
-  childCtor.prototype = new tempCtor();
-  /** @override */
-  childCtor.prototype.constructor = childCtor;
-  /**
-   * Calls superclass constructor/method.
-   *
-   * This function is only available if you use goog.inherits to
-   * express inheritance relationships between classes.
-   *
-   * NOTE: This is a replacement for goog.base and for superClass_
-   * property defined in childCtor.
-   *
-   * @param {!Object} me Should always be "this".
-   * @param {string} methodName The method name to call. Calling
-   *     superclass constructor can be done with the special string
-   *     'constructor'.
-   * @param {...*} var_args The arguments to pass to superclass
-   *     method/constructor.
-   * @return {*} The return value of the superclass method/constructor.
-   */
-  childCtor.base = function(me, methodName, var_args) {
-    // Copying using loop to avoid deop due to passing arguments object to
-    // function. This is faster in many JS engines as of late 2014.
-    var args = new Array(arguments.length - 2);
-    for (var i = 2; i < arguments.length; i++) {
-      args[i - 2] = arguments[i];
-    }
-    return parentCtor.prototype[methodName].apply(me, args);
-  };
-};
-goog.isString = function(v) {
-    return typeof v === 'string';
-}
-goog.math = {};
-goog.crypt = {};
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-/*
- Copyright (c) 2010, Linden Research, Inc.
- Copyright (c) 2014, Joshua Bell
-
- 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.
- $/LicenseInfo$
- */
-// Original can be found at:
-//   https://bitbucket.org/lindenlab/llsd
-// Modifications by Joshua Bell inexorabletash@gmail.com
-//   https://github.com/inexorabletash/polyfill
-// ES3/ES5 implementation of the Krhonos Typed Array Specification
-//   Ref: http://www.khronos.org/registry/typedarray/specs/latest/
-//   Date: 2011-02-01
-//
-// Variations:
-//  * Allows typed_array.get/set() as alias for subscripts (typed_array[])
-//  * Gradually migrating structure from Khronos spec to ES6 spec
-(function(global) {
-  'use strict';
-  var undefined = (void 0); // Paranoia
-  // Beyond this value, index getters/setters (i.e. array[0], array[1]) are so slow to
-  // create, and consume so much memory, that the browser appears frozen.
-  var MAX_ARRAY_LENGTH = 1e5;
-  // Approximations of internal ECMAScript conversion functions
-  function Type(v) {
-    switch(typeof v) {
-    case 'undefined': return 'undefined';
-    case 'boolean': return 'boolean';
-    case 'number': return 'number';
-    case 'string': return 'string';
-    default: return v === null ? 'null' : 'object';
-    }
-  }
-  // Class returns internal [[Class]] property, used to avoid cross-frame instanceof issues:
-  function Class(v) { return Object.prototype.toString.call(v).replace(/^\[object *|\]$/g, ''); }
-  function IsCallable(o) { return typeof o === 'function'; }
-  function ToObject(v) {
-    if (v === null || v === undefined) throw TypeError();
-    return Object(v);
-  }
-  function ToInt32(v) { return v >> 0; }
-  function ToUint32(v) { return v >>> 0; }
-  // Snapshot intrinsics
-  var LN2 = Math.LN2,
-      abs = Math.abs,
-      floor = Math.floor,
-      log = Math.log,
-      max = Math.max,
-      min = Math.min,
-      pow = Math.pow,
-      round = Math.round;
-  // emulate ES5 getter/setter API using legacy APIs
-  // http://blogs.msdn.com/b/ie/archive/2010/09/07/transitioning-existing-code-to-the-es5-getter-setter-apis.aspx
-  // (second clause tests for Object.defineProperty() in IE<9 that only supports extending DOM prototypes, but
-  // note that IE<9 does not support __defineGetter__ or __defineSetter__ so it just renders the method harmless)
-  (function() {
-    var orig = Object.defineProperty;
-    var dom_only = !(function(){try{return Object.defineProperty({},'x',{});}catch(_){return false;}}());
-    if (!orig || dom_only) {
-      Object.defineProperty = function (o, prop, desc) {
-        // In IE8 try built-in implementation for defining properties on DOM prototypes.
-        if (orig)
-          try { return orig(o, prop, desc); } catch (_) {}
-        if (o !== Object(o))
-          throw TypeError('Object.defineProperty called on non-object');
-        if (Object.prototype.__defineGetter__ && ('get' in desc))
-          Object.prototype.__defineGetter__.call(o, prop, desc.get);
-        if (Object.prototype.__defineSetter__ && ('set' in desc))
-          Object.prototype.__defineSetter__.call(o, prop, desc.set);
-        if ('value' in desc)
-          o[prop] = desc.value;
-        return o;
-      };
-    }
-  }());
-  // ES5: Make obj[index] an alias for obj._getter(index)/obj._setter(index, value)
-  // for index in 0 ... obj.length
-  function makeArrayAccessors(obj) {
-    if (obj.length > MAX_ARRAY_LENGTH) throw RangeError('Array too large for polyfill');
-    function makeArrayAccessor(index) {
-      Object.defineProperty(obj, index, {
-        'get': function() { return obj._getter(index); },
-        'set': function(v) { obj._setter(index, v); },
-        enumerable: true,
-        configurable: false
-      });
-    }
-    var i;
-    for (i = 0; i < obj.length; i += 1) {
-      makeArrayAccessor(i);
-    }
-  }
-  // Internal conversion functions:
-  //    pack<Type>()   - take a number (interpreted as Type), output a byte array
-  //    unpack<Type>() - take a byte array, output a Type-like number
-  function as_signed(value, bits) { var s = 32 - bits; return (value << s) >> s; }
-  function as_unsigned(value, bits) { var s = 32 - bits; return (value << s) >>> s; }
-  function packI8(n) { return [n & 0xff]; }
-  function unpackI8(bytes) { return as_signed(bytes[0], 8); }
-  function packU8(n) { return [n & 0xff]; }
-  function unpackU8(bytes) { return as_unsigned(bytes[0], 8); }
-  function packU8Clamped(n) { n = round(Number(n)); return [n < 0 ? 0 : n > 0xff ? 0xff : n & 0xff]; }
-  function packI16(n) { return [n & 0xff, (n >> 8) & 0xff]; }
-  function unpackI16(bytes) { return as_signed(bytes[1] << 8 | bytes[0], 16); }
-  function packU16(n) { return [n & 0xff, (n >> 8) & 0xff]; }
-  function unpackU16(bytes) { return as_unsigned(bytes[1] << 8 | bytes[0], 16); }
-  function packI32(n) { return [n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, (n >> 24) & 0xff]; }
-  function unpackI32(bytes) { return as_signed(bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0], 32); }
-  function packU32(n) { return [n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, (n >> 24) & 0xff]; }
-  function unpackU32(bytes) { return as_unsigned(bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0], 32); }
-  function packIEEE754(v, ebits, fbits) {
-    var bias = (1 << (ebits - 1)) - 1,
-        s, e, f, ln,
-        i, bits, str, bytes;
-    function roundToEven(n) {
-      var w = floor(n), f = n - w;
-      if (f < 0.5)
-        return w;
-      if (f > 0.5)
-        return w + 1;
-      return w % 2 ? w + 1 : w;
-    }
-    // Compute sign, exponent, fraction
-    if (v !== v) {
-      // NaN
-      // http://dev.w3.org/2006/webapi/WebIDL/#es-type-mapping
-      e = (1 << ebits) - 1; f = pow(2, fbits - 1); s = 0;
-    } else if (v === Infinity || v === -Infinity) {
-      e = (1 << ebits) - 1; f = 0; s = (v < 0) ? 1 : 0;
-    } else if (v === 0) {
-      e = 0; f = 0; s = (1 / v === -Infinity) ? 1 : 0;
-    } else {
-      s = v < 0;
-      v = abs(v);
-      if (v >= pow(2, 1 - bias)) {
-        e = min(floor(log(v) / LN2), 1023);
-        var significand = v / pow(2, e);
-        if (significand < 1) {
-          e -= 1;
-          significand *= 2;
-        }
-        if (significand >= 2) {
-          e += 1;
-          significand /= 2;
-        }
-        f = roundToEven(significand * pow(2, fbits));
-        if (f / pow(2, fbits) >= 2) {
-          e = e + 1;
-          f = 1;
-        }
-        if (e > bias) {
-          // Overflow
-          e = (1 << ebits) - 1;
-          f = 0;
-        } else {
-          // Normalized
-          e = e + bias;
-          f = f - pow(2, fbits);
-        }
-      } else {
-        // Denormalized
-        e = 0;
-        f = roundToEven(v / pow(2, 1 - bias - fbits));
-      }
-    }
-    // Pack sign, exponent, fraction
-    bits = [];
-    for (i = fbits; i; i -= 1) { bits.push(f % 2 ? 1 : 0); f = floor(f / 2); }
-    for (i = ebits; i; i -= 1) { bits.push(e % 2 ? 1 : 0); e = floor(e / 2); }
-    bits.push(s ? 1 : 0);
-    bits.reverse();
-    str = bits.join('');
-    // Bits to bytes
-    bytes = [];
-    while (str.length) {
-      bytes.unshift(parseInt(str.substring(0, 8), 2));
-      str = str.substring(8);
-    }
-    return bytes;
-  }
-  function unpackIEEE754(bytes, ebits, fbits) {
-    // Bytes to bits
-    var bits = [], i, j, b, str,
-        bias, s, e, f;
-    for (i = 0; i < bytes.length; ++i) {
-      b = bytes[i];
-      for (j = 8; j; j -= 1) {
-        bits.push(b % 2 ? 1 : 0); b = b >> 1;
-      }
-    }
-    bits.reverse();
-    str = bits.join('');
-    // Unpack sign, exponent, fraction
-    bias = (1 << (ebits - 1)) - 1;
-    s = parseInt(str.substring(0, 1), 2) ? -1 : 1;
-    e = parseInt(str.substring(1, 1 + ebits), 2);
-    f = parseInt(str.substring(1 + ebits), 2);
-    // Produce number
-    if (e === (1 << ebits) - 1) {
-      return f !== 0 ? NaN : s * Infinity;
-    } else if (e > 0) {
-      // Normalized
-      return s * pow(2, e - bias) * (1 + f / pow(2, fbits));
-    } else if (f !== 0) {
-      // Denormalized
-      return s * pow(2, -(bias - 1)) * (f / pow(2, fbits));
-    } else {
-      return s < 0 ? -0 : 0;
-    }
-  }
-  function unpackF64(b) { return unpackIEEE754(b, 11, 52); }
-  function packF64(v) { return packIEEE754(v, 11, 52); }
-  function unpackF32(b) { return unpackIEEE754(b, 8, 23); }
-  function packF32(v) { return packIEEE754(v, 8, 23); }
-  //
-  // 3 The ArrayBuffer Type
-  //
-  (function() {
-    function ArrayBuffer(length) {
-      length = ToInt32(length);
-      if (length < 0) throw RangeError('ArrayBuffer size is not a small enough positive integer.');
-      Object.defineProperty(this, 'byteLength', {value: length});
-      Object.defineProperty(this, '_bytes', {value: Array(length)});
-      for (var i = 0; i < length; i += 1)
-        this._bytes[i] = 0;
-    }
-    global.ArrayBuffer = global.ArrayBuffer || ArrayBuffer;
-    //
-    // 5 The Typed Array View Types
-    //
-    function $TypedArray$() {
-      // %TypedArray% ( length )
-      if (!arguments.length || typeof arguments[0] !== 'object') {
-        return (function(length) {
-          length = ToInt32(length);
-          if (length < 0) throw RangeError('length is not a small enough positive integer.');
-          Object.defineProperty(this, 'length', {value: length});
-          Object.defineProperty(this, 'byteLength', {value: length * this.BYTES_PER_ELEMENT});
-          Object.defineProperty(this, 'buffer', {value: new ArrayBuffer(this.byteLength)});
-          Object.defineProperty(this, 'byteOffset', {value: 0});
-         }).apply(this, arguments);
-      }
-      // %TypedArray% ( typedArray )
-      if (arguments.length >= 1 &&
-          Type(arguments[0]) === 'object' &&
-          arguments[0] instanceof $TypedArray$) {
-        return (function(typedArray){
-          if (this.constructor !== typedArray.constructor) throw TypeError();
-          var byteLength = typedArray.length * this.BYTES_PER_ELEMENT;
-          Object.defineProperty(this, 'buffer', {value: new ArrayBuffer(byteLength)});
-          Object.defineProperty(this, 'byteLength', {value: byteLength});
-          Object.defineProperty(this, 'byteOffset', {value: 0});
-          Object.defineProperty(this, 'length', {value: typedArray.length});
-          for (var i = 0; i < this.length; i += 1)
-            this._setter(i, typedArray._getter(i));
-        }).apply(this, arguments);
-      }
-      // %TypedArray% ( array )
-      if (arguments.length >= 1 &&
-          Type(arguments[0]) === 'object' &&
-          !(arguments[0] instanceof $TypedArray$) &&
-          !(arguments[0] instanceof ArrayBuffer || Class(arguments[0]) === 'ArrayBuffer')) {
-        return (function(array) {
-          var byteLength = array.length * this.BYTES_PER_ELEMENT;
-          Object.defineProperty(this, 'buffer', {value: new ArrayBuffer(byteLength)});
-          Object.defineProperty(this, 'byteLength', {value: byteLength});
-          Object.defineProperty(this, 'byteOffset', {value: 0});
-          Object.defineProperty(this, 'length', {value: array.length});
-          for (var i = 0; i < this.length; i += 1) {
-            var s = array[i];
-            this._setter(i, Number(s));
-          }
-        }).apply(this, arguments);
-      }
-      // %TypedArray% ( buffer, byteOffset=0, length=undefined )
-      if (arguments.length >= 1 &&
-          Type(arguments[0]) === 'object' &&
-          (arguments[0] instanceof ArrayBuffer || Class(arguments[0]) === 'ArrayBuffer')) {
-        return (function(buffer, byteOffset, length) {
-          byteOffset = ToUint32(byteOffset);
-          if (byteOffset > buffer.byteLength)
-            throw RangeError('byteOffset out of range');
-          // The given byteOffset must be a multiple of the element
-          // size of the specific type, otherwise an exception is raised.
-          if (byteOffset % this.BYTES_PER_ELEMENT)
-            throw RangeError('buffer length minus the byteOffset is not a multiple of the element size.');
-          if (length === undefined) {
-            var byteLength = buffer.byteLength - byteOffset;
-            if (byteLength % this.BYTES_PER_ELEMENT)
-              throw RangeError('length of buffer minus byteOffset not a multiple of the element size');
-            length = byteLength / this.BYTES_PER_ELEMENT;
-          } else {
-            length = ToUint32(length);
-            byteLength = length * this.BYTES_PER_ELEMENT;
-          }
-          if ((byteOffset + byteLength) > buffer.byteLength)
-            throw RangeError('byteOffset and length reference an area beyond the end of the buffer');
-          Object.defineProperty(this, 'buffer', {value: buffer});
-          Object.defineProperty(this, 'byteLength', {value: byteLength});
-          Object.defineProperty(this, 'byteOffset', {value: byteOffset});
-          Object.defineProperty(this, 'length', {value: length});
-        }).apply(this, arguments);
-      }
-      // %TypedArray% ( all other argument combinations )
-      throw TypeError();
-    }
-    // Properties of the %TypedArray Instrinsic Object
-    // %TypedArray%.from ( source , mapfn=undefined, thisArg=undefined )
-    Object.defineProperty($TypedArray$, 'from', {value: function(iterable) {
-      return new this(iterable);
-    }});
-    // %TypedArray%.of ( ...items )
-    Object.defineProperty($TypedArray$, 'of', {value: function(/*...items*/) {
-      return new this(arguments);
-    }});
-    // %TypedArray%.prototype
-    var $TypedArrayPrototype$ = {};
-    $TypedArray$.prototype = $TypedArrayPrototype$;
-    // WebIDL: getter type (unsigned long index);
-    Object.defineProperty($TypedArray$.prototype, '_getter', {value: function(index) {
-      if (arguments.length < 1) throw SyntaxError('Not enough arguments');
-      index = ToUint32(index);
-      if (index >= this.length)
-        return undefined;
-      var bytes = [], i, o;
-      for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT;
-           i < this.BYTES_PER_ELEMENT;
-           i += 1, o += 1) {
-        bytes.push(this.buffer._bytes[o]);
-      }
-      return this._unpack(bytes);
-    }});
-    // NONSTANDARD: convenience alias for getter: type get(unsigned long index);
-    Object.defineProperty($TypedArray$.prototype, 'get', {value: $TypedArray$.prototype._getter});
-    // WebIDL: setter void (unsigned long index, type value);
-    Object.defineProperty($TypedArray$.prototype, '_setter', {value: function(index, value) {
-      if (arguments.length < 2) throw SyntaxError('Not enough arguments');
-      index = ToUint32(index);
-      if (index >= this.length)
-        return;
-      var bytes = this._pack(value), i, o;
-      for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT;
-           i < this.BYTES_PER_ELEMENT;
-           i += 1, o += 1) {
-        this.buffer._bytes[o] = bytes[i];
-      }
-    }});
-    // get %TypedArray%.prototype.buffer
-    // get %TypedArray%.prototype.byteLength
-    // get %TypedArray%.prototype.byteOffset
-    // -- applied directly to the object in the constructor
-    // %TypedArray%.prototype.constructor
-    Object.defineProperty($TypedArray$.prototype, 'constructor', {value: $TypedArray$});
-    // %TypedArray%.prototype.copyWithin (target, start, end = this.length )
-    Object.defineProperty($TypedArray$.prototype, 'copyWithin', {value: function(target, start) {
-      var end = arguments[2];
-      var o = ToObject(this);
-      var lenVal = o.length;
-      var len = ToUint32(lenVal);
-      len = max(len, 0);
-      var relativeTarget = ToInt32(target);
-      var to;
-      if (relativeTarget < 0)
-        to = max(len + relativeTarget, 0);
-      else
-        to = min(relativeTarget, len);
-      var relativeStart = ToInt32(start);
-      var from;
-      if (relativeStart < 0)
-        from = max(len + relativeStart, 0);
-      else
-        from = min(relativeStart, len);
-      var relativeEnd;
-      if (end === undefined)
-        relativeEnd = len;
-      else
-        relativeEnd = ToInt32(end);
-      var final0;
-      if (relativeEnd < 0)
-        final0 = max(len + relativeEnd, 0);
-      else
-        final0 = min(relativeEnd, len);
-      var count = min(final0 - from, len - to);
-      var direction;
-      if (from < to && to < from + count) {
-        direction = -1;
-        from = from + count - 1;
-        to = to + count - 1;
-      } else {
-        direction = 1;
-      }
-      while (count > 0) {
-        o._setter(to, o._getter(from));
-        from = from + direction;
-        to = to + direction;
-        count = count - 1;
-      }
-      return o;
-    }});
-    // %TypedArray%.prototype.entries ( )
-    // -- defined in es6.js to shim browsers w/ native TypedArrays
-    // %TypedArray%.prototype.every ( callbackfn, thisArg = undefined )
-    Object.defineProperty($TypedArray$.prototype, 'every', {value: function(callbackfn) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (!IsCallable(callbackfn)) throw TypeError();
-      var thisArg = arguments[1];
-      for (var i = 0; i < len; i++) {
-        if (!callbackfn.call(thisArg, t._getter(i), i, t))
-          return false;
-      }
-      return true;
-    }});
-    // %TypedArray%.prototype.fill (value, start = 0, end = this.length )
-    Object.defineProperty($TypedArray$.prototype, 'fill', {value: function(value) {
-      var start = arguments[1],
-          end = arguments[2];
-      var o = ToObject(this);
-      var lenVal = o.length;
-      var len = ToUint32(lenVal);
-      len = max(len, 0);
-      var relativeStart = ToInt32(start);
-      var k;
-      if (relativeStart < 0)
-        k = max((len + relativeStart), 0);
-      else
-        k = min(relativeStart, len);
-      var relativeEnd;
-      if (end === undefined)
-        relativeEnd = len;
-      else
-        relativeEnd = ToInt32(end);
-      var final0;
-      if (relativeEnd < 0)
-        final0 = max((len + relativeEnd), 0);
-      else
-        final0 = min(relativeEnd, len);
-      while (k < final0) {
-        o._setter(k, value);
-        k += 1;
-      }
-      return o;
-    }});
-    // %TypedArray%.prototype.filter ( callbackfn, thisArg = undefined )
-    Object.defineProperty($TypedArray$.prototype, 'filter', {value: function(callbackfn) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (!IsCallable(callbackfn)) throw TypeError();
-      var res = [];
-      var thisp = arguments[1];
-      for (var i = 0; i < len; i++) {
-        var val = t._getter(i); // in case fun mutates this
-        if (callbackfn.call(thisp, val, i, t))
-          res.push(val);
-      }
-      return new this.constructor(res);
-    }});
-    // %TypedArray%.prototype.find (predicate, thisArg = undefined)
-    Object.defineProperty($TypedArray$.prototype, 'find', {value: function(predicate) {
-      var o = ToObject(this);
-      var lenValue = o.length;
-      var len = ToUint32(lenValue);
-      if (!IsCallable(predicate)) throw TypeError();
-      var t = arguments.length > 1 ? arguments[1] : undefined;
-      var k = 0;
-      while (k < len) {
-        var kValue = o._getter(k);
-        var testResult = predicate.call(t, kValue, k, o);
-        if (Boolean(testResult))
-          return kValue;
-        ++k;
-      }
-      return undefined;
-    }});
-    // %TypedArray%.prototype.findIndex ( predicate, thisArg = undefined )
-    Object.defineProperty($TypedArray$.prototype, 'findIndex', {value: function(predicate) {
-      var o = ToObject(this);
-      var lenValue = o.length;
-      var len = ToUint32(lenValue);
-      if (!IsCallable(predicate)) throw TypeError();
-      var t = arguments.length > 1 ? arguments[1] : undefined;
-      var k = 0;
-      while (k < len) {
-        var kValue = o._getter(k);
-        var testResult = predicate.call(t, kValue, k, o);
-        if (Boolean(testResult))
-          return k;
-        ++k;
-      }
-      return -1;
-    }});
-    // %TypedArray%.prototype.forEach ( callbackfn, thisArg = undefined )
-    Object.defineProperty($TypedArray$.prototype, 'forEach', {value: function(callbackfn) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (!IsCallable(callbackfn)) throw TypeError();
-      var thisp = arguments[1];
-      for (var i = 0; i < len; i++)
-        callbackfn.call(thisp, t._getter(i), i, t);
-    }});
-    // %TypedArray%.prototype.indexOf (searchElement, fromIndex = 0 )
-    Object.defineProperty($TypedArray$.prototype, 'indexOf', {value: function(searchElement) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (len === 0) return -1;
-      var n = 0;
-      if (arguments.length > 0) {
-        n = Number(arguments[1]);
-        if (n !== n) {
-          n = 0;
-        } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
-          n = (n > 0 || -1) * floor(abs(n));
-        }
-      }
-      if (n >= len) return -1;
-      var k = n >= 0 ? n : max(len - abs(n), 0);
-      for (; k < len; k++) {
-        if (t._getter(k) === searchElement) {
-          return k;
-        }
-      }
-      return -1;
-    }});
-    // %TypedArray%.prototype.join ( separator )
-    Object.defineProperty($TypedArray$.prototype, 'join', {value: function(separator) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      var tmp = Array(len);
-      for (var i = 0; i < len; ++i)
-        tmp[i] = t._getter(i);
-      return tmp.join(separator === undefined ? ',' : separator); // Hack for IE7
-    }});
-    // %TypedArray%.prototype.keys ( )
-    // -- defined in es6.js to shim browsers w/ native TypedArrays
-    // %TypedArray%.prototype.lastIndexOf ( searchElement, fromIndex = this.length-1 )
-    Object.defineProperty($TypedArray$.prototype, 'lastIndexOf', {value: function(searchElement) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (len === 0) return -1;
-      var n = len;
-      if (arguments.length > 1) {
-        n = Number(arguments[1]);
-        if (n !== n) {
-          n = 0;
-        } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
-          n = (n > 0 || -1) * floor(abs(n));
-        }
-      }
-      var k = n >= 0 ? min(n, len - 1) : len - abs(n);
-      for (; k >= 0; k--) {
-        if (t._getter(k) === searchElement)
-          return k;
-      }
-      return -1;
-    }});
-    // get %TypedArray%.prototype.length
-    // -- applied directly to the object in the constructor
-    // %TypedArray%.prototype.map ( callbackfn, thisArg = undefined )
-    Object.defineProperty($TypedArray$.prototype, 'map', {value: function(callbackfn) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (!IsCallable(callbackfn)) throw TypeError();
-      var res = []; res.length = len;
-      var thisp = arguments[1];
-      for (var i = 0; i < len; i++)
-        res[i] = callbackfn.call(thisp, t._getter(i), i, t);
-      return new this.constructor(res);
-    }});
-    // %TypedArray%.prototype.reduce ( callbackfn [, initialValue] )
-    Object.defineProperty($TypedArray$.prototype, 'reduce', {value: function(callbackfn) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (!IsCallable(callbackfn)) throw TypeError();
-      // no value to return if no initial value and an empty array
-      if (len === 0 && arguments.length === 1) throw TypeError();
-      var k = 0;
-      var accumulator;
-      if (arguments.length >= 2) {
-        accumulator = arguments[1];
-      } else {
-        accumulator = t._getter(k++);
-      }
-      while (k < len) {
-        accumulator = callbackfn.call(undefined, accumulator, t._getter(k), k, t);
-        k++;
-      }
-      return accumulator;
-    }});
-    // %TypedArray%.prototype.reduceRight ( callbackfn [, initialValue] )
-    Object.defineProperty($TypedArray$.prototype, 'reduceRight', {value: function(callbackfn) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (!IsCallable(callbackfn)) throw TypeError();
-      // no value to return if no initial value, empty array
-      if (len === 0 && arguments.length === 1) throw TypeError();
-      var k = len - 1;
-      var accumulator;
-      if (arguments.length >= 2) {
-        accumulator = arguments[1];
-      } else {
-        accumulator = t._getter(k--);
-      }
-      while (k >= 0) {
-        accumulator = callbackfn.call(undefined, accumulator, t._getter(k), k, t);
-        k--;
-      }
-      return accumulator;
-    }});
-    // %TypedArray%.prototype.reverse ( )
-    Object.defineProperty($TypedArray$.prototype, 'reverse', {value: function() {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      var half = floor(len / 2);
-      for (var i = 0, j = len - 1; i < half; ++i, --j) {
-        var tmp = t._getter(i);
-        t._setter(i, t._getter(j));
-        t._setter(j, tmp);
-      }
-      return t;
-    }});
-    // %TypedArray%.prototype.set(array, offset = 0 )
-    // %TypedArray%.prototype.set(typedArray, offset = 0 )
-    // WebIDL: void set(TypedArray array, optional unsigned long offset);
-    // WebIDL: void set(sequence<type> array, optional unsigned long offset);
-    Object.defineProperty($TypedArray$.prototype, 'set', {value: function(index, value) {
-      if (arguments.length < 1) throw SyntaxError('Not enough arguments');
-      var array, sequence, offset, len,
-          i, s, d,
-          byteOffset, byteLength, tmp;
-      if (typeof arguments[0] === 'object' && arguments[0].constructor === this.constructor) {
-        // void set(TypedArray array, optional unsigned long offset);
-        array = arguments[0];
-        offset = ToUint32(arguments[1]);
-        if (offset + array.length > this.length) {
-          throw RangeError('Offset plus length of array is out of range');
-        }
-        byteOffset = this.byteOffset + offset * this.BYTES_PER_ELEMENT;
-        byteLength = array.length * this.BYTES_PER_ELEMENT;
-        if (array.buffer === this.buffer) {
-          tmp = [];
-          for (i = 0, s = array.byteOffset; i < byteLength; i += 1, s += 1) {
-            tmp[i] = array.buffer._bytes[s];
-          }
-          for (i = 0, d = byteOffset; i < byteLength; i += 1, d += 1) {
-            this.buffer._bytes[d] = tmp[i];
-          }
-        } else {
-          for (i = 0, s = array.byteOffset, d = byteOffset;
-               i < byteLength; i += 1, s += 1, d += 1) {
-            this.buffer._bytes[d] = array.buffer._bytes[s];
-          }
-        }
-      } else if (typeof arguments[0] === 'object' && typeof arguments[0].length !== 'undefined') {
-        // void set(sequence<type> array, optional unsigned long offset);
-        sequence = arguments[0];
-        len = ToUint32(sequence.length);
-        offset = ToUint32(arguments[1]);
-        if (offset + len > this.length) {
-          throw RangeError('Offset plus length of array is out of range');
-        }
-        for (i = 0; i < len; i += 1) {
-          s = sequence[i];
-          this._setter(offset + i, Number(s));
-        }
-      } else {
-        throw TypeError('Unexpected argument type(s)');
-      }
-    }});
-    // %TypedArray%.prototype.slice ( start, end )
-    Object.defineProperty($TypedArray$.prototype, 'slice', {value: function(start, end) {
-      var o = ToObject(this);
-      var lenVal = o.length;
-      var len = ToUint32(lenVal);
-      var relativeStart = ToInt32(start);
-      var k = (relativeStart < 0) ? max(len + relativeStart, 0) : min(relativeStart, len);
-      var relativeEnd = (end === undefined) ? len : ToInt32(end);
-      var final0 = (relativeEnd < 0) ? max(len + relativeEnd, 0) : min(relativeEnd, len);
-      var count = final0 - k;
-      var c = o.constructor;
-      var a = new c(count);
-      var n = 0;
-      while (k < final0) {
-        var kValue = o._getter(k);
-        a._setter(n, kValue);
-        ++k;
-        ++n;
-      }
-      return a;
-    }});
-    // %TypedArray%.prototype.some ( callbackfn, thisArg = undefined )
-    Object.defineProperty($TypedArray$.prototype, 'some', {value: function(callbackfn) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      if (!IsCallable(callbackfn)) throw TypeError();
-      var thisp = arguments[1];
-      for (var i = 0; i < len; i++) {
-        if (callbackfn.call(thisp, t._getter(i), i, t)) {
-          return true;
-        }
-      }
-      return false;
-    }});
-    // %TypedArray%.prototype.sort ( comparefn )
-    Object.defineProperty($TypedArray$.prototype, 'sort', {value: function(comparefn) {
-      if (this === undefined || this === null) throw TypeError();
-      var t = Object(this);
-      var len = ToUint32(t.length);
-      var tmp = Array(len);
-      for (var i = 0; i < len; ++i)
-        tmp[i] = t._getter(i);
-      if (comparefn) tmp.sort(comparefn); else tmp.sort(); // Hack for IE8/9
-      for (i = 0; i < len; ++i)
-        t._setter(i, tmp[i]);
-      return t;
-    }});
-    // %TypedArray%.prototype.subarray(begin = 0, end = this.length )
-    // WebIDL: TypedArray subarray(long begin, optional long end);
-    Object.defineProperty($TypedArray$.prototype, 'subarray', {value: function(start, end) {
-      function clamp(v, min, max) { return v < min ? min : v > max ? max : v; }
-      start = ToInt32(start);
-      end = ToInt32(end);
-      if (arguments.length < 1) { start = 0; }
-      if (arguments.length < 2) { end = this.length; }
-      if (start < 0) { start = this.length + start; }
-      if (end < 0) { end = this.length + end; }
-      start = clamp(start, 0, this.length);
-      end = clamp(end, 0, this.length);
-      var len = end - start;
-      if (len < 0) {
-        len = 0;
-      }
-      return new this.constructor(
-        this.buffer, this.byteOffset + start * this.BYTES_PER_ELEMENT, len);
-    }});
-    // %TypedArray%.prototype.toLocaleString ( )
-    // %TypedArray%.prototype.toString ( )
-    // %TypedArray%.prototype.values ( )
-    // %TypedArray%.prototype [ @@iterator ] ( )
-    // get %TypedArray%.prototype [ @@toStringTag ]
-    // -- defined in es6.js to shim browsers w/ native TypedArrays
-    function makeTypedArray(elementSize, pack, unpack) {
-      // Each TypedArray type requires a distinct constructor instance with
-      // identical logic, which this produces.
-      var TypedArray = function() {
-        Object.defineProperty(this, 'constructor', {value: TypedArray});
-        $TypedArray$.apply(this, arguments);
-        makeArrayAccessors(this);
-      };
-      if ('__proto__' in TypedArray) {
-        TypedArray.__proto__ = $TypedArray$;
-      } else {
-        TypedArray.from = $TypedArray$.from;
-        TypedArray.of = $TypedArray$.of;
-      }
-      TypedArray.BYTES_PER_ELEMENT = elementSize;
-      var TypedArrayPrototype = function() {};
-      TypedArrayPrototype.prototype = $TypedArrayPrototype$;
-      TypedArray.prototype = new TypedArrayPrototype();
-      Object.defineProperty(TypedArray.prototype, 'BYTES_PER_ELEMENT', {value: elementSize});
-      Object.defineProperty(TypedArray.prototype, '_pack', {value: pack});
-      Object.defineProperty(TypedArray.prototype, '_unpack', {value: unpack});
-      return TypedArray;
-    }
-    var Int8Array = makeTypedArray(1, packI8, unpackI8);
-    var Uint8Array = makeTypedArray(1, packU8, unpackU8);
-    var Uint8ClampedArray = makeTypedArray(1, packU8Clamped, unpackU8);
-    var Int16Array = makeTypedArray(2, packI16, unpackI16);
-    var Uint16Array = makeTypedArray(2, packU16, unpackU16);
-    var Int32Array = makeTypedArray(4, packI32, unpackI32);
-    var Uint32Array = makeTypedArray(4, packU32, unpackU32);
-    var Float32Array = makeTypedArray(4, packF32, unpackF32);
-    var Float64Array = makeTypedArray(8, packF64, unpackF64);
-    global.Int8Array = global.Int8Array || Int8Array;
-    global.Uint8Array = global.Uint8Array || Uint8Array;
-    global.Uint8ClampedArray = global.Uint8ClampedArray || Uint8ClampedArray;
-    global.Int16Array = global.Int16Array || Int16Array;
-    global.Uint16Array = global.Uint16Array || Uint16Array;
-    global.Int32Array = global.Int32Array || Int32Array;
-    global.Uint32Array = global.Uint32Array || Uint32Array;
-    global.Float32Array = global.Float32Array || Float32Array;
-    global.Float64Array = global.Float64Array || Float64Array;
-  }());
-  //
-  // 6 The DataView View Type
-  //
-  (function() {
-    function r(array, index) {
-      return IsCallable(array.get) ? array.get(index) : array[index];
-    }
-    var IS_BIG_ENDIAN = (function() {
-      var u16array = new Uint16Array([0x1234]),
-          u8array = new Uint8Array(u16array.buffer);
-      return r(u8array, 0) === 0x12;
-    }());
-    // DataView(buffer, byteOffset=0, byteLength=undefined)
-    // WebIDL: Constructor(ArrayBuffer buffer,
-    //                     optional unsigned long byteOffset,
-    //                     optional unsigned long byteLength)
-    function DataView(buffer, byteOffset, byteLength) {
-      if (!(buffer instanceof ArrayBuffer || Class(buffer) === 'ArrayBuffer')) throw TypeError();
-      byteOffset = ToUint32(byteOffset);
-      if (byteOffset > buffer.byteLength)
-        throw RangeError('byteOffset out of range');
-      if (byteLength === undefined)
-        byteLength = buffer.byteLength - byteOffset;
-      else
-        byteLength = ToUint32(byteLength);
-      if ((byteOffset + byteLength) > buffer.byteLength)
-        throw RangeError('byteOffset and length reference an area beyond the end of the buffer');
-      Object.defineProperty(this, 'buffer', {value: buffer});
-      Object.defineProperty(this, 'byteLength', {value: byteLength});
-      Object.defineProperty(this, 'byteOffset', {value: byteOffset});
-    };
-    // get DataView.prototype.buffer
-    // get DataView.prototype.byteLength
-    // get DataView.prototype.byteOffset
-    // -- applied directly to instances by the constructor
-    function makeGetter(arrayType) {
-      return function GetViewValue(byteOffset, littleEndian) {
-        byteOffset = ToUint32(byteOffset);
-        if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength)
-          throw RangeError('Array index out of range');
-        byteOffset += this.byteOffset;
-        var uint8Array = new Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT),
-            bytes = [];
-        for (var i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1)
-          bytes.push(r(uint8Array, i));
-        if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN))
-          bytes.reverse();
-        return r(new arrayType(new Uint8Array(bytes).buffer), 0);
-      };
-    }
-    Object.defineProperty(DataView.prototype, 'getUint8', {value: makeGetter(Uint8Array)});
-    Object.defineProperty(DataView.prototype, 'getInt8', {value: makeGetter(Int8Array)});
-    Object.defineProperty(DataView.prototype, 'getUint16', {value: makeGetter(Uint16Array)});
-    Object.defineProperty(DataView.prototype, 'getInt16', {value: makeGetter(Int16Array)});
-    Object.defineProperty(DataView.prototype, 'getUint32', {value: makeGetter(Uint32Array)});
-    Object.defineProperty(DataView.prototype, 'getInt32', {value: makeGetter(Int32Array)});
-    Object.defineProperty(DataView.prototype, 'getFloat32', {value: makeGetter(Float32Array)});
-    Object.defineProperty(DataView.prototype, 'getFloat64', {value: makeGetter(Float64Array)});
-    function makeSetter(arrayType) {
-      return function SetViewValue(byteOffset, value, littleEndian) {
-        byteOffset = ToUint32(byteOffset);
-        if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength)
-          throw RangeError('Array index out of range');
-        // Get bytes
-        var typeArray = new arrayType([value]),
-            byteArray = new Uint8Array(typeArray.buffer),
-            bytes = [], i, byteView;
-        for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1)
-          bytes.push(r(byteArray, i));
-        // Flip if necessary
-        if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN))
-          bytes.reverse();
-        // Write them
-        byteView = new Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT);
-        byteView.set(bytes);
-      };
-    }
-    Object.defineProperty(DataView.prototype, 'setUint8', {value: makeSetter(Uint8Array)});
-    Object.defineProperty(DataView.prototype, 'setInt8', {value: makeSetter(Int8Array)});
-    Object.defineProperty(DataView.prototype, 'setUint16', {value: makeSetter(Uint16Array)});
-    Object.defineProperty(DataView.prototype, 'setInt16', {value: makeSetter(Int16Array)});
-    Object.defineProperty(DataView.prototype, 'setUint32', {value: makeSetter(Uint32Array)});
-    Object.defineProperty(DataView.prototype, 'setInt32', {value: makeSetter(Int32Array)});
-    Object.defineProperty(DataView.prototype, 'setFloat32', {value: makeSetter(Float32Array)});
-    Object.defineProperty(DataView.prototype, 'setFloat64', {value: makeSetter(Float64Array)});
-    global.DataView = global.DataView || DataView;
-  }());
-}(h$getGlobal(this)));
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-/** @constructor */
-var BigInteger = (function() {
-var dbits, DV, BI_FP;
-// Copyright (c) 2005  Tom Wu
-// All Rights Reserved.
-// See "LICENSE" for details.
-// Basic JavaScript BN library - subset useful for RSA encryption.
-// Bits per digit
-var dbits;
-// JavaScript engine analysis
-var canary = 0xdeadbeefcafe;
-var j_lm = ((canary&0xffffff)==0xefcafe);
-// (public) Constructor
-/** @constructor */
-function BigInteger(a,b,c) {
-  this.data = [];
-  if(a != null)
-    if("number" == typeof a) this.fromNumber(a,b,c);
-    else if(b == null && "string" != typeof a) this.fromString(a,256);
-    else this.fromString(a,b);
-}
-// return new, unset BigInteger
-function nbi() { return new BigInteger(null); }
-// am: Compute w_j += (x*this_i), propagate carries,
-// c is initial carry, returns final carry.
-// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
-// We need to select the fastest one that works in this environment.
-// am1: use a single mult and divide to get the high bits,
-// max digit bits should be 26 because
-// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
-function am1(i,x,w,j,c,n) {
-  while(--n >= 0) {
-    var v = x*this.data[i++]+w.data[j]+c;
-    c = Math.floor(v/0x4000000);
-    w.data[j++] = v&0x3ffffff;
-  }
-  return c;
-}
-// am2 avoids a big mult-and-extract completely.
-// Max digit bits should be <= 30 because we do bitwise ops
-// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
-function am2(i,x,w,j,c,n) {
-  var xl = x&0x7fff, xh = x>>15;
-  while(--n >= 0) {
-    var l = this.data[i]&0x7fff;
-    var h = this.data[i++]>>15;
-    var m = xh*l+h*xl;
-    l = xl*l+((m&0x7fff)<<15)+w.data[j]+(c&0x3fffffff);
-    c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
-    w.data[j++] = l&0x3fffffff;
-  }
-  return c;
-}
-// Alternately, set max digit bits to 28 since some
-// browsers slow down when dealing with 32-bit numbers.
-function am3(i,x,w,j,c,n) {
-  var xl = x&0x3fff, xh = x>>14;
-  while(--n >= 0) {
-    var l = this.data[i]&0x3fff;
-    var h = this.data[i++]>>14;
-    var m = xh*l+h*xl;
-    l = xl*l+((m&0x3fff)<<14)+w.data[j]+c;
-    c = (l>>28)+(m>>14)+xh*h;
-    w.data[j++] = l&0xfffffff;
-  }
-  return c;
-}
-// node.js (no browser)
-if(typeof(navigator) === 'undefined')
-{
-   BigInteger.prototype.am = am3;
-   dbits = 28;
-}
-else if(j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
-  BigInteger.prototype.am = am2;
-  dbits = 30;
-}
-else if(j_lm && (navigator.appName != "Netscape")) {
-  BigInteger.prototype.am = am1;
-  dbits = 26;
-}
-else { // Mozilla/Netscape seems to prefer am3
-  BigInteger.prototype.am = am3;
-  dbits = 28;
-}
-BigInteger.prototype.DB = dbits;
-BigInteger.prototype.DM = ((1<<dbits)-1);
-BigInteger.prototype.DV = (1<<dbits);
-var BI_FP = 52;
-BigInteger.prototype.FV = Math.pow(2,BI_FP);
-BigInteger.prototype.F1 = BI_FP-dbits;
-BigInteger.prototype.F2 = 2*dbits-BI_FP;
-// Digit conversions
-var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
-var BI_RC = new Array();
-var rr,vv;
-rr = "0".charCodeAt(0);
-for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
-rr = "a".charCodeAt(0);
-for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
-rr = "A".charCodeAt(0);
-for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
-function int2char(n) { return BI_RM.charAt(n); }
-function intAt(s,i) {
-  var c = BI_RC[s.charCodeAt(i)];
-  return (c==null)?-1:c;
-}
-// (protected) copy this to r
-function bnpCopyTo(r) {
-  for(var i = this.t-1; i >= 0; --i) r.data[i] = this.data[i];
-  r.t = this.t;
-  r.s = this.s;
-}
-// (protected) set from integer value x, -DV <= x < DV
-function bnpFromInt(x) {
-  this.t = 1;
-  this.s = (x<0)?-1:0;
-  if(x > 0) this.data[0] = x;
-  else if(x < -1) this.data[0] = x+this.DV;
-  else this.t = 0;
-}
-// return bigint initialized to value
-function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
-// (protected) set from string and radix
-function bnpFromString(s,b) {
-  var k;
-  if(b == 16) k = 4;
-  else if(b == 8) k = 3;
-  else if(b == 256) k = 8; // byte array
-  else if(b == 2) k = 1;
-  else if(b == 32) k = 5;
-  else if(b == 4) k = 2;
-  else { this.fromRadix(s,b); return; }
-  this.t = 0;
-  this.s = 0;
-  var i = s.length, mi = false, sh = 0;
-  while(--i >= 0) {
-    var x = (k==8)?s[i]&0xff:intAt(s,i);
-    if(x < 0) {
-      if(s.charAt(i) == "-") mi = true;
-      continue;
-    }
-    mi = false;
-    if(sh == 0)
-      this.data[this.t++] = x;
-    else if(sh+k > this.DB) {
-      this.data[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;
-      this.data[this.t++] = (x>>(this.DB-sh));
-    }
-    else
-      this.data[this.t-1] |= x<<sh;
-    sh += k;
-    if(sh >= this.DB) sh -= this.DB;
-  }
-  if(k == 8 && (s[0]&0x80) != 0) {
-    this.s = -1;
-    if(sh > 0) this.data[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;
-  }
-  this.clamp();
-  if(mi) BigInteger.ZERO.subTo(this,this);
-}
-// (protected) clamp off excess high words
-function bnpClamp() {
-  var c = this.s&this.DM;
-  while(this.t > 0 && this.data[this.t-1] == c) --this.t;
-}
-// (public) return string representation in given radix
-function bnToString(b) {
-  if(this.s < 0) return "-"+this.negate().toString(b);
-  var k;
-  if(b == 16) k = 4;
-  else if(b == 8) k = 3;
-  else if(b == 2) k = 1;
-  else if(b == 32) k = 5;
-  else if(b == 4) k = 2;
-  else return this.toRadix(b);
-  var km = (1<<k)-1, d, m = false, r = "", i = this.t;
-  var p = this.DB-(i*this.DB)%k;
-  if(i-- > 0) {
-    if(p < this.DB && (d = this.data[i]>>p) > 0) { m = true; r = int2char(d); }
-    while(i >= 0) {
-      if(p < k) {
-        d = (this.data[i]&((1<<p)-1))<<(k-p);
-        d |= this.data[--i]>>(p+=this.DB-k);
-      }
-      else {
-        d = (this.data[i]>>(p-=k))&km;
-        if(p <= 0) { p += this.DB; --i; }
-      }
-      if(d > 0) m = true;
-      if(m) r += int2char(d);
-    }
-  }
-  return m?r:"0";
-}
-// (public) -this
-function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }
-// (public) |this|
-function bnAbs() { return (this.s<0)?this.negate():this; }
-// (public) return + if this > a, - if this < a, 0 if equal
-function bnCompareTo(a) {
-  var r = this.s-a.s;
-  if(r != 0) return r;
-  var i = this.t;
-  r = i-a.t;
-  if(r != 0) return (this.s<0)?-r:r;
-  while(--i >= 0) if((r=this.data[i]-a.data[i]) != 0) return r;
-  return 0;
-}
-// returns bit length of the integer x
-function nbits(x) {
-  var r = 1, t;
-  if((t=x>>>16) != 0) { x = t; r += 16; }
-  if((t=x>>8) != 0) { x = t; r += 8; }
-  if((t=x>>4) != 0) { x = t; r += 4; }
-  if((t=x>>2) != 0) { x = t; r += 2; }
-  if((t=x>>1) != 0) { x = t; r += 1; }
-  return r;
-}
-// (public) return the number of bits in "this"
-function bnBitLength() {
-  if(this.t <= 0) return 0;
-  return this.DB*(this.t-1)+nbits(this.data[this.t-1]^(this.s&this.DM));
-}
-// (protected) r = this << n*DB
-function bnpDLShiftTo(n,r) {
-  var i;
-  for(i = this.t-1; i >= 0; --i) r.data[i+n] = this.data[i];
-  for(i = n-1; i >= 0; --i) r.data[i] = 0;
-  r.t = this.t+n;
-  r.s = this.s;
-}
-// (protected) r = this >> n*DB
-function bnpDRShiftTo(n,r) {
-  for(var i = n; i < this.t; ++i) r.data[i-n] = this.data[i];
-  r.t = Math.max(this.t-n,0);
-  r.s = this.s;
-}
-// (protected) r = this << n
-function bnpLShiftTo(n,r) {
-  var bs = n%this.DB;
-  var cbs = this.DB-bs;
-  var bm = (1<<cbs)-1;
-  var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;
-  for(i = this.t-1; i >= 0; --i) {
-    r.data[i+ds+1] = (this.data[i]>>cbs)|c;
-    c = (this.data[i]&bm)<<bs;
-  }
-  for(i = ds-1; i >= 0; --i) r.data[i] = 0;
-  r.data[ds] = c;
-  r.t = this.t+ds+1;
-  r.s = this.s;
-  r.clamp();
-}
-// (protected) r = this >> n
-function bnpRShiftTo(n,r) {
-  r.s = this.s;
-  var ds = Math.floor(n/this.DB);
-  if(ds >= this.t) { r.t = 0; return; }
-  var bs = n%this.DB;
-  var cbs = this.DB-bs;
-  var bm = (1<<bs)-1;
-  r.data[0] = this.data[ds]>>bs;
-  for(var i = ds+1; i < this.t; ++i) {
-    r.data[i-ds-1] |= (this.data[i]&bm)<<cbs;
-    r.data[i-ds] = this.data[i]>>bs;
-  }
-  if(bs > 0) r.data[this.t-ds-1] |= (this.s&bm)<<cbs;
-  r.t = this.t-ds;
-  r.clamp();
-}
-// (protected) r = this - a
-function bnpSubTo(a,r) {
-  var i = 0, c = 0, m = Math.min(a.t,this.t);
-  while(i < m) {
-    c += this.data[i]-a.data[i];
-    r.data[i++] = c&this.DM;
-    c >>= this.DB;
-  }
-  if(a.t < this.t) {
-    c -= a.s;
-    while(i < this.t) {
-      c += this.data[i];
-      r.data[i++] = c&this.DM;
-      c >>= this.DB;
-    }
-    c += this.s;
-  }
-  else {
-    c += this.s;
-    while(i < a.t) {
-      c -= a.data[i];
-      r.data[i++] = c&this.DM;
-      c >>= this.DB;
-    }
-    c -= a.s;
-  }
-  r.s = (c<0)?-1:0;
-  if(c < -1) r.data[i++] = this.DV+c;
-  else if(c > 0) r.data[i++] = c;
-  r.t = i;
-  r.clamp();
-}
-// (protected) r = this * a, r != this,a (HAC 14.12)
-// "this" should be the larger one if appropriate.
-function bnpMultiplyTo(a,r) {
-  var x = this.abs(), y = a.abs();
-  var i = x.t;
-  r.t = i+y.t;
-  while(--i >= 0) r.data[i] = 0;
-  for(i = 0; i < y.t; ++i) r.data[i+x.t] = x.am(0,y.data[i],r,i,0,x.t);
-  r.s = 0;
-  r.clamp();
-  if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
-}
-// (protected) r = this^2, r != this (HAC 14.16)
-function bnpSquareTo(r) {
-  var x = this.abs();
-  var i = r.t = 2*x.t;
-  while(--i >= 0) r.data[i] = 0;
-  for(i = 0; i < x.t-1; ++i) {
-    var c = x.am(i,x.data[i],r,2*i,0,1);
-    if((r.data[i+x.t]+=x.am(i+1,2*x.data[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {
-      r.data[i+x.t] -= x.DV;
-      r.data[i+x.t+1] = 1;
-    }
-  }
-  if(r.t > 0) r.data[r.t-1] += x.am(i,x.data[i],r,2*i,0,1);
-  r.s = 0;
-  r.clamp();
-}
-// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
-// r != q, this != m.  q or r may be null.
-function bnpDivRemTo(m,q,r) {
-  var pm = m.abs();
-  if(pm.t <= 0) return;
-  var pt = this.abs();
-  if(pt.t < pm.t) {
-    if(q != null) q.fromInt(0);
-    if(r != null) this.copyTo(r);
-    return;
-  }
-  if(r == null) r = nbi();
-  var y = nbi(), ts = this.s, ms = m.s;
-  var nsh = this.DB-nbits(pm.data[pm.t-1]); // normalize modulus
-  if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
-  else { pm.copyTo(y); pt.copyTo(r); }
-  var ys = y.t;
-  var y0 = y.data[ys-1];
-  if(y0 == 0) return;
-  var yt = y0*(1<<this.F1)+((ys>1)?y.data[ys-2]>>this.F2:0);
-  var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;
-  var i = r.t, j = i-ys, t = (q==null)?nbi():q;
-  y.dlShiftTo(j,t);
-  if(r.compareTo(t) >= 0) {
-    r.data[r.t++] = 1;
-    r.subTo(t,r);
-  }
-  BigInteger.ONE.dlShiftTo(ys,t);
-  t.subTo(y,y); // "negative" y so we can replace sub with am later
-  while(y.t < ys) y.data[y.t++] = 0;
-  while(--j >= 0) {
-    // Estimate quotient digit
-    var qd = (r.data[--i]==y0)?this.DM:Math.floor(r.data[i]*d1+(r.data[i-1]+e)*d2);
-    if((r.data[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out
-      y.dlShiftTo(j,t);
-      r.subTo(t,r);
-      while(r.data[i] < --qd) r.subTo(t,r);
-    }
-  }
-  if(q != null) {
-    r.drShiftTo(ys,q);
-    if(ts != ms) BigInteger.ZERO.subTo(q,q);
-  }
-  r.t = ys;
-  r.clamp();
-  if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder
-  if(ts < 0) BigInteger.ZERO.subTo(r,r);
-}
-// (public) this mod a
-function bnMod(a) {
-  var r = nbi();
-  this.abs().divRemTo(a,null,r);
-  if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
-  return r;
-}
-// Modular reduction using "classic" algorithm
-/** @constructor */
-function Classic(m) { this.m = m; }
-function cConvert(x) {
-  if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
-  else return x;
-}
-function cRevert(x) { return x; }
-function cReduce(x) { x.divRemTo(this.m,null,x); }
-function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
-function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
-Classic.prototype.convert = cConvert;
-Classic.prototype.revert = cRevert;
-Classic.prototype.reduce = cReduce;
-Classic.prototype.mulTo = cMulTo;
-Classic.prototype.sqrTo = cSqrTo;
-// (protected) return "-1/this % 2^DB"; useful for Mont. reduction
-// justification:
-//         xy == 1 (mod m)
-//         xy =  1+km
-//   xy(2-xy) = (1+km)(1-km)
-// x[y(2-xy)] = 1-k^2m^2
-// x[y(2-xy)] == 1 (mod m^2)
-// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
-// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
-// JS multiply "overflows" differently from C/C++, so care is needed here.
-function bnpInvDigit() {
-  if(this.t < 1) return 0;
-  var x = this.data[0];
-  if((x&1) == 0) return 0;
-  var y = x&3; // y == 1/x mod 2^2
-  y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4
-  y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8
-  y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16
-  // last step - calculate inverse mod DV directly;
-  // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
-  y = (y*(2-x*y%this.DV))%this.DV; // y == 1/x mod 2^dbits
-  // we really want the negative inverse, and -DV < y < DV
-  return (y>0)?this.DV-y:-y;
-}
-// Montgomery reduction
-/** @constructor */
-function Montgomery(m) {
-  this.m = m;
-  this.mp = m.invDigit();
-  this.mpl = this.mp&0x7fff;
-  this.mph = this.mp>>15;
-  this.um = (1<<(m.DB-15))-1;
-  this.mt2 = 2*m.t;
-}
-// xR mod m
-function montConvert(x) {
-  var r = nbi();
-  x.abs().dlShiftTo(this.m.t,r);
-  r.divRemTo(this.m,null,r);
-  if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
-  return r;
-}
-// x/R mod m
-function montRevert(x) {
-  var r = nbi();
-  x.copyTo(r);
-  this.reduce(r);
-  return r;
-}
-// x = x/R mod m (HAC 14.32)
-function montReduce(x) {
-  while(x.t <= this.mt2) // pad x so am has enough room later
-    x.data[x.t++] = 0;
-  for(var i = 0; i < this.m.t; ++i) {
-    // faster way of calculating u0 = x.data[i]*mp mod DV
-    var j = x.data[i]&0x7fff;
-    var u0 = (j*this.mpl+(((j*this.mph+(x.data[i]>>15)*this.mpl)&this.um)<<15))&x.DM;
-    // use am to combine the multiply-shift-add into one call
-    j = i+this.m.t;
-    x.data[j] += this.m.am(0,u0,x,i,0,this.m.t);
-    // propagate carry
-    while(x.data[j] >= x.DV) { x.data[j] -= x.DV; x.data[++j]++; }
-  }
-  x.clamp();
-  x.drShiftTo(this.m.t,x);
-  if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
-}
-// r = "x^2/R mod m"; x != r
-function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
-// r = "xy/R mod m"; x,y != r
-function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
-Montgomery.prototype.convert = montConvert;
-Montgomery.prototype.revert = montRevert;
-Montgomery.prototype.reduce = montReduce;
-Montgomery.prototype.mulTo = montMulTo;
-Montgomery.prototype.sqrTo = montSqrTo;
-// (protected) true iff this is even
-function bnpIsEven() { return ((this.t>0)?(this.data[0]&1):this.s) == 0; }
-// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
-function bnpExp(e,z) {
-  if(e > 0xffffffff || e < 1) return BigInteger.ONE;
-  var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
-  g.copyTo(r);
-  while(--i >= 0) {
-    z.sqrTo(r,r2);
-    if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
-    else { var t = r; r = r2; r2 = t; }
-  }
-  return z.revert(r);
-}
-// (public) this^e % m, 0 <= e < 2^32
-function bnModPowInt(e,m) {
-  var z;
-  if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
-  return this.exp(e,z);
-}
-// protected
-BigInteger.prototype.copyTo = bnpCopyTo;
-BigInteger.prototype.fromInt = bnpFromInt;
-BigInteger.prototype.fromString = bnpFromString;
-BigInteger.prototype.clamp = bnpClamp;
-BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
-BigInteger.prototype.drShiftTo = bnpDRShiftTo;
-BigInteger.prototype.lShiftTo = bnpLShiftTo;
-BigInteger.prototype.rShiftTo = bnpRShiftTo;
-BigInteger.prototype.subTo = bnpSubTo;
-BigInteger.prototype.multiplyTo = bnpMultiplyTo;
-BigInteger.prototype.squareTo = bnpSquareTo;
-BigInteger.prototype.divRemTo = bnpDivRemTo;
-BigInteger.prototype.invDigit = bnpInvDigit;
-BigInteger.prototype.isEven = bnpIsEven;
-BigInteger.prototype.exp = bnpExp;
-// public
-BigInteger.prototype.toString = bnToString;
-BigInteger.prototype.negate = bnNegate;
-BigInteger.prototype.abs = bnAbs;
-BigInteger.prototype.compareTo = bnCompareTo;
-BigInteger.prototype.bitLength = bnBitLength;
-BigInteger.prototype.mod = bnMod;
-BigInteger.prototype.modPowInt = bnModPowInt;
-// "constants"
-BigInteger.ZERO = nbv(0);
-BigInteger.ONE = nbv(1);
-// Copyright (c) 2005-2009  Tom Wu
-// All Rights Reserved.
-// See "LICENSE" for details.
-// Extended JavaScript BN functions, required for RSA private ops.
-// Version 1.1: new BigInteger("0", 10) returns "proper" zero
-// Version 1.2: square() API, isProbablePrime fix
-// (public)
-function bnClone() { var r = nbi(); this.copyTo(r); return r; }
-// (public) return value as integer
-function bnIntValue() {
-  if(this.s < 0) {
-    if(this.t == 1) return this.data[0]-this.DV;
-    else if(this.t == 0) return -1;
-  }
-  else if(this.t == 1) return this.data[0];
-  else if(this.t == 0) return 0;
-  // assumes 16 < DB < 32
-  return ((this.data[1]&((1<<(32-this.DB))-1))<<this.DB)|this.data[0];
-}
-// (public) return value as byte
-function bnByteValue() { return (this.t==0)?this.s:(this.data[0]<<24)>>24; }
-// (public) return value as short (assumes DB>=16)
-function bnShortValue() { return (this.t==0)?this.s:(this.data[0]<<16)>>16; }
-// (protected) return x s.t. r^x < DV
-function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }
-// (public) 0 if this == 0, 1 if this > 0
-function bnSigNum() {
-  if(this.s < 0) return -1;
-  else if(this.t <= 0 || (this.t == 1 && this.data[0] <= 0)) return 0;
-  else return 1;
-}
-// (protected) convert to radix string
-function bnpToRadix(b) {
-  if(b == null) b = 10;
-  if(this.signum() == 0 || b < 2 || b > 36) return "0";
-  var cs = this.chunkSize(b);
-  var a = Math.pow(b,cs);
-  var d = nbv(a), y = nbi(), z = nbi(), r = "";
-  this.divRemTo(d,y,z);
-  while(y.signum() > 0) {
-    r = (a+z.intValue()).toString(b).substr(1) + r;
-    y.divRemTo(d,y,z);
-  }
-  return z.intValue().toString(b) + r;
-}
-// (protected) convert from radix string
-function bnpFromRadix(s,b) {
-  this.fromInt(0);
-  if(b == null) b = 10;
-  var cs = this.chunkSize(b);
-  var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
-  for(var i = 0; i < s.length; ++i) {
-    var x = intAt(s,i);
-    if(x < 0) {
-      if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
-      continue;
-    }
-    w = b*w+x;
-    if(++j >= cs) {
-      this.dMultiply(d);
-      this.dAddOffset(w,0);
-      j = 0;
-      w = 0;
-    }
-  }
-  if(j > 0) {
-    this.dMultiply(Math.pow(b,j));
-    this.dAddOffset(w,0);
-  }
-  if(mi) BigInteger.ZERO.subTo(this,this);
-}
-// (protected) alternate constructor
-function bnpFromNumber(a,b,c) {
-  if("number" == typeof b) {
-    // new BigInteger(int,int,RNG)
-    if(a < 2) this.fromInt(1);
-    else {
-      this.fromNumber(a,c);
-      if(!this.testBit(a-1)) // force MSB set
-        this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
-      if(this.isEven()) this.dAddOffset(1,0); // force odd
-      while(!this.isProbablePrime(b)) {
-        this.dAddOffset(2,0);
-        if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
-      }
-    }
-  }
-  else {
-    // new BigInteger(int,RNG)
-    var x = new Array(), t = a&7;
-    x.length = (a>>3)+1;
-    b.nextBytes(x);
-    if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
-    this.fromString(x,256);
-  }
-}
-// (public) convert to bigendian byte array
-function bnToByteArray() {
-  var i = this.t, r = new Array();
-  r[0] = this.s;
-  var p = this.DB-(i*this.DB)%8, d, k = 0;
-  if(i-- > 0) {
-    if(p < this.DB && (d = this.data[i]>>p) != (this.s&this.DM)>>p)
-      r[k++] = d|(this.s<<(this.DB-p));
-    while(i >= 0) {
-      if(p < 8) {
-        d = (this.data[i]&((1<<p)-1))<<(8-p);
-        d |= this.data[--i]>>(p+=this.DB-8);
-      }
-      else {
-        d = (this.data[i]>>(p-=8))&0xff;
-        if(p <= 0) { p += this.DB; --i; }
-      }
-      if((d&0x80) != 0) d |= -256;
-      if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
-      if(k > 0 || d != this.s) r[k++] = d;
-    }
-  }
-  return r;
-}
-function bnEquals(a) { return(this.compareTo(a)==0); }
-function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
-function bnMax(a) { return(this.compareTo(a)>0)?this:a; }
-// (protected) r = this op a (bitwise)
-function bnpBitwiseTo(a,op,r) {
-  var i, f, m = Math.min(a.t,this.t);
-  for(i = 0; i < m; ++i) r.data[i] = op(this.data[i],a.data[i]);
-  if(a.t < this.t) {
-    f = a.s&this.DM;
-    for(i = m; i < this.t; ++i) r.data[i] = op(this.data[i],f);
-    r.t = this.t;
-  }
-  else {
-    f = this.s&this.DM;
-    for(i = m; i < a.t; ++i) r.data[i] = op(f,a.data[i]);
-    r.t = a.t;
-  }
-  r.s = op(this.s,a.s);
-  r.clamp();
-}
-// (public) this & a
-function op_and(x,y) { return x&y; }
-function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }
-// (public) this | a
-function op_or(x,y) { return x|y; }
-function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }
-// (public) this ^ a
-function op_xor(x,y) { return x^y; }
-function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }
-// (public) this & ~a
-function op_andnot(x,y) { return x&~y; }
-function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }
-// (public) ~this
-function bnNot() {
-  var r = nbi();
-  for(var i = 0; i < this.t; ++i) r.data[i] = this.DM&~this.data[i];
-  r.t = this.t;
-  r.s = ~this.s;
-  return r;
-}
-// (public) this << n
-function bnShiftLeft(n) {
-  var r = nbi();
-  if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
-  return r;
-}
-// (public) this >> n
-function bnShiftRight(n) {
-  var r = nbi();
-  if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
-  return r;
-}
-// return index of lowest 1-bit in x, x < 2^31
-function lbit(x) {
-  if(x == 0) return -1;
-  var r = 0;
-  if((x&0xffff) == 0) { x >>= 16; r += 16; }
-  if((x&0xff) == 0) { x >>= 8; r += 8; }
-  if((x&0xf) == 0) { x >>= 4; r += 4; }
-  if((x&3) == 0) { x >>= 2; r += 2; }
-  if((x&1) == 0) ++r;
-  return r;
-}
-// (public) returns index of lowest 1-bit (or -1 if none)
-function bnGetLowestSetBit() {
-  for(var i = 0; i < this.t; ++i)
-    if(this.data[i] != 0) return i*this.DB+lbit(this.data[i]);
-  if(this.s < 0) return this.t*this.DB;
-  return -1;
-}
-// return number of 1 bits in x
-function cbit(x) {
-  var r = 0;
-  while(x != 0) { x &= x-1; ++r; }
-  return r;
-}
-// (public) return number of set bits
-function bnBitCount() {
-  var r = 0, x = this.s&this.DM;
-  for(var i = 0; i < this.t; ++i) r += cbit(this.data[i]^x);
-  return r;
-}
-// (public) true iff nth bit is set
-function bnTestBit(n) {
-  var j = Math.floor(n/this.DB);
-  if(j >= this.t) return(this.s!=0);
-  return((this.data[j]&(1<<(n%this.DB)))!=0);
-}
-// (protected) this op (1<<n)
-function bnpChangeBit(n,op) {
-  var r = BigInteger.ONE.shiftLeft(n);
-  this.bitwiseTo(r,op,r);
-  return r;
-}
-// (public) this | (1<<n)
-function bnSetBit(n) { return this.changeBit(n,op_or); }
-// (public) this & ~(1<<n)
-function bnClearBit(n) { return this.changeBit(n,op_andnot); }
-// (public) this ^ (1<<n)
-function bnFlipBit(n) { return this.changeBit(n,op_xor); }
-// (protected) r = this + a
-function bnpAddTo(a,r) {
-  var i = 0, c = 0, m = Math.min(a.t,this.t);
-  while(i < m) {
-    c += this.data[i]+a.data[i];
-    r.data[i++] = c&this.DM;
-    c >>= this.DB;
-  }
-  if(a.t < this.t) {
-    c += a.s;
-    while(i < this.t) {
-      c += this.data[i];
-      r.data[i++] = c&this.DM;
-      c >>= this.DB;
-    }
-    c += this.s;
-  }
-  else {
-    c += this.s;
-    while(i < a.t) {
-      c += a.data[i];
-      r.data[i++] = c&this.DM;
-      c >>= this.DB;
-    }
-    c += a.s;
-  }
-  r.s = (c<0)?-1:0;
-  if(c > 0) r.data[i++] = c;
-  else if(c < -1) r.data[i++] = this.DV+c;
-  r.t = i;
-  r.clamp();
-}
-// (public) this + a
-function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }
-// (public) this - a
-function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }
-// (public) this * a
-function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }
-// (public) this^2
-function bnSquare() { var r = nbi(); this.squareTo(r); return r; }
-// (public) this / a
-function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }
-// (public) this % a
-function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }
-// (public) [this/a,this%a]
-function bnDivideAndRemainder(a) {
-  var q = nbi(), r = nbi();
-  this.divRemTo(a,q,r);
-  return new Array(q,r);
-}
-// (protected) this *= n, this >= 0, 1 < n < DV
-function bnpDMultiply(n) {
-  this.data[this.t] = this.am(0,n-1,this,0,0,this.t);
-  ++this.t;
-  this.clamp();
-}
-// (protected) this += n << w words, this >= 0
-function bnpDAddOffset(n,w) {
-  if(n == 0) return;
-  while(this.t <= w) this.data[this.t++] = 0;
-  this.data[w] += n;
-  while(this.data[w] >= this.DV) {
-    this.data[w] -= this.DV;
-    if(++w >= this.t) this.data[this.t++] = 0;
-    ++this.data[w];
-  }
-}
-// A "null" reducer
-/** @constructor */
-function NullExp() {}
-function nNop(x) { return x; }
-function nMulTo(x,y,r) { x.multiplyTo(y,r); }
-function nSqrTo(x,r) { x.squareTo(r); }
-NullExp.prototype.convert = nNop;
-NullExp.prototype.revert = nNop;
-NullExp.prototype.mulTo = nMulTo;
-NullExp.prototype.sqrTo = nSqrTo;
-// (public) this^e
-function bnPow(e) { return this.exp(e,new NullExp()); }
-// (protected) r = lower n words of "this * a", a.t <= n
-// "this" should be the larger one if appropriate.
-function bnpMultiplyLowerTo(a,n,r) {
-  var i = Math.min(this.t+a.t,n);
-  r.s = 0; // assumes a,this >= 0
-  r.t = i;
-  while(i > 0) r.data[--i] = 0;
-  var j;
-  for(j = r.t-this.t; i < j; ++i) r.data[i+this.t] = this.am(0,a.data[i],r,i,0,this.t);
-  for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a.data[i],r,i,0,n-i);
-  r.clamp();
-}
-// (protected) r = "this * a" without lower n words, n > 0
-// "this" should be the larger one if appropriate.
-function bnpMultiplyUpperTo(a,n,r) {
-  --n;
-  var i = r.t = this.t+a.t-n;
-  r.s = 0; // assumes a,this >= 0
-  while(--i >= 0) r.data[i] = 0;
-  for(i = Math.max(n-this.t,0); i < a.t; ++i)
-    r.data[this.t+i-n] = this.am(n-i,a.data[i],r,0,0,this.t+i-n);
-  r.clamp();
-  r.drShiftTo(1,r);
-}
-// Barrett modular reduction
-/** @constructor */
-function Barrett(m) {
-  // setup Barrett
-  this.r2 = nbi();
-  this.q3 = nbi();
-  BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
-  this.mu = this.r2.divide(m);
-  this.m = m;
-}
-function barrettConvert(x) {
-  if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
-  else if(x.compareTo(this.m) < 0) return x;
-  else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
-}
-function barrettRevert(x) { return x; }
-// x = x mod m (HAC 14.42)
-function barrettReduce(x) {
-  x.drShiftTo(this.m.t-1,this.r2);
-  if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
-  this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
-  this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
-  while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
-  x.subTo(this.r2,x);
-  while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
-}
-// r = x^2 mod m; x != r
-function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
-// r = x*y mod m; x,y != r
-function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
-Barrett.prototype.convert = barrettConvert;
-Barrett.prototype.revert = barrettRevert;
-Barrett.prototype.reduce = barrettReduce;
-Barrett.prototype.mulTo = barrettMulTo;
-Barrett.prototype.sqrTo = barrettSqrTo;
-// (public) this^e % m (HAC 14.85)
-function bnModPow(e,m) {
-  var i = e.bitLength(), k, r = nbv(1), z;
-  if(i <= 0) return r;
-  else if(i < 18) k = 1;
-  else if(i < 48) k = 3;
-  else if(i < 144) k = 4;
-  else if(i < 768) k = 5;
-  else k = 6;
-  if(i < 8)
-    z = new Classic(m);
-  else if(m.isEven())
-    z = new Barrett(m);
-  else
-    z = new Montgomery(m);
-  // precomputation
-  var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
-  g[1] = z.convert(this);
-  if(k > 1) {
-    var g2 = nbi();
-    z.sqrTo(g[1],g2);
-    while(n <= km) {
-      g[n] = nbi();
-      z.mulTo(g2,g[n-2],g[n]);
-      n += 2;
-    }
-  }
-  var j = e.t-1, w, is1 = true, r2 = nbi(), t;
-  i = nbits(e.data[j])-1;
-  while(j >= 0) {
-    if(i >= k1) w = (e.data[j]>>(i-k1))&km;
-    else {
-      w = (e.data[j]&((1<<(i+1))-1))<<(k1-i);
-      if(j > 0) w |= e.data[j-1]>>(this.DB+i-k1);
-    }
-    n = k;
-    while((w&1) == 0) { w >>= 1; --n; }
-    if((i -= n) < 0) { i += this.DB; --j; }
-    if(is1) { // ret == 1, don't bother squaring or multiplying it
-      g[w].copyTo(r);
-      is1 = false;
-    }
-    else {
-      while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
-      if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
-      z.mulTo(r2,g[w],r);
-    }
-    while(j >= 0 && (e.data[j]&(1<<i)) == 0) {
-      z.sqrTo(r,r2); t = r; r = r2; r2 = t;
-      if(--i < 0) { i = this.DB-1; --j; }
-    }
-  }
-  return z.revert(r);
-}
-// (public) gcd(this,a) (HAC 14.54)
-function bnGCD(a) {
-  var x = (this.s<0)?this.negate():this.clone();
-  var y = (a.s<0)?a.negate():a.clone();
-  if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
-  var i = x.getLowestSetBit(), g = y.getLowestSetBit();
-  if(g < 0) return x;
-  if(i < g) g = i;
-  if(g > 0) {
-    x.rShiftTo(g,x);
-    y.rShiftTo(g,y);
-  }
-  while(x.signum() > 0) {
-    if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
-    if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
-    if(x.compareTo(y) >= 0) {
-      x.subTo(y,x);
-      x.rShiftTo(1,x);
-    }
-    else {
-      y.subTo(x,y);
-      y.rShiftTo(1,y);
-    }
-  }
-  if(g > 0) y.lShiftTo(g,y);
-  return y;
-}
-// (protected) this % n, n < 2^26
-function bnpModInt(n) {
-  if(n <= 0) return 0;
-  var d = this.DV%n, r = (this.s<0)?n-1:0;
-  if(this.t > 0)
-    if(d == 0) r = this.data[0]%n;
-    else for(var i = this.t-1; i >= 0; --i) r = (d*r+this.data[i])%n;
-  return r;
-}
-// (public) 1/this % m (HAC 14.61)
-function bnModInverse(m) {
-  var ac = m.isEven();
-  if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
-  var u = m.clone(), v = this.clone();
-  var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
-  while(u.signum() != 0) {
-    while(u.isEven()) {
-      u.rShiftTo(1,u);
-      if(ac) {
-        if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
-        a.rShiftTo(1,a);
-      }
-      else if(!b.isEven()) b.subTo(m,b);
-      b.rShiftTo(1,b);
-    }
-    while(v.isEven()) {
-      v.rShiftTo(1,v);
-      if(ac) {
-        if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
-        c.rShiftTo(1,c);
-      }
-      else if(!d.isEven()) d.subTo(m,d);
-      d.rShiftTo(1,d);
-    }
-    if(u.compareTo(v) >= 0) {
-      u.subTo(v,u);
-      if(ac) a.subTo(c,a);
-      b.subTo(d,b);
-    }
-    else {
-      v.subTo(u,v);
-      if(ac) c.subTo(a,c);
-      d.subTo(b,d);
-    }
-  }
-  if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
-  if(d.compareTo(m) >= 0) return d.subtract(m);
-  if(d.signum() < 0) d.addTo(m,d); else return d;
-  if(d.signum() < 0) return d.add(m); else return d;
-}
-var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];
-var lplim = (1<<26)/lowprimes[lowprimes.length-1];
-// (public) test primality with certainty >= 1-.5^t
-function bnIsProbablePrime(t) {
-  var i, x = this.abs();
-  if(x.t == 1 && x.data[0] <= lowprimes[lowprimes.length-1]) {
-    for(i = 0; i < lowprimes.length; ++i)
-      if(x.data[0] == lowprimes[i]) return true;
-    return false;
-  }
-  if(x.isEven()) return false;
-  i = 1;
-  while(i < lowprimes.length) {
-    var m = lowprimes[i], j = i+1;
-    while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
-    m = x.modInt(m);
-    while(i < j) if(m%lowprimes[i++] == 0) return false;
-  }
-  return x.millerRabin(t);
-}
-// (protected) true if probably prime (HAC 4.24, Miller-Rabin)
-function bnpMillerRabin(t) {
-  var n1 = this.subtract(BigInteger.ONE);
-  var k = n1.getLowestSetBit();
-  if(k <= 0) return false;
-  var r = n1.shiftRight(k);
-  t = (t+1)>>1;
-  if(t > lowprimes.length) t = lowprimes.length;
-  var a = nbi();
-  for(var i = 0; i < t; ++i) {
-    // Pick bases at random, instead of starting at 2
-    a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);
-    var y = a.modPow(r,this);
-    if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
-      var j = 1;
-      while(j++ < k && y.compareTo(n1) != 0) {
-        y = y.modPowInt(2,this);
-        if(y.compareTo(BigInteger.ONE) == 0) return false;
-      }
-      if(y.compareTo(n1) != 0) return false;
-    }
-  }
-  return true;
-}
-// protected
-BigInteger.prototype.chunkSize = bnpChunkSize;
-BigInteger.prototype.toRadix = bnpToRadix;
-BigInteger.prototype.fromRadix = bnpFromRadix;
-BigInteger.prototype.fromNumber = bnpFromNumber;
-BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
-BigInteger.prototype.changeBit = bnpChangeBit;
-BigInteger.prototype.addTo = bnpAddTo;
-BigInteger.prototype.dMultiply = bnpDMultiply;
-BigInteger.prototype.dAddOffset = bnpDAddOffset;
-BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
-BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
-BigInteger.prototype.modInt = bnpModInt;
-BigInteger.prototype.millerRabin = bnpMillerRabin;
-// public
-BigInteger.prototype.clone = bnClone;
-BigInteger.prototype.intValue = bnIntValue;
-BigInteger.prototype.byteValue = bnByteValue;
-BigInteger.prototype.shortValue = bnShortValue;
-BigInteger.prototype.signum = bnSigNum;
-BigInteger.prototype.toByteArray = bnToByteArray;
-BigInteger.prototype.equals = bnEquals;
-BigInteger.prototype.min = bnMin;
-BigInteger.prototype.max = bnMax;
-BigInteger.prototype.and = bnAnd;
-BigInteger.prototype.or = bnOr;
-BigInteger.prototype.xor = bnXor;
-BigInteger.prototype.andNot = bnAndNot;
-BigInteger.prototype.not = bnNot;
-BigInteger.prototype.shiftLeft = bnShiftLeft;
-BigInteger.prototype.shiftRight = bnShiftRight;
-BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
-BigInteger.prototype.bitCount = bnBitCount;
-BigInteger.prototype.testBit = bnTestBit;
-BigInteger.prototype.setBit = bnSetBit;
-BigInteger.prototype.clearBit = bnClearBit;
-BigInteger.prototype.flipBit = bnFlipBit;
-BigInteger.prototype.add = bnAdd;
-BigInteger.prototype.subtract = bnSubtract;
-BigInteger.prototype.multiply = bnMultiply;
-BigInteger.prototype.divide = bnDivide;
-BigInteger.prototype.remainder = bnRemainder;
-BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
-BigInteger.prototype.modPow = bnModPow;
-BigInteger.prototype.modInverse = bnModInverse;
-BigInteger.prototype.pow = bnPow;
-BigInteger.prototype.gcd = bnGCD;
-BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
-// JSBN-specific extension
-BigInteger.prototype.square = bnSquare;
-// BigInteger interfaces not implemented in jsbn:
-// BigInteger(int signum, byte[] magnitude)
-// double doubleValue()
-// float floatValue()
-// int hashCode()
-// long longValue()
-// static BigInteger valueOf(long val)
-// customization for GHCJS
-BigInteger.prototype.am = am3;
-dbits = 28;
-DV = (1<<dbits);
-BigInteger.prototype.DB = dbits;
-BigInteger.prototype.DM = ((1<<dbits)-1);
-BigInteger.prototype.DV = (1<<dbits);
-BI_FP = 52;
-BigInteger.prototype.FV = Math.pow(2,BI_FP);
-BigInteger.prototype.F1 = BI_FP-dbits;
-BigInteger.prototype.F2 = 2*dbits-BI_FP;
-BigInteger.nbv = nbv;
-BigInteger.nbi = nbi;
-return BigInteger;
-})();
-// fixme prefix this
-var h$nbv = BigInteger.nbv;
-var h$nbi = BigInteger.nbi;
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-(function (global, undefined) {
-    "use strict";
-    if (global.setImmediate) {
-        return;
-    }
-    var nextHandle = 1; // Spec says greater than zero
-    var tasksByHandle = {};
-    var currentlyRunningATask = false;
-    var doc = global.document;
-    var setImmediate;
-    function addFromSetImmediateArguments(args) {
-        tasksByHandle[nextHandle] = partiallyApplied.apply(undefined, args);
-        return nextHandle++;
-    }
-    // This function accepts the same arguments as setImmediate, but
-    // returns a function that requires no arguments.
-    function partiallyApplied(handler) {
-        var args = [].slice.call(arguments, 1);
-        return function() {
-            if (typeof handler === "function") {
-                handler.apply(undefined, args);
-            } else {
-                (new Function("" + handler))();
-            }
-        };
-    }
-    function runIfPresent(handle) {
-        // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
-        // So if we're currently running a task, we'll need to delay this invocation.
-        if (currentlyRunningATask) {
-            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
-            // "too much recursion" error.
-            setTimeout(partiallyApplied(runIfPresent, handle), 0);
-        } else {
-            var task = tasksByHandle[handle];
-            if (task) {
-                currentlyRunningATask = true;
-                try {
-                    task();
-                } finally {
-                    clearImmediate(handle);
-                    currentlyRunningATask = false;
-                }
-            }
-        }
-    }
-    function clearImmediate(handle) {
-        delete tasksByHandle[handle];
-    }
-    function installNextTickImplementation() {
-        setImmediate = function() {
-            var handle = addFromSetImmediateArguments(arguments);
-            process.nextTick(partiallyApplied(runIfPresent, handle));
-            return handle;
-        };
-    }
-    function canUsePostMessage() {
-        // The test against `importScripts` prevents this implementation from being installed inside a web worker,
-        // where `global.postMessage` means something completely different and can't be used for this purpose.
-        if (global.postMessage && !global.importScripts) {
-            var postMessageIsAsynchronous = true;
-            var oldOnMessage = global.onmessage;
-            global.onmessage = function() {
-                postMessageIsAsynchronous = false;
-            };
-            global.postMessage("", "*");
-            global.onmessage = oldOnMessage;
-            return postMessageIsAsynchronous;
-        }
-    }
-    function installPostMessageImplementation() {
-        // Installs an event handler on `global` for the `message` event: see
-        // * https://developer.mozilla.org/en/DOM/window.postMessage
-        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
-        var messagePrefix = "setImmediate$" + Math.random() + "$";
-        var onGlobalMessage = function(event) {
-            if (event.source === global &&
-                typeof event.data === "string" &&
-                event.data.indexOf(messagePrefix) === 0) {
-                runIfPresent(+event.data.slice(messagePrefix.length));
-            }
-        };
-        if (global.addEventListener) {
-            global.addEventListener("message", onGlobalMessage, false);
-        } else {
-            global.attachEvent("onmessage", onGlobalMessage);
-        }
-        setImmediate = function() {
-            var handle = addFromSetImmediateArguments(arguments);
-            global.postMessage(messagePrefix + handle, "*");
-            return handle;
-        };
-    }
-    function installMessageChannelImplementation() {
-        var channel = new MessageChannel();
-        channel.port1.onmessage = function(event) {
-            var handle = event.data;
-            runIfPresent(handle);
-        };
-        setImmediate = function() {
-            var handle = addFromSetImmediateArguments(arguments);
-            channel.port2.postMessage(handle);
-            return handle;
-        };
-    }
-    function installReadyStateChangeImplementation() {
-        var html = doc.documentElement;
-        setImmediate = function() {
-            var handle = addFromSetImmediateArguments(arguments);
-            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
-            // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
-            var script = doc.createElement("script");
-            script.onreadystatechange = function () {
-                runIfPresent(handle);
-                script.onreadystatechange = null;
-                html.removeChild(script);
-                script = null;
-            };
-            html.appendChild(script);
-            return handle;
-        };
-    }
-    function installSetTimeoutImplementation() {
-        // jsshell doesn't even have setTimeout
-        if(typeof setTimeout === 'undefined') setImmediate = function() { return null; };
-        else
-          setImmediate = function() {
-            var handle = addFromSetImmediateArguments(arguments);
-            setTimeout(partiallyApplied(runIfPresent, handle), 0);
-            return handle;
-        };
-    }
-    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
-    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
-    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;
-    // Don't get fooled by e.g. browserify environments.
-    if ({}.toString.call(global.process) === "[object process]") {
-        // For Node.js before 0.9
-        installNextTickImplementation();
-    } else
-       if (canUsePostMessage()) {
-        // For non-IE10 modern browsers
-        installPostMessageImplementation();
-    } else if (global.MessageChannel) {
-        // For web workers, where supported
-        installMessageChannelImplementation();
-    } else if (doc && "onreadystatechange" in doc.createElement("script")) {
-        // For IE 6–8
-        installReadyStateChangeImplementation();
-    } else {
-        // For older browsers
-        installSetTimeoutImplementation();
-    }
-    attachTo.setImmediate = setImmediate;
-    attachTo.clearImmediate = clearImmediate;
-}(this));
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// Copyright 2009 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-/**
- * @fileoverview Defines a Long class for representing a 64-bit two's-complement
- * integer value, which faithfully simulates the behavior of a Java "long". This
- * implementation is derived from LongLib in GWT.
- *
- */
-goog.provide('goog.math.Long');
-/**
- * Constructs a 64-bit two's-complement integer, given its low and high 32-bit
- * values as *signed* integers.  See the from* functions below for more
- * convenient ways of constructing Longs.
- *
- * The internal representation of a long is the two given signed, 32-bit values.
- * We use 32-bit pieces because these are the size of integers on which
- * Javascript performs bit-operations.  For operations like addition and
- * multiplication, we split each number into 16-bit pieces, which can easily be
- * multiplied within Javascript's floating-point representation without overflow
- * or change in sign.
- *
- * In the algorithms below, we frequently reduce the negative case to the
- * positive case by negating the input(s) and then post-processing the result.
- * Note that we must ALWAYS check specially whether those values are MIN_VALUE
- * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
- * a positive number, it overflows back into a negative).  Not handling this
- * case would often result in infinite recursion.
- *
- * @param {number} low  The low (signed) 32 bits of the long.
- * @param {number} high  The high (signed) 32 bits of the long.
- * @struct
- * @constructor
- * @final
- */
-goog.math.Long = function(low, high) {
-  /**
-   * @type {number}
-   * @private
-   */
-  this.low_ = low | 0; // force into 32 signed bits.
-  /**
-   * @type {number}
-   * @private
-   */
-  this.high_ = high | 0; // force into 32 signed bits.
-};
-// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the
-// from* methods on which they depend.
-/**
- * A cache of the Long representations of small integer values.
- * @type {!Object}
- * @private
- */
-goog.math.Long.IntCache_ = {};
-/**
- * Returns a Long representing the given (32-bit) integer value.
- * @param {number} value The 32-bit integer in question.
- * @return {!goog.math.Long} The corresponding Long value.
- */
-goog.math.Long.fromInt = function(value) {
-  if (-128 <= value && value < 128) {
-    var cachedObj = goog.math.Long.IntCache_[value];
-    if (cachedObj) {
-      return cachedObj;
-    }
-  }
-  var obj = new goog.math.Long(value | 0, value < 0 ? -1 : 0);
-  if (-128 <= value && value < 128) {
-    goog.math.Long.IntCache_[value] = obj;
-  }
-  return obj;
-};
-/**
- * Returns a Long representing the given value, provided that it is a finite
- * number.  Otherwise, zero is returned.
- * @param {number} value The number in question.
- * @return {!goog.math.Long} The corresponding Long value.
- */
-goog.math.Long.fromNumber = function(value) {
-  if (isNaN(value) || !isFinite(value)) {
-    return goog.math.Long.ZERO;
-  } else if (value <= -goog.math.Long.TWO_PWR_63_DBL_) {
-    return goog.math.Long.MIN_VALUE;
-  } else if (value + 1 >= goog.math.Long.TWO_PWR_63_DBL_) {
-    return goog.math.Long.MAX_VALUE;
-  } else if (value < 0) {
-    return goog.math.Long.fromNumber(-value).negate();
-  } else {
-    return new goog.math.Long(
-        (value % goog.math.Long.TWO_PWR_32_DBL_) | 0,
-        (value / goog.math.Long.TWO_PWR_32_DBL_) | 0);
-  }
-};
-/**
- * Returns a Long representing the 64-bit integer that comes by concatenating
- * the given high and low bits.  Each is assumed to use 32 bits.
- * @param {number} lowBits The low 32-bits.
- * @param {number} highBits The high 32-bits.
- * @return {!goog.math.Long} The corresponding Long value.
- */
-goog.math.Long.fromBits = function(lowBits, highBits) {
-  return new goog.math.Long(lowBits, highBits);
-};
-/**
- * Returns a Long representation of the given string, written using the given
- * radix.
- * @param {string} str The textual representation of the Long.
- * @param {number=} opt_radix The radix in which the text is written.
- * @return {!goog.math.Long} The corresponding Long value.
- */
-goog.math.Long.fromString = function(str, opt_radix) {
-  if (str.length == 0) {
-    throw Error('number format error: empty string');
-  }
-  var radix = opt_radix || 10;
-  if (radix < 2 || 36 < radix) {
-    throw Error('radix out of range: ' + radix);
-  }
-  if (str.charAt(0) == '-') {
-    return goog.math.Long.fromString(str.substring(1), radix).negate();
-  } else if (str.indexOf('-') >= 0) {
-    throw Error('number format error: interior "-" character: ' + str);
-  }
-  // Do several (8) digits each time through the loop, so as to
-  // minimize the calls to the very expensive emulated div.
-  var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 8));
-  var result = goog.math.Long.ZERO;
-  for (var i = 0; i < str.length; i += 8) {
-    var size = Math.min(8, str.length - i);
-    var value = parseInt(str.substring(i, i + size), radix);
-    if (size < 8) {
-      var power = goog.math.Long.fromNumber(Math.pow(radix, size));
-      result = result.multiply(power).add(goog.math.Long.fromNumber(value));
-    } else {
-      result = result.multiply(radixToPower);
-      result = result.add(goog.math.Long.fromNumber(value));
-    }
-  }
-  return result;
-};
-// NOTE: the compiler should inline these constant values below and then remove
-// these variables, so there should be no runtime penalty for these.
-/**
- * Number used repeated below in calculations.  This must appear before the
- * first call to any from* function below.
- * @type {number}
- * @private
- */
-goog.math.Long.TWO_PWR_16_DBL_ = 1 << 16;
-/**
- * @type {number}
- * @private
- */
-goog.math.Long.TWO_PWR_24_DBL_ = 1 << 24;
-/**
- * @type {number}
- * @private
- */
-goog.math.Long.TWO_PWR_32_DBL_ =
-    goog.math.Long.TWO_PWR_16_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;
-/**
- * @type {number}
- * @private
- */
-goog.math.Long.TWO_PWR_31_DBL_ =
-    goog.math.Long.TWO_PWR_32_DBL_ / 2;
-/**
- * @type {number}
- * @private
- */
-goog.math.Long.TWO_PWR_48_DBL_ =
-    goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_16_DBL_;
-/**
- * @type {number}
- * @private
- */
-goog.math.Long.TWO_PWR_64_DBL_ =
-    goog.math.Long.TWO_PWR_32_DBL_ * goog.math.Long.TWO_PWR_32_DBL_;
-/**
- * @type {number}
- * @private
- */
-goog.math.Long.TWO_PWR_63_DBL_ =
-    goog.math.Long.TWO_PWR_64_DBL_ / 2;
-/** @type {!goog.math.Long} */
-goog.math.Long.ZERO = goog.math.Long.fromInt(0);
-/** @type {!goog.math.Long} */
-goog.math.Long.ONE = goog.math.Long.fromInt(1);
-/** @type {!goog.math.Long} */
-goog.math.Long.NEG_ONE = goog.math.Long.fromInt(-1);
-/** @type {!goog.math.Long} */
-goog.math.Long.MAX_VALUE =
-    goog.math.Long.fromBits(0xFFFFFFFF | 0, 0x7FFFFFFF | 0);
-/** @type {!goog.math.Long} */
-goog.math.Long.MIN_VALUE = goog.math.Long.fromBits(0, 0x80000000 | 0);
-/**
- * @type {!goog.math.Long}
- * @private
- */
-goog.math.Long.TWO_PWR_24_ = goog.math.Long.fromInt(1 << 24);
-/** @return {number} The value, assuming it is a 32-bit integer. */
-goog.math.Long.prototype.toInt = function() {
-  return this.low_;
-};
-/** @return {number} The closest floating-point representation to this value. */
-goog.math.Long.prototype.toNumber = function() {
-  return this.high_ * goog.math.Long.TWO_PWR_32_DBL_ +
-         this.getLowBitsUnsigned();
-};
-/**
- * @param {number=} opt_radix The radix in which the text should be written.
- * @return {string} The textual representation of this value.
- * @override
- */
-goog.math.Long.prototype.toString = function(opt_radix) {
-  var radix = opt_radix || 10;
-  if (radix < 2 || 36 < radix) {
-    throw Error('radix out of range: ' + radix);
-  }
-  if (this.isZero()) {
-    return '0';
-  }
-  if (this.isNegative()) {
-    if (this.equals(goog.math.Long.MIN_VALUE)) {
-      // We need to change the Long value before it can be negated, so we remove
-      // the bottom-most digit in this base and then recurse to do the rest.
-      var radixLong = goog.math.Long.fromNumber(radix);
-      var div = this.div(radixLong);
-      var rem = div.multiply(radixLong).subtract(this);
-      return div.toString(radix) + rem.toInt().toString(radix);
-    } else {
-      return '-' + this.negate().toString(radix);
-    }
-  }
-  // Do several (6) digits each time through the loop, so as to
-  // minimize the calls to the very expensive emulated div.
-  var radixToPower = goog.math.Long.fromNumber(Math.pow(radix, 6));
-  var rem = this;
-  var result = '';
-  while (true) {
-    var remDiv = rem.div(radixToPower);
-    var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt();
-    var digits = intval.toString(radix);
-    rem = remDiv;
-    if (rem.isZero()) {
-      return digits + result;
-    } else {
-      while (digits.length < 6) {
-        digits = '0' + digits;
-      }
-      result = '' + digits + result;
-    }
-  }
-};
-/** @return {number} The high 32-bits as a signed value. */
-goog.math.Long.prototype.getHighBits = function() {
-  return this.high_;
-};
-/** @return {number} The low 32-bits as a signed value. */
-goog.math.Long.prototype.getLowBits = function() {
-  return this.low_;
-};
-/** @return {number} The low 32-bits as an unsigned value. */
-goog.math.Long.prototype.getLowBitsUnsigned = function() {
-  return (this.low_ >= 0) ?
-      this.low_ : goog.math.Long.TWO_PWR_32_DBL_ + this.low_;
-};
-/**
- * @return {number} Returns the number of bits needed to represent the absolute
- *     value of this Long.
- */
-goog.math.Long.prototype.getNumBitsAbs = function() {
-  if (this.isNegative()) {
-    if (this.equals(goog.math.Long.MIN_VALUE)) {
-      return 64;
-    } else {
-      return this.negate().getNumBitsAbs();
-    }
-  } else {
-    var val = this.high_ != 0 ? this.high_ : this.low_;
-    for (var bit = 31; bit > 0; bit--) {
-      if ((val & (1 << bit)) != 0) {
-        break;
-      }
-    }
-    return this.high_ != 0 ? bit + 33 : bit + 1;
-  }
-};
-/** @return {boolean} Whether this value is zero. */
-goog.math.Long.prototype.isZero = function() {
-  return this.high_ == 0 && this.low_ == 0;
-};
-/** @return {boolean} Whether this value is negative. */
-goog.math.Long.prototype.isNegative = function() {
-  return this.high_ < 0;
-};
-/** @return {boolean} Whether this value is odd. */
-goog.math.Long.prototype.isOdd = function() {
-  return (this.low_ & 1) == 1;
-};
-/**
- * @param {goog.math.Long} other Long to compare against.
- * @return {boolean} Whether this Long equals the other.
- */
-goog.math.Long.prototype.equals = function(other) {
-  return (this.high_ == other.high_) && (this.low_ == other.low_);
-};
-/**
- * @param {goog.math.Long} other Long to compare against.
- * @return {boolean} Whether this Long does not equal the other.
- */
-goog.math.Long.prototype.notEquals = function(other) {
-  return (this.high_ != other.high_) || (this.low_ != other.low_);
-};
-/**
- * @param {goog.math.Long} other Long to compare against.
- * @return {boolean} Whether this Long is less than the other.
- */
-goog.math.Long.prototype.lessThan = function(other) {
-  return this.compare(other) < 0;
-};
-/**
- * @param {goog.math.Long} other Long to compare against.
- * @return {boolean} Whether this Long is less than or equal to the other.
- */
-goog.math.Long.prototype.lessThanOrEqual = function(other) {
-  return this.compare(other) <= 0;
-};
-/**
- * @param {goog.math.Long} other Long to compare against.
- * @return {boolean} Whether this Long is greater than the other.
- */
-goog.math.Long.prototype.greaterThan = function(other) {
-  return this.compare(other) > 0;
-};
-/**
- * @param {goog.math.Long} other Long to compare against.
- * @return {boolean} Whether this Long is greater than or equal to the other.
- */
-goog.math.Long.prototype.greaterThanOrEqual = function(other) {
-  return this.compare(other) >= 0;
-};
-/**
- * Compares this Long with the given one.
- * @param {goog.math.Long} other Long to compare against.
- * @return {number} 0 if they are the same, 1 if the this is greater, and -1
- *     if the given one is greater.
- */
-goog.math.Long.prototype.compare = function(other) {
-  if (this.equals(other)) {
-    return 0;
-  }
-  var thisNeg = this.isNegative();
-  var otherNeg = other.isNegative();
-  if (thisNeg && !otherNeg) {
-    return -1;
-  }
-  if (!thisNeg && otherNeg) {
-    return 1;
-  }
-  // at this point, the signs are the same, so subtraction will not overflow
-  if (this.subtract(other).isNegative()) {
-    return -1;
-  } else {
-    return 1;
-  }
-};
-/** @return {!goog.math.Long} The negation of this value. */
-goog.math.Long.prototype.negate = function() {
-  if (this.equals(goog.math.Long.MIN_VALUE)) {
-    return goog.math.Long.MIN_VALUE;
-  } else {
-    return this.not().add(goog.math.Long.ONE);
-  }
-};
-/**
- * Returns the sum of this and the given Long.
- * @param {goog.math.Long} other Long to add to this one.
- * @return {!goog.math.Long} The sum of this and the given Long.
- */
-goog.math.Long.prototype.add = function(other) {
-  // Divide each number into 4 chunks of 16 bits, and then sum the chunks.
-  var a48 = this.high_ >>> 16;
-  var a32 = this.high_ & 0xFFFF;
-  var a16 = this.low_ >>> 16;
-  var a00 = this.low_ & 0xFFFF;
-  var b48 = other.high_ >>> 16;
-  var b32 = other.high_ & 0xFFFF;
-  var b16 = other.low_ >>> 16;
-  var b00 = other.low_ & 0xFFFF;
-  var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
-  c00 += a00 + b00;
-  c16 += c00 >>> 16;
-  c00 &= 0xFFFF;
-  c16 += a16 + b16;
-  c32 += c16 >>> 16;
-  c16 &= 0xFFFF;
-  c32 += a32 + b32;
-  c48 += c32 >>> 16;
-  c32 &= 0xFFFF;
-  c48 += a48 + b48;
-  c48 &= 0xFFFF;
-  return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
-};
-/**
- * Returns the difference of this and the given Long.
- * @param {goog.math.Long} other Long to subtract from this.
- * @return {!goog.math.Long} The difference of this and the given Long.
- */
-goog.math.Long.prototype.subtract = function(other) {
-  return this.add(other.negate());
-};
-/**
- * Returns the product of this and the given long.
- * @param {goog.math.Long} other Long to multiply with this.
- * @return {!goog.math.Long} The product of this and the other.
- */
-goog.math.Long.prototype.multiply = function(other) {
-  if (this.isZero()) {
-    return goog.math.Long.ZERO;
-  } else if (other.isZero()) {
-    return goog.math.Long.ZERO;
-  }
-  if (this.equals(goog.math.Long.MIN_VALUE)) {
-    return other.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;
-  } else if (other.equals(goog.math.Long.MIN_VALUE)) {
-    return this.isOdd() ? goog.math.Long.MIN_VALUE : goog.math.Long.ZERO;
-  }
-  if (this.isNegative()) {
-    if (other.isNegative()) {
-      return this.negate().multiply(other.negate());
-    } else {
-      return this.negate().multiply(other).negate();
-    }
-  } else if (other.isNegative()) {
-    return this.multiply(other.negate()).negate();
-  }
-  // If both longs are small, use float multiplication
-  if (this.lessThan(goog.math.Long.TWO_PWR_24_) &&
-      other.lessThan(goog.math.Long.TWO_PWR_24_)) {
-    return goog.math.Long.fromNumber(this.toNumber() * other.toNumber());
-  }
-  // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
-  // We can skip products that would overflow.
-  var a48 = this.high_ >>> 16;
-  var a32 = this.high_ & 0xFFFF;
-  var a16 = this.low_ >>> 16;
-  var a00 = this.low_ & 0xFFFF;
-  var b48 = other.high_ >>> 16;
-  var b32 = other.high_ & 0xFFFF;
-  var b16 = other.low_ >>> 16;
-  var b00 = other.low_ & 0xFFFF;
-  var c48 = 0, c32 = 0, c16 = 0, c00 = 0;
-  c00 += a00 * b00;
-  c16 += c00 >>> 16;
-  c00 &= 0xFFFF;
-  c16 += a16 * b00;
-  c32 += c16 >>> 16;
-  c16 &= 0xFFFF;
-  c16 += a00 * b16;
-  c32 += c16 >>> 16;
-  c16 &= 0xFFFF;
-  c32 += a32 * b00;
-  c48 += c32 >>> 16;
-  c32 &= 0xFFFF;
-  c32 += a16 * b16;
-  c48 += c32 >>> 16;
-  c32 &= 0xFFFF;
-  c32 += a00 * b32;
-  c48 += c32 >>> 16;
-  c32 &= 0xFFFF;
-  c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
-  c48 &= 0xFFFF;
-  return goog.math.Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);
-};
-/**
- * Returns this Long divided by the given one.
- * @param {goog.math.Long} other Long by which to divide.
- * @return {!goog.math.Long} This Long divided by the given one.
- */
-goog.math.Long.prototype.div = function(other) {
-  if (other.isZero()) {
-    throw Error('division by zero');
-  } else if (this.isZero()) {
-    return goog.math.Long.ZERO;
-  }
-  if (this.equals(goog.math.Long.MIN_VALUE)) {
-    if (other.equals(goog.math.Long.ONE) ||
-        other.equals(goog.math.Long.NEG_ONE)) {
-      return goog.math.Long.MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE
-    } else if (other.equals(goog.math.Long.MIN_VALUE)) {
-      return goog.math.Long.ONE;
-    } else {
-      // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
-      var halfThis = this.shiftRight(1);
-      var approx = halfThis.div(other).shiftLeft(1);
-      if (approx.equals(goog.math.Long.ZERO)) {
-        return other.isNegative() ? goog.math.Long.ONE : goog.math.Long.NEG_ONE;
-      } else {
-        var rem = this.subtract(other.multiply(approx));
-        var result = approx.add(rem.div(other));
-        return result;
-      }
-    }
-  } else if (other.equals(goog.math.Long.MIN_VALUE)) {
-    return goog.math.Long.ZERO;
-  }
-  if (this.isNegative()) {
-    if (other.isNegative()) {
-      return this.negate().div(other.negate());
-    } else {
-      return this.negate().div(other).negate();
-    }
-  } else if (other.isNegative()) {
-    return this.div(other.negate()).negate();
-  }
-  // Repeat the following until the remainder is less than other:  find a
-  // floating-point that approximates remainder / other *from below*, add this
-  // into the result, and subtract it from the remainder.  It is critical that
-  // the approximate value is less than or equal to the real value so that the
-  // remainder never becomes negative.
-  var res = goog.math.Long.ZERO;
-  var rem = this;
-  while (rem.greaterThanOrEqual(other)) {
-    // Approximate the result of division. This may be a little greater or
-    // smaller than the actual value.
-    var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));
-    // We will tweak the approximate result by changing it in the 48-th digit or
-    // the smallest non-fractional digit, whichever is larger.
-    var log2 = Math.ceil(Math.log(approx) / Math.LN2);
-    var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);
-    // Decrease the approximation until it is smaller than the remainder.  Note
-    // that if it is too large, the product overflows and is negative.
-    var approxRes = goog.math.Long.fromNumber(approx);
-    var approxRem = approxRes.multiply(other);
-    while (approxRem.isNegative() || approxRem.greaterThan(rem)) {
-      approx -= delta;
-      approxRes = goog.math.Long.fromNumber(approx);
-      approxRem = approxRes.multiply(other);
-    }
-    // We know the answer can't be zero... and actually, zero would cause
-    // infinite recursion since we would make no progress.
-    if (approxRes.isZero()) {
-      approxRes = goog.math.Long.ONE;
-    }
-    res = res.add(approxRes);
-    rem = rem.subtract(approxRem);
-  }
-  return res;
-};
-/**
- * Returns this Long modulo the given one.
- * @param {goog.math.Long} other Long by which to mod.
- * @return {!goog.math.Long} This Long modulo the given one.
- */
-goog.math.Long.prototype.modulo = function(other) {
-  return this.subtract(this.div(other).multiply(other));
-};
-/** @return {!goog.math.Long} The bitwise-NOT of this value. */
-goog.math.Long.prototype.not = function() {
-  return goog.math.Long.fromBits(~this.low_, ~this.high_);
-};
-/**
- * Returns the bitwise-AND of this Long and the given one.
- * @param {goog.math.Long} other The Long with which to AND.
- * @return {!goog.math.Long} The bitwise-AND of this and the other.
- */
-goog.math.Long.prototype.and = function(other) {
-  return goog.math.Long.fromBits(this.low_ & other.low_,
-                                 this.high_ & other.high_);
-};
-/**
- * Returns the bitwise-OR of this Long and the given one.
- * @param {goog.math.Long} other The Long with which to OR.
- * @return {!goog.math.Long} The bitwise-OR of this and the other.
- */
-goog.math.Long.prototype.or = function(other) {
-  return goog.math.Long.fromBits(this.low_ | other.low_,
-                                 this.high_ | other.high_);
-};
-/**
- * Returns the bitwise-XOR of this Long and the given one.
- * @param {goog.math.Long} other The Long with which to XOR.
- * @return {!goog.math.Long} The bitwise-XOR of this and the other.
- */
-goog.math.Long.prototype.xor = function(other) {
-  return goog.math.Long.fromBits(this.low_ ^ other.low_,
-                                 this.high_ ^ other.high_);
-};
-/**
- * Returns this Long with bits shifted to the left by the given amount.
- * @param {number} numBits The number of bits by which to shift.
- * @return {!goog.math.Long} This shifted to the left by the given amount.
- */
-goog.math.Long.prototype.shiftLeft = function(numBits) {
-  numBits &= 63;
-  if (numBits == 0) {
-    return this;
-  } else {
-    var low = this.low_;
-    if (numBits < 32) {
-      var high = this.high_;
-      return goog.math.Long.fromBits(
-          low << numBits,
-          (high << numBits) | (low >>> (32 - numBits)));
-    } else {
-      return goog.math.Long.fromBits(0, low << (numBits - 32));
-    }
-  }
-};
-/**
- * Returns this Long with bits shifted to the right by the given amount.
- * @param {number} numBits The number of bits by which to shift.
- * @return {!goog.math.Long} This shifted to the right by the given amount.
- */
-goog.math.Long.prototype.shiftRight = function(numBits) {
-  numBits &= 63;
-  if (numBits == 0) {
-    return this;
-  } else {
-    var high = this.high_;
-    if (numBits < 32) {
-      var low = this.low_;
-      return goog.math.Long.fromBits(
-          (low >>> numBits) | (high << (32 - numBits)),
-          high >> numBits);
-    } else {
-      return goog.math.Long.fromBits(
-          high >> (numBits - 32),
-          high >= 0 ? 0 : -1);
-    }
-  }
-};
-/**
- * Returns this Long with bits shifted to the right by the given amount, with
- * zeros placed into the new leading bits.
- * @param {number} numBits The number of bits by which to shift.
- * @return {!goog.math.Long} This shifted to the right by the given amount, with
- *     zeros placed into the new leading bits.
- */
-goog.math.Long.prototype.shiftRightUnsigned = function(numBits) {
-  numBits &= 63;
-  if (numBits == 0) {
-    return this;
-  } else {
-    var high = this.high_;
-    if (numBits < 32) {
-      var low = this.low_;
-      return goog.math.Long.fromBits(
-          (low >>> numBits) | (high << (32 - numBits)),
-          high >>> numBits);
-    } else if (numBits == 32) {
-      return goog.math.Long.fromBits(high, 0);
-    } else {
-      return goog.math.Long.fromBits(high >>> (numBits - 32), 0);
-    }
-  }
-};
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-/*
-  simple set with reasonably fast iteration though an array, which may contain nulls
-  elements must be objects that have a unique _key property
-  collections are expected to be homogeneous
-
-  when iterating over a set with an iterator, the following operations are safe:
-
-   - adding an element to the set (the existing iterator will iterate over the new elements)
-   - removing the last returned element through the iterator
-
-   behaviour for deleting elements is unpredictable and unsafe
-*/
-/** @constructor */
-function h$Set(s) {
-    this._vals = [];
-    this._keys = [];
-    this._size = 0;
-}
-h$Set.prototype.size = function() {
-    return this._size;
-}
-h$Set.prototype.add = function(o) {
-    if((typeof o !== 'object' && typeof o !== 'function') || typeof o._key !== 'number') throw ("h$Set.add: invalid element: " + o);
-    if(this._size > 0) {
-//        if(this._storedProto !== o.prototype) throw ("h$Set.add: unexpected element prototype: " + o)
-    } else {
-        this._storedProto = o.prototype;
-    }
-    if(this._keys[o._key] !== undefined && this._vals[this._keys[o._key]] !== o) throw ("h$Set.add: duplicate key: " + o);
-    var k = this._keys, v = this._vals;
-    if(k[o._key] === undefined) {
-        k[o._key] = this._size;
-        v[this._size++] = o;
-    }
-}
-h$Set.prototype.remove = function(o) {
-    if(this._size === 0) return;
-    var k = this._keys, v = this._vals, x = k[o._key];
-    if(x !== undefined) {
-        delete k[o._key];
-        var ls = --this._size;
-        if(ls !== x) {
-            var l = v[ls];
-            v[x] = l;
-            k[l._key] = x;
-        }
-        v[ls] = null;
-        if(v.length > 10 && 2 * v.length > 3 * ls) this._vals = v.slice(0, ls);
-    }
-}
-h$Set.prototype.has = function(o) {
-    return this._keys[o._key] !== undefined;
-}
-h$Set.prototype.clear = function() {
-    if(this._size > 0) {
- this._keys = [];
- this._vals = [];
- this._size = 0;
-    }
-}
-h$Set.prototype.iter = function() {
-    return new h$SetIter(this);
-}
-// returns an array with all values, might contain additional nulls at the end
-h$Set.prototype.values = function() {
-    return this._vals;
-}
-/** @constructor */
-function h$SetIter(s) {
-    this._n = 0;
-    this._s = s;
-    this._r = true;
-}
-h$SetIter.prototype.next = function() {
-    if(this._n < this._s._size) {
-        this._r = false;
-        return this._s._vals[this._n++];
-    } else {
-        this._r = true;
-        return null;
-    }
-}
-h$SetIter.prototype.peek = function() {
-    if(this._n < this._s._size) {
-        return this._s.vals[this._n];
-    } else {
-        return null;
-    }
-}
-// remove the last element returned
-h$SetIter.prototype.remove = function() {
-    if(!this._r) {
-        this._s.remove(this._s._vals[--this._n]);
-        this._r = true;
-    }
-}
-/*
-  map, iteration restrictions are the same as for set
-  keys need to be objects with a unique _key property
-
-  keys are expected to have the same prototype
-
-  values may be anything (but note that the values array might have additional nulls)
-*/
-/** @constructor */
-function h$Map() {
-    this._pairsKeys = [];
-    this._pairsValues = [];
-    this._keys = [];
-    this._size = 0;
-}
-h$Map.prototype.size = function() {
-    return this._size;
-}
-h$Map.prototype.put = function(k,v) {
-    if((typeof k !== 'object' && typeof k !== 'function') || typeof k._key !== 'number') throw ("h$Map.add: invalid key: " + k);
-    if(this._size > 0) {
-        if(this._storedProto !== k.prototype) throw ("h$Map.add: unexpected key prototype: " + k)
-    } else {
-        this._storedProto = k.prototype;
-    }
-    if(this._keys[k._key] !== undefined && this._pairsKeys[this._keys[k._key]] !== k) throw ("h$Map.add: duplicate key: " + k);
-    var ks = this._keys, pk = this._pairsKeys, pv = this._pairsValues, x = ks[k._key];
-    if(x === undefined) {
-        var n = this._size++;
-        ks[k._key] = n;
-        pk[n] = k;
-        pv[n] = v;
-    } else {
-        pv[x] = v;
-    }
-}
-h$Map.prototype.remove = function(k) {
-    var kk = k._key, ks = this._keys, pk = this._pairsKeys, pv = this._pairsValues, x = ks[kk];
-    if(x !== undefined) {
-        delete ks[kk];
-        var ss = --this._size;
-        if(ss !== x) {
-            pks = pk[ss];
-            pk[x] = pks;
-            pv[x] = pv[ss];
-            ks[pks._key] = x;
-        }
-        pv[ss] = null;
-        pk[ss] = null;
-        if(pk.length > 10 && 2 * pk.length > 3 * this._size) {
-            this._pairsKeys = pk.slice(0,ss);
-            this._pairsValues = pv.slice(0,ss);
-        }
-    }
-}
-h$Map.prototype.has = function(k) {
-    return this._keys[k._key] !== undefined;
-}
-h$Map.prototype.get = function(k) {
-    var n = this._keys[k._key];
-    if(n !== undefined) {
-        return this._pairsValues[n];
-    } else {
-        return null;
-    }
-}
-h$Map.prototype.iter = function() {
-    return new h$MapIter(this);
-}
-// returned array might have some trailing nulls
-h$Map.prototype.keys = function () {
-    return this._pairsKeys;
-}
-// returned array might have some trailing nulls
-h$Map.prototype.values = function() {
-    return this._pairsValues;
-}
-/** @constructor */
-function h$MapIter(m) {
-    this._n = 0;
-    this._m = m;
-}
-h$MapIter.prototype.next = function() {
-    return this._n < this._m._size ? this._m._pairsKeys[this._n++] : null;
-}
-h$MapIter.prototype.nextVal = function() {
-    return this._n < this._m._size ? this._m._pairsValues[this._n++] : null;
-}
-h$MapIter.prototype.peek = function() {
-    return this._n < this._m._size ? this._m._pairsKeys[this._n] : null;
-}
-h$MapIter.prototype.peekVal = function() {
-    return this._n < this._m._size ? this._m._pairsValues[this._n] : null;
-}
-/*
-  simple queue, returns null when empty
-  it's safe to enqueue new items while iterating, not safe to dequeue
-  (new items will not be iterated over)
-*/
-/** @constructor */
-function h$Queue() {
-    var b = { b: [], n: null };
-    this._blocks = 1;
-    this._first = b;
-    this._fp = 0;
-    this._last = b;
-    this._lp = 0;
-}
-h$Queue.prototype.length = function() {
-    return 1000 * (this._blocks - 1) + this._lp - this._fp;
-}
-h$Queue.prototype.isEmpty = function() {
-    return this._blocks === 1 && this._lp >= this._fp;
-}
-h$Queue.prototype.enqueue = function(o) {
-    if(this._lp === 1000) {
-        var newBlock = { b: [o], n: null };
-        this._blocks++;
-        this._last.n = newBlock;
-        this._last = newBlock;
-        this._lp = 1;
-    } else {
-        this._last.b[this._lp++] = o;
-    }
-}
-h$Queue.prototype.dequeue = function() {
-    if(this._blocks === 1 && this._fp >= this._lp) {
-        return null;
-    } else {
-        var qfb = this._first.b, r = qfb[this._fp];
-        qfb[this._fp] = null;
-        if(++this._fp === 1000) {
-            if(this._blocks === 1) {
-                this._lp = 0;
-            } else {
-                this._blocks--;
-                this._first = this._first.n;
-            }
-            this._fp = 0;
-        } else if(this._blocks === 1 && this._fp >= this._lp) {
-            this._lp = this._fp = 0;
-        }
-        return r;
-    }
-}
-h$Queue.prototype.peek = function() {
-    if(this._blocks === 0 || (this._blocks === 1 && this._fp >= this._lp)) {
-        return null;
-    } else {
-        return this._first.b[this._fp];
-    }
-}
-h$Queue.prototype.iter = function() {
-    var b = this._first, bp = this._fp, lb = this._last, lp = this._lp;
-    return function() {
-        if(b === null || (b === lb && bp >= lp)) {
-            return null;
-        } else {
-            var r = b.b[bp];
-            if(++bp === 1000) {
-                b = b.n;
-                bp = 0;
-                if(b === null) lb = null;
-            }
-            return r;
-        }
-    }
-}
-/*
-   binary min-heap / set
-   - iteration is not in order of priority
-   - values can be removed, need to have the ._key property
-*/
-/** @constructor */
-function h$HeapSet() {
-    this._keys = [];
-    this._prios = [];
-    this._vals = [];
-    this._size = 0;
-}
-h$HeapSet.prototype.size = function() {
-    return this._size;
-}
-// add a node, if it already exists, it's moved to the new priority
-h$HeapSet.prototype.add = function(op,o) {
-    if((typeof o !== 'object' && typeof o !== 'function') || typeof o._key !== 'number') throw ("h$HeapSet.add: invalid element: " + o);
-    if(this._size > 0) {
-        if(this._storedProto !== o.prototype) throw ("h$HeapSet.add: unexpected element prototype: " + o)
-    } else {
-        this._storedProto = o.prototype;
-    }
-    if(this._keys[o._key] !== undefined && this._vals[this._keys[o._key]] !== o) throw ("h$Set.add: duplicate key: " + o);
-    var p = this._prios, k = this._keys, v = this._vals, x = k[o._key];
-    if(x !== undefined) { // adjust node
-        var oop = p[x];
-        if(oop !== op) {
-            p[x] = op;
-            if(op < oop) {
-                this._upHeap(x);
-            } else {
-                this._downHeap(x);
-            }
-        }
-    } else { // new node
-        var s = this._size++;
-        k[o._key] = s;
-        p[s] = op;
-        v[s] = o;
-        this._upHeap(s);
-    }
-}
-h$HeapSet.prototype.has = function(o) {
-    return this._keys[o._key] !== undefined;
-}
-h$HeapSet.prototype.prio = function(o) {
-    var x = this._keys[o._key];
-    if(x !== undefined) {
-        return this._prios[x];
-    } else {
-        return null;
-    }
-}
-h$HeapSet.prototype.peekPrio = function() {
-    return this._size > 0 ? this._prios[0] : null;
-}
-h$HeapSet.prototype.peek = function() {
-    return this._size > 0 ? this._vals[0] : null;
-}
-h$HeapSet.prototype.pop = function() {
-    if(this._size > 0) {
-        var v = this._vals[0];
-        this._removeNode(0);
-        return v;
-    } else {
-        return null;
-    }
-}
-h$HeapSet.prototype.remove = function(o) {
-    var x = this._keys[o._key];
-    if(x !== undefined) this._removeNode(x);
-}
-h$HeapSet.prototype.iter = function() {
-    var n = 0, v = this._vals, s = this._size;
-    return function() {
-        return n < s ? v[n++] : null;
-    }
-}
-// may be longer than this.size(), remainder is filled with nulls
-h$HeapSet.prototype.values = function() {
-    return this._vals;
-}
-h$HeapSet.prototype._removeNode = function(i) {
-    var p = this._prios, v = this._vals, s = --this._size, k = this._keys;
-    delete k[v[i]._key];
-    if(i !== s) {
-        v[i] = v[s];
-        p[i] = p[s];
-        k[v[i]._key] = i;
-    }
-    v[s] = null;
-    p[s] = null;
-    this._downHeap(i,s);
-}
-h$HeapSet.prototype._downHeap = function(i,s) {
-    var p = this._prios, v = this._vals, k = this._keys;
-    var j,l,r,ti,tj;
-    while(true) {
-        j = i, r = 2*(i+1), l = r-1;
-        if(l < s && p[l] < p[i]) i = l;
-        if(r < s && p[r] < p[i]) i = r;
-        if(i !== j) {
-            ti = v[i];
-            tj = v[j];
-            v[j] = ti;
-            v[i] = tj;
-            k[ti._key] = j;
-            k[tj._key] = i;
-            ti = p[i];
-            p[i] = p[j];
-            p[j] = ti;
-        } else {
-            break;
-        }
-    }
-}
-h$HeapSet.prototype._upHeap = function(i) {
-    var ti, tj, j, p = this._prios, v = this._vals, k = this._keys;
-    while(i !== 0) {
-        j = (i-1) >> 1;
-        if(p[i] < p[j]) {
-            ti = v[i];
-            tj = v[j];
-            v[j] = ti;
-            v[i] = tj;
-            k[ti._key] = j;
-            k[tj._key] = i;
-            ti = p[i];
-            p[i] = p[j];
-            p[j] = ti;
-            i = j;
-        } else {
-            break;
-        }
-    }
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// #define GHCJS_TRACE_META 1
-// memory management and pointer emulation
-// static init, non-caf
-function h$sti(i,c,xs) {
-    i.f = c;
-    h$init_closure(i,xs);
-}
-// static init, caf
-function h$stc(i,c) {
-    i.f = c;
-    h$init_closure(i,[]);
-    h$CAFs.push(i);
-    h$CAFsReset.push(i.f);
-}
-function h$stl(o, xs, t) {
-    var r = t ? t : h$ghczmprimZCGHCziTypesziZMZN;
-    var x;
-    if(xs.length > 0) {
-        for(var i=xs.length-1;i>=0;i--) {
-            x = xs[i];
-            if(!x && x !== false && x !== 0) throw "h$toHsList: invalid element";
-            r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (x), (r)));
-        }
-    }
-    // fixme direct object manip
-    o.f = r.f;
-    o.d1 = r.d1;
-    o.d2 = r.d2;
-    o.m = r.m;
-}
-// some utilities for constructing common objects from JS in the RTS or foreign code.
-// when profiling, the current ccs is assigned
-// #ifdef GHCJS_PROF
-// var h$nil = h$c(h$ghczmprimZCGHCziTypesziZMZN_con_e, h$CCS_SYSTEM);
-// #else
-// var h$nil = h$c(h$ghczmprimZCGHCziTypesziZMZN_con_e);
-// #endif
-// #ifdef GHCJS_PROF
-// var h$nothing = h$c(h$baseZCGHCziBaseziNothing_con_e, h$CCS_SYSTEM);
-// #else
-//var h$nothing = h$c(h$baseZCGHCziBaseziNothing_con_e);
-// #endif
-// delayed init for top-level closures
-var h$staticDelayed = [];
-function h$d() {
-    var c = h$c(null);
-    h$staticDelayed.push(c);
-    return c;
-}
-var h$allocN = 0;
-function h$traceAlloc(x) {
-    h$log("allocating: " + (++h$allocN));
-    x.alloc = h$allocN;
-}
-// fixme remove this when we have a better way to immediately init these things
-function h$di(c) {
-    h$staticDelayed.push(c);
-}
-// initialize global object to primitive value
-function h$p(x) {
-    h$staticDelayed.push(x);
-    return x;
-}
-var h$entriesStack = [];
-var h$staticsStack = [];
-var h$labelsStack = [];
-function h$scheduleInit(entries, objs, lbls, infos, statics) {
-    var d = h$entriesStack.length;
-    h$entriesStack.push(entries);
-    h$staticsStack.push(objs);
-    h$labelsStack.push(lbls);
-    h$initStatic.push(function() {
-        h$initInfoTables(d, entries, objs, lbls, infos, statics);
-    });
-}
-function h$runInitStatic() {
-    if(h$initStatic.length > 0) {
-        for(var i=h$initStatic.length - 1;i>=0;i--) {
-            h$initStatic[i]();
-        }
-        h$initStatic = [];
-    }
-    // free the references to the temporary tables used for
-    // initialising all our static data
-    h$entriesStack = null;
-    h$staticsStack = null;
-}
-// initialize packed info tables
-// see Gen2.Compactor for how the data is encoded
-function h$initInfoTables ( depth // depth in the base chain
-                          , funcs // array with all entry functions
-                          , objects // array with all the global heap objects
-                          , lbls // array with non-haskell labels
-                          , infoMeta // packed info
-                          , infoStatic
-                          ) {
-  ;
-  var n, i, j, o, pos = 0, info;
-  function code(c) {
-    if(c < 34) return c - 32;
-    if(c < 92) return c - 33;
-    return c - 34;
-  }
-  function next() {
-    var c = info.charCodeAt(pos);
-    if(c < 124) {
-      ;
-      pos++;
-      return code(c);
-    }
-    if(c === 124) {
-      pos+=3;
-      var r = 90 + 90 * code(info.charCodeAt(pos-2))
-                  + code(info.charCodeAt(pos-1));
-      ;
-      return r;
-    }
-    if(c === 125) {
-      pos+=4;
-      var r = 8190 + 8100 * code(info.charCodeAt(pos-3))
-                   + 90 * code(info.charCodeAt(pos-2))
-                   + code(info.charCodeAt(pos-1));
-      ;
-      return r;
-    }
-    throw ("h$initInfoTables: invalid code in info table: " + c + " at " + pos)
-  }
-  function nextCh() {
-        return next(); // fixme map readable chars
-  }
-    function nextInt() {
-        var n = next();
-        var r;
-        if(n === 0) {
-            var n1 = next();
-            var n2 = next();
-            r = n1 << 16 | n2;
-        } else {
-            r = n - 12;
-        }
-        ;
-        return r;
-    }
-    function nextSignificand() {
-        var n = next();
-        var n1, n2, n3, n4, n5;
-        var r;
-        if(n < 2) {
-            n1 = next();
-            n2 = next();
-            n3 = next();
-            n4 = next();
-            n5 = n1 * 281474976710656 + n2 * 4294967296 + n3 * 65536 + n4;
-            r = n === 0 ? -n5 : n5;
-        } else {
-            r = n - 12;
-        }
-        ;
-        return r;
-    }
-    function nextEntry(o) { return nextIndexed("nextEntry", h$entriesStack, o); }
-    function nextObj(o) { return nextIndexed("nextObj", h$staticsStack, o); }
-    function nextLabel(o) { return nextIndexed("nextLabel", h$labelsStack, o); }
-    function nextIndexed(msg, stack, o) {
-        var n = (o === undefined) ? next() : o;
-        var i = depth;
-        while(n > stack[i].length) {
-            n -= stack[i].length;
-            i--;
-            if(i < 0) throw (msg + ": cannot find item " + n + ", stack length: " + stack.length + " depth: " + depth);
-        }
-        return stack[i][n];
-    }
-    function nextArg() {
-        var o = next();
-        var n, n1, n2;
-        switch(o) {
-        case 0:
-            ;
-            return false;
-        case 1:
-            ;
-            return true;
-        case 2:
-            ;
-            return 0;
-        case 3:
-            ;
-            return 1;
-        case 4:
-            ;
-            return nextInt();
-        case 5:
-            ;
-            return null;
-        case 6:
-            ;
-            n = next();
-            switch(n) {
-            case 0:
-                return -0.0;
-            case 1:
-                return 0.0;
-            case 2:
-                return 1/0;
-            case 3:
-                return -1/0;
-            case 4:
-                return 0/0;
-            case 5:
-                n1 = nextInt();
-                return nextSignificand() * Math.pow(2, n1)
-            default:
-                n1 = n - 36;
-                return nextSignificand() * Math.pow(2, n1);
-            }
-        case 7:
-     ;
-     // no break, strings are UTF8 encoded binary
-        case 8:
-            ;
-            n = next();
-            var ba = h$newByteArray(n);
-            var b8 = ba.u8;
-            var p = 0;
-            while(n > 0) {
-                switch(n) {
-                case 1:
-                    d0 = next();
-                    d1 = next();
-                    b8[p] = ((d0 << 2) | (d1 >> 4));
-                    break;
-                case 2:
-                    d0 = next();
-                    d1 = next();
-                    d2 = next();
-                    b8[p++] = ((d0 << 2) | (d1 >> 4));
-                    b8[p] = ((d1 << 4) | (d2 >> 2));
-                    break;
-                default:
-                    d0 = next();
-                    d1 = next();
-                    d2 = next();
-                    d3 = next();
-                    b8[p++] = ((d0 << 2) | (d1 >> 4));
-                    b8[p++] = ((d1 << 4) | (d2 >> 2));
-                    b8[p++] = ((d2 << 6) | d3);
-                    break;
-                }
-                n -= 3;
-            }
-            return ba;
-        case 9:
-            var isFun = next() === 1;
-            var lbl = nextLabel();
-            return h$initPtrLbl(isFun, lbl);
-        case 10:
-            var c = { f: nextEntry(), d1: null, d2: null, m: 0 };
-            var n = next();
-            var args = [];
-            while(n--) {
-                args.push(nextArg());
-            }
-            return h$init_closure(c, args);
-        default:
-            ;
-            return nextObj(o-11);
-        }
-    }
-    info = infoMeta; pos = 0;
-  for(i=0;i<funcs.length;i++) {
-    o = funcs[i];
-    var ot;
-    var oa = 0;
-    var oregs = 256; // one register no skip
-    switch(next()) {
-      case 0: // thunk
-        ot = 0;
-        break;
-      case 1: // fun
-        ot = 1
-        var arity = next();
-        var skipRegs = next()-1;
-        if(skipRegs === -1) throw "h$initInfoTables: unknown register info for function";
-        var skip = skipRegs & 1;
-        var regs = skipRegs >>> 1;
-        oregs = (regs << 8) | skip;
-        oa = arity + ((regs-1+skip) << 8);
-        break;
-      case 2: // con
-        ot = 2;
-        oa = next();
-        break;
-      case 3: // stack frame
-        ot = -1;
-        oa = 0;
-        oregs = next() - 1;
-        if(oregs !== -1) oregs = ((oregs >>> 1) << 8) | (oregs & 1);
-        break;
-      default: throw ("h$initInfoTables: invalid closure type")
-    }
-    var size = next() - 1;
-    var nsrts = next();
-    var srt = null;
-    if(nsrts > 0) {
-      srt = [];
-      for(var j=0;j<nsrts;j++) {
-          srt.push(nextObj());
-      }
-    }
-    // h$log("result: " + ot + " " + oa + " " + oregs + " [" + srt + "] " + size);
-    // h$log("orig: " + o.t + " " + o.a + " " + o.r + " [" + o.s + "] " + o.size);
-    // if(ot !== o.t || oa !== o.a || oregs !== o.r || size !== o.size) throw "inconsistent";
-    o.t = ot;
-    o.i = [];
-    o.n = "";
-    o.a = oa;
-    o.r = oregs;
-    o.s = srt;
-    o.m = 0;
-    o.size = size;
-  }
-    info = infoStatic;
-    pos = 0;
-    for(i=0;i<objects.length;i++) {
-      ;
-      o = objects[i];
-        // traceMetaObjBefore(o);
-      var nx = next();
-      ;
-      switch(nx) {
-      case 0: // no init, could be a primitive value (still in the list since others might reference it)
-          // h$log("zero init");
-          break;
-      case 1: // staticfun
-          o.f = nextEntry();
-          ;
-          break;
-      case 2: // staticThunk
-          ;
-          o.f = nextEntry();
-          h$CAFs.push(o);
-          h$CAFsReset.push(o.f);
-          break;
-      case 3: // staticPrim false, no init
-          ;
-          break;
-      case 4: // staticPrim true, no init
-          ;
-          break;
-      case 5:
-          ;
-          break;
-      case 6: // staticString
-          ;
-          break;
-      case 7: // staticBin
-          ;
-          n = next();
-          var b = h$newByteArray(n);
-          for(j=0;j>n;j++) {
-              b.u8[j] = next();
-          }
-          break;
-      case 8: // staticEmptyList
-          ;
-          o.f = h$ghczmprimZCGHCziTypesziZMZN_con_e;
-          break;
-      case 9: // staticList
-          ;
-          n = next();
-          var hasTail = next();
-          var c = (hasTail === 1) ? nextObj() : h$ghczmprimZCGHCziTypesziZMZN;
-          ;
-          while(n--) {
-              c = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (nextArg()), (c)));
-          }
-          o.f = c.f;
-          o.d1 = c.d1;
-          o.d2 = c.d2;
-          break;
-      case 10: // staticData n args
-          ;
-          n = next();
-          ;
-          o.f = nextEntry();
-          for(j=0;j<n;j++) {
-              h$setField(o, j, nextArg());
-          }
-          break;
-      case 11: // staticData 0 args
-          ;
-          o.f = nextEntry();
-          break;
-      case 12: // staticData 1 args
-          ;
-          o.f = nextEntry();
-          o.d1 = nextArg();
-          break;
-      case 13: // staticData 2 args
-          ;
-          o.f = nextEntry();
-          o.d1 = nextArg();
-          o.d2 = nextArg();
-          break;
-      case 14: // staticData 3 args
-          ;
-          o.f = nextEntry();
-          o.d1 = nextArg();
-          // should be the correct order
-          o.d2 = { d1: nextArg(), d2: nextArg()};
-          break;
-      case 15: // staticData 4 args
-          ;
-          o.f = nextEntry();
-          o.d1 = nextArg();
-          // should be the correct order
-          o.d2 = { d1: nextArg(), d2: nextArg(), d3: nextArg() };
-          break;
-      case 16: // staticData 5 args
-          ;
-          o.f = nextEntry();
-          o.d1 = nextArg();
-          o.d2 = { d1: nextArg(), d2: nextArg(), d3: nextArg(), d4: nextArg() };
-          break;
-      case 17: // staticData 6 args
-          ;
-          o.f = nextEntry();
-          o.d1 = nextArg();
-          o.d2 = { d1: nextArg(), d2: nextArg(), d3: nextArg(), d4: nextArg(), d5: nextArg() };
-          break;
-      default:
-          throw ("invalid static data initializer: " + nx);
-      }
-  }
-  h$staticDelayed = null;
-}
-function h$initPtrLbl(isFun, lbl) {
-    return lbl;
-}
-function h$callDynamic(f) {
-    return f.apply(f, Array.prototype.slice.call(arguments, 2));
-}
-// slice an array of heap objects
-function h$sliceArray(a, start, n) {
-  return a.slice(start, start+n);
-}
-function h$memcpy() {
-  if(arguments.length === 3) { // ByteArray# -> ByteArray# copy
-    var dst = arguments[0];
-    var src = arguments[1];
-    var n = arguments[2];
-    for(var i=n-1;i>=0;i--) {
-      dst.u8[i] = src.u8[i];
-    }
-    { h$ret1 = (0); return (dst); };
-  } else if(arguments.length === 5) { // Addr# -> Addr# copy
-    var dst = arguments[0];
-    var dst_off = arguments[1]
-    var src = arguments[2];
-    var src_off = arguments[3];
-    var n = arguments[4];
-    for(var i=n-1;i>=0;i--) {
-      dst.u8[i+dst_off] = src.u8[i+src_off];
-    }
-    { h$ret1 = (dst_off); return (dst); };
-  } else {
-    throw "h$memcpy: unexpected argument";
-  }
-}
-// note: only works for objects bigger than two!
-function h$setField(o,n,v) {
-    if(n > 0 && !o.d2) o.d2 = {};
-    switch(n) {
-    case 0:
-        o.d1 = v;
-        return;
-    case 1:
-        o.d2.d1 = v;
-        return;
-    case 2:
-        o.d2.d2 = v;
-        return;
-    case 3:
-        o.d2.d3 = v;
-        return;
-    case 4:
-        o.d2.d4 = v;
-        return;
-    case 5:
-        o.d2.d5 = v;
-        return;
-    case 6:
-        o.d2.d6 = v;
-        return;
-    case 7:
-        o.d2.d7 = v;
-        return;
-    case 8:
-        o.d2.d8 = v;
-        return;
-    case 9:
-        o.d2.d9 = v;
-        return;
-    case 10:
-        o.d2.d10 = v;
-        return;
-    case 11:
-        o.d2.d11 = v;
-        return;
-    case 12:
-        o.d2.d12 = v;
-        return;
-    case 13:
-        o.d2.d13 = v;
-        return;
-    case 14:
-        o.d2.d14 = v;
-        return;
-    case 15:
-        o.d2.d15 = v;
-        return;
-    case 16:
-        o.d2.d16 = v;
-        return;
-    case 17:
-        o.d2.d17 = v;
-        return;
-    case 18:
-        o.d2.d18 = v;
-        return;
-    case 19:
-        o.d2.d19 = v;
-        return;
-    case 20:
-        o.d2.d20 = v;
-        return;
-    case 21:
-        o.d2.d21 = v;
-        return;
-    case 22:
-        o.d2.d22 = v;
-        return;
-    case 23:
-        o.d2.d23 = v;
-        return;
-    case 24:
-        o.d2.d24 = v;
-        return;
-    case 25:
-        o.d2.d25 = v;
-        return;
-    case 26:
-        o.d2.d26 = v;
-        return;
-    case 27:
-        o.d2.d27 = v;
-        return;
-    case 28:
-        o.d2.d28 = v;
-        return;
-    case 29:
-        o.d2.d29 = v;
-        return;
-    case 30:
-        o.d2.d30 = v;
-        return;
-    case 31:
-        o.d2.d31 = v;
-        return;
-    case 32:
-        o.d2.d32 = v;
-        return;
-    case 33:
-        o.d2.d33 = v;
-        return;
-    case 34:
-        o.d2.d34 = v;
-        return;
-    case 35:
-        o.d2.d35 = v;
-        return;
-    case 36:
-        o.d2.d36 = v;
-        return;
-    case 37:
-        o.d2.d37 = v;
-        return;
-    case 38:
-        o.d2.d38 = v;
-        return;
-    case 39:
-        o.d2.d39 = v;
-        return;
-    case 40:
-        o.d2.d40 = v;
-        return;
-    case 41:
-        o.d2.d41 = v;
-        return;
-    case 42:
-        o.d2.d42 = v;
-        return;
-    case 43:
-        o.d2.d43 = v;
-        return;
-    case 44:
-        o.d2.d44 = v;
-        return;
-    case 45:
-        o.d2.d45 = v;
-        return;
-    case 45:
-        o.d2.d45 = v;
-        return;
-    case 46:
-        o.d2.d46 = v;
-        return;
-    case 47:
-        o.d2.d47 = v;
-        return;
-    case 48:
-        o.d2.d48 = v;
-        return;
-    case 49:
-        o.d2.d49 = v;
-        return;
-    case 50:
-        o.d2.d50 = v;
-        return;
-    case 51:
-        o.d2.d51 = v;
-        return;
-    case 52:
-        o.d2.d52 = v;
-        return;
-    case 53:
-        o.d2.d53 = v;
-        return;
-    case 54:
-        o.d2.d54 = v;
-        return;
-    case 55:
-        o.d2.d55 = v;
-        return;
-    case 56:
-        o.d2.d56 = v;
-        return;
-    case 57:
-        o.d2.d57 = v;
-        return;
-    case 58:
-        o.d2.d58 = v;
-        return;
-    case 59:
-        o.d2.d59 = v;
-        return;
-    case 60:
-        o.d2.d60 = v;
-        return;
-    case 61:
-        o.d2.d61 = v;
-        return;
-    case 62:
-        o.d2.d62 = v;
-        return;
-    case 63:
-        o.d2.d63 = v;
-        return;
-    case 64:
-        o.d2.d64 = v;
-        return;
-    case 65:
-        o.d2.d65 = v;
-        return;
-    case 66:
-        o.d2.d66 = v;
-        return;
-    case 67:
-        o.d2.d67 = v;
-        return;
-    case 68:
-        o.d2.d68 = v;
-        return;
-    case 69:
-        o.d2.d69 = v;
-        return;
-    case 70:
-        o.d2.d70 = v;
-        return;
-    case 71:
-        o.d2.d71 = v;
-        return;
-    case 72:
-        o.d2.d72 = v;
-        return;
-    case 73:
-        o.d2.d73 = v;
-        return;
-    case 74:
-        o.d2.d74 = v;
-        return;
-    case 75:
-        o.d2.d75 = v;
-        return;
-    case 76:
-        o.d2.d76 = v;
-        return;
-    case 77:
-        o.d2.d77 = v;
-        return;
-    case 78:
-        o.d2.d78 = v;
-        return;
-    case 79:
-        o.d2.d79 = v;
-        return;
-    case 80:
-        o.d2.d80 = v;
-        return;
-    case 81:
-        o.d2.d81 = v;
-        return;
-    case 82:
-        o.d2.d82 = v;
-        return;
-    case 83:
-        o.d2.d83 = v;
-        return;
-    case 84:
-        o.d2.d84 = v;
-        return;
-    case 85:
-        o.d2.d85 = v;
-        return;
-    case 86:
-        o.d2.d86 = v;
-        return;
-    case 87:
-        o.d2.d87 = v;
-        return;
-    case 88:
-        o.d2.d88 = v;
-        return;
-    case 89:
-        o.d2.d89 = v;
-        return;
-    case 90:
-        o.d2.d90 = v;
-        return;
-    case 91:
-        o.d2.d91 = v;
-        return;
-    case 92:
-        o.d2.d92 = v;
-        return;
-    case 93:
-        o.d2.d93 = v;
-        return;
-    case 94:
-        o.d2.d94 = v;
-        return;
-    case 95:
-        o.d2.d95 = v;
-        return;
-    case 96:
-        o.d2.d96 = v;
-        return;
-    case 97:
-        o.d2.d97 = v;
-        return;
-    case 98:
-        o.d2.d98 = v;
-        return;
-    case 99:
-        o.d2.d99 = v;
-        return;
-    case 100:
-        o.d2.d100 = v;
-        return;
-    default:
-        throw ("h$setField: setter not implemented for field: " + n);
-    }
-}
-function h$mkExportDyn(t, f) {
-    h$log("making dynamic export: " + t);
-    h$log("haskell fun: " + f + " " + h$collectProps(f));
-    // fixme register things, global static data
-    var ff = function() {
-        h$log("running some haskell for you");
-        return 12;
-    };
-    return h$mkPtr(ff, 0);
-}
-function h$memchr(a_v, a_o, c, n) {
-  for(var i=0;i<n;i++) {
-    if(a_v.u8[a_o+i] === c) {
-      { h$ret1 = (a_o+i); return (a_v); };
-    }
-  }
-  { h$ret1 = (0); return (null); };
-}
-function h$strlen(a_v, a_o) {
-  var i=0;
-  while(true) {
-    if(a_v.u8[a_o+i] === 0) { return i; }
-    i++;
-  }
-}
-function h$newArray(len, e) {
-    var r = [];
-    r.__ghcjsArray = true;
-    r.m = 0;
-    if(e === null) e = r;
-    for(var i=0;i<len;i++) r[i] = e;
-    return r;
-}
-function h$roundUpToMultipleOf(n,m) {
-  var rem = n % m;
-  return rem === 0 ? n : n - rem + m;
-}
-function h$newByteArray(len) {
-  var len0 = Math.max(h$roundUpToMultipleOf(len, 8), 8);
-  var buf = new ArrayBuffer(len0);
-  return { buf: buf
-         , len: len
-         , i3: new Int32Array(buf)
-         , u8: new Uint8Array(buf)
-         , u1: new Uint16Array(buf)
-         , f3: new Float32Array(buf)
-         , f6: new Float64Array(buf)
-         , dv: new DataView(buf)
-         }
-}
-/*
-  Unboxed arrays in GHC use the ByteArray# and MutableByteArray#
-  primitives. In GHCJS these primitives are represented by an
-  object that contains a JavaScript ArrayBuffer and several views
-  (typed arrays) on that buffer.
-
-  Usually you can use GHCJS.Foreign.wrapBuffer and
-  GHCJS.Foreign.wrapMutableBuffer to do the conversion. If you need
-  more control or lower level acces, read on.
-
-  You can use h$wrapBuffer to wrap any JavaScript ArrayBuffer
-  into such an object, without copying the buffer. Since typed array
-  access is aligned, not all views are available
-  if the offset of the buffer is not a multiple of 8.
-
-  Since IO has kind * -> *, you cannot return IO ByteArray#
-  from a foreign import, even with the UnliftedFFITypes
-  extension. Return a JSVal instead and use unsafeCoerce
-  to convert it to a Data.Primitive.ByteArray.ByteArray or
-  Data.Primitive.ByteArray.MutableByteArray (primitive package)
-  and pattern match on the constructor to get the
-  primitive value out.
-
-  These types have the same runtime representation (a data
-  constructor with one regular (one JavaScript variable)
-  field) as a JSVal, so the conversion is safe, as long
-  as everything is fully evaluated.
-*/
-function h$wrapBuffer(buf, unalignedOk, offset, length) {
-  if(!unalignedOk && offset && offset % 8 !== 0) {
-    throw ("h$wrapBuffer: offset not aligned:" + offset);
-  }
-  if(!buf || !(buf instanceof ArrayBuffer))
-    throw "h$wrapBuffer: not an ArrayBuffer"
-  if(!offset) { offset = 0; }
-  if(!length || length < 0) { length = buf.byteLength - offset; }
-  return { buf: buf
-         , len: length
-         , i3: (offset%4) ? null : new Int32Array(buf, offset, length >> 2)
-         , u8: new Uint8Array(buf, offset, length)
-         , u1: (offset%2) ? null : new Uint16Array(buf, offset, length >> 1)
-         , f3: (offset%4) ? null : new Float32Array(buf, offset, length >> 2)
-         , f6: (offset%8) ? null : new Float64Array(buf, offset, length >> 3)
-         , dv: new DataView(buf, offset, length)
-         };
-}
-/* 
-   A StableName is represented as either a h$StableName object (for most heap objects)
-   or a number (for heap objects with unboxed representation)
-
-   Holding on to a StableName does not keep the original object alive.
- */
-var h$stableNameN = 1;
-/** @constructor */
-function h$StableName(m) {
-  this.m = m;
-  this.s = null;
-}
-function h$makeStableName(x) {
-  if(typeof x === 'number') {
-    return x;
-  } else if(((typeof(x)==='object')&&(x).f === h$unbox_e)) {
-    return ((typeof(x) === 'number')?(x):(x).d1);
-  } else if(typeof x === 'object') {
-    if(typeof x.m !== 'object') {
-      x.m = new h$StableName(x.m);
-    }
-    return x.m;
-  } else {
-    throw new Error("h$makeStableName: invalid argument");
-  }
-}
-function h$stableNameInt(s) {
-  if(typeof s === 'number') {
-    if(s!=s) return 999999; // NaN
-    var s0 = s|0;
-    if(s0 === s) return s0;
-    h$convertDouble[0] = s;
-    return h$convertInt[0] ^ h$convertInt[1];
-  } else {
-    var x = s.s;
-    if(x === null) {
-      x = s.s = h$stableNameN = (h$stableNameN+1)|0;
-    }
-    return x;
-  }
-}
-function h$eqStableName(s1o,s2o) {
-  if(s1o!=s1o && s2o!=s2o) return 1; // NaN
-  return s1o === s2o ? 1 : 0;
-}
-function h$makeStablePtr(v) {
-  var buf = h$newByteArray(4);
-  buf.arr = [v];
-  { h$ret1 = (0); return (buf); };
-}
-function h$hs_free_stable_ptr(stable) {
-}
-function h$malloc(n) {
-  { h$ret1 = (0); return (h$newByteArray(n)); };
-}
-function h$free() {
-}
-function h$memset() {
-  var buf_v, buf_off, chr, n;
-  buf_v = arguments[0];
-  if(arguments.length == 4) { // Addr#
-    buf_off = arguments[1];
-    chr = arguments[2];
-    n = arguments[3];
-  } else if(arguments.length == 3) { // ByteString#
-    buf_off = 0;
-    chr = arguments[1];
-    n = arguments[2];
-  } else {
-    throw("h$memset: unexpected argument")
-  }
-  var end = buf_off + n;
-  for(var i=buf_off;i<end;i++) {
-    buf_v.u8[i] = chr;
-  }
-  { h$ret1 = (buf_off); return (buf_v); };
-}
-function h$memcmp(a_v, a_o, b_v, b_o, n) {
-  for(var i=0;i<n;i++) {
-    var a = a_v.u8[a_o+i];
-    var b = b_v.u8[b_o+i];
-    var c = a-b;
-    if(c !== 0) { return c; }
-  }
-  return 0;
-}
-function h$memmove(a_v, a_o, b_v, b_o, n) {
-  if(n > 0) {
-    var tmp = new Uint8Array(b_v.buf.slice(b_o,b_o+n));
-    for(var i=0;i<n;i++) {
-      a_v.u8[a_o+i] = tmp[i];
-    }
-  }
-  { h$ret1 = (a_o); return (a_v); };
-}
-function h$mkPtr(v, o) {
-  return (h$c2(baseZCGHCziPtrziPtr_con_e, (v), (o)));
-};
-function h$mkFunctionPtr(f) {
-  var d = h$newByteArray(4);
-  d.arr = [f];
-  return d;
-}
-var h$freeHaskellFunctionPtr = function () {
-}
-// extra roots for the heap scanner: objects with root property
-var h$extraRootsN = 0;
-var h$extraRoots = new h$Set();
-function h$makeCallback(f, extraArgs, action) {
-    var args = extraArgs.slice(0);
-    args.unshift(action);
-    var c = function() {
-        return f.apply(this, args);
-    }
-    c._key = ++h$extraRootsN;
-    c.root = action;
-    h$extraRoots.add(c);
-    return c;
-}
-function h$makeCallbackApply(n, f, extraArgs, fun) {
-  var c;
-  if(n === 1) {
-    c = function(x) {
-      var args = extraArgs.slice(0);
-      var action = (h$c2(h$ap1_e,(fun),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x))))));
-      args.unshift(action);
-      return f.apply(this, args);
-    }
-  } else if (n === 2) {
-    c = function(x,y) {
-      var args = extraArgs.slice(0);
-      var action = (h$c3(h$ap2_e,(fun),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x)))),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (y))))));
-      args.unshift(action);
-      return f.apply(this, args);
-    }
-  } else if (n === 3) {
-    c = function(x,y,z) {
-      var args = extraArgs.slice(0);
-      var action = (h$c2(h$ap1_e,((h$c3(h$ap2_e,(fun),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (x)))),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (y))))))),((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (z))))));
-      args.unshift(action);
-      return f.apply(this, args);
-    }
-  } else {
-    throw new Error("h$makeCallbackApply: unsupported arity");
-  }
-  c.root = fun;
-  c._key = ++h$extraRootsN;
-  h$extraRoots.add(c);
-  return c;
-}
-function h$retain(c) {
-  var k = c._key;
-  if(typeof k !== 'number') throw new Error("retained object does not have a key");
-  if(k === -1) c._key = ++h$extraRootsN;
-  h$extraRoots.add(c);
-}
-function h$release(c) {
-  h$extraRoots.remove(c);
-}
-function h$isInstanceOf(o,c) {
-  return o instanceof c;
-}
-function h$getpagesize() {
-  return 4096;
-}
-var h$MAP_ANONYMOUS = 0x20;
-function h$mmap(addr_d, addr_o, len, prot, flags, fd, offset1, offset2) {
-  if(flags & h$MAP_ANONYMOUS || fd === -1) {
-    { h$ret1 = (0); return (h$newByteArray(len)); };
-  } else {
-    throw "h$mmap: mapping a file is not yet supported";
-  }
-}
-function h$mprotect(addr_d, addr_o, size, prot) {
-  return 0;
-}
-function h$munmap(addr_d, addr_o, size) {
-  if(addr_d && addr_o === 0 && size >= addr_d.len) {
-    addr_d.buf = null;
-    addr_d.i3 = null;
-    addr_d.u8 = null;
-    addr_d.u1 = null;
-    addr_d.f3 = null;
-    addr_d.f6 = null;
-    addr_d.dv = null;
-  }
-  return 0;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-/*
-  Do garbage collection where the JavaScript GC doesn't suffice or needs some help:
-
-  - run finalizers for weak references
-  - find unreferenced CAFs and reset them (unless h$retainCAFs is set)
-  - shorten stacks that are mostly empty
-  - reset unused parts of stacks to null
-  - reset registers to null
-  - reset return variables to null
-  - throw exceptions to threads that are blocked on an unreachable MVar/STM transaction
-  - drop unnecessary references for selector thunks
-
-  The gc uses the .m field to store its mark in all the objects it marks. for heap objects,
-  the .m field is also used for other things, like stable names, the gc only changes
-  the two least significant bits for these.
-
-  The gc starts with all threads as roots in addition to callbacks passed to JavaScript
-  that that are retained. If you have custom JavaScript data structures that contain
-  Haskell heap object references, you can use extensible retention to find these
-  references and add thm to the work queue. h$registerExtensibleRetensionRoot(f) calls
-  f(currentMark) at the start of every gc, h$registerExtensibleRetention(f) calls f(o, currentMark)
-  for every unknown object found on the Haskell heap.
-
-  Extensible retention is a low-level mechanism and should typically only be used by
-  bindings that guarantee that the shape of the JS objects exactly matches what
-  the scanner expects. Care should be taken to make sure that the objects never
-  escape the reach of the scanner.
-
-  Having correct reachability information is important, even if you choose to turn off
-  features like weak references and deallocating CAFs in production, since it helps
-  debugging by providing the profiler with accurate data and by properly raising
-  exceptions when threads become blocked indefinitely, usually indicating a bug or
-  memory leak.
-
-  assumptions:
-  - all threads suspended, no active registers
-  - h$currentThread == null or at least unused:
-       1. all reachable threads must be in h$threads or h$blocked
-       2. no registers contain any usable value
-  notes:
-  - gc() may replace the stack of any thread, make sure to reload h$stack after gc()
-*/
-/*
-  fixme, todo:
-  - mark posted exceptions to thread
-*/
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// these macros use a local mark variable
-var h$gcMark = 2; // 2 or 3 (objects initialized with 0)
-var h$retainCAFs = false;
-var h$CAFs = [];
-var h$CAFsReset = [];
-// 
-var h$extensibleRetentionRoots = [];
-var h$extensibleRetentionCallbacks = [];
-/*
-   after registering an extensible extension root f,
-   f(currentMark) is called at the start of each gc invocation and is
-   expected to return an array with Haskell heap objects
-   to be treated as extra roots.
- */
-function h$registerExtensibleRetentionRoot(f) {
-    h$extensibleRetentionRoots.push(f);
-}
-function h$unregisterExtensibleRetentionRoot(f) {
-    h$extensibleRetentionRoots = h$extensibleRetentionRoots.filter(function(g) { return f !== g; });
-}
-/*
-  after registering an extensible retention callback f,
-  f(o, currentMark) is called for every unknown object encountered on the
-  Haskell heap. f should return an array with found objects. If no objects
-  are found, f should return a boolean indicating whether the gc should skip
-  processing the objects with other extensible retention callbacks.
-
-  The gc may encounter the same object multiple times during the same scan,
-  so a callback should attempt to quickly return if the object has been scanned
-  already.
-
-   return value:
-     - array          scan objects contained in array, do not call other extension callbacks
-     - true           do not call other extension callbacks with this object
-     - false          call other extension callbacks with this object
-
-  Use -DGHCJS_TRACE_GC_UNKNOWN to find the JavaScript objects reachable
-  (through JSVal) on the Haskell heap for which none of the registered
-  extensible retention callbacks has returned true or an array.
- */
-function h$registerExtensibleRetention(f) {
-    h$extensibleRetentionCallbacks.push(f);
-}
-function h$unregisterExtensibleRetention(f) {
-    h$extensibleRetentionCallbacks = h$extensibleRetentionCallbacks.filter(function(g) { return f !== g; });
-}
-// check whether the object is marked by the latest gc
-function h$isMarked(obj) {
-  return (typeof obj === 'object' || typeof obj === 'function') &&
-        ((typeof obj.m === 'number' && (obj.m & 3) === h$gcMark) || (obj.m && typeof obj.m === 'object' && obj.m.m === h$gcMark));
-}
-// do a quick gc of a thread:
-// - reset the stack (possibly shrinking storage for it)
-// - reset all global data
-// checks all known threads if t is null, but not h$currentThread
-function h$gcQuick(t) {
-    if(h$currentThread !== null) throw "h$gcQuick: GC can only run when no thread is running";
-    h$resetRegisters();
-    h$resetResultVars();
-    var i;
-    if(t !== null) { // reset specified threads
-        if(t instanceof h$Thread) { // only thread t
-            h$resetThread(t);
-        } else { // assume it's an array
-            for(var i=0;i<t.length;i++) h$resetThread(t[i]);
-        }
-    } else { // all threads, h$currentThread assumed unused
-        var nt, runnable = h$threads.iter();
-        while((nt = runnable()) !== null) h$resetThread(nt);
-        var iter = h$blocked.iter();
-        while((nt = iter.next()) !== null) h$resetThread(nt);
-    }
-}
-// run full marking for threads in h$blocked and h$threads, optionally t if t /= null
-function h$gc(t) {
-    // fixme, should enable again later when proper CAF management
-    // and retention of the standard handles in GHCJSi work
-    if(h$isGHCJSi) return;
-    if(h$currentThread !== null) throw "h$gc: GC can only be run when no thread is running";
-    ;
-    h$resetRegisters();
-    h$resetResultVars();
-    h$gcMark = 5-h$gcMark;
-    var i;
-   
-    for(i=h$extensibleRetentionRoots.length-1;i>=0;i--) {
-      var a = h$extensibleRetentionRoots[i](h$gcMark);
-      if(a) h$follow(a, a.length-1);
-    }
-    ;
-    // mark al runnable threads and the running thread
-    if(t !== null) {
- h$markThread(t);
- h$resetThread(t);
-    }
-    var nt, runnable = h$threads.iter();
-    while((nt = runnable()) !== null) {
- h$markThread(nt);
- h$resetThread(nt);
-    }
-    // some blocked threads are always considered reachable, mark them
-    //   - delayed threads
-    //   - threads blocked on async FFI
-    var iter = h$blocked.iter();
-    while((nt = iter.next()) !== null) {
-        if(nt.delayed ||
-    (nt.blockedOn instanceof h$MVar && nt.stack && nt.stack[nt.sp] === h$unboxFFIResult)) {
-            h$markThread(nt);
-        }
- h$resetThread(nt);
-    }
-    ;
-    iter = h$extraRoots.iter();
-    while((nt = iter.next()) !== null) h$follow(nt.root);
-    // clean up threads waiting on unreachable synchronization primitives
-    h$resolveDeadlocks();
-    // clean up unreachable weak refs
-    var toFinalize = h$markRetained();
-    h$finalizeWeaks(toFinalize);
-    h$finalizeCAFs(); // restore all unreachable CAFs to unevaluated state
-    var now = Date.now();
-    h$lastGc = now;
-}
-function h$markWeaks() {
-  var i, w, marked, mark = h$gcMark;
-  do {
-    marked = false;
-    for (i = 0; i < h$weakPointerList.length; ++i) {
-      w = h$weakPointerList[i];
-      if (((w.keym.m & 3) === mark)) {
- if (w.val !== null && !((typeof w.val.m === 'number' && (w.val.m & 3) === mark) || (typeof w.val.m === 'object' && ((w.val.m.m & 3) === mark)))) {
-          h$follow(w.val);
-   marked = true;
- }
- if (w.finalizer !== null && !((typeof w.finalizer.m === 'number' && (w.finalizer.m & 3) === mark) || (typeof w.finalizer.m === 'object' && ((w.finalizer.m.m & 3) === mark)))) {
-          h$follow(w.finalizer);
-   marked = true;
- }
-      }
-    }
-  } while(marked);
-}
-function h$markRetained() {
-    var iter, marked, w, i, mark = h$gcMark;
-    var newList = [];
-    var toFinalize = [];
-    /*
-      2. Scan the Weak Pointer List. If a weak pointer object has a key that is
-      marked (i.e. reachable), then mark all heap reachable from its value
-      or its finalizer, and move the weak pointer object to a new list
-    */
-    do {
-        ;
-        marked = false;
-        for (i = 0; i < h$weakPointerList.length; ++i) {
-            w = h$weakPointerList[i];
-            if (w === null) {
-                // don't handle items deleted in earlier iteration
-                continue;
-            }
-            if (((w.keym.m & 3) === mark)) {
-                if (w.val !== null && !((typeof w.val.m === 'number' && (w.val.m & 3) === mark) || (typeof w.val.m === 'object' && ((w.val.m.m & 3) === mark)))) {
-                    h$follow(w.val);
-                }
-                if (w.finalizer !== null && !((typeof w.finalizer.m === 'number' && (w.finalizer.m & 3) === mark) || (typeof w.finalizer.m === 'object' && ((w.finalizer.m.m & 3) === mark)))) {
-                    h$follow(w.finalizer);
-                }
-                newList.push(w);
-                // instead of removing the item from the h$weakpointerList
-                // we set it to null if we push it to newList.
-                h$weakPointerList[i] = null;
-                marked = true;
-            }
-        }
-        /*
-           3. Repeat from step (2), until a complete scan of Weak Pointer List finds
-              no weak pointer object with a marked keym.
-        */
-    } while(marked);
-    /*
-      4. Scan the Weak Pointer List again. If the weak pointer object is reachable
-         then tombstone it. If the weak pointer object has a finalizer then move
-         it to the Finalization Pending List, and mark all the heap reachable
-         from the finalizer. If the finalizer refers to the key (and/or value),
-         this step will "resurrect" it.
-    */
-    for (i = 0; i < h$weakPointerList.length; ++i) {
-        w = h$weakPointerList[i];
-        if (w === null) {
-            // don't handle items deleted in step 2
-            continue;
-        }
-        ;
-        if(w.val !== null) {
-            w.val = null;
-        }
-        if(w.finalizer !== null) {
-            if(!((typeof w.finalizer.m === 'number' && (w.finalizer.m & 3) === mark) || (typeof w.finalizer.m === 'object' && ((w.finalizer.m.m & 3) === mark)))) {
-                ;
-                h$follow(w.finalizer);
-            }
-            toFinalize.push(w);
-        }
-    }
-    /*
-       5. The list accumulated in step (3) becomes the new Weak Pointer List.
-          Mark any unreachable weak pointer objects on this list as reachable.
-    */
-    h$weakPointerList = newList;
-    // marking the weak pointer objects as reachable is not necessary
-    return toFinalize;
-}
-function h$markThread(t) {
-    var mark = h$gcMark;
-    ;
-    if(((typeof t.m === 'number' && (t.m & 3) === mark) || (typeof t.m === 'object' && ((t.m.m & 3) === mark)))) return;
-    h$follow(t);
-}
-// big object, not handled by 0..7 cases
-// keep out of h$follow to prevent deopt
-function h$followObjGen(c, work, w) {
-   work[w++] = c.d1;;
-   var d = c.d2;
-   for(var x in d) {
-//              if(d.hasOwnProperty(x)) {
-     work[w++] = d[x];;
-//              }
-   }
-    return w;
-}
-// follow all references in the object obj and mark them with the current mark
-// if sp is a number, obj is assumed to be an array for which indices [0..sp] need
-// to be followed (used for thread stacks)
-function h$follow(obj, sp) {
-    var i, ii, iter, c, work, w;
-    ;
-    var work, mark = h$gcMark;
-    if(typeof sp === 'number') {
-        work = obj.slice(0, sp+1);
-        w = sp + 1;
-    } else {
-        work = [obj];
-        w = 1;
-    }
-    while(w > 0) {
-        ;
-        c = work[--w];
-        ;
-        if(c !== null && c !== undefined && typeof c === 'object' && ((typeof c.m === 'number' && (c.m&3) !== mark) || (typeof c.m === 'object' && c.m !== null && typeof c.m.m === 'number' && (c.m.m&3) !== mark))) {
-            var doMark = false;
-            var cf = c.f;
-            ;
-            if(typeof cf === 'function' && (typeof c.m === 'number' || typeof c.m === 'object')) {
-                ;
-                // only change the two least significant bits for heap objects
-                if(typeof c.m === 'number') c.m = (c.m&-4)|mark; else c.m.m = (c.m.m & -4)|mark;;
-                // dynamic references
-                var d = c.d2;
-                switch(cf.size) {
-                case 0: break;
-                case 1: work[w++] = c.d1;; break;
-                case 2: { work[w++] = c.d1; work[w++] = d; }; break;
-                case 3: var d3=c.d2; { work[w++] = c.d1; work[w++] = d3.d1; work[w++] = d3.d2; }; break;
-                case 4: var d4=c.d2; { work[w++] = c.d1; work[w++] = d4.d1; work[w++] = d4.d2; work[w++] = d4.d3; }; break;
-                case 5: var d5=c.d2; { work[w++] = c.d1; work[w++] = d5.d1; work[w++] = d5.d2; work[w++] = d5.d3; }; work[w++] = d5.d4;; break;
-                case 6: var d6=c.d2; { work[w++] = c.d1; work[w++] = d6.d1; work[w++] = d6.d2; work[w++] = d6.d3; }; { work[w++] = d6.d4; work[w++] = d6.d5; }; break;
-                case 7: var d7=c.d2; { work[w++] = c.d1; work[w++] = d7.d1; work[w++] = d7.d2; work[w++] = d7.d3; }; { work[w++] = d7.d4; work[w++] = d7.d5; work[w++] = d7.d6; }; break;
-                case 8: var d8=c.d2; { work[w++] = c.d1; work[w++] = d8.d1; work[w++] = d8.d2; work[w++] = d8.d3; }; { work[w++] = d8.d4; work[w++] = d8.d5; work[w++] = d8.d6; work[w++] = d8.d7; }; break;
-                case 9: var d9=c.d2; { work[w++] = c.d1; work[w++] = d9.d1; work[w++] = d9.d2; work[w++] = d9.d3; }; { work[w++] = d9.d4; work[w++] = d9.d5; work[w++] = d9.d6; work[w++] = d9.d7; }; work[w++] = d9.d8;; break;
-                case 10: var d10=c.d2; { work[w++] = c.d1; work[w++] = d10.d1; work[w++] = d10.d2; work[w++] = d10.d3; }; { work[w++] = d10.d4; work[w++] = d10.d5; work[w++] = d10.d6; work[w++] = d10.d7; }; { work[w++] = d10.d8; work[w++] = d10.d9; }; break;
-                case 11: var d11=c.d2; { work[w++] = c.d1; work[w++] = d11.d1; work[w++] = d11.d2; work[w++] = d11.d3; }; { work[w++] = d11.d4; work[w++] = d11.d5; work[w++] = d11.d6; work[w++] = d11.d7; }; { work[w++] = d11.d8; work[w++] = d11.d9; work[w++] = d11.d10; }; break;
-                case 12: var d12=c.d2; { work[w++] = c.d1; work[w++] = d12.d1; work[w++] = d12.d2; work[w++] = d12.d3; }; { work[w++] = d12.d4; work[w++] = d12.d5; work[w++] = d12.d6; work[w++] = d12.d7; }; { work[w++] = d12.d8; work[w++] = d12.d9; work[w++] = d12.d10; work[w++] = d12.d11; }; break;
-                default: w = h$followObjGen(c,work,w);
-                }
-                // static references
-                var s = cf.s;
-                if(s !== null) {
-                    ;
-                    for(var i=0;i<s.length;i++) work[w++] = s[i];;
-                }
-            } else if(c instanceof h$Weak) {
-                if(typeof c.m === 'number') c.m = (c.m&-4)|mark; else c.m.m = (c.m.m & -4)|mark;;
-            } else if(c instanceof h$MVar) {
-                ;
-                if(typeof c.m === 'number') c.m = (c.m&-4)|mark; else c.m.m = (c.m.m & -4)|mark;;
-                iter = c.writers.iter();
-                while((ii = iter()) !== null) {
-      work[w++] = ii[1];; // value
-      work[w++] = ii[0];; // thread
-  }
-  iter = c.readers.iter();
-  while((ii = iter()) !== null) {
-      work[w++] = ii;;
-  }
-         if(c.waiters) {
-    for(i=c.waiters.length-1;i>=0;i--) {
-      work[w++] = c.waiters[i];;
-    }
-  }
-                if(c.val !== null && !((typeof c.val.m === 'number' && (c.val.m & 3) === mark) || (typeof c.val.m === 'object' && ((c.val.m.m & 3) === mark)))) work[w++] = c.val;;
-            } else if(c instanceof h$MutVar) {
-                ;
-                if(typeof c.m === 'number') c.m = (c.m&-4)|mark; else c.m.m = (c.m.m & -4)|mark;;
-                work[w++] = c.val;;
-            } else if(c instanceof h$TVar) {
-                ;
-                if(typeof c.m === 'number') c.m = (c.m&-4)|mark; else c.m.m = (c.m.m & -4)|mark;;
-                work[w++] = c.val;;
-  iter = c.blocked.iter();
-  while((ii = iter.next()) !== null) {
-      work[w++] = ii;;
-  }
-  if(c.invariants) {
-      iter = c.invariants.iter();
-      while((ii = iter.next()) !== null) {
-   work[w++] = ii;;
-      }
-  }
-            } else if(c instanceof h$Thread) {
-                ;
-                if(typeof c.m === 'number') c.m = (c.m&-4)|mark; else c.m.m = (c.m.m & -4)|mark;;
-                if(c.stack) {
-                    for(i=c.sp;i>=0;i--) {
-   work[w++] = c.stack[i];;
-      }
-                }
-  for(i=0;i<c.excep.length;i++) {
-      work[w++] = c.excep[i];;
-  }
-            } else if(c instanceof h$Transaction) {
-                // - the accessed TVar values don't need to be marked
-                // - parents are also on the stack, so they should've been marked already
-                ;
-                if(typeof c.m === 'number') c.m = (c.m&-4)|mark; else c.m.m = (c.m.m & -4)|mark;;
-                for(i=c.invariants.length-1;i>=0;i--) {
-      work[w++] = c.invariants[i].action;;
-  }
-                work[w++] = c.action;;
-                iter = c.tvars.iter();
-                while((ii = iter.nextVal()) !== null) {
-      work[w++] = ii.val;;
-  }
-            } else if(c instanceof Array && c.__ghcjsArray) {
-  // only for Haskell arrays with lifted values
-                if(typeof c.m === 'number') c.m = (c.m&-4)|mark; else c.m.m = (c.m.m & -4)|mark;;
-                ;
-                for(i=0;i<c.length;i++) {
-                    var x = c[i];
-                    if(typeof x === 'object' && x !== null && !((typeof x.m === 'number' && (x.m & 3) === mark) || (typeof x.m === 'object' && ((x.m.m & 3) === mark)))) {
-          work[w++] = x;;
-      }
-                }
-            } else if(typeof c === 'object') {
-                ;
-                for(i=h$extensibleRetentionCallbacks.length-1;i>=0;i--) {
-                    var x = h$extensibleRetentionCallbacks[i](c, mark);
-                    if(x === false) continue;
-                    if(x !== true) {
-                      for(j=x.length-1;j>=0;j--) {
-            work[w++] = x[j];;
-        }
-                    }
-                    break;
-                }
-            } // otherwise: not an object, no followable values
-        }
-    }
-    ;
-}
-// resetThread clears the stack above the stack pointer
-// and shortens the stack array if there is too much
-// unused space
-function h$resetThread(t) {
-    var stack = t.stack;
-    if(!stack) return;
-    var sp = t.sp;
-    if(stack.length - sp > sp && stack.length > 100) {
-        t.stack = t.stack.slice(0,sp+1);
-    } else {
-        for(var i=sp+1;i<stack.length;i++) {
-            stack[i] = null;
-        }
-    }
-    ;
-}
-/*
-   Post exceptions to all threads that are waiting on an unreachable synchronization
-   object and haven't been marked reachable themselves.
-
-   All woken up threads are marked.
- */
-function h$resolveDeadlocks() {
-    ;
-    var kill, t, iter, bo, mark = h$gcMark;
-    do {
-        h$markWeaks();
-        // deal with unreachable blocked threads: kill an unreachable thread and restart the process
-        kill = null;
-        iter = h$blocked.iter();
-        while((t = iter.next()) !== null) {
-            // we're done if the thread is already reachable
-            if(((typeof t.m === 'number' && (t.m & 3) === mark) || (typeof t.m === 'object' && ((t.m.m & 3) === mark)))) continue;
-            // check what we're blocked on
-            bo = t.blockedOn;
-            if(bo instanceof h$MVar) {
-                // blocked on MVar
-                if(bo.m === mark) throw "assertion failed: thread should have been marked";
-                // MVar unreachable
-                kill = h$ghcjszmprimZCGHCJSziPrimziInternalziblockedIndefinitelyOnMVar;
-                break;
-            } else if(t.blockedOn instanceof h$TVarsWaiting) {
-                // blocked in STM transaction
-                kill = h$ghcjszmprimZCGHCJSziPrimziInternalziblockedIndefinitelyOnSTM;
-                break;
-            } else {
-                // blocked on something else, we can't do anything
-            }
-        }
-        if(kill) {
-            h$killThread(t, kill);
-            h$markThread(t);
-        }
-    } while(kill);
-}
-// reset unreferenced CAFs to their initial value
-function h$finalizeCAFs() {
-    if(h$retainCAFs) return;
-    var mark = h$gcMark;
-    for(var i=0;i<h$CAFs.length;i++) {
-        var c = h$CAFs[i];
-        if(c.m & 3 !== mark) {
-            var cr = h$CAFsReset[i];
-            if(c.f !== cr) { // has been updated, reset it
-                ;
-                c.f = cr;
-                c.d1 = null;
-                c.d2 = null;
-            }
-        }
-    }
-    ;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-/* include/HsBaseConfig.h.  Generated from HsBaseConfig.h.in by configure.  */
-/* include/HsBaseConfig.h.in.  Generated from configure.ac by autoheader.  */
-/* The value of E2BIG. */
-/* The value of EACCES. */
-/* The value of EADDRINUSE. */
-/* The value of EADDRNOTAVAIL. */
-/* The value of EADV. */
-/* The value of EAFNOSUPPORT. */
-/* The value of EAGAIN. */
-/* The value of EALREADY. */
-/* The value of EBADF. */
-/* The value of EBADMSG. */
-/* The value of EBADRPC. */
-/* The value of EBUSY. */
-/* The value of ECHILD. */
-/* The value of ECOMM. */
-/* The value of ECONNABORTED. */
-/* The value of ECONNREFUSED. */
-/* The value of ECONNRESET. */
-/* The value of EDEADLK. */
-/* The value of EDESTADDRREQ. */
-/* The value of EDIRTY. */
-/* The value of EDOM. */
-/* The value of EDQUOT. */
-/* The value of EEXIST. */
-/* The value of EFAULT. */
-/* The value of EFBIG. */
-/* The value of EFTYPE. */
-/* The value of EHOSTDOWN. */
-/* The value of EHOSTUNREACH. */
-/* The value of EIDRM. */
-/* The value of EILSEQ. */
-/* The value of EINPROGRESS. */
-/* The value of EINTR. */
-/* The value of EINVAL. */
-/* The value of EIO. */
-/* The value of EISCONN. */
-/* The value of EISDIR. */
-/* The value of ELOOP. */
-/* The value of EMFILE. */
-/* The value of EMLINK. */
-/* The value of EMSGSIZE. */
-/* The value of EMULTIHOP. */
-/* The value of ENAMETOOLONG. */
-/* The value of ENETDOWN. */
-/* The value of ENETRESET. */
-/* The value of ENETUNREACH. */
-/* The value of ENFILE. */
-/* The value of ENOBUFS. */
-/* The value of ENOCIGAR. */
-/* The value of ENODATA. */
-/* The value of ENODEV. */
-/* The value of ENOENT. */
-/* The value of ENOEXEC. */
-/* The value of ENOLCK. */
-/* The value of ENOLINK. */
-/* The value of ENOMEM. */
-/* The value of ENOMSG. */
-/* The value of ENONET. */
-/* The value of ENOPROTOOPT. */
-/* The value of ENOSPC. */
-/* The value of ENOSR. */
-/* The value of ENOSTR. */
-/* The value of ENOSYS. */
-/* The value of ENOTBLK. */
-/* The value of ENOTCONN. */
-/* The value of ENOTDIR. */
-/* The value of ENOTEMPTY. */
-/* The value of ENOTSOCK. */
-/* The value of ENOTSUP. */
-/* The value of ENOTTY. */
-/* The value of ENXIO. */
-/* The value of EOPNOTSUPP. */
-/* The value of EPERM. */
-/* The value of EPFNOSUPPORT. */
-/* The value of EPIPE. */
-/* The value of EPROCLIM. */
-/* The value of EPROCUNAVAIL. */
-/* The value of EPROGMISMATCH. */
-/* The value of EPROGUNAVAIL. */
-/* The value of EPROTO. */
-/* The value of EPROTONOSUPPORT. */
-/* The value of EPROTOTYPE. */
-/* The value of ERANGE. */
-/* The value of EREMCHG. */
-/* The value of EREMOTE. */
-/* The value of EROFS. */
-/* The value of ERPCMISMATCH. */
-/* The value of ERREMOTE. */
-/* The value of ESHUTDOWN. */
-/* The value of ESOCKTNOSUPPORT. */
-/* The value of ESPIPE. */
-/* The value of ESRCH. */
-/* The value of ESRMNT. */
-/* The value of ESTALE. */
-/* The value of ETIME. */
-/* The value of ETIMEDOUT. */
-/* The value of ETOOMANYREFS. */
-/* The value of ETXTBSY. */
-/* The value of EUSERS. */
-/* The value of EWOULDBLOCK. */
-/* The value of EXDEV. */
-/* The value of O_BINARY. */
-/* The value of SIGINT. */
-/* Define to 1 if you have the `clock_gettime' function. */
-/* #undef HAVE_CLOCK_GETTIME */
-/* Define to 1 if you have the <ctype.h> header file. */
-/* Define if you have epoll support. */
-/* #undef HAVE_EPOLL */
-/* Define to 1 if you have the `epoll_ctl' function. */
-/* #undef HAVE_EPOLL_CTL */
-/* Define to 1 if you have the <errno.h> header file. */
-/* Define to 1 if you have the `eventfd' function. */
-/* #undef HAVE_EVENTFD */
-/* Define to 1 if you have the <fcntl.h> header file. */
-/* Define to 1 if you have the `ftruncate' function. */
-/* Define to 1 if you have the `getclock' function. */
-/* #undef HAVE_GETCLOCK */
-/* Define to 1 if you have the `getrusage' function. */
-/* Define to 1 if you have the <inttypes.h> header file. */
-/* Define to 1 if you have the `iswspace' function. */
-/* Define to 1 if you have the `kevent' function. */
-/* Define to 1 if you have the `kevent64' function. */
-/* Define if you have kqueue support. */
-/* Define to 1 if you have the <langinfo.h> header file. */
-/* Define to 1 if you have libcharset. */
-/* Define to 1 if you have the `rt' library (-lrt). */
-/* #undef HAVE_LIBRT */
-/* Define to 1 if you have the <limits.h> header file. */
-/* Define to 1 if the system has the type `long long'. */
-/* Define to 1 if you have the `lstat' function. */
-/* Define to 1 if you have the <memory.h> header file. */
-/* Define if you have poll support. */
-/* Define to 1 if you have the <poll.h> header file. */
-/* Define to 1 if you have the <signal.h> header file. */
-/* Define to 1 if you have the <stdint.h> header file. */
-/* Define to 1 if you have the <stdlib.h> header file. */
-/* Define to 1 if you have the <strings.h> header file. */
-/* Define to 1 if you have the <string.h> header file. */
-/* Define to 1 if you have the <sys/epoll.h> header file. */
-/* #undef HAVE_SYS_EPOLL_H */
-/* Define to 1 if you have the <sys/eventfd.h> header file. */
-/* #undef HAVE_SYS_EVENTFD_H */
-/* Define to 1 if you have the <sys/event.h> header file. */
-/* Define to 1 if you have the <sys/resource.h> header file. */
-/* Define to 1 if you have the <sys/select.h> header file. */
-/* Define to 1 if you have the <sys/stat.h> header file. */
-/* Define to 1 if you have the <sys/syscall.h> header file. */
-/* Define to 1 if you have the <sys/timeb.h> header file. */
-/* Define to 1 if you have the <sys/timers.h> header file. */
-/* #undef HAVE_SYS_TIMERS_H */
-/* Define to 1 if you have the <sys/times.h> header file. */
-/* Define to 1 if you have the <sys/time.h> header file. */
-/* Define to 1 if you have the <sys/types.h> header file. */
-/* Define to 1 if you have the <sys/utsname.h> header file. */
-/* Define to 1 if you have the <sys/wait.h> header file. */
-/* Define to 1 if you have the <termios.h> header file. */
-/* Define to 1 if you have the `times' function. */
-/* Define to 1 if you have the <time.h> header file. */
-/* Define to 1 if you have the <unistd.h> header file. */
-/* Define to 1 if you have the <utime.h> header file. */
-/* Define to 1 if you have the <wctype.h> header file. */
-/* Define to 1 if you have the <windows.h> header file. */
-/* #undef HAVE_WINDOWS_H */
-/* Define to 1 if you have the <winsock.h> header file. */
-/* #undef HAVE_WINSOCK_H */
-/* Define to 1 if you have the `_chsize' function. */
-/* #undef HAVE__CHSIZE */
-/* Define to Haskell type for cc_t */
-/* Define to Haskell type for char */
-/* Define to Haskell type for clock_t */
-/* Define to Haskell type for dev_t */
-/* Define to Haskell type for double */
-/* Define to Haskell type for float */
-/* Define to Haskell type for gid_t */
-/* Define to Haskell type for ino_t */
-/* Define to Haskell type for int */
-/* Define to Haskell type for intmax_t */
-/* Define to Haskell type for intptr_t */
-/* Define to Haskell type for long */
-/* Define to Haskell type for long long */
-/* Define to Haskell type for mode_t */
-/* Define to Haskell type for nlink_t */
-/* Define to Haskell type for off_t */
-/* Define to Haskell type for pid_t */
-/* Define to Haskell type for ptrdiff_t */
-/* Define to Haskell type for rlim_t */
-/* Define to Haskell type for short */
-/* Define to Haskell type for signed char */
-/* Define to Haskell type for sig_atomic_t */
-/* Define to Haskell type for size_t */
-/* Define to Haskell type for speed_t */
-/* Define to Haskell type for ssize_t */
-/* Define to Haskell type for suseconds_t */
-/* Define to Haskell type for tcflag_t */
-/* Define to Haskell type for time_t */
-/* Define to Haskell type for uid_t */
-/* Define to Haskell type for uintmax_t */
-/* Define to Haskell type for uintptr_t */
-/* Define to Haskell type for unsigned char */
-/* Define to Haskell type for unsigned int */
-/* Define to Haskell type for unsigned long */
-/* Define to Haskell type for unsigned long long */
-/* Define to Haskell type for unsigned short */
-/* Define to Haskell type for useconds_t */
-/* Define to Haskell type for wchar_t */
-/* Define to the address where bug reports for this package should be sent. */
-/* Define to the full name of this package. */
-/* Define to the full name and version of this package. */
-/* Define to the one symbol short name of this package. */
-/* Define to the home page for this package. */
-/* Define to the version of this package. */
-/* The size of `kev.filter', as computed by sizeof. */
-/* The size of `kev.flags', as computed by sizeof. */
-/* The size of `struct MD5Context', as computed by sizeof. */
-/* Define to 1 if you have the ANSI C header files. */
-/* Number of bits in a file offset, on hosts where this is settable. */
-/* #undef _FILE_OFFSET_BITS */
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-var h$errno = 0;
-function h$__hscore_get_errno() {
-  ;
-  return h$errno;
-}
-function h$unsupported(status, c) {
-    h$errno = 12456;
-    if(c) c(status);
-    return status;
-}
-function h$strerror(err) {
-    if(err === 12456) {
- { h$ret1 = (0); return (h$encodeUtf8("operation unsupported on this platform")); };
-    }
-    { h$ret1 = (0); return (h$encodeUtf8(h$errorStrs[err] || "unknown error")); };
-}
-function h$setErrno(e) {
-  ;
-  var es = e.toString();
-  var getErr = function() {
-      if(es.indexOf('ENOTDIR') !== -1) return 20;
-      if(es.indexOf('ENOENT') !== -1) return 2;
-      if(es.indexOf('EEXIST') !== -1) return 17;
-      if(es.indexOf('ENETUNREACH') !== -1) return 22; // fixme
-      if(es.indexOf('EPERM') !== -1) return 1;
-      if(es.indexOf('EMFILE') !== -1) return 24;
-      if(es.indexOf('EPIPE') !== -1) return 32;
-      if(es.indexOf('EAGAIN') !== -1) return 35;
-      if(es.indexOf('Bad argument') !== -1) return 2; // fixme?
-      throw ("setErrno not yet implemented: " + e);
-  }
-  h$errno = getErr();
-}
-var h$errorStrs = { 7: "too big"
-                   , CONST_EACCESS: "no access"
-                   , 22: "invalid"
-                   , 9: "bad file descriptor"
-                   , 20: "not a directory"
-                   , 2: "no such file or directory"
-                   , 1: "operation not permitted"
-                   , 17: "file exists"
-                   , 24: "too many open files"
-                   , 32: "broken pipe"
-                   , 35: "resource temporarily unavailable"
-                   }
-function h$handleErrno(r_err, f) {
-  try {
-    return f();
-  } catch(e) {
-    h$setErrno(e);
-    return r_err;
-  }
-}
-function h$handleErrnoS(r_err, r_success, f) {
-  try {
-    f();
-    return r_success;
-  } catch(e) {
-    h$setErrno(e);
-    return r_err;
-  }
-}
-function h$handleErrnoC(err, r_err, r_success, c) {
-    if(err) {
-        h$setErrno(err);
-        c(r_err);
-    } else {
-        c(r_success);
-    }
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-function h$MD5Init(ctx, ctx_off) {
-  if(!ctx.arr) { ctx.arr = []; }
-  ctx.arr[ctx_off] = new goog.crypt.Md5();
-}
-var h$__hsbase_MD5Init = h$MD5Init;
-function h$MD5Update(ctx, ctx_off, data, data_off, len) {
-  var arr = new Uint8Array(data.buf, data_off);
-  ctx.arr[ctx_off].update(arr, len);
-}
-var h$__hsbase_MD5Update = h$MD5Update;
-function h$MD5Final(dst, dst_off, ctx, ctx_off) {
-  var digest = ctx.arr[ctx_off].digest();
-  for(var i=0;i<16;i++) {
-    dst.u8[dst_off+i] = digest[i];
-  }
-}
-var h$__hsbase_MD5Final = h$MD5Final;
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-function h$hs_eqWord64(a1,a2,b1,b2) {
-  return (a1===b1 && a2===b2) ? 1 : 0;
-}
-function h$hs_neWord64(a1,a2,b1,b2) {
-  return (a1 !== b1 || a2 !== b2) ? 1 : 0;
-}
-function h$hs_word64ToWord(a1,a2) {
-  return a2;
-}
-function h$hs_wordToWord64(w) {
-  { h$ret1 = (w); return (0); };
-}
-function h$hs_intToInt64(a) {
-  { h$ret1 = (a); return ((a < 0) ? -1 : 0); };
-}
-function h$hs_int64ToWord64(a1,a2) {
-  { h$ret1 = (a2); return (a1); };
-}
-function h$hs_word64ToInt64(a1,a2) {
-  { h$ret1 = (a2); return (a1); };
-}
-function h$hs_int64ToInt(a1,a2) {
-  return a2;
-}
-function h$hs_negateInt64(a1,a2) {
-  var c = goog.math.Long.fromBits(a2,a1).negate();
-  { h$ret1 = (c.getLowBits()); return (c.getHighBits()); };
-}
-function h$hs_not64(a1,a2) {
-  { h$ret1 = (~a2); return (~a1); };
-}
-function h$hs_xor64(a1,a2,b1,b2) {
-  { h$ret1 = (a2 ^ b2); return (a1 ^ b1); };
-}
-function h$hs_and64(a1,a2,b1,b2) {
-  { h$ret1 = (a2 & b2); return (a1 & b1); };
-}
-function h$hs_or64(a1,a2,b1,b2) {
-  { h$ret1 = (a2 | b2); return (a1 | b1); };
-}
-function h$hs_eqInt64(a1,a2,b1,b2) {
-  return (a1 === b1 && a2 === b2) ? 1 : 0;
-}
-function h$hs_neInt64(a1,a2,b1,b2) {
-  return (a1 !== b1 || a2 !== b2) ? 1 : 0;
-}
-function h$hs_leInt64(a1,a2,b1,b2) {
-  if(a1 === b1) {
-    var a2s = a2 >>> 1;
-    var b2s = b2 >>> 1;
-    return (a2s < b2s || (a2s === b2s && ((a2&1) <= (b2&1)))) ? 1 : 0;
-  } else {
-    return (a1 < b1) ? 1 : 0;
-  }
-}
-function h$hs_ltInt64(a1,a2,b1,b2) {
-  if(a1 === b1) {
-    var a2s = a2 >>> 1;
-    var b2s = b2 >>> 1;
-    return (a2s < b2s || (a2s === b2s && ((a2&1) < (b2&1)))) ? 1 : 0;
-  } else {
-    return (a1 < b1) ? 1 : 0;
-  }
-}
-function h$hs_geInt64(a1,a2,b1,b2) {
-  if(a1 === b1) {
-    var a2s = a2 >>> 1;
-    var b2s = b2 >>> 1;
-    return (a2s > b2s || (a2s === b2s && ((a2&1) >= (b2&1)))) ? 1 : 0;
-  } else {
-    return (a1 > b1) ? 1 : 0;
-  }
-}
-function h$hs_gtInt64(a1,a2,b1,b2) {
-  if(a1 === b1) {
-    var a2s = a2 >>> 1;
-    var b2s = b2 >>> 1;
-    return (a2s > b2s || (a2s === b2s && ((a2&1) > (b2&1)))) ? 1 : 0;
-  } else {
-    return (a1 > b1) ? 1 : 0;
-  }
-}
-function h$hs_quotWord64(a1,a2,b1,b2) {
-  var a = h$bigFromWord64(a1,a2);
-  var b = h$bigFromWord64(b1,b2);
-  var c = a.divide(b);
-  { h$ret1 = (c.intValue()); return (c.shiftRight(32).intValue()); };
-}
-function h$hs_timesInt64(a1,a2,b1,b2) {
-  var c = goog.math.Long.fromBits(a2,a1).multiply(goog.math.Long.fromBits(b2,b1));
-  { h$ret1 = (c.getLowBits()); return (c.getHighBits()); };
-}
-function h$hs_quotInt64(a1,a2,b1,b2) {
-  var c = goog.math.Long.fromBits(a2,a1).div(goog.math.Long.fromBits(b2,b1));
-  { h$ret1 = (c.getLowBits()); return (c.getHighBits()); };
-}
-function h$hs_remInt64(a1,a2,b1,b2) {
-  var c = goog.math.Long.fromBits(a2,a1).modulo(goog.math.Long.fromBits(b2,b1));
-  { h$ret1 = (c.getLowBits()); return (c.getHighBits()); };
-}
-function h$hs_plusInt64(a1,a2,b1,b2) {
-  var c = goog.math.Long.fromBits(a2,a1).add(goog.math.Long.fromBits(b2,b1));
-  { h$ret1 = (c.getLowBits()); return (c.getHighBits()); };
-}
-function h$hs_minusInt64(a1,a2,b1,b2) {
-  var c = goog.math.Long.fromBits(a2,a1).subtract(goog.math.Long.fromBits(b2,b1));
-  { h$ret1 = (c.getLowBits()); return (c.getHighBits()); };
-}
-function h$hs_leWord64(a1,a2,b1,b2) {
-  if(a1 === b1) {
-    var a2s = a2 >>> 1;
-    var b2s = b2 >>> 1;
-    return (a2s < b2s || (a2s === b2s && ((a2&1) <= (b2&1)))) ? 1 : 0;
-  } else {
-    var a1s = a1 >>> 1;
-    var b1s = b1 >>> 1;
-    return (a1s < b1s || (a1s === b1s && ((a1&1) <= (b1&1)))) ? 1 : 0;
-  }
-}
-function h$hs_ltWord64(a1,a2,b1,b2) {
-  if(a1 === b1) {
-    var a2s = a2 >>> 1;
-    var b2s = b2 >>> 1;
-    return (a2s < b2s || (a2s === b2s && ((a2&1) < (b2&1)))) ? 1 : 0;
-  } else {
-    var a1s = a1 >>> 1;
-    var b1s = b1 >>> 1;
-    return (a1s < b1s || (a1s === b1s && ((a1&1) < (b1&1)))) ? 1 : 0;
-  }
-}
-function h$hs_geWord64(a1,a2,b1,b2) {
-  if(a1 === b1) {
-    var a2s = a2 >>> 1;
-    var b2s = b2 >>> 1;
-    return (a2s > b2s || (a2s === b2s && ((a2&1) >= (b2&1)))) ? 1 : 0;
-  } else {
-    var a1s = a1 >>> 1;
-    var b1s = b1 >>> 1;
-    return (a1s > b1s || (a1s === b1s && ((a1&1) >= (b1&1)))) ? 1 : 0;
-  }
-}
-function h$hs_gtWord64(a1,a2,b1,b2) {
-  if(a1 === b1) {
-    var a2s = a2 >>> 1;
-    var b2s = b2 >>> 1;
-    return (a2s > b2s || (a2s === b2s && ((a2&1) > (b2&1)))) ? 1 : 0;
-  } else {
-    var a1s = a1 >>> 1;
-    var b1s = b1 >>> 1;
-    return (a1s > b1s || (a1s === b1s && ((a1&1) > (b1&1)))) ? 1 : 0;
-  }
-}
-function h$hs_remWord64(a1,a2,b1,b2) {
-  var a = h$bigFromWord64(a1,a2);
-  var b = h$bigFromWord64(b1,b2);
-  var c = a.mod(b);
-  { h$ret1 = (c.intValue()); return (c.shiftRight(32).intValue()); };
-}
-function h$hs_uncheckedIShiftL64(a1,a2,n) {
-  var num = new goog.math.Long(a2,a1).shiftLeft(n);
-  { h$ret1 = (num.getLowBits()); return (num.getHighBits()); };
-}
-function h$hs_uncheckedIShiftRA64(a1,a2,n) {
-  var num = new goog.math.Long(a2,a1).shiftRight(n);
-  { h$ret1 = (num.getLowBits()); return (num.getHighBits()); };
-}
-// always nonnegative n?
-function h$hs_uncheckedShiftL64(a1,a2,n) {
-  n &= 63;
-  if(n == 0) {
-    { h$ret1 = (a2); return (a1); };
-  } else if(n < 32) {
-    { h$ret1 = (a2 << n); return ((a1 << n) | (a2 >>> (32-n))); };
-  } else {
-    { h$ret1 = (0); return (((a2 << (n-32))|0)); };
-  }
-}
-function h$hs_uncheckedShiftRL64(a1,a2,n) {
-  n &= 63;
-  if(n == 0) {
-    { h$ret1 = (a2); return (a1); };
-  } else if(n < 32) {
-    { h$ret1 = ((a2 >>> n ) | (a1 << (32-n))); return (a1 >>> n); };
-  } else {
-    { h$ret1 = (a1 >>> (n-32)); return (0); };
-  }
-}
-// fixme this function appears to deoptimize a lot due to smallint overflows
-function h$imul_shim(a, b) {
-    var ah = (a >>> 16) & 0xffff;
-    var al = a & 0xffff;
-    var bh = (b >>> 16) & 0xffff;
-    var bl = b & 0xffff;
-    // the shift by 0 fixes the sign on the high part
-    // the final |0 converts the unsigned value into a signed value
-    return (((al * bl)|0) + (((ah * bl + al * bh) << 16) >>> 0)|0);
-}
-var h$mulInt32 = Math.imul ? Math.imul : h$imul_shim;
-// function h$mulInt32(a,b) {
-//  return goog.math.Long.fromInt(a).multiply(goog.math.Long.fromInt(b)).getLowBits();
-// }
-// var hs_mulInt32 = h$mulInt32;
-function h$mulWord32(a,b) {
-  return goog.math.Long.fromBits(a,0).multiply(goog.math.Long.fromBits(b,0)).getLowBits();
-}
-function h$mul2Word32(a,b) {
-  var c = goog.math.Long.fromBits(a,0).multiply(goog.math.Long.fromBits(b,0));
-  { h$ret1 = (c.getLowBits()); return (c.getHighBits()); };
-}
-function h$quotWord32(a,b) {
-  return goog.math.Long.fromBits(a,0).div(goog.math.Long.fromBits(b,0)).getLowBits();
-}
-function h$remWord32(a,b) {
-  return goog.math.Long.fromBits(a,0).modulo(goog.math.Long.fromBits(b,0)).getLowBits();
-}
-function h$quotRem2Word32(a1,a2,b) {
-  var a = h$bigFromWord64(a1,a2);
-  var b = h$bigFromWord(b);
-  var d = a.divide(b);
-  { h$ret1 = (a.subtract(b.multiply(d)).intValue()); return (d.intValue()); };
-}
-function h$wordAdd2(a,b) {
-  var c = goog.math.Long.fromBits(a,0).add(goog.math.Long.fromBits(b,0));
-  { h$ret1 = (c.getLowBits()); return (c.getHighBits()); };
-}
-// this does an unsigned shift, is that ok?
-function h$uncheckedShiftRL64(a1,a2,n) {
-  if(n < 0) throw "unexpected right shift";
-  n &= 63;
-  if(n == 0) {
-    { h$ret1 = (a2); return (a1); };
-  } else if(n < 32) {
-    { h$ret1 = ((a2 >>> n) | (a1 << (32 - n))); return ((a1 >>> n)); };
-  } else {
-    { h$ret1 = (a2 >>> (n - 32)); return (0); };
-  }
-}
-function h$isDoubleNegativeZero(d) {
-  ;
-  return (d===0 && (1/d) === -Infinity) ? 1 : 0;
-}
-function h$isFloatNegativeZero(d) {
-  ;
-  return (d===0 && (1/d) === -Infinity) ? 1 : 0;
-}
-function h$isDoubleInfinite(d) {
-  return (d === Number.NEGATIVE_INFINITY || d === Number.POSITIVE_INFINITY) ? 1 : 0;
-}
-function h$isFloatInfinite(d) {
-  return (d === Number.NEGATIVE_INFINITY || d === Number.POSITIVE_INFINITY) ? 1 : 0;
-}
-function h$isFloatFinite(d) {
-  return (d !== Number.NEGATIVE_INFINITY && d !== Number.POSITIVE_INFINITY && !isNaN(d)) ? 1 : 0;
-}
-function h$isDoubleFinite(d) {
-  return (d !== Number.NEGATIVE_INFINITY && d !== Number.POSITIVE_INFINITY && !isNaN(d)) ? 1 : 0;
-}
-function h$isDoubleNaN(d) {
-  return (isNaN(d)) ? 1 : 0;
-}
-function h$isFloatNaN(d) {
-  return (isNaN(d)) ? 1 : 0;
-}
-function h$isDoubleDenormalized(d) {
-  return (d !== 0 && Math.abs(d) < 2.2250738585072014e-308) ? 1 : 0;
-}
-function h$isFloatDenormalized(d) {
-  return (d !== 0 && Math.abs(d) < 2.2250738585072014e-308) ? 1 : 0;
-}
-var h$convertBuffer = new ArrayBuffer(8);
-var h$convertDouble = new Float64Array(h$convertBuffer);
-var h$convertFloat = new Float32Array(h$convertBuffer);
-var h$convertInt = new Int32Array(h$convertBuffer);
-// use direct inspection through typed array for decoding floating point numbers if this test gives
-// the expected answer. fixme: does this test catch all non-ieee or weird endianness situations?
-h$convertFloat[0] = 0.75;
-// h$convertFloat[0] = 1/0; // to force using fallbacks
-var h$decodeFloatInt = h$convertInt[0] === 1061158912 ? h$decodeFloatIntArray : h$decodeFloatIntFallback;
-var h$decodeDouble2Int = h$convertInt[0] === 1061158912 ? h$decodeDouble2IntArray : h$decodeDouble2IntFallback;
-function h$decodeFloatIntArray(d) {
-    ;
-    if(isNaN(d)) {
-        { h$ret1 = (105); return (-12582912); };
-    }
-    h$convertFloat[0] = d;
-    var i = h$convertInt[0];
-    var exp = (i&2139095040) >> 23;
-    var s = i&8388607;
-    if(exp === 0) { // zero or denormal
-        if(s === 0) {
-            ;
-     { h$ret1 = (0); return (0); };
-        } else {
-            h$convertFloat[0] = d*8388608;
-            i = h$convertInt[0];
-            ;
-     { h$ret1 = (((i&2139095040) >> 23) - 173); return ((((i&8388607)<<7)|(i&2147483648))>>7); }
-        }
-    } else {
-        ;
-        { h$ret1 = (exp - 150); return ((((s|8388608)<<7)|(i&2147483648))>>7); };
-    }
-}
-function h$decodeFloatIntFallback(d) {
-    ;
-    if(isNaN(d)) {
-      { h$ret1 = (105); return (-12582912); };
-    }
-    var ret0, ret1;
-    { (ret0) = (h$integer_cmm_decodeDoublezhFallback(d)); (ret1) = h$ret1; };
-    var exponent = ret0 + 29;
-    var significand = ret1.shiftRight(28).add(h$bigOne).shiftRight(1).intValue();
-    if(exponent > 105) {
-      exponent = 105;
-      significand = d > 0 ? 8388608 : -8388608;
-    } else if(exponent < -151 || significand === 0) {
-      significand = 0;
-      exponent = 0;
-    }
-    ;
-    { h$ret1 = (exponent); return (significand); };
-}
-function h$decodeDouble2IntArray(d) {
-    ;
-    if(isNaN(d)) {
- { h$ret1 = (-1572864); h$ret2 = (0); h$ret3 = (972); return (1); };
-    }
-    h$convertDouble[0] = d;
-    ;
-    var i1 = h$convertInt[1];
-    var ret1, ret2 = h$convertInt[0], ret3;
-    var exp = (i1&2146435072)>>>20;
-    if(exp === 0) { // denormal or zero
-        if((i1&2147483647) === 0 && ret2 === 0) {
-            ret1 = 0;
-            ret3 = 0;
-        } else {
-            h$convertDouble[0] = d*9007199254740992;
-            i1 = h$convertInt[1];
-            ret1 = (i1&1048575)|1048576;
-            ret2 = h$convertInt[0];
-            ret3 = ((i1&2146435072)>>>20)-1128;
-        }
-    } else {
-        ret3 = exp-1075;
-        ret1 = (i1&1048575)|1048576;
-    }
-    ;
-    { h$ret1 = (ret1); h$ret2 = (ret2); h$ret3 = (ret3); return (i1<0?-1:1); };
-}
-function h$decodeDouble2IntFallback(d) {
-    ;
-    if(isNaN(d)) {
- { h$ret1 = (-1572864); h$ret2 = (0); h$ret3 = (972); return (1); };
-    }
-    var exponent, significand;
-    { (exponent) = (h$integer_cmm_decodeDoublezhFallback(d)); (significand) = h$ret1; };
-    var sign = d<0?-1:1;
-    var s = significand.abs();
-    var ret1 = s.shiftRight(32).intValue();
-    var ret2 = s.intValue();
-    var ret3 = exponent;
-    ;
-    { h$ret1 = (ret1); h$ret2 = (ret2); h$ret3 = (ret3); return (sign); };
-}
-// round .5 to nearest even number
-function h$rintDouble(a) {
-  var rounda = Math.round(a);
-  if(a >= 0) {
-    if(a%1===0.5 && rounda%2===1) { // tie
-      return rounda-1;
-    } else {
-      return rounda;
-    }
-  } else {
-    if(a%1===-0.5 && rounda%2===-1) { // tie
-      return rounda-1;
-    } else {
-      return rounda;
-    }
-  }
-}
-var h$rintFloat = h$rintDouble;
-function h$acos(d) { return Math.acos(d); }
-function h$acosf(f) { return Math.acos(f); }
-function h$asin(d) { return Math.asin(d); }
-function h$asinf(f) { return Math.asin(f); }
-function h$atan(d) { return Math.atan(d); }
-function h$atanf(f) { return Math.atan(f); }
-function h$atan2(x,y) { return Math.atan2(x,y); }
-function h$atan2f(x,y) { return Math.atan2(x,y); }
-function h$cos(d) { return Math.cos(d); }
-function h$cosf(f) { return Math.cos(f); }
-function h$sin(d) { return Math.sin(d); }
-function h$sinf(f) { return Math.sin(f); }
-function h$tan(d) { return Math.tan(d); }
-function h$tanf(f) { return Math.tan(f); }
-function h$cosh(d) { return (Math.exp(d)+Math.exp(-d))/2; }
-function h$coshf(f) { return h$cosh(f); }
-function h$sinh(d) { return (Math.exp(d)-Math.exp(-d))/2; }
-function h$sinhf(f) { return h$sinh(f); }
-function h$tanh(d) { return (Math.exp(2*d)-1)/(Math.exp(2*d)+1); }
-function h$tanhf(f) { return h$tanh(f); }
-var h$popCntTab =
-   [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
-    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
-    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
-    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
-    1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
-    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
-    2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
-    3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8];
-function h$popCnt32(x) {
-   return h$popCntTab[x&0xFF] +
-          h$popCntTab[(x>>>8)&0xFF] +
-          h$popCntTab[(x>>>16)&0xFF] +
-          h$popCntTab[(x>>>24)&0xFF]
-}
-function h$popCnt64(x1,x2) {
-   return h$popCntTab[x1&0xFF] +
-          h$popCntTab[(x1>>>8)&0xFF] +
-          h$popCntTab[(x1>>>16)&0xFF] +
-          h$popCntTab[(x1>>>24)&0xFF] +
-          h$popCntTab[x2&0xFF] +
-          h$popCntTab[(x2>>>8)&0xFF] +
-          h$popCntTab[(x2>>>16)&0xFF] +
-          h$popCntTab[(x2>>>24)&0xFF];
-}
-function h$bswap64(x1,x2) {
-  { h$ret1 = ((x1 >>> 24) | (x1 << 24) | ((x1 & 0xFF00) << 8) | ((x1 & 0xFF0000) >> 8)); return ((x2 >>> 24) | (x2 << 24) | ((x2 & 0xFF00) << 8) | ((x2 & 0xFF0000) >> 8)); };
-}
-var h$clz32 = Math.clz32 || function(x) {
-    if (x < 0) return 0;
-    if (x === 0) return 32;
-    return 31 - ((Math.log(x) / Math.LN2) | 0);
-}
-function h$clz8(x) {
-    return h$clz32(x&255)-24;
-}
-function h$clz16(x) {
-    return h$clz32(x&65535)-16;
-}
-function h$clz64(x1,x2) {
-    return (x1 === 0) ? 32 + h$clz32(x2) : h$clz32(x1);
-}
-var h$ctz32tbl = [32,0,1,26,2,23,27,0,3,16,24,30,28,11,0,13,4,7,17,0,25,22,31,15,29,10,12,6,0,21,14,9,5,20,8,19,18,0,0,0,0,0,31];
-function h$ctz32(x) {
-    return h$ctz32tbl[((x&-x)%37)&63];
-}
-function h$ctz16(x) {
-    return h$ctz32(x|65536);
-}
-function h$ctz8(x) {
-    return h$ctz32(x|256);
-}
-function h$ctz64(x1,x2) {
-    return (x2 === 0) ? 32 + h$ctz32(x1) : h$ctz32(x2);
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// Unicode tables generated by ghcjs/utils/genUnicode.hs
-var h$printRanges = "f|!-f=|/q'/+1$J|(mo'1q&')| 63Y--EO'|$9| ('| ?'|!9?| ?-| %'AZ'| JI| +|#U2'''O0$)+'5'''+3*','O-).+''O0&&&'$-+''))0+$1C9)4(N0&,'7(('@+';A)2'''O0&,'5''')3'+','G7'.))*)'$&)')));+-))*'.>M-+2(PB)3(*1'&/+'733(2(P6,'5(*1'1$+'7&?)2(u'3(,32+'C)1''F)S4$'1)*/$2/7');| =+^n'$''$'.+0( #''<('-$.'7'+d| Yk+rk@<n|$G$-&|(E*'1$*'v*'f*'1$*'A| :*'| O'd)W/| t9|.r)|! 1=09Q5K;=(&;|!+'7/7/?'7/| z3z-| U7b:+;+(x'-9|  +W/9)| E'| K]'9/7/?'A| K| b+| #)|!W3| A)A)| /| I33r&/|%M/|&;'/'p'/'3 $a'| 3@>'/H')48-S1| +C''Y<)`GfA|#)/|-h-rU9M|H;'d'h);2| %| '| &|#<-| #$-&| 91'?S510000000|!4| CW| {;|$hW;+| I| u'|!=-v)|!+y-l;| '|$y} ^y7}%0j| /|9t)| 75|'fK|!+| {3|#3_''| S| 3+7/| 93| S5;/[+| r9`)| f8+f| 65?'7'|!=S[7/'/'/510| (+'|!#| %'7/}!e;;Q+| +}!'n|(/'|!Cp1;--W,$&&|!gE|(-C| I'| 5t?'W/?'jH*+-|#!+|$7)/'/'/'))10='';VH&@'?h|!f-)+| #)| v);+| &| %|!t^)| +A[+l;Y-z-`m+?x|#Q'7| vt3| 19|#4|&v5O73|#E/'$|  &)&Q| X35| j[)Y-| H| 9/'| I+&-3(X+)+5351| Idr+;5| 5)^'Y-W1+;1| j| [|+tb|(U| f+`A| E*?U17/| 3>;r5| [+&9/K9Gy|!S| ?-71)2'''O0&,'5''')5,1'1)-|%x| Y37|#b| 5'G| 5| S97p| 937|*K| p;|)y| ;|<Y|4M|!=|!M,|b`|7l}#8j|,^1b6+'|!/`'/7| U770L-I|3U| S9| 'CE}$&7'|e7|!E-=)517'+} 47|%M7r'| ^3|!5h| U|$/| x5G|#1| t| V&'&''+:$0| J*'30Z*,$)1|'T'|&O'| -}  %|$E'C|=C+X&$'$7* #/* $)&$' &'$'+0**$6D-),D| 1'|&#|  +|!7;A'A@m7=)b| @+z| `^=z-51'|#r| #)| f'| h-l3|%`| _-xu|#P'|#+C=)+;|!W;| tz;+| 937/t3`|I^}*Q/v} !59|$x}$#I|,'|G1|%A";
-var h$alnumRanges = "| +71W/W| '0'$)'(Pa|*2+;?-1$D|!Y&'+$/$)$J| o|#*|#oo'0r5| #$&&$3Y-)^9-| ^+|!;2'7H'B| ?'|!9?| 5+,| %G[| QI| +|!p'7H2'''O0$)+'5'''+3*',';'/1).+''O0&&&'$-+''))0+$1C9)4(N0&,'7(('@+'7E)2'''O0&,'5''')3'+','707'.))*)'$&)')));+-))*'.>==+2(PB)3(*1'&/+'731')2(P6,'5(*1'1$+'7&?)2(u'3(,32+'C+/''F)S4$'1)*/$2/7''=| =-A6r'$''$'.+0( #''<('-$.'7'+dP'/K $+7k+KFk5| :| ^/| f'p$-&z|'F*'1$*'v*'f*'1$*'A| :*'| O')5K)CC| t;|-j'EV-| `)91=09M9K;=(&;| r)*''7/7E)'7/| z3z-| U7b:+;7t'-9|  +W/9n[+| G]'9/7=2A| K| b+7E5;|!W;| 937)| +| n)i&/|%M/|&;'/'p'/'3 $a'| 30$))0)+'/+=-)0|!U''/-9/=| /fE*&7$)-/ $+8'+--+$| =|0/| A| fO|.#`|91| '| &|!y/55&p$-&| 91@S510000000c| '|*H)UA,'-+| v''')|!!*-v)|!+)+7Y| 3Cd7`3@d7rA|'-} X;| ^}%/C| /|9t| O| %'|& )[K| /6a| on5'|!='+_''| S| +3/7| 1;| S97/S)*| %'l;^)| K?9/b| 65?'7/Q)| [S)'C'-7/'/'/510y*+'|!#z&'7/}!e;;Q+| +}!'n|(/'|!Cp1;--;<,$&&|!Ff|()G| I'| 5t;+CC?| M-|#!I71W/W9|! )/'/'/')j;VH&@'?h|!f;| #;| ;E'|!Q|!s^)| +A[+l;Y-z-`'l+3,x|#Q'7| vt3| 1|#M|&v5O73|#E/'$|  &)&Q'b'p35| j[+W| U| 9/'| I+&-3(X+)+5Sbcd3_+-C| 57O'Y-WQ1| j| [|+tb|(U| W9`A| AMU17/| 36Cl'4| S99/K9Gm|!`| ?-71)2'''O0&,'5''')5,1'1)-|%x| U$37|#b| 5'5| G| K)87p| 937|*K| p;|)y| ;|<Y|4M|!=|!M|bl|7l}#8j|,^1b6|!;`'-9| 75+;70L-I|3U| S9| 'CE}$&7'|e7|!E-=)517)'} <3-)/33'1`+|#=)|&=G|#1| t| V&'&''+:$0| J*'30Z*,$)1|'T'UTaTaTaTaT2'| -}  %|$E'C|=C+X&$'$7* #/* $)&$' &'$'+0**$6D-),D|,t=|v'}*Q/v} !59|$x}$#I|,'|G1|%A";
-var h$lowerRanges = "|!3W| =uS2 <& (& 8' #)'$&('+&()'& #&$'$'($&'')/&& )' )&'$( >1'&'$+ %| SX|$=$(()GXj&)) ,,$'&'| /| ) 25 ;& '' Q| +r} KQ|  | G=g|!; l5 Q43/73333/73333?'333333-&/()&3+''337)&|&+(')X**&'3++| 2|]a| ''(' $+$'.- R'1$*:p$-}'Zi 7H .|#! ') @2 #' %*$&$) +| j|28z5'}%!p1;-|7`W|;?t} :;d}+l-WW1FWWW+$08WWWWWWWWWWWWWWWWW[[U.WU.WU.WU.WU.$";
-var h$upperRanges = "| MW|!9Q0f <& (& 8' #)'$&('+&()'& #&$'$'($&)0'&& )' )&'$( >1'&'$+ %|&I$(2.$)$&D4j&)) ,,&$''| /| ) 14 <' '' P&p|a5p$-|l( l4 Q433/73333/9 $23S333333-9-9+;-9-|%l*()')'(-/ $+'+7'-| B|[]| '| +$)' $+$'2) R3$*}']( 7H .|#! '( ?6 #' %+$&$( ++''}%OGW|;/t} :Kd}+l9WWWWWW$''&''+2WWW'*'30Y'*,$)1YWWWWWWWWWWW`UfUfUfUfUf%";
-var h$alphaRanges = "| MW/W| '6*,Qa|*2+;?-1$|!q-&'+$/$)$J| o|#*3|#bo'0r| YY-)| #zj'|!4$A'1'7)'B$`^|! 9Rf5'+,O+4(PU| WI| l| 5)F07AC+3'''O0$)+)B<'(?'I/+''O0&&&b+$I)C5(N0&,)F@'j3'''O0&,)_'(AD$/))*)'$&)')));O| 03(PB)V'/'j3(P6,)c$'A'G3(u'BD'S/-G)S4$'1| =| )&;1| ='$''$'.+0( #''*&5&-$M+d| F3kY-|!UzKB/++)('1)+=;Dp$-&z|'F*'1$*'v*'f*'1$*'A| :*'| OnCC| t;|-j'EV-| `/31=*?G?G?=(A| 1j*| N| z3v$-| U7b| +`'-9|  M1| 9Q5| 3| n|!(| 'E1| 7`='7|  Wlv)7l|!E+*)'5|$;| I|&3'/'p'/'3 $a'| 30$))0)+'/+=-)0|!W<B=|!9*&7$)-/ $+8'+--+| 0'|[[| '| &|!y/+)';p$-&| 91BQ510000000| j|*H'x--'+| v/)|!!*-v)|!+EY| 3C|+E} X;| ^}%/C| /|9t| O| %'|& )C7'K| 'Cb'| U| +5'|!='+_''| S9(*P^| 1?| -| E/)>[7QU^1| '[B-67-uQ)2KQ)(| -$)''-'$R)'91);/'/'/510y*+'|!#j^}!e;;Q+| +}!'n|(/'|!Cp1;--$7<,$&&|!Ff|()G| I'| 5t;|!W-|#!lW/W9|! )/'/'/')j;VH&@'?h|!f|(^^)| +| 'dCE2/p7`'l+3| )|#Q|!3t3| 1|#M|&v5O73|#E/'$|  &)&Q7Q5b|!1O7W| U| 9/'| I@+(X|  ^)^j3ZY| 57O7I=G|!K| [|55| 3| `| #dUWlvj):| )?+MmGT|!x| 'p3'''O0&,)a-|&C| )K'$|$+| '| l| )K| >z|+/| Ib|)y| ;|<Y|4M|gU|7l}#8j|,^1b|!Q`G| )C+bM-I|3U| S9| L=}$&7'|e7|!E-=)517} K-| t| V&'&''+:$0| J*'30Z*,$)1|'T'UTaTaTaTaT2} !3|$E|=h+X&$'$7* #/* $)&$' &'$'+0**$6D-),D} (7}*Q/v} !59|$x}$#I|,'";
-var h$toLowerMapping = "| K Wb|!9 Qb!1bf  9#  !|$F  ## &'  (# &'  8#  !|!_# # #)  !|$^# ! # ! |$U !# '|$S&'  !| f|$M !|$O# ! |$S !|$W  !|$`|$[&)  !|$`|$d ! |$f $#  !|$n# ! |$n'  !#  !|$n#!'|$l ##  !|$p#) &1  !%# ! % !#  !%# ) #'  )# &'  !%# ! # ! |!. !| 6# 4 # ! |!q * #1  !}![r# ! |#X}%=]'  !#  !|$>| Q !| U# % #|&I  !# &) &3 |%0/  !n )l ! | G!'| E!Eb!5bj B3  ,# &- |!]'  !#  !.#' )|!qC| hdb| )  1# &5  <#  !?# ' #'  P# &' p| '|a5 p} hG ! } hG- }#To|l)  l# &5  !} p4  P# &5 303 /07 303 303 /09  $0 @3 30S 303 303 303 '0'| ZD9 +| sD9 '0'|!4; '0'|!L<9 '|!m'|!iD|&Y }#a()  !}!&:}!#V/ | 8| # CAI &|23 WU|Ht | '| '| +  !#  !}!Zc|ue}%:e'  $#  !}![R}!Zo !}![X}![V ! #' &3 '}!]> R# &3  !# &+ &}'])  7# &I  .# &|##  '# &)  ?# &7  ##  !}(b.# % #+  !# }4p*'  !# &)  +#  !}*H0}*HF !}*H>}*H*'  !}*G&}*GV}%OG Wb|;/ tr} :K db}p?  ";
-var h$toUpperMapping = "|!1 Wa| = |A$x Qa!1a !|!`  9!  !|%.  #! $'  (! $'  7! $'  #!  !!|&]|(_'  !! $' $) $- $' |$>)  !!|#Y) |%i'  #! $' $+ $' $)  !! $' $)  !! |!N-  !!$ ! ! !$  !!$ ) ! !| e  )! $'  !!$ ! !)  4! $)  )! $3 $' '}!]? ! !+  %!  !!}![Y !}![S}![W !|$]|$T!'|$R ! |$L ! |$N}4qo)  !|$R}*H? ! |$V ! }*GS !}*H1  !|$Z|$_ ! }!Zd}4q6'  !|$_  !}!Zp|$c' |)N1 }%:g' |)_' |)_)  !}*GW|$m|#&'|$k|#.- |)c9 }4o.|#b |#ez  !! $) $) )|!r| % | _)k!Ea| B5a|!m'| D ! | B|!P)  !| $| 2 !0  ,!  !!| s !| g/ !|!T |$8' $' $| 1 daC| g 2 !5  ;! $'  '!  !!> Q !| + p| &} N7 }1H>) } pP|!v  l! $- |!X-  P! $313 /17 313 313 /19  $1 B3 313 '| [+| t'|!5'|!n'|!M'|!j' 313 313 313 '1 ! 37 }#R4+ F; '1? '1) >= F|'b | 6f C@+ $|2f WT|IE | '| &' $)  !}![q}![k $ !/ $' $7  R! $3  !! $+ $; p} hF ! } hF- }#Tm}'Zj  7! $I  .! $|##  '! $)  ?! $7  !! $'  %! $+ $+  !! $)  *! $}%P= Wa|;? tq} :; da}p>; ";
-var h$catMapping = "d;P)3J)3 !/0 !34 !3.'37*'3)4'3W! !/3 !06 !-6W# !/4 !04f; !83+5 !73 !67 !&1 !4< !76 !74', !6#'3 !6, !&2),FQ!H1!S#H3# <!#$'# (!#$'# 8!#'! ##!)#'! !#!&'!&)!'#+!&'!&)!)#'!&'! ##!&'! !#!'# !!#'!&)! !#!&'!'# !&!)#+& !!$ !#! !$# !!$ )#!'# )!#$'# !!$ !#!&)! >#!1#'!&'!'# !!#+! %#!| S#,Y#G%+6;%?6-%16 !%6*E6|!O' #!# !%6 !!#' *)# !3!+ '6 !!3)! ! !!'!&E!!5!j#$'#)!)# ,!#$-# !!# !4!&'!'#| /!| )# 2!#N-'') <!#'! '#!'# Q!#!p!' */3!r# ! 3<' '7 !5 | #' !.'F''F'' !3'3 Y&- )&'39 /<)4'3J'3'79' !3<!'3d&*7&M'7*+3'&.|!5& !3&1' !<7/''%''N+''&7*)&'7,?3 ! < !&'`&Y'' |! &9',? 7*f&5''%N)3*- O&+'*5'*)'*-'' A3!U&)'' F| K I&| + b'0| 5& !'( !'&)(3'+(.'(,1'7&'''37* !3%A&.'(!3&' '&' O&!1& ! &) +&'  !'&)(+'' '(' '( !'&3 0+ '&!)&''' 7*'&'5/, !75- '' !( /&+ '&' O&!1&!'&!'&!'&'  !' )(''+ ''' )') .1 +& ! &1 7*'')&.9 '' !( 5&!)&!O&!1&!'&!-&'  !'&)(-'!'' !( '(.' ,A '&''' 7* !35A .'(!3&' '&' O&!1&!'&!-&'  !'& !('0+'' '(' '(.3  !'(+ '&!)&''' 7* !7&/,7  !'&!/&) )&!+&) '& ! &!'&) '&) )&) ;&+ '(.'() )(!)(.' ,/ 0? 7*),/7 !57- .)(!3&!)&!Q&!C&) ,)'+(!)'!+'1 ''!'&/ '&''' 7*3 1, !7 .'(!3&!)&!Q&!7&!-&'  !'& !('-( ! ''(!'(''1 '(1  !& '&''' 7*!'&? .'(!3&!)&!v&' ,)(+'!)(!)( !'&3 03 '&''' 7*/,) N/&' '(!G&) S&!5& ! &' 1&) .+ )()' ! '!3(/ 7*' '(F; | )&.'&1'+ J/&*3'F7*'3n '& ! &' '& ! &' ,/ +&!1&!)& # &' '&!+&.'&/'!'',' -& ! %!/'' 7*' +&d ,)7A3 !73)7''/77*7, $7' #/0'(3&!l&+ ?'0-'F''-&9'!l'!37./7!'7-3+7'3n z&'(+'0/'0'''('',7*/3/&'(''+&)',)('&1()&+'=&.'(''/( !'&07*)(.'7p! ! !- $' z& !3%|'E&!+&' 1& ! &!+&' v&!+&' f&!+&' 1& ! &!+&' A&!| ;&!+&' | O&' )'53K,) C&77/ | t&9 <|-j&'3E&PW& !/0) | `&)3)+3&1 =&!+&)'9 G&)''35 G&''; =&!)&!''; | 1&''01'3(.'(9')3*)3 !5&.' 7*/ 7,/ /3<+3)' !< 7*/ j&*| 1&3 v& !'&- | U&7 b&!)'+('')(+ '(./()'+ N) '37*`&' -&9 |  &+ E(1&'(/ 7*8) h7Q&'''(.' '3| 3& !('01' ! ' !(''(3'/(7'' .7*/ 7*/ 13*/3' ?'2| K +'0| '& !'(-' !('-(.'(1&+ 7*13775'57) ''0`&0+''(''0)''&7*|  & !'('')( !'()''(3 +3l&3(3''('') -37*) )&7*`&/%'3| I 333 )'F='01'+&.+&'(.'&!''/ |  #| G%=#*h#n%| 5'/ +' l!#$5# Q!#$5#3!/#' /!' 3#3!3#3!/#' /!' 3# % !3#3!?#' 3#3$3#3$3#3$-#!'#+! !$6&)6)#!'#+!()6+#' '#+!!)63#-!)6' )#!'#+!('6!98-</.'3 !12>'1 !2/B33 !9:-<P53 !12+3'-)3 !4/@93 !43:73P-<!7< !,%' /,)4 !/0*7,)4 !/0!=%) `5G ='+).));'A '7$+7$'7&)!'#)! !#7$'7H-!/7 $!7+! !7#+!&+&&'7'#'!-4$+# !74'7 !#7C,j+ !!#++8/ -4-7'4+7H'7H'7H17Hb7'4'7 !47Hb7|%z437 #/0K7'417 !/0| l7H`7U4t7/4U7- r7U 97M | A,| f7O,|$)7H57H| 5734|!M7H|%Q7 (/0`,|  7-4 !/0b4 &/0C4|%b7|!v4 ,/0| G4 #/0d4 !/0|%f4| )7M4'7/4r7' d7' h7) ;7!37| % | '!!| '# ! !&)!'# $!#+! !#!'#$/#'%)! R#!'#/7 #!#)' !!#- +38'3p# ! #- &' | 9&1  !%3? .Q&5 1&!1&!1&!1&!1&!1&!1&!1&!d''3 #12)3 !12 !31D53<'3 !.3 !12'3 !12 %/0-3*73'.+3 !.3>| C W7!|! 7; |$h7W ;7+ P)3 !7% !&+ &/0'7 %/0 !./'0N5++''(<-%'7)+ !%&F'7!| v&' '''6'% !&.|!#&F)%,- v&) |!+&!'7+,77Y&- l7; C&b7!7,`73,NA,d77,r7A,| G7!|%b7} X;&7 | I7}%/C&| / M&*|9G&) | 775 t&/%'3|%z&*)3C&7*'&K  8!# !&'))F7' !3% /!#'% ! '| U&7+''/33 Q65%'6 '!#$)# @!#*3# #!#'! %#! !#%'6 #!# ! ! !#!)# +!#+!' '!| S ,'%&1&.)&.+&.Q&'(''0+7+ /,'7 !57/ | 1&+33 '(| -&C(.5 '37*/ G'/&)3,+ 7*[&3''3Q&9''(9 F^&) )'0| '&.'(+''(.+(=3 ! %7*+ '3-& !'%5&7*-&!v&/''('''(''5 )&.3& !'(' 7*' +3C&*/&)7 !&( !'(| -& !'&)''&''-&'' !&',S '&*'39&0'''('3,'% !('7 /&' /&' /&5 1&!1&!z#L+%+ '#|!# j&'(.'(.'( !3(.' 7*/ }!e;&; Q&+ | +&+ |MQ=} T7 |(/&' |!C&p 1#; -#-  !&'7&H=&!-& ! &!'&!'&!|!G&C6E |()& !0/C | I&' | 5&t ;& !57' C'13 !/0F/ ?'' F'.'- )/0'3 !/0+3)-)3!+3 !./ #0/@)3 !4.)4 ! 3J'3+ -&!|##&'  !< )3J)3 !/0 !34 !3.'37*'3)4'3W! !/3 !06 !-6W# !/4 !04 !/0 !3/@'37&*| #&'%b&) /&' /&' /&' )&) '5 !46N'5 ! 7+4'77 )<'7' ;&!W&!I&!'&!A&' ?&h |!f&- )3+ | #,) 57| 3++,E7',N) ;7+ N| ' | #7.|!t ^&) | +&A .Y,+ d&+,; E&63&6- p&-'- `& ! 3l&+ 3&F-+x t!t#| f&' 7*| v t&3 | 1&9 F|#5 |&v&5 O&7 3&|#E /&'  !& |  &!'&) ,' Q& ! 33,Q&'71,b&3 5,| j O&/,) FW&- F| I | 9&/ '&| I ,)'!''- +'+&!)&!Y&+ )'+ .3,3 531 ^&',F^&),d 3&N[&''+ -,135 | 5&) 13O&' 3,I&- 3,G&1 +3; 1,| j | [&|+t b,|(U  !('0| 3&A'13+ K,7*A )'0| #&)(+''('''3X+3? U&1 7*/ )'l&-'03'!7*+3; j&.'3,5 ''0| )&)(5''(+&+3+ F' 7*,/ K,9 G&!U&)()''( !'(''/3|!S | '&.)(3'- 7*1 .'(!3&' '&' O&!1&!'&!-&'  !'&'(.+(' '(' )(5 0- -&'(' 1') -'|%x | )&)(/' !('+(''0'''& !3&3 7*|#b | '&)(+'' +(''0''53| 5 | )&)(3''( !'('')3,9 7*p z& !'(.'(/' !('3 7*|*K d!d#7*5,; ,|)z | ;&|<Y |4M&|!= |!M+!-3|b` |7l&}#8j |,^&1 b&!7*+ '3|!/ `&' -'F7 | )&1'-3+7+% !377 7*!1,!M&- I&|3U | S&9 ,| %(C +'=%}$&7 '&|e7 |!E&- =&) 5&1 7&' N''F+<} 4/ |%M77 r7' | A7'()')7/(3<3''71'`7+'| )7h | M7)'N|$/ | x75 G,|#1 W!W#W!1#!G#W!W# !! '!' $' '!' +!!3!+# ! #!1#!9#W!W#'!!+!' 3!!1!!W#'!!+!!-! ! !) 1!!W#W!W#W!W#W!W#W!W#W!W#W![#' U!HU#H/#U!HU#H/#U!HU#H/#U!HU#H/#U!HU#H/# !!#' | -*}  % |$E&' 5,1'|=C +&!Y&!'& ! &'  !& 7&!+& # &/ ,+  $& )&!'& ! &'  && '& ! &' +&!1&!+&!+& ! &!7&!E&- )&!-&!E&| 1 '4|&# |  7+ |!77; A7' A7!A7!n77 =,) b7!| A7+ z7| ` ^7= z7- 571 '7|#r | #7) | f7' | h7- l73 |%`7!| `7- x7!v7!|#Q7' |#+7C =7) +7; |!W7; | t7z ;7+ | 973 77/ t73 `7|I^ }*Q/&v } !5&9 |$x&}$#I |,'&|AO X` |!/<|!p |%A'}PF' ";
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// encode a string constant
-function h$str(s) {
-  var enc = null;
-  return function() {
-    if(enc === null) {
-      enc = h$encodeUtf8(s);
-    }
-    return enc;
-  }
-}
-// encode a raw string from bytes
-function h$rstr(d) {
-  var enc = null;
-  return function() {
-    if(enc === null) {
-      enc = h$rawStringData(d);
-    }
-    return enc;
-  }
-}
-// these aren't added to the CAFs, so the list stays in mem indefinitely, is that a problem?
-function h$strt(str) { return (h$c1(h$lazy_e, (function() { return h$toHsString(str); }))); }
-function h$strta(str) { return (h$c1(h$lazy_e, (function() { return h$toHsStringA(str); }))); }
-function h$strtb(arr) { return (h$c1(h$lazy_e, (function() { return h$toHsStringMU8(arr); }))); }
-// unpack strings without thunks
-function h$ustra(str) { return h$toHsStringA(str); }
-function h$ustr(str) { return h$toHsString(str); }
-function h$urstra(arr) { return h$toHsList(arr); }
-function h$urstr(arr) { return h$toHsStringMU8(arr); }
-function h$caseMapping(x) {
-    return (x%2)?-((x+1)>>1):(x>>1);
-}
-var h$toUpper = null;
-function h$u_towupper(ch) {
-    if(h$toUpper == null) { h$toUpper = h$decodeMapping(h$toUpperMapping, h$caseMapping); }
-    return ch+(h$toUpper[ch]|0);
-}
-var h$toLower = null;
-function h$u_towlower(ch) {
-    if(h$toLower == null) { h$toLower = h$decodeMapping(h$toLowerMapping, h$caseMapping); }
-    return ch+(h$toLower[ch]|0);
-}
-var h$alpha = null;
-function h$u_iswalpha(a) {
-    if(h$alpha == null) { h$alpha = h$decodeRLE(h$alphaRanges); }
-    return h$alpha[a]|0;
-}
-var h$alnum = null;
-function h$u_iswalnum(a) {
-  if(h$alnum == null) { h$alnum = h$decodeRLE(h$alnumRanges); }
-  return h$alnum[a] == 1 ? 1 : 0;
-}
-// var h$spaceChars = [9,10,11,12,13,32,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288];
-function h$isSpace(a) {
-    if(a<5760) return a===32||(a>=9&&a<=13)||a===160;
-    return (a>=8192&&a<=8202)||a===5760||a===8239||a===8287||a===12288;
-}
-function h$u_iswspace(a) {
-    return h$isSpace(a)?1:0;
-}
-var h$lower = null;
-function h$u_iswlower(a) {
-    if(h$lower == null) { h$lower = h$decodeRLE(h$lowerRanges); }
-    if(a < 0x30000) return h$lower[a]|0;
-    if(a < 0xE0000) return 0;
-    return h$lower[a-0xB0000]|0;
-}
-var h$upper = null;
-function h$u_iswupper(a) {
-    if(h$upper == null) { h$upper = h$decodeRLE(h$upperRanges); }
-    if(a < 0x30000) return h$upper[a]|0;
-    if(a < 0xE0000) return 0;
-    return h$upper[a-0xB0000]|0;
-}
-var h$cntrlChars = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159];
-var h$cntrl = null;
-function h$u_iswcntrl(a) {
-    if(h$cntrl === null) {
-        h$cntrl = [];
-        for(var i=0;i<=159;i++) h$cntrl[i] = (h$cntrlChars.indexOf(i) !== -1) ? 1 : 0;
-    }
-    return a <= 159 ? h$cntrl[a] : 0;
-}
-var h$print = null;
-function h$u_iswprint(a) {
-    if(h$print == null) { h$print = h$decodeRLE(h$printRanges); }
-    if(a < 0x30000) return h$print[a]|0;
-    if(a < 0xE0000) return 0;
-    return h$print[a-0xB0000]|0;
-}
-// decode a packed string (Compactor encoding method) to an array of numbers
-function h$decodePacked(s) {
-    function f(o) {
-        var c = s.charCodeAt(o);
-        return c<34?c-32:c<92?c-33:c-34;
-    }
-    var r=[], i=0;
-    while(i < s.length) {
-        var c = s.charCodeAt(i);
-        if(c < 124) r.push(f(i++));
-        else if(c === 124) {
-            i += 3; r.push(90+90*f(i-2)+f(i-1));
-        } else if(c === 125) {
-            i += 4;
-            r.push(8190+8100*f(i-3)+90*f(i-2)+f(i-1));
-        } else throw ("h$decodePacked: invalid: " + c);
-    }
-    return r;
-}
-// decode string with encoded character ranges
-function h$decodeRLE(str) {
-    var r = [], x = 0, i = 0, j = 0, v, k, a = h$decodePacked(str);
-    while(i < a.length) {
-        v = a[i++];
-        if(v === 0) { // alternating
-            k = a[i++];
-            while(k--) {
-                r[j++] = x;
-                r[j++] = 1-x;
-            }
-        } else {
-            if(v <= 2) {
-                k = (a[i]<<16)+a[i+1];
-                i+=2;
-            } else k = (v-1)>>1;
-            if(v%2) {
-                r[j++] = x;
-                x = 1-x;
-            }
-            while(k--) r[j++] = x;
-            x = 1-x;
-        }
-    }
-    r.shift();
-    return r;
-}
-function h$decodeMapping(str, f) {
-    var r = [], i = 0, j = 0, k, v, v2, a = h$decodePacked(str);
-    while(i < a.length) {
-        v = a[i++];
-        if(v === 0) { // alternating
-            k = a[i];
-            v = f(a[i+1]);
-            v2 = f(a[i+2]);
-            while(k--) {
-                r[j++] = v;
-                r[j++] = v2;
-            }
-            i+=3;
-        } else {
-            if(v === 2) {
-                k = (a[i] << 16) + a[i+1];
-                v = a[i+2];
-                i += 3;
-            } else if(v%2) {
-                k = 1;
-                v = v>>1;
-            } else {
-                k = (v>>1)-1;
-                v = a[i++];
-            }
-            v = f(v);
-            while(k--) r[j++] = v;
-        }
-    }
-    return r;
-}
-var h$unicodeCat = null;
-function h$u_gencat(a) {
-    if(h$unicodeCat == null) h$unicodeCat = h$decodeMapping(h$catMapping, function(x) { return x; });
-    // private use
-    if(a >= 0xE000 && a <= 0xF8FF || a >= 0xF0000 & a <= 0xFFFFD || a >= 0x100000 && a <= 0x10FFFD) return 28;
-    var c = a < 0x30000 ? (h$unicodeCat[a]|0) :
-        (a < 0xE0000 ? 0 : (h$unicodeCat[a-0xB0000]|0));
-    return c?c-1:29;
-}
-function h$localeEncoding() {
-   // h$log("### localeEncoding");
-   { h$ret1 = (0); return (h$encodeUtf8("UTF-8")); }; // offset 0
-}
-function h$rawStringData(str) {
-    var v = h$newByteArray(str.length+1);
-    var u8 = v.u8;
-    for(var i=0;i<str.length;i++) {
-       u8[i] = str[i];
-    }
-    u8[str.length] = 0;
-    return v;
-}
-// encode a javascript string to a zero terminated utf8 byte array
-function h$encodeUtf8(str) {
-  var i, low;
-  var n = 0;
-  for(i=0;i<str.length;i++) {
-    // non-BMP encoded as surrogate pair in JavaScript string, get actual codepoint
-    var c = str.charCodeAt(i);
-    if (0xD800 <= c && c <= 0xDBFF) {
-      low = str.charCodeAt(i+1);
-      c = ((c - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
-      i++;
-    }
-    if(c <= 0x7F) {
-      n++;
-    } else if(c <= 0x7FF) {
-      n+=2;
-    } else if(c <= 0xFFFF) {
-      n+=3;
-    } else if(c <= 0x1FFFFF) {
-      n+=4;
-    } else if(c <= 0x3FFFFFF) {
-      n+=5;
-    } else {
-      n+=6;
-    }
-  }
-  var v = h$newByteArray(n+1);
-  var u8 = v.u8;
-  n = 0;
-  for(i=0;i<str.length;i++) {
-    var c = str.charCodeAt(i);
-    // non-BMP encoded as surrogate pair in JavaScript string, get actual codepoint
-    if (0xD800 <= c && c <= 0xDBFF) {
-      low = str.charCodeAt(i+1);
-      c = ((c - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
-      i++;
-    }
-//    h$log("### encoding char " + c + " to UTF-8: " + String.fromCodePoint(c));
-    if(c <= 0x7F) {
-      u8[n] = c;
-      n++;
-    } else if(c <= 0x7FF) {
-      u8[n] = (c >> 6) | 0xC0;
-      u8[n+1] = (c & 0x3F) | 0x80;
-      n+=2;
-    } else if(c <= 0xFFFF) {
-      u8[n] = (c >> 12) | 0xE0;
-      u8[n+1] = ((c >> 6) & 0x3F) | 0x80;
-      u8[n+2] = (c & 0x3F) | 0x80;
-      n+=3;
-    } else if(c <= 0x1FFFFF) {
-      u8[n] = (c >> 18) | 0xF0;
-      u8[n+1] = ((c >> 12) & 0x3F) | 0x80;
-      u8[n+2] = ((c >> 6) & 0x3F) | 0x80;
-      u8[n+3] = (c & 0x3F) | 0x80;
-      n+=4;
-    } else if(c <= 0x3FFFFFF) {
-      u8[n] = (c >> 24) | 0xF8;
-      u8[n+1] = ((c >> 18) & 0x3F) | 0x80;
-      u8[n+2] = ((c >> 12) & 0x3F) | 0x80;
-      u8[n+3] = ((c >> 6) & 0x3F) | 0x80;
-      u8[n+4] = (c & 0x3F) | 0x80;
-      n+=5;
-    } else {
-      u8[n] = (c >>> 30) | 0xFC;
-      u8[n+1] = ((c >> 24) & 0x3F) | 0x80;
-      u8[n+2] = ((c >> 18) & 0x3F) | 0x80;
-      u8[n+3] = ((c >> 12) & 0x3F) | 0x80;
-      u8[n+4] = ((c >> 6) & 0x3F) | 0x80;
-      u8[n+5] = (c & 0x3F) | 0x80;
-      n+=6;
-    }
-  }
-  u8[v.len-1] = 0; // terminator
-//  h$log("### encodeUtf8: " + str);
-//  h$log(v);
-  return v;
-}
-// encode a javascript string to a zero terminated utf16 byte array
-function h$encodeUtf16(str) {
-  var n = 0;
-  var i;
-  for(i=0;i<str.length;i++) {
-    var c = str.charCodeAt(i);
-    if(c <= 0xFFFF) {
-      n += 2;
-    } else {
-      n += 4;
-    }
-  }
-  var v = h$newByteArray(n+1);
-  var dv = v.dv;
-  n = 0;
-  for(i=0;i<str.length;i++) {
-    var c = str.charCodeAt(i);
-    if(c <= 0xFFFF) {
-      dv.setUint16(n, c, true);
-      n+=2;
-    } else {
-      var c0 = c - 0x10000;
-      dv.setUint16(n, c0 >> 10, true);
-      dv.setUint16(n+2, c0 & 0x3FF, true);
-      n+=4;
-    }
-  }
-  dv.setUint8(v.len-1,0); // terminator
-  return v;
-}
-/*
-function h$encodeUtf16(str) {
-  var b = new DataView(new ArrayBuffer(str.length * 2));
-  for(var i=str.length-1;i>=0;i--) {
-    b.setUint16(i<<1, str.charCodeAt(i));
-  }
-  h$ret1 = 0;
-  return b;
-}
-var h$eU16 = h$encodeUtf16;
-
-function h$decodeUtf16(v,start) {
-  return h$decodeUtf16(v, v.byteLength - start, start);
-}
-
-function h$decodeUtf16z(v,start) {
-  var len = v.byteLength - start;
-  for(var i=start;i<l;i+=2) {
-    if(v.getUint16(i) === 0) {
-      len = i;
-      break;
-    }
-  }
-  return h$decodeUtf16l(v,l,start)
-}
-*/
-function h$decodeUtf16l(v, byteLen, start) {
-  // perhaps we can apply it with an Uint16Array view, but that might give us endianness problems
-  var a = [];
-  for(var i=0;i<byteLen;i+=2) {
-    a[i>>1] = v.dv.getUint16(i+start,true);
-  }
-  return h$charCodeArrayToString(arr);
-}
-var h$dU16 = h$decodeUtf16;
-// decode a buffer with UTF-8 chars to a JS string
-// stop at the first zero
-function h$decodeUtf8z(v,start) {
-//  h$log("h$decodeUtf8z");
-  var n = start;
-  var max = v.len;
-  while(n < max) {
-//    h$log("### " + n + " got char: " + v.u8[n]);
-    if(v.u8[n] === 0) { break; }
-    n++;
-  }
-  return h$decodeUtf8(v,n,start);
-}
-// decode a buffer with Utf8 chars to a JS string
-// invalid characters are ignored
-function h$decodeUtf8(v,n0,start) {
-//  h$log("### decodeUtf8");
-//  h$log(v);
-  var n = n0 || v.len;
-  var arr = [];
-  var i = start || 0;
-  var code;
-  var u8 = v.u8;
-//  h$log("### decoding, starting at:  " + i);
-  while(i < n) {
-    var c = u8[i];
-    while((c & 0xC0) === 0x80) {
-      c = u8[++i];
-    }
-//    h$log("### lead char: " + c);
-    if((c & 0x80) === 0) {
-      code = (c & 0x7F);
-      i++;
-    } else if((c & 0xE0) === 0xC0) {
-      code = ( ((c & 0x1F) << 6)
-             | (u8[i+1] & 0x3F)
-             );
-      i+=2;
-    } else if((c & 0xF0) === 0xE0) {
-      code = ( ((c & 0x0F) << 12)
-             | ((u8[i+1] & 0x3F) << 6)
-             | (u8[i+2] & 0x3F)
-             );
-      i+=3;
-    } else if ((c & 0xF8) === 0xF0) {
-      code = ( ((c & 0x07) << 18)
-             | ((u8[i+1] & 0x3F) << 12)
-             | ((u8[i+2] & 0x3F) << 6)
-             | (u8[i+3] & 0x3F)
-             );
-      i+=4;
-    } else if((c & 0xFC) === 0xF8) {
-      code = ( ((c & 0x03) << 24)
-             | ((u8[i+1] & 0x3F) << 18)
-             | ((u8[i+2] & 0x3F) << 12)
-             | ((u8[i+3] & 0x3F) << 6)
-             | (u8[i+4] & 0x3F)
-             );
-      i+=5;
-    } else {
-      code = ( ((c & 0x01) << 30)
-             | ((u8[i+1] & 0x3F) << 24)
-             | ((u8[i+2] & 0x3F) << 18)
-             | ((u8[i+3] & 0x3F) << 12)
-             | ((u8[i+4] & 0x3F) << 6)
-             | (u8[i+5] & 0x3F)
-             );
-      i+=6;
-    }
-    // h$log("### decoded codePoint: " + code + " - " + String.fromCharCode(code)); // String.fromCodePoint(code));
-    // need to deal with surrogate pairs
-    if(code > 0xFFFF) {
-      var offset = code - 0x10000;
-      arr.push(0xD800 + (offset >> 10), 0xDC00 + (offset & 0x3FF));
-    } else {
-      arr.push(code);
-    }
-  }
-  return h$charCodeArrayToString(arr);
-}
-// fixme what if terminator, then we read past end
-function h$decodeUtf16(v) {
-  var n = v.len;
-  var arr = [];
-  var dv = v.dv;
-  for(var i=0;i<n;i+=2) {
-    arr.push(dv.getUint16(i,true));
-  }
-  return h$charCodeArrayToString(arr);
-}
-function h$charCodeArrayToString(arr) {
-    if(arr.length <= 60000) {
- return String.fromCharCode.apply(this, arr);
-    }
-    var r = '';
-    for(var i=0;i<arr.length;i+=60000) {
- r += String.fromCharCode.apply(this, arr.slice(i, i+60000));
-    }
-    return r;
-}
-function h$hs_iconv_open(to,to_off,from,from_off) {
-  h$errno = h$EINVAL; // no encodings supported
-  return -1;
-//  var fromStr = decodeUtf8(from, from_off);
-//  var toStr = decodeUtf8(to, to_off);
-//  h$log("#### hs_iconv_open: " + fromStr + " -> " + toStr);
-//  return 1; // fixme?
-}
-function h$hs_iconv_close(iconv) {
-  return 0;
-}
-// ptr* -> ptr (array)
-function h$derefPtrA(ptr, ptr_off) {
-  return ptr.arr[ptr_off][0];
-}
-// ptr* -> ptr (offset)
-function h$derefPtrO(ptr, ptr_off) {
-  return ptr.arr[ptr_off][1];
-}
-// word** -> word    ptr[x][y]
-function h$readPtrPtrU32(ptr, ptr_off, x, y) {
-  x = x || 0;
-  y = y || 0;
-  var arr = ptr.arr[ptr_off + 4 * x];
-  return arr[0].dv.getInt32(arr[1] + 4 * y, true);
-}
-// char** -> char   ptr[x][y]
-function h$readPtrPtrU8(ptr, ptr_off, x, y) {
-  x = x || 0;
-  y = y || 0;
-  var arr = ptr.arr[ptr_off + 4 * x];
-  return arr[0].dv.getUint8(arr[1] + y);
-}
-// word**   ptr[x][y] = v
-function h$writePtrPtrU32(ptr, ptr_off, v, x, y) {
-  x = x || 0;
-  y = y || 0;
-  var arr = ptr.arr[ptr_off + 4 * x];
-  arr[0].dv.putInt32(arr[1] + y, v);
-}
-// unsigned char** ptr[x][y] = v
-function h$writePtrPtrU8(ptr, ptr_off, v, x, y) {
-  x = x || 0;
-  y = y || 0;
-  var arr = ptr.arr[ptr_off+ 4 * x];
-  arr[0].dv.putUint8(arr[1] + y, v);
-}
-// convert JavaScript String to a Haskell String
-function h$toHsString(str) {
-  if(typeof str !== 'string') return h$ghczmprimZCGHCziTypesziZMZN;
-  var i = str.length - 1;
-  var r = h$ghczmprimZCGHCziTypesziZMZN;
-  while(i>=0) {
-    var cp = str.charCodeAt(i);
-    if(cp >= 0xDC00 && cp <= 0xDFFF && i > 0) {
-      --i;
-      cp = (cp - 0xDC00) + (str.charCodeAt(i) - 0xD800) * 1024 + 0x10000;
-    }
-    r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (cp), (r)));
-    --i;
-  }
-  return r;
-}
-// string must have been completely forced first
-function h$fromHsString(str) {
-    var xs = '';
-    while(((str).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
- var h = ((str).d1);
- xs += String.fromCharCode(((typeof(h) === 'number')?(h):(h).d1));
-        str = ((str).d2);
-    }
-    return xs;
-}
-// list of JSVal to array, list must have been completely forced first
-function h$fromHsListJSVal(xs) {
-    var arr = [];
-    while(((xs).f === h$ghczmprimZCGHCziTypesziZC_con_e)) {
-        arr.push(((((xs).d1)).d1));
-        xs = ((xs).d2);
-    }
-    return arr;
-}
-// ascii only version of the above
-function h$toHsStringA(str) {
-    if(typeof str !== 'string') return h$ghczmprimZCGHCziTypesziZMZN;
-    var i = str.length - 1;
-    var r = h$ghczmprimZCGHCziTypesziZMZN;
-    while(i>=0) {
- r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (str.charCodeAt(i)), (r)));
- --i;
-    }
-    return r;
-}
-// convert array with modified UTF-8 encoded text
-function h$toHsStringMU8(arr) {
-    var accept = false, b, n = 0, cp = 0, r = h$ghczmprimZCGHCziTypesziZMZN;
-    while(i >= 0) {
-        b = arr[i];
-        if(!(b & 128)) {
-            cp = b;
-            accept = true;
-        } else if((b & 192) === 128) {
-            cp += (b & 32) * Math.pow(64, n)
-        } else {
-            cp += (b&((1<<(6-n))-1)) * Math.pow(64, n);
-            accept = true;
-        }
-        if(accept) {
-            r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (cp), (r)));
-            cp = 0
-            n = 0;
-        } else {
-            n++;
-        }
-        accept = false;
-        i--;
-    }
-    return r;
-}
-function h$toHsList(arr) {
-  var r = h$ghczmprimZCGHCziTypesziZMZN;
-  for(var i=arr.length-1;i>=0;i--) {
-    r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (arr[i]), (r)));
-  }
-  return r;
-}
-// array of JS values to Haskell list of JSVal
-function h$toHsListJSVal(arr) {
-    var r = h$ghczmprimZCGHCziTypesziZMZN;
-    for(var i=arr.length-1;i>=0;i--) {
- r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, ((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (arr[i])))), (r)));
-    }
-    return r;
-}
-// unpack ascii string, append to existing Haskell string
-function h$appendToHsStringA(str, appendTo) {
-  var i = str.length - 1;
-  var r = appendTo;
-  while(i>=0) {
-    r = (h$c2(h$ghczmprimZCGHCziTypesziZC_con_e, (str.charCodeAt(i)), (r)));
-    --i;
-  }
-  return r;
-}
-// throw e wrapped in a GHCJS.Prim.JSException  in the current thread
-function h$throwJSException(e) {
-  // create a JSException object and  wrap it in a SomeException
-  // adding the Exception dictionary
-  var someE = (h$c2(h$baseZCGHCziExceptionziSomeException_con_e,(h$ghcjszmprimZCGHCJSziPrimzizdfExceptionJSException),((h$c2(h$ghcjszmprimZCGHCJSziPrimziJSException_con_e,((h$c1(h$ghcjszmprimZCGHCJSziPrimziJSVal_con_e, (e)))),(h$toHsString(e.toString())))))));
-  return h$throw(someE, true);
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-/* 
-   Integer and integer-gmp support
-   partial GMP emulation
-
-   note: sign behaves different from real gmp sign,
-         value is always zero, don't use it for comparisons
-*/
-var h$bigZero = h$nbv(0);
-var h$bigOne = h$nbv(1);
-var h$bigCache = [];
-(function() {
-  for(var i=0;i<=100;i++) {
-    h$bigCache.push(h$nbv(i));
-  }
-})();
-// convert a value to a BigInt
-function h$bigFromInt(v) {
-  ;
-  var v0 = v|0;
-  if(v0 >= 0) {
-    if(v0 <= 100) {
-      return h$bigCache[v0];
-    } else if(v0 < 268435456) { // 67108864) { // guaranteed to fit in one digit
-      return h$nbv(v0);
-    }
-    var r1 = h$nbv(v0 >>> 16);
-    var r2 = h$nbi();
-    r1.lShiftTo(16,r2);
-    r1.fromInt(v0 & 0xffff);
-    var r3 = r1.or(r2);
-    ;
-    return r3;
-  } else {
-    v0 = -v0;
-    if(v0 < 268435456) { // 67108864) {
-      return h$nbv(v0).negate();
-    }
-    var r1 = h$nbv(v0 >>> 16);
-    var r2 = h$nbi();
-    r1.lShiftTo(16,r2);
-    r1.fromInt(v0 & 0xffff);
-    var r3 = r1.or(r2);
-    BigInteger.ZERO.subTo(r3,r2);
-    ;
-    return r2;
-  }
-}
-function h$bigFromWord(v) {
-  var v0 = v|0;
-  if(v0 >= 0) {
-    if(v0 <= 100) {
-      return h$bigCache[v0];
-    } else if(v0 < 268435456) { // 67108864) { // guaranteed to fit in one digit
-      return h$nbv(v0);
-    }
-  }
-  var r1 = h$nbv(v0 >>> 16);
-  var r2 = h$nbv(0);
-  r1.lShiftTo(16,r2);
-  r1.fromInt(v0 & 0xffff);
-  return r1.or(r2);
-}
-function h$bigFromInt64(v1,v2) {
-  ;
-  var v10 = v1|0;
-  var v20 = v2|0;
-  var r = new BigInteger([ v10 >> 24, (v10 & 0xff0000) >> 16, (v10 & 0xff00) >> 8, v10 & 0xff
-                         , v20 >>> 24, (v20 & 0xff0000) >> 16, (v20 & 0xff00) >> 8, v20 & 0xff
-                         ]);
-  ;
-  return r;
-}
-function h$bigFromWord64(v1,v2) {
-  ;
-  var v10 = v1|0;
-  var v20 = v2|0;
-  var arr = [ 0, v10 >>> 24, (v10 & 0xff0000) >> 16, (v10 & 0xff00) >> 8, v10 & 0xff
-                         , v20 >>> 24, (v20 & 0xff0000) >> 16, (v20 & 0xff00) >> 8, v20 & 0xff
-                         ];
-  ;
-  var r = new BigInteger([ 0, v10 >>> 24, (v10 & 0xff0000) >> 16, (v10 & 0xff00) >> 8, v10 & 0xff
-                         , v20 >>> 24, (v20 & 0xff0000) >> 16, (v20 & 0xff00) >> 8, v20 & 0xff
-                         ]);
-  ;
-  return r;
-}
-function h$bigFromNumber(n) {
-  var ra = [];
-  var s = 0;
-  if(n < 0) {
-    n = -n;
-    s = -1;
-  }
-  var b = 1;
-  while(n >= b) {
-    ra.unshift((n/b)&0xff);
-    b *= 256;
-  }
-  ra.unshift(s);
-  return new BigInteger(ra);
-}
-function h$encodeNumber(big,e) {
-  var m = Math.pow(2,e);
-  if(m === Infinity) {
-    switch(big.signum()) {
-      case 1: return Infinity;
-      case 0: return 0;
-      default: return -Infinity;
-    }
-  }
-  var b = big.toByteArray();
-  var l = b.length;
-  var r = 0;
-  ;
-  for(var i=l-1;i>=1;i--) {
-  ;
-    r += m * Math.pow(2,(l-i-1)*8) * (b[i] & 0xff);
-    ;
-  }
-  // last one signed
-  if(b[0] != 0) {
-    r += m * Math.pow(2,(l-1)*8) * b[0];
-  }
-  ;
-  return r;
-}
-function h$integer_cmm_cmpIntegerzh(sa, abits, sb, bbits) {
-  ;
-  var c = abits.compareTo(bbits);
-  return c == 0 ? 0 : c > 0 ? 1 : -1;
-}
-function h$integer_cmm_cmpIntegerIntzh(sa, abits, b) {
-  ;
-  var c = abits.compareTo(h$bigFromInt(b));
-  return c == 0 ? 0 : c > 0 ? 1 : -1;
-}
-function h$integer_cmm_plusIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.add(bbits);
-}
-function h$integer_cmm_plusIntegerIntzh(sa, abits, b) {
-  ;
-  return abits.add(h$bigFromInt(b));
-}
-function h$integer_cmm_minusIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.subtract(bbits);
-}
-function h$integer_cmm_minusIntegerIntzh(sa, abits, b) {
-   ;
-   return abits.subtract(h$bigFromInt(b));
-}
-function h$integer_cmm_timesIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.multiply(bbits);
-}
-function h$integer_cmm_timesIntegerIntzh(sa, abits, b) {
-  ;
-  return abits.multiply(h$bigFromInt(b));
-}
-// fixme make more efficient, divideRemainder
-function h$integer_cmm_quotRemIntegerzh(sa, abits, sb, bbits) {
-    ;
-    var q = abits.divide(bbits);
-    ;
-    var r = abits.subtract(q.multiply(bbits));
-    ;
-    { h$ret1 = (r); return (q); };
-}
-function h$integer_cmm_quotRemIntegerWordzh(sa, abits, b) {
-    var bbits = h$bigFromWord(b);
-    ;
-    var q = abits.divide(bbits);
-    { h$ret1 = (abits.subtract(q.multiply(bbits))); return (q); };
-}
-function h$integer_cmm_quotIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.divide(bbits);
-}
-function h$integer_cmm_quotIntegerWordzh(sa, abits, b) {
-    ;
-    return abits.divide(h$bigFromWord(b));
-}
-function h$integer_cmm_remIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.subtract(bbits.multiply(abits.divide(bbits)));
-}
-function h$integer_cmm_remIntegerWordzh(sa, abits, b) {
-    ;
-    var bbits = h$bigFromWord(b);
-    return abits.subtract(bbits.multiply(abits.divide(bbits)));
-}
-function h$integer_cmm_divModIntegerzh(sa, abits, sb, bbits) {
-    ;
-    var d = abits.divide(bbits);
-    var m = abits.subtract(d.multiply(bbits));
-    ;
-    if(abits.signum()!==bbits.signum() && m.signum() !== 0) {
-        d = d.subtract(h$bigOne);
-        m.addTo(bbits, m);
-    }
-    { h$ret1 = (m); return (d); };
-}
-function h$integer_cmm_divModIntegerWordzh(sa, abits, b) {
-    ;
-    return h$integer_cmm_divModIntegerzh(sa, abits, 0, h$bigFromWord(b));
-}
-function h$integer_cmm_divIntegerzh(sa, abits, sb, bbits) {
-    ;
-    var d = abits.divide(bbits);
-    var m = abits.subtract(d.multiply(bbits));
-    ;
-    if(abits.signum()!==bbits.signum() && m.signum() !== 0) {
-        ;
-        d = d.subtract(h$bigOne);
-    }
-    ;
-    return d;
-}
-function h$integer_cmm_divIntegerWordzh(sa, abits, b) {
-    ;
-    return h$integer_cmm_divIntegerzh(sa, abits, 0, h$bigFromWord(b));
-}
-function h$integer_cmm_modIntegerzh(sa, abits, sb, bbits) {
-    ;
-    var d = abits.divide(bbits);
-    var m = abits.subtract(d.multiply(bbits));
-    if(abits.signum()!==bbits.signum() && m.signum() !== 0) {
-        m.addTo(bbits, m);
-    }
-    return m;
-}
-function h$integer_cmm_modIntegerWordzh(sa, abits, b) {
-    ;
-    return h$integer_cmm_modIntegerzh(sa, abits, 0, h$bigFromWord(b));
-}
-function h$integer_cmm_divExactIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.divide(bbits);
-}
-function h$integer_cmm_divExactIntegerWordzh(sa, abits, b) {
-    ;
-    return abits.divide(h$bigFromWord(b));
-}
-function h$gcd(a, b) {
-    var x = a.abs();
-    var y = b.abs();
-    var big, small;
-    if(x.compareTo(y) < 0) {
-        small = x;
-        big = y;
-    } else {
-        small = y;
-        big = x;
-    }
-    while(small.signum() !== 0) {
-        var q = big.divide(small);
-        var r = big.subtract(q.multiply(small));
-        big = small;
-        small = r;
-    }
-    return big;
-}
-function h$integer_cmm_gcdIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return h$gcd(abits, bbits);
-}
-function h$integer_cmm_gcdIntegerIntzh(sa, abits, b) {
-    ;
-    var r = h$gcd(abits, h$bigFromInt(b));
-    return r.intValue();
-}
-function h$integer_cmm_gcdIntzh(a, b) {
-        var x = a<0 ? -a : a;
-        var y = b<0 ? -b : b;
-        var big, small;
-        if(x<y) {
-            small = x;
-            big = y;
-        } else {
-            small = y;
-            big = x;
-        }
-        while(small!==0) {
-            var r = big % small;
-            big = small;
-            small = r;
-        }
-        return big;
-}
-function h$integer_cmm_powIntegerzh(sa, abits, b) {
-    ;
-    if(b >= 0) {
-      return abits.pow(b);
-    } else {
-      return abits.pow(b + 2147483648);
-    }
-}
-// (a ^ b) % c
-function h$integer_cmm_powModIntegerzh(sa, abits, sb, bbits, sc, cbits) {
-    ;
-    return abits.modPow(bbits, cbits);
-}
-// warning, there is no protection against side-channel attacks here
-function h$integer_cmm_powModSecIntegerzh(sa, abits, sb, bbits, sc, cbits) {
-    ;
-    return h$integer_cmm_powModIntegerzh(sa, abits, sb, bbits, sc, cbits);
-}
-function h$integer_cmm_recipModIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.modInverse(bbits);
-}
-function h$integer_cmm_nextPrimeIntegerzh(sa, abits) {
-    ;
-    var n = abits.add(BigInteger.ONE);
-    while(true) {
-      if(n.isProbablePrime(50)) return n;
-      n.addTo(BigInteger.ONE, n);
-    }
-}
-function h$integer_cmm_testPrimeIntegerzh(sa, abits, b) {
-    ;
-    return abits.isProbablePrime(b) ? 1 : 0;
-}
-function h$integer_cmm_sizeInBasezh(sa, abits, b) {
-    ;
-    return Math.ceil(abits.bitLength() * Math.log(2) / Math.log(b));
-}
-var h$oneOverLog2 = 1 / Math.log(2);
-function h$integer_cmm_decodeDoublezh(x) {
-    ;
-    var sgn, ret1, ret2, ret3;
-    { (sgn) = (h$decodeDouble2Int(x)); (ret1) = h$ret1; (ret2) = h$ret2; (ret3) = h$ret3; };
-    var b = h$bigFromInt(ret1).shiftLeft(32).add(h$bigFromWord(ret2));
-    ret1 = (!isNaN(x) && sgn < 0) ? b.negate() : b;
-    // var ret3 = h$ret3;
-    ;
-    { h$ret1 = (ret1); return (ret3); };
-}
-function h$integer_cmm_decodeDoublezhFallback(x) {
-    ;
-    if(isNaN(x)) {
-      { h$ret1 = (h$bigFromInt(3).shiftLeft(51).negate()); return (972); };
-    }
-    if( x < 0 ) {
-        var result, ret1;
-        { (result) = (h$integer_cmm_decodeDoublezh(-x)); (ret1) = h$ret1; };
-        { h$ret1 = (ret1.negate()); return (result); };
-    }
-    if(x === Number.POSITIVE_INFINITY) {
-        { h$ret1 = (h$bigOne.shiftLeft(52)); return (972); };
-    }
-    var exponent = (Math.floor(Math.log(x) * h$oneOverLog2)-52)|0;
-    var n;
-    // prevent overflow
-    if(exponent < -1000) {
-      n = x * Math.pow(2,-exponent-128) * Math.pow(2,128);
-    } else if(exponent > 900) {
-      n = x * Math.pow(2,-exponent+128) * Math.pow(2,-128);
-    } else {
-      n = x * Math.pow(2,-exponent);
-    }
-    // fixup precision, do we also need the other way (exponent++) ?
-    if(Math.abs(n - Math.floor(n) - 0.5) < 0.0001) {
-      exponent--;
-      n *= 2;
-    }
-    var ret1 = h$bigFromNumber(n);
-    ;
-    { h$ret1 = (ret1); return (exponent); };
-}
-function h$integer_cmm_int2Integerzh(i) {
-    ;
-    { h$ret1 = (h$bigFromInt(i)); return (0); };
-}
-function h$integer_cmm_word2Integerzh(i) {
-    ;
-    { h$ret1 = (h$bigFromWord(i)); return (0); };
-}
-function h$integer_cmm_andIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.and(bbits);
-}
-function h$integer_cmm_orIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.or(bbits);
-}
-function h$integer_cmm_xorIntegerzh(sa, abits, sb, bbits) {
-    ;
-    return abits.xor(bbits);
-}
-function h$integer_cmm_testBitIntegerzh(sa, abits, bit) {
-    return abits.testBit(bit)?1:0;
-}
-function h$integer_cmm_mul2ExpIntegerzh(sa, abits, b) {
-    ;
-    return abits.shiftLeft(b);
-}
-function h$integer_cmm_fdivQ2ExpIntegerzh(sa, abits, b) {
-    ;
-    return abits.shiftRight(b);
-}
-function h$integer_cmm_complementIntegerzh(sa, abits) {
-    ;
-    return abits.not();
-}
-function h$integer_cmm_int64ToIntegerzh(a0, a1) {
-    ;
-    { h$ret1 = (h$bigFromInt64(a0,a1)); return (0); };
-}
-function h$integer_cmm_word64ToIntegerzh(a0, a1) {
-    ;
-    { h$ret1 = (h$bigFromWord64(a0,a1)); return (0); }
-}
-function h$hs_integerToInt64(as, abits) {
-    ;
-    { h$ret1 = (abits.intValue()); return (abits.shiftRight(32).intValue()); };
-}
-function h$hs_integerToWord64(as, abits) {
-    ;
-    { h$ret1 = (abits.intValue()); return (abits.shiftRight(32).intValue()); };
-}
-function h$integer_cmm_integer2Intzh(as, abits) {
-   ;
-   return abits.intValue();
-}
-function h$integer_cbits_encodeDouble(as,abits,e) {
-    ;
-   return h$encodeNumber(abits,e);
-}
-function h$integer_cbits_encodeFloat(as,abits,e) {
-    ;
-   return h$encodeNumber(abits,e);
-}
-function h$__int_encodeDouble(i,e) {
-   return i * Math.pow(2,e);
-}
-function h$__int_encodeFloat(i,e) {
-   return i * Math.pow(2,e);
-}
-function h$integer_wordLog2(w) {
-    ;
-    return 31 - h$clz32(w);
-}
-function h$integer_integerLog2(i) {
-    ;
-    return i.bitLength()-1;
-}
-function h$integer_integerLog2IsPowerOf2(i) {
-    ;
-    var b = i.bitLength();
-    var ret1 = (b === 0 || i.getLowestSetBit() !== b) ? 1 : 0;
-    ;
-    { h$ret1 = (ret1); return (b-1); };
-}
-function h$integer_intLog2IsPowerOf2(i) {
-    ;
-    var l = 31 - h$clz32(i);
-    var ret1 = (i !== (1 << l)) ? 1 : 0;
-    ;
-    { h$ret1 = (ret1); return (l); };
-}
-function h$integer_roundingMode(i,j) {
-    ;
-    return 1; // round to even, is that correct?
-}
-function h$integer_smartJ(i) {
-    ;
-    if(i.bitLength() >= 32) return (h$c2(h$integerzmgmpZCGHCziIntegerziTypeziJzh_con_e, 0, (i)));;
-    return (h$c2(h$integerzmgmpZCGHCziIntegerziTypeziSzh_con_e, (i.intValue()|0)));;
-}
-function h$integer_mpzToInteger(i) {
-    ;
-    if(typeof i === 'number') return (h$c2(h$integerzmgmpZCGHCziIntegerziTypeziSzh_con_e, (i)));;
-    return h$integer_smartJ(i);
-}
-var h$integer_negTwoThirtyOne = (h$c2(h$integerzmgmpZCGHCziIntegerziTypeziJzh_con_e, 0, (h$bigFromInt(-2147483648).negate())));;
-function h$integer_mpzNeg(i) {
-    ;
-    if(typeof i === 'number') {
- return (i === -2147483648) ? h$integer_negTwoThirtyOne : -i;
-    }
-    return i.negate();
-}
-function h$integer_absInteger(i) {
-    ;
-    return i.abs();
-}
-function h$integer_negateInteger(i) {
-    ;
-    return i.negate();
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// set up debug logging for the current JS environment/engine
-// browser also logs to <div id="output"> if jquery is detected
-// the various debug tracing options use h$log
-var h$glbl;
-function h$getGlbl() { h$glbl = this; }
-h$getGlbl();
-function h$log() {
-  if(h$glbl) {
-    if(h$glbl.console && h$glbl.console.log) {
-      h$glbl.console.log.apply(h$glbl.console,arguments);
-    } else {
-      h$glbl.print.apply(this,arguments);
-    }
-  } else {
-    if(typeof console !== 'undefined') {
-      console.log.apply(console, arguments);
-    } else if(typeof print !== 'undefined') {
-      print.apply(null, arguments);
-    }
-  }
-}
-function h$collectProps(o) {
-  var props = [];
-  for(var p in o) { props.push(p); }
-  return("{"+props.join(",")+"}");
-}
-// load the command line arguments in h$programArgs
-// the first element is the program name
-var h$programArgs;
-if(h$isNode) {
-    h$programArgs = process.argv.slice(1);
-} else if(h$isJsShell && typeof h$getGlobal(this).scriptArgs !== 'undefined') {
-    h$programArgs = h$getGlobal(this).scriptArgs.slice(0);
-    h$programArgs.unshift("a.js");
-} else if((h$isJsShell || h$isJsCore) && typeof h$getGlobal(this).arguments !== 'undefined') {
-    h$programArgs = h$getGlobal(this).arguments.slice(0);
-    h$programArgs.unshift("a.js");
-} else {
-    h$programArgs = [ "a.js" ];
-}
-function h$getProgArgv(argc_v,argc_off,argv_v,argv_off) {
-  ;
-  var c = h$programArgs.length;
-  if(c === 0) {
-    argc_v.dv.setInt32(argc_off, 0, true);
-  } else {
-    argc_v.dv.setInt32(argc_off, c, true);
-    var argv = h$newByteArray(4*c);
-    argv.arr = [];
-    for(var i=0;i<h$programArgs.length;i++) {
-      argv.arr[4*i] = [ h$encodeUtf8(h$programArgs[i]), 0 ];
-    }
-    if(!argv_v.arr) { argv_v.arr = []; }
-    argv_v.arr[argv_off] = [argv, 0];
-  }
-}
-function h$setProgArgv(n, ptr_d, ptr_o) {
-  args = [];
-  for(var i=0;i<n;i++) {
-    var p = ptr_d.arr[ptr_o+4*i];
-    var arg = h$decodeUtf8z(p[0], p[1]);
-    args.push(arg);
-  }
-  h$programArgs = args;
-}
-function h$getpid() {
-  if(h$isNode) return process.id;
-  return 0;
-}
-function h$__hscore_environ() {
-    ;
-    if(h$isNode) {
-        var env = [], i;
-        for(i in process.env) env.push(i + '=' + process.env[i]);
-        if(env.length === 0) return null;
-        var p = h$newByteArray(4*env.length+1);
-        p.arr = [];
-        for(i=0;i<env.length;i++) p.arr[4*i] = [h$encodeUtf8(env[i]), 0];
-        p.arr[4*env.length] = [null, 0];
-        { h$ret1 = (0); return (p); };
-    }
-    { h$ret1 = (0); return (null); };
-}
-function h$getenv(name, name_off) {
-    ;
-    if(h$isNode) {
-        var n = h$decodeUtf8z(name, name_off);
-        if(typeof process.env[n] !== 'undefined')
-            { h$ret1 = (0); return (h$encodeUtf8(process.env[n])); };
-    }
-    { h$ret1 = (0); return (null); };
-}
-function h$errorBelch() {
-  h$log("### errorBelch: do we need to handle a vararg function here?");
-}
-function h$errorBelch2(buf1, buf_offset1, buf2, buf_offset2) {
-//  log("### errorBelch2");
-  h$errorMsg(h$decodeUtf8z(buf1, buf_offset1), h$decodeUtf8z(buf2, buf_offset2));
-}
-function h$debugBelch2(buf1, buf_offset1, buf2, buf_offset2) {
-  h$errorMsg(h$decodeUtf8z(buf1, buf_offset1), h$decodeUtf8z(buf2, buf_offset2));
-}
-function h$errorMsg(pat) {
-  function stripTrailingNewline(xs) {
-    return xs.replace(/\r?\n$/, "");
-  }
-  // poor man's vprintf
-  var str = pat;
-  for(var i=1;i<arguments.length;i++) {
-    str = str.replace(/%s/, arguments[i]);
-  }
-  if(h$isGHCJSi) {
-    // ignore message
-  } else if(h$isNode) {
-    process.stderr.write(str);
-  } else if (h$isJsShell && typeof printErr !== 'undefined') {
-    if(str.length) printErr(stripTrailingNewline(str));
-  } else if (h$isJsShell && typeof putstr !== 'undefined') {
-    putstr(str);
-  } else if (h$isJsCore) {
-    if(str.length) {
- if(h$base_stderrLeftover.val !== null) {
-     debug(h$base_stderrLeftover.val + stripTrailingNewline(str));
-     h$base_stderrLeftover.val = null;
- } else {
-     debug(stripTrailingNewline(str));
- }
-    }
-  } else {
-    if(typeof console !== 'undefined') {
-      console.log(str);
-    }
-  }
-}
-// this needs to be imported with foreign import ccall safe/interruptible
-function h$performMajorGC() {
-    // save current thread state so we can enter the GC
-    var t = h$currentThread, err = null;
-    t.sp = h$sp;
-    h$currentThread = null;
-    try {
-        h$gc(t);
-    } catch(e) {
-        err = e;
-    }
-    // restore thread state
-    h$currentThread = t;
-    h$sp = t.sp;
-    h$stack = t.stack;
-    if(err) throw err;
-}
-function h$baseZCSystemziCPUTimeZCgetrusage() {
-  return 0;
-}
-function h$getrusage() {
-  return 0;
-}
-// fixme need to fix these struct locations
-function h$gettimeofday(tv_v,tv_o,tz_v,tz_o) {
-  var now = Date.now();
-  tv_v.dv.setInt32(tv_o, (now / 1000)|0, true);
-  tv_v.dv.setInt32(tv_o + 4, ((now % 1000) * 1000)|0, true);
-  if(tv_v.len >= tv_o + 12) {
-    tv_v.dv.setInt32(tv_o + 8, ((now % 1000) * 1000)|0, true);
-  }
-  return 0;
-}
-function h$traceEvent(ev_v,ev_o) {
-  h$errorMsg(h$decodeUtf8z(ev_v, ev_o));
-}
-function h$traceMarker(ev_v,ev_o) {
-  h$errorMsg(h$decodeUtf8z(ev_v, ev_o));
-}
-var h$__hscore_gettimeofday = h$gettimeofday;
-var h$myTimeZone = h$encodeUtf8("UTC");
-function h$localtime_r(timep_v, timep_o, result_v, result_o) {
-  var t = timep_v.i3[timep_o];
-  var d = new Date(t * 1000);
-  result_v.dv.setInt32(result_o , d.getSeconds(), true);
-  result_v.dv.setInt32(result_o + 4 , d.getMinutes(), true);
-  result_v.dv.setInt32(result_o + 8 , d.getHours(), true);
-  result_v.dv.setInt32(result_o + 12, d.getDate(), true);
-  result_v.dv.setInt32(result_o + 16, d.getMonth(), true);
-  result_v.dv.setInt32(result_o + 20, d.getFullYear()-1900, true);
-  result_v.dv.setInt32(result_o + 24, d.getDay(), true);
-  result_v.dv.setInt32(result_o + 28, 0, true); // fixme yday 1-365 (366?)
-  result_v.dv.setInt32(result_o + 32, -1, true); // dst information unknown
-  result_v.dv.setInt32(result_o + 40, 0, true); // gmtoff?
-  if(!result_v.arr) result_v.arr = [];
-  result_v.arr[result_o + 40] = [h$myTimeZone, 0];
-  result_v.arr[result_o + 48] = [h$myTimeZone, 0];
-  { h$ret1 = (result_o); return (result_v); };
-}
-var h$__hscore_localtime_r = h$localtime_r;
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// some Enum conversion things
-// an array of generic enums
-var h$enums = [];
-function h$initEnums() {
-  for(var i=0;i<256;i++) {
-    h$enums[i] = h$makeEnum(i);
-  }
-}
-h$initStatic.push(h$initEnums);
-function h$makeEnum(tag) {
-  var f = function() {
-    return h$stack[h$sp];
-  }
-  h$setObjInfo(f, 2, "Enum", [], tag+1, 0, [1], null);
-  return h$c0(f);
-}
-// used for all non-Bool enums
-function h$tagToEnum(tag) {
-  if(tag >= h$enums.length) {
-    return h$makeEnum(tag);
-  } else {
-    return h$enums[tag];
-  }
-}
-function h$dataTag(e) {
-  return (e===true)?1:((typeof e !== 'object')?0:(e.f.a-1));
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// weak reference support
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-var h$weakPointerList = [];
-// called by the GC after marking the heap
-function h$finalizeWeaks(toFinalize) {
-    var mark = h$gcMark;
-    var i, w;
-    ;
-    // start a finalizer thread if any finalizers need to be run
-    if(toFinalize.length > 0) {
-        var t = new h$Thread();
-        for(i=0;i<toFinalize.length;i++) {
-            w = toFinalize[i];
-            t.sp += 6;
-            t.stack[t.sp-5] = 0; // mask
-            t.stack[t.sp-4] = h$noop; // handler, dummy
-            t.stack[t.sp-3] = h$catch_e;
-            t.stack[t.sp-2] = h$ap_1_0;
-            t.stack[t.sp-1] = w.finalizer;
-            t.stack[t.sp] = h$return;
-            w.finalizer = null;
-        }
-        h$wakeupThread(t);
-    }
-}
-var h$weakN = 0;
-/** @constructor */
-function h$Weak(key, val, finalizer) {
-    if(typeof key !== 'object') {
-        // can't attach a StableName to objects with unboxed storage
-        // our weak ref will be finalized soon.
-        ;
-        this.keym = new h$StableName(0);
-    } else {
-        if(typeof key.m !== 'object') key.m = new h$StableName(key.m);
-        this.keym = key.m;
-    }
-    ;
-    this.keym = key.m;
-    this.val = val;
-    this.finalizer = null;
-    if(finalizer !== null) {
-        this.finalizer = finalizer;
-    }
-    this.m = 0;
-    this._key = ++h$weakN;
-    h$weakPointerList.push(this);
-}
-function h$makeWeak(key, val, fin) {
-    ;
-    return new h$Weak(key, val, fin)
-}
-function h$makeWeakNoFinalizer(key, val) {
-    ;
-    return new h$Weak(key, val, null);
-}
-function h$finalizeWeak(w) {
-    ;
-    w.val = null;
-    if(w.finalizer === null || w.finalizer.finalizer === null) {
-        { h$ret1 = (0); return (null); };
-    } else {
-        var r = w.finalizer;
-        w.finalizer = null;
-        { h$ret1 = (1); return (r); };
-    }
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// preemptive threading support
-// run gc when this much time has passed (ms)
-// preempt threads after the scheduling quantum (ms)
-// check sched quantum after 10*GHCJS_SCHED_CHECK calls
-// yield to js after running haskell for GHCJS_BUSY_YIELD ms
-var h$threadIdN = 0;
-// all threads except h$currentThread
-// that are not finished/died can be found here
-var h$threads = new h$Queue();
-var h$blocked = new h$Set();
-/** @constructor */
-function h$Thread() {
-    this.tid = ++h$threadIdN;
-    this.status = (0);
-    this.stack = [h$done, 0, h$baseZCGHCziConcziSynczireportError, h$catch_e];
-    this.sp = 3;
-    this.mask = 0; // async exceptions masked (0 unmasked, 1: uninterruptible, 2: interruptible)
-    this.interruptible = false; // currently in an interruptible operation
-    this.excep = []; // async exceptions waiting for unmask of this thread
-    this.delayed = false; // waiting for threadDelay
-    this.blockedOn = null; // object on which thread is blocked
-    this.retryInterrupted = null; // how to retry blocking operation when interrupted
-    this.transaction = null; // for STM
-    this.noPreemption = false;
-    this.isSynchronous = false;
-    this.continueAsync = false;
-    this.m = 0; // gc mark
-    this.result = null; // result value (used for GHCJS.Foreign.Callback)
-    this.resultIsException = false;
-    this._key = this.tid; // for storing in h$Set / h$Map
-}
-function h$rts_getThreadId(t) {
-  return t.tid;
-}
-function h$cmp_thread(t1,t2) {
-  if(t1.tid < t2.tid) return -1;
-  if(t1.tid > t2.tid) return 1;
-  return 0;
-}
-// description of the thread, if unlabeled then just the thread id
-function h$threadString(t) {
-  if(t === null) {
-    return "<no thread>";
-  } else if(t.label) {
-    var str = h$decodeUtf8z(t.label[0], t.label[1]);
-    return str + " (" + t.tid + ")";
-  } else {
-    return (""+t.tid);
-  }
-}
-function h$fork(a, inherit) {
-  var t = new h$Thread();
-  ;
-  if(inherit && h$currentThread) {
-    t.mask = h$currentThread.mask;
-  }
-  // TRACE_SCHEDULER("sched: action forked: " + a.f.n);
-  t.stack[4] = h$ap_1_0;
-  t.stack[5] = a;
-  t.stack[6] = h$return;
-  t.sp = 6;
-  h$wakeupThread(t);
-  return t;
-}
-function h$threadStatus(t) {
-  // status, capability, locked
-  { h$ret1 = (1); h$ret2 = (0); return (t.status); };
-}
-function h$waitRead(fd) {
-  h$fds[fd].waitRead.push(h$currentThread);
-  h$currentThread.interruptible = true;
-  return h$blockThread(h$currentThread,fd,[h$waitRead,fd]);
-}
-function h$waitWrite(fd) {
-  h$fds[fd].waitWrite.push(h$currentThread);
-  h$currentThread.interruptible = true;
-  return h$blockThread(h$currentThread,fd,[h$waitWrite,fd]);
-}
-// threadDelay support:
-var h$delayed = new h$HeapSet();
-function h$wakeupDelayed(now) {
-    while(h$delayed.size() > 0 && h$delayed.peekPrio() < now) {
-        var t = h$delayed.pop();
-        ;
-        // might have been woken up early, don't wake up again in that case
-        if(t.delayed) {
-            t.delayed = false;
-            h$wakeupThread(t);
-        }
-    }
-}
-function h$delayThread(time) {
-  var now = Date.now();
-  var ms = time/1000; // we have no microseconds in JS
-  ;
-  h$delayed.add(now+ms, h$currentThread);
-  h$currentThread.delayed = true;
-  return h$blockThread(h$currentThread, h$delayed,[h$resumeDelayThread]);
-}
-function h$resumeDelayThread() {
-  h$r1 = false;
-  return h$stack[h$sp];
-}
-function h$yield() {
-  h$sp += 2;
-  h$stack[h$sp-1] = h$r1;
-  h$stack[h$sp] = h$return;
-  h$currentThread.sp = h$sp;
-  return h$reschedule;
-}
-// raise the async exception in the thread if not masked
-function h$killThread(t, ex) {
-  ;
-  if(t === h$currentThread) {
-    // if target is self, then throw even if masked
-    h$sp += 2;
-    h$stack[h$sp-1] = h$r1;
-    h$stack[h$sp] = h$return;
-    return h$throw(ex,true);
-  } else {
-    ;
-    if(t.mask === 0 || (t.mask === 2 && t.interruptible)) {
-      if(t.stack) { // finished threads don't have a stack anymore
-        h$forceWakeupThread(t);
-        t.sp += 2;
-        t.stack[t.sp-1] = ex;
-        t.stack[t.sp] = h$raiseAsync_frame;
-      }
-      return h$stack ? h$stack[h$sp] : null;
-    } else {
-      t.excep.push([h$currentThread,ex]);
-      h$currentThread.interruptible = true;
-      h$sp += 2;
-      h$stack[h$sp-1] = h$r1;
-      h$stack[h$sp] = h$return;
-      return h$blockThread(h$currentThread,t,null);
-    }
-  }
-}
-function h$maskStatus() {
-  ;
-  return h$currentThread.mask;
-}
-function h$maskAsync(a) {
-  ;
-  if(h$currentThread.mask !== 2) {
-    if(h$currentThread.mask === 0 && h$stack[h$sp] !== h$maskFrame && h$stack[h$sp] !== h$maskUnintFrame) {
-      h$stack[++h$sp] = h$unmaskFrame;
-    }
-    if(h$currentThread.mask === 1) {
-      h$stack[++h$sp] = h$maskUnintFrame;
-    }
-    h$currentThread.mask = 2;
-  }
-  h$r1 = a;
-  return h$ap_1_0_fast();
-}
-function h$maskUnintAsync(a) {
-  ;
-  if(h$currentThread.mask !== 1) {
-    if(h$currentThread.mask === 2) {
-      h$stack[++h$sp] = h$maskFrame;
-    } else {
-      h$stack[++h$sp] = h$unmaskFrame;
-    }
-    h$currentThread.mask = 1;
-  }
-  h$r1 = a;
-  return h$ap_1_0_fast();
-}
-function h$unmaskAsync(a) {
-  ;
-  if(h$currentThread.excep.length > 0) {
-    h$currentThread.mask = 0;
-    h$sp += 3;
-    h$stack[h$sp-2] = h$ap_1_0;
-    h$stack[h$sp-1] = a;
-    h$stack[h$sp] = h$return;
-    return h$reschedule;
-  }
-  if(h$currentThread.mask !== 0) {
-    if(h$stack[h$sp] !== h$unmaskFrame) {
-      if(h$currentThread.mask === 2) {
-        h$stack[++h$sp] = h$maskFrame;
-      } else {
-        h$stack[++h$sp] = h$maskUnintFrame;
-      }
-    }
-    h$currentThread.mask = 0;
-  }
-  h$r1 = a;
-  return h$ap_1_0_fast();
-}
-function h$pendingAsync() {
-  var t = h$currentThread;
-  return (t.excep.length > 0 && (t.mask === 0 || (t.mask === 2 && t.interruptible)));
-}
-// post the first of the queued async exceptions to
-// this thread, restore frame is in thread if alreadySuspended
-function h$postAsync(alreadySuspended,next) {
-    var t = h$currentThread;
-    var v = t.excep.shift();
-    ;
-    var tposter = v[0]; // posting thread, blocked
-    var ex = v[1]; // the exception
-    if(v !== null && tposter !== null) {
-        h$wakeupThread(tposter);
-    }
-    if(!alreadySuspended) {
-        h$suspendCurrentThread(next);
-    }
-    h$sp += 2;
-    h$stack[h$sp-1] = ex;
-    h$stack[h$sp] = h$raiseAsync_frame;
-    t.sp = h$sp;
-}
-// wakeup thread, thread has already been removed
-// from any queues it was blocked on
-function h$wakeupThread(t) {
-    ;
-    if(t.status === (1)) {
-        t.blockedOn = null;
-        t.status = (0);
-        h$blocked.remove(t);
-    }
-    t.interruptible = false;
-    t.retryInterrupted = null;
-    h$threads.enqueue(t);
-    h$startMainLoop();
-}
-// force wakeup, remove this thread from any
-// queue it's blocked on
-function h$forceWakeupThread(t) {
-  ;
-  if(t.status === (1)) {
-    h$removeThreadBlock(t);
-    h$wakeupThread(t);
-  }
-}
-function h$removeThreadBlock(t) {
-  if(t.status === (1)) {
-    var o = t.blockedOn;
-    if(o === null || o === undefined) {
-      throw ("h$removeThreadBlock: blocked on null or undefined: " + h$threadString(t));
-    } else if(o === h$delayed) {
-      // thread delayed
-      h$delayed.remove(t);
-      t.delayed = false;
-    } else if(o instanceof h$MVar) {
-      ;
-      ;
-      // fixme this is rather inefficient
-      var r, rq = new h$Queue();
-      while((r = o.readers.dequeue()) !== null) {
-          if(r !== t) rq.enqueue(r);
-      }
-      var w, wq = new h$Queue();
-      while ((w = o.writers.dequeue()) !== null) {
-        if(w[0] !== t) wq.enqueue(w);
-      }
-      o.readers = rq;
-      o.writers = wq;
-      ;
-/*    } else if(o instanceof h$Fd) {
-      TRACE_SCHEDULER("blocked on fd");
-      h$removeFromArray(o.waitRead,t);
-      h$removeFromArray(o.waitWrite,t); */
-    } else if(o instanceof h$Thread) {
-      ;
-      // set thread (first in pair) to null, exception will still be delivered
-      // but this thread not woken up again
-      // fixme: are these the correct semantics?
-      for(var i=0;i<o.excep.length;i++) {
-        if(o.excep[i][0] === t) {
-          o.excep[i][0] = null;
-          break;
-        }
-      }
-    } else if (o instanceof h$TVarsWaiting) {
-      h$stmRemoveBlockedThread(o, t)
-    } else if((typeof (o) === 'object' && (o) && (o).f && (o).f.t === (5))) {
-      ;
-      h$removeFromArray(((o).d2),t);
-    } else {
-      throw ("h$removeThreadBlock: blocked on unknown object: " + h$collectProps(o));
-    }
-    if(t.retryInterrupted) {
-      t.sp+=2;
-      t.stack[t.sp-1] = t.retryInterrupted;
-      t.stack[t.sp] = h$retryInterrupted;
-    }
-  }
-}
-function h$removeFromArray(a,o) {
-  var i;
-  while((i = a.indexOf(o)) !== -1) {
-    a.splice(i,1);
-  }
-}
-function h$finishThread(t) {
-    ;
-    t.status = (16);
-    h$blocked.remove(t);
-    t.stack = null;
-    t.mask = 0;
-    for(var i=0;i<t.excep.length;i++) {
-        var v = t.excep[i];
-        var tposter = v[0];
-        if(v !== null && tposter !== null) {
-            h$wakeupThread(tposter);
-        }
-    }
-    t.excep = [];
-}
-function h$blockThread(t,o,resume) {
-    ;
-    if(t !== h$currentThread) {
-        throw "h$blockThread: blocked thread is not the current thread";
-    }
-    if(o === undefined || o === null) {
-        throw ("h$blockThread, no block object: " + h$threadString(t));
-    }
-    t.status = (1);
-    t.blockedOn = o;
-    t.retryInterrupted = resume;
-    t.sp = h$sp;
-    h$blocked.add(t);
-    return h$reschedule;
-}
-// the main scheduler, called from h$mainLoop
-// returns null if nothing to do, otherwise
-// the next function to run
-var h$lastGc = Date.now();
-var h$gcInterval = 1000; // ms
-function h$scheduler(next) {
-    ;
-    // if we have a running synchronous thread, the only thing we can do is continue
-    if(h$currentThread &&
-       h$currentThread.isSynchronous &&
-       h$currentThread.status === (0)) {
-        return next;
-    }
-    var now = Date.now();
-    h$wakeupDelayed(now);
-    // find the next runnable thread in the run queue
-    // remove non-runnable threads
-    if(h$currentThread && h$pendingAsync()) {
-        ;
-        if(h$currentThread.status !== (0)) {
-            h$forceWakeupThread(h$currentThread);
-            h$currentThread.status = (0);
-        }
-        h$postAsync(next === h$reschedule, next);
-        return h$stack[h$sp];
-    }
-    var t;
-    while(t = h$threads.dequeue()) {
-        if(t.status === (0)) { break; }
-    }
-    // if no other runnable threads, just continue current (if runnable)
-    if(t === null) {
-        ;
-        if(h$currentThread && h$currentThread.status === (0)) {
-            // do gc after a while
-            if(now - h$lastGc > h$gcInterval) {
-                // save active data for the thread on its stack
-                if(next !== h$reschedule && next !== null) {
-                    h$suspendCurrentThread(next);
-                    next = h$stack[h$sp];
-                }
-                var ct = h$currentThread;
-                h$currentThread = null;
-                h$gc(ct);
-                h$currentThread = ct;
-                // gc might replace the stack of a thread, so reload it
-                h$stack = h$currentThread.stack;
-                h$sp = h$currentThread.sp
-            }
-            ;
-            return (next===h$reschedule || next === null)?h$stack[h$sp]:next; // just continue
-        } else {
-            ;
-            h$currentThread = null;
-            // We could set a timer here so we do a gc even if Haskell pauses for a long time.
-            // However, currently this isn't necessary because h$mainLoop always sets a timer
-            // before it pauses.
-            if(now - h$lastGc > h$gcInterval)
-                h$gc(null);
-            return null; // pause the haskell runner
-        }
-    } else { // runnable thread in t, switch to it
-        ;
-        if(h$currentThread !== null) {
-            if(h$currentThread.status === (0)) {
-                h$threads.enqueue(h$currentThread);
-            }
-            // if h$reschedule called, thread takes care of suspend
-            if(next !== h$reschedule && next !== null) {
-                ;
-                // suspend thread: push h$restoreThread stack frame
-                h$suspendCurrentThread(next);
-            } else {
-                ;
-                h$currentThread.sp = h$sp;
-            }
-            if(h$pendingAsync()) h$postAsync(true, next);
-        } else {
-            ;
-        }
-        // gc if needed
-        if(now - h$lastGc > h$gcInterval) {
-            h$currentThread = null;
-            h$gc(t);
-        }
-        // schedule new one
-        h$currentThread = t;
-        h$stack = t.stack;
-        h$sp = t.sp;
-        ;
-        // TRACE_SCHEDULER("sp thing: " + h$stack[h$sp].n);
-        // h$dumpStackTop(h$stack,0,h$sp);
-        return h$stack[h$sp];
-    }
-}
-function h$scheduleMainLoop() {
-    ;
-    if(h$mainLoopImmediate) return;
-    h$clearScheduleMainLoop();
-    if(h$delayed.size() === 0) {
-        if(typeof setTimeout !== 'undefined') {
-            ;
-            h$mainLoopTimeout = setTimeout(h$mainLoop, h$gcInterval);
-        }
-        return;
-    }
-    var now = Date.now();
-    var delay = Math.min(Math.max(h$delayed.peekPrio()-now, 0), h$gcInterval);
-    if(typeof setTimeout !== 'undefined') {
-        if(delay >= 1) {
-            ;
-            // node.js 0.10.30 has trouble with non-integral delays
-            h$mainLoopTimeout = setTimeout(h$mainLoop, Math.round(delay));
-        } else {
-            h$mainLoopImmediate = setImmediate(h$mainLoop);
-        }
-    }
-}
-var h$animationFrameMainLoop = false;
-function h$clearScheduleMainLoop() {
-    if(h$mainLoopTimeout) {
-        clearTimeout(h$mainLoopTimeout);
-        h$mainLoopTimeout = null;
-    }
-    if(h$mainLoopImmediate) {
-        clearImmediate(h$mainLoopImmediate);
-        h$mainLoopImmediate = null;
-    }
-    if(h$mainLoopFrame) {
-        cancelAnimationFrame(h$mainLoopFrame);
-        h$mainLoopFrame = null;
-    }
-}
-function h$startMainLoop() {
-    ;
-    if(h$running) return;
-    if(typeof setTimeout !== 'undefined') {
-        if(!h$mainLoopImmediate) {
-            h$clearScheduleMainLoop();
-            h$mainLoopImmediate = setImmediate(h$mainLoop);
-        }
-    } else {
-        while(true) h$mainLoop();
-    }
-}
-var h$busyYield = 500;
-var h$schedQuantum = 25;
-var h$mainLoopImmediate = null; // immediate id if main loop has been scheduled immediately
-var h$mainLoopTimeout = null; // timeout id if main loop has been scheduled with a timeout
-var h$mainLoopFrame = null; // timeout id if main loop has been scheduled with an animation frame
-var h$running = false;
-var h$nextThread = null;
-function h$mainLoop() {
-  if(h$running) return;
-  h$clearScheduleMainLoop();
-  if(h$currentThread) {
-    h$scheduleMainLoop();
-    return;
-  }
-  h$running = true;
-  h$runInitStatic();
-  h$currentThread = h$nextThread;
-  if(h$nextThread !== null) {
-    h$stack = h$currentThread.stack;
-    h$sp = h$currentThread.sp;
-  }
-  var c = null;
-  var start = Date.now();
-  do {
-    c = h$scheduler(c);
-    if(c === null) { // no running threads
-      h$nextThread = null;
-      h$running = false;
-      h$currentThread = null;
-      h$scheduleMainLoop();
-      return;
-    }
-    // yield to js after h$busyYield (default value GHCJS_BUSY_YIELD)
-    if(!h$currentThread.isSynchronous && Date.now() - start > h$busyYield) {
-      ;
-      if(c !== h$reschedule) h$suspendCurrentThread(c);
-      h$nextThread = h$currentThread;
-      h$currentThread = null;
-      h$running = false;
-      if(h$animationFrameMainLoop) {
-        h$mainLoopFrame = requestAnimationFrame(h$mainLoop);
-      } else {
-        h$mainLoopImmediate = setImmediate(h$mainLoop);
-      }
-      return;
-    }
-    c = h$runThreadSliceCatch(c);
-  } while(true);
-}
-function h$runThreadSliceCatch(c) {
-  try {
-    return h$runThreadSlice(c);
-  } catch(e) {
-    // uncaught exception in haskell code, kill thread
-    c = null;
-    if(h$stack && h$stack[0] === h$doneMain_e) {
-      h$stack = null;
-      h$reportMainLoopException(e, true);
-      h$doneMain_e();
-    } else {
-      h$stack = null;
-      h$reportMainLoopException(e, false);
-    }
-    h$finishThread(h$currentThread);
-    h$currentThread.status = (17);
-    h$currentThread = null;
-  }
-  return h$reschedule;
-}
-/*
-  run thread h$currentThread for a single time slice
-
-     - c: the next function to call from the trampoline
-
-  returns:
-    the next function to call in this thread
-
-  preconditions:
-    h$currentThread is the thread to run
-    h$stack         is the stack of this thread
-    h$sp            is the stack pointer
-  
-    any global variables needed to pass arguments have been set
-    the caller has to update the thread state object
- */
-function h$runThreadSlice(c) {
-  var count, scheduled = Date.now();
-  while(c !== h$reschedule &&
-        (h$currentThread.noPreemption || h$currentThread.isSynchronous ||
-         (Date.now() - scheduled < h$schedQuantum))) {
-    count = 0;
-    while(c !== h$reschedule && ++count < 1000) {
-      c = c();
-      c = c();
-      c = c();
-      c = c();
-      c = c();
-      c = c();
-      c = c();
-      c = c();
-      c = c();
-      c = c();
-    }
-    if(c === h$reschedule &&
-       (h$currentThread.noPreemption || h$currentThread.isSynchronous) &&
-       h$currentThread.status === (1)) {
-      c = h$handleBlockedSyncThread(c);
-    }
-  }
-  return c;
-}
-function h$reportMainLoopException(e, isMainThread) {
-  if(e instanceof h$ThreadAbortedError) return;
-  var main = isMainThread ? " main" : "";
-  h$log("uncaught exception in Haskell" + main + " thread: " + e.toString());
-  if(e.stack) h$log(e.stack);
-}
-function h$handleBlockedSyncThread(c) {
-  ;
-  /*
-    if we have a blocked synchronous/non-preemptible thread,
-    and it's blocked on a black hole, first try to clear
-    it.
-   */
-  var bo = h$currentThread.blockedOn;
-  if(h$currentThread.status === (1) &&
-     (typeof (bo) === 'object' && (bo) && (bo).f && (bo).f.t === (5)) &&
-     h$runBlackholeThreadSync(bo)) {
-    ;
-    c = h$stack[h$sp];
-  }
-  /*
-    if still blocked, then either fall back to async,
-    or throw a WouldBlock exception
-   */
-  if(h$currentThread.isSynchronous && h$currentThread.status === (1)) {
-    if(h$currentThread.continueAsync) {
-      h$currentThread.isSynchronous = false;
-      h$currentThread.continueAsync = false;
-    } else if(h$currentThread.isSynchronous) {
-      ;
-      h$sp += 2;
-      h$currentThread.sp = h$sp;
-      h$stack[h$sp-1] = h$ghcjszmprimZCGHCJSziPrimziInternalziwouldBlock;
-      h$stack[h$sp] = h$raiseAsync_frame;
-      h$forceWakeupThread(h$currentThread);
-      c = h$raiseAsync_frame;
-    } // otherwise a non-preemptible thread, keep it in the same state
-  }
-  return c;
-}
-// run the supplied IO action in a new thread
-// returns immediately, thread is started in background
-function h$run(a) {
-  ;
-  var t = h$fork(a, false);
-  h$startMainLoop();
-  return t;
-}
-/** @constructor */
-function h$WouldBlock() {
-}
-h$WouldBlock.prototype.toString = function() {
-  return "Haskell Operation would block";
-}
-/** @constructor */
-function h$HaskellException(msg) {
-  this._msg = msg;
-}
-h$HaskellException.prototype.toString = function() {
-  return this._msg;
-}
-function h$setCurrentThreadResultWouldBlock() {
-  h$currentThread.result = new h$WouldBlock();
-  h$currentThread.resultIsException = true;
-}
-function h$setCurrentThreadResultJSException(e) {
-  h$currentThread.result = e;
-  h$currentThread.resultIsException = true;
-}
-function h$setCurrentThreadResultHaskellException(msg) {
-  h$currentThread.result = new h$HaskellException(msg);
-  h$currentThread.resultIsException = true;
-}
-function h$setCurrentThreadResultValue(v) {
-  h$currentThread.result = v;
-  h$currentThread.resultIsException = false;
-}
-/*
-   run a Haskell (IO JSVal) action synchronously, returning
-   the result. Uncaught Haskell exceptions are thrown as a
-   h$HaskellException. If the action could not finish due to
-   blocking, a h$WouldBlock exception is thrown instead.
-
-     - a:    the (IO JSVal) action
-     - cont: continue async if blocked
-         (the call to h$runSyncReturn would still throw h$WouldBlock,
-          since there would be no return value)
-
-   returns: the result of the IO action
- */
-function h$runSyncReturn(a, cont) {
-  var t = new h$Thread();
-  ;
-  var aa = (h$c2(h$ap1_e,(h$ghcjszmprimZCGHCJSziPrimziInternalzisetCurrentThreadResultValue),(a)));
-  h$runSyncAction(t, aa, cont);
-  if(t.status === (16)) {
-    if(t.resultIsException) {
-      throw t.result;
-    } else {
-      return t.result;
-    }
-  } else if(t.status === (1)) {
-    throw new h$WouldBlock();
-  } else {
-    throw new Error("h$runSyncReturn: Unexpected thread status: " + t.status);
-  }
-}
-/*
-   run a Haskell IO action synchronously, ignoring the result
-   or any exception in the Haskell code
-     
-     - a:    the IO action
-     - cont: continue async if blocked
-
-   returns: true if the action ran to completion, false otherwise
-
-   throws: any uncaught Haskell or JS exception except WouldBlock
- */
-function h$runSync(a, cont) {
-  var t = new h$Thread();
-  ;
-  h$runSyncAction(t, a, cont);
-  if(t.resultIsException) {
-    if(t.result instanceof h$WouldBlock) {
-      return false;
-    } else {
-      throw t.result;
-    }
-  }
-  return t.status === (16);
-}
-function h$runSyncAction(t, a, cont) {
-  h$runInitStatic();
-  var c = h$return;
-  t.stack[2] = h$ghcjszmprimZCGHCJSziPrimziInternalzisetCurrentThreadResultException;
-  t.stack[4] = h$ap_1_0;
-  t.stack[5] = a;
-  t.stack[6] = h$return;
-  t.sp = 6;
-  t.status = (0);
-  t.isSynchronous = true;
-  t.continueAsync = cont;
-  var ct = h$currentThread;
-  var csp = h$sp;
-  var cr1 = h$r1; // do we need to save more than this?
-  var caught = false, excep = null;
-  h$currentThread = t;
-  h$stack = t.stack;
-  h$sp = t.sp;
-  try {
-    c = h$runThreadSlice(c);
-    if(c !== h$reschedule) {
-      throw new Error("h$runSyncAction: h$reschedule expected");
-    }
-  } catch(e) {
-    h$finishThread(h$currentThread);
-    h$currentThread.status = (17);
-    caught = true;
-    excep = e;
-  }
-  if(ct !== null) {
-    h$currentThread = ct;
-    h$stack = ct.stack;
-    h$sp = csp;
-    h$r1 = cr1;
-  } else {
-    h$currentThread = null;
-    h$stack = null;
-  }
-  if(t.status !== (16) && !cont) {
-    h$removeThreadBlock(t);
-    h$finishThread(t);
-  }
-  if(caught) throw excep;
-}
-// run other threads synchronously until the blackhole is 'freed'
-// returns true for success, false for failure, a thread blocks
-function h$runBlackholeThreadSync(bh) {
-  ;
-  var ct = h$currentThread;
-  var sp = h$sp;
-  var success = false;
-  var bhs = [];
-  var currentBh = bh;
-  // we don't handle async exceptions here,
-  // don't run threads with pending exceptions
-  if(((bh).d1).excep.length > 0) {
-    ;
-    return false;
-  }
-  h$currentThread = ((bh).d1);
-  h$stack = h$currentThread.stack;
-  h$sp = h$currentThread.sp;
-  var c = (h$currentThread.status === (0))?h$stack[h$sp]:h$reschedule;
-  ;
-  try {
-    while(true) {
-      while(c !== h$reschedule && (typeof (currentBh) === 'object' && (currentBh) && (currentBh).f && (currentBh).f.t === (5))) {
-        c = c();
-        c = c();
-        c = c();
-        c = c();
-        c = c();
-      }
-      if(c === h$reschedule) {
- // perhaps new blackhole, then continue with that thread,
- // otherwise fail
-        if((typeof (h$currentThread.blockedOn) === 'object' && (h$currentThread.blockedOn) && (h$currentThread.blockedOn).f && (h$currentThread.blockedOn).f.t === (5))) {
-          ;
-          bhs.push(currentBh);
-          currentBh = h$currentThread.blockedOn;
-          h$currentThread = ((h$currentThread.blockedOn).d1);
-          if(h$currentThread.excep.length > 0) {
-            break;
-          }
-          h$stack = h$currentThread.stack;
-          h$sp = h$currentThread.sp;
-          c = (h$currentThread.status === (0))?h$stack[h$sp]:h$reschedule;
-        } else {
-          ;
-          break;
-        }
-      } else { // blackhole updated: suspend thread and pick up the old one
-        ;
-        ;
-        h$suspendCurrentThread(c);
-        if(bhs.length > 0) {
-          ;
-          currentBh = bhs.pop();
-          h$currentThread = ((currentBh).d1);
-          h$stack = h$currentThread.stack;
-          h$sp = h$currentThread.sp;
-        } else {
-          ;
-          success = true;
-          break;
-        }
-      }
-    }
-  } catch(e) { }
-  // switch back to original thread
-  h$sp = sp;
-  h$stack = ct.stack;
-  h$currentThread = ct;
-  return success;
-}
-function h$syncThreadState(tid) {
-  return (tid.isSynchronous ? 1 : 0) |
-    ((tid.continueAsync || !tid.isSynchronous) ? 2 : 0) |
-    ((tid.noPreemption || tid.isSynchronous) ? 4 : 0);
-}
-// run the supplied IO action in a main thread
-// (program exits when this thread finishes)
-function h$main(a) {
-  var t = new h$Thread();
-  //TRACE_SCHEDULER("sched: starting main thread");
-    t.stack[0] = h$doneMain_e;
-  if(!h$isBrowser && !h$isGHCJSi) {
-    t.stack[2] = h$baseZCGHCziTopHandlerzitopHandler;
-  }
-  t.stack[4] = h$ap_1_0;
-  t.stack[5] = h$flushStdout;
-  t.stack[6] = h$return;
-  t.stack[7] = h$ap_1_0;
-  t.stack[8] = a;
-  t.stack[9] = h$return;
-  t.sp = 9;
-  t.label = [h$encodeUtf8("main"), 0];
-  h$wakeupThread(t);
-  h$startMainLoop();
-  return t;
-}
-function h$doneMain() {
-  if(h$isGHCJSi) {
-    if(h$currentThread.stack) {
-      global.h$GHCJSi.done(h$currentThread);
-    }
-  } else {
-    h$exitProcess(0);
-  }
-  h$finishThread(h$currentThread);
-  return h$reschedule;
-}
-/** @constructor */
-function h$ThreadAbortedError(code) {
-  this.code = code;
-}
-h$ThreadAbortedError.prototype.toString = function() {
-  return "Thread aborted, exit code: " + this.code;
-}
-function h$exitProcess(code) {
-    if(h$isNode) {
- process.exit(code);
-    } else if(h$isJsShell) {
-        quit(code);
-    } else if(h$isJsCore) {
-        if(h$base_stdoutLeftover.val !== null) print(h$base_stdoutLeftover.val);
-        if(h$base_stderrLeftover.val !== null) debug(h$base_stderrLeftover.val);
-        // jsc does not support returning a nonzero value, print it instead
-        if(code !== 0) debug("GHCJS JSC exit status: " + code);
-        quit();
-    } else {
-        if(h$currentThread) {
-            h$finishThread(h$currentThread);
-            h$stack = null;
-            throw new h$ThreadAbortedError(code);
-        }
-    }
-}
-// MVar support
-var h$mvarId = 0;
-/** @constructor */
-function h$MVar() {
-  ;
-  this.val = null;
-  this.readers = new h$Queue();
-  this.writers = new h$Queue();
-  this.waiters = null; // waiting for a value in the MVar with ReadMVar
-  this.m = 0; // gc mark
-  this.id = ++h$mvarId;
-}
-// set the MVar to empty unless there are writers
-function h$notifyMVarEmpty(mv) {
-  var w = mv.writers.dequeue();
-  if(w !== null) {
-    var thread = w[0];
-    var val = w[1];
-    ;
-    mv.val = val;
-    // thread is null if some JavaScript outside Haskell wrote to the MVar
-    if(thread !== null) {
-      h$wakeupThread(thread);
-    }
-  } else {
-    ;
-    mv.val = null;
-  }
-  ;
-}
-// set the MVar to val unless there are readers
-function h$notifyMVarFull(mv,val) {
-  if(mv.waiters && mv.waiters.length > 0) {
-    for(var i=0;i<mv.waiters.length;i++) {
-      var w = mv.waiters[i];
-      w.sp += 2;
-      w.stack[w.sp-1] = val;
-      w.stack[w.sp] = h$return;
-      h$wakeupThread(w);
-    }
-    mv.waiters = null;
-  }
-  var r = mv.readers.dequeue();
-  if(r !== null) {
-    ;
-    r.sp += 2;
-    r.stack[r.sp-1] = val;
-    r.stack[r.sp] = h$return;
-    h$wakeupThread(r);
-    mv.val = null;
-  } else {
-    ;
-    mv.val = val;
-  }
-  ;
-}
-function h$takeMVar(mv) {
-  ;
-  if(mv.val !== null) {
-    h$r1 = mv.val;
-    h$notifyMVarEmpty(mv);
-    return h$stack[h$sp];
-  } else {
-    mv.readers.enqueue(h$currentThread);
-    h$currentThread.interruptible = true;
-    return h$blockThread(h$currentThread,mv,[h$takeMVar,mv]);
-  }
-}
-function h$tryTakeMVar(mv) {
-  ;
-  if(mv.val === null) {
-    { h$ret1 = (null); return (0); };
-  } else {
-    var v = mv.val;
-    h$notifyMVarEmpty(mv);
-    { h$ret1 = (v); return (1); };
-  }
-}
-function h$readMVar(mv) {
-  ;
-  if(mv.val === null) {
-    if(mv.waiters) {
-      mv.waiters.push(h$currentThread);
-    } else {
-      mv.waiters = [h$currentThread];
-    }
-    h$currentThread.interruptible = true;
-    return h$blockThread(h$currentThread,mv,[h$readMVar,mv]);
-  } else {
-    h$r1 = mv.val;
-    return h$stack[h$sp];
-  }
-}
-function h$putMVar(mv,val) {
-  ;
-  if(mv.val !== null) {
-    mv.writers.enqueue([h$currentThread,val]);
-    h$currentThread.interruptible = true;
-    return h$blockThread(h$currentThread,mv,[h$putMVar,mv,val]);
-  } else {
-    h$notifyMVarFull(mv,val);
-    return h$stack[h$sp];
-  }
-}
-function h$tryPutMVar(mv,val) {
-  ;
-  if(mv.val !== null) {
-    return 0;
-  } else {
-    h$notifyMVarFull(mv,val);
-    return 1;
-  }
-}
-// box up a JavaScript value and write it to the MVar synchronously
-function h$writeMVarJs1(mv,val) {
-  var v = (h$c1(h$data1_e, (val)));
-  if(mv.val !== null) {
-    ;
-    mv.writers.enqueue([null,v]);
-  } else {
-    ;
-    h$notifyMVarFull(mv,v);
-  }
-}
-function h$writeMVarJs2(mv,val1,val2) {
-  var v = (h$c2(h$data1_e, (val1), (val2)));
-  if(mv.val !== null) {
-    ;
-    mv.writers.enqueue([null,v]);
-  } else {
-    ;
-    h$notifyMVarFull(mv,v);
-  }
-}
-// IORef support
-/** @constructor */
-function h$MutVar(v) {
-    this.val = v;
-    this.m = 0;
-}
-function h$atomicModifyMutVar(mv, fun) {
-  var thunk = (h$c2(h$ap1_e,(fun),(mv.val)));
-  mv.val = (h$c1(h$select1_e, (thunk)));
-  return (h$c1(h$select2_e, (thunk)));
-}
-// Black holes and updates
-// caller must save registers on stack
-function h$blockOnBlackhole(c) {
-  ;
-  if(((c).d1) === h$currentThread) {
-    ;
-    return h$throw(h$baseZCControlziExceptionziBasezinonTermination, false); // is this an async exception?
-  }
-  ;
-  if(((c).d2) === null) {
-    ((c).d2 = ([h$currentThread]));
-  } else {
-    ((c).d2).push(h$currentThread);
-  }
-  return h$blockThread(h$currentThread,c,[h$resumeBlockOnBlackhole,c]);
-}
-function h$resumeBlockOnBlackhole(c) {
-  h$r1 = c;
-  return h$ap_0_0_fast();
-}
-// async exception happened in a black hole, make a thunk
-// to resume the computation
-// var h$debugResumableId = 0;
-function h$makeResumable(bh,start,end,extra) {
-  var s = h$stack.slice(start,end+1);
-  if(extra) {
-    s = s.concat(extra);
-  }
-//  TRACE_SCHEDULER("making resumable " + (h$debugResumableId+1) + ", stack: ");
-//  h$dumpStackTop(s,0,s.length-1);
-  { (bh).f = h$resume_e; (bh).d1 = (s), (bh).d2 = null; };
-}
-var h$enabled_capabilities = h$newByteArray(4);
-h$enabled_capabilities.i3[0] = 1;
-function h$rtsSupportsBoundThreads() {
-  return 0;
-}
-// async foreign calls
-function h$mkForeignCallback(x) {
-    return function() {
-        if(x.mv === null) { // callback called synchronously
-            x.mv = arguments;
-        } else {
-            h$notifyMVarFull(x.mv, (h$c1(h$data1_e, (arguments))));
-            h$mainLoop();
-        }
-    }
-}
-// event listeners through MVar
-function h$makeMVarListener(mv, stopProp, stopImmProp, preventDefault) {
-  var f = function(event) {
-    ;
-    h$writeMVarJs1(mv,event);
-    if(stopProp) { event.stopPropagation(); }
-    if(stopImmProp) { event.stopImmediatePropagation(); }
-    if(preventDefault) { event.preventDefault(); }
-  }
-  f.root = mv;
-  return f;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// software transactional memory
-var h$stmTransactionActive = 0;
-var h$stmTransactionWaiting = 4;
-/** @constructor */
-function h$Transaction(o, parent) {
-    ;
-    this.action = o;
-    // h$TVar -> h$WrittenTVar, transaction-local changed values
-    this.tvars = new h$Map();
-    // h$TVar -> h$LocalTVar, all local tvars accessed anywhere in the transaction
-    this.accessed = parent===null?new h$Map():parent.accessed;
-    // nonnull while running a check, contains read variables in this part of the transaction
-    this.checkRead = parent===null?null:parent.checkRead;
-    this.parent = parent;
-    this.state = h$stmTransactionActive;
-    this.invariants = []; // invariants added in this transaction
-    this.m = 0; // gc mark
-}
-var h$stmInvariantN = 0;
-/** @constructor */
-function h$StmInvariant(a) {
-    this.action = a;
-    this._key = ++h$stmInvariantN;
-}
-/** @constructor */
-function h$WrittenTVar(tv,v) {
-    this.tvar = tv;
-    this.val = v;
-}
-var h$TVarN = 0;
-/** @constructor */
-function h$TVar(v) {
-    ;
-    this.val = v; // current value
-    this.blocked = new h$Set(); // threads that get woken up if this TVar is updated
-    this.invariants = null; // invariants that use this TVar (h$Set)
-    this.m = 0; // gc mark
-    this._key = ++h$TVarN; // for storing in h$Map/h$Set
-}
-/** @constructor */
-function h$TVarsWaiting(s) {
-  this.tvars = s; // h$Set of TVars we're waiting on
-}
-/** @constructor */
-function h$LocalInvariant(o) {
-  this.action = o;
-  this.dependencies = new h$Set();
-}
-// local view of a TVar
-/** @constructor */
-function h$LocalTVar(v) {
-  ;
-  this.readVal = v.val; // the value when read from environment
-  this.val = v.val; // the current uncommitted value
-  this.tvar = v;
-}
-function h$atomically(o) {
-  h$p3(o, h$atomically_e, h$checkInvariants_e);
-  return h$stmStartTransaction(o);
-}
-function h$stmStartTransaction(o) {
-  ;
-  var t = new h$Transaction(o, null);
-  h$currentThread.transaction = t;
-  h$r1 = o;
-  return h$ap_1_0_fast();
-}
-function h$stmUpdateInvariantDependencies(inv) {
-    var ii, iter = h$currentThread.transaction.checkRead.iter();
-    if(inv instanceof h$LocalInvariant) {
-        while((ii = iter.next()) !== null) inv.dependencies.add(ii);
-    } else {
-        while((ii = iter.next()) !== null) h$stmAddTVarInvariant(ii, inv);
-    }
-}
-function h$stmAddTVarInvariant(tv, inv) {
-    if(tv.invariants === null) tv.invariants = new h$Set();
-    tv.invariants.add(inv);
-}
-// commit current transaction,
-// if it's top-level, commit the TVars, otherwise commit to parent
-function h$stmCommitTransaction() {
-    var t = h$currentThread.transaction;
-    var tvs = t.tvars;
-    var wtv, i = tvs.iter();
-    if(t.parent === null) { // top-level commit
-        ;
- // write new value to TVars and collect blocked threads
-        var thread, threadi, blockedThreads = new h$Set();
-        while((wtv = i.nextVal()) !== null) {
-     h$stmCommitTVar(wtv.tvar, wtv.val, blockedThreads);
- }
- // wake up all blocked threads
-        threadi = blockedThreads.iter();
-        while((thread = threadi.next()) !== null) {
-     h$stmRemoveBlockedThread(thread.blockedOn, thread);
-            h$wakeupThread(thread);
- }
- // commit our new invariants
-        for(var j=0;j<t.invariants.length;j++) {
-            h$stmCommitInvariant(t.invariants[j]);
-        }
-    } else { // commit subtransaction
-        ;
-        var tpvs = t.parent.tvars;
-        while((wtv = i.nextVal()) !== null) tpvs.put(wtv.tvar, wtv);
-        t.parent.invariants = t.parent.invariants.concat(t.invariants);
-    }
-    h$currentThread.transaction = t.parent;
-}
-function h$stmValidateTransaction() {
-    var ltv, i = h$currentThread.transaction.accessed.iter();
-    while((ltv = i.nextVal()) !== null) {
-        if(ltv.readVal !== ltv.tvar.val) return false;
-    }
-    return true;
-}
-function h$stmAbortTransaction() {
-  h$currentThread.transaction = h$currentThread.transaction.parent;
-}
-// add an invariant
-function h$stmCheck(o) {
-  h$currentThread.transaction.invariants.push(new h$LocalInvariant(o));
-  return false;
-}
-function h$stmRetry() {
-  // unwind stack to h$atomically_e or h$stmCatchRetry_e frame
-  while(h$sp > 0) {
-    var f = h$stack[h$sp];
-    if(f === h$atomically_e || f === h$stmCatchRetry_e) {
-      break;
-    }
-    var size;
-    if(f === h$ap_gen) {
-      size = ((h$stack[h$sp-1] >> 8) + 2);
-    } else {
-      var tag = f.gtag;
-      if(tag < 0) { // dynamic size
-        size = h$stack[h$sp-1];
-      } else {
-        size = (tag & 0xff) + 1;
-      }
-    }
-    h$sp -= size;
-  }
-  // either h$sp == 0 or at a handler
-  if(h$sp > 0) {
-    if(f === h$atomically_e) {
-      return h$stmSuspendRetry();
-    } else { // h$stmCatchRetry_e
-      var b = h$stack[h$sp-1];
-      h$stmAbortTransaction();
-      h$sp -= 2;
-      h$r1 = b;
-      return h$ap_1_0_fast();
-    }
-  } else {
-    throw "h$stmRetry: STM retry outside a transaction";
-  }
-}
-function h$stmSuspendRetry() {
-    var tv, i = h$currentThread.transaction.accessed.iter();
-    var tvs = new h$Set();
-    while((tv = i.next()) !== null) {
-        ;
-        tv.blocked.add(h$currentThread);
-        tvs.add(tv);
-    }
-    var waiting = new h$TVarsWaiting(tvs);
-    h$currentThread.interruptible = true;
-    h$p2(waiting, h$stmResumeRetry_e);
-    return h$blockThread(h$currentThread, waiting);
-}
-function h$stmCatchRetry(a,b) {
-    h$currentThread.transaction = new h$Transaction(b, h$currentThread.transaction);
-    h$p2(b, h$stmCatchRetry_e);
-    h$r1 = a;
-    return h$ap_1_0_fast();
-}
-function h$catchStm(a,handler) {
-    h$p4(h$currentThread.transaction, h$currentThread.mask, handler, h$catchStm_e);
-    h$r1 = a;
-    return h$ap_1_0_fast();
-}
-function h$newTVar(v) {
-  return new h$TVar(v);
-}
-function h$readTVar(tv) {
-  return h$readLocalTVar(h$currentThread.transaction,tv);
-}
-function h$readTVarIO(tv) {
-  return tv.val;
-}
-function h$writeTVar(tv, v) {
-  h$setLocalTVar(h$currentThread.transaction, tv, v);
-}
-function h$sameTVar(tv1, tv2) {
-  return tv1 === tv2;
-}
-// get the local value of the TVar in the transaction t
-// tvar is added to the read set
-function h$readLocalTVar(t, tv) {
-  if(t.checkRead !== null) {
-    t.checkRead.add(tv);
-  }
-  var t0 = t;
-  while(t0 !== null) {
-    var v = t0.tvars.get(tv);
-    if(v !== null) {
-      ;
-      return v.val;
-    }
-    t0 = t0.parent;
-  }
-  var lv = t.accessed.get(tv);
-  if(lv !== null) {
-    ;
-    return lv.val;
-  } else {
-    ;
-    t.accessed.put(tv, new h$LocalTVar(tv));
-    return tv.val;
-  }
-}
-function h$setLocalTVar(t, tv, v) {
-    if(!t.accessed.has(tv)) t.accessed.put(tv, new h$LocalTVar(tv));
-    if(t.tvars.has(tv)) {
-        t.tvars.get(tv).val = v;
-    } else {
-        t.tvars.put(tv, new h$WrittenTVar(tv, v))
-    }
-}
-function h$stmCheckInvariants() {
-    var t = h$currentThread.transaction;
-    function addCheck(inv) {
-        h$p5(inv, h$stmCheckInvariantResult_e, t, inv, h$stmCheckInvariantStart_e);
-    }
-    h$p2(h$r1, h$return);
-    var wtv, i = t.tvars.iter();
-    while((wtv = i.nextVal()) !== null) {
-        ;
-        var ii = wtv.tvar.invariants;
-        if(ii) {
-            var iv, iii = ii.iter();
-            while((iv = iii.next()) !== null) addCheck(iv);
-        }
-    }
-    for(var j=0;j<t.invariants.length;j++) {
-        addCheck(t.invariants[j]);
-    }
-    return h$stack[h$sp];
-}
-function h$stmCommitTVar(tv, v, threads) {
-    ;
-    if(v !== tv.val) {
-        var thr, iter = tv.blocked.iter();
-        while((thr = iter.next()) !== null) threads.add(thr);
-        tv.blocked.clear();
-        tv.val = v;
-    }
-}
-// remove the thread from the queues of the TVars in s
-function h$stmRemoveBlockedThread(s, thread) {
-    var tv, i = s.tvars.iter();
-    while((tv = i.next()) !== null) {
-        tv.blocked.remove(thread);
-    }
-}
-function h$stmCommitInvariant(localInv) {
-    var inv = new h$StmInvariant(localInv.action);
-    var dep, i = localInv.dependencies.iter();
-    while((dep = i.next()) !== null) {
-        h$stmAddTVarInvariant(dep, inv);
-    }
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-// static pointers
-var h$static_pointer_table = null;
-var h$static_pointer_table_keys = null;
-function h$hs_spt_insert(key1,key2,key3,key4,ref) {
-    // h$log("hs_spt_insert: " + key1 + " " + key2 + " " + key3 + " " + key4 + " -> " + h$collectProps(ref));
-    if(!h$static_pointer_table) {
- h$static_pointer_table = [];
- h$static_pointer_table_keys = [];
-    }
-    if(!h$hs_spt_lookup_key(key1,key2,key3,key4)) {
-        var ba = h$newByteArray(16);
-        ba.i3[0] = key1;
-        ba.i3[1] = key2;
-        ba.i3[2] = key3;
-        ba.i3[3] = key4;
- h$static_pointer_table_keys.push([ba,0]);
-        h$retain({ root: ref, _key: -1 });
-    }
-    var s = h$static_pointer_table;
-    if(!s[key1]) s[key1] = [];
-    if(!s[key1][key2]) s[key1][key2] = [];
-    if(!s[key1][key2][key3]) s[key1][key2][key3] = [];
-    s[key1][key2][key3][key4] = ref;
-}
-function h$hs_spt_key_count() {
-    return h$static_pointer_table_keys ?
-              h$static_pointer_table_keys.length : 0;
-}
-function h$hs_spt_keys(tgt_d, tgt_o, n) {
-    var ks = h$static_pointer_table_keys;
-    if(!tgt_d.arr) tgt_d.arr = [];
-    for(var i=0;(i<n&&i<ks.length);i++) tgt_d.arr[tgt_o+4*i] = ks[i];
-    return Math.min(n,ks.length);
-}
-function h$hs_spt_lookup(key_d, key_o) {
-    var i3 = key_d.i3, o = key_o >> 2;
-    { h$ret1 = (0); return (h$hs_spt_lookup_key(i3[o],i3[o+1],i3[o+2],i3[o+3])); };
-}
-function h$hs_spt_lookup_key(key1,key2,key3,key4) {
-    var s = h$static_pointer_table;
-    if(s && s[key1] && s[key1][key2] && s[key1][key2][key3] &&
-       s[key1][key2][key3][key4]) return s[key1][key2][key3][key4];
-    return null;
-}
-/* Copyright (C) 1991-2014 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-/* This header is separate from features.h so that the compiler can
-   include it implicitly at the start of every compilation.  It must
-   not itself include <features.h> or any other header that includes
-   <features.h> because the implicit include comes before any feature
-   test macros that may be defined in a source file before it first
-   explicitly includes a system header.  GCC knows the name of this
-   header in order to preinclude it.  */
-/* glibc's intent is to support the IEC 559 math functionality, real
-   and complex.  If the GCC (4.9 and later) predefined macros
-   specifying compiler intent are available, use them to determine
-   whether the overall intent is to support these features; otherwise,
-   presume an older compiler has intent to support these features and
-   define these macros by default.  */
-/* wchar_t uses ISO/IEC 10646 (2nd ed., published 2011-03-15) /
-   Unicode 6.0.  */
-/* We do not support C11 <threads.h>.  */
-// values defined in Gen2.ClosureInfo
-// thread status
-/*
- * low-level heap object manipulation macros
- */
-// GHCJS.Prim.JSVal
-// GHCJS.Prim.JSException
-// Exception dictionary for JSException
-// SomeException
-// GHC.Ptr.Ptr
-// GHC.Integer.GMP.Internals
-// Data.Maybe.Maybe
-// #define HS_NOTHING h$nothing
-// Data.List
-// Data.Text
-// Data.Text.Lazy
-// black holes
-// can we skip the indirection for black holes?
-// resumable thunks
-// general deconstruction
-// retrieve  a numeric value that's possibly stored as an indirection
-// generic lazy values
-// generic data constructors and selectors
-// unboxed tuple returns
-// #define RETURN_UBX_TUP1(x) return x;
-function h$__hscore_sizeof_termios() {
-    ;
-    return 4;
-}
-function h$tcgetattr(x, y, z) {
-    ;
-    return 0;
-}
-function h$__hscore_get_saved_termios(r) {
-    ;
-    { h$ret1 = (0); return (null); };
-}
-function h$__hscore_set_saved_termios(a, b, c) {
-    ;
-    { h$ret1 = (0); return (null); };
-}
-function h$__hscore_sizeof_sigset_t() {
-    ;
-    return 4;
-}
-function h$sigemptyset(a, b) {
-    ;
-    { h$ret1 = (0); return (null); };
-}
-function h$__hscore_sigttou() {
-    ;
-    return 0;
-}
-function h$sigaddset(a, b, c) {
-    ;
-    return 0;
-}
-function h$__hscore_sig_block() {
-    ;
-    return 0;
-}
-function h$sigprocmask(a,b,c,d,e) {
-    ;
-    { h$ret1 = (0); return (0); };
-}
-function h$__hscore_lflag(a,b) {
-    ;
-    return 0;
-}
-function h$__hscore_icanon() {
-    ;
-    return 0;
-}
-function h$__hscore_poke_lflag(a, b, c) {
-    ;
-    return 0;
-}
-function h$__hscore_ptr_c_cc(a, b) {
-    ;
-    { h$ret1 = (0); return (h$newByteArray(8)); }; // null;
-}
-function h$__hscore_vmin() {
-    ;
-    { h$ret1 = (0); return (h$newByteArray(8)); }; // null;
-}
-function h$__hscore_vtime() {
-    ;
-    return 0;
-}
-function h$__hscore_tcsanow() {
-    ;
-    return 0;
-}
-function h$tcsetattr(a,b,c,d) {
-    ;
-    return 0;
-}
-function h$__hscore_sig_setmask() {
-    ;
-    return 0;
-}
-function h$c(f)
-{
-  var h$RTS_0 = { d1: null, d2: null, f: f, m: 0
-                };
-  return h$RTS_0;
-};
-function h$c0(f)
-{
-  var h$RTS_1 = { d1: null, d2: null, f: f, m: 0
-                };
-  return h$RTS_1;
-};
-function h$c1(f, x1)
-{
-  var h$RTS_2 = { d1: x1, d2: null, f: f, m: 0
-                };
-  return h$RTS_2;
-};
-function h$c2(f, x1, x2)
-{
-  var h$RTS_3 = { d1: x1, d2: x2, f: f, m: 0
-                };
-  return h$RTS_3;
-};
-function h$c3(f, x1, x2, x3)
-{
-  var h$RTS_4 = { d1: x1, d2: { d1: x2, d2: x3
-                              }, f: f, m: 0
-                };
-  return h$RTS_4;
-};
-function h$c4(f, x1, x2, x3, x4)
-{
-  var h$RTS_5 = { d1: x1, d2: { d1: x2, d2: x3, d3: x4
-                              }, f: f, m: 0
-                };
-  return h$RTS_5;
-};
-function h$c5(f, x1, x2, x3, x4, x5)
-{
-  var h$RTS_6 = { d1: x1, d2: { d1: x2, d2: x3, d3: x4, d4: x5
-                              }, f: f, m: 0
-                };
-  return h$RTS_6;
-};
-function h$c6(f, x1, x2, x3, x4, x5, x6)
-{
-  var h$RTS_7 = { d1: x1, d2: { d1: x2, d2: x3, d3: x4, d4: x5, d5: x6
-                              }, f: f, m: 0
-                };
-  return h$RTS_7;
-};
-function h$c7(f, x1, x2, x3, x4, x5, x6, x7)
-{
-  var h$RTS_8 = { d1: x1, d2: { d1: x2, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7
-                              }, f: f, m: 0
-                };
-  return h$RTS_8;
-};
-function h$c8(f, x1, x2, x3, x4, x5, x6, x7, x8)
-{
-  var h$RTS_9 = { d1: x1, d2: { d1: x2, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8
-                              }, f: f, m: 0
-                };
-  return h$RTS_9;
-};
-function h$c9(f, x1, x2, x3, x4, x5, x6, x7, x8, x9)
-{
-  var h$RTS_10 = { d1: x1, d2: { d1: x2, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9
-                               }, f: f, m: 0
-                 };
-  return h$RTS_10;
-};
-function h$c10(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10)
-{
-  var h$RTS_11 = { d1: x1, d2: { d1: x2, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_11;
-};
-function h$c11(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11)
-{
-  var h$RTS_12 = { d1: x1, d2: { d1: x2, d10: x11, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_12;
-};
-function h$c12(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12)
-{
-  var h$RTS_13 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9,
-                                 d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_13;
-};
-function h$c13(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13)
-{
-  var h$RTS_14 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8,
-                                 d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_14;
-};
-function h$c14(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14)
-{
-  var h$RTS_15 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7,
-                                 d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_15;
-};
-function h$c15(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15)
-{
-  var h$RTS_16 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d2: x3, d3: x4, d4: x5, d5: x6,
-                                 d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_16;
-};
-function h$c16(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16)
-{
-  var h$RTS_17 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d2: x3, d3: x4,
-                                 d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_17;
-};
-function h$c17(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17)
-{
-  var h$RTS_18 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d16: x17, d2: x3,
-                                 d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_18;
-};
-function h$c18(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18)
-{
-  var h$RTS_19 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d16: x17, d17: x18,
-                                 d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_19;
-};
-function h$c19(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19)
-{
-  var h$RTS_20 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d16: x17, d17: x18,
-                                 d18: x19, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_20;
-};
-function h$c20(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20)
-{
-  var h$RTS_21 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d16: x17, d17: x18,
-                                 d18: x19, d19: x20, d2: x3, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_21;
-};
-function h$c21(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21)
-{
-  var h$RTS_22 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d16: x17, d17: x18,
-                                 d18: x19, d19: x20, d2: x3, d20: x21, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_22;
-};
-function h$c22(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22)
-{
-  var h$RTS_23 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d16: x17, d17: x18,
-                                 d18: x19, d19: x20, d2: x3, d20: x21, d21: x22, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_23;
-};
-function h$c23(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22,
-x23)
-{
-  var h$RTS_24 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d16: x17, d17: x18,
-                                 d18: x19, d19: x20, d2: x3, d20: x21, d21: x22, d22: x23, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9, d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_24;
-};
-function h$c24(f, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22,
-x23, x24)
-{
-  var h$RTS_25 = { d1: x1, d2: { d1: x2, d10: x11, d11: x12, d12: x13, d13: x14, d14: x15, d15: x16, d16: x17, d17: x18,
-                                 d18: x19, d19: x20, d2: x3, d20: x21, d21: x22, d22: x23, d23: x24, d3: x4, d4: x5, d5: x6, d6: x7, d7: x8, d8: x9,
-                                 d9: x10
-                               }, f: f, m: 0
-                 };
-  return h$RTS_25;
-};
-function h$d1(d1)
-{
-  return { d1: d1
-         };
-};
-function h$d2(d1, d2)
-{
-  return { d1: d1, d2: d2
-         };
-};
-function h$d3(d1, d2, d3)
-{
-  return { d1: d1, d2: d2, d3: d3
-         };
-};
-function h$d4(d1, d2, d3, d4)
-{
-  return { d1: d1, d2: d2, d3: d3, d4: d4
-         };
-};
-function h$d5(d1, d2, d3, d4, d5)
-{
-  return { d1: d1, d2: d2, d3: d3, d4: d4, d5: d5
-         };
-};
-function h$d6(d1, d2, d3, d4, d5, d6)
-{
-  return { d1: d1, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6
-         };
-};
-function h$d7(d1, d2, d3, d4, d5, d6, d7)
-{
-  return { d1: d1, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7
-         };
-};
-function h$d8(d1, d2, d3, d4, d5, d6, d7, d8)
-{
-  return { d1: d1, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8
-         };
-};
-function h$d9(d1, d2, d3, d4, d5, d6, d7, d8, d9)
-{
-  return { d1: d1, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d10(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10)
-{
-  return { d1: d1, d10: d10, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d11(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11)
-{
-  return { d1: d1, d10: d10, d11: d11, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d12(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d13(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d14(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7,
-           d8: d8, d9: d9
-         };
-};
-function h$d15(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d2: d2, d3: d3, d4: d4, d5: d5, d6: d6,
-           d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d16(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d2: d2, d3: d3, d4: d4, d5: d5,
-           d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d17(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d17: d17, d2: d2, d3: d3, d4: d4,
-           d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d18(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d17: d17, d18: d18, d2: d2,
-           d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d19(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d17: d17, d18: d18, d19: d19,
-           d2: d2, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d20(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d17: d17, d18: d18, d19: d19,
-           d2: d2, d20: d20, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d21(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d17: d17, d18: d18, d19: d19,
-           d2: d2, d20: d20, d21: d21, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d22(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21, d22)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d17: d17, d18: d18, d19: d19,
-           d2: d2, d20: d20, d21: d21, d22: d22, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d23(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21, d22, d23)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d17: d17, d18: d18, d19: d19,
-           d2: d2, d20: d20, d21: d21, d22: d22, d23: d23, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$d24(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21, d22, d23,
-d24)
-{
-  return { d1: d1, d10: d10, d11: d11, d12: d12, d13: d13, d14: d14, d15: d15, d16: d16, d17: d17, d18: d18, d19: d19,
-           d2: d2, d20: d20, d21: d21, d22: d22, d23: d23, d24: d24, d3: d3, d4: d4, d5: d5, d6: d6, d7: d7, d8: d8, d9: d9
-         };
-};
-function h$resetRegisters()
-{
-  h$r1 = null;
-  h$r2 = null;
-  h$r3 = null;
-  h$r4 = null;
-  h$r5 = null;
-  h$r6 = null;
-  h$r7 = null;
-  h$r8 = null;
-  h$r9 = null;
-  h$r10 = null;
-  h$r11 = null;
-  h$r12 = null;
-  h$r13 = null;
-  h$r14 = null;
-  h$r15 = null;
-  h$r16 = null;
-  h$r17 = null;
-  h$r18 = null;
-  h$r19 = null;
-  h$r20 = null;
-  h$r21 = null;
-  h$r22 = null;
-  h$r23 = null;
-  h$r24 = null;
-  h$r25 = null;
-  h$r26 = null;
-  h$r27 = null;
-  h$r28 = null;
-  h$r29 = null;
-  h$r30 = null;
-  h$r31 = null;
-  h$r32 = null;
-  h$regs[0] = null;
-  h$regs[1] = null;
-  h$regs[2] = null;
-  h$regs[3] = null;
-  h$regs[4] = null;
-  h$regs[5] = null;
-  h$regs[6] = null;
-  h$regs[7] = null;
-  h$regs[8] = null;
-  h$regs[9] = null;
-  h$regs[10] = null;
-  h$regs[11] = null;
-  h$regs[12] = null;
-  h$regs[13] = null;
-  h$regs[14] = null;
-  h$regs[15] = null;
-  h$regs[16] = null;
-  h$regs[17] = null;
-  h$regs[18] = null;
-  h$regs[19] = null;
-  h$regs[20] = null;
-  h$regs[21] = null;
-  h$regs[22] = null;
-  h$regs[23] = null;
-  h$regs[24] = null;
-  h$regs[25] = null;
-  h$regs[26] = null;
-  h$regs[27] = null;
-  h$regs[28] = null;
-  h$regs[29] = null;
-  h$regs[30] = null;
-  h$regs[31] = null;
-  h$regs[32] = null;
-  h$regs[33] = null;
-  h$regs[34] = null;
-  h$regs[35] = null;
-  h$regs[36] = null;
-  h$regs[37] = null;
-  h$regs[38] = null;
-  h$regs[39] = null;
-  h$regs[40] = null;
-  h$regs[41] = null;
-  h$regs[42] = null;
-  h$regs[43] = null;
-  h$regs[44] = null;
-  h$regs[45] = null;
-  h$regs[46] = null;
-  h$regs[47] = null;
-  h$regs[48] = null;
-  h$regs[49] = null;
-  h$regs[50] = null;
-  h$regs[51] = null;
-  h$regs[52] = null;
-  h$regs[53] = null;
-  h$regs[54] = null;
-  h$regs[55] = null;
-  h$regs[56] = null;
-  h$regs[57] = null;
-  h$regs[58] = null;
-  h$regs[59] = null;
-  h$regs[60] = null;
-  h$regs[61] = null;
-  h$regs[62] = null;
-  h$regs[63] = null;
-  h$regs[64] = null;
-  h$regs[65] = null;
-  h$regs[66] = null;
-  h$regs[67] = null;
-  h$regs[68] = null;
-  h$regs[69] = null;
-  h$regs[70] = null;
-  h$regs[71] = null;
-  h$regs[72] = null;
-  h$regs[73] = null;
-  h$regs[74] = null;
-  h$regs[75] = null;
-  h$regs[76] = null;
-  h$regs[77] = null;
-  h$regs[78] = null;
-  h$regs[79] = null;
-  h$regs[80] = null;
-  h$regs[81] = null;
-  h$regs[82] = null;
-  h$regs[83] = null;
-  h$regs[84] = null;
-  h$regs[85] = null;
-  h$regs[86] = null;
-  h$regs[87] = null;
-  h$regs[88] = null;
-  h$regs[89] = null;
-  h$regs[90] = null;
-  h$regs[91] = null;
-  h$regs[92] = null;
-  h$regs[93] = null;
-  h$regs[94] = null;
-  h$regs[95] = null;
-};
-function h$resetResultVars()
-{
-  h$ret1 = null;
-  h$ret2 = null;
-  h$ret3 = null;
-  h$ret4 = null;
-  h$ret5 = null;
-  h$ret6 = null;
-  h$ret7 = null;
-  h$ret8 = null;
-  h$ret9 = null;
-  h$ret10 = null;
-};
-function h$p1(x1)
-{
-  ++h$sp;
-  h$stack[(h$sp - 0)] = x1;
-};
-function h$p2(x1, x2)
-{
-  h$sp += 2;
-  h$stack[(h$sp - 1)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$p3(x1, x2, x3)
-{
-  h$sp += 3;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$p4(x1, x2, x3, x4)
-{
-  h$sp += 4;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$p5(x1, x2, x3, x4, x5)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$p6(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$p7(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 1)] = x6;
-  h$stack[(h$sp - 0)] = x7;
-};
-function h$p8(x1, x2, x3, x4, x5, x6, x7, x8)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 4)] = x4;
-  h$stack[(h$sp - 3)] = x5;
-  h$stack[(h$sp - 2)] = x6;
-  h$stack[(h$sp - 1)] = x7;
-  h$stack[(h$sp - 0)] = x8;
-};
-function h$p9(x1, x2, x3, x4, x5, x6, x7, x8, x9)
-{
-  h$sp += 9;
-  h$stack[(h$sp - 8)] = x1;
-  h$stack[(h$sp - 7)] = x2;
-  h$stack[(h$sp - 6)] = x3;
-  h$stack[(h$sp - 5)] = x4;
-  h$stack[(h$sp - 4)] = x5;
-  h$stack[(h$sp - 3)] = x6;
-  h$stack[(h$sp - 2)] = x7;
-  h$stack[(h$sp - 1)] = x8;
-  h$stack[(h$sp - 0)] = x9;
-};
-function h$p10(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10)
-{
-  h$sp += 10;
-  h$stack[(h$sp - 9)] = x1;
-  h$stack[(h$sp - 8)] = x2;
-  h$stack[(h$sp - 7)] = x3;
-  h$stack[(h$sp - 6)] = x4;
-  h$stack[(h$sp - 5)] = x5;
-  h$stack[(h$sp - 4)] = x6;
-  h$stack[(h$sp - 3)] = x7;
-  h$stack[(h$sp - 2)] = x8;
-  h$stack[(h$sp - 1)] = x9;
-  h$stack[(h$sp - 0)] = x10;
-};
-function h$p11(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11)
-{
-  h$sp += 11;
-  h$stack[(h$sp - 10)] = x1;
-  h$stack[(h$sp - 9)] = x2;
-  h$stack[(h$sp - 8)] = x3;
-  h$stack[(h$sp - 7)] = x4;
-  h$stack[(h$sp - 6)] = x5;
-  h$stack[(h$sp - 5)] = x6;
-  h$stack[(h$sp - 4)] = x7;
-  h$stack[(h$sp - 3)] = x8;
-  h$stack[(h$sp - 2)] = x9;
-  h$stack[(h$sp - 1)] = x10;
-  h$stack[(h$sp - 0)] = x11;
-};
-function h$p12(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12)
-{
-  h$sp += 12;
-  h$stack[(h$sp - 11)] = x1;
-  h$stack[(h$sp - 10)] = x2;
-  h$stack[(h$sp - 9)] = x3;
-  h$stack[(h$sp - 8)] = x4;
-  h$stack[(h$sp - 7)] = x5;
-  h$stack[(h$sp - 6)] = x6;
-  h$stack[(h$sp - 5)] = x7;
-  h$stack[(h$sp - 4)] = x8;
-  h$stack[(h$sp - 3)] = x9;
-  h$stack[(h$sp - 2)] = x10;
-  h$stack[(h$sp - 1)] = x11;
-  h$stack[(h$sp - 0)] = x12;
-};
-function h$p13(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13)
-{
-  h$sp += 13;
-  h$stack[(h$sp - 12)] = x1;
-  h$stack[(h$sp - 11)] = x2;
-  h$stack[(h$sp - 10)] = x3;
-  h$stack[(h$sp - 9)] = x4;
-  h$stack[(h$sp - 8)] = x5;
-  h$stack[(h$sp - 7)] = x6;
-  h$stack[(h$sp - 6)] = x7;
-  h$stack[(h$sp - 5)] = x8;
-  h$stack[(h$sp - 4)] = x9;
-  h$stack[(h$sp - 3)] = x10;
-  h$stack[(h$sp - 2)] = x11;
-  h$stack[(h$sp - 1)] = x12;
-  h$stack[(h$sp - 0)] = x13;
-};
-function h$p14(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14)
-{
-  h$sp += 14;
-  h$stack[(h$sp - 13)] = x1;
-  h$stack[(h$sp - 12)] = x2;
-  h$stack[(h$sp - 11)] = x3;
-  h$stack[(h$sp - 10)] = x4;
-  h$stack[(h$sp - 9)] = x5;
-  h$stack[(h$sp - 8)] = x6;
-  h$stack[(h$sp - 7)] = x7;
-  h$stack[(h$sp - 6)] = x8;
-  h$stack[(h$sp - 5)] = x9;
-  h$stack[(h$sp - 4)] = x10;
-  h$stack[(h$sp - 3)] = x11;
-  h$stack[(h$sp - 2)] = x12;
-  h$stack[(h$sp - 1)] = x13;
-  h$stack[(h$sp - 0)] = x14;
-};
-function h$p15(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15)
-{
-  h$sp += 15;
-  h$stack[(h$sp - 14)] = x1;
-  h$stack[(h$sp - 13)] = x2;
-  h$stack[(h$sp - 12)] = x3;
-  h$stack[(h$sp - 11)] = x4;
-  h$stack[(h$sp - 10)] = x5;
-  h$stack[(h$sp - 9)] = x6;
-  h$stack[(h$sp - 8)] = x7;
-  h$stack[(h$sp - 7)] = x8;
-  h$stack[(h$sp - 6)] = x9;
-  h$stack[(h$sp - 5)] = x10;
-  h$stack[(h$sp - 4)] = x11;
-  h$stack[(h$sp - 3)] = x12;
-  h$stack[(h$sp - 2)] = x13;
-  h$stack[(h$sp - 1)] = x14;
-  h$stack[(h$sp - 0)] = x15;
-};
-function h$p16(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16)
-{
-  h$sp += 16;
-  h$stack[(h$sp - 15)] = x1;
-  h$stack[(h$sp - 14)] = x2;
-  h$stack[(h$sp - 13)] = x3;
-  h$stack[(h$sp - 12)] = x4;
-  h$stack[(h$sp - 11)] = x5;
-  h$stack[(h$sp - 10)] = x6;
-  h$stack[(h$sp - 9)] = x7;
-  h$stack[(h$sp - 8)] = x8;
-  h$stack[(h$sp - 7)] = x9;
-  h$stack[(h$sp - 6)] = x10;
-  h$stack[(h$sp - 5)] = x11;
-  h$stack[(h$sp - 4)] = x12;
-  h$stack[(h$sp - 3)] = x13;
-  h$stack[(h$sp - 2)] = x14;
-  h$stack[(h$sp - 1)] = x15;
-  h$stack[(h$sp - 0)] = x16;
-};
-function h$p17(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17)
-{
-  h$sp += 17;
-  h$stack[(h$sp - 16)] = x1;
-  h$stack[(h$sp - 15)] = x2;
-  h$stack[(h$sp - 14)] = x3;
-  h$stack[(h$sp - 13)] = x4;
-  h$stack[(h$sp - 12)] = x5;
-  h$stack[(h$sp - 11)] = x6;
-  h$stack[(h$sp - 10)] = x7;
-  h$stack[(h$sp - 9)] = x8;
-  h$stack[(h$sp - 8)] = x9;
-  h$stack[(h$sp - 7)] = x10;
-  h$stack[(h$sp - 6)] = x11;
-  h$stack[(h$sp - 5)] = x12;
-  h$stack[(h$sp - 4)] = x13;
-  h$stack[(h$sp - 3)] = x14;
-  h$stack[(h$sp - 2)] = x15;
-  h$stack[(h$sp - 1)] = x16;
-  h$stack[(h$sp - 0)] = x17;
-};
-function h$p18(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18)
-{
-  h$sp += 18;
-  h$stack[(h$sp - 17)] = x1;
-  h$stack[(h$sp - 16)] = x2;
-  h$stack[(h$sp - 15)] = x3;
-  h$stack[(h$sp - 14)] = x4;
-  h$stack[(h$sp - 13)] = x5;
-  h$stack[(h$sp - 12)] = x6;
-  h$stack[(h$sp - 11)] = x7;
-  h$stack[(h$sp - 10)] = x8;
-  h$stack[(h$sp - 9)] = x9;
-  h$stack[(h$sp - 8)] = x10;
-  h$stack[(h$sp - 7)] = x11;
-  h$stack[(h$sp - 6)] = x12;
-  h$stack[(h$sp - 5)] = x13;
-  h$stack[(h$sp - 4)] = x14;
-  h$stack[(h$sp - 3)] = x15;
-  h$stack[(h$sp - 2)] = x16;
-  h$stack[(h$sp - 1)] = x17;
-  h$stack[(h$sp - 0)] = x18;
-};
-function h$p19(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19)
-{
-  h$sp += 19;
-  h$stack[(h$sp - 18)] = x1;
-  h$stack[(h$sp - 17)] = x2;
-  h$stack[(h$sp - 16)] = x3;
-  h$stack[(h$sp - 15)] = x4;
-  h$stack[(h$sp - 14)] = x5;
-  h$stack[(h$sp - 13)] = x6;
-  h$stack[(h$sp - 12)] = x7;
-  h$stack[(h$sp - 11)] = x8;
-  h$stack[(h$sp - 10)] = x9;
-  h$stack[(h$sp - 9)] = x10;
-  h$stack[(h$sp - 8)] = x11;
-  h$stack[(h$sp - 7)] = x12;
-  h$stack[(h$sp - 6)] = x13;
-  h$stack[(h$sp - 5)] = x14;
-  h$stack[(h$sp - 4)] = x15;
-  h$stack[(h$sp - 3)] = x16;
-  h$stack[(h$sp - 2)] = x17;
-  h$stack[(h$sp - 1)] = x18;
-  h$stack[(h$sp - 0)] = x19;
-};
-function h$p20(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20)
-{
-  h$sp += 20;
-  h$stack[(h$sp - 19)] = x1;
-  h$stack[(h$sp - 18)] = x2;
-  h$stack[(h$sp - 17)] = x3;
-  h$stack[(h$sp - 16)] = x4;
-  h$stack[(h$sp - 15)] = x5;
-  h$stack[(h$sp - 14)] = x6;
-  h$stack[(h$sp - 13)] = x7;
-  h$stack[(h$sp - 12)] = x8;
-  h$stack[(h$sp - 11)] = x9;
-  h$stack[(h$sp - 10)] = x10;
-  h$stack[(h$sp - 9)] = x11;
-  h$stack[(h$sp - 8)] = x12;
-  h$stack[(h$sp - 7)] = x13;
-  h$stack[(h$sp - 6)] = x14;
-  h$stack[(h$sp - 5)] = x15;
-  h$stack[(h$sp - 4)] = x16;
-  h$stack[(h$sp - 3)] = x17;
-  h$stack[(h$sp - 2)] = x18;
-  h$stack[(h$sp - 1)] = x19;
-  h$stack[(h$sp - 0)] = x20;
-};
-function h$p21(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21)
-{
-  h$sp += 21;
-  h$stack[(h$sp - 20)] = x1;
-  h$stack[(h$sp - 19)] = x2;
-  h$stack[(h$sp - 18)] = x3;
-  h$stack[(h$sp - 17)] = x4;
-  h$stack[(h$sp - 16)] = x5;
-  h$stack[(h$sp - 15)] = x6;
-  h$stack[(h$sp - 14)] = x7;
-  h$stack[(h$sp - 13)] = x8;
-  h$stack[(h$sp - 12)] = x9;
-  h$stack[(h$sp - 11)] = x10;
-  h$stack[(h$sp - 10)] = x11;
-  h$stack[(h$sp - 9)] = x12;
-  h$stack[(h$sp - 8)] = x13;
-  h$stack[(h$sp - 7)] = x14;
-  h$stack[(h$sp - 6)] = x15;
-  h$stack[(h$sp - 5)] = x16;
-  h$stack[(h$sp - 4)] = x17;
-  h$stack[(h$sp - 3)] = x18;
-  h$stack[(h$sp - 2)] = x19;
-  h$stack[(h$sp - 1)] = x20;
-  h$stack[(h$sp - 0)] = x21;
-};
-function h$p22(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22)
-{
-  h$sp += 22;
-  h$stack[(h$sp - 21)] = x1;
-  h$stack[(h$sp - 20)] = x2;
-  h$stack[(h$sp - 19)] = x3;
-  h$stack[(h$sp - 18)] = x4;
-  h$stack[(h$sp - 17)] = x5;
-  h$stack[(h$sp - 16)] = x6;
-  h$stack[(h$sp - 15)] = x7;
-  h$stack[(h$sp - 14)] = x8;
-  h$stack[(h$sp - 13)] = x9;
-  h$stack[(h$sp - 12)] = x10;
-  h$stack[(h$sp - 11)] = x11;
-  h$stack[(h$sp - 10)] = x12;
-  h$stack[(h$sp - 9)] = x13;
-  h$stack[(h$sp - 8)] = x14;
-  h$stack[(h$sp - 7)] = x15;
-  h$stack[(h$sp - 6)] = x16;
-  h$stack[(h$sp - 5)] = x17;
-  h$stack[(h$sp - 4)] = x18;
-  h$stack[(h$sp - 3)] = x19;
-  h$stack[(h$sp - 2)] = x20;
-  h$stack[(h$sp - 1)] = x21;
-  h$stack[(h$sp - 0)] = x22;
-};
-function h$p23(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23)
-{
-  h$sp += 23;
-  h$stack[(h$sp - 22)] = x1;
-  h$stack[(h$sp - 21)] = x2;
-  h$stack[(h$sp - 20)] = x3;
-  h$stack[(h$sp - 19)] = x4;
-  h$stack[(h$sp - 18)] = x5;
-  h$stack[(h$sp - 17)] = x6;
-  h$stack[(h$sp - 16)] = x7;
-  h$stack[(h$sp - 15)] = x8;
-  h$stack[(h$sp - 14)] = x9;
-  h$stack[(h$sp - 13)] = x10;
-  h$stack[(h$sp - 12)] = x11;
-  h$stack[(h$sp - 11)] = x12;
-  h$stack[(h$sp - 10)] = x13;
-  h$stack[(h$sp - 9)] = x14;
-  h$stack[(h$sp - 8)] = x15;
-  h$stack[(h$sp - 7)] = x16;
-  h$stack[(h$sp - 6)] = x17;
-  h$stack[(h$sp - 5)] = x18;
-  h$stack[(h$sp - 4)] = x19;
-  h$stack[(h$sp - 3)] = x20;
-  h$stack[(h$sp - 2)] = x21;
-  h$stack[(h$sp - 1)] = x22;
-  h$stack[(h$sp - 0)] = x23;
-};
-function h$p24(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24)
-{
-  h$sp += 24;
-  h$stack[(h$sp - 23)] = x1;
-  h$stack[(h$sp - 22)] = x2;
-  h$stack[(h$sp - 21)] = x3;
-  h$stack[(h$sp - 20)] = x4;
-  h$stack[(h$sp - 19)] = x5;
-  h$stack[(h$sp - 18)] = x6;
-  h$stack[(h$sp - 17)] = x7;
-  h$stack[(h$sp - 16)] = x8;
-  h$stack[(h$sp - 15)] = x9;
-  h$stack[(h$sp - 14)] = x10;
-  h$stack[(h$sp - 13)] = x11;
-  h$stack[(h$sp - 12)] = x12;
-  h$stack[(h$sp - 11)] = x13;
-  h$stack[(h$sp - 10)] = x14;
-  h$stack[(h$sp - 9)] = x15;
-  h$stack[(h$sp - 8)] = x16;
-  h$stack[(h$sp - 7)] = x17;
-  h$stack[(h$sp - 6)] = x18;
-  h$stack[(h$sp - 5)] = x19;
-  h$stack[(h$sp - 4)] = x20;
-  h$stack[(h$sp - 3)] = x21;
-  h$stack[(h$sp - 2)] = x22;
-  h$stack[(h$sp - 1)] = x23;
-  h$stack[(h$sp - 0)] = x24;
-};
-function h$p25(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25)
-{
-  h$sp += 25;
-  h$stack[(h$sp - 24)] = x1;
-  h$stack[(h$sp - 23)] = x2;
-  h$stack[(h$sp - 22)] = x3;
-  h$stack[(h$sp - 21)] = x4;
-  h$stack[(h$sp - 20)] = x5;
-  h$stack[(h$sp - 19)] = x6;
-  h$stack[(h$sp - 18)] = x7;
-  h$stack[(h$sp - 17)] = x8;
-  h$stack[(h$sp - 16)] = x9;
-  h$stack[(h$sp - 15)] = x10;
-  h$stack[(h$sp - 14)] = x11;
-  h$stack[(h$sp - 13)] = x12;
-  h$stack[(h$sp - 12)] = x13;
-  h$stack[(h$sp - 11)] = x14;
-  h$stack[(h$sp - 10)] = x15;
-  h$stack[(h$sp - 9)] = x16;
-  h$stack[(h$sp - 8)] = x17;
-  h$stack[(h$sp - 7)] = x18;
-  h$stack[(h$sp - 6)] = x19;
-  h$stack[(h$sp - 5)] = x20;
-  h$stack[(h$sp - 4)] = x21;
-  h$stack[(h$sp - 3)] = x22;
-  h$stack[(h$sp - 2)] = x23;
-  h$stack[(h$sp - 1)] = x24;
-  h$stack[(h$sp - 0)] = x25;
-};
-function h$p26(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26)
-{
-  h$sp += 26;
-  h$stack[(h$sp - 25)] = x1;
-  h$stack[(h$sp - 24)] = x2;
-  h$stack[(h$sp - 23)] = x3;
-  h$stack[(h$sp - 22)] = x4;
-  h$stack[(h$sp - 21)] = x5;
-  h$stack[(h$sp - 20)] = x6;
-  h$stack[(h$sp - 19)] = x7;
-  h$stack[(h$sp - 18)] = x8;
-  h$stack[(h$sp - 17)] = x9;
-  h$stack[(h$sp - 16)] = x10;
-  h$stack[(h$sp - 15)] = x11;
-  h$stack[(h$sp - 14)] = x12;
-  h$stack[(h$sp - 13)] = x13;
-  h$stack[(h$sp - 12)] = x14;
-  h$stack[(h$sp - 11)] = x15;
-  h$stack[(h$sp - 10)] = x16;
-  h$stack[(h$sp - 9)] = x17;
-  h$stack[(h$sp - 8)] = x18;
-  h$stack[(h$sp - 7)] = x19;
-  h$stack[(h$sp - 6)] = x20;
-  h$stack[(h$sp - 5)] = x21;
-  h$stack[(h$sp - 4)] = x22;
-  h$stack[(h$sp - 3)] = x23;
-  h$stack[(h$sp - 2)] = x24;
-  h$stack[(h$sp - 1)] = x25;
-  h$stack[(h$sp - 0)] = x26;
-};
-function h$p27(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27)
-{
-  h$sp += 27;
-  h$stack[(h$sp - 26)] = x1;
-  h$stack[(h$sp - 25)] = x2;
-  h$stack[(h$sp - 24)] = x3;
-  h$stack[(h$sp - 23)] = x4;
-  h$stack[(h$sp - 22)] = x5;
-  h$stack[(h$sp - 21)] = x6;
-  h$stack[(h$sp - 20)] = x7;
-  h$stack[(h$sp - 19)] = x8;
-  h$stack[(h$sp - 18)] = x9;
-  h$stack[(h$sp - 17)] = x10;
-  h$stack[(h$sp - 16)] = x11;
-  h$stack[(h$sp - 15)] = x12;
-  h$stack[(h$sp - 14)] = x13;
-  h$stack[(h$sp - 13)] = x14;
-  h$stack[(h$sp - 12)] = x15;
-  h$stack[(h$sp - 11)] = x16;
-  h$stack[(h$sp - 10)] = x17;
-  h$stack[(h$sp - 9)] = x18;
-  h$stack[(h$sp - 8)] = x19;
-  h$stack[(h$sp - 7)] = x20;
-  h$stack[(h$sp - 6)] = x21;
-  h$stack[(h$sp - 5)] = x22;
-  h$stack[(h$sp - 4)] = x23;
-  h$stack[(h$sp - 3)] = x24;
-  h$stack[(h$sp - 2)] = x25;
-  h$stack[(h$sp - 1)] = x26;
-  h$stack[(h$sp - 0)] = x27;
-};
-function h$p28(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28)
-{
-  h$sp += 28;
-  h$stack[(h$sp - 27)] = x1;
-  h$stack[(h$sp - 26)] = x2;
-  h$stack[(h$sp - 25)] = x3;
-  h$stack[(h$sp - 24)] = x4;
-  h$stack[(h$sp - 23)] = x5;
-  h$stack[(h$sp - 22)] = x6;
-  h$stack[(h$sp - 21)] = x7;
-  h$stack[(h$sp - 20)] = x8;
-  h$stack[(h$sp - 19)] = x9;
-  h$stack[(h$sp - 18)] = x10;
-  h$stack[(h$sp - 17)] = x11;
-  h$stack[(h$sp - 16)] = x12;
-  h$stack[(h$sp - 15)] = x13;
-  h$stack[(h$sp - 14)] = x14;
-  h$stack[(h$sp - 13)] = x15;
-  h$stack[(h$sp - 12)] = x16;
-  h$stack[(h$sp - 11)] = x17;
-  h$stack[(h$sp - 10)] = x18;
-  h$stack[(h$sp - 9)] = x19;
-  h$stack[(h$sp - 8)] = x20;
-  h$stack[(h$sp - 7)] = x21;
-  h$stack[(h$sp - 6)] = x22;
-  h$stack[(h$sp - 5)] = x23;
-  h$stack[(h$sp - 4)] = x24;
-  h$stack[(h$sp - 3)] = x25;
-  h$stack[(h$sp - 2)] = x26;
-  h$stack[(h$sp - 1)] = x27;
-  h$stack[(h$sp - 0)] = x28;
-};
-function h$p29(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28, x29)
-{
-  h$sp += 29;
-  h$stack[(h$sp - 28)] = x1;
-  h$stack[(h$sp - 27)] = x2;
-  h$stack[(h$sp - 26)] = x3;
-  h$stack[(h$sp - 25)] = x4;
-  h$stack[(h$sp - 24)] = x5;
-  h$stack[(h$sp - 23)] = x6;
-  h$stack[(h$sp - 22)] = x7;
-  h$stack[(h$sp - 21)] = x8;
-  h$stack[(h$sp - 20)] = x9;
-  h$stack[(h$sp - 19)] = x10;
-  h$stack[(h$sp - 18)] = x11;
-  h$stack[(h$sp - 17)] = x12;
-  h$stack[(h$sp - 16)] = x13;
-  h$stack[(h$sp - 15)] = x14;
-  h$stack[(h$sp - 14)] = x15;
-  h$stack[(h$sp - 13)] = x16;
-  h$stack[(h$sp - 12)] = x17;
-  h$stack[(h$sp - 11)] = x18;
-  h$stack[(h$sp - 10)] = x19;
-  h$stack[(h$sp - 9)] = x20;
-  h$stack[(h$sp - 8)] = x21;
-  h$stack[(h$sp - 7)] = x22;
-  h$stack[(h$sp - 6)] = x23;
-  h$stack[(h$sp - 5)] = x24;
-  h$stack[(h$sp - 4)] = x25;
-  h$stack[(h$sp - 3)] = x26;
-  h$stack[(h$sp - 2)] = x27;
-  h$stack[(h$sp - 1)] = x28;
-  h$stack[(h$sp - 0)] = x29;
-};
-function h$p30(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28, x29, x30)
-{
-  h$sp += 30;
-  h$stack[(h$sp - 29)] = x1;
-  h$stack[(h$sp - 28)] = x2;
-  h$stack[(h$sp - 27)] = x3;
-  h$stack[(h$sp - 26)] = x4;
-  h$stack[(h$sp - 25)] = x5;
-  h$stack[(h$sp - 24)] = x6;
-  h$stack[(h$sp - 23)] = x7;
-  h$stack[(h$sp - 22)] = x8;
-  h$stack[(h$sp - 21)] = x9;
-  h$stack[(h$sp - 20)] = x10;
-  h$stack[(h$sp - 19)] = x11;
-  h$stack[(h$sp - 18)] = x12;
-  h$stack[(h$sp - 17)] = x13;
-  h$stack[(h$sp - 16)] = x14;
-  h$stack[(h$sp - 15)] = x15;
-  h$stack[(h$sp - 14)] = x16;
-  h$stack[(h$sp - 13)] = x17;
-  h$stack[(h$sp - 12)] = x18;
-  h$stack[(h$sp - 11)] = x19;
-  h$stack[(h$sp - 10)] = x20;
-  h$stack[(h$sp - 9)] = x21;
-  h$stack[(h$sp - 8)] = x22;
-  h$stack[(h$sp - 7)] = x23;
-  h$stack[(h$sp - 6)] = x24;
-  h$stack[(h$sp - 5)] = x25;
-  h$stack[(h$sp - 4)] = x26;
-  h$stack[(h$sp - 3)] = x27;
-  h$stack[(h$sp - 2)] = x28;
-  h$stack[(h$sp - 1)] = x29;
-  h$stack[(h$sp - 0)] = x30;
-};
-function h$p31(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28, x29, x30, x31)
-{
-  h$sp += 31;
-  h$stack[(h$sp - 30)] = x1;
-  h$stack[(h$sp - 29)] = x2;
-  h$stack[(h$sp - 28)] = x3;
-  h$stack[(h$sp - 27)] = x4;
-  h$stack[(h$sp - 26)] = x5;
-  h$stack[(h$sp - 25)] = x6;
-  h$stack[(h$sp - 24)] = x7;
-  h$stack[(h$sp - 23)] = x8;
-  h$stack[(h$sp - 22)] = x9;
-  h$stack[(h$sp - 21)] = x10;
-  h$stack[(h$sp - 20)] = x11;
-  h$stack[(h$sp - 19)] = x12;
-  h$stack[(h$sp - 18)] = x13;
-  h$stack[(h$sp - 17)] = x14;
-  h$stack[(h$sp - 16)] = x15;
-  h$stack[(h$sp - 15)] = x16;
-  h$stack[(h$sp - 14)] = x17;
-  h$stack[(h$sp - 13)] = x18;
-  h$stack[(h$sp - 12)] = x19;
-  h$stack[(h$sp - 11)] = x20;
-  h$stack[(h$sp - 10)] = x21;
-  h$stack[(h$sp - 9)] = x22;
-  h$stack[(h$sp - 8)] = x23;
-  h$stack[(h$sp - 7)] = x24;
-  h$stack[(h$sp - 6)] = x25;
-  h$stack[(h$sp - 5)] = x26;
-  h$stack[(h$sp - 4)] = x27;
-  h$stack[(h$sp - 3)] = x28;
-  h$stack[(h$sp - 2)] = x29;
-  h$stack[(h$sp - 1)] = x30;
-  h$stack[(h$sp - 0)] = x31;
-};
-function h$p32(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23,
-x24, x25, x26, x27, x28, x29, x30, x31, x32)
-{
-  h$sp += 32;
-  h$stack[(h$sp - 31)] = x1;
-  h$stack[(h$sp - 30)] = x2;
-  h$stack[(h$sp - 29)] = x3;
-  h$stack[(h$sp - 28)] = x4;
-  h$stack[(h$sp - 27)] = x5;
-  h$stack[(h$sp - 26)] = x6;
-  h$stack[(h$sp - 25)] = x7;
-  h$stack[(h$sp - 24)] = x8;
-  h$stack[(h$sp - 23)] = x9;
-  h$stack[(h$sp - 22)] = x10;
-  h$stack[(h$sp - 21)] = x11;
-  h$stack[(h$sp - 20)] = x12;
-  h$stack[(h$sp - 19)] = x13;
-  h$stack[(h$sp - 18)] = x14;
-  h$stack[(h$sp - 17)] = x15;
-  h$stack[(h$sp - 16)] = x16;
-  h$stack[(h$sp - 15)] = x17;
-  h$stack[(h$sp - 14)] = x18;
-  h$stack[(h$sp - 13)] = x19;
-  h$stack[(h$sp - 12)] = x20;
-  h$stack[(h$sp - 11)] = x21;
-  h$stack[(h$sp - 10)] = x22;
-  h$stack[(h$sp - 9)] = x23;
-  h$stack[(h$sp - 8)] = x24;
-  h$stack[(h$sp - 7)] = x25;
-  h$stack[(h$sp - 6)] = x26;
-  h$stack[(h$sp - 5)] = x27;
-  h$stack[(h$sp - 4)] = x28;
-  h$stack[(h$sp - 3)] = x29;
-  h$stack[(h$sp - 2)] = x30;
-  h$stack[(h$sp - 1)] = x31;
-  h$stack[(h$sp - 0)] = x32;
-};
-function h$pp2(x1)
-{
-  h$sp += 2;
-  h$stack[(h$sp - 0)] = x1;
-};
-function h$pp4(x1)
-{
-  h$sp += 3;
-  h$stack[(h$sp - 0)] = x1;
-};
-function h$pp5(x1, x2)
-{
-  h$sp += 3;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp6(x1, x2)
-{
-  h$sp += 3;
-  h$stack[(h$sp - 1)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp8(x1)
-{
-  h$sp += 4;
-  h$stack[(h$sp - 0)] = x1;
-};
-function h$pp9(x1, x2)
-{
-  h$sp += 4;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp10(x1, x2)
-{
-  h$sp += 4;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp11(x1, x2, x3)
-{
-  h$sp += 4;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp12(x1, x2)
-{
-  h$sp += 4;
-  h$stack[(h$sp - 1)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp13(x1, x2, x3)
-{
-  h$sp += 4;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp14(x1, x2, x3)
-{
-  h$sp += 4;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp16(x1)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 0)] = x1;
-};
-function h$pp17(x1, x2)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp18(x1, x2)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp19(x1, x2, x3)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp20(x1, x2)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp21(x1, x2, x3)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp22(x1, x2, x3)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp23(x1, x2, x3, x4)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp24(x1, x2)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 1)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp25(x1, x2, x3)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp26(x1, x2, x3)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp27(x1, x2, x3, x4)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp28(x1, x2, x3)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp29(x1, x2, x3, x4)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp30(x1, x2, x3, x4)
-{
-  h$sp += 5;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp32(x1)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 0)] = x1;
-};
-function h$pp33(x1, x2)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp34(x1, x2)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp35(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp36(x1, x2)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp37(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp38(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp39(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp40(x1, x2)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp41(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp42(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp43(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp44(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp45(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp46(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp47(x1, x2, x3, x4, x5)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp48(x1, x2)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 1)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp49(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp50(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp51(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp52(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp53(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp54(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp55(x1, x2, x3, x4, x5)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp56(x1, x2, x3)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp57(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp58(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp59(x1, x2, x3, x4, x5)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp60(x1, x2, x3, x4)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp61(x1, x2, x3, x4, x5)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp62(x1, x2, x3, x4, x5)
-{
-  h$sp += 6;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp64(x1)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 0)] = x1;
-};
-function h$pp65(x1, x2)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp66(x1, x2)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp67(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp68(x1, x2)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp69(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp70(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp71(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp72(x1, x2)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp73(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp74(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp75(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp76(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp77(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp78(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp79(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp80(x1, x2)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp81(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp82(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp83(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp84(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp85(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp86(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp87(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp88(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp89(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp90(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp91(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp92(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp93(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp94(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp95(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp96(x1, x2)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 1)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp97(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp98(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp99(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp100(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp101(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp102(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp103(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp104(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp105(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp106(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp107(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp108(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp109(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp110(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp111(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp112(x1, x2, x3)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp113(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp114(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp115(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp116(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp117(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp118(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp119(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp120(x1, x2, x3, x4)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp121(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp122(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp123(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp124(x1, x2, x3, x4, x5)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp125(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp126(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 7;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp128(x1)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 0)] = x1;
-};
-function h$pp129(x1, x2)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp130(x1, x2)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp131(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp132(x1, x2)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp133(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp134(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp135(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp136(x1, x2)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp137(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp138(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp139(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp140(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp141(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp142(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp143(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 4)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp144(x1, x2)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp145(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp146(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp147(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp148(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp149(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp150(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp151(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp152(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp153(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp154(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp155(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp156(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp157(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp158(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp159(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 4)] = x4;
-  h$stack[(h$sp - 3)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp160(x1, x2)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp161(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp162(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp163(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp164(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp165(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp166(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp167(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp168(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp169(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp170(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp171(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp172(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp173(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp174(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp175(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 4)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp176(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp177(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp178(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp179(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp180(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp181(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp182(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp183(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp184(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp185(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp186(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp187(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp188(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp189(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp190(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp191(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 4)] = x4;
-  h$stack[(h$sp - 3)] = x5;
-  h$stack[(h$sp - 2)] = x6;
-  h$stack[(h$sp - 0)] = x7;
-};
-function h$pp192(x1, x2)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 1)] = x1;
-  h$stack[(h$sp - 0)] = x2;
-};
-function h$pp193(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp194(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp195(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp196(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp197(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp198(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp199(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp200(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp201(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp202(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp203(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp204(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp205(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp206(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp207(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 4)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp208(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp209(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp210(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp211(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp212(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp213(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp214(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp215(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp216(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp217(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp218(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp219(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp220(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp221(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp222(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp223(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 4)] = x4;
-  h$stack[(h$sp - 3)] = x5;
-  h$stack[(h$sp - 1)] = x6;
-  h$stack[(h$sp - 0)] = x7;
-};
-function h$pp224(x1, x2, x3)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 2)] = x1;
-  h$stack[(h$sp - 1)] = x2;
-  h$stack[(h$sp - 0)] = x3;
-};
-function h$pp225(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp226(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp227(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp228(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp229(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp230(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp231(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp232(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp233(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp234(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp235(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp236(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp237(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp238(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp239(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 4)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 1)] = x6;
-  h$stack[(h$sp - 0)] = x7;
-};
-function h$pp240(x1, x2, x3, x4)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 3)] = x1;
-  h$stack[(h$sp - 2)] = x2;
-  h$stack[(h$sp - 1)] = x3;
-  h$stack[(h$sp - 0)] = x4;
-};
-function h$pp241(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp242(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp243(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp244(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp245(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp246(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp247(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 5)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 1)] = x6;
-  h$stack[(h$sp - 0)] = x7;
-};
-function h$pp248(x1, x2, x3, x4, x5)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 4)] = x1;
-  h$stack[(h$sp - 3)] = x2;
-  h$stack[(h$sp - 2)] = x3;
-  h$stack[(h$sp - 1)] = x4;
-  h$stack[(h$sp - 0)] = x5;
-};
-function h$pp249(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp250(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp251(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 6)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 1)] = x6;
-  h$stack[(h$sp - 0)] = x7;
-};
-function h$pp252(x1, x2, x3, x4, x5, x6)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 5)] = x1;
-  h$stack[(h$sp - 4)] = x2;
-  h$stack[(h$sp - 3)] = x3;
-  h$stack[(h$sp - 2)] = x4;
-  h$stack[(h$sp - 1)] = x5;
-  h$stack[(h$sp - 0)] = x6;
-};
-function h$pp253(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 7)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 1)] = x6;
-  h$stack[(h$sp - 0)] = x7;
-};
-function h$pp254(x1, x2, x3, x4, x5, x6, x7)
-{
-  h$sp += 8;
-  h$stack[(h$sp - 6)] = x1;
-  h$stack[(h$sp - 5)] = x2;
-  h$stack[(h$sp - 4)] = x3;
-  h$stack[(h$sp - 3)] = x4;
-  h$stack[(h$sp - 2)] = x5;
-  h$stack[(h$sp - 1)] = x6;
-  h$stack[(h$sp - 0)] = x7;
-};
-function h$bh()
-{
-  h$p2(h$r1, h$upd_frame);
-  h$r1.f = h$blackhole;
-  h$r1.d1 = h$currentThread;
-  h$r1.d2 = null;
-};
-function h$bh_lne(h$RTS_26, h$RTS_27)
-{
-  var h$RTS_28 = h$stack[h$RTS_26];
-  if(h$RTS_28)
-  {
-    h$sp -= h$RTS_27;
-    if((h$RTS_28 === h$blackhole))
-    {
-      return h$throw(h$baseZCControlziExceptionziBasezinonTermination, false);
-    }
-    else
-    {
-      h$r1 = h$RTS_28;
-      h$sp -= h$RTS_27;
-      return h$stack[h$sp];
-    };
-  }
-  else
-  {
-    h$stack[h$RTS_26] = h$blackhole;
-    return null;
-  };
-};
-function h$blackhole()
-{
-  throw("oops: entered black hole");
-  return 0;
-};
-h$o(h$blackhole, 5, 0, 2, 0, null);
-function h$blackholeTrap()
-{
-  throw("oops: entered multiple times");
-  return 0;
-};
-h$o(h$blackholeTrap, 0, 0, 2, 0, null);
-function h$done(h$RTS_29)
-{
-  h$finishThread(h$currentThread);
-  return h$reschedule;
-};
-h$o(h$done, (-1), 0, 0, 256, null);
-function h$doneMain_e()
-{
-  return h$doneMain();
-};
-h$o(h$doneMain, (-1), 0, 0, 256, null);
-function h$false_e()
-{
-  return h$stack[h$sp];
-};
-h$o(h$false_e, 2, 1, 0, 256, null);
-function h$true_e()
-{
-  return h$stack[h$sp];
-};
-h$o(h$true_e, 2, 2, 0, 256, null);
-function h$integerzmgmpZCGHCziIntegerziTypeziSzh_con_e()
-{
-  return h$stack[h$sp];
-};
-h$o(h$integerzmgmpZCGHCziIntegerziTypeziSzh_con_e, 2, 1, 1, 256, null);
-function h$integerzmgmpZCGHCziIntegerziTypeziJzh_con_e()
-{
-  return h$stack[h$sp];
-};
-h$o(h$integerzmgmpZCGHCziIntegerziTypeziJzh_con_e, 2, 2, 2, 256, null);
-function h$data1_e()
-{
-  return h$stack[h$sp];
-};
-h$o(h$data1_e, 2, 1, 1, 256, null);
-function h$data2_e()
-{
-  return h$stack[h$sp];
-};
-h$o(h$data2_e, 2, 1, 2, 256, null);
-function h$con_e()
-{
-  return h$stack[h$sp];
-};
-function h$catch(h$RTS_30, h$RTS_31)
-{
-  h$sp += 3;
-  h$stack[(h$sp - 2)] = h$currentThread.mask;
-  h$stack[(h$sp - 1)] = h$RTS_31;
-  h$stack[h$sp] = h$catch_e;
-  h$r1 = h$RTS_30;
-  return h$ap_1_0_fast();
-};
-function h$noop_e()
-{
-  return h$stack[h$sp];
-};
-h$o(h$noop_e, 1, 1, 0, 257, null);
-var h$noop = h$c0(h$noop_e);
-function h$catch_e()
-{
-  h$sp -= 3;
-  return h$stack[h$sp];
-};
-h$o(h$catch_e, (-1), 0, 2, 256, null);
-function h$ap1_e()
-{
-  var h$RTS_32 = h$r1.d1;
-  var h$RTS_33 = h$r1.d2;
-  h$bh();
-  h$r1 = h$RTS_32;
-  h$r2 = h$RTS_33;
-  return h$ap_1_1_fast();
-};
-h$o(h$ap1_e, 0, 0, 2, 256, null);
-function h$ap2_e()
-{
-  var h$RTS_34 = h$r1.d1;
-  var h$RTS_35 = h$r1.d2.d1;
-  var h$RTS_36 = h$r1.d2.d2;
-  h$bh();
-  h$r1 = h$RTS_34;
-  h$r2 = h$RTS_35;
-  h$r3 = h$RTS_36;
-  return h$ap_2_2_fast();
-};
-h$o(h$ap2_e, 0, 0, 3, 256, null);
-function h$ap3_e()
-{
-  var h$RTS_37 = h$r1.d1;
-  var h$RTS_38 = h$r1.d2.d1;
-  var h$RTS_39 = h$r1.d2.d2;
-  var h$RTS_40 = h$r1.d2.d3;
-  h$bh();
-  h$r1 = h$RTS_37;
-  h$r2 = h$RTS_38;
-  h$r3 = h$RTS_39;
-  h$r4 = h$RTS_40;
-  return h$ap_3_3_fast();
-};
-h$o(h$ap3_e, 0, 0, 4, 256, null);
-function h$select1_e()
-{
-  var h$RTS_41 = h$r1.d1;
-  h$sp += 3;
-  h$stack[(h$sp - 2)] = h$r1;
-  h$stack[(h$sp - 1)] = h$upd_frame;
-  h$stack[h$sp] = h$select1_ret;
-  h$r1.f = h$blackhole;
-  h$r1.d1 = h$currentThread;
-  h$r1.d2 = null;
-  h$r1 = h$RTS_41;
-  return h$ap_0_0_fast();
-};
-h$o(h$select1_e, 0, 0, 1, 256, null);
-function h$select1_ret()
-{
-  h$r1 = h$r1.d1;
-  --h$sp;
-  return h$ap_0_0_fast();
-};
-h$o(h$select1_ret, (-1), 0, 0, 256, null);
-function h$select2_e()
-{
-  var h$RTS_42 = h$r1.d1;
-  h$sp += 3;
-  h$stack[(h$sp - 2)] = h$r1;
-  h$stack[(h$sp - 1)] = h$upd_frame;
-  h$stack[h$sp] = h$select2_ret;
-  h$r1.f = h$blackhole;
-  h$r1.d1 = h$currentThread;
-  h$r1.d2 = null;
-  h$r1 = h$RTS_42;
-  return h$ap_0_0_fast();
-};
-h$o(h$select2_e, 0, 0, 1, 256, null);
-function h$select2_ret()
-{
-  h$r1 = h$r1.d2;
-  --h$sp;
-  return h$ap_0_0_fast();
-};
-h$o(h$select2_ret, (-1), 0, 0, 256, null);
-function h$throw(h$RTS_43, h$RTS_44)
-{
-  var h$RTS_45 = h$sp;
-  var h$RTS_46 = null;
-  var h$RTS_47;
-  while((h$sp > 0))
-  {
-    h$RTS_47 = h$stack[h$sp];
-    if(((h$RTS_47 === null) || (h$RTS_47 === undefined)))
-    {
-      throw("h$throw: invalid object while unwinding stack");
-    };
-    if((h$RTS_47 === h$catch_e))
-    {
-      break;
-    };
-    if((h$RTS_47 === h$atomically_e))
-    {
-      if(h$RTS_44)
-      {
-        h$currentThread.transaction = null;
-      }
-      else
-      {
-        if(!h$stmValidateTransaction())
-        {
-          ++h$sp;
-          h$stack[h$sp] = h$checkInvariants_e;
-          return h$stmStartTransaction(h$stack[(h$sp - 2)]);
-        };
-      };
-    };
-    if(((h$RTS_47 === h$catchStm_e) && !h$RTS_44))
-    {
-      break;
-    };
-    if((h$RTS_47 === h$upd_frame))
-    {
-      var h$RTS_48 = h$stack[(h$sp - 1)];
-      var h$RTS_49 = h$RTS_48.d2;
-      if((h$RTS_49 !== null))
-      {
-        for(var h$RTS_50 = 0;(h$RTS_50 < h$RTS_49.length);(h$RTS_50++)) {
-          h$wakeupThread(h$RTS_49[h$RTS_50]);
-        };
-      };
-      if(h$RTS_44)
-      {
-        if((h$RTS_46 === null))
-        {
-          h$makeResumable(h$RTS_48, (h$sp + 1), h$RTS_45, []);
-        }
-        else
-        {
-          h$makeResumable(h$RTS_48, (h$sp + 1), (h$RTS_46 - 2), [h$ap_0_0, h$stack[(h$RTS_46 - 1)], h$return]);
-        };
-        h$RTS_46 = h$sp;
-      }
-      else
-      {
-        h$RTS_48.f = h$raise_e;
-        h$RTS_48.d1 = h$RTS_43;
-        h$RTS_48.d2 = null;
-      };
-    };
-    var h$RTS_51;
-    if((h$RTS_47 === h$ap_gen))
-    {
-      h$RTS_51 = ((h$stack[(h$sp - 1)] >> 8) + 2);
-    }
-    else
-    {
-      var h$RTS_52 = h$RTS_47.size;
-      if((h$RTS_52 < 0))
-      {
-        h$RTS_51 = h$stack[(h$sp - 1)];
-      }
-      else
-      {
-        h$RTS_51 = ((h$RTS_52 & 255) + 1);
-      };
-    };
-    h$sp -= h$RTS_51;
-  };
-  if((h$sp > 0))
-  {
-    var h$RTS_53 = h$stack[(h$sp - 2)];
-    var h$RTS_54 = h$stack[(h$sp - 1)];
-    if((h$RTS_47 === h$catchStm_e))
-    {
-      h$currentThread.transaction = h$stack[(h$sp - 3)];
-      h$sp -= 4;
-    }
-    else
-    {
-      if((h$sp > 3))
-      {
-        h$sp -= 3;
-      };
-    };
-    h$r1 = h$RTS_54;
-    h$r2 = h$RTS_43;
-    if((h$RTS_47 !== h$catchStm_e))
-    {
-      if((((h$RTS_53 === 0) && (h$stack[h$sp] !== h$maskFrame)) && (h$stack[h$sp] !== h$maskUnintFrame)))
-      {
-        h$stack[(h$sp + 1)] = h$unmaskFrame;
-        ++h$sp;
-      }
-      else
-      {
-        if((h$RTS_53 === 1))
-        {
-          h$stack[(h$sp + 1)] = h$maskUnintFrame;
-          ++h$sp;
-        };
-      };
-      h$currentThread.mask = 2;
-    };
-    return h$ap_2_1_fast();
-  }
-  else
-  {
-    throw("unhandled exception in haskell thread");
-  };
-};
-function h$raise_e()
-{
-  return h$throw(h$r1.d1, false);
-};
-h$o(h$raise_e, 0, 0, 0, 256, null);
-function h$raiseAsync_e()
-{
-  return h$throw(h$r1.d1, true);
-};
-h$o(h$raiseAsync_e, 0, 0, 0, 256, null);
-function h$raiseAsync_frame()
-{
-  var h$RTS_55 = h$stack[(h$sp - 1)];
-  h$sp -= 2;
-  return h$throw(h$RTS_55, true);
-};
-h$o(h$raiseAsync_frame, (-1), 0, 1, 0, null);
-function h$reduce()
-{
-  if((h$r1.f.t === 0))
-  {
-    return h$r1.f;
-  }
-  else
-  {
-    --h$sp;
-    return h$stack[h$sp];
-  };
-};
-h$o(h$reduce, (-1), 0, 0, 256, null);
-var h$RTS_56 = 0;
-function h$gc_check(h$RTS_57)
-{
-  if((++h$RTS_56 > 1000))
-  {
-    for(var h$RTS_58 = (h$sp + 1);(h$RTS_58 < h$stack.length);(h$RTS_58++)) {
-      h$stack[h$RTS_58] = null;
-    };
-    h$RTS_56 = 0;
-  };
-  return 0;
-};
-function h$o(h$RTS_59, h$RTS_60, h$RTS_61, h$RTS_62, h$RTS_63, h$RTS_64)
-{
-  h$setObjInfo(h$RTS_59, h$RTS_60, "", [], h$RTS_61, h$RTS_62, h$RTS_63, h$RTS_64);
-};
-function h$setObjInfo(h$RTS_65, h$RTS_66, h$RTS_67, h$RTS_68, h$RTS_69, h$RTS_70, h$RTS_71, h$RTS_72)
-{
-  h$RTS_65.t = h$RTS_66;
-  h$RTS_65.i = h$RTS_68;
-  h$RTS_65.n = h$RTS_67;
-  h$RTS_65.a = h$RTS_69;
-  h$RTS_65.r = h$RTS_71;
-  h$RTS_65.s = h$RTS_72;
-  h$RTS_65.m = 0;
-  h$RTS_65.size = h$RTS_70;
-};
-function h$static_thunk(h$RTS_73)
-{
-  var h$RTS_74 = { d1: null, d2: null, f: h$RTS_73, m: 0
-                 };
-  h$CAFs.push(h$RTS_74);
-  h$CAFsReset.push(h$RTS_73);
-  return h$RTS_74;
-};
-function h$printcl(h$RTS_75)
-{
-  var h$RTS_76 = h$RTS_75.f;
-  var h$RTS_77 = h$RTS_75.d1;
-  var h$RTS_78 = "";
-  switch (h$RTS_76.t)
-  {
-    case (0):
-      h$RTS_78 += "thunk";
-      break;
-    case (2):
-      h$RTS_78 += (("con[" + h$RTS_76.a) + "]");
-      break;
-    case (3):
-      h$RTS_78 += (("pap[" + h$RTS_76.a) + "]");
-      break;
-    case (1):
-      h$RTS_78 += (("fun[" + h$RTS_76.a) + "]");
-      break;
-    default:
-      h$RTS_78 += "unknown closure type";
-      break;
-  };
-  h$RTS_78 += ((" :: " + h$RTS_76.n) + " ->");
-  var h$RTS_79 = 1;
-  for(var h$RTS_80 = 0;(h$RTS_80 < h$RTS_76.i.length);(h$RTS_80++)) {
-    h$RTS_78 += " ";
-    switch (h$RTS_76.i[h$RTS_80])
-    {
-      case (0):
-        h$RTS_78 += (("[ Ptr :: " + h$RTS_77[("d" + h$RTS_79)].f.n) + "]");
-        h$RTS_79++;
-        break;
-      case (1):
-        h$RTS_78 += "void";
-        break;
-      case (2):
-        h$RTS_78 += (("(" + h$RTS_77[("d" + h$RTS_79)]) + " :: double)");
-        h$RTS_79++;
-        break;
-      case (3):
-        h$RTS_78 += (("(" + h$RTS_77[("d" + h$RTS_79)]) + " :: int)");
-        h$RTS_79++;
-        break;
-      case (4):
-        h$RTS_78 += (((("(" + h$RTS_77[("d" + h$RTS_79)]) + ",") + h$RTS_77[("d" + (h$RTS_79 + 1))]) + " :: long)");
-        h$RTS_79 += 2;
-        break;
-      case (5):
-        h$RTS_78 += (((("(" + h$RTS_77[("d" + h$RTS_79)].length) + ",") + h$RTS_77[("d" + (h$RTS_79 + 1))]) + " :: ptr)");
-        h$RTS_79 += 2;
-        break;
-      case (6):
-        h$RTS_78 += (("(" + h$RTS_77[("d" + h$RTS_79)].toString()) + " :: RTS object)");
-        h$RTS_79++;
-        break;
-      default:
-        h$RTS_78 += ("unknown field: " + h$RTS_76.i[h$RTS_80]);
-    };
-  };
-  h$log(h$RTS_78);
-};
-function h$init_closure(h$RTS_81, h$RTS_82)
-{
-  h$RTS_81.m = 0;
-  switch (h$RTS_82.length)
-  {
-    case (0):
-      h$RTS_81.d1 = null;
-      h$RTS_81.d2 = null;
-      return h$RTS_81;
-    case (1):
-      h$RTS_81.d1 = h$RTS_82[0];
-      h$RTS_81.d2 = null;
-      return h$RTS_81;
-    case (2):
-      h$RTS_81.d1 = h$RTS_82[0];
-      h$RTS_81.d2 = h$RTS_82[1];
-      return h$RTS_81;
-    case (3):
-      h$RTS_81.d1 = h$RTS_82[0];
-      h$RTS_81.d2 = { d1: h$RTS_82[1], d2: h$RTS_82[2]
-                    };
-      return h$RTS_81;
-    case (4):
-      h$RTS_81.d1 = h$RTS_82[0];
-      h$RTS_81.d2 = { d1: h$RTS_82[1], d2: h$RTS_82[2], d3: h$RTS_82[3]
-                    };
-      return h$RTS_81;
-    case (5):
-      h$RTS_81.d1 = h$RTS_82[0];
-      h$RTS_81.d2 = { d1: h$RTS_82[1], d2: h$RTS_82[2], d3: h$RTS_82[3], d4: h$RTS_82[4]
-                    };
-      return h$RTS_81;
-    case (6):
-      h$RTS_81.d1 = h$RTS_82[0];
-      h$RTS_81.d2 = { d1: h$RTS_82[1], d2: h$RTS_82[2], d3: h$RTS_82[3], d4: h$RTS_82[4], d5: h$RTS_82[5]
-                    };
-      return h$RTS_81;
-    case (7):
-      h$RTS_81.d1 = h$RTS_82[0];
-      h$RTS_81.d2 = { d1: h$RTS_82[1], d2: h$RTS_82[2], d3: h$RTS_82[3], d4: h$RTS_82[4], d5: h$RTS_82[5], d6: h$RTS_82[6]
-                    };
-      return h$RTS_81;
-    default:
-      h$RTS_81.d1 = h$RTS_82[0];
-      h$RTS_81.d2 = { d1: h$RTS_82[1], d2: h$RTS_82[2], d3: h$RTS_82[3], d4: h$RTS_82[4], d5: h$RTS_82[5], d6: h$RTS_82[6]
-                    };
-      for(var h$RTS_83 = 7;(h$RTS_83 < h$RTS_82.length);(h$RTS_83++)) {
-        h$RTS_81.d2[("d" + h$RTS_83)] = h$RTS_82[h$RTS_83];
-      };
-      return h$RTS_81;
-  };
-};
-function h$runInitStatic()
-{
-  if((h$initStatic.length == 0))
-  {
-    return undefined;
-  };
-  for(var h$RTS_84 = (h$initStatic.length - 1);(h$RTS_84 >= 0);(h$RTS_84--)) {
-    h$initStatic[h$RTS_84]();
-  };
-  h$initStatic = [];
-};
-function h$checkStack(h$RTS_85)
-{
-  if((h$RTS_85.t === (-1)))
-  {
-    h$stack[h$sp] = h$RTS_85;
-  };
-  var h$RTS_86 = h$sp;
-  while((h$RTS_86 >= 0))
-  {
-    h$RTS_85 = h$stack[h$RTS_86];
-    var h$RTS_87;
-    var h$RTS_88;
-    if((typeof h$RTS_85 === "function"))
-    {
-      if((h$RTS_85 === h$ap_gen))
-      {
-        h$RTS_87 = ((h$stack[(h$RTS_86 - 1)] >> 8) + 2);
-        h$RTS_88 = 2;
-      }
-      else
-      {
-        var h$RTS_89 = h$stack[h$RTS_86].size;
-        if((h$RTS_89 <= 0))
-        {
-          h$RTS_87 = h$stack[(h$RTS_86 - 1)];
-          h$RTS_88 = 2;
-        }
-        else
-        {
-          h$RTS_87 = ((h$RTS_89 & 255) + 1);
-          h$RTS_88 = 1;
-        };
-      };
-      h$RTS_86 -= h$RTS_87;
-    }
-    else
-    {
-      h$dumpStackTop(h$stack, 0, h$sp);
-      throw(("invalid stack object at: " + h$RTS_86));
-    };
-  };
-};
-function h$printReg(h$RTS_90)
-{
-  if((h$RTS_90 === null))
-  {
-    return "null";
-  }
-  else
-  {
-    if(((((typeof h$RTS_90 === "object") && h$RTS_90.hasOwnProperty("f")) && h$RTS_90.hasOwnProperty("d1")) && h$RTS_90.
-    hasOwnProperty("d2")))
-    {
-      if((typeof h$RTS_90.f !== "function"))
-      {
-        return "dodgy object";
-      }
-      else
-      {
-        if(((h$RTS_90.f.t === 5) && h$RTS_90.x))
-        {
-          return (("blackhole: -> " + h$printReg({ d: h$RTS_90.d1.x2, f: h$RTS_90.x.x1
-                                                 })) + ")");
-        }
-        else
-        {
-          return (((((((h$RTS_90.alloc ? (h$RTS_90.alloc + ": ") : "") + h$RTS_90.f.n) + " (") + h$closureTypeName(h$RTS_90.f.
-          t)) + ", ") + h$RTS_90.f.a) + ")");
-        };
-      };
-    }
-    else
-    {
-      if((typeof h$RTS_90 === "object"))
-      {
-        var h$RTS_91 = h$collectProps(h$RTS_90);
-        if((h$RTS_91.length > 40))
-        {
-          return (h$RTS_91.substr(0, 40) + "...");
-        }
-        else
-        {
-          return h$RTS_91;
-        };
-      }
-      else
-      {
-        var h$RTS_92 = (new String(h$RTS_90) + "");
-        if((h$RTS_92.length > 40))
-        {
-          return (h$RTS_92.substr(0, 40) + "...");
-        }
-        else
-        {
-          return h$RTS_92;
-        };
-      };
-    };
-  };
-};
-function h$logStack()
-{
-  if((typeof h$stack[h$sp] === "undefined"))
-  {
-    h$log("warning: invalid stack frame");
-    return undefined;
-  };
-  var h$RTS_93 = 0;
-  var h$RTS_94 = h$stack[h$sp].size;
-  if((h$RTS_94 === (-1)))
-  {
-    h$RTS_93 = (h$stack[(h$sp - 1)] & 255);
-  }
-  else
-  {
-    h$RTS_93 = (h$RTS_94 & 255);
-  };
-  h$dumpStackTop(h$stack, ((h$sp - h$RTS_93) - 2), h$sp);
-  for(var h$RTS_95 = Math.max(0, ((h$sp - h$RTS_93) + 1));(h$RTS_95 <= h$sp);(h$RTS_95++)) {
-    if((typeof h$stack[h$RTS_95] === "undefined"))
-    {
-      throw("undefined on stack");
-    };
-  };
-};
-function h$ap_1_0()
-{
-  var h$RTS_96 = h$r1.f;
-  switch (h$RTS_96.t)
-  {
-    case (0):
-      return h$RTS_96;
-    case (1):
-      var h$RTS_98 = h$RTS_96.a;
-      var h$RTS_99 = (h$RTS_98 & 255);
-      if((1 === h$RTS_99))
-      {
-        --h$sp;
-        return h$RTS_96;
-      }
-      else
-      {
-        if((1 > h$RTS_99))
-        {
-          var h$RTS_100 = (h$RTS_98 >> 8);
-          switch (h$RTS_100)
-          {
-            default:
-          };
-          h$sp -= h$RTS_100;
-          var h$RTS_101 = h$apply[((1 - h$RTS_99) | ((0 - h$RTS_100) << 8))];
-          h$stack[h$sp] = h$RTS_101;
-          return h$RTS_96;
-        }
-        else
-        {
-          var h$RTS_97 = h$c3(h$pap_0, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 0) - 1), null);
-          --h$sp;
-          h$r1 = h$RTS_97;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_103 = h$r1.d2.d1;
-      var h$RTS_104 = (h$RTS_103 & 255);
-      if((1 === h$RTS_104))
-      {
-        --h$sp;
-        return h$RTS_96;
-      }
-      else
-      {
-        if((1 > h$RTS_104))
-        {
-          var h$RTS_105 = (h$RTS_103 >> 8);
-          switch (h$RTS_105)
-          {
-            default:
-          };
-          h$sp -= h$RTS_105;
-          var h$RTS_106 = h$apply[((1 - h$RTS_104) | ((0 - h$RTS_105) << 8))];
-          h$stack[h$sp] = h$RTS_106;
-          return h$RTS_96;
-        }
-        else
-        {
-          var h$RTS_102 = h$c3(h$pap_0, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 0) - 1), null);
-          --h$sp;
-          h$r1 = h$RTS_102;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_1_0, unexpected closure type: " + h$RTS_96.t));
-  };
-};
-h$o(h$ap_1_0, (-1), 0, 0, 256, null);
-function h$ap_1_1()
-{
-  var h$RTS_107 = h$r1.f;
-  switch (h$RTS_107.t)
-  {
-    case (0):
-      return h$RTS_107;
-    case (1):
-      var h$RTS_109 = h$RTS_107.a;
-      var h$RTS_110 = (h$RTS_109 & 255);
-      if((1 === h$RTS_110))
-      {
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 2;
-        return h$RTS_107;
-      }
-      else
-      {
-        if((1 > h$RTS_110))
-        {
-          var h$RTS_111 = (h$RTS_109 >> 8);
-          switch (h$RTS_111)
-          {
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_111;
-          var h$RTS_112 = h$apply[((1 - h$RTS_110) | ((1 - h$RTS_111) << 8))];
-          h$stack[h$sp] = h$RTS_112;
-          return h$RTS_107;
-        }
-        else
-        {
-          var h$RTS_108 = h$c3(h$pap_1, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 256) - 1), h$stack[(h$sp - 1)]);
-          h$sp -= 2;
-          h$r1 = h$RTS_108;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_114 = h$r1.d2.d1;
-      var h$RTS_115 = (h$RTS_114 & 255);
-      if((1 === h$RTS_115))
-      {
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 2;
-        return h$RTS_107;
-      }
-      else
-      {
-        if((1 > h$RTS_115))
-        {
-          var h$RTS_116 = (h$RTS_114 >> 8);
-          switch (h$RTS_116)
-          {
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_116;
-          var h$RTS_117 = h$apply[((1 - h$RTS_115) | ((1 - h$RTS_116) << 8))];
-          h$stack[h$sp] = h$RTS_117;
-          return h$RTS_107;
-        }
-        else
-        {
-          var h$RTS_113 = h$c3(h$pap_1, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 256) - 1), h$stack[(h$sp - 1)]);
-          h$sp -= 2;
-          h$r1 = h$RTS_113;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_1_1, unexpected closure type: " + h$RTS_107.t));
-  };
-};
-h$o(h$ap_1_1, (-1), 0, 1, 256, null);
-function h$ap_1_2()
-{
-  var h$RTS_118 = h$r1.f;
-  switch (h$RTS_118.t)
-  {
-    case (0):
-      return h$RTS_118;
-    case (1):
-      var h$RTS_120 = h$RTS_118.a;
-      var h$RTS_121 = (h$RTS_120 & 255);
-      if((1 === h$RTS_121))
-      {
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 3;
-        return h$RTS_118;
-      }
-      else
-      {
-        if((1 > h$RTS_121))
-        {
-          var h$RTS_122 = (h$RTS_120 >> 8);
-          switch (h$RTS_122)
-          {
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_122;
-          var h$RTS_123 = h$apply[((1 - h$RTS_121) | ((2 - h$RTS_122) << 8))];
-          h$stack[h$sp] = h$RTS_123;
-          return h$RTS_118;
-        }
-        else
-        {
-          var h$RTS_119 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 1), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)]);
-          h$sp -= 3;
-          h$r1 = h$RTS_119;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_125 = h$r1.d2.d1;
-      var h$RTS_126 = (h$RTS_125 & 255);
-      if((1 === h$RTS_126))
-      {
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 3;
-        return h$RTS_118;
-      }
-      else
-      {
-        if((1 > h$RTS_126))
-        {
-          var h$RTS_127 = (h$RTS_125 >> 8);
-          switch (h$RTS_127)
-          {
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_127;
-          var h$RTS_128 = h$apply[((1 - h$RTS_126) | ((2 - h$RTS_127) << 8))];
-          h$stack[h$sp] = h$RTS_128;
-          return h$RTS_118;
-        }
-        else
-        {
-          var h$RTS_124 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 1), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)]);
-          h$sp -= 3;
-          h$r1 = h$RTS_124;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_1_2, unexpected closure type: " + h$RTS_118.t));
-  };
-};
-h$o(h$ap_1_2, (-1), 0, 2, 256, null);
-function h$ap_2_1()
-{
-  var h$RTS_129 = h$r1.f;
-  switch (h$RTS_129.t)
-  {
-    case (0):
-      return h$RTS_129;
-    case (1):
-      var h$RTS_131 = h$RTS_129.a;
-      var h$RTS_132 = (h$RTS_131 & 255);
-      if((2 === h$RTS_132))
-      {
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 2;
-        return h$RTS_129;
-      }
-      else
-      {
-        if((2 > h$RTS_132))
-        {
-          var h$RTS_133 = (h$RTS_131 >> 8);
-          switch (h$RTS_133)
-          {
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_133;
-          var h$RTS_134 = h$apply[((2 - h$RTS_132) | ((1 - h$RTS_133) << 8))];
-          h$stack[h$sp] = h$RTS_134;
-          return h$RTS_129;
-        }
-        else
-        {
-          var h$RTS_130 = h$c3(h$pap_1, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 256) - 2), h$stack[(h$sp - 1)]);
-          h$sp -= 2;
-          h$r1 = h$RTS_130;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_136 = h$r1.d2.d1;
-      var h$RTS_137 = (h$RTS_136 & 255);
-      if((2 === h$RTS_137))
-      {
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 2;
-        return h$RTS_129;
-      }
-      else
-      {
-        if((2 > h$RTS_137))
-        {
-          var h$RTS_138 = (h$RTS_136 >> 8);
-          switch (h$RTS_138)
-          {
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_138;
-          var h$RTS_139 = h$apply[((2 - h$RTS_137) | ((1 - h$RTS_138) << 8))];
-          h$stack[h$sp] = h$RTS_139;
-          return h$RTS_129;
-        }
-        else
-        {
-          var h$RTS_135 = h$c3(h$pap_1, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 256) - 2), h$stack[(h$sp - 1)]);
-          h$sp -= 2;
-          h$r1 = h$RTS_135;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_2_1, unexpected closure type: " + h$RTS_129.t));
-  };
-};
-h$o(h$ap_2_1, (-1), 0, 1, 256, null);
-function h$ap_2_2()
-{
-  var h$RTS_140 = h$r1.f;
-  switch (h$RTS_140.t)
-  {
-    case (0):
-      return h$RTS_140;
-    case (1):
-      var h$RTS_142 = h$RTS_140.a;
-      var h$RTS_143 = (h$RTS_142 & 255);
-      if((2 === h$RTS_143))
-      {
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 3;
-        return h$RTS_140;
-      }
-      else
-      {
-        if((2 > h$RTS_143))
-        {
-          var h$RTS_144 = (h$RTS_142 >> 8);
-          switch (h$RTS_144)
-          {
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_144;
-          var h$RTS_145 = h$apply[((2 - h$RTS_143) | ((2 - h$RTS_144) << 8))];
-          h$stack[h$sp] = h$RTS_145;
-          return h$RTS_140;
-        }
-        else
-        {
-          var h$RTS_141 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 2), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)]);
-          h$sp -= 3;
-          h$r1 = h$RTS_141;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_147 = h$r1.d2.d1;
-      var h$RTS_148 = (h$RTS_147 & 255);
-      if((2 === h$RTS_148))
-      {
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 3;
-        return h$RTS_140;
-      }
-      else
-      {
-        if((2 > h$RTS_148))
-        {
-          var h$RTS_149 = (h$RTS_147 >> 8);
-          switch (h$RTS_149)
-          {
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_149;
-          var h$RTS_150 = h$apply[((2 - h$RTS_148) | ((2 - h$RTS_149) << 8))];
-          h$stack[h$sp] = h$RTS_150;
-          return h$RTS_140;
-        }
-        else
-        {
-          var h$RTS_146 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 2), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)]);
-          h$sp -= 3;
-          h$r1 = h$RTS_146;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_2_2, unexpected closure type: " + h$RTS_140.t));
-  };
-};
-h$o(h$ap_2_2, (-1), 0, 2, 256, null);
-function h$ap_2_3()
-{
-  var h$RTS_151 = h$r1.f;
-  switch (h$RTS_151.t)
-  {
-    case (0):
-      return h$RTS_151;
-    case (1):
-      var h$RTS_153 = h$RTS_151.a;
-      var h$RTS_154 = (h$RTS_153 & 255);
-      if((2 === h$RTS_154))
-      {
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 4;
-        return h$RTS_151;
-      }
-      else
-      {
-        if((2 > h$RTS_154))
-        {
-          var h$RTS_155 = (h$RTS_153 >> 8);
-          switch (h$RTS_155)
-          {
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_155;
-          var h$RTS_156 = h$apply[((2 - h$RTS_154) | ((3 - h$RTS_155) << 8))];
-          h$stack[h$sp] = h$RTS_156;
-          return h$RTS_151;
-        }
-        else
-        {
-          var h$RTS_152 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 2), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)]);
-          h$sp -= 4;
-          h$r1 = h$RTS_152;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_158 = h$r1.d2.d1;
-      var h$RTS_159 = (h$RTS_158 & 255);
-      if((2 === h$RTS_159))
-      {
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 4;
-        return h$RTS_151;
-      }
-      else
-      {
-        if((2 > h$RTS_159))
-        {
-          var h$RTS_160 = (h$RTS_158 >> 8);
-          switch (h$RTS_160)
-          {
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_160;
-          var h$RTS_161 = h$apply[((2 - h$RTS_159) | ((3 - h$RTS_160) << 8))];
-          h$stack[h$sp] = h$RTS_161;
-          return h$RTS_151;
-        }
-        else
-        {
-          var h$RTS_157 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 2), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)]);
-          h$sp -= 4;
-          h$r1 = h$RTS_157;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_2_3, unexpected closure type: " + h$RTS_151.t));
-  };
-};
-h$o(h$ap_2_3, (-1), 0, 3, 256, null);
-function h$ap_2_4()
-{
-  var h$RTS_162 = h$r1.f;
-  switch (h$RTS_162.t)
-  {
-    case (0):
-      return h$RTS_162;
-    case (1):
-      var h$RTS_164 = h$RTS_162.a;
-      var h$RTS_165 = (h$RTS_164 & 255);
-      if((2 === h$RTS_165))
-      {
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 5;
-        return h$RTS_162;
-      }
-      else
-      {
-        if((2 > h$RTS_165))
-        {
-          var h$RTS_166 = (h$RTS_164 >> 8);
-          switch (h$RTS_166)
-          {
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_166;
-          var h$RTS_167 = h$apply[((2 - h$RTS_165) | ((4 - h$RTS_166) << 8))];
-          h$stack[h$sp] = h$RTS_167;
-          return h$RTS_162;
-        }
-        else
-        {
-          var h$RTS_163 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 2), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)]);
-          h$sp -= 5;
-          h$r1 = h$RTS_163;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_169 = h$r1.d2.d1;
-      var h$RTS_170 = (h$RTS_169 & 255);
-      if((2 === h$RTS_170))
-      {
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 5;
-        return h$RTS_162;
-      }
-      else
-      {
-        if((2 > h$RTS_170))
-        {
-          var h$RTS_171 = (h$RTS_169 >> 8);
-          switch (h$RTS_171)
-          {
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_171;
-          var h$RTS_172 = h$apply[((2 - h$RTS_170) | ((4 - h$RTS_171) << 8))];
-          h$stack[h$sp] = h$RTS_172;
-          return h$RTS_162;
-        }
-        else
-        {
-          var h$RTS_168 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 2), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)]);
-          h$sp -= 5;
-          h$r1 = h$RTS_168;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_2_4, unexpected closure type: " + h$RTS_162.t));
-  };
-};
-h$o(h$ap_2_4, (-1), 0, 4, 256, null);
-function h$ap_3_2()
-{
-  var h$RTS_173 = h$r1.f;
-  switch (h$RTS_173.t)
-  {
-    case (0):
-      return h$RTS_173;
-    case (1):
-      var h$RTS_175 = h$RTS_173.a;
-      var h$RTS_176 = (h$RTS_175 & 255);
-      if((3 === h$RTS_176))
-      {
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 3;
-        return h$RTS_173;
-      }
-      else
-      {
-        if((3 > h$RTS_176))
-        {
-          var h$RTS_177 = (h$RTS_175 >> 8);
-          switch (h$RTS_177)
-          {
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_177;
-          var h$RTS_178 = h$apply[((3 - h$RTS_176) | ((2 - h$RTS_177) << 8))];
-          h$stack[h$sp] = h$RTS_178;
-          return h$RTS_173;
-        }
-        else
-        {
-          var h$RTS_174 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)]);
-          h$sp -= 3;
-          h$r1 = h$RTS_174;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_180 = h$r1.d2.d1;
-      var h$RTS_181 = (h$RTS_180 & 255);
-      if((3 === h$RTS_181))
-      {
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 3;
-        return h$RTS_173;
-      }
-      else
-      {
-        if((3 > h$RTS_181))
-        {
-          var h$RTS_182 = (h$RTS_180 >> 8);
-          switch (h$RTS_182)
-          {
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_182;
-          var h$RTS_183 = h$apply[((3 - h$RTS_181) | ((2 - h$RTS_182) << 8))];
-          h$stack[h$sp] = h$RTS_183;
-          return h$RTS_173;
-        }
-        else
-        {
-          var h$RTS_179 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)]);
-          h$sp -= 3;
-          h$r1 = h$RTS_179;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_3_2, unexpected closure type: " + h$RTS_173.t));
-  };
-};
-h$o(h$ap_3_2, (-1), 0, 2, 256, null);
-function h$ap_3_3()
-{
-  var h$RTS_184 = h$r1.f;
-  switch (h$RTS_184.t)
-  {
-    case (0):
-      return h$RTS_184;
-    case (1):
-      var h$RTS_186 = h$RTS_184.a;
-      var h$RTS_187 = (h$RTS_186 & 255);
-      if((3 === h$RTS_187))
-      {
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 4;
-        return h$RTS_184;
-      }
-      else
-      {
-        if((3 > h$RTS_187))
-        {
-          var h$RTS_188 = (h$RTS_186 >> 8);
-          switch (h$RTS_188)
-          {
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_188;
-          var h$RTS_189 = h$apply[((3 - h$RTS_187) | ((3 - h$RTS_188) << 8))];
-          h$stack[h$sp] = h$RTS_189;
-          return h$RTS_184;
-        }
-        else
-        {
-          var h$RTS_185 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)]);
-          h$sp -= 4;
-          h$r1 = h$RTS_185;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_191 = h$r1.d2.d1;
-      var h$RTS_192 = (h$RTS_191 & 255);
-      if((3 === h$RTS_192))
-      {
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 4;
-        return h$RTS_184;
-      }
-      else
-      {
-        if((3 > h$RTS_192))
-        {
-          var h$RTS_193 = (h$RTS_191 >> 8);
-          switch (h$RTS_193)
-          {
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_193;
-          var h$RTS_194 = h$apply[((3 - h$RTS_192) | ((3 - h$RTS_193) << 8))];
-          h$stack[h$sp] = h$RTS_194;
-          return h$RTS_184;
-        }
-        else
-        {
-          var h$RTS_190 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)]);
-          h$sp -= 4;
-          h$r1 = h$RTS_190;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_3_3, unexpected closure type: " + h$RTS_184.t));
-  };
-};
-h$o(h$ap_3_3, (-1), 0, 3, 256, null);
-function h$ap_3_4()
-{
-  var h$RTS_195 = h$r1.f;
-  switch (h$RTS_195.t)
-  {
-    case (0):
-      return h$RTS_195;
-    case (1):
-      var h$RTS_197 = h$RTS_195.a;
-      var h$RTS_198 = (h$RTS_197 & 255);
-      if((3 === h$RTS_198))
-      {
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 5;
-        return h$RTS_195;
-      }
-      else
-      {
-        if((3 > h$RTS_198))
-        {
-          var h$RTS_199 = (h$RTS_197 >> 8);
-          switch (h$RTS_199)
-          {
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_199;
-          var h$RTS_200 = h$apply[((3 - h$RTS_198) | ((4 - h$RTS_199) << 8))];
-          h$stack[h$sp] = h$RTS_200;
-          return h$RTS_195;
-        }
-        else
-        {
-          var h$RTS_196 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)]);
-          h$sp -= 5;
-          h$r1 = h$RTS_196;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_202 = h$r1.d2.d1;
-      var h$RTS_203 = (h$RTS_202 & 255);
-      if((3 === h$RTS_203))
-      {
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 5;
-        return h$RTS_195;
-      }
-      else
-      {
-        if((3 > h$RTS_203))
-        {
-          var h$RTS_204 = (h$RTS_202 >> 8);
-          switch (h$RTS_204)
-          {
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_204;
-          var h$RTS_205 = h$apply[((3 - h$RTS_203) | ((4 - h$RTS_204) << 8))];
-          h$stack[h$sp] = h$RTS_205;
-          return h$RTS_195;
-        }
-        else
-        {
-          var h$RTS_201 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)]);
-          h$sp -= 5;
-          h$r1 = h$RTS_201;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_3_4, unexpected closure type: " + h$RTS_195.t));
-  };
-};
-h$o(h$ap_3_4, (-1), 0, 4, 256, null);
-function h$ap_3_5()
-{
-  var h$RTS_206 = h$r1.f;
-  switch (h$RTS_206.t)
-  {
-    case (0):
-      return h$RTS_206;
-    case (1):
-      var h$RTS_208 = h$RTS_206.a;
-      var h$RTS_209 = (h$RTS_208 & 255);
-      if((3 === h$RTS_209))
-      {
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 6;
-        return h$RTS_206;
-      }
-      else
-      {
-        if((3 > h$RTS_209))
-        {
-          var h$RTS_210 = (h$RTS_208 >> 8);
-          switch (h$RTS_210)
-          {
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_210;
-          var h$RTS_211 = h$apply[((3 - h$RTS_209) | ((5 - h$RTS_210) << 8))];
-          h$stack[h$sp] = h$RTS_211;
-          return h$RTS_206;
-        }
-        else
-        {
-          var h$RTS_207 = h$c7(h$pap_5, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1280) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)]);
-          h$sp -= 6;
-          h$r1 = h$RTS_207;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_213 = h$r1.d2.d1;
-      var h$RTS_214 = (h$RTS_213 & 255);
-      if((3 === h$RTS_214))
-      {
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 6;
-        return h$RTS_206;
-      }
-      else
-      {
-        if((3 > h$RTS_214))
-        {
-          var h$RTS_215 = (h$RTS_213 >> 8);
-          switch (h$RTS_215)
-          {
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_215;
-          var h$RTS_216 = h$apply[((3 - h$RTS_214) | ((5 - h$RTS_215) << 8))];
-          h$stack[h$sp] = h$RTS_216;
-          return h$RTS_206;
-        }
-        else
-        {
-          var h$RTS_212 = h$c7(h$pap_5, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1280) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)]);
-          h$sp -= 6;
-          h$r1 = h$RTS_212;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_3_5, unexpected closure type: " + h$RTS_206.t));
-  };
-};
-h$o(h$ap_3_5, (-1), 0, 5, 256, null);
-function h$ap_3_6()
-{
-  var h$RTS_217 = h$r1.f;
-  switch (h$RTS_217.t)
-  {
-    case (0):
-      return h$RTS_217;
-    case (1):
-      var h$RTS_219 = h$RTS_217.a;
-      var h$RTS_220 = (h$RTS_219 & 255);
-      if((3 === h$RTS_220))
-      {
-        h$r7 = h$stack[(h$sp - 6)];
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 7;
-        return h$RTS_217;
-      }
-      else
-      {
-        if((3 > h$RTS_220))
-        {
-          var h$RTS_221 = (h$RTS_219 >> 8);
-          switch (h$RTS_221)
-          {
-            case (6):
-              h$r7 = h$stack[(h$sp - 6)];
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_221;
-          var h$RTS_222 = h$apply[((3 - h$RTS_220) | ((6 - h$RTS_221) << 8))];
-          h$stack[h$sp] = h$RTS_222;
-          return h$RTS_217;
-        }
-        else
-        {
-          var h$RTS_218 = h$c8(h$pap_6, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1536) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)], h$stack[(h$sp - 6)]);
-          h$sp -= 7;
-          h$r1 = h$RTS_218;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_224 = h$r1.d2.d1;
-      var h$RTS_225 = (h$RTS_224 & 255);
-      if((3 === h$RTS_225))
-      {
-        h$r7 = h$stack[(h$sp - 6)];
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 7;
-        return h$RTS_217;
-      }
-      else
-      {
-        if((3 > h$RTS_225))
-        {
-          var h$RTS_226 = (h$RTS_224 >> 8);
-          switch (h$RTS_226)
-          {
-            case (6):
-              h$r7 = h$stack[(h$sp - 6)];
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_226;
-          var h$RTS_227 = h$apply[((3 - h$RTS_225) | ((6 - h$RTS_226) << 8))];
-          h$stack[h$sp] = h$RTS_227;
-          return h$RTS_217;
-        }
-        else
-        {
-          var h$RTS_223 = h$c8(h$pap_6, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1536) - 3), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)], h$stack[(h$sp - 6)]);
-          h$sp -= 7;
-          h$r1 = h$RTS_223;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_3_6, unexpected closure type: " + h$RTS_217.t));
-  };
-};
-h$o(h$ap_3_6, (-1), 0, 6, 256, null);
-function h$ap_4_3()
-{
-  var h$RTS_228 = h$r1.f;
-  switch (h$RTS_228.t)
-  {
-    case (0):
-      return h$RTS_228;
-    case (1):
-      var h$RTS_230 = h$RTS_228.a;
-      var h$RTS_231 = (h$RTS_230 & 255);
-      if((4 === h$RTS_231))
-      {
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 4;
-        return h$RTS_228;
-      }
-      else
-      {
-        if((4 > h$RTS_231))
-        {
-          var h$RTS_232 = (h$RTS_230 >> 8);
-          switch (h$RTS_232)
-          {
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_232;
-          var h$RTS_233 = h$apply[((4 - h$RTS_231) | ((3 - h$RTS_232) << 8))];
-          h$stack[h$sp] = h$RTS_233;
-          return h$RTS_228;
-        }
-        else
-        {
-          var h$RTS_229 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)]);
-          h$sp -= 4;
-          h$r1 = h$RTS_229;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_235 = h$r1.d2.d1;
-      var h$RTS_236 = (h$RTS_235 & 255);
-      if((4 === h$RTS_236))
-      {
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 4;
-        return h$RTS_228;
-      }
-      else
-      {
-        if((4 > h$RTS_236))
-        {
-          var h$RTS_237 = (h$RTS_235 >> 8);
-          switch (h$RTS_237)
-          {
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_237;
-          var h$RTS_238 = h$apply[((4 - h$RTS_236) | ((3 - h$RTS_237) << 8))];
-          h$stack[h$sp] = h$RTS_238;
-          return h$RTS_228;
-        }
-        else
-        {
-          var h$RTS_234 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)]);
-          h$sp -= 4;
-          h$r1 = h$RTS_234;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_4_3, unexpected closure type: " + h$RTS_228.t));
-  };
-};
-h$o(h$ap_4_3, (-1), 0, 3, 256, null);
-function h$ap_4_4()
-{
-  var h$RTS_239 = h$r1.f;
-  switch (h$RTS_239.t)
-  {
-    case (0):
-      return h$RTS_239;
-    case (1):
-      var h$RTS_241 = h$RTS_239.a;
-      var h$RTS_242 = (h$RTS_241 & 255);
-      if((4 === h$RTS_242))
-      {
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 5;
-        return h$RTS_239;
-      }
-      else
-      {
-        if((4 > h$RTS_242))
-        {
-          var h$RTS_243 = (h$RTS_241 >> 8);
-          switch (h$RTS_243)
-          {
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_243;
-          var h$RTS_244 = h$apply[((4 - h$RTS_242) | ((4 - h$RTS_243) << 8))];
-          h$stack[h$sp] = h$RTS_244;
-          return h$RTS_239;
-        }
-        else
-        {
-          var h$RTS_240 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)]);
-          h$sp -= 5;
-          h$r1 = h$RTS_240;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_246 = h$r1.d2.d1;
-      var h$RTS_247 = (h$RTS_246 & 255);
-      if((4 === h$RTS_247))
-      {
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 5;
-        return h$RTS_239;
-      }
-      else
-      {
-        if((4 > h$RTS_247))
-        {
-          var h$RTS_248 = (h$RTS_246 >> 8);
-          switch (h$RTS_248)
-          {
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_248;
-          var h$RTS_249 = h$apply[((4 - h$RTS_247) | ((4 - h$RTS_248) << 8))];
-          h$stack[h$sp] = h$RTS_249;
-          return h$RTS_239;
-        }
-        else
-        {
-          var h$RTS_245 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)]);
-          h$sp -= 5;
-          h$r1 = h$RTS_245;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_4_4, unexpected closure type: " + h$RTS_239.t));
-  };
-};
-h$o(h$ap_4_4, (-1), 0, 4, 256, null);
-function h$ap_4_5()
-{
-  var h$RTS_250 = h$r1.f;
-  switch (h$RTS_250.t)
-  {
-    case (0):
-      return h$RTS_250;
-    case (1):
-      var h$RTS_252 = h$RTS_250.a;
-      var h$RTS_253 = (h$RTS_252 & 255);
-      if((4 === h$RTS_253))
-      {
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 6;
-        return h$RTS_250;
-      }
-      else
-      {
-        if((4 > h$RTS_253))
-        {
-          var h$RTS_254 = (h$RTS_252 >> 8);
-          switch (h$RTS_254)
-          {
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_254;
-          var h$RTS_255 = h$apply[((4 - h$RTS_253) | ((5 - h$RTS_254) << 8))];
-          h$stack[h$sp] = h$RTS_255;
-          return h$RTS_250;
-        }
-        else
-        {
-          var h$RTS_251 = h$c7(h$pap_5, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1280) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)]);
-          h$sp -= 6;
-          h$r1 = h$RTS_251;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_257 = h$r1.d2.d1;
-      var h$RTS_258 = (h$RTS_257 & 255);
-      if((4 === h$RTS_258))
-      {
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 6;
-        return h$RTS_250;
-      }
-      else
-      {
-        if((4 > h$RTS_258))
-        {
-          var h$RTS_259 = (h$RTS_257 >> 8);
-          switch (h$RTS_259)
-          {
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_259;
-          var h$RTS_260 = h$apply[((4 - h$RTS_258) | ((5 - h$RTS_259) << 8))];
-          h$stack[h$sp] = h$RTS_260;
-          return h$RTS_250;
-        }
-        else
-        {
-          var h$RTS_256 = h$c7(h$pap_5, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1280) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)]);
-          h$sp -= 6;
-          h$r1 = h$RTS_256;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_4_5, unexpected closure type: " + h$RTS_250.t));
-  };
-};
-h$o(h$ap_4_5, (-1), 0, 5, 256, null);
-function h$ap_4_6()
-{
-  var h$RTS_261 = h$r1.f;
-  switch (h$RTS_261.t)
-  {
-    case (0):
-      return h$RTS_261;
-    case (1):
-      var h$RTS_263 = h$RTS_261.a;
-      var h$RTS_264 = (h$RTS_263 & 255);
-      if((4 === h$RTS_264))
-      {
-        h$r7 = h$stack[(h$sp - 6)];
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 7;
-        return h$RTS_261;
-      }
-      else
-      {
-        if((4 > h$RTS_264))
-        {
-          var h$RTS_265 = (h$RTS_263 >> 8);
-          switch (h$RTS_265)
-          {
-            case (6):
-              h$r7 = h$stack[(h$sp - 6)];
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_265;
-          var h$RTS_266 = h$apply[((4 - h$RTS_264) | ((6 - h$RTS_265) << 8))];
-          h$stack[h$sp] = h$RTS_266;
-          return h$RTS_261;
-        }
-        else
-        {
-          var h$RTS_262 = h$c8(h$pap_6, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1536) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)], h$stack[(h$sp - 6)]);
-          h$sp -= 7;
-          h$r1 = h$RTS_262;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_268 = h$r1.d2.d1;
-      var h$RTS_269 = (h$RTS_268 & 255);
-      if((4 === h$RTS_269))
-      {
-        h$r7 = h$stack[(h$sp - 6)];
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 7;
-        return h$RTS_261;
-      }
-      else
-      {
-        if((4 > h$RTS_269))
-        {
-          var h$RTS_270 = (h$RTS_268 >> 8);
-          switch (h$RTS_270)
-          {
-            case (6):
-              h$r7 = h$stack[(h$sp - 6)];
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_270;
-          var h$RTS_271 = h$apply[((4 - h$RTS_269) | ((6 - h$RTS_270) << 8))];
-          h$stack[h$sp] = h$RTS_271;
-          return h$RTS_261;
-        }
-        else
-        {
-          var h$RTS_267 = h$c8(h$pap_6, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1536) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)], h$stack[(h$sp - 6)]);
-          h$sp -= 7;
-          h$r1 = h$RTS_267;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_4_6, unexpected closure type: " + h$RTS_261.t));
-  };
-};
-h$o(h$ap_4_6, (-1), 0, 6, 256, null);
-function h$ap_4_7()
-{
-  var h$RTS_272 = h$r1.f;
-  switch (h$RTS_272.t)
-  {
-    case (0):
-      return h$RTS_272;
-    case (1):
-      var h$RTS_274 = h$RTS_272.a;
-      var h$RTS_275 = (h$RTS_274 & 255);
-      if((4 === h$RTS_275))
-      {
-        h$r8 = h$stack[(h$sp - 7)];
-        h$r7 = h$stack[(h$sp - 6)];
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 8;
-        return h$RTS_272;
-      }
-      else
-      {
-        if((4 > h$RTS_275))
-        {
-          var h$RTS_276 = (h$RTS_274 >> 8);
-          switch (h$RTS_276)
-          {
-            case (7):
-              h$r8 = h$stack[(h$sp - 7)];
-            case (6):
-              h$r7 = h$stack[(h$sp - 6)];
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_276;
-          var h$RTS_277 = h$apply[((4 - h$RTS_275) | ((7 - h$RTS_276) << 8))];
-          h$stack[h$sp] = h$RTS_277;
-          return h$RTS_272;
-        }
-        else
-        {
-          var h$RTS_273 = h$c9(h$pap_gen, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1792) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)], h$stack[(h$sp - 6)],
-          h$stack[(h$sp - 7)]);
-          h$sp -= 8;
-          h$r1 = h$RTS_273;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_279 = h$r1.d2.d1;
-      var h$RTS_280 = (h$RTS_279 & 255);
-      if((4 === h$RTS_280))
-      {
-        h$r8 = h$stack[(h$sp - 7)];
-        h$r7 = h$stack[(h$sp - 6)];
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 8;
-        return h$RTS_272;
-      }
-      else
-      {
-        if((4 > h$RTS_280))
-        {
-          var h$RTS_281 = (h$RTS_279 >> 8);
-          switch (h$RTS_281)
-          {
-            case (7):
-              h$r8 = h$stack[(h$sp - 7)];
-            case (6):
-              h$r7 = h$stack[(h$sp - 6)];
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_281;
-          var h$RTS_282 = h$apply[((4 - h$RTS_280) | ((7 - h$RTS_281) << 8))];
-          h$stack[h$sp] = h$RTS_282;
-          return h$RTS_272;
-        }
-        else
-        {
-          var h$RTS_278 = h$c9(h$pap_gen, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1792) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)], h$stack[(h$sp - 6)],
-          h$stack[(h$sp - 7)]);
-          h$sp -= 8;
-          h$r1 = h$RTS_278;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_4_7, unexpected closure type: " + h$RTS_272.t));
-  };
-};
-h$o(h$ap_4_7, (-1), 0, 7, 256, null);
-function h$ap_4_8()
-{
-  var h$RTS_283 = h$r1.f;
-  switch (h$RTS_283.t)
-  {
-    case (0):
-      return h$RTS_283;
-    case (1):
-      var h$RTS_285 = h$RTS_283.a;
-      var h$RTS_286 = (h$RTS_285 & 255);
-      if((4 === h$RTS_286))
-      {
-        h$r9 = h$stack[(h$sp - 8)];
-        h$r8 = h$stack[(h$sp - 7)];
-        h$r7 = h$stack[(h$sp - 6)];
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 9;
-        return h$RTS_283;
-      }
-      else
-      {
-        if((4 > h$RTS_286))
-        {
-          var h$RTS_287 = (h$RTS_285 >> 8);
-          switch (h$RTS_287)
-          {
-            case (8):
-              h$r9 = h$stack[(h$sp - 8)];
-            case (7):
-              h$r8 = h$stack[(h$sp - 7)];
-            case (6):
-              h$r7 = h$stack[(h$sp - 6)];
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_287;
-          var h$RTS_288 = h$apply[((4 - h$RTS_286) | ((8 - h$RTS_287) << 8))];
-          h$stack[h$sp] = h$RTS_288;
-          return h$RTS_283;
-        }
-        else
-        {
-          var h$RTS_284 = h$c10(h$pap_gen, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 2048) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)], h$stack[(h$sp - 6)],
-          h$stack[(h$sp - 7)], h$stack[(h$sp - 8)]);
-          h$sp -= 9;
-          h$r1 = h$RTS_284;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_290 = h$r1.d2.d1;
-      var h$RTS_291 = (h$RTS_290 & 255);
-      if((4 === h$RTS_291))
-      {
-        h$r9 = h$stack[(h$sp - 8)];
-        h$r8 = h$stack[(h$sp - 7)];
-        h$r7 = h$stack[(h$sp - 6)];
-        h$r6 = h$stack[(h$sp - 5)];
-        h$r5 = h$stack[(h$sp - 4)];
-        h$r4 = h$stack[(h$sp - 3)];
-        h$r3 = h$stack[(h$sp - 2)];
-        h$r2 = h$stack[(h$sp - 1)];
-        h$sp -= 9;
-        return h$RTS_283;
-      }
-      else
-      {
-        if((4 > h$RTS_291))
-        {
-          var h$RTS_292 = (h$RTS_290 >> 8);
-          switch (h$RTS_292)
-          {
-            case (8):
-              h$r9 = h$stack[(h$sp - 8)];
-            case (7):
-              h$r8 = h$stack[(h$sp - 7)];
-            case (6):
-              h$r7 = h$stack[(h$sp - 6)];
-            case (5):
-              h$r6 = h$stack[(h$sp - 5)];
-            case (4):
-              h$r5 = h$stack[(h$sp - 4)];
-            case (3):
-              h$r4 = h$stack[(h$sp - 3)];
-            case (2):
-              h$r3 = h$stack[(h$sp - 2)];
-            case (1):
-              h$r2 = h$stack[(h$sp - 1)];
-            default:
-          };
-          h$sp -= h$RTS_292;
-          var h$RTS_293 = h$apply[((4 - h$RTS_291) | ((8 - h$RTS_292) << 8))];
-          h$stack[h$sp] = h$RTS_293;
-          return h$RTS_283;
-        }
-        else
-        {
-          var h$RTS_289 = h$c10(h$pap_gen, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 2048) - 4), h$stack[(h$sp - 1)],
-          h$stack[(h$sp - 2)], h$stack[(h$sp - 3)], h$stack[(h$sp - 4)], h$stack[(h$sp - 5)], h$stack[(h$sp - 6)],
-          h$stack[(h$sp - 7)], h$stack[(h$sp - 8)]);
-          h$sp -= 9;
-          h$r1 = h$RTS_289;
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("panic: h$ap_4_8, unexpected closure type: " + h$RTS_283.t));
-  };
-};
-h$o(h$ap_4_8, (-1), 0, 8, 256, null);
-function h$ap_1_0_fast()
-{
-  var h$RTS_294 = h$r1.f;
-  switch (h$RTS_294.t)
-  {
-    case (1):
-      var h$RTS_295 = h$RTS_294.a;
-      var h$RTS_297 = (h$RTS_295 & 255);
-      if((1 === h$RTS_297))
-      {
-        return h$RTS_294;
-      }
-      else
-      {
-        if((1 > h$RTS_297))
-        {
-          var h$RTS_298 = (h$RTS_295 >> 8);
-          var h$RTS_299 = (0 - h$RTS_298);
-          switch (h$RTS_298)
-          {
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_299) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_299 << 8) | (1 - (h$RTS_295 & 255)))];
-          return h$RTS_294;
-        }
-        else
-        {
-          var h$RTS_296 = h$c3(h$pap_0, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 0) - 1), null);
-          h$r1 = h$RTS_296;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_300 = h$r1.d2.d1;
-      var h$RTS_302 = (h$RTS_300 & 255);
-      if((1 === h$RTS_302))
-      {
-        return h$RTS_294;
-      }
-      else
-      {
-        if((1 > h$RTS_302))
-        {
-          var h$RTS_303 = (h$RTS_300 >> 8);
-          var h$RTS_304 = (0 - h$RTS_303);
-          switch (h$RTS_303)
-          {
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_304) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_304 << 8) | (1 - (h$RTS_300 & 255)))];
-          return h$RTS_294;
-        }
-        else
-        {
-          var h$RTS_301 = h$c3(h$pap_0, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 0) - 1), null);
-          h$r1 = h$RTS_301;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      ++h$sp;
-      h$stack[h$sp] = h$ap_1_0;
-      return h$RTS_294;
-    case (5):
-      ++h$sp;
-      h$stack[h$sp] = h$ap_1_0;
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_1_0_fast: unexpected closure type: " + h$RTS_294.t));
-  };
-};
-function h$ap_1_1_fast()
-{
-  var h$RTS_305 = h$r1.f;
-  switch (h$RTS_305.t)
-  {
-    case (1):
-      var h$RTS_306 = h$RTS_305.a;
-      var h$RTS_308 = (h$RTS_306 & 255);
-      if((1 === h$RTS_308))
-      {
-        return h$RTS_305;
-      }
-      else
-      {
-        if((1 > h$RTS_308))
-        {
-          var h$RTS_309 = (h$RTS_306 >> 8);
-          var h$RTS_310 = (1 - h$RTS_309);
-          switch (h$RTS_309)
-          {
-            case (0):
-              h$stack[(h$sp + 1)] = h$r2;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_310) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_310 << 8) | (1 - (h$RTS_306 & 255)))];
-          return h$RTS_305;
-        }
-        else
-        {
-          var h$RTS_307 = h$c3(h$pap_1, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 256) - 1), h$r2);
-          h$r1 = h$RTS_307;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_311 = h$r1.d2.d1;
-      var h$RTS_313 = (h$RTS_311 & 255);
-      if((1 === h$RTS_313))
-      {
-        return h$RTS_305;
-      }
-      else
-      {
-        if((1 > h$RTS_313))
-        {
-          var h$RTS_314 = (h$RTS_311 >> 8);
-          var h$RTS_315 = (1 - h$RTS_314);
-          switch (h$RTS_314)
-          {
-            case (0):
-              h$stack[(h$sp + 1)] = h$r2;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_315) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_315 << 8) | (1 - (h$RTS_311 & 255)))];
-          return h$RTS_305;
-        }
-        else
-        {
-          var h$RTS_312 = h$c3(h$pap_1, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 256) - 1), h$r2);
-          h$r1 = h$RTS_312;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p2(h$r2, h$ap_1_1);
-      return h$RTS_305;
-    case (5):
-      h$p2(h$r2, h$ap_1_1);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_1_1_fast: unexpected closure type: " + h$RTS_305.t));
-  };
-};
-function h$ap_1_2_fast()
-{
-  var h$RTS_316 = h$r1.f;
-  switch (h$RTS_316.t)
-  {
-    case (1):
-      var h$RTS_317 = h$RTS_316.a;
-      var h$RTS_319 = (h$RTS_317 & 255);
-      if((1 === h$RTS_319))
-      {
-        return h$RTS_316;
-      }
-      else
-      {
-        if((1 > h$RTS_319))
-        {
-          var h$RTS_320 = (h$RTS_317 >> 8);
-          var h$RTS_321 = (2 - h$RTS_320);
-          switch (h$RTS_320)
-          {
-            case (0):
-              h$stack[(h$sp + 2)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 1)] = h$r3;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_321) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_321 << 8) | (1 - (h$RTS_317 & 255)))];
-          return h$RTS_316;
-        }
-        else
-        {
-          var h$RTS_318 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 1), h$r2, h$r3);
-          h$r1 = h$RTS_318;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_322 = h$r1.d2.d1;
-      var h$RTS_324 = (h$RTS_322 & 255);
-      if((1 === h$RTS_324))
-      {
-        return h$RTS_316;
-      }
-      else
-      {
-        if((1 > h$RTS_324))
-        {
-          var h$RTS_325 = (h$RTS_322 >> 8);
-          var h$RTS_326 = (2 - h$RTS_325);
-          switch (h$RTS_325)
-          {
-            case (0):
-              h$stack[(h$sp + 2)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 1)] = h$r3;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_326) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_326 << 8) | (1 - (h$RTS_322 & 255)))];
-          return h$RTS_316;
-        }
-        else
-        {
-          var h$RTS_323 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 1), h$r2, h$r3);
-          h$r1 = h$RTS_323;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p3(h$r3, h$r2, h$ap_1_2);
-      return h$RTS_316;
-    case (5):
-      h$p3(h$r3, h$r2, h$ap_1_2);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_1_2_fast: unexpected closure type: " + h$RTS_316.t));
-  };
-};
-function h$ap_2_1_fast()
-{
-  var h$RTS_327 = h$r1.f;
-  switch (h$RTS_327.t)
-  {
-    case (1):
-      var h$RTS_328 = h$RTS_327.a;
-      var h$RTS_330 = (h$RTS_328 & 255);
-      if((2 === h$RTS_330))
-      {
-        return h$RTS_327;
-      }
-      else
-      {
-        if((2 > h$RTS_330))
-        {
-          var h$RTS_331 = (h$RTS_328 >> 8);
-          var h$RTS_332 = (1 - h$RTS_331);
-          switch (h$RTS_331)
-          {
-            case (0):
-              h$stack[(h$sp + 1)] = h$r2;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_332) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_332 << 8) | (2 - (h$RTS_328 & 255)))];
-          return h$RTS_327;
-        }
-        else
-        {
-          var h$RTS_329 = h$c3(h$pap_1, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 256) - 2), h$r2);
-          h$r1 = h$RTS_329;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_333 = h$r1.d2.d1;
-      var h$RTS_335 = (h$RTS_333 & 255);
-      if((2 === h$RTS_335))
-      {
-        return h$RTS_327;
-      }
-      else
-      {
-        if((2 > h$RTS_335))
-        {
-          var h$RTS_336 = (h$RTS_333 >> 8);
-          var h$RTS_337 = (1 - h$RTS_336);
-          switch (h$RTS_336)
-          {
-            case (0):
-              h$stack[(h$sp + 1)] = h$r2;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_337) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_337 << 8) | (2 - (h$RTS_333 & 255)))];
-          return h$RTS_327;
-        }
-        else
-        {
-          var h$RTS_334 = h$c3(h$pap_1, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 256) - 2), h$r2);
-          h$r1 = h$RTS_334;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p2(h$r2, h$ap_2_1);
-      return h$RTS_327;
-    case (5):
-      h$p2(h$r2, h$ap_2_1);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_2_1_fast: unexpected closure type: " + h$RTS_327.t));
-  };
-};
-function h$ap_2_2_fast()
-{
-  var h$RTS_338 = h$r1.f;
-  switch (h$RTS_338.t)
-  {
-    case (1):
-      var h$RTS_339 = h$RTS_338.a;
-      var h$RTS_341 = (h$RTS_339 & 255);
-      if((2 === h$RTS_341))
-      {
-        return h$RTS_338;
-      }
-      else
-      {
-        if((2 > h$RTS_341))
-        {
-          var h$RTS_342 = (h$RTS_339 >> 8);
-          var h$RTS_343 = (2 - h$RTS_342);
-          switch (h$RTS_342)
-          {
-            case (0):
-              h$stack[(h$sp + 2)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 1)] = h$r3;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_343) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_343 << 8) | (2 - (h$RTS_339 & 255)))];
-          return h$RTS_338;
-        }
-        else
-        {
-          var h$RTS_340 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 2), h$r2, h$r3);
-          h$r1 = h$RTS_340;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_344 = h$r1.d2.d1;
-      var h$RTS_346 = (h$RTS_344 & 255);
-      if((2 === h$RTS_346))
-      {
-        return h$RTS_338;
-      }
-      else
-      {
-        if((2 > h$RTS_346))
-        {
-          var h$RTS_347 = (h$RTS_344 >> 8);
-          var h$RTS_348 = (2 - h$RTS_347);
-          switch (h$RTS_347)
-          {
-            case (0):
-              h$stack[(h$sp + 2)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 1)] = h$r3;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_348) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_348 << 8) | (2 - (h$RTS_344 & 255)))];
-          return h$RTS_338;
-        }
-        else
-        {
-          var h$RTS_345 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 2), h$r2, h$r3);
-          h$r1 = h$RTS_345;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p3(h$r3, h$r2, h$ap_2_2);
-      return h$RTS_338;
-    case (5):
-      h$p3(h$r3, h$r2, h$ap_2_2);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_2_2_fast: unexpected closure type: " + h$RTS_338.t));
-  };
-};
-function h$ap_2_3_fast()
-{
-  var h$RTS_349 = h$r1.f;
-  switch (h$RTS_349.t)
-  {
-    case (1):
-      var h$RTS_350 = h$RTS_349.a;
-      var h$RTS_352 = (h$RTS_350 & 255);
-      if((2 === h$RTS_352))
-      {
-        return h$RTS_349;
-      }
-      else
-      {
-        if((2 > h$RTS_352))
-        {
-          var h$RTS_353 = (h$RTS_350 >> 8);
-          var h$RTS_354 = (3 - h$RTS_353);
-          switch (h$RTS_353)
-          {
-            case (0):
-              h$stack[(h$sp + 3)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 2)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 1)] = h$r4;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_354) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_354 << 8) | (2 - (h$RTS_350 & 255)))];
-          return h$RTS_349;
-        }
-        else
-        {
-          var h$RTS_351 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 2), h$r2, h$r3, h$r4);
-          h$r1 = h$RTS_351;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_355 = h$r1.d2.d1;
-      var h$RTS_357 = (h$RTS_355 & 255);
-      if((2 === h$RTS_357))
-      {
-        return h$RTS_349;
-      }
-      else
-      {
-        if((2 > h$RTS_357))
-        {
-          var h$RTS_358 = (h$RTS_355 >> 8);
-          var h$RTS_359 = (3 - h$RTS_358);
-          switch (h$RTS_358)
-          {
-            case (0):
-              h$stack[(h$sp + 3)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 2)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 1)] = h$r4;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_359) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_359 << 8) | (2 - (h$RTS_355 & 255)))];
-          return h$RTS_349;
-        }
-        else
-        {
-          var h$RTS_356 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 2), h$r2, h$r3, h$r4);
-          h$r1 = h$RTS_356;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p4(h$r4, h$r3, h$r2, h$ap_2_3);
-      return h$RTS_349;
-    case (5):
-      h$p4(h$r4, h$r3, h$r2, h$ap_2_3);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_2_3_fast: unexpected closure type: " + h$RTS_349.t));
-  };
-};
-function h$ap_2_4_fast()
-{
-  var h$RTS_360 = h$r1.f;
-  switch (h$RTS_360.t)
-  {
-    case (1):
-      var h$RTS_361 = h$RTS_360.a;
-      var h$RTS_363 = (h$RTS_361 & 255);
-      if((2 === h$RTS_363))
-      {
-        return h$RTS_360;
-      }
-      else
-      {
-        if((2 > h$RTS_363))
-        {
-          var h$RTS_364 = (h$RTS_361 >> 8);
-          var h$RTS_365 = (4 - h$RTS_364);
-          switch (h$RTS_364)
-          {
-            case (0):
-              h$stack[(h$sp + 4)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 3)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 2)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 1)] = h$r5;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_365) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_365 << 8) | (2 - (h$RTS_361 & 255)))];
-          return h$RTS_360;
-        }
-        else
-        {
-          var h$RTS_362 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 2), h$r2, h$r3, h$r4, h$r5);
-          h$r1 = h$RTS_362;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_366 = h$r1.d2.d1;
-      var h$RTS_368 = (h$RTS_366 & 255);
-      if((2 === h$RTS_368))
-      {
-        return h$RTS_360;
-      }
-      else
-      {
-        if((2 > h$RTS_368))
-        {
-          var h$RTS_369 = (h$RTS_366 >> 8);
-          var h$RTS_370 = (4 - h$RTS_369);
-          switch (h$RTS_369)
-          {
-            case (0):
-              h$stack[(h$sp + 4)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 3)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 2)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 1)] = h$r5;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_370) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_370 << 8) | (2 - (h$RTS_366 & 255)))];
-          return h$RTS_360;
-        }
-        else
-        {
-          var h$RTS_367 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 2), h$r2, h$r3, h$r4, h$r5);
-          h$r1 = h$RTS_367;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p5(h$r5, h$r4, h$r3, h$r2, h$ap_2_4);
-      return h$RTS_360;
-    case (5):
-      h$p5(h$r5, h$r4, h$r3, h$r2, h$ap_2_4);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_2_4_fast: unexpected closure type: " + h$RTS_360.t));
-  };
-};
-function h$ap_3_2_fast()
-{
-  var h$RTS_371 = h$r1.f;
-  switch (h$RTS_371.t)
-  {
-    case (1):
-      var h$RTS_372 = h$RTS_371.a;
-      var h$RTS_374 = (h$RTS_372 & 255);
-      if((3 === h$RTS_374))
-      {
-        return h$RTS_371;
-      }
-      else
-      {
-        if((3 > h$RTS_374))
-        {
-          var h$RTS_375 = (h$RTS_372 >> 8);
-          var h$RTS_376 = (2 - h$RTS_375);
-          switch (h$RTS_375)
-          {
-            case (0):
-              h$stack[(h$sp + 2)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 1)] = h$r3;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_376) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_376 << 8) | (3 - (h$RTS_372 & 255)))];
-          return h$RTS_371;
-        }
-        else
-        {
-          var h$RTS_373 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 3), h$r2, h$r3);
-          h$r1 = h$RTS_373;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_377 = h$r1.d2.d1;
-      var h$RTS_379 = (h$RTS_377 & 255);
-      if((3 === h$RTS_379))
-      {
-        return h$RTS_371;
-      }
-      else
-      {
-        if((3 > h$RTS_379))
-        {
-          var h$RTS_380 = (h$RTS_377 >> 8);
-          var h$RTS_381 = (2 - h$RTS_380);
-          switch (h$RTS_380)
-          {
-            case (0):
-              h$stack[(h$sp + 2)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 1)] = h$r3;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_381) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_381 << 8) | (3 - (h$RTS_377 & 255)))];
-          return h$RTS_371;
-        }
-        else
-        {
-          var h$RTS_378 = h$c4(h$pap_2, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 512) - 3), h$r2, h$r3);
-          h$r1 = h$RTS_378;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p3(h$r3, h$r2, h$ap_3_2);
-      return h$RTS_371;
-    case (5):
-      h$p3(h$r3, h$r2, h$ap_3_2);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_3_2_fast: unexpected closure type: " + h$RTS_371.t));
-  };
-};
-function h$ap_3_3_fast()
-{
-  var h$RTS_382 = h$r1.f;
-  switch (h$RTS_382.t)
-  {
-    case (1):
-      var h$RTS_383 = h$RTS_382.a;
-      var h$RTS_385 = (h$RTS_383 & 255);
-      if((3 === h$RTS_385))
-      {
-        return h$RTS_382;
-      }
-      else
-      {
-        if((3 > h$RTS_385))
-        {
-          var h$RTS_386 = (h$RTS_383 >> 8);
-          var h$RTS_387 = (3 - h$RTS_386);
-          switch (h$RTS_386)
-          {
-            case (0):
-              h$stack[(h$sp + 3)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 2)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 1)] = h$r4;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_387) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_387 << 8) | (3 - (h$RTS_383 & 255)))];
-          return h$RTS_382;
-        }
-        else
-        {
-          var h$RTS_384 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 3), h$r2, h$r3, h$r4);
-          h$r1 = h$RTS_384;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_388 = h$r1.d2.d1;
-      var h$RTS_390 = (h$RTS_388 & 255);
-      if((3 === h$RTS_390))
-      {
-        return h$RTS_382;
-      }
-      else
-      {
-        if((3 > h$RTS_390))
-        {
-          var h$RTS_391 = (h$RTS_388 >> 8);
-          var h$RTS_392 = (3 - h$RTS_391);
-          switch (h$RTS_391)
-          {
-            case (0):
-              h$stack[(h$sp + 3)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 2)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 1)] = h$r4;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_392) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_392 << 8) | (3 - (h$RTS_388 & 255)))];
-          return h$RTS_382;
-        }
-        else
-        {
-          var h$RTS_389 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 3), h$r2, h$r3, h$r4);
-          h$r1 = h$RTS_389;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p4(h$r4, h$r3, h$r2, h$ap_3_3);
-      return h$RTS_382;
-    case (5):
-      h$p4(h$r4, h$r3, h$r2, h$ap_3_3);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_3_3_fast: unexpected closure type: " + h$RTS_382.t));
-  };
-};
-function h$ap_3_4_fast()
-{
-  var h$RTS_393 = h$r1.f;
-  switch (h$RTS_393.t)
-  {
-    case (1):
-      var h$RTS_394 = h$RTS_393.a;
-      var h$RTS_396 = (h$RTS_394 & 255);
-      if((3 === h$RTS_396))
-      {
-        return h$RTS_393;
-      }
-      else
-      {
-        if((3 > h$RTS_396))
-        {
-          var h$RTS_397 = (h$RTS_394 >> 8);
-          var h$RTS_398 = (4 - h$RTS_397);
-          switch (h$RTS_397)
-          {
-            case (0):
-              h$stack[(h$sp + 4)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 3)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 2)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 1)] = h$r5;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_398) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_398 << 8) | (3 - (h$RTS_394 & 255)))];
-          return h$RTS_393;
-        }
-        else
-        {
-          var h$RTS_395 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 3), h$r2, h$r3, h$r4, h$r5);
-          h$r1 = h$RTS_395;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_399 = h$r1.d2.d1;
-      var h$RTS_401 = (h$RTS_399 & 255);
-      if((3 === h$RTS_401))
-      {
-        return h$RTS_393;
-      }
-      else
-      {
-        if((3 > h$RTS_401))
-        {
-          var h$RTS_402 = (h$RTS_399 >> 8);
-          var h$RTS_403 = (4 - h$RTS_402);
-          switch (h$RTS_402)
-          {
-            case (0):
-              h$stack[(h$sp + 4)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 3)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 2)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 1)] = h$r5;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_403) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_403 << 8) | (3 - (h$RTS_399 & 255)))];
-          return h$RTS_393;
-        }
-        else
-        {
-          var h$RTS_400 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 3), h$r2, h$r3, h$r4, h$r5);
-          h$r1 = h$RTS_400;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p5(h$r5, h$r4, h$r3, h$r2, h$ap_3_4);
-      return h$RTS_393;
-    case (5):
-      h$p5(h$r5, h$r4, h$r3, h$r2, h$ap_3_4);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_3_4_fast: unexpected closure type: " + h$RTS_393.t));
-  };
-};
-function h$ap_3_5_fast()
-{
-  var h$RTS_404 = h$r1.f;
-  switch (h$RTS_404.t)
-  {
-    case (1):
-      var h$RTS_405 = h$RTS_404.a;
-      var h$RTS_407 = (h$RTS_405 & 255);
-      if((3 === h$RTS_407))
-      {
-        return h$RTS_404;
-      }
-      else
-      {
-        if((3 > h$RTS_407))
-        {
-          var h$RTS_408 = (h$RTS_405 >> 8);
-          var h$RTS_409 = (5 - h$RTS_408);
-          switch (h$RTS_408)
-          {
-            case (0):
-              h$stack[(h$sp + 5)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 4)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 3)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 2)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 1)] = h$r6;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_409) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_409 << 8) | (3 - (h$RTS_405 & 255)))];
-          return h$RTS_404;
-        }
-        else
-        {
-          var h$RTS_406 = h$c7(h$pap_5, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1280) - 3), h$r2, h$r3, h$r4, h$r5,
-          h$r6);
-          h$r1 = h$RTS_406;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_410 = h$r1.d2.d1;
-      var h$RTS_412 = (h$RTS_410 & 255);
-      if((3 === h$RTS_412))
-      {
-        return h$RTS_404;
-      }
-      else
-      {
-        if((3 > h$RTS_412))
-        {
-          var h$RTS_413 = (h$RTS_410 >> 8);
-          var h$RTS_414 = (5 - h$RTS_413);
-          switch (h$RTS_413)
-          {
-            case (0):
-              h$stack[(h$sp + 5)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 4)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 3)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 2)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 1)] = h$r6;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_414) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_414 << 8) | (3 - (h$RTS_410 & 255)))];
-          return h$RTS_404;
-        }
-        else
-        {
-          var h$RTS_411 = h$c7(h$pap_5, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1280) - 3), h$r2, h$r3, h$r4, h$r5,
-          h$r6);
-          h$r1 = h$RTS_411;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p6(h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_3_5);
-      return h$RTS_404;
-    case (5):
-      h$p6(h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_3_5);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_3_5_fast: unexpected closure type: " + h$RTS_404.t));
-  };
-};
-function h$ap_3_6_fast()
-{
-  var h$RTS_415 = h$r1.f;
-  switch (h$RTS_415.t)
-  {
-    case (1):
-      var h$RTS_416 = h$RTS_415.a;
-      var h$RTS_418 = (h$RTS_416 & 255);
-      if((3 === h$RTS_418))
-      {
-        return h$RTS_415;
-      }
-      else
-      {
-        if((3 > h$RTS_418))
-        {
-          var h$RTS_419 = (h$RTS_416 >> 8);
-          var h$RTS_420 = (6 - h$RTS_419);
-          switch (h$RTS_419)
-          {
-            case (0):
-              h$stack[(h$sp + 6)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 5)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 4)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 3)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 2)] = h$r6;
-            case (5):
-              h$stack[(h$sp + 1)] = h$r7;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_420) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_420 << 8) | (3 - (h$RTS_416 & 255)))];
-          return h$RTS_415;
-        }
-        else
-        {
-          var h$RTS_417 = h$c8(h$pap_6, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1536) - 3), h$r2, h$r3, h$r4, h$r5,
-          h$r6, h$r7);
-          h$r1 = h$RTS_417;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_421 = h$r1.d2.d1;
-      var h$RTS_423 = (h$RTS_421 & 255);
-      if((3 === h$RTS_423))
-      {
-        return h$RTS_415;
-      }
-      else
-      {
-        if((3 > h$RTS_423))
-        {
-          var h$RTS_424 = (h$RTS_421 >> 8);
-          var h$RTS_425 = (6 - h$RTS_424);
-          switch (h$RTS_424)
-          {
-            case (0):
-              h$stack[(h$sp + 6)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 5)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 4)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 3)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 2)] = h$r6;
-            case (5):
-              h$stack[(h$sp + 1)] = h$r7;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_425) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_425 << 8) | (3 - (h$RTS_421 & 255)))];
-          return h$RTS_415;
-        }
-        else
-        {
-          var h$RTS_422 = h$c8(h$pap_6, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1536) - 3), h$r2, h$r3, h$r4, h$r5,
-          h$r6, h$r7);
-          h$r1 = h$RTS_422;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p7(h$r7, h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_3_6);
-      return h$RTS_415;
-    case (5):
-      h$p7(h$r7, h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_3_6);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_3_6_fast: unexpected closure type: " + h$RTS_415.t));
-  };
-};
-function h$ap_4_3_fast()
-{
-  var h$RTS_426 = h$r1.f;
-  switch (h$RTS_426.t)
-  {
-    case (1):
-      var h$RTS_427 = h$RTS_426.a;
-      var h$RTS_429 = (h$RTS_427 & 255);
-      if((4 === h$RTS_429))
-      {
-        return h$RTS_426;
-      }
-      else
-      {
-        if((4 > h$RTS_429))
-        {
-          var h$RTS_430 = (h$RTS_427 >> 8);
-          var h$RTS_431 = (3 - h$RTS_430);
-          switch (h$RTS_430)
-          {
-            case (0):
-              h$stack[(h$sp + 3)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 2)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 1)] = h$r4;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_431) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_431 << 8) | (4 - (h$RTS_427 & 255)))];
-          return h$RTS_426;
-        }
-        else
-        {
-          var h$RTS_428 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 4), h$r2, h$r3, h$r4);
-          h$r1 = h$RTS_428;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_432 = h$r1.d2.d1;
-      var h$RTS_434 = (h$RTS_432 & 255);
-      if((4 === h$RTS_434))
-      {
-        return h$RTS_426;
-      }
-      else
-      {
-        if((4 > h$RTS_434))
-        {
-          var h$RTS_435 = (h$RTS_432 >> 8);
-          var h$RTS_436 = (3 - h$RTS_435);
-          switch (h$RTS_435)
-          {
-            case (0):
-              h$stack[(h$sp + 3)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 2)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 1)] = h$r4;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_436) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_436 << 8) | (4 - (h$RTS_432 & 255)))];
-          return h$RTS_426;
-        }
-        else
-        {
-          var h$RTS_433 = h$c5(h$pap_3, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 768) - 4), h$r2, h$r3, h$r4);
-          h$r1 = h$RTS_433;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p4(h$r4, h$r3, h$r2, h$ap_4_3);
-      return h$RTS_426;
-    case (5):
-      h$p4(h$r4, h$r3, h$r2, h$ap_4_3);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_4_3_fast: unexpected closure type: " + h$RTS_426.t));
-  };
-};
-function h$ap_4_4_fast()
-{
-  var h$RTS_437 = h$r1.f;
-  switch (h$RTS_437.t)
-  {
-    case (1):
-      var h$RTS_438 = h$RTS_437.a;
-      var h$RTS_440 = (h$RTS_438 & 255);
-      if((4 === h$RTS_440))
-      {
-        return h$RTS_437;
-      }
-      else
-      {
-        if((4 > h$RTS_440))
-        {
-          var h$RTS_441 = (h$RTS_438 >> 8);
-          var h$RTS_442 = (4 - h$RTS_441);
-          switch (h$RTS_441)
-          {
-            case (0):
-              h$stack[(h$sp + 4)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 3)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 2)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 1)] = h$r5;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_442) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_442 << 8) | (4 - (h$RTS_438 & 255)))];
-          return h$RTS_437;
-        }
-        else
-        {
-          var h$RTS_439 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 4), h$r2, h$r3, h$r4, h$r5);
-          h$r1 = h$RTS_439;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_443 = h$r1.d2.d1;
-      var h$RTS_445 = (h$RTS_443 & 255);
-      if((4 === h$RTS_445))
-      {
-        return h$RTS_437;
-      }
-      else
-      {
-        if((4 > h$RTS_445))
-        {
-          var h$RTS_446 = (h$RTS_443 >> 8);
-          var h$RTS_447 = (4 - h$RTS_446);
-          switch (h$RTS_446)
-          {
-            case (0):
-              h$stack[(h$sp + 4)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 3)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 2)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 1)] = h$r5;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_447) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_447 << 8) | (4 - (h$RTS_443 & 255)))];
-          return h$RTS_437;
-        }
-        else
-        {
-          var h$RTS_444 = h$c6(h$pap_4, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1024) - 4), h$r2, h$r3, h$r4, h$r5);
-          h$r1 = h$RTS_444;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p5(h$r5, h$r4, h$r3, h$r2, h$ap_4_4);
-      return h$RTS_437;
-    case (5):
-      h$p5(h$r5, h$r4, h$r3, h$r2, h$ap_4_4);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_4_4_fast: unexpected closure type: " + h$RTS_437.t));
-  };
-};
-function h$ap_4_5_fast()
-{
-  var h$RTS_448 = h$r1.f;
-  switch (h$RTS_448.t)
-  {
-    case (1):
-      var h$RTS_449 = h$RTS_448.a;
-      var h$RTS_451 = (h$RTS_449 & 255);
-      if((4 === h$RTS_451))
-      {
-        return h$RTS_448;
-      }
-      else
-      {
-        if((4 > h$RTS_451))
-        {
-          var h$RTS_452 = (h$RTS_449 >> 8);
-          var h$RTS_453 = (5 - h$RTS_452);
-          switch (h$RTS_452)
-          {
-            case (0):
-              h$stack[(h$sp + 5)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 4)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 3)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 2)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 1)] = h$r6;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_453) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_453 << 8) | (4 - (h$RTS_449 & 255)))];
-          return h$RTS_448;
-        }
-        else
-        {
-          var h$RTS_450 = h$c7(h$pap_5, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1280) - 4), h$r2, h$r3, h$r4, h$r5,
-          h$r6);
-          h$r1 = h$RTS_450;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_454 = h$r1.d2.d1;
-      var h$RTS_456 = (h$RTS_454 & 255);
-      if((4 === h$RTS_456))
-      {
-        return h$RTS_448;
-      }
-      else
-      {
-        if((4 > h$RTS_456))
-        {
-          var h$RTS_457 = (h$RTS_454 >> 8);
-          var h$RTS_458 = (5 - h$RTS_457);
-          switch (h$RTS_457)
-          {
-            case (0):
-              h$stack[(h$sp + 5)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 4)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 3)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 2)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 1)] = h$r6;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_458) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_458 << 8) | (4 - (h$RTS_454 & 255)))];
-          return h$RTS_448;
-        }
-        else
-        {
-          var h$RTS_455 = h$c7(h$pap_5, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1280) - 4), h$r2, h$r3, h$r4, h$r5,
-          h$r6);
-          h$r1 = h$RTS_455;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p6(h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_4_5);
-      return h$RTS_448;
-    case (5):
-      h$p6(h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_4_5);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_4_5_fast: unexpected closure type: " + h$RTS_448.t));
-  };
-};
-function h$ap_4_6_fast()
-{
-  var h$RTS_459 = h$r1.f;
-  switch (h$RTS_459.t)
-  {
-    case (1):
-      var h$RTS_460 = h$RTS_459.a;
-      var h$RTS_462 = (h$RTS_460 & 255);
-      if((4 === h$RTS_462))
-      {
-        return h$RTS_459;
-      }
-      else
-      {
-        if((4 > h$RTS_462))
-        {
-          var h$RTS_463 = (h$RTS_460 >> 8);
-          var h$RTS_464 = (6 - h$RTS_463);
-          switch (h$RTS_463)
-          {
-            case (0):
-              h$stack[(h$sp + 6)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 5)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 4)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 3)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 2)] = h$r6;
-            case (5):
-              h$stack[(h$sp + 1)] = h$r7;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_464) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_464 << 8) | (4 - (h$RTS_460 & 255)))];
-          return h$RTS_459;
-        }
-        else
-        {
-          var h$RTS_461 = h$c8(h$pap_6, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1536) - 4), h$r2, h$r3, h$r4, h$r5,
-          h$r6, h$r7);
-          h$r1 = h$RTS_461;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_465 = h$r1.d2.d1;
-      var h$RTS_467 = (h$RTS_465 & 255);
-      if((4 === h$RTS_467))
-      {
-        return h$RTS_459;
-      }
-      else
-      {
-        if((4 > h$RTS_467))
-        {
-          var h$RTS_468 = (h$RTS_465 >> 8);
-          var h$RTS_469 = (6 - h$RTS_468);
-          switch (h$RTS_468)
-          {
-            case (0):
-              h$stack[(h$sp + 6)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 5)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 4)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 3)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 2)] = h$r6;
-            case (5):
-              h$stack[(h$sp + 1)] = h$r7;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_469) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_469 << 8) | (4 - (h$RTS_465 & 255)))];
-          return h$RTS_459;
-        }
-        else
-        {
-          var h$RTS_466 = h$c8(h$pap_6, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1536) - 4), h$r2, h$r3, h$r4, h$r5,
-          h$r6, h$r7);
-          h$r1 = h$RTS_466;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p7(h$r7, h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_4_6);
-      return h$RTS_459;
-    case (5):
-      h$p7(h$r7, h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_4_6);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_4_6_fast: unexpected closure type: " + h$RTS_459.t));
-  };
-};
-function h$ap_4_7_fast()
-{
-  var h$RTS_470 = h$r1.f;
-  switch (h$RTS_470.t)
-  {
-    case (1):
-      var h$RTS_471 = h$RTS_470.a;
-      var h$RTS_473 = (h$RTS_471 & 255);
-      if((4 === h$RTS_473))
-      {
-        return h$RTS_470;
-      }
-      else
-      {
-        if((4 > h$RTS_473))
-        {
-          var h$RTS_474 = (h$RTS_471 >> 8);
-          var h$RTS_475 = (7 - h$RTS_474);
-          switch (h$RTS_474)
-          {
-            case (0):
-              h$stack[(h$sp + 7)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 6)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 5)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 4)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 3)] = h$r6;
-            case (5):
-              h$stack[(h$sp + 2)] = h$r7;
-            case (6):
-              h$stack[(h$sp + 1)] = h$r8;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_475) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_475 << 8) | (4 - (h$RTS_471 & 255)))];
-          return h$RTS_470;
-        }
-        else
-        {
-          var h$RTS_472 = h$c9(h$pap_gen, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1792) - 4), h$r2, h$r3, h$r4, h$r5,
-          h$r6, h$r7, h$r8);
-          h$r1 = h$RTS_472;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_476 = h$r1.d2.d1;
-      var h$RTS_478 = (h$RTS_476 & 255);
-      if((4 === h$RTS_478))
-      {
-        return h$RTS_470;
-      }
-      else
-      {
-        if((4 > h$RTS_478))
-        {
-          var h$RTS_479 = (h$RTS_476 >> 8);
-          var h$RTS_480 = (7 - h$RTS_479);
-          switch (h$RTS_479)
-          {
-            case (0):
-              h$stack[(h$sp + 7)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 6)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 5)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 4)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 3)] = h$r6;
-            case (5):
-              h$stack[(h$sp + 2)] = h$r7;
-            case (6):
-              h$stack[(h$sp + 1)] = h$r8;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_480) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_480 << 8) | (4 - (h$RTS_476 & 255)))];
-          return h$RTS_470;
-        }
-        else
-        {
-          var h$RTS_477 = h$c9(h$pap_gen, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 1792) - 4), h$r2, h$r3, h$r4, h$r5,
-          h$r6, h$r7, h$r8);
-          h$r1 = h$RTS_477;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p8(h$r8, h$r7, h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_4_7);
-      return h$RTS_470;
-    case (5):
-      h$p8(h$r8, h$r7, h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_4_7);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_4_7_fast: unexpected closure type: " + h$RTS_470.t));
-  };
-};
-function h$ap_4_8_fast()
-{
-  var h$RTS_481 = h$r1.f;
-  switch (h$RTS_481.t)
-  {
-    case (1):
-      var h$RTS_482 = h$RTS_481.a;
-      var h$RTS_484 = (h$RTS_482 & 255);
-      if((4 === h$RTS_484))
-      {
-        return h$RTS_481;
-      }
-      else
-      {
-        if((4 > h$RTS_484))
-        {
-          var h$RTS_485 = (h$RTS_482 >> 8);
-          var h$RTS_486 = (8 - h$RTS_485);
-          switch (h$RTS_485)
-          {
-            case (0):
-              h$stack[(h$sp + 8)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 7)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 6)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 5)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 4)] = h$r6;
-            case (5):
-              h$stack[(h$sp + 3)] = h$r7;
-            case (6):
-              h$stack[(h$sp + 2)] = h$r8;
-            case (7):
-              h$stack[(h$sp + 1)] = h$r9;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_486) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_486 << 8) | (4 - (h$RTS_482 & 255)))];
-          return h$RTS_481;
-        }
-        else
-        {
-          var h$RTS_483 = h$c10(h$pap_gen, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 2048) - 4), h$r2, h$r3, h$r4,
-          h$r5, h$r6, h$r7, h$r8, h$r9);
-          h$r1 = h$RTS_483;
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_487 = h$r1.d2.d1;
-      var h$RTS_489 = (h$RTS_487 & 255);
-      if((4 === h$RTS_489))
-      {
-        return h$RTS_481;
-      }
-      else
-      {
-        if((4 > h$RTS_489))
-        {
-          var h$RTS_490 = (h$RTS_487 >> 8);
-          var h$RTS_491 = (8 - h$RTS_490);
-          switch (h$RTS_490)
-          {
-            case (0):
-              h$stack[(h$sp + 8)] = h$r2;
-            case (1):
-              h$stack[(h$sp + 7)] = h$r3;
-            case (2):
-              h$stack[(h$sp + 6)] = h$r4;
-            case (3):
-              h$stack[(h$sp + 5)] = h$r5;
-            case (4):
-              h$stack[(h$sp + 4)] = h$r6;
-            case (5):
-              h$stack[(h$sp + 3)] = h$r7;
-            case (6):
-              h$stack[(h$sp + 2)] = h$r8;
-            case (7):
-              h$stack[(h$sp + 1)] = h$r9;
-            default:
-          };
-          h$sp = ((h$sp + h$RTS_491) + 1);
-          h$stack[h$sp] = h$apply[((h$RTS_491 << 8) | (4 - (h$RTS_487 & 255)))];
-          return h$RTS_481;
-        }
-        else
-        {
-          var h$RTS_488 = h$c10(h$pap_gen, h$r1, ((((h$r1.f.t === 1) ? h$r1.f.a : h$r1.d2.d1) - 2048) - 4), h$r2, h$r3, h$r4,
-          h$r5, h$r6, h$r7, h$r8, h$r9);
-          h$r1 = h$RTS_488;
-          return h$stack[h$sp];
-        };
-      };
-    case (0):
-      h$p9(h$r9, h$r8, h$r7, h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_4_8);
-      return h$RTS_481;
-    case (5):
-      h$p9(h$r9, h$r8, h$r7, h$r6, h$r5, h$r4, h$r3, h$r2, h$ap_4_8);
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_4_8_fast: unexpected closure type: " + h$RTS_481.t));
-  };
-};
-function h$pap_0()
-{
-  var h$RTS_492 = h$r1.d1;
-  var h$RTS_493 = h$r1.d2;
-  var h$RTS_494 = h$RTS_492.f;
-  var h$RTS_495 = ((((h$RTS_494.t === 1) ? h$RTS_494.a : h$RTS_492.d2.d1) >> 8) - 0);
-  switch (h$RTS_495)
-  {
-    case (127):
-      h$regs[95] = h$regs[95];
-    case (126):
-      h$regs[94] = h$regs[94];
-    case (125):
-      h$regs[93] = h$regs[93];
-    case (124):
-      h$regs[92] = h$regs[92];
-    case (123):
-      h$regs[91] = h$regs[91];
-    case (122):
-      h$regs[90] = h$regs[90];
-    case (121):
-      h$regs[89] = h$regs[89];
-    case (120):
-      h$regs[88] = h$regs[88];
-    case (119):
-      h$regs[87] = h$regs[87];
-    case (118):
-      h$regs[86] = h$regs[86];
-    case (117):
-      h$regs[85] = h$regs[85];
-    case (116):
-      h$regs[84] = h$regs[84];
-    case (115):
-      h$regs[83] = h$regs[83];
-    case (114):
-      h$regs[82] = h$regs[82];
-    case (113):
-      h$regs[81] = h$regs[81];
-    case (112):
-      h$regs[80] = h$regs[80];
-    case (111):
-      h$regs[79] = h$regs[79];
-    case (110):
-      h$regs[78] = h$regs[78];
-    case (109):
-      h$regs[77] = h$regs[77];
-    case (108):
-      h$regs[76] = h$regs[76];
-    case (107):
-      h$regs[75] = h$regs[75];
-    case (106):
-      h$regs[74] = h$regs[74];
-    case (105):
-      h$regs[73] = h$regs[73];
-    case (104):
-      h$regs[72] = h$regs[72];
-    case (103):
-      h$regs[71] = h$regs[71];
-    case (102):
-      h$regs[70] = h$regs[70];
-    case (101):
-      h$regs[69] = h$regs[69];
-    case (100):
-      h$regs[68] = h$regs[68];
-    case (99):
-      h$regs[67] = h$regs[67];
-    case (98):
-      h$regs[66] = h$regs[66];
-    case (97):
-      h$regs[65] = h$regs[65];
-    case (96):
-      h$regs[64] = h$regs[64];
-    case (95):
-      h$regs[63] = h$regs[63];
-    case (94):
-      h$regs[62] = h$regs[62];
-    case (93):
-      h$regs[61] = h$regs[61];
-    case (92):
-      h$regs[60] = h$regs[60];
-    case (91):
-      h$regs[59] = h$regs[59];
-    case (90):
-      h$regs[58] = h$regs[58];
-    case (89):
-      h$regs[57] = h$regs[57];
-    case (88):
-      h$regs[56] = h$regs[56];
-    case (87):
-      h$regs[55] = h$regs[55];
-    case (86):
-      h$regs[54] = h$regs[54];
-    case (85):
-      h$regs[53] = h$regs[53];
-    case (84):
-      h$regs[52] = h$regs[52];
-    case (83):
-      h$regs[51] = h$regs[51];
-    case (82):
-      h$regs[50] = h$regs[50];
-    case (81):
-      h$regs[49] = h$regs[49];
-    case (80):
-      h$regs[48] = h$regs[48];
-    case (79):
-      h$regs[47] = h$regs[47];
-    case (78):
-      h$regs[46] = h$regs[46];
-    case (77):
-      h$regs[45] = h$regs[45];
-    case (76):
-      h$regs[44] = h$regs[44];
-    case (75):
-      h$regs[43] = h$regs[43];
-    case (74):
-      h$regs[42] = h$regs[42];
-    case (73):
-      h$regs[41] = h$regs[41];
-    case (72):
-      h$regs[40] = h$regs[40];
-    case (71):
-      h$regs[39] = h$regs[39];
-    case (70):
-      h$regs[38] = h$regs[38];
-    case (69):
-      h$regs[37] = h$regs[37];
-    case (68):
-      h$regs[36] = h$regs[36];
-    case (67):
-      h$regs[35] = h$regs[35];
-    case (66):
-      h$regs[34] = h$regs[34];
-    case (65):
-      h$regs[33] = h$regs[33];
-    case (64):
-      h$regs[32] = h$regs[32];
-    case (63):
-      h$regs[31] = h$regs[31];
-    case (62):
-      h$regs[30] = h$regs[30];
-    case (61):
-      h$regs[29] = h$regs[29];
-    case (60):
-      h$regs[28] = h$regs[28];
-    case (59):
-      h$regs[27] = h$regs[27];
-    case (58):
-      h$regs[26] = h$regs[26];
-    case (57):
-      h$regs[25] = h$regs[25];
-    case (56):
-      h$regs[24] = h$regs[24];
-    case (55):
-      h$regs[23] = h$regs[23];
-    case (54):
-      h$regs[22] = h$regs[22];
-    case (53):
-      h$regs[21] = h$regs[21];
-    case (52):
-      h$regs[20] = h$regs[20];
-    case (51):
-      h$regs[19] = h$regs[19];
-    case (50):
-      h$regs[18] = h$regs[18];
-    case (49):
-      h$regs[17] = h$regs[17];
-    case (48):
-      h$regs[16] = h$regs[16];
-    case (47):
-      h$regs[15] = h$regs[15];
-    case (46):
-      h$regs[14] = h$regs[14];
-    case (45):
-      h$regs[13] = h$regs[13];
-    case (44):
-      h$regs[12] = h$regs[12];
-    case (43):
-      h$regs[11] = h$regs[11];
-    case (42):
-      h$regs[10] = h$regs[10];
-    case (41):
-      h$regs[9] = h$regs[9];
-    case (40):
-      h$regs[8] = h$regs[8];
-    case (39):
-      h$regs[7] = h$regs[7];
-    case (38):
-      h$regs[6] = h$regs[6];
-    case (37):
-      h$regs[5] = h$regs[5];
-    case (36):
-      h$regs[4] = h$regs[4];
-    case (35):
-      h$regs[3] = h$regs[3];
-    case (34):
-      h$regs[2] = h$regs[2];
-    case (33):
-      h$regs[1] = h$regs[1];
-    case (32):
-      h$regs[0] = h$regs[0];
-    case (31):
-      h$r32 = h$r32;
-    case (30):
-      h$r31 = h$r31;
-    case (29):
-      h$r30 = h$r30;
-    case (28):
-      h$r29 = h$r29;
-    case (27):
-      h$r28 = h$r28;
-    case (26):
-      h$r27 = h$r27;
-    case (25):
-      h$r26 = h$r26;
-    case (24):
-      h$r25 = h$r25;
-    case (23):
-      h$r24 = h$r24;
-    case (22):
-      h$r23 = h$r23;
-    case (21):
-      h$r22 = h$r22;
-    case (20):
-      h$r21 = h$r21;
-    case (19):
-      h$r20 = h$r20;
-    case (18):
-      h$r19 = h$r19;
-    case (17):
-      h$r18 = h$r18;
-    case (16):
-      h$r17 = h$r17;
-    case (15):
-      h$r16 = h$r16;
-    case (14):
-      h$r15 = h$r15;
-    case (13):
-      h$r14 = h$r14;
-    case (12):
-      h$r13 = h$r13;
-    case (11):
-      h$r12 = h$r12;
-    case (10):
-      h$r11 = h$r11;
-    case (9):
-      h$r10 = h$r10;
-    case (8):
-      h$r9 = h$r9;
-    case (7):
-      h$r8 = h$r8;
-    case (6):
-      h$r7 = h$r7;
-    case (5):
-      h$r6 = h$r6;
-    case (4):
-      h$r5 = h$r5;
-    case (3):
-      h$r4 = h$r4;
-    case (2):
-      h$r3 = h$r3;
-    case (1):
-      h$r2 = h$r2;
-    default:
-  };
-  h$r1 = h$RTS_492;
-  return h$RTS_494;
-};
-h$o(h$pap_0, 3, 0, 2, (-1), null);
-function h$pap_1()
-{
-  var h$RTS_496 = h$r1.d1;
-  var h$RTS_497 = h$r1.d2;
-  var h$RTS_498 = h$RTS_496.f;
-  var h$RTS_499 = ((((h$RTS_498.t === 1) ? h$RTS_498.a : h$RTS_496.d2.d1) >> 8) - 1);
-  switch (h$RTS_499)
-  {
-    case (126):
-      h$regs[95] = h$regs[94];
-    case (125):
-      h$regs[94] = h$regs[93];
-    case (124):
-      h$regs[93] = h$regs[92];
-    case (123):
-      h$regs[92] = h$regs[91];
-    case (122):
-      h$regs[91] = h$regs[90];
-    case (121):
-      h$regs[90] = h$regs[89];
-    case (120):
-      h$regs[89] = h$regs[88];
-    case (119):
-      h$regs[88] = h$regs[87];
-    case (118):
-      h$regs[87] = h$regs[86];
-    case (117):
-      h$regs[86] = h$regs[85];
-    case (116):
-      h$regs[85] = h$regs[84];
-    case (115):
-      h$regs[84] = h$regs[83];
-    case (114):
-      h$regs[83] = h$regs[82];
-    case (113):
-      h$regs[82] = h$regs[81];
-    case (112):
-      h$regs[81] = h$regs[80];
-    case (111):
-      h$regs[80] = h$regs[79];
-    case (110):
-      h$regs[79] = h$regs[78];
-    case (109):
-      h$regs[78] = h$regs[77];
-    case (108):
-      h$regs[77] = h$regs[76];
-    case (107):
-      h$regs[76] = h$regs[75];
-    case (106):
-      h$regs[75] = h$regs[74];
-    case (105):
-      h$regs[74] = h$regs[73];
-    case (104):
-      h$regs[73] = h$regs[72];
-    case (103):
-      h$regs[72] = h$regs[71];
-    case (102):
-      h$regs[71] = h$regs[70];
-    case (101):
-      h$regs[70] = h$regs[69];
-    case (100):
-      h$regs[69] = h$regs[68];
-    case (99):
-      h$regs[68] = h$regs[67];
-    case (98):
-      h$regs[67] = h$regs[66];
-    case (97):
-      h$regs[66] = h$regs[65];
-    case (96):
-      h$regs[65] = h$regs[64];
-    case (95):
-      h$regs[64] = h$regs[63];
-    case (94):
-      h$regs[63] = h$regs[62];
-    case (93):
-      h$regs[62] = h$regs[61];
-    case (92):
-      h$regs[61] = h$regs[60];
-    case (91):
-      h$regs[60] = h$regs[59];
-    case (90):
-      h$regs[59] = h$regs[58];
-    case (89):
-      h$regs[58] = h$regs[57];
-    case (88):
-      h$regs[57] = h$regs[56];
-    case (87):
-      h$regs[56] = h$regs[55];
-    case (86):
-      h$regs[55] = h$regs[54];
-    case (85):
-      h$regs[54] = h$regs[53];
-    case (84):
-      h$regs[53] = h$regs[52];
-    case (83):
-      h$regs[52] = h$regs[51];
-    case (82):
-      h$regs[51] = h$regs[50];
-    case (81):
-      h$regs[50] = h$regs[49];
-    case (80):
-      h$regs[49] = h$regs[48];
-    case (79):
-      h$regs[48] = h$regs[47];
-    case (78):
-      h$regs[47] = h$regs[46];
-    case (77):
-      h$regs[46] = h$regs[45];
-    case (76):
-      h$regs[45] = h$regs[44];
-    case (75):
-      h$regs[44] = h$regs[43];
-    case (74):
-      h$regs[43] = h$regs[42];
-    case (73):
-      h$regs[42] = h$regs[41];
-    case (72):
-      h$regs[41] = h$regs[40];
-    case (71):
-      h$regs[40] = h$regs[39];
-    case (70):
-      h$regs[39] = h$regs[38];
-    case (69):
-      h$regs[38] = h$regs[37];
-    case (68):
-      h$regs[37] = h$regs[36];
-    case (67):
-      h$regs[36] = h$regs[35];
-    case (66):
-      h$regs[35] = h$regs[34];
-    case (65):
-      h$regs[34] = h$regs[33];
-    case (64):
-      h$regs[33] = h$regs[32];
-    case (63):
-      h$regs[32] = h$regs[31];
-    case (62):
-      h$regs[31] = h$regs[30];
-    case (61):
-      h$regs[30] = h$regs[29];
-    case (60):
-      h$regs[29] = h$regs[28];
-    case (59):
-      h$regs[28] = h$regs[27];
-    case (58):
-      h$regs[27] = h$regs[26];
-    case (57):
-      h$regs[26] = h$regs[25];
-    case (56):
-      h$regs[25] = h$regs[24];
-    case (55):
-      h$regs[24] = h$regs[23];
-    case (54):
-      h$regs[23] = h$regs[22];
-    case (53):
-      h$regs[22] = h$regs[21];
-    case (52):
-      h$regs[21] = h$regs[20];
-    case (51):
-      h$regs[20] = h$regs[19];
-    case (50):
-      h$regs[19] = h$regs[18];
-    case (49):
-      h$regs[18] = h$regs[17];
-    case (48):
-      h$regs[17] = h$regs[16];
-    case (47):
-      h$regs[16] = h$regs[15];
-    case (46):
-      h$regs[15] = h$regs[14];
-    case (45):
-      h$regs[14] = h$regs[13];
-    case (44):
-      h$regs[13] = h$regs[12];
-    case (43):
-      h$regs[12] = h$regs[11];
-    case (42):
-      h$regs[11] = h$regs[10];
-    case (41):
-      h$regs[10] = h$regs[9];
-    case (40):
-      h$regs[9] = h$regs[8];
-    case (39):
-      h$regs[8] = h$regs[7];
-    case (38):
-      h$regs[7] = h$regs[6];
-    case (37):
-      h$regs[6] = h$regs[5];
-    case (36):
-      h$regs[5] = h$regs[4];
-    case (35):
-      h$regs[4] = h$regs[3];
-    case (34):
-      h$regs[3] = h$regs[2];
-    case (33):
-      h$regs[2] = h$regs[1];
-    case (32):
-      h$regs[1] = h$regs[0];
-    case (31):
-      h$regs[0] = h$r32;
-    case (30):
-      h$r32 = h$r31;
-    case (29):
-      h$r31 = h$r30;
-    case (28):
-      h$r30 = h$r29;
-    case (27):
-      h$r29 = h$r28;
-    case (26):
-      h$r28 = h$r27;
-    case (25):
-      h$r27 = h$r26;
-    case (24):
-      h$r26 = h$r25;
-    case (23):
-      h$r25 = h$r24;
-    case (22):
-      h$r24 = h$r23;
-    case (21):
-      h$r23 = h$r22;
-    case (20):
-      h$r22 = h$r21;
-    case (19):
-      h$r21 = h$r20;
-    case (18):
-      h$r20 = h$r19;
-    case (17):
-      h$r19 = h$r18;
-    case (16):
-      h$r18 = h$r17;
-    case (15):
-      h$r17 = h$r16;
-    case (14):
-      h$r16 = h$r15;
-    case (13):
-      h$r15 = h$r14;
-    case (12):
-      h$r14 = h$r13;
-    case (11):
-      h$r13 = h$r12;
-    case (10):
-      h$r12 = h$r11;
-    case (9):
-      h$r11 = h$r10;
-    case (8):
-      h$r10 = h$r9;
-    case (7):
-      h$r9 = h$r8;
-    case (6):
-      h$r8 = h$r7;
-    case (5):
-      h$r7 = h$r6;
-    case (4):
-      h$r6 = h$r5;
-    case (3):
-      h$r5 = h$r4;
-    case (2):
-      h$r4 = h$r3;
-    case (1):
-      h$r3 = h$r2;
-    default:
-  };
-  h$r2 = h$RTS_497.d2;
-  h$r1 = h$RTS_496;
-  return h$RTS_498;
-};
-h$o(h$pap_1, 3, 0, 3, (-1), null);
-function h$pap_2()
-{
-  var h$RTS_500 = h$r1.d1;
-  var h$RTS_501 = h$r1.d2;
-  var h$RTS_502 = h$RTS_500.f;
-  var h$RTS_503 = ((((h$RTS_502.t === 1) ? h$RTS_502.a : h$RTS_500.d2.d1) >> 8) - 2);
-  switch (h$RTS_503)
-  {
-    case (125):
-      h$regs[95] = h$regs[93];
-    case (124):
-      h$regs[94] = h$regs[92];
-    case (123):
-      h$regs[93] = h$regs[91];
-    case (122):
-      h$regs[92] = h$regs[90];
-    case (121):
-      h$regs[91] = h$regs[89];
-    case (120):
-      h$regs[90] = h$regs[88];
-    case (119):
-      h$regs[89] = h$regs[87];
-    case (118):
-      h$regs[88] = h$regs[86];
-    case (117):
-      h$regs[87] = h$regs[85];
-    case (116):
-      h$regs[86] = h$regs[84];
-    case (115):
-      h$regs[85] = h$regs[83];
-    case (114):
-      h$regs[84] = h$regs[82];
-    case (113):
-      h$regs[83] = h$regs[81];
-    case (112):
-      h$regs[82] = h$regs[80];
-    case (111):
-      h$regs[81] = h$regs[79];
-    case (110):
-      h$regs[80] = h$regs[78];
-    case (109):
-      h$regs[79] = h$regs[77];
-    case (108):
-      h$regs[78] = h$regs[76];
-    case (107):
-      h$regs[77] = h$regs[75];
-    case (106):
-      h$regs[76] = h$regs[74];
-    case (105):
-      h$regs[75] = h$regs[73];
-    case (104):
-      h$regs[74] = h$regs[72];
-    case (103):
-      h$regs[73] = h$regs[71];
-    case (102):
-      h$regs[72] = h$regs[70];
-    case (101):
-      h$regs[71] = h$regs[69];
-    case (100):
-      h$regs[70] = h$regs[68];
-    case (99):
-      h$regs[69] = h$regs[67];
-    case (98):
-      h$regs[68] = h$regs[66];
-    case (97):
-      h$regs[67] = h$regs[65];
-    case (96):
-      h$regs[66] = h$regs[64];
-    case (95):
-      h$regs[65] = h$regs[63];
-    case (94):
-      h$regs[64] = h$regs[62];
-    case (93):
-      h$regs[63] = h$regs[61];
-    case (92):
-      h$regs[62] = h$regs[60];
-    case (91):
-      h$regs[61] = h$regs[59];
-    case (90):
-      h$regs[60] = h$regs[58];
-    case (89):
-      h$regs[59] = h$regs[57];
-    case (88):
-      h$regs[58] = h$regs[56];
-    case (87):
-      h$regs[57] = h$regs[55];
-    case (86):
-      h$regs[56] = h$regs[54];
-    case (85):
-      h$regs[55] = h$regs[53];
-    case (84):
-      h$regs[54] = h$regs[52];
-    case (83):
-      h$regs[53] = h$regs[51];
-    case (82):
-      h$regs[52] = h$regs[50];
-    case (81):
-      h$regs[51] = h$regs[49];
-    case (80):
-      h$regs[50] = h$regs[48];
-    case (79):
-      h$regs[49] = h$regs[47];
-    case (78):
-      h$regs[48] = h$regs[46];
-    case (77):
-      h$regs[47] = h$regs[45];
-    case (76):
-      h$regs[46] = h$regs[44];
-    case (75):
-      h$regs[45] = h$regs[43];
-    case (74):
-      h$regs[44] = h$regs[42];
-    case (73):
-      h$regs[43] = h$regs[41];
-    case (72):
-      h$regs[42] = h$regs[40];
-    case (71):
-      h$regs[41] = h$regs[39];
-    case (70):
-      h$regs[40] = h$regs[38];
-    case (69):
-      h$regs[39] = h$regs[37];
-    case (68):
-      h$regs[38] = h$regs[36];
-    case (67):
-      h$regs[37] = h$regs[35];
-    case (66):
-      h$regs[36] = h$regs[34];
-    case (65):
-      h$regs[35] = h$regs[33];
-    case (64):
-      h$regs[34] = h$regs[32];
-    case (63):
-      h$regs[33] = h$regs[31];
-    case (62):
-      h$regs[32] = h$regs[30];
-    case (61):
-      h$regs[31] = h$regs[29];
-    case (60):
-      h$regs[30] = h$regs[28];
-    case (59):
-      h$regs[29] = h$regs[27];
-    case (58):
-      h$regs[28] = h$regs[26];
-    case (57):
-      h$regs[27] = h$regs[25];
-    case (56):
-      h$regs[26] = h$regs[24];
-    case (55):
-      h$regs[25] = h$regs[23];
-    case (54):
-      h$regs[24] = h$regs[22];
-    case (53):
-      h$regs[23] = h$regs[21];
-    case (52):
-      h$regs[22] = h$regs[20];
-    case (51):
-      h$regs[21] = h$regs[19];
-    case (50):
-      h$regs[20] = h$regs[18];
-    case (49):
-      h$regs[19] = h$regs[17];
-    case (48):
-      h$regs[18] = h$regs[16];
-    case (47):
-      h$regs[17] = h$regs[15];
-    case (46):
-      h$regs[16] = h$regs[14];
-    case (45):
-      h$regs[15] = h$regs[13];
-    case (44):
-      h$regs[14] = h$regs[12];
-    case (43):
-      h$regs[13] = h$regs[11];
-    case (42):
-      h$regs[12] = h$regs[10];
-    case (41):
-      h$regs[11] = h$regs[9];
-    case (40):
-      h$regs[10] = h$regs[8];
-    case (39):
-      h$regs[9] = h$regs[7];
-    case (38):
-      h$regs[8] = h$regs[6];
-    case (37):
-      h$regs[7] = h$regs[5];
-    case (36):
-      h$regs[6] = h$regs[4];
-    case (35):
-      h$regs[5] = h$regs[3];
-    case (34):
-      h$regs[4] = h$regs[2];
-    case (33):
-      h$regs[3] = h$regs[1];
-    case (32):
-      h$regs[2] = h$regs[0];
-    case (31):
-      h$regs[1] = h$r32;
-    case (30):
-      h$regs[0] = h$r31;
-    case (29):
-      h$r32 = h$r30;
-    case (28):
-      h$r31 = h$r29;
-    case (27):
-      h$r30 = h$r28;
-    case (26):
-      h$r29 = h$r27;
-    case (25):
-      h$r28 = h$r26;
-    case (24):
-      h$r27 = h$r25;
-    case (23):
-      h$r26 = h$r24;
-    case (22):
-      h$r25 = h$r23;
-    case (21):
-      h$r24 = h$r22;
-    case (20):
-      h$r23 = h$r21;
-    case (19):
-      h$r22 = h$r20;
-    case (18):
-      h$r21 = h$r19;
-    case (17):
-      h$r20 = h$r18;
-    case (16):
-      h$r19 = h$r17;
-    case (15):
-      h$r18 = h$r16;
-    case (14):
-      h$r17 = h$r15;
-    case (13):
-      h$r16 = h$r14;
-    case (12):
-      h$r15 = h$r13;
-    case (11):
-      h$r14 = h$r12;
-    case (10):
-      h$r13 = h$r11;
-    case (9):
-      h$r12 = h$r10;
-    case (8):
-      h$r11 = h$r9;
-    case (7):
-      h$r10 = h$r8;
-    case (6):
-      h$r9 = h$r7;
-    case (5):
-      h$r8 = h$r6;
-    case (4):
-      h$r7 = h$r5;
-    case (3):
-      h$r6 = h$r4;
-    case (2):
-      h$r5 = h$r3;
-    case (1):
-      h$r4 = h$r2;
-    default:
-  };
-  h$r2 = h$RTS_501.d2;
-  h$r3 = h$RTS_501.d3;
-  h$r1 = h$RTS_500;
-  return h$RTS_502;
-};
-h$o(h$pap_2, 3, 0, 4, (-1), null);
-function h$pap_3()
-{
-  var h$RTS_504 = h$r1.d1;
-  var h$RTS_505 = h$r1.d2;
-  var h$RTS_506 = h$RTS_504.f;
-  var h$RTS_507 = ((((h$RTS_506.t === 1) ? h$RTS_506.a : h$RTS_504.d2.d1) >> 8) - 3);
-  switch (h$RTS_507)
-  {
-    case (124):
-      h$regs[95] = h$regs[92];
-    case (123):
-      h$regs[94] = h$regs[91];
-    case (122):
-      h$regs[93] = h$regs[90];
-    case (121):
-      h$regs[92] = h$regs[89];
-    case (120):
-      h$regs[91] = h$regs[88];
-    case (119):
-      h$regs[90] = h$regs[87];
-    case (118):
-      h$regs[89] = h$regs[86];
-    case (117):
-      h$regs[88] = h$regs[85];
-    case (116):
-      h$regs[87] = h$regs[84];
-    case (115):
-      h$regs[86] = h$regs[83];
-    case (114):
-      h$regs[85] = h$regs[82];
-    case (113):
-      h$regs[84] = h$regs[81];
-    case (112):
-      h$regs[83] = h$regs[80];
-    case (111):
-      h$regs[82] = h$regs[79];
-    case (110):
-      h$regs[81] = h$regs[78];
-    case (109):
-      h$regs[80] = h$regs[77];
-    case (108):
-      h$regs[79] = h$regs[76];
-    case (107):
-      h$regs[78] = h$regs[75];
-    case (106):
-      h$regs[77] = h$regs[74];
-    case (105):
-      h$regs[76] = h$regs[73];
-    case (104):
-      h$regs[75] = h$regs[72];
-    case (103):
-      h$regs[74] = h$regs[71];
-    case (102):
-      h$regs[73] = h$regs[70];
-    case (101):
-      h$regs[72] = h$regs[69];
-    case (100):
-      h$regs[71] = h$regs[68];
-    case (99):
-      h$regs[70] = h$regs[67];
-    case (98):
-      h$regs[69] = h$regs[66];
-    case (97):
-      h$regs[68] = h$regs[65];
-    case (96):
-      h$regs[67] = h$regs[64];
-    case (95):
-      h$regs[66] = h$regs[63];
-    case (94):
-      h$regs[65] = h$regs[62];
-    case (93):
-      h$regs[64] = h$regs[61];
-    case (92):
-      h$regs[63] = h$regs[60];
-    case (91):
-      h$regs[62] = h$regs[59];
-    case (90):
-      h$regs[61] = h$regs[58];
-    case (89):
-      h$regs[60] = h$regs[57];
-    case (88):
-      h$regs[59] = h$regs[56];
-    case (87):
-      h$regs[58] = h$regs[55];
-    case (86):
-      h$regs[57] = h$regs[54];
-    case (85):
-      h$regs[56] = h$regs[53];
-    case (84):
-      h$regs[55] = h$regs[52];
-    case (83):
-      h$regs[54] = h$regs[51];
-    case (82):
-      h$regs[53] = h$regs[50];
-    case (81):
-      h$regs[52] = h$regs[49];
-    case (80):
-      h$regs[51] = h$regs[48];
-    case (79):
-      h$regs[50] = h$regs[47];
-    case (78):
-      h$regs[49] = h$regs[46];
-    case (77):
-      h$regs[48] = h$regs[45];
-    case (76):
-      h$regs[47] = h$regs[44];
-    case (75):
-      h$regs[46] = h$regs[43];
-    case (74):
-      h$regs[45] = h$regs[42];
-    case (73):
-      h$regs[44] = h$regs[41];
-    case (72):
-      h$regs[43] = h$regs[40];
-    case (71):
-      h$regs[42] = h$regs[39];
-    case (70):
-      h$regs[41] = h$regs[38];
-    case (69):
-      h$regs[40] = h$regs[37];
-    case (68):
-      h$regs[39] = h$regs[36];
-    case (67):
-      h$regs[38] = h$regs[35];
-    case (66):
-      h$regs[37] = h$regs[34];
-    case (65):
-      h$regs[36] = h$regs[33];
-    case (64):
-      h$regs[35] = h$regs[32];
-    case (63):
-      h$regs[34] = h$regs[31];
-    case (62):
-      h$regs[33] = h$regs[30];
-    case (61):
-      h$regs[32] = h$regs[29];
-    case (60):
-      h$regs[31] = h$regs[28];
-    case (59):
-      h$regs[30] = h$regs[27];
-    case (58):
-      h$regs[29] = h$regs[26];
-    case (57):
-      h$regs[28] = h$regs[25];
-    case (56):
-      h$regs[27] = h$regs[24];
-    case (55):
-      h$regs[26] = h$regs[23];
-    case (54):
-      h$regs[25] = h$regs[22];
-    case (53):
-      h$regs[24] = h$regs[21];
-    case (52):
-      h$regs[23] = h$regs[20];
-    case (51):
-      h$regs[22] = h$regs[19];
-    case (50):
-      h$regs[21] = h$regs[18];
-    case (49):
-      h$regs[20] = h$regs[17];
-    case (48):
-      h$regs[19] = h$regs[16];
-    case (47):
-      h$regs[18] = h$regs[15];
-    case (46):
-      h$regs[17] = h$regs[14];
-    case (45):
-      h$regs[16] = h$regs[13];
-    case (44):
-      h$regs[15] = h$regs[12];
-    case (43):
-      h$regs[14] = h$regs[11];
-    case (42):
-      h$regs[13] = h$regs[10];
-    case (41):
-      h$regs[12] = h$regs[9];
-    case (40):
-      h$regs[11] = h$regs[8];
-    case (39):
-      h$regs[10] = h$regs[7];
-    case (38):
-      h$regs[9] = h$regs[6];
-    case (37):
-      h$regs[8] = h$regs[5];
-    case (36):
-      h$regs[7] = h$regs[4];
-    case (35):
-      h$regs[6] = h$regs[3];
-    case (34):
-      h$regs[5] = h$regs[2];
-    case (33):
-      h$regs[4] = h$regs[1];
-    case (32):
-      h$regs[3] = h$regs[0];
-    case (31):
-      h$regs[2] = h$r32;
-    case (30):
-      h$regs[1] = h$r31;
-    case (29):
-      h$regs[0] = h$r30;
-    case (28):
-      h$r32 = h$r29;
-    case (27):
-      h$r31 = h$r28;
-    case (26):
-      h$r30 = h$r27;
-    case (25):
-      h$r29 = h$r26;
-    case (24):
-      h$r28 = h$r25;
-    case (23):
-      h$r27 = h$r24;
-    case (22):
-      h$r26 = h$r23;
-    case (21):
-      h$r25 = h$r22;
-    case (20):
-      h$r24 = h$r21;
-    case (19):
-      h$r23 = h$r20;
-    case (18):
-      h$r22 = h$r19;
-    case (17):
-      h$r21 = h$r18;
-    case (16):
-      h$r20 = h$r17;
-    case (15):
-      h$r19 = h$r16;
-    case (14):
-      h$r18 = h$r15;
-    case (13):
-      h$r17 = h$r14;
-    case (12):
-      h$r16 = h$r13;
-    case (11):
-      h$r15 = h$r12;
-    case (10):
-      h$r14 = h$r11;
-    case (9):
-      h$r13 = h$r10;
-    case (8):
-      h$r12 = h$r9;
-    case (7):
-      h$r11 = h$r8;
-    case (6):
-      h$r10 = h$r7;
-    case (5):
-      h$r9 = h$r6;
-    case (4):
-      h$r8 = h$r5;
-    case (3):
-      h$r7 = h$r4;
-    case (2):
-      h$r6 = h$r3;
-    case (1):
-      h$r5 = h$r2;
-    default:
-  };
-  h$r2 = h$RTS_505.d2;
-  h$r3 = h$RTS_505.d3;
-  h$r4 = h$RTS_505.d4;
-  h$r1 = h$RTS_504;
-  return h$RTS_506;
-};
-h$o(h$pap_3, 3, 0, 5, (-1), null);
-function h$pap_4()
-{
-  var h$RTS_508 = h$r1.d1;
-  var h$RTS_509 = h$r1.d2;
-  var h$RTS_510 = h$RTS_508.f;
-  var h$RTS_511 = ((((h$RTS_510.t === 1) ? h$RTS_510.a : h$RTS_508.d2.d1) >> 8) - 4);
-  switch (h$RTS_511)
-  {
-    case (123):
-      h$regs[95] = h$regs[91];
-    case (122):
-      h$regs[94] = h$regs[90];
-    case (121):
-      h$regs[93] = h$regs[89];
-    case (120):
-      h$regs[92] = h$regs[88];
-    case (119):
-      h$regs[91] = h$regs[87];
-    case (118):
-      h$regs[90] = h$regs[86];
-    case (117):
-      h$regs[89] = h$regs[85];
-    case (116):
-      h$regs[88] = h$regs[84];
-    case (115):
-      h$regs[87] = h$regs[83];
-    case (114):
-      h$regs[86] = h$regs[82];
-    case (113):
-      h$regs[85] = h$regs[81];
-    case (112):
-      h$regs[84] = h$regs[80];
-    case (111):
-      h$regs[83] = h$regs[79];
-    case (110):
-      h$regs[82] = h$regs[78];
-    case (109):
-      h$regs[81] = h$regs[77];
-    case (108):
-      h$regs[80] = h$regs[76];
-    case (107):
-      h$regs[79] = h$regs[75];
-    case (106):
-      h$regs[78] = h$regs[74];
-    case (105):
-      h$regs[77] = h$regs[73];
-    case (104):
-      h$regs[76] = h$regs[72];
-    case (103):
-      h$regs[75] = h$regs[71];
-    case (102):
-      h$regs[74] = h$regs[70];
-    case (101):
-      h$regs[73] = h$regs[69];
-    case (100):
-      h$regs[72] = h$regs[68];
-    case (99):
-      h$regs[71] = h$regs[67];
-    case (98):
-      h$regs[70] = h$regs[66];
-    case (97):
-      h$regs[69] = h$regs[65];
-    case (96):
-      h$regs[68] = h$regs[64];
-    case (95):
-      h$regs[67] = h$regs[63];
-    case (94):
-      h$regs[66] = h$regs[62];
-    case (93):
-      h$regs[65] = h$regs[61];
-    case (92):
-      h$regs[64] = h$regs[60];
-    case (91):
-      h$regs[63] = h$regs[59];
-    case (90):
-      h$regs[62] = h$regs[58];
-    case (89):
-      h$regs[61] = h$regs[57];
-    case (88):
-      h$regs[60] = h$regs[56];
-    case (87):
-      h$regs[59] = h$regs[55];
-    case (86):
-      h$regs[58] = h$regs[54];
-    case (85):
-      h$regs[57] = h$regs[53];
-    case (84):
-      h$regs[56] = h$regs[52];
-    case (83):
-      h$regs[55] = h$regs[51];
-    case (82):
-      h$regs[54] = h$regs[50];
-    case (81):
-      h$regs[53] = h$regs[49];
-    case (80):
-      h$regs[52] = h$regs[48];
-    case (79):
-      h$regs[51] = h$regs[47];
-    case (78):
-      h$regs[50] = h$regs[46];
-    case (77):
-      h$regs[49] = h$regs[45];
-    case (76):
-      h$regs[48] = h$regs[44];
-    case (75):
-      h$regs[47] = h$regs[43];
-    case (74):
-      h$regs[46] = h$regs[42];
-    case (73):
-      h$regs[45] = h$regs[41];
-    case (72):
-      h$regs[44] = h$regs[40];
-    case (71):
-      h$regs[43] = h$regs[39];
-    case (70):
-      h$regs[42] = h$regs[38];
-    case (69):
-      h$regs[41] = h$regs[37];
-    case (68):
-      h$regs[40] = h$regs[36];
-    case (67):
-      h$regs[39] = h$regs[35];
-    case (66):
-      h$regs[38] = h$regs[34];
-    case (65):
-      h$regs[37] = h$regs[33];
-    case (64):
-      h$regs[36] = h$regs[32];
-    case (63):
-      h$regs[35] = h$regs[31];
-    case (62):
-      h$regs[34] = h$regs[30];
-    case (61):
-      h$regs[33] = h$regs[29];
-    case (60):
-      h$regs[32] = h$regs[28];
-    case (59):
-      h$regs[31] = h$regs[27];
-    case (58):
-      h$regs[30] = h$regs[26];
-    case (57):
-      h$regs[29] = h$regs[25];
-    case (56):
-      h$regs[28] = h$regs[24];
-    case (55):
-      h$regs[27] = h$regs[23];
-    case (54):
-      h$regs[26] = h$regs[22];
-    case (53):
-      h$regs[25] = h$regs[21];
-    case (52):
-      h$regs[24] = h$regs[20];
-    case (51):
-      h$regs[23] = h$regs[19];
-    case (50):
-      h$regs[22] = h$regs[18];
-    case (49):
-      h$regs[21] = h$regs[17];
-    case (48):
-      h$regs[20] = h$regs[16];
-    case (47):
-      h$regs[19] = h$regs[15];
-    case (46):
-      h$regs[18] = h$regs[14];
-    case (45):
-      h$regs[17] = h$regs[13];
-    case (44):
-      h$regs[16] = h$regs[12];
-    case (43):
-      h$regs[15] = h$regs[11];
-    case (42):
-      h$regs[14] = h$regs[10];
-    case (41):
-      h$regs[13] = h$regs[9];
-    case (40):
-      h$regs[12] = h$regs[8];
-    case (39):
-      h$regs[11] = h$regs[7];
-    case (38):
-      h$regs[10] = h$regs[6];
-    case (37):
-      h$regs[9] = h$regs[5];
-    case (36):
-      h$regs[8] = h$regs[4];
-    case (35):
-      h$regs[7] = h$regs[3];
-    case (34):
-      h$regs[6] = h$regs[2];
-    case (33):
-      h$regs[5] = h$regs[1];
-    case (32):
-      h$regs[4] = h$regs[0];
-    case (31):
-      h$regs[3] = h$r32;
-    case (30):
-      h$regs[2] = h$r31;
-    case (29):
-      h$regs[1] = h$r30;
-    case (28):
-      h$regs[0] = h$r29;
-    case (27):
-      h$r32 = h$r28;
-    case (26):
-      h$r31 = h$r27;
-    case (25):
-      h$r30 = h$r26;
-    case (24):
-      h$r29 = h$r25;
-    case (23):
-      h$r28 = h$r24;
-    case (22):
-      h$r27 = h$r23;
-    case (21):
-      h$r26 = h$r22;
-    case (20):
-      h$r25 = h$r21;
-    case (19):
-      h$r24 = h$r20;
-    case (18):
-      h$r23 = h$r19;
-    case (17):
-      h$r22 = h$r18;
-    case (16):
-      h$r21 = h$r17;
-    case (15):
-      h$r20 = h$r16;
-    case (14):
-      h$r19 = h$r15;
-    case (13):
-      h$r18 = h$r14;
-    case (12):
-      h$r17 = h$r13;
-    case (11):
-      h$r16 = h$r12;
-    case (10):
-      h$r15 = h$r11;
-    case (9):
-      h$r14 = h$r10;
-    case (8):
-      h$r13 = h$r9;
-    case (7):
-      h$r12 = h$r8;
-    case (6):
-      h$r11 = h$r7;
-    case (5):
-      h$r10 = h$r6;
-    case (4):
-      h$r9 = h$r5;
-    case (3):
-      h$r8 = h$r4;
-    case (2):
-      h$r7 = h$r3;
-    case (1):
-      h$r6 = h$r2;
-    default:
-  };
-  h$r2 = h$RTS_509.d2;
-  h$r3 = h$RTS_509.d3;
-  h$r4 = h$RTS_509.d4;
-  h$r5 = h$RTS_509.d5;
-  h$r1 = h$RTS_508;
-  return h$RTS_510;
-};
-h$o(h$pap_4, 3, 0, 6, (-1), null);
-function h$pap_5()
-{
-  var h$RTS_512 = h$r1.d1;
-  var h$RTS_513 = h$r1.d2;
-  var h$RTS_514 = h$RTS_512.f;
-  var h$RTS_515 = ((((h$RTS_514.t === 1) ? h$RTS_514.a : h$RTS_512.d2.d1) >> 8) - 5);
-  switch (h$RTS_515)
-  {
-    case (122):
-      h$regs[95] = h$regs[90];
-    case (121):
-      h$regs[94] = h$regs[89];
-    case (120):
-      h$regs[93] = h$regs[88];
-    case (119):
-      h$regs[92] = h$regs[87];
-    case (118):
-      h$regs[91] = h$regs[86];
-    case (117):
-      h$regs[90] = h$regs[85];
-    case (116):
-      h$regs[89] = h$regs[84];
-    case (115):
-      h$regs[88] = h$regs[83];
-    case (114):
-      h$regs[87] = h$regs[82];
-    case (113):
-      h$regs[86] = h$regs[81];
-    case (112):
-      h$regs[85] = h$regs[80];
-    case (111):
-      h$regs[84] = h$regs[79];
-    case (110):
-      h$regs[83] = h$regs[78];
-    case (109):
-      h$regs[82] = h$regs[77];
-    case (108):
-      h$regs[81] = h$regs[76];
-    case (107):
-      h$regs[80] = h$regs[75];
-    case (106):
-      h$regs[79] = h$regs[74];
-    case (105):
-      h$regs[78] = h$regs[73];
-    case (104):
-      h$regs[77] = h$regs[72];
-    case (103):
-      h$regs[76] = h$regs[71];
-    case (102):
-      h$regs[75] = h$regs[70];
-    case (101):
-      h$regs[74] = h$regs[69];
-    case (100):
-      h$regs[73] = h$regs[68];
-    case (99):
-      h$regs[72] = h$regs[67];
-    case (98):
-      h$regs[71] = h$regs[66];
-    case (97):
-      h$regs[70] = h$regs[65];
-    case (96):
-      h$regs[69] = h$regs[64];
-    case (95):
-      h$regs[68] = h$regs[63];
-    case (94):
-      h$regs[67] = h$regs[62];
-    case (93):
-      h$regs[66] = h$regs[61];
-    case (92):
-      h$regs[65] = h$regs[60];
-    case (91):
-      h$regs[64] = h$regs[59];
-    case (90):
-      h$regs[63] = h$regs[58];
-    case (89):
-      h$regs[62] = h$regs[57];
-    case (88):
-      h$regs[61] = h$regs[56];
-    case (87):
-      h$regs[60] = h$regs[55];
-    case (86):
-      h$regs[59] = h$regs[54];
-    case (85):
-      h$regs[58] = h$regs[53];
-    case (84):
-      h$regs[57] = h$regs[52];
-    case (83):
-      h$regs[56] = h$regs[51];
-    case (82):
-      h$regs[55] = h$regs[50];
-    case (81):
-      h$regs[54] = h$regs[49];
-    case (80):
-      h$regs[53] = h$regs[48];
-    case (79):
-      h$regs[52] = h$regs[47];
-    case (78):
-      h$regs[51] = h$regs[46];
-    case (77):
-      h$regs[50] = h$regs[45];
-    case (76):
-      h$regs[49] = h$regs[44];
-    case (75):
-      h$regs[48] = h$regs[43];
-    case (74):
-      h$regs[47] = h$regs[42];
-    case (73):
-      h$regs[46] = h$regs[41];
-    case (72):
-      h$regs[45] = h$regs[40];
-    case (71):
-      h$regs[44] = h$regs[39];
-    case (70):
-      h$regs[43] = h$regs[38];
-    case (69):
-      h$regs[42] = h$regs[37];
-    case (68):
-      h$regs[41] = h$regs[36];
-    case (67):
-      h$regs[40] = h$regs[35];
-    case (66):
-      h$regs[39] = h$regs[34];
-    case (65):
-      h$regs[38] = h$regs[33];
-    case (64):
-      h$regs[37] = h$regs[32];
-    case (63):
-      h$regs[36] = h$regs[31];
-    case (62):
-      h$regs[35] = h$regs[30];
-    case (61):
-      h$regs[34] = h$regs[29];
-    case (60):
-      h$regs[33] = h$regs[28];
-    case (59):
-      h$regs[32] = h$regs[27];
-    case (58):
-      h$regs[31] = h$regs[26];
-    case (57):
-      h$regs[30] = h$regs[25];
-    case (56):
-      h$regs[29] = h$regs[24];
-    case (55):
-      h$regs[28] = h$regs[23];
-    case (54):
-      h$regs[27] = h$regs[22];
-    case (53):
-      h$regs[26] = h$regs[21];
-    case (52):
-      h$regs[25] = h$regs[20];
-    case (51):
-      h$regs[24] = h$regs[19];
-    case (50):
-      h$regs[23] = h$regs[18];
-    case (49):
-      h$regs[22] = h$regs[17];
-    case (48):
-      h$regs[21] = h$regs[16];
-    case (47):
-      h$regs[20] = h$regs[15];
-    case (46):
-      h$regs[19] = h$regs[14];
-    case (45):
-      h$regs[18] = h$regs[13];
-    case (44):
-      h$regs[17] = h$regs[12];
-    case (43):
-      h$regs[16] = h$regs[11];
-    case (42):
-      h$regs[15] = h$regs[10];
-    case (41):
-      h$regs[14] = h$regs[9];
-    case (40):
-      h$regs[13] = h$regs[8];
-    case (39):
-      h$regs[12] = h$regs[7];
-    case (38):
-      h$regs[11] = h$regs[6];
-    case (37):
-      h$regs[10] = h$regs[5];
-    case (36):
-      h$regs[9] = h$regs[4];
-    case (35):
-      h$regs[8] = h$regs[3];
-    case (34):
-      h$regs[7] = h$regs[2];
-    case (33):
-      h$regs[6] = h$regs[1];
-    case (32):
-      h$regs[5] = h$regs[0];
-    case (31):
-      h$regs[4] = h$r32;
-    case (30):
-      h$regs[3] = h$r31;
-    case (29):
-      h$regs[2] = h$r30;
-    case (28):
-      h$regs[1] = h$r29;
-    case (27):
-      h$regs[0] = h$r28;
-    case (26):
-      h$r32 = h$r27;
-    case (25):
-      h$r31 = h$r26;
-    case (24):
-      h$r30 = h$r25;
-    case (23):
-      h$r29 = h$r24;
-    case (22):
-      h$r28 = h$r23;
-    case (21):
-      h$r27 = h$r22;
-    case (20):
-      h$r26 = h$r21;
-    case (19):
-      h$r25 = h$r20;
-    case (18):
-      h$r24 = h$r19;
-    case (17):
-      h$r23 = h$r18;
-    case (16):
-      h$r22 = h$r17;
-    case (15):
-      h$r21 = h$r16;
-    case (14):
-      h$r20 = h$r15;
-    case (13):
-      h$r19 = h$r14;
-    case (12):
-      h$r18 = h$r13;
-    case (11):
-      h$r17 = h$r12;
-    case (10):
-      h$r16 = h$r11;
-    case (9):
-      h$r15 = h$r10;
-    case (8):
-      h$r14 = h$r9;
-    case (7):
-      h$r13 = h$r8;
-    case (6):
-      h$r12 = h$r7;
-    case (5):
-      h$r11 = h$r6;
-    case (4):
-      h$r10 = h$r5;
-    case (3):
-      h$r9 = h$r4;
-    case (2):
-      h$r8 = h$r3;
-    case (1):
-      h$r7 = h$r2;
-    default:
-  };
-  h$r2 = h$RTS_513.d2;
-  h$r3 = h$RTS_513.d3;
-  h$r4 = h$RTS_513.d4;
-  h$r5 = h$RTS_513.d5;
-  h$r6 = h$RTS_513.d6;
-  h$r1 = h$RTS_512;
-  return h$RTS_514;
-};
-h$o(h$pap_5, 3, 0, 7, (-1), null);
-function h$pap_6()
-{
-  var h$RTS_516 = h$r1.d1;
-  var h$RTS_517 = h$r1.d2;
-  var h$RTS_518 = h$RTS_516.f;
-  var h$RTS_519 = ((((h$RTS_518.t === 1) ? h$RTS_518.a : h$RTS_516.d2.d1) >> 8) - 6);
-  switch (h$RTS_519)
-  {
-    case (121):
-      h$regs[95] = h$regs[89];
-    case (120):
-      h$regs[94] = h$regs[88];
-    case (119):
-      h$regs[93] = h$regs[87];
-    case (118):
-      h$regs[92] = h$regs[86];
-    case (117):
-      h$regs[91] = h$regs[85];
-    case (116):
-      h$regs[90] = h$regs[84];
-    case (115):
-      h$regs[89] = h$regs[83];
-    case (114):
-      h$regs[88] = h$regs[82];
-    case (113):
-      h$regs[87] = h$regs[81];
-    case (112):
-      h$regs[86] = h$regs[80];
-    case (111):
-      h$regs[85] = h$regs[79];
-    case (110):
-      h$regs[84] = h$regs[78];
-    case (109):
-      h$regs[83] = h$regs[77];
-    case (108):
-      h$regs[82] = h$regs[76];
-    case (107):
-      h$regs[81] = h$regs[75];
-    case (106):
-      h$regs[80] = h$regs[74];
-    case (105):
-      h$regs[79] = h$regs[73];
-    case (104):
-      h$regs[78] = h$regs[72];
-    case (103):
-      h$regs[77] = h$regs[71];
-    case (102):
-      h$regs[76] = h$regs[70];
-    case (101):
-      h$regs[75] = h$regs[69];
-    case (100):
-      h$regs[74] = h$regs[68];
-    case (99):
-      h$regs[73] = h$regs[67];
-    case (98):
-      h$regs[72] = h$regs[66];
-    case (97):
-      h$regs[71] = h$regs[65];
-    case (96):
-      h$regs[70] = h$regs[64];
-    case (95):
-      h$regs[69] = h$regs[63];
-    case (94):
-      h$regs[68] = h$regs[62];
-    case (93):
-      h$regs[67] = h$regs[61];
-    case (92):
-      h$regs[66] = h$regs[60];
-    case (91):
-      h$regs[65] = h$regs[59];
-    case (90):
-      h$regs[64] = h$regs[58];
-    case (89):
-      h$regs[63] = h$regs[57];
-    case (88):
-      h$regs[62] = h$regs[56];
-    case (87):
-      h$regs[61] = h$regs[55];
-    case (86):
-      h$regs[60] = h$regs[54];
-    case (85):
-      h$regs[59] = h$regs[53];
-    case (84):
-      h$regs[58] = h$regs[52];
-    case (83):
-      h$regs[57] = h$regs[51];
-    case (82):
-      h$regs[56] = h$regs[50];
-    case (81):
-      h$regs[55] = h$regs[49];
-    case (80):
-      h$regs[54] = h$regs[48];
-    case (79):
-      h$regs[53] = h$regs[47];
-    case (78):
-      h$regs[52] = h$regs[46];
-    case (77):
-      h$regs[51] = h$regs[45];
-    case (76):
-      h$regs[50] = h$regs[44];
-    case (75):
-      h$regs[49] = h$regs[43];
-    case (74):
-      h$regs[48] = h$regs[42];
-    case (73):
-      h$regs[47] = h$regs[41];
-    case (72):
-      h$regs[46] = h$regs[40];
-    case (71):
-      h$regs[45] = h$regs[39];
-    case (70):
-      h$regs[44] = h$regs[38];
-    case (69):
-      h$regs[43] = h$regs[37];
-    case (68):
-      h$regs[42] = h$regs[36];
-    case (67):
-      h$regs[41] = h$regs[35];
-    case (66):
-      h$regs[40] = h$regs[34];
-    case (65):
-      h$regs[39] = h$regs[33];
-    case (64):
-      h$regs[38] = h$regs[32];
-    case (63):
-      h$regs[37] = h$regs[31];
-    case (62):
-      h$regs[36] = h$regs[30];
-    case (61):
-      h$regs[35] = h$regs[29];
-    case (60):
-      h$regs[34] = h$regs[28];
-    case (59):
-      h$regs[33] = h$regs[27];
-    case (58):
-      h$regs[32] = h$regs[26];
-    case (57):
-      h$regs[31] = h$regs[25];
-    case (56):
-      h$regs[30] = h$regs[24];
-    case (55):
-      h$regs[29] = h$regs[23];
-    case (54):
-      h$regs[28] = h$regs[22];
-    case (53):
-      h$regs[27] = h$regs[21];
-    case (52):
-      h$regs[26] = h$regs[20];
-    case (51):
-      h$regs[25] = h$regs[19];
-    case (50):
-      h$regs[24] = h$regs[18];
-    case (49):
-      h$regs[23] = h$regs[17];
-    case (48):
-      h$regs[22] = h$regs[16];
-    case (47):
-      h$regs[21] = h$regs[15];
-    case (46):
-      h$regs[20] = h$regs[14];
-    case (45):
-      h$regs[19] = h$regs[13];
-    case (44):
-      h$regs[18] = h$regs[12];
-    case (43):
-      h$regs[17] = h$regs[11];
-    case (42):
-      h$regs[16] = h$regs[10];
-    case (41):
-      h$regs[15] = h$regs[9];
-    case (40):
-      h$regs[14] = h$regs[8];
-    case (39):
-      h$regs[13] = h$regs[7];
-    case (38):
-      h$regs[12] = h$regs[6];
-    case (37):
-      h$regs[11] = h$regs[5];
-    case (36):
-      h$regs[10] = h$regs[4];
-    case (35):
-      h$regs[9] = h$regs[3];
-    case (34):
-      h$regs[8] = h$regs[2];
-    case (33):
-      h$regs[7] = h$regs[1];
-    case (32):
-      h$regs[6] = h$regs[0];
-    case (31):
-      h$regs[5] = h$r32;
-    case (30):
-      h$regs[4] = h$r31;
-    case (29):
-      h$regs[3] = h$r30;
-    case (28):
-      h$regs[2] = h$r29;
-    case (27):
-      h$regs[1] = h$r28;
-    case (26):
-      h$regs[0] = h$r27;
-    case (25):
-      h$r32 = h$r26;
-    case (24):
-      h$r31 = h$r25;
-    case (23):
-      h$r30 = h$r24;
-    case (22):
-      h$r29 = h$r23;
-    case (21):
-      h$r28 = h$r22;
-    case (20):
-      h$r27 = h$r21;
-    case (19):
-      h$r26 = h$r20;
-    case (18):
-      h$r25 = h$r19;
-    case (17):
-      h$r24 = h$r18;
-    case (16):
-      h$r23 = h$r17;
-    case (15):
-      h$r22 = h$r16;
-    case (14):
-      h$r21 = h$r15;
-    case (13):
-      h$r20 = h$r14;
-    case (12):
-      h$r19 = h$r13;
-    case (11):
-      h$r18 = h$r12;
-    case (10):
-      h$r17 = h$r11;
-    case (9):
-      h$r16 = h$r10;
-    case (8):
-      h$r15 = h$r9;
-    case (7):
-      h$r14 = h$r8;
-    case (6):
-      h$r13 = h$r7;
-    case (5):
-      h$r12 = h$r6;
-    case (4):
-      h$r11 = h$r5;
-    case (3):
-      h$r10 = h$r4;
-    case (2):
-      h$r9 = h$r3;
-    case (1):
-      h$r8 = h$r2;
-    default:
-  };
-  h$r2 = h$RTS_517.d2;
-  h$r3 = h$RTS_517.d3;
-  h$r4 = h$RTS_517.d4;
-  h$r5 = h$RTS_517.d5;
-  h$r6 = h$RTS_517.d6;
-  h$r7 = h$RTS_517.d7;
-  h$r1 = h$RTS_516;
-  return h$RTS_518;
-};
-h$o(h$pap_6, 3, 0, 8, (-1), null);
-var h$apply = [];
-var h$paps = [];
-h$initStatic.push((function()
-                   {
-                     for(var h$RTS_520 = 0;(h$RTS_520 < 65536);(h$RTS_520++)) {
-                       h$apply[h$RTS_520] = h$ap_gen;
-                     };
-                     for(h$RTS_520 = 0;(h$RTS_520 < 128);(h$RTS_520++)) {
-                       h$paps[h$RTS_520] = h$pap_gen;
-                     };
-                     h$apply[0] = h$ap_0_0;
-                     h$apply[1] = h$ap_1_0;
-                     h$apply[1] = h$ap_1_0;
-                     h$apply[257] = h$ap_1_1;
-                     h$apply[513] = h$ap_1_2;
-                     h$apply[258] = h$ap_2_1;
-                     h$apply[514] = h$ap_2_2;
-                     h$apply[770] = h$ap_2_3;
-                     h$apply[1026] = h$ap_2_4;
-                     h$apply[515] = h$ap_3_2;
-                     h$apply[771] = h$ap_3_3;
-                     h$apply[1027] = h$ap_3_4;
-                     h$apply[1283] = h$ap_3_5;
-                     h$apply[1539] = h$ap_3_6;
-                     h$apply[772] = h$ap_4_3;
-                     h$apply[1028] = h$ap_4_4;
-                     h$apply[1284] = h$ap_4_5;
-                     h$apply[1540] = h$ap_4_6;
-                     h$apply[1796] = h$ap_4_7;
-                     h$apply[2052] = h$ap_4_8;
-                     h$paps[0] = h$pap_0;
-                     h$paps[1] = h$pap_1;
-                     h$paps[2] = h$pap_2;
-                     h$paps[3] = h$pap_3;
-                     h$paps[4] = h$pap_4;
-                     h$paps[5] = h$pap_5;
-                     h$paps[6] = h$pap_6;
-                   }));
-function h$ap_gen()
-{
-  var h$RTS_521 = h$r1.f;
-  switch (h$RTS_521.t)
-  {
-    case (0):
-      return h$RTS_521;
-    case (1):
-      var h$RTS_522 = h$stack[(h$sp - 1)];
-      var h$RTS_523 = (h$RTS_521.a & 255);
-      var h$RTS_524 = (h$RTS_522 & 255);
-      var h$RTS_525 = (h$RTS_522 >> 8);
-      if((h$RTS_524 === h$RTS_523))
-      {
-        for(var h$RTS_526 = 0;(h$RTS_526 < h$RTS_525);(h$RTS_526++)) {
-          h$setReg((h$RTS_526 + 2), h$stack[((h$sp - 2) - h$RTS_526)]);
-        };
-        h$sp = ((h$sp - h$RTS_525) - 2);
-        return h$RTS_521;
-      }
-      else
-      {
-        if((h$RTS_524 > h$RTS_523))
-        {
-          var h$RTS_527 = (h$RTS_521.a >> 8);
-          for(var h$RTS_528 = 0;(h$RTS_528 < h$RTS_527);(h$RTS_528++)) {
-            h$setReg((h$RTS_528 + 2), h$stack[((h$sp - 2) - h$RTS_528)]);
-          };
-          var h$RTS_529 = (((h$RTS_525 - h$RTS_527) << 8) | (h$RTS_524 - h$RTS_523));
-          var h$RTS_530 = h$apply[h$RTS_529];
-          if((h$RTS_530 === h$ap_gen))
-          {
-            h$sp -= h$RTS_527;
-            h$stack[(h$sp - 1)] = h$RTS_529;
-          }
-          else
-          {
-            h$sp = ((h$sp - h$RTS_527) - 1);
-          };
-          h$stack[h$sp] = h$RTS_530;
-          return h$RTS_521;
-        }
-        else
-        {
-          var h$RTS_531 = h$paps[h$RTS_525];
-          var h$RTS_532 = [h$r1, (((((h$RTS_521.a >> 8) - h$RTS_525) * 256) + h$RTS_523) - h$RTS_524)];
-          for(var h$RTS_533 = 0;(h$RTS_533 < h$RTS_525);(h$RTS_533++)) {
-            h$RTS_532.push(h$stack[((h$sp - h$RTS_533) - 1)]);
-          };
-          h$sp = ((h$sp - h$RTS_525) - 2);
-          h$r1 = h$init_closure({ d1: null, d2: null, f: h$RTS_531, m: 0
-                                }, h$RTS_532);
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_534 = h$stack[(h$sp - 1)];
-      var h$RTS_535 = (h$r1.d2.d1 & 255);
-      var h$RTS_536 = (h$RTS_534 & 255);
-      var h$RTS_537 = (h$RTS_534 >> 8);
-      if((h$RTS_536 === h$RTS_535))
-      {
-        for(var h$RTS_538 = 0;(h$RTS_538 < h$RTS_537);(h$RTS_538++)) {
-          h$setReg((h$RTS_538 + 2), h$stack[((h$sp - 2) - h$RTS_538)]);
-        };
-        h$sp = ((h$sp - h$RTS_537) - 2);
-        return h$RTS_521;
-      }
-      else
-      {
-        if((h$RTS_536 > h$RTS_535))
-        {
-          var h$RTS_539 = (h$r1.d2.d1 >> 8);
-          for(var h$RTS_540 = 0;(h$RTS_540 < h$RTS_539);(h$RTS_540++)) {
-            h$setReg((h$RTS_540 + 2), h$stack[((h$sp - 2) - h$RTS_540)]);
-          };
-          var h$RTS_541 = (((h$RTS_537 - h$RTS_539) << 8) | (h$RTS_536 - h$RTS_535));
-          var h$RTS_542 = h$apply[h$RTS_541];
-          if((h$RTS_542 === h$ap_gen))
-          {
-            h$sp -= h$RTS_539;
-            h$stack[(h$sp - 1)] = h$RTS_541;
-          }
-          else
-          {
-            h$sp = ((h$sp - h$RTS_539) - 1);
-          };
-          h$stack[h$sp] = h$RTS_542;
-          return h$RTS_521;
-        }
-        else
-        {
-          var h$RTS_543 = h$paps[h$RTS_537];
-          var h$RTS_544 = [h$r1, (((((h$r1.d2.d1 >> 8) - h$RTS_537) * 256) + h$RTS_535) - h$RTS_536)];
-          for(var h$RTS_545 = 0;(h$RTS_545 < h$RTS_537);(h$RTS_545++)) {
-            h$RTS_544.push(h$stack[((h$sp - h$RTS_545) - 1)]);
-          };
-          h$sp = ((h$sp - h$RTS_537) - 2);
-          h$r1 = h$init_closure({ d1: null, d2: null, f: h$RTS_543, m: 0
-                                }, h$RTS_544);
-          return h$stack[h$sp];
-        };
-      };
-    case (5):
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_gen: unexpected closure type " + h$RTS_521.t));
-  };
-};
-h$o(h$ap_gen, (-1), 0, (-1), 256, null);
-function h$ap_gen_fast(h$RTS_546)
-{
-  var h$RTS_547 = h$r1.f;
-  switch (h$RTS_547.t)
-  {
-    case (0):
-      var h$RTS_548 = (h$RTS_546 >> 8);
-      h$sp += h$RTS_548;
-      switch (h$RTS_548)
-      {
-        case (64):
-          h$stack[(h$sp - 63)] = h$regs[32];
-        case (63):
-          h$stack[(h$sp - 62)] = h$regs[31];
-        case (62):
-          h$stack[(h$sp - 61)] = h$regs[30];
-        case (61):
-          h$stack[(h$sp - 60)] = h$regs[29];
-        case (60):
-          h$stack[(h$sp - 59)] = h$regs[28];
-        case (59):
-          h$stack[(h$sp - 58)] = h$regs[27];
-        case (58):
-          h$stack[(h$sp - 57)] = h$regs[26];
-        case (57):
-          h$stack[(h$sp - 56)] = h$regs[25];
-        case (56):
-          h$stack[(h$sp - 55)] = h$regs[24];
-        case (55):
-          h$stack[(h$sp - 54)] = h$regs[23];
-        case (54):
-          h$stack[(h$sp - 53)] = h$regs[22];
-        case (53):
-          h$stack[(h$sp - 52)] = h$regs[21];
-        case (52):
-          h$stack[(h$sp - 51)] = h$regs[20];
-        case (51):
-          h$stack[(h$sp - 50)] = h$regs[19];
-        case (50):
-          h$stack[(h$sp - 49)] = h$regs[18];
-        case (49):
-          h$stack[(h$sp - 48)] = h$regs[17];
-        case (48):
-          h$stack[(h$sp - 47)] = h$regs[16];
-        case (47):
-          h$stack[(h$sp - 46)] = h$regs[15];
-        case (46):
-          h$stack[(h$sp - 45)] = h$regs[14];
-        case (45):
-          h$stack[(h$sp - 44)] = h$regs[13];
-        case (44):
-          h$stack[(h$sp - 43)] = h$regs[12];
-        case (43):
-          h$stack[(h$sp - 42)] = h$regs[11];
-        case (42):
-          h$stack[(h$sp - 41)] = h$regs[10];
-        case (41):
-          h$stack[(h$sp - 40)] = h$regs[9];
-        case (40):
-          h$stack[(h$sp - 39)] = h$regs[8];
-        case (39):
-          h$stack[(h$sp - 38)] = h$regs[7];
-        case (38):
-          h$stack[(h$sp - 37)] = h$regs[6];
-        case (37):
-          h$stack[(h$sp - 36)] = h$regs[5];
-        case (36):
-          h$stack[(h$sp - 35)] = h$regs[4];
-        case (35):
-          h$stack[(h$sp - 34)] = h$regs[3];
-        case (34):
-          h$stack[(h$sp - 33)] = h$regs[2];
-        case (33):
-          h$stack[(h$sp - 32)] = h$regs[1];
-        case (32):
-          h$stack[(h$sp - 31)] = h$regs[0];
-        case (31):
-          h$stack[(h$sp - 30)] = h$r32;
-        case (30):
-          h$stack[(h$sp - 29)] = h$r31;
-        case (29):
-          h$stack[(h$sp - 28)] = h$r30;
-        case (28):
-          h$stack[(h$sp - 27)] = h$r29;
-        case (27):
-          h$stack[(h$sp - 26)] = h$r28;
-        case (26):
-          h$stack[(h$sp - 25)] = h$r27;
-        case (25):
-          h$stack[(h$sp - 24)] = h$r26;
-        case (24):
-          h$stack[(h$sp - 23)] = h$r25;
-        case (23):
-          h$stack[(h$sp - 22)] = h$r24;
-        case (22):
-          h$stack[(h$sp - 21)] = h$r23;
-        case (21):
-          h$stack[(h$sp - 20)] = h$r22;
-        case (20):
-          h$stack[(h$sp - 19)] = h$r21;
-        case (19):
-          h$stack[(h$sp - 18)] = h$r20;
-        case (18):
-          h$stack[(h$sp - 17)] = h$r19;
-        case (17):
-          h$stack[(h$sp - 16)] = h$r18;
-        case (16):
-          h$stack[(h$sp - 15)] = h$r17;
-        case (15):
-          h$stack[(h$sp - 14)] = h$r16;
-        case (14):
-          h$stack[(h$sp - 13)] = h$r15;
-        case (13):
-          h$stack[(h$sp - 12)] = h$r14;
-        case (12):
-          h$stack[(h$sp - 11)] = h$r13;
-        case (11):
-          h$stack[(h$sp - 10)] = h$r12;
-        case (10):
-          h$stack[(h$sp - 9)] = h$r11;
-        case (9):
-          h$stack[(h$sp - 8)] = h$r10;
-        case (8):
-          h$stack[(h$sp - 7)] = h$r9;
-        case (7):
-          h$stack[(h$sp - 6)] = h$r8;
-        case (6):
-          h$stack[(h$sp - 5)] = h$r7;
-        case (5):
-          h$stack[(h$sp - 4)] = h$r6;
-        case (4):
-          h$stack[(h$sp - 3)] = h$r5;
-        case (3):
-          h$stack[(h$sp - 2)] = h$r4;
-        case (2):
-          h$stack[(h$sp - 1)] = h$r3;
-        case (1):
-          h$stack[(h$sp - 0)] = h$r2;
-        default:
-      };
-      var h$RTS_549 = h$apply[h$RTS_546];
-      if((h$RTS_549 === h$ap_gen))
-      {
-        h$sp += 2;
-        h$stack[(h$sp - 1)] = h$RTS_546;
-      }
-      else
-      {
-        ++h$sp;
-      };
-      h$stack[h$sp] = h$RTS_549;
-      return h$RTS_547;
-    case (1):
-      var h$RTS_550 = h$RTS_547.a;
-      var h$RTS_551 = (h$RTS_550 & 255);
-      var h$RTS_552 = (h$RTS_546 & 255);
-      var h$RTS_553 = (h$RTS_546 >> 8);
-      if((h$RTS_552 === h$RTS_551))
-      {
-        return h$RTS_547;
-      }
-      else
-      {
-        if((h$RTS_552 > h$RTS_551))
-        {
-          var h$RTS_554 = ((h$RTS_550 >> 8) + 1);
-          h$sp = (((h$sp + h$RTS_553) - h$RTS_554) + 1);
-          for(var h$RTS_555 = h$RTS_553;(h$RTS_555 >= h$RTS_554);(h$RTS_555--)) {
-            h$stack[((h$sp + h$RTS_554) - h$RTS_555)] = h$getReg((h$RTS_555 + 1));
-          };
-          var h$RTS_556 = (((h$RTS_553 - (h$RTS_550 >> 8)) << 8) | (h$RTS_552 - h$RTS_551));
-          var h$RTS_557 = h$apply[h$RTS_556];
-          if((h$RTS_557 === h$ap_gen))
-          {
-            h$sp += 2;
-            h$stack[(h$sp - 1)] = h$RTS_556;
-          }
-          else
-          {
-            ++h$sp;
-          };
-          h$stack[h$sp] = h$RTS_557;
-          return h$RTS_547;
-        }
-        else
-        {
-          if((h$RTS_546 != 0))
-          {
-            var h$RTS_558 = h$paps[h$RTS_553];
-            var h$RTS_559 = [h$r1, (((((h$RTS_550 >> 8) - h$RTS_553) * 256) + h$RTS_551) - h$RTS_552)];
-            for(var h$RTS_560 = 0;(h$RTS_560 < h$RTS_553);(h$RTS_560++)) {
-              h$RTS_559.push(h$getReg((h$RTS_560 + 2)));
-            };
-            h$r1 = h$init_closure({ d1: null, d2: null, f: h$RTS_558, m: 0
-                                  }, h$RTS_559);
-          };
-          return h$stack[h$sp];
-        };
-      };
-    case (3):
-      var h$RTS_561 = h$r1.d2.d1;
-      var h$RTS_562 = (h$RTS_561 & 255);
-      var h$RTS_563 = (h$RTS_546 & 255);
-      var h$RTS_564 = (h$RTS_546 >> 8);
-      if((h$RTS_563 === h$RTS_562))
-      {
-        return h$RTS_547;
-      }
-      else
-      {
-        if((h$RTS_563 > h$RTS_562))
-        {
-          var h$RTS_565 = ((h$RTS_561 >> 8) + 1);
-          h$sp = (((h$sp + h$RTS_564) - h$RTS_565) + 1);
-          for(var h$RTS_566 = h$RTS_564;(h$RTS_566 >= h$RTS_565);(h$RTS_566--)) {
-            h$stack[((h$sp + h$RTS_565) - h$RTS_566)] = h$getReg((h$RTS_566 + 1));
-          };
-          var h$RTS_567 = (((h$RTS_564 - (h$RTS_561 >> 8)) << 8) | (h$RTS_563 - h$RTS_562));
-          var h$RTS_568 = h$apply[h$RTS_567];
-          if((h$RTS_568 === h$ap_gen))
-          {
-            h$sp += 2;
-            h$stack[(h$sp - 1)] = h$RTS_567;
-          }
-          else
-          {
-            ++h$sp;
-          };
-          h$stack[h$sp] = h$RTS_568;
-          return h$RTS_547;
-        }
-        else
-        {
-          if((h$RTS_546 != 0))
-          {
-            var h$RTS_569 = h$paps[h$RTS_564];
-            var h$RTS_570 = [h$r1, (((((h$RTS_561 >> 8) - h$RTS_564) * 256) + h$RTS_562) - h$RTS_563)];
-            for(var h$RTS_571 = 0;(h$RTS_571 < h$RTS_564);(h$RTS_571++)) {
-              h$RTS_570.push(h$getReg((h$RTS_571 + 2)));
-            };
-            h$r1 = h$init_closure({ d1: null, d2: null, f: h$RTS_569, m: 0
-                                  }, h$RTS_570);
-          };
-          return h$stack[h$sp];
-        };
-      };
-    case (2):
-      if((h$RTS_546 != 0))
-      {
-        throw("h$ap_gen_fast: invalid apply");
-      };
-      return h$RTS_547;
-    case (5):
-      var h$RTS_572 = (h$RTS_546 >> 8);
-      h$sp += h$RTS_572;
-      switch (h$RTS_572)
-      {
-        case (64):
-          h$stack[(h$sp - 63)] = h$regs[32];
-        case (63):
-          h$stack[(h$sp - 62)] = h$regs[31];
-        case (62):
-          h$stack[(h$sp - 61)] = h$regs[30];
-        case (61):
-          h$stack[(h$sp - 60)] = h$regs[29];
-        case (60):
-          h$stack[(h$sp - 59)] = h$regs[28];
-        case (59):
-          h$stack[(h$sp - 58)] = h$regs[27];
-        case (58):
-          h$stack[(h$sp - 57)] = h$regs[26];
-        case (57):
-          h$stack[(h$sp - 56)] = h$regs[25];
-        case (56):
-          h$stack[(h$sp - 55)] = h$regs[24];
-        case (55):
-          h$stack[(h$sp - 54)] = h$regs[23];
-        case (54):
-          h$stack[(h$sp - 53)] = h$regs[22];
-        case (53):
-          h$stack[(h$sp - 52)] = h$regs[21];
-        case (52):
-          h$stack[(h$sp - 51)] = h$regs[20];
-        case (51):
-          h$stack[(h$sp - 50)] = h$regs[19];
-        case (50):
-          h$stack[(h$sp - 49)] = h$regs[18];
-        case (49):
-          h$stack[(h$sp - 48)] = h$regs[17];
-        case (48):
-          h$stack[(h$sp - 47)] = h$regs[16];
-        case (47):
-          h$stack[(h$sp - 46)] = h$regs[15];
-        case (46):
-          h$stack[(h$sp - 45)] = h$regs[14];
-        case (45):
-          h$stack[(h$sp - 44)] = h$regs[13];
-        case (44):
-          h$stack[(h$sp - 43)] = h$regs[12];
-        case (43):
-          h$stack[(h$sp - 42)] = h$regs[11];
-        case (42):
-          h$stack[(h$sp - 41)] = h$regs[10];
-        case (41):
-          h$stack[(h$sp - 40)] = h$regs[9];
-        case (40):
-          h$stack[(h$sp - 39)] = h$regs[8];
-        case (39):
-          h$stack[(h$sp - 38)] = h$regs[7];
-        case (38):
-          h$stack[(h$sp - 37)] = h$regs[6];
-        case (37):
-          h$stack[(h$sp - 36)] = h$regs[5];
-        case (36):
-          h$stack[(h$sp - 35)] = h$regs[4];
-        case (35):
-          h$stack[(h$sp - 34)] = h$regs[3];
-        case (34):
-          h$stack[(h$sp - 33)] = h$regs[2];
-        case (33):
-          h$stack[(h$sp - 32)] = h$regs[1];
-        case (32):
-          h$stack[(h$sp - 31)] = h$regs[0];
-        case (31):
-          h$stack[(h$sp - 30)] = h$r32;
-        case (30):
-          h$stack[(h$sp - 29)] = h$r31;
-        case (29):
-          h$stack[(h$sp - 28)] = h$r30;
-        case (28):
-          h$stack[(h$sp - 27)] = h$r29;
-        case (27):
-          h$stack[(h$sp - 26)] = h$r28;
-        case (26):
-          h$stack[(h$sp - 25)] = h$r27;
-        case (25):
-          h$stack[(h$sp - 24)] = h$r26;
-        case (24):
-          h$stack[(h$sp - 23)] = h$r25;
-        case (23):
-          h$stack[(h$sp - 22)] = h$r24;
-        case (22):
-          h$stack[(h$sp - 21)] = h$r23;
-        case (21):
-          h$stack[(h$sp - 20)] = h$r22;
-        case (20):
-          h$stack[(h$sp - 19)] = h$r21;
-        case (19):
-          h$stack[(h$sp - 18)] = h$r20;
-        case (18):
-          h$stack[(h$sp - 17)] = h$r19;
-        case (17):
-          h$stack[(h$sp - 16)] = h$r18;
-        case (16):
-          h$stack[(h$sp - 15)] = h$r17;
-        case (15):
-          h$stack[(h$sp - 14)] = h$r16;
-        case (14):
-          h$stack[(h$sp - 13)] = h$r15;
-        case (13):
-          h$stack[(h$sp - 12)] = h$r14;
-        case (12):
-          h$stack[(h$sp - 11)] = h$r13;
-        case (11):
-          h$stack[(h$sp - 10)] = h$r12;
-        case (10):
-          h$stack[(h$sp - 9)] = h$r11;
-        case (9):
-          h$stack[(h$sp - 8)] = h$r10;
-        case (8):
-          h$stack[(h$sp - 7)] = h$r9;
-        case (7):
-          h$stack[(h$sp - 6)] = h$r8;
-        case (6):
-          h$stack[(h$sp - 5)] = h$r7;
-        case (5):
-          h$stack[(h$sp - 4)] = h$r6;
-        case (4):
-          h$stack[(h$sp - 3)] = h$r5;
-        case (3):
-          h$stack[(h$sp - 2)] = h$r4;
-        case (2):
-          h$stack[(h$sp - 1)] = h$r3;
-        case (1):
-          h$stack[(h$sp - 0)] = h$r2;
-        default:
-      };
-      var h$RTS_573 = h$apply[h$RTS_546];
-      if((h$RTS_573 === h$ap_gen))
-      {
-        h$sp += 2;
-        h$stack[(h$sp - 1)] = h$RTS_546;
-      }
-      else
-      {
-        ++h$sp;
-      };
-      h$stack[h$sp] = h$RTS_573;
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      throw(("h$ap_gen_fast: unexpected closure type: " + h$RTS_547.t));
-  };
-};
-function h$ap_0_0_fast()
-{
-  if((typeof h$r1 !== "object"))
-  {
-    return h$stack[h$sp];
-  };
-  var h$RTS_574 = h$r1.f;
-  if((h$RTS_574 === h$unbox_e))
-  {
-    h$r1 = h$r1.d1;
-    return h$stack[h$sp];
-  };
-  switch (h$RTS_574.t)
-  {
-    case (2):
-    case (1):
-    case (3):
-      return h$stack[h$sp];
-    case (5):
-      h$p3(h$ap_0_0, h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      return h$RTS_574;
-  };
-};
-function h$ap_0_0()
-{
-  --h$sp;
-  if((typeof h$r1 !== "object"))
-  {
-    return h$stack[h$sp];
-  };
-  var h$RTS_575 = h$r1.f;
-  if((h$RTS_575 === h$unbox_e))
-  {
-    h$r1 = h$r1.d1;
-    return h$stack[h$sp];
-  };
-  switch (h$RTS_575.t)
-  {
-    case (2):
-    case (1):
-    case (3):
-      return h$stack[h$sp];
-    case (5):
-      h$p3(h$ap_0_0, h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    default:
-      return h$RTS_575;
-  };
-};
-h$o(h$ap_0_0, (-1), 0, 0, 256, null);
-function h$ap_1_0(h$RTS_576)
-{
-  var h$RTS_577 = h$r1.f;
-  if((h$RTS_577.t === 0))
-  {
-    return h$RTS_577;
-  }
-  else
-  {
-    if((h$RTS_577.t === 5))
-    {
-      h$p2(h$r1, h$return);
-      return h$blockOnBlackhole(h$r1);
-    }
-    else
-    {
-      --h$sp;
-      return h$RTS_577;
-    };
-  };
-};
-h$o(h$ap_1_0, (-1), 0, 0, 256, null);
-function h$e(h$RTS_578)
-{
-  h$r1 = h$RTS_578;
-  if((typeof h$RTS_578 !== "object"))
-  {
-    return h$stack[h$sp];
-  };
-  var h$RTS_579 = h$RTS_578.f;
-  if((h$RTS_579 === h$unbox_e))
-  {
-    h$r1 = h$RTS_578.d1;
-    return h$stack[h$sp];
-  };
-  switch (h$RTS_579.t)
-  {
-    case (2):
-    case (1):
-    case (3):
-      return h$stack[h$sp];
-    case (5):
-      h$p3(h$ap_0_0, h$RTS_578, h$return);
-      return h$blockOnBlackhole(h$RTS_578);
-    default:
-      return h$RTS_579;
-  };
-};
-function h$upd_frame()
-{
-  var h$RTS_580 = h$stack[(h$sp - 1)];
-  var h$RTS_581 = h$RTS_580.d2;
-  if((h$RTS_581 !== null))
-  {
-    for(var h$RTS_582 = 0;(h$RTS_582 < h$RTS_581.length);(h$RTS_582++)) {
-      h$wakeupThread(h$RTS_581[h$RTS_582]);
-    };
-  };
-  if((typeof h$r1 === "object"))
-  {
-    h$RTS_580.f = h$r1.f;
-    h$RTS_580.d1 = h$r1.d1;
-    h$RTS_580.d2 = h$r1.d2;
-    h$RTS_580.m = h$r1.m;
-  }
-  else
-  {
-    h$RTS_580.f = h$unbox_e;
-    h$RTS_580.d1 = h$r1;
-    h$RTS_580.d2 = null;
-    h$RTS_580.m = 0;
-  };
-  h$sp -= 2;
-  return h$stack[h$sp];
-};
-h$o(h$upd_frame, (-1), 0, 1, 256, null);
-function h$upd_frame_lne()
-{
-  var h$RTS_583 = h$stack[(h$sp - 1)];
-  h$stack[h$RTS_583] = h$r1;
-  h$sp -= 2;
-  return h$stack[h$sp];
-};
-h$o(h$upd_frame_lne, (-1), 0, 1, 256, null);
-function h$pap_gen()
-{
-  var h$RTS_584 = h$r1.d1;
-  var h$RTS_585 = h$RTS_584.f;
-  var h$RTS_586 = h$r1.d2;
-  var h$RTS_587 = (((h$RTS_585.t === 1) ? h$RTS_585.a : h$RTS_584.d2.d1) >> 8);
-  var h$RTS_588 = (h$r1.d2.d1 >> 8);
-  var h$RTS_589 = (h$RTS_587 - h$RTS_588);
-  h$moveRegs2(h$RTS_588, h$RTS_589);
-  switch (h$RTS_589)
-  {
-    case (127):
-      h$regs[95] = h$RTS_586.d128;
-    case (126):
-      h$regs[94] = h$RTS_586.d127;
-    case (125):
-      h$regs[93] = h$RTS_586.d126;
-    case (124):
-      h$regs[92] = h$RTS_586.d125;
-    case (123):
-      h$regs[91] = h$RTS_586.d124;
-    case (122):
-      h$regs[90] = h$RTS_586.d123;
-    case (121):
-      h$regs[89] = h$RTS_586.d122;
-    case (120):
-      h$regs[88] = h$RTS_586.d121;
-    case (119):
-      h$regs[87] = h$RTS_586.d120;
-    case (118):
-      h$regs[86] = h$RTS_586.d119;
-    case (117):
-      h$regs[85] = h$RTS_586.d118;
-    case (116):
-      h$regs[84] = h$RTS_586.d117;
-    case (115):
-      h$regs[83] = h$RTS_586.d116;
-    case (114):
-      h$regs[82] = h$RTS_586.d115;
-    case (113):
-      h$regs[81] = h$RTS_586.d114;
-    case (112):
-      h$regs[80] = h$RTS_586.d113;
-    case (111):
-      h$regs[79] = h$RTS_586.d112;
-    case (110):
-      h$regs[78] = h$RTS_586.d111;
-    case (109):
-      h$regs[77] = h$RTS_586.d110;
-    case (108):
-      h$regs[76] = h$RTS_586.d109;
-    case (107):
-      h$regs[75] = h$RTS_586.d108;
-    case (106):
-      h$regs[74] = h$RTS_586.d107;
-    case (105):
-      h$regs[73] = h$RTS_586.d106;
-    case (104):
-      h$regs[72] = h$RTS_586.d105;
-    case (103):
-      h$regs[71] = h$RTS_586.d104;
-    case (102):
-      h$regs[70] = h$RTS_586.d103;
-    case (101):
-      h$regs[69] = h$RTS_586.d102;
-    case (100):
-      h$regs[68] = h$RTS_586.d101;
-    case (99):
-      h$regs[67] = h$RTS_586.d100;
-    case (98):
-      h$regs[66] = h$RTS_586.d99;
-    case (97):
-      h$regs[65] = h$RTS_586.d98;
-    case (96):
-      h$regs[64] = h$RTS_586.d97;
-    case (95):
-      h$regs[63] = h$RTS_586.d96;
-    case (94):
-      h$regs[62] = h$RTS_586.d95;
-    case (93):
-      h$regs[61] = h$RTS_586.d94;
-    case (92):
-      h$regs[60] = h$RTS_586.d93;
-    case (91):
-      h$regs[59] = h$RTS_586.d92;
-    case (90):
-      h$regs[58] = h$RTS_586.d91;
-    case (89):
-      h$regs[57] = h$RTS_586.d90;
-    case (88):
-      h$regs[56] = h$RTS_586.d89;
-    case (87):
-      h$regs[55] = h$RTS_586.d88;
-    case (86):
-      h$regs[54] = h$RTS_586.d87;
-    case (85):
-      h$regs[53] = h$RTS_586.d86;
-    case (84):
-      h$regs[52] = h$RTS_586.d85;
-    case (83):
-      h$regs[51] = h$RTS_586.d84;
-    case (82):
-      h$regs[50] = h$RTS_586.d83;
-    case (81):
-      h$regs[49] = h$RTS_586.d82;
-    case (80):
-      h$regs[48] = h$RTS_586.d81;
-    case (79):
-      h$regs[47] = h$RTS_586.d80;
-    case (78):
-      h$regs[46] = h$RTS_586.d79;
-    case (77):
-      h$regs[45] = h$RTS_586.d78;
-    case (76):
-      h$regs[44] = h$RTS_586.d77;
-    case (75):
-      h$regs[43] = h$RTS_586.d76;
-    case (74):
-      h$regs[42] = h$RTS_586.d75;
-    case (73):
-      h$regs[41] = h$RTS_586.d74;
-    case (72):
-      h$regs[40] = h$RTS_586.d73;
-    case (71):
-      h$regs[39] = h$RTS_586.d72;
-    case (70):
-      h$regs[38] = h$RTS_586.d71;
-    case (69):
-      h$regs[37] = h$RTS_586.d70;
-    case (68):
-      h$regs[36] = h$RTS_586.d69;
-    case (67):
-      h$regs[35] = h$RTS_586.d68;
-    case (66):
-      h$regs[34] = h$RTS_586.d67;
-    case (65):
-      h$regs[33] = h$RTS_586.d66;
-    case (64):
-      h$regs[32] = h$RTS_586.d65;
-    case (63):
-      h$regs[31] = h$RTS_586.d64;
-    case (62):
-      h$regs[30] = h$RTS_586.d63;
-    case (61):
-      h$regs[29] = h$RTS_586.d62;
-    case (60):
-      h$regs[28] = h$RTS_586.d61;
-    case (59):
-      h$regs[27] = h$RTS_586.d60;
-    case (58):
-      h$regs[26] = h$RTS_586.d59;
-    case (57):
-      h$regs[25] = h$RTS_586.d58;
-    case (56):
-      h$regs[24] = h$RTS_586.d57;
-    case (55):
-      h$regs[23] = h$RTS_586.d56;
-    case (54):
-      h$regs[22] = h$RTS_586.d55;
-    case (53):
-      h$regs[21] = h$RTS_586.d54;
-    case (52):
-      h$regs[20] = h$RTS_586.d53;
-    case (51):
-      h$regs[19] = h$RTS_586.d52;
-    case (50):
-      h$regs[18] = h$RTS_586.d51;
-    case (49):
-      h$regs[17] = h$RTS_586.d50;
-    case (48):
-      h$regs[16] = h$RTS_586.d49;
-    case (47):
-      h$regs[15] = h$RTS_586.d48;
-    case (46):
-      h$regs[14] = h$RTS_586.d47;
-    case (45):
-      h$regs[13] = h$RTS_586.d46;
-    case (44):
-      h$regs[12] = h$RTS_586.d45;
-    case (43):
-      h$regs[11] = h$RTS_586.d44;
-    case (42):
-      h$regs[10] = h$RTS_586.d43;
-    case (41):
-      h$regs[9] = h$RTS_586.d42;
-    case (40):
-      h$regs[8] = h$RTS_586.d41;
-    case (39):
-      h$regs[7] = h$RTS_586.d40;
-    case (38):
-      h$regs[6] = h$RTS_586.d39;
-    case (37):
-      h$regs[5] = h$RTS_586.d38;
-    case (36):
-      h$regs[4] = h$RTS_586.d37;
-    case (35):
-      h$regs[3] = h$RTS_586.d36;
-    case (34):
-      h$regs[2] = h$RTS_586.d35;
-    case (33):
-      h$regs[1] = h$RTS_586.d34;
-    case (32):
-      h$regs[0] = h$RTS_586.d33;
-    case (31):
-      h$r32 = h$RTS_586.d32;
-    case (30):
-      h$r31 = h$RTS_586.d31;
-    case (29):
-      h$r30 = h$RTS_586.d30;
-    case (28):
-      h$r29 = h$RTS_586.d29;
-    case (27):
-      h$r28 = h$RTS_586.d28;
-    case (26):
-      h$r27 = h$RTS_586.d27;
-    case (25):
-      h$r26 = h$RTS_586.d26;
-    case (24):
-      h$r25 = h$RTS_586.d25;
-    case (23):
-      h$r24 = h$RTS_586.d24;
-    case (22):
-      h$r23 = h$RTS_586.d23;
-    case (21):
-      h$r22 = h$RTS_586.d22;
-    case (20):
-      h$r21 = h$RTS_586.d21;
-    case (19):
-      h$r20 = h$RTS_586.d20;
-    case (18):
-      h$r19 = h$RTS_586.d19;
-    case (17):
-      h$r18 = h$RTS_586.d18;
-    case (16):
-      h$r17 = h$RTS_586.d17;
-    case (15):
-      h$r16 = h$RTS_586.d16;
-    case (14):
-      h$r15 = h$RTS_586.d15;
-    case (13):
-      h$r14 = h$RTS_586.d14;
-    case (12):
-      h$r13 = h$RTS_586.d13;
-    case (11):
-      h$r12 = h$RTS_586.d12;
-    case (10):
-      h$r11 = h$RTS_586.d11;
-    case (9):
-      h$r10 = h$RTS_586.d10;
-    case (8):
-      h$r9 = h$RTS_586.d9;
-    case (7):
-      h$r8 = h$RTS_586.d8;
-    case (6):
-      h$r7 = h$RTS_586.d7;
-    case (5):
-      h$r6 = h$RTS_586.d6;
-    case (4):
-      h$r5 = h$RTS_586.d5;
-    case (3):
-      h$r4 = h$RTS_586.d4;
-    case (2):
-      h$r3 = h$RTS_586.d3;
-    case (1):
-      h$r2 = h$RTS_586.d2;
-    default:
-  };
-  h$r1 = h$RTS_584;
-  return h$RTS_585;
-};
-h$o(h$pap_gen, 3, 0, (-1), (-1), null);
-function h$moveRegs2(h$RTS_590, h$RTS_591)
-{
-  switch (((h$RTS_590 << 8) | h$RTS_591))
-  {
-    case (257):
-      h$r3 = h$r2;
-      break;
-    case (258):
-      h$r4 = h$r2;
-      break;
-    case (259):
-      h$r5 = h$r2;
-      break;
-    case (260):
-      h$r6 = h$r2;
-      break;
-    case (513):
-      h$r4 = h$r3;
-      h$r3 = h$r2;
-      break;
-    case (514):
-      h$r5 = h$r3;
-      h$r4 = h$r2;
-      break;
-    case (515):
-      h$r6 = h$r3;
-      h$r5 = h$r2;
-      break;
-    case (516):
-      h$r7 = h$r3;
-      h$r6 = h$r2;
-      break;
-    case (769):
-      h$r5 = h$r4;
-      h$r4 = h$r3;
-      h$r3 = h$r2;
-      break;
-    case (770):
-      h$r6 = h$r4;
-      h$r5 = h$r3;
-      h$r4 = h$r2;
-      break;
-    case (771):
-      h$r7 = h$r4;
-      h$r6 = h$r3;
-      h$r5 = h$r2;
-      break;
-    case (772):
-      h$r8 = h$r4;
-      h$r7 = h$r3;
-      h$r6 = h$r2;
-      break;
-    case (1025):
-      h$r6 = h$r5;
-      h$r5 = h$r4;
-      h$r4 = h$r3;
-      h$r3 = h$r2;
-      break;
-    case (1026):
-      h$r7 = h$r5;
-      h$r6 = h$r4;
-      h$r5 = h$r3;
-      h$r4 = h$r2;
-      break;
-    case (1027):
-      h$r8 = h$r5;
-      h$r7 = h$r4;
-      h$r6 = h$r3;
-      h$r5 = h$r2;
-      break;
-    case (1028):
-      h$r9 = h$r5;
-      h$r8 = h$r4;
-      h$r7 = h$r3;
-      h$r6 = h$r2;
-      break;
-    case (1281):
-      h$r7 = h$r6;
-      h$r6 = h$r5;
-      h$r5 = h$r4;
-      h$r4 = h$r3;
-      h$r3 = h$r2;
-      break;
-    case (1282):
-      h$r8 = h$r6;
-      h$r7 = h$r5;
-      h$r6 = h$r4;
-      h$r5 = h$r3;
-      h$r4 = h$r2;
-      break;
-    case (1283):
-      h$r9 = h$r6;
-      h$r8 = h$r5;
-      h$r7 = h$r4;
-      h$r6 = h$r3;
-      h$r5 = h$r2;
-      break;
-    case (1284):
-      h$r10 = h$r6;
-      h$r9 = h$r5;
-      h$r8 = h$r4;
-      h$r7 = h$r3;
-      h$r6 = h$r2;
-      break;
-    default:
-      for(var h$RTS_592 = h$RTS_590;(h$RTS_592 > 0);(h$RTS_592--)) {
-        h$setReg(((h$RTS_592 + 1) + h$RTS_591), h$getReg((h$RTS_592 + 1)));
-      };
-  };
-};
-var h$THUNK_CLOSURE = 0;
-var h$FUN_CLOSURE = 1;
-var h$PAP_CLOSURE = 3;
-var h$CON_CLOSURE = 2;
-var h$BLACKHOLE_CLOSURE = 5;
-var h$STACKFRAME_CLOSURE = (-1);
-function h$closureTypeName(h$RTS_593)
-{
-  if((h$RTS_593 === 0))
-  {
-    return "Thunk";
-  };
-  if((h$RTS_593 === 1))
-  {
-    return "Fun";
-  };
-  if((h$RTS_593 === 3))
-  {
-    return "Pap";
-  };
-  if((h$RTS_593 === 2))
-  {
-    return "Con";
-  };
-  if((h$RTS_593 === 5))
-  {
-    return "Blackhole";
-  };
-  if((h$RTS_593 === (-1)))
-  {
-    return "StackFrame";
-  };
-  return "InvalidClosureType";
-};
-function h$runio_e()
-{
-  h$r1 = h$r1.d1;
-  h$stack[++h$sp] = h$ap_1_0;
-  return h$ap_1_0;
-};
-h$o(h$runio_e, 0, 0, 1, 256, null);
-function h$runio(h$RTS_594)
-{
-  return h$c1(h$runio_e, h$RTS_594);
-};
-function h$flushStdout_e()
-{
-  h$r1 = h$baseZCGHCziIOziHandlezihFlush;
-  h$r2 = h$baseZCGHCziIOziHandleziFDzistdout;
-  return h$ap_1_1_fast();
-};
-h$o(h$flushStdout_e, 0, 0, 0, 0, null);
-var h$flushStdout = h$static_thunk(h$flushStdout_e);
-var h$RTS_595 = new Date();
-function h$dumpRes(h$RTS_596)
-{
-  h$printcl(h$RTS_596);
-  var h$RTS_597 = new Date();
-  h$log((("elapsed time: " + (h$RTS_597.getTime() - h$RTS_595.getTime())) + "ms"));
-};
-function h$ascii(h$RTS_598)
-{
-  var h$RTS_599 = [];
-  for(var h$RTS_600 = 0;(h$RTS_600 < h$RTS_598.length);(h$RTS_600++)) {
-    h$RTS_599.push(h$RTS_598.charCodeAt(h$RTS_600));
-  };
-  h$RTS_599.push(0);
-  return h$RTS_599;
-};
-function h$dumpStackTop(h$RTS_601, h$RTS_602, h$RTS_603)
-{
-  h$RTS_602 = Math.max(h$RTS_602, 0);
-  for(var h$RTS_604 = h$RTS_602;(h$RTS_604 <= h$RTS_603);(h$RTS_604++)) {
-    var h$RTS_605 = h$RTS_601[h$RTS_604];
-    if((h$RTS_605 && h$RTS_605.n))
-    {
-      h$log(((("stack[" + h$RTS_604) + "] = ") + h$RTS_605.n));
-    }
-    else
-    {
-      if((h$RTS_605 === null))
-      {
-        h$log((("stack[" + h$RTS_604) + "] = null WARNING DANGER"));
-      }
-      else
-      {
-        if((((((typeof h$RTS_605 === "object") && (h$RTS_605 !== null)) && h$RTS_605.hasOwnProperty("f")) && h$RTS_605.
-        hasOwnProperty("d1")) && h$RTS_605.hasOwnProperty("d2")))
-        {
-          if((typeof h$RTS_605.f !== "function"))
-          {
-            h$log((("stack[" + h$RTS_604) + "] = WARNING: dodgy object"));
-          }
-          else
-          {
-            if((h$RTS_605.d1 === undefined))
-            {
-              h$log((("WARNING: stack[" + h$RTS_604) + "] d1 undefined"));
-            };
-            if((h$RTS_605.d2 === undefined))
-            {
-              h$log((("WARNING: stack[" + h$RTS_604) + "] d2 undefined"));
-            };
-            if(((((h$RTS_605.f.t === 5) && h$RTS_605.d1) && h$RTS_605.d1.x1) && h$RTS_605.d1.x1.n))
-            {
-              h$log(((("stack[" + h$RTS_604) + "] = blackhole -> ") + h$RTS_605.d1.x1.n));
-            }
-            else
-            {
-              h$log(((((((((("stack[" + h$RTS_604) + "] = -> ") + (h$RTS_605.alloc ? (h$RTS_605.alloc + ": ") : "")) + h$RTS_605.f.
-              n) + " (") + h$closureTypeName(h$RTS_605.f.t)) + ", a: ") + h$RTS_605.f.a) + ")"));
-            };
-          };
-        }
-        else
-        {
-          if(h$isInstanceOf(h$RTS_605, h$MVar))
-          {
-            var h$RTS_606 = ((h$RTS_605.val === null) ? " empty" : (" value -> " + ((typeof h$RTS_605.
-            val === "object") ? (((((h$RTS_605.val.f.n + " (") + h$closureTypeName(h$RTS_605.val.f.t)) + ", a: ") + h$RTS_605.val.f.
-            a) + ")") : h$RTS_605.val)));
-            h$log(((("stack[" + h$RTS_604) + "] = MVar ") + h$RTS_606));
-          }
-          else
-          {
-            if(h$isInstanceOf(h$RTS_605, h$MutVar))
-            {
-              h$log(((("stack[" + h$RTS_604) + "] = IORef -> ") + ((typeof h$RTS_605.val === "object") ? (((((h$RTS_605.val.f.
-              n + " (") + h$closureTypeName(h$RTS_605.val.f.t)) + ", a: ") + h$RTS_605.val.f.a) + ")") : h$RTS_605.val)));
-            }
-            else
-            {
-              if((typeof h$RTS_605 === "object"))
-              {
-                h$log(((("stack[" + h$RTS_604) + "] = ") + h$collectProps(h$RTS_605).substring(0, 50)));
-              }
-              else
-              {
-                if((typeof h$RTS_605 === "function"))
-                {
-                  var h$RTS_607 = new RegExp("([^\\n]+)\\n(.|\\n)*");
-                  h$log(((("stack[" + h$RTS_604) + "] = ") + ("" + h$RTS_605).substring(0, 50).replace(h$RTS_607, "$1")));
-                }
-                else
-                {
-                  h$log(((("stack[" + h$RTS_604) + "] = ") + ("" + h$RTS_605).substring(0, 50)));
-                };
-              };
-            };
-          };
-        };
-      };
-    };
-  };
-};
-function h$checkObj(h$RTS_608)
-{
-  if(((typeof h$RTS_608 === "boolean") || (typeof h$RTS_608 === "number")))
-  {
-    return undefined;
-  };
-  if(((((!h$RTS_608.hasOwnProperty("f") || (h$RTS_608.f === null)) || (h$RTS_608.f === undefined)) || (h$RTS_608.f.
-  a === undefined)) || (typeof h$RTS_608.f !== "function")))
-  {
-    h$log("h$checkObj: WARNING, something wrong with f:");
-    h$log(("" + h$RTS_608).substring(0, 200));
-    h$log(h$collectProps(h$RTS_608));
-    h$log(typeof h$RTS_608.f);
-  };
-  if((!h$RTS_608.hasOwnProperty("d1") || (h$RTS_608.d1 === undefined)))
-  {
-    h$log("h$checkObj: WARNING, something wrong with d1:");
-    h$log(("" + h$RTS_608).substring(0, 200));
-  }
-  else
-  {
-    if((!h$RTS_608.hasOwnProperty("d2") || (h$RTS_608.d2 === undefined)))
-    {
-      h$log("h$checkObj: WARNING, something wrong with d2:");
-      h$log(("" + h$RTS_608).substring(0, 200));
-    }
-    else
-    {
-      if((((h$RTS_608.d2 !== null) && (typeof h$RTS_608.d2 === "object")) && (h$RTS_608.f.size !== 2)))
-      {
-        var h$RTS_609 = h$RTS_608.d2;
-        var h$RTS_610;
-        for(h$RTS_610 in h$RTS_609)
-        {
-          if(h$RTS_609.hasOwnProperty(h$RTS_610))
-          {
-            if((h$RTS_610.substring(0, 1) != "d"))
-            {
-              h$log(("h$checkObj: WARNING, unexpected field name: " + h$RTS_610));
-              h$log(("" + h$RTS_608).substring(0, 200));
-            };
-            if((h$RTS_609[h$RTS_610] === undefined))
-            {
-              h$log(("h$checkObj: WARNING, undefined field detected: " + h$RTS_610));
-              h$log(("" + h$RTS_608).substring(0, 200));
-            };
-          };
-        };
-        switch (h$RTS_608.f.size)
-        {
-          case (6):
-            if((h$RTS_609.d5 === undefined))
-            {
-              h$log("h$checkObj: WARNING, undefined field detected: d5");
-            };
-          case (5):
-            if((h$RTS_609.d4 === undefined))
-            {
-              h$log("h$checkObj: WARNING, undefined field detected: d4");
-            };
-          case (4):
-            if((h$RTS_609.d3 === undefined))
-            {
-              h$log("h$checkObj: WARNING, undefined field detected: d3");
-            };
-          case (3):
-            if((h$RTS_609.d2 === undefined))
-            {
-              h$log("h$checkObj: WARNING, undefined field detected: d2");
-            };
-            if((h$RTS_609.d1 === undefined))
-            {
-              h$log("h$checkObj: WARNING, undefined field detected: d1");
-            };
-          default:
-            h$RTS_609 = h$RTS_608.d2;
-        };
-      };
-    };
-  };
-};
-function h$traceForeign(h$RTS_611, h$RTS_612)
-{
-  if(true)
-  {
-    return undefined;
-  };
-  var h$RTS_613 = [];
-  for(var h$RTS_614 = 0;(h$RTS_614 < h$RTS_612.length);(h$RTS_614++)) {
-    var h$RTS_615 = h$RTS_612[h$RTS_614];
-    if((h$RTS_615 === null))
-    {
-      h$RTS_613.push("null");
-    }
-    else
-    {
-      if((typeof h$RTS_615 === "object"))
-      {
-        var h$RTS_616 = h$RTS_615.toString();
-        if((h$RTS_616.length > 40))
-        {
-          h$RTS_613.push((h$RTS_616.substring(0, 40) + "..."));
-        }
-        else
-        {
-          h$RTS_613.push(h$RTS_616);
-        };
-      }
-      else
-      {
-        h$RTS_613.push(("" + h$RTS_615));
-      };
-    };
-  };
-  h$log((((("ffi: " + h$RTS_611) + "(") + h$RTS_613.join(",")) + ")"));
-};
-function h$restoreThread()
-{
-  var h$RTS_617 = h$stack[(h$sp - 2)];
-  var h$RTS_618 = h$stack[(h$sp - 1)];
-  var h$RTS_619 = (h$RTS_618 - 3);
-  for(var h$RTS_620 = 1;(h$RTS_620 <= h$RTS_619);(h$RTS_620++)) {
-    h$setReg(h$RTS_620, h$stack[((h$sp - 2) - h$RTS_620)]);
-  };
-  h$sp -= h$RTS_618;
-  return h$RTS_617;
-};
-h$o(h$restoreThread, (-1), 0, (-1), 0, null);
-function h$return()
-{
-  h$r1 = h$stack[(h$sp - 1)];
-  h$sp -= 2;
-  return h$stack[h$sp];
-};
-h$o(h$return, (-1), 0, 1, 0, null);
-function h$returnf()
-{
-  var h$RTS_621 = h$stack[(h$sp - 1)];
-  h$sp -= 2;
-  return h$RTS_621;
-};
-h$o(h$returnf, (-1), 0, 1, 256, null);
-function h$reschedule()
-{
-  return h$reschedule;
-};
-h$o(h$reschedule, 0, 0, 0, 0, null);
-function h$suspendCurrentThread(h$RTS_622)
-{
-  if((h$RTS_622 === h$reschedule))
-  {
-    throw("suspend called with h$reschedule");
-  };
-  if((h$RTS_622.t === (-1)))
-  {
-    h$stack[h$sp] = h$RTS_622;
-  };
-  if(((h$stack[h$sp] === h$restoreThread) || (h$RTS_622 === h$return)))
-  {
-    h$currentThread.sp = h$sp;
-    return undefined;
-  };
-  var h$RTS_623;
-  var h$RTS_624 = 0;
-  var h$RTS_625 = h$RTS_622.t;
-  if((h$RTS_625 === 3))
-  {
-    h$RTS_623 = ((h$r1.d2.d1 >> 8) + 1);
-  }
-  else
-  {
-    if(((h$RTS_625 === 1) || (h$RTS_625 === (-1))))
-    {
-      h$RTS_623 = (h$RTS_622.r >> 8);
-      h$RTS_624 = (h$RTS_622.r & 255);
-    }
-    else
-    {
-      h$RTS_623 = 1;
-    };
-  };
-  h$sp = (((h$sp + h$RTS_623) + h$RTS_624) + 3);
-  for(var h$RTS_626 = 1;(h$RTS_626 <= h$RTS_624);(h$RTS_626++)) {
-    h$stack[((h$sp - 2) - h$RTS_626)] = null;
-  };
-  for(h$RTS_626 = (h$RTS_624 + 1);(h$RTS_626 <= (h$RTS_623 + h$RTS_624));(h$RTS_626++)) {
-    h$stack[((h$sp - 2) - h$RTS_626)] = h$getReg(h$RTS_626);
-  };
-  h$stack[(h$sp - 2)] = h$RTS_622;
-  h$stack[(h$sp - 1)] = ((h$RTS_623 + h$RTS_624) + 3);
-  h$stack[h$sp] = h$restoreThread;
-  h$currentThread.sp = h$sp;
-};
-function h$dumpRes()
-{
-  h$log(("h$dumpRes result: " + h$stack[(h$sp - 1)]));
-  h$log(h$r1);
-  h$log(h$collectProps(h$r1));
-  if((h$r1.f && h$r1.f.n))
-  {
-    h$log(("name: " + h$r1.f.n));
-  };
-  if(h$r1.hasOwnProperty("d1"))
-  {
-    h$log(("d1: " + h$r1.d1));
-  };
-  if(h$r1.hasOwnProperty("d2"))
-  {
-    h$log(("d2: " + h$r1.d2));
-  };
-  if(h$r1.f)
-  {
-    var h$RTS_627 = new RegExp("([^\\n]+)\\n(.|\\n)*");
-    h$log(("function: " + ("" + h$r1.f).substring(0, 50).replace(h$RTS_627, "$1")));
-  };
-  h$sp -= 2;
-  return h$stack[h$sp];
-};
-h$o(h$dumpRes, 0, 0, 1, 256, null);
-function h$resume_e()
-{
-  var h$RTS_628 = h$r1.d1;
-  h$bh();
-  for(var h$RTS_629 = 0;(h$RTS_629 < h$RTS_628.length);(h$RTS_629++)) {
-    h$stack[((h$sp + 1) + h$RTS_629)] = h$RTS_628[h$RTS_629];
-  };
-  h$sp += h$RTS_628.length;
-  h$r1 = null;
-  return h$stack[h$sp];
-};
-h$o(h$resume_e, 0, 0, 0, 256, null);
-function h$unmaskFrame()
-{
-  h$currentThread.mask = 0;
-  --h$sp;
-  if((h$currentThread.excep.length > 0))
-  {
-    h$p2(h$r1, h$return);
-    return h$reschedule;
-  }
-  else
-  {
-    return h$stack[h$sp];
-  };
-};
-h$o(h$unmaskFrame, (-1), 0, 0, 256, null);
-function h$maskFrame()
-{
-  h$currentThread.mask = 2;
-  --h$sp;
-  return h$stack[h$sp];
-};
-h$o(h$maskFrame, (-1), 0, 0, 256, null);
-function h$maskUnintFrame()
-{
-  h$currentThread.mask = 1;
-  --h$sp;
-  return h$stack[h$sp];
-};
-h$o(h$maskUnintFrame, (-1), 0, 0, 256, null);
-function h$unboxFFIResult()
-{
-  var h$RTS_630 = h$r1.d1;
-  for(var h$RTS_631 = 0;(h$RTS_631 < h$RTS_630.length);(h$RTS_631++)) {
-    h$setReg((h$RTS_631 + 1), h$RTS_630[h$RTS_631]);
-  };
-  --h$sp;
-  return h$stack[h$sp];
-};
-h$o(h$unboxFFIResult, (-1), 0, 0, 256, null);
-function h$unbox_e()
-{
-  h$r1 = h$r1.d1;
-  return h$stack[h$sp];
-};
-h$o(h$unbox_e, 0, 0, 1, 256, null);
-function h$retryInterrupted()
-{
-  var h$RTS_632 = h$stack[(h$sp - 1)];
-  h$sp -= 2;
-  return h$RTS_632[0].apply(this, h$RTS_632.slice(1));
-};
-h$o(h$retryInterrupted, (-1), 0, 1, 256, null);
-function h$atomically_e()
-{
-  if(h$stmValidateTransaction())
-  {
-    h$stmCommitTransaction();
-    h$sp -= 2;
-    return h$stack[h$sp];
-  }
-  else
-  {
-    ++h$sp;
-    h$stack[h$sp] = h$checkInvariants_e;
-    return h$stmStartTransaction(h$stack[(h$sp - 2)]);
-  };
-};
-h$o(h$atomically_e, (-1), 0, 1, 256, null);
-function h$checkInvariants_e()
-{
-  --h$sp;
-  return h$stmCheckInvariants();
-};
-h$o(h$checkInvariants_e, (-1), 0, 0, 256, null);
-function h$stmCheckInvariantStart_e()
-{
-  var h$RTS_633 = h$stack[(h$sp - 2)];
-  var h$RTS_634 = h$stack[(h$sp - 1)];
-  var h$RTS_635 = h$currentThread.mask;
-  h$sp -= 3;
-  var h$RTS_636 = new h$Transaction(h$RTS_634.action, h$RTS_633);
-  h$RTS_636.checkRead = new h$Set();
-  h$currentThread.transaction = h$RTS_636;
-  h$p4(h$RTS_636, h$RTS_635, h$stmInvariantViolatedHandler, h$catchStm_e);
-  h$r1 = h$RTS_634.action;
-  return h$ap_1_0_fast();
-};
-h$o(h$stmCheckInvariantStart_e, (-1), 0, 2, 0, null);
-function h$stmCheckInvariantResult_e()
-{
-  var h$RTS_637 = h$stack[(h$sp - 1)];
-  h$sp -= 2;
-  h$stmUpdateInvariantDependencies(h$RTS_637);
-  h$stmAbortTransaction();
-  return h$stack[h$sp];
-};
-h$o(h$stmCheckInvariantResult_e, (-1), 0, 1, 256, null);
-function h$stmInvariantViolatedHandler_e()
-{
-  if((h$stack[h$sp] !== h$stmCheckInvariantResult_e))
-  {
-    throw("h$stmInvariantViolatedHandler_e: unexpected value on stack");
-  };
-  var h$RTS_638 = h$stack[(h$sp - 1)];
-  h$sp -= 2;
-  h$stmUpdateInvariantDependencies(h$RTS_638);
-  h$stmAbortTransaction();
-  return h$throw(h$r2, false);
-};
-h$o(h$stmInvariantViolatedHandler_e, 1, 258, 0, 256, null);
-var h$stmInvariantViolatedHandler = h$c(h$stmInvariantViolatedHandler_e);
-function h$stmCatchRetry_e()
-{
-  h$sp -= 2;
-  h$stmCommitTransaction();
-  return h$stack[h$sp];
-};
-h$o(h$stmCatchRetry_e, (-1), 0, 1, 256, null);
-function h$catchStm_e()
-{
-  h$sp -= 4;
-  return h$stack[h$sp];
-};
-h$o(h$catchStm_e, (-1), 0, 3, 256, null);
-function h$stmResumeRetry_e()
-{
-  if((h$stack[(h$sp - 2)] !== h$atomically_e))
-  {
-    throw("h$stmResumeRetry_e: unexpected value on stack");
-  };
-  var h$RTS_639 = h$stack[(h$sp - 1)];
-  h$sp -= 2;
-  ++h$sp;
-  h$stack[h$sp] = h$checkInvariants_e;
-  h$stmRemoveBlockedThread(h$RTS_639, h$currentThread);
-  return h$stmStartTransaction(h$stack[(h$sp - 2)]);
-};
-h$o(h$stmResumeRetry_e, (-1), 0, 0, 256, null);
-function h$lazy_e()
-{
-  var h$RTS_640 = h$r1.d1();
-  h$bh();
-  h$r1 = h$RTS_640;
-  return h$stack[h$sp];
-};
-h$o(h$lazy_e, 0, 0, 0, 256, null);
− examples/static/out.jsexe/runmain.js
@@ -1,2 +0,0 @@-h$main(h$mainZCZCMainzimain);
-
− examples/webMapReduce.hs
@@ -1,70 +0,0 @@-{-# LANGUAGE   CPP #-}
-
-module Main where
-
-import Prelude hiding (div,id)
-import Transient.Internals ((!>))
-import Transient.Base
-
-#ifdef ghcjs_HOST_OS
-   hiding ( option)
-#endif
-import GHCJS.HPlay.View
-#ifdef ghcjs_HOST_OS
-   hiding (map)
-#else
-   hiding (map, option)
-#endif
-
-import Transient.Move
-import Transient.Logged
-import Control.Applicative
-import Control.Monad
-import Data.Typeable
-import Data.IORef
-import Control.Concurrent (threadDelay)
-import Control.Monad.IO.Class
-import qualified Data.Vector as V
-import qualified Data.Map as M
-
-
-import Transient.MapReduce
-
-
-
-
-
-
-
--- A Web node launch a map-reduce in all the server nodes, getting data from a
--- web node from a textbox imput and render the returned results
-
-main =   simpleWebApp 8080 app
-
-
-app= do
-
-    content <-  local . render $
-                    textArea  (fs "") ! atr "placeholder" (fs "enter the content")
-                                      ! atr "rows" (fs "4")
-                                      ! atr "cols" (fs "80")
-                                 `fire` OnChange
-                     <++ br
-                     <** inputSubmit "send"  -- `fire` OnClick
-
-    r <- atRemote $ do
-               lliftIO $ print content
-               r<- reduce  (+)
-                    . mapKeyB (\w -> (w, 1 :: Int))
-                    $ getText  words content
-               lliftIO $ print r
-               return (r :: M.Map String Int)
-
-
-    local . render $ rawHtml $do
-                 h1 "Results"
-                 mconcat[i "word " >> b w >> i " appears " >> b n >> i "times" >> br
-                        | (w,n) <- M.assocs r]
-
-fs= toJSString
-
− examples/webapp.hs
@@ -1,128 +0,0 @@-{-# LANGUAGE   CPP #-}
-
-module Main where
-
-import Prelude hiding (div,id,span)
-import Transient.Base
-#ifdef ghcjs_HOST_OS
-   hiding ( option)
-#endif
-import GHCJS.HPlay.View
-#ifdef ghcjs_HOST_OS
-   hiding (map)
-#else
-   hiding (map, option)
-#endif
-
-import Transient.Move
-import Transient.Indeterminism
-import Control.Applicative
-import Control.Monad
-import Data.Typeable
-import Data.IORef
-import Control.Concurrent (threadDelay)
-import Control.Monad.IO.Class
-
-
--- Show the composability of transient web aplications
--- with three examples composed together, each one is a widget that execute
--- code in the browser AND the server.
-
-main = simpleWebApp 8080 $  demo <|> demo2  <|>  counters
-
-
-
-demo= do
-   name <- local . render $ do
-       rawHtml $ do
-          hr
-          p "this snippet captures the essence of this demonstration"
-          p $ do
-             span "it's a blend of server and browser code in a "
-             span $ b "composable"
-             span " piece"
-
-          div ! id (fs "fibs") $ i "Fibonacci numbers should appear here"
-
-   local . render $ wlink () (p " stream fibonacci numbers")
-
-   -- stream fibonacci
-
-   r <-  atRemote $ do
-               let fibs= 0 : 1 : zipWith (+) fibs (tail fibs) :: [Int]  -- fibonacci numb. definition
-
-               r <- local  . threads 1 . choose $ take 10 fibs
-               lliftIO $ print r
-               lliftIO $ threadDelay 1000000
-               return r
-
-   local . render . at (fs "#fibs") Append $ rawHtml $  (h2 r)
-
-
-
-demo2= do
-   name <- local . render $ do
-       rawHtml $ do
-          hr
-          br;br
-          p "In this example you enter your name and the server will salute you"
-          br
-
---       inputString (Just "Your name") `fire` OnKeyUp       -- send once a char is entered
-       inputString Nothing ! atr "placeholder" (fs "enter your name") `fire` OnKeyUp
-             <++ br                                        -- new line
-
-   r <- atRemote $ lliftIO $ print (name ++ " calling") >> return ("Hi " ++ name)
-
-   local . render . rawHtml $ do
-            p " returned"
-            h2 r
-
-
-
-fs= toJSString
-
-
-
-
-counters= do
-   local . render . rawHtml $ do
-          hr
-          p "To demonstrate the use of teleport, widgets, interactive streaming"
-          p "and composability in a web application."
-          br
-          p "This is one of the most complicated interactions: how to control a stream in the server"
-          p "by means of a web interface without loosing composability."
-          br
-          p "in this example, events flow from the server to the browser (a counter) and back from"
-          p "the browser to the server (initiating and cancelling the counters)"
-
---   server <- local $ getSData <|> error "no server???"
-   counter  <|> counter
-
-   where
-   counter  =  do
-         op <-  startOrCancel
-         teleport          -- translates the computation to the server
-         r <- local $ case op of
-                   "start"  ->  killChilds >> stream
-                   "cancel" ->  killChilds >> stop
-
-         teleport          -- back to the browser again
-         local $ render $ rawHtml $ h1 r
-
-   -- generates a sequence of numbers
-   stream= do
-     counter <- liftIO $ newIORef (0 :: Int)
-     waitEvents $ do
-          n <- atomicModifyIORef counter $ \r -> (r +1,r)
-          threadDelay 1000000
-          putStr "generating: " >> print n
-          return  n
-
-startOrCancel :: Cloud String
-startOrCancel= local $ render $   (inputSubmit "start"  `fire` OnClick)
-                              <|> (inputSubmit "cancel" `fire` OnClick)
-                              <++ br
-
-
− examples/widgets.hs
@@ -1,89 +0,0 @@-{-# LANGUAGE DeriveDataTypeable , ExistentialQuantification
-    ,ScopedTypeVariables, StandaloneDeriving, RecordWildCards, FlexibleContexts, CPP
-    ,GeneralizedNewtypeDeriving #-}
-
-module Main where
-
-import Prelude hiding (div)
-import Transient.Base
-#ifdef ghcjs_HOST_OS
-   hiding ( option,runCloud')
-#endif
-import GHCJS.HPlay.View
-#ifdef ghcjs_HOST_OS
-   hiding (map)
-#else
-   hiding (map, option,runCloud')
-#endif
-
-import  Transient.Move  hiding(teleport)
-import Control.Applicative
-import Control.Monad
-import Data.Typeable
-import Data.IORef
-import Control.Concurrent (threadDelay)
-import Control.Monad.IO.Class
-import Data.Monoid
-import Data.String
-
-{-
-Example with different input fields with events and haskell combinators
-
-The hplayground version is running at:
-
-http://tryplayg.herokuapp.com/try/widgets.hs/edit
-
-That running version uses the Haste haskell to JS compiler, while this has to be compiled
-with GHCJS. Some differences:
-
-This is a client AND server side app. while the hplayground one is purely client-side
-
-If you have installed transient, transient-universe and ghcjs-hplay packages, just compile and run it with
-
-
-ghcjs   examples/widgets.hs -o static/out
-runghc  examples/widgets.hs
-
-Also is different:
-now Widgets run in his own monad. To render them and convert them to the Transient monad it
-uses `render`. Since `simpleWebApp` expect a `Cloud` application, use `local` to run a local transient computation. `onBrowser` only execute in the web browser, so the server application does nothing. Simply stay watching at the port 8081 for browser requests.
-
-Also the <br> tags have been moved to the widgets and the **> has been substituted by the more standard <|> operator. In the other side,  rawHtml (=== wraw) is more readable.
-
--}
-
-main= simpleWebApp 8081 $ onBrowser $ local $   buttons  <|> linksample
-    where
-    linksample= do
-          r <-  render $ br ++> br ++> wlink "Hi!" (toElem "This link say Hi!")`fire` OnClick
-          render $ rawHtml . b  $ " returns "++ r
-
-    buttons :: TransIO ()
-    buttons= do
-           render . rawHtml $ p "Different input elements:"
-           radio <|> checkButton  <|> select
-
-    checkButton :: TransIO ()
-    checkButton=do
-           rs <- render $  br ++> br ++>  getCheckBoxes(
-                           ((setCheckBox False "Red"    <++ b "red")   `fire` OnClick)
-                        <> ((setCheckBox False "Green"  <++ b "green") `fire` OnClick)
-                        <> ((setCheckBox False "blue"   <++ b "blue")  `fire` OnClick))
-           render $ rawHtml $ fromString " returns: " <> b (show rs)
-
-    radio :: TransIO ()
-    radio= do
-           r <- render $ getRadio [fromString v ++> setRadioActive v
-                         | v <- ["red","green","blue"]]
-
-           render $ rawHtml $ fromString " returns: " <> b ( show r )
-
-    select :: TransIO ()
-    select= do
-           r <- render $ br ++> br ++> getSelect
-                          (   setOption "red"   (fromString "red")
-                          <|> setOption "green" (fromString "green")
-                          <|> setOption "blue"  (fromString "blue"))
-                  `fire` OnClick
-
-           render $ rawHtml $ fromString " returns: " <> b ( show r )
− logo.ico

binary file changed (2097 → absent bytes)

src/Transient/MapReduce.hs view
@@ -1,502 +1,502 @@-{-# LANGUAGE  ExistentialQuantification, DeriveDataTypeable
-, FlexibleInstances, MultiParamTypeClasses, OverloadedStrings, CPP #-}
-
-
-module Transient.MapReduce
---  (
---Distributable(..),distribute, getText,
---getUrl, getFile,textUrl, textFile,
---mapKeyB, mapKeyU, reduce,eval,
---PartRef)
- where
-
-#ifdef ghcjs_HOST_OS
-import Transient.Base
-import Transient.Move hiding (pack)
-import Transient.Logged
--- dummy Transient.MapReduce module,
-reduce _ _ = local stop :: Loggable a => Cloud a
-mapKeyB _ _= undefined
-mapKeyU _ _= undefined
-distribute _ = undefined
-getText _ _ = undefined
-textFile _ = undefined
-getUrl _ _ = undefined
-textUrl _ = undefined
-getFile _ _ = undefined
-eval _= local stop
-
-data DDS= DDS
-class Distributable
-data PartRef a=PartRef a
-
-#else
-
-import Transient.Base
-import Transient.Internals((!>))
-import Transient.Move hiding (pack)
-import Transient.Logged
-import Transient.Indeterminism
-import Control.Applicative
-import System.Random
-import Control.Monad.IO.Class
-
-import System.IO
-import Control.Monad
-import Data.Monoid
-import Data.Maybe
-
-import Data.Typeable
-import Data.List hiding (delete, foldl')
-import Control.Exception
-import Control.Concurrent
---import Data.Time.Clock
-import Network.HTTP
-import Data.TCache
-import Data.TCache.Defs
-
-import Data.ByteString.Lazy.Char8 (pack,unpack)
-import Control.Monad.STM
-import qualified Data.Map.Strict as M
-import Control.Arrow (second)
-import qualified Data.Vector.Unboxed as DVU
-import qualified Data.Vector as DV
-import Data.Hashable
-import System.IO.Unsafe
-
-import qualified Data.Foldable as F
-import qualified Data.Text as Text
-
-data DDS a= Loggable a => DDS  (Cloud (PartRef a))
-data PartRef a= Ref Node Path Save deriving (Typeable, Read, Show)
-data Partition a=  Part Node Path Save a deriving (Typeable,Read,Show)
-type Save= Bool
-
-
-instance Indexable (Partition a) where
-    key (Part _ string b _)= keyp string b
-
-
-
-keyp s True= "PartP@"++s :: String
-keyp s False="PartT@"++s
-
-instance Loggable a => IResource (Partition a) where
-    keyResource= key
-    readResourceByKey k=  r
-      where
-      typePart :: IO (Maybe a) -> a
-      typePart = undefined
-      r =  if k !! 4 /= 'P' then return Nothing   else
-            defaultReadByKey  (defPath (typePart r) ++ k) >>= return . fmap ( read . unpack)
-    writeResource (s@(Part _ _ save _))=
-          unless (not save) $ defaultWrite (defPath s ++ key s) (pack $ show s)
-
-
-eval :: DDS a -> Cloud (PartRef a)
-eval (DDS mx) =  mx
-
-
-type Path=String
-
-
-instance F.Foldable DVU.Vector where
-  {-# INLINE foldr #-}
-  foldr = foldr
-
-  {-# INLINE foldl #-}
-  foldl = foldl
-
-  {-# INLINE foldr1 #-}
-  foldr1 = foldr1
-
-  {-# INLINE foldl1 #-}
-  foldl1 = foldl1
-
---foldlIt' :: V.Unbox a => (b -> a -> b) -> b -> V.Vector a -> b
---foldlIt' f z0 xs= V.foldr f' id xs z0
---      where f' x k z = k $! f z x
---
---foldlIt1 :: V.Unbox a => (a -> a -> a) -> V.Vector a -> a
---foldlIt1 f xs = fromMaybe (error "foldl1: empty structure")
---                    (V.foldl mf Nothing xs)
---      where
---        mf m y = Just (case m of
---                         Nothing -> y
---                         Just x  -> f x y)
-
-class (F.Foldable c, Typeable c, Typeable a, Monoid (c a), Loggable (c a)) => Distributable c a where
-   singleton :: a -> c a
-   splitAt :: Int -> c a -> (c a, c a)
-   fromList :: [a] -> c a
-
-instance (Loggable a) => Distributable DV.Vector a where
-   singleton = DV.singleton
-   splitAt= DV.splitAt
-   fromList = DV.fromList
-
-instance (Loggable a,DVU.Unbox a) => Distributable DVU.Vector a where
-   singleton= DVU.singleton
-   splitAt= DVU.splitAt
-   fromList= DVU.fromList
-
-
-
-
--- | perform a map and partition the result with different keys using boxed vectors
--- The final result will be used by reduce.
-mapKeyB :: (Loggable a, Loggable b,  Loggable k,Ord k)
-     => (a -> (k,b))
-     -> DDS  (DV.Vector a)
-     -> DDS (M.Map k(DV.Vector b))
-mapKeyB= mapKey
-
--- | perform a map and partition the result with different keys using unboxed vectors
--- The final result will be used by reduce.
-mapKeyU :: (Loggable a, DVU.Unbox a, Loggable b, DVU.Unbox b,  Loggable k,Ord k)
-     => (a -> (k,b))
-     -> DDS  (DVU.Vector a)
-     -> DDS (M.Map k(DVU.Vector b))
-mapKeyU= mapKey
-
--- | perform a map and partition the result with different keys.
--- The final result will be used by reduce.
-mapKey :: (Distributable vector a,Distributable vector b, Loggable k,Ord k)
-     => (a -> (k,b))
-     -> DDS  (vector a)
-     -> DDS (M.Map k (vector b))
-mapKey f (DDS mx)= DDS $ loggedc $  do
-        refs <-  mx
-        process refs
-
-  where
---  process ::  Partition a -> Cloud [Partition b]
-  process  (ref@(Ref node path sav))= runAt node $ local $ do
-              xs <- getPartitionData ref    -- !> ("CMAP", ref,node)
-              (generateRef  $ map1 f xs)
-
-
-
---  map1 :: (Ord k, F.Foldable vector) => (a -> (k,b)) -> vector a -> M.Map k(vector b)
-  map1 f v=  F.foldl' f1  M.empty v
-     where
-     f1 map x=
-           let (k,r) = f x
-           in M.insertWith (<>) k (Transient.MapReduce.singleton r) map
-
-
-
---instance Show a => Show (MVar a) where
---   show mvx= "MVar " ++ show (unsafePerformIO $ readMVar mvx)
---
---instance Read a => Read (MVar a) where
---   readsPrec n ('M':'V':'a':'r':' ':s)=
---      let [(x,s')]= readsPrec n s
---      in [(unsafePerformIO $ newMVar x,s')]
-
-data ReduceChunk a= EndReduce | Reduce a deriving (Typeable, Read, Show)
-
-reduce ::  (Hashable k,Ord k, Distributable vector a, Loggable k,Loggable a)
-             => (a -> a -> a) -> DDS (M.Map k (vector a)) ->Cloud (M.Map k a)
-
-reduce red  (dds@(DDS mx))= loggedc $ do
-
-   box <- lliftIO $ return . Text.pack =<<  replicateM  10 (randomRIO ('a','z'))
-   nodes <- local getNodes
-
-   let lengthNodes = length nodes
-       shuffler nodes = do
-          ref@(Ref node path sav) <- mx
---          return ()                                  !> ref
-          runAt node  $  foldAndSend  nodes ref
-
-          stop
-
---     groupByDestiny :: (Hashable k, Distributable vector a)  => M.Map k (vector a) -> M.Map Int [(k ,vector a)]
-       groupByDestiny  map =  M.foldlWithKey' f M.empty  map
-              where
---              f ::  M.Map Int [(k ,vector a)] -> k -> vector a -> M.Map Int [(k ,vector a)]
-              f map k vs= M.insertWith (<>) (hash1 k) [(k,vs)] map
-              hash1 k= abs $ hash k `rem` length nodes
-
-
---           foldAndSend :: (Hashable k, Distributable vector a)=> (Int,[(k,vector a)]) -> Cloud ()
-       foldAndSend nodes ref=  do
-
-             pairs <- onAll $ getPartitionData1 ref
-                        <|>  return (error $ "DDS computed out of his node:"++ show ref)
-             let mpairs = groupByDestiny pairs
-             length <- local . return $ M.size mpairs
-
-             nsent <-  onAll $ liftIO $ newMVar 0
-
-             (i,folded) <- local $ parallelize foldthem (M.assocs  mpairs)
-
-             n <- lliftIO $ modifyMVar nsent $ \r -> return (r+1, r+1)
-             runAt (nodes !! i) $  local $ putMailbox box $ Reduce folded
-
-             when (n == length) $ sendEnd  nodes
-
-             where
-             count n proc proc2=  do
-                             nsent <-  onAll $ liftIO $ newMVar 0
-                             proc
-                             n' <- lliftIO $ modifyMVar nsent $ \r -> return (r+1, r+1)
-                             when (n'==n) proc2
-
-             foldthem (i,kvs)=  async . return
-                                $ (i,map (\(k,vs) -> (k,foldl1 red vs)) kvs)
-
-
-       sendEnd nodes   = onNodes nodes . local $  putMailbox box (EndReduce `asTypeOf` paramOf dds)
-                                                         -- !> ("send ENDREDUCE",mynode)
-       onNodes  nodes f= foldr (<|>) empty $ map (\n -> runAt n f) nodes
-
-       sumNodes nodes f= foldr (<>) mempty $ map (\n -> runAt n f) nodes
-
-       reducer nodes=   sumNodes nodes reduce1    -- a reduce1 process in each node, get the results and mappend them
-
---     reduce :: (Ord k)  => Cloud (M.Map k v)
-
-       reduce1 = local $ do
-           reduceResults <- liftIO $ newMVar M.empty
-           numberSent    <- liftIO $ newMVar 0
-
-           minput <- getMailbox box  -- get the chunk once it arrives to the mailbox
-
-           case minput  of
-
-             EndReduce -> do
-
-                n <- liftIO $ modifyMVar numberSent $ \r -> return (r+1, r+1)
-
-                if n == lengthNodes             --  !> ("END REDUCE RECEIVED",n, lengthNodes,mynode)
-                 then do
-                    cleanMailbox box (EndReduce `asTypeOf` paramOf dds)
-                    r <- liftIO $ readMVar reduceResults
-                    return r                    --  !> ("reduceresult",r)
-
-                 else stop
-
-             Reduce kvs ->  do
-                let addIt (k,inp) = do
-                        let input= inp `asTypeOf` atype dds
-                        liftIO $ modifyMVar_ reduceResults
-                               $ \map -> do
-                                  let maccum =  M.lookup k map
-                                  return $ M.insert k (case maccum of
-                                    Just accum ->  red input accum
-                                    Nothing    ->  input) map
-                mapM addIt  (kvs `asTypeOf` paramOf' dds)        --  !> ("Received Reduce",kvs)
-                stop
-
-
-   reducer  nodes  <|>  shuffler nodes
-   where
-     atype ::DDS(M.Map k (vector a)) ->  a
-     atype = undefined -- type level
-
-     paramOf  :: DDS (M.Map k (vector a)) -> ReduceChunk [( k,  a)]
-     paramOf = undefined -- type level
-     paramOf'  :: DDS (M.Map k (vector a)) ->  [( k,  a)]
-     paramOf' = undefined -- type level
-
-
-
-
---parallelize :: Loggable b => (a -> Cloud b) -> [a] -> Cloud b
-parallelize f xs =  foldr (<|>) empty $ map f xs
-
-mparallelize f xs =  loggedc $ foldr (<>) mempty $ map f xs
-
-
-
-
-
-getPartitionData :: Loggable a => PartRef a   -> TransIO  a
-getPartitionData (Ref node path save)  = Transient $ do
-    mp <- (liftIO $ atomically
-                       $ readDBRef
-                       $ getDBRef
-                       $ keyp path save)
-                  `onNothing` error ("not found DDS data: "++ keyp path save)
-    case mp of
-       (Part _ _ _ xs) -> return $ Just xs
-
-getPartitionData1 :: Loggable a => PartRef a   -> TransIO  a
-getPartitionData1 (Ref node path save)  = Transient $ do
-    mp <- liftIO $ atomically
-                  $ readDBRef
-                  $ getDBRef
-                  $ keyp path save
-
-    case mp of
-      Just (Part _ _ _ xs) -> return $ Just xs
-      Nothing -> return Nothing
-
-getPartitionData2 :: Loggable a => PartRef a   -> IO  a
-getPartitionData2 (Ref node path save)  =  do
-    mp <- ( atomically
-                       $ readDBRef
-                       $ getDBRef
-                       $ keyp path save)
-                  `onNothing` error ("not found DDS data: "++ keyp path save)
-    case mp of
-       (Part _ _ _ xs) -> return  xs
-
--- en caso de fallo de Node, se lanza un clustered en busca del path
---   si solo uno lo tiene, se copia a otro
---   se pone ese nodo de referencia en Part
-runAtP :: Loggable a => Node  -> (Path -> IO a) -> Path -> Cloud a
-runAtP node f uuid= do
-   r <- streamFrom node $ onAll . liftIO $ (SLast <$> f uuid) `catch` sendAnyError
-   case r of
-     SLast r -> return r
-     SError e -> do
-         nodes <-  mclustered $ search uuid
-         when(length nodes < 1) $ asyncDuplicate node uuid
-         runAtP ( head nodes) f uuid
-
-search uuid= error $ "chunk failover not yet defined. Lookin for: "++ uuid
-
-asyncDuplicate node uuid= do
-    forkTo node
-    nodes <- onAll getNodes
-    let node'= head $ nodes \\ [node]
-    content <- onAll . liftIO $ readFile uuid
-    runAt node' $ local $ liftIO $ writeFile uuid content
-
-sendAnyError :: SomeException -> IO (StreamData a)
-sendAnyError e= return $ SError  e
-
-
--- | distribute a vector of values among many nodes.
--- If the vector is static and sharable, better use the get* primitives
--- since each node will load the data independently.
-distribute :: (Loggable a, Distributable vector a ) => vector a -> DDS (vector a)
-distribute = DDS . distribute'
-
-distribute' xs= loggedc $  do
-   nodes <- local getNodes                                        -- !> "DISTRIBUTE"
-   let lnodes = length nodes
-   let size= case F.length xs `div` (length nodes) of 0 ->1 ; n -> n
-       xss= split size lnodes 1 xs                                     -- !> size
-   r <- distribute'' xss nodes
-   return r
-   where
-   split n s s' xs | s==s' = [xs]
-   split n s s' xs=
-      let (h,t)= Transient.MapReduce.splitAt n xs
-      in h : split n s (s'+1) t
-
-distribute'' :: (Loggable a, Distributable vector a)
-             => [vector a] -> [Node] -> Cloud (PartRef (vector a))
-distribute'' xss nodes =
-   parallelize  move $ zip nodes xss   -- !> show xss
-   where
-   move (node, xs)=  runAt node $ local $ do
-                        par <- generateRef  xs
-                        return  par
-          --   !> ("move", node,xs)
-
--- | input data from a text that must be static and shared by all the nodes.
--- The function parameter partition the text in words
-getText  :: (Loggable a, Distributable vector a) => (String -> [a]) -> String -> DDS (vector a)
-getText part str= DDS $ loggedc $ do
-   nodes' <- local getNodes                                        -- !> "DISTRIBUTE"
-   let nodes  = filter (not . isWebNode) nodes'
-   let lnodes = length nodes
-
-   parallelize  (process lnodes)  $ zip nodes [0..lnodes-1]
-   where
-   isWebNode node= "webnode" `elem` (map fst $ nodeServices node)
-
-   process lnodes (node,i)= do
-      runAt node $ local $ do
-            let xs = part str
-                size= case length xs `div` lnodes of 0 ->1 ; n -> n
-                xss= Transient.MapReduce.fromList $
-                       if i== lnodes-1 then drop (i* size) xs else  take size $ drop  (i *  size) xs
-            generateRef  xss
-
-
--- | get the worlds of an URL
-textUrl :: String -> DDS (DV.Vector Text.Text)
-textUrl= getUrl  (map Text.pack . words)
-
--- | generate a DDS from the content of a URL.
--- The first parameter is a function that divide the text in words
-getUrl :: (Loggable a, Distributable vector a) => (String -> [a]) -> String -> DDS (vector a)
-getUrl partitioner url= DDS $ do
-   nodes <- local getNodes                                        -- !> "DISTRIBUTE"
-   let lnodes = length nodes
-
-   parallelize  (process lnodes)  $ zip nodes [0..lnodes-1]    -- !> show xss
-   where
-   process lnodes (node,i)=  runAt node $ local $ do
-                        r <- liftIO . simpleHTTP $ getRequest url
-                        body <- liftIO $  getResponseBody r
-                        let xs = partitioner body
-                            size= case length xs `div` lnodes of 0 ->1 ; n -> n
-                            xss= Transient.MapReduce.fromList $ take size $ drop  (i *  size) xs
-                        generateRef  xss
-
-
--- | get the words of a file
-textFile ::  String -> DDS (DV.Vector Text.Text)
-textFile= getFile (map Text.pack . words)
-
--- | generate a DDS from a file. All the nodes must access the file with the same path
--- the first parameter is the parser that generates elements from the content
-getFile :: (Loggable a, Distributable vector a) => (String -> [a]) ->  String -> DDS (vector a)
-getFile partitioner file= DDS $ do
-   nodes <- local getNodes                                        -- !> "DISTRIBUTE"
-   let lnodes = length nodes
-
-   parallelize  (process lnodes) $ zip nodes [0..lnodes-1]    -- !> show xss
-   where
-   process lnodes (node, i)=  runAt node $ local $ do
-                        content <- liftIO $ readFile file
-                        let xs = partitioner content
-                            size= case length xs `div` lnodes of 0 ->1 ; n -> n
-                            xss=Transient.MapReduce.fromList $ take size $ drop  (i *  size) xs  -- !> size
-                        generateRef    xss
-
-
-
-generateRef :: Loggable a =>  a -> TransIO (PartRef a)
-generateRef  x=  do
-    node <- getMyNode
-    liftIO $ do
-       temp <- getTempName
-       let reg=  Part node temp False  x
-       atomically $ newDBRef reg
---       syncCache
-       (return $ getRef reg)     -- !> ("generateRef",reg,node)
-
-getRef (Part n t s x)= Ref n t s
-
-getTempName :: IO String
-getTempName=  ("DDS" ++) <$> replicateM  5 (randomRIO ('a','z'))
-
-
--------------- Distributed  Datasource Streams ---------
--- | produce a stream of DDS's that can be map-reduced. Similar to spark streams.
--- each interval of time,a new DDS is produced.(to be tested)
-streamDDS
-  :: (Loggable a, Distributable vector a) =>
-     Integer -> IO (StreamData a) -> DDS (vector a)
-streamDDS time io= DDS $ do
-     xs <- local . groupByTime time $ do
-               r <- parallel io
-               case r of
-                    SDone -> empty
-                    SLast x -> return x
-                    SMore x -> return x
-                    SError e -> error $ show e
-     distribute'  $ Transient.MapReduce.fromList xs
-
-
-
-
-#endif
+{-# LANGUAGE  ExistentialQuantification, DeriveDataTypeable+, FlexibleInstances, MultiParamTypeClasses, OverloadedStrings, CPP #-}+++module Transient.MapReduce+--  (+--Distributable(..),distribute, getText,+--getUrl, getFile,textUrl, textFile,+--mapKeyB, mapKeyU, reduce,eval,+--PartRef)+ where++#ifdef ghcjs_HOST_OS+import Transient.Base+import Transient.Move hiding (pack)+import Transient.Logged+-- dummy Transient.MapReduce module,+reduce _ _ = local stop :: Loggable a => Cloud a+mapKeyB _ _= undefined+mapKeyU _ _= undefined+distribute _ = undefined+getText _ _ = undefined+textFile _ = undefined+getUrl _ _ = undefined+textUrl _ = undefined+getFile _ _ = undefined+eval _= local stop++data DDS= DDS+class Distributable+data PartRef a=PartRef a++#else++import Transient.Base+import Transient.Internals((!>))+import Transient.Move hiding (pack)+import Transient.Logged+import Transient.Indeterminism+import Control.Applicative+import System.Random+import Control.Monad.IO.Class++import System.IO+import Control.Monad+import Data.Monoid+import Data.Maybe++import Data.Typeable+import Data.List hiding (delete, foldl')+import Control.Exception+import Control.Concurrent+--import Data.Time.Clock+import Network.HTTP+import Data.TCache+import Data.TCache.Defs++import Data.ByteString.Lazy.Char8 (pack,unpack)+import Control.Monad.STM+import qualified Data.Map.Strict as M+import Control.Arrow (second)+import qualified Data.Vector.Unboxed as DVU+import qualified Data.Vector as DV+import Data.Hashable+import System.IO.Unsafe++import qualified Data.Foldable as F+import qualified Data.Text as Text++data DDS a= Loggable a => DDS  (Cloud (PartRef a))+data PartRef a= Ref Node Path Save deriving (Typeable, Read, Show)+data Partition a=  Part Node Path Save a deriving (Typeable,Read,Show)+type Save= Bool+++instance Indexable (Partition a) where+    key (Part _ string b _)= keyp string b++++keyp s True= "PartP@"++s :: String+keyp s False="PartT@"++s++instance Loggable a => IResource (Partition a) where+    keyResource= key+    readResourceByKey k=  r+      where+      typePart :: IO (Maybe a) -> a+      typePart = undefined+      r =  if k !! 4 /= 'P' then return Nothing   else+            defaultReadByKey  (defPath (typePart r) ++ k) >>= return . fmap ( read . unpack)+    writeResource (s@(Part _ _ save _))=+          unless (not save) $ defaultWrite (defPath s ++ key s) (pack $ show s)+++eval :: DDS a -> Cloud (PartRef a)+eval (DDS mx) =  mx+++type Path=String+++instance F.Foldable DVU.Vector where+  {-# INLINE foldr #-}+  foldr = foldr++  {-# INLINE foldl #-}+  foldl = foldl++  {-# INLINE foldr1 #-}+  foldr1 = foldr1++  {-# INLINE foldl1 #-}+  foldl1 = foldl1++--foldlIt' :: V.Unbox a => (b -> a -> b) -> b -> V.Vector a -> b+--foldlIt' f z0 xs= V.foldr f' id xs z0+--      where f' x k z = k $! f z x+--+--foldlIt1 :: V.Unbox a => (a -> a -> a) -> V.Vector a -> a+--foldlIt1 f xs = fromMaybe (error "foldl1: empty structure")+--                    (V.foldl mf Nothing xs)+--      where+--        mf m y = Just (case m of+--                         Nothing -> y+--                         Just x  -> f x y)++class (F.Foldable c, Typeable c, Typeable a, Monoid (c a), Loggable (c a)) => Distributable c a where+   singleton :: a -> c a+   splitAt :: Int -> c a -> (c a, c a)+   fromList :: [a] -> c a++instance (Loggable a) => Distributable DV.Vector a where+   singleton = DV.singleton+   splitAt= DV.splitAt+   fromList = DV.fromList++instance (Loggable a,DVU.Unbox a) => Distributable DVU.Vector a where+   singleton= DVU.singleton+   splitAt= DVU.splitAt+   fromList= DVU.fromList+++++-- | perform a map and partition the result with different keys using boxed vectors+-- The final result will be used by reduce.+mapKeyB :: (Loggable a, Loggable b,  Loggable k,Ord k)+     => (a -> (k,b))+     -> DDS  (DV.Vector a)+     -> DDS (M.Map k(DV.Vector b))+mapKeyB= mapKey++-- | perform a map and partition the result with different keys using unboxed vectors+-- The final result will be used by reduce.+mapKeyU :: (Loggable a, DVU.Unbox a, Loggable b, DVU.Unbox b,  Loggable k,Ord k)+     => (a -> (k,b))+     -> DDS  (DVU.Vector a)+     -> DDS (M.Map k(DVU.Vector b))+mapKeyU= mapKey++-- | perform a map and partition the result with different keys.+-- The final result will be used by reduce.+mapKey :: (Distributable vector a,Distributable vector b, Loggable k,Ord k)+     => (a -> (k,b))+     -> DDS  (vector a)+     -> DDS (M.Map k (vector b))+mapKey f (DDS mx)= DDS $ loggedc $  do+        refs <-  mx+        process refs++  where+--  process ::  Partition a -> Cloud [Partition b]+  process  (ref@(Ref node path sav))= runAt node $ local $ do+              xs <- getPartitionData ref    -- !> ("CMAP", ref,node)+              (generateRef  $ map1 f xs)++++--  map1 :: (Ord k, F.Foldable vector) => (a -> (k,b)) -> vector a -> M.Map k(vector b)+  map1 f v=  F.foldl' f1  M.empty v+     where+     f1 map x=+           let (k,r) = f x+           in M.insertWith (<>) k (Transient.MapReduce.singleton r) map++++--instance Show a => Show (MVar a) where+--   show mvx= "MVar " ++ show (unsafePerformIO $ readMVar mvx)+--+--instance Read a => Read (MVar a) where+--   readsPrec n ('M':'V':'a':'r':' ':s)=+--      let [(x,s')]= readsPrec n s+--      in [(unsafePerformIO $ newMVar x,s')]++data ReduceChunk a= EndReduce | Reduce a deriving (Typeable, Read, Show)++reduce ::  (Hashable k,Ord k, Distributable vector a, Loggable k,Loggable a)+             => (a -> a -> a) -> DDS (M.Map k (vector a)) ->Cloud (M.Map k a)++reduce red  (dds@(DDS mx))= loggedc $ do++   box <- lliftIO $ return . Text.pack =<<  replicateM  10 (randomRIO ('a','z'))+   nodes <- local getNodes++   let lengthNodes = length nodes+       shuffler nodes = do+          ref@(Ref node path sav) <- mx+--          return ()                                  !> ref+          runAt node  $  foldAndSend  nodes ref++          stop++--     groupByDestiny :: (Hashable k, Distributable vector a)  => M.Map k (vector a) -> M.Map Int [(k ,vector a)]+       groupByDestiny  map =  M.foldlWithKey' f M.empty  map+              where+--              f ::  M.Map Int [(k ,vector a)] -> k -> vector a -> M.Map Int [(k ,vector a)]+              f map k vs= M.insertWith (<>) (hash1 k) [(k,vs)] map+              hash1 k= abs $ hash k `rem` length nodes+++--           foldAndSend :: (Hashable k, Distributable vector a)=> (Int,[(k,vector a)]) -> Cloud ()+       foldAndSend nodes ref=  do++             pairs <- onAll $ getPartitionData1 ref+                        <|>  return (error $ "DDS computed out of his node:"++ show ref)+             let mpairs = groupByDestiny pairs+             length <- local . return $ M.size mpairs++             nsent <-  onAll $ liftIO $ newMVar 0++             (i,folded) <- local $ parallelize foldthem (M.assocs  mpairs)++             n <- lliftIO $ modifyMVar nsent $ \r -> return (r+1, r+1)+             runAt (nodes !! i) $  local $ putMailbox box $ Reduce folded++             when (n == length) $ sendEnd  nodes++             where+             count n proc proc2=  do+                             nsent <-  onAll $ liftIO $ newMVar 0+                             proc+                             n' <- lliftIO $ modifyMVar nsent $ \r -> return (r+1, r+1)+                             when (n'==n) proc2++             foldthem (i,kvs)=  async . return+                                $ (i,map (\(k,vs) -> (k,foldl1 red vs)) kvs)+++       sendEnd nodes   = onNodes nodes . local $  putMailbox box (EndReduce `asTypeOf` paramOf dds)+                                                         -- !> ("send ENDREDUCE",mynode)+       onNodes  nodes f= foldr (<|>) empty $ map (\n -> runAt n f) nodes++       sumNodes nodes f= foldr (<>) mempty $ map (\n -> runAt n f) nodes++       reducer nodes=   sumNodes nodes reduce1    -- a reduce1 process in each node, get the results and mappend them++--     reduce :: (Ord k)  => Cloud (M.Map k v)++       reduce1 = local $ do+           reduceResults <- liftIO $ newMVar M.empty+           numberSent    <- liftIO $ newMVar 0++           minput <- getMailbox box  -- get the chunk once it arrives to the mailbox++           case minput  of++             EndReduce -> do++                n <- liftIO $ modifyMVar numberSent $ \r -> return (r+1, r+1)++                if n == lengthNodes             --  !> ("END REDUCE RECEIVED",n, lengthNodes,mynode)+                 then do+                    cleanMailbox box (EndReduce `asTypeOf` paramOf dds)+                    r <- liftIO $ readMVar reduceResults+                    return r                    --  !> ("reduceresult",r)++                 else stop++             Reduce kvs ->  do+                let addIt (k,inp) = do+                        let input= inp `asTypeOf` atype dds+                        liftIO $ modifyMVar_ reduceResults+                               $ \map -> do+                                  let maccum =  M.lookup k map+                                  return $ M.insert k (case maccum of+                                    Just accum ->  red input accum+                                    Nothing    ->  input) map+                mapM addIt  (kvs `asTypeOf` paramOf' dds)        --  !> ("Received Reduce",kvs)+                stop+++   reducer  nodes  <|>  shuffler nodes+   where+     atype ::DDS(M.Map k (vector a)) ->  a+     atype = undefined -- type level++     paramOf  :: DDS (M.Map k (vector a)) -> ReduceChunk [( k,  a)]+     paramOf = undefined -- type level+     paramOf'  :: DDS (M.Map k (vector a)) ->  [( k,  a)]+     paramOf' = undefined -- type level+++++--parallelize :: Loggable b => (a -> Cloud b) -> [a] -> Cloud b+parallelize f xs =  foldr (<|>) empty $ map f xs++mparallelize f xs =  loggedc $ foldr (<>) mempty $ map f xs++++++getPartitionData :: Loggable a => PartRef a   -> TransIO  a+getPartitionData (Ref node path save)  = Transient $ do+    mp <- (liftIO $ atomically+                       $ readDBRef+                       $ getDBRef+                       $ keyp path save)+                  `onNothing` error ("not found DDS data: "++ keyp path save)+    case mp of+       (Part _ _ _ xs) -> return $ Just xs++getPartitionData1 :: Loggable a => PartRef a   -> TransIO  a+getPartitionData1 (Ref node path save)  = Transient $ do+    mp <- liftIO $ atomically+                  $ readDBRef+                  $ getDBRef+                  $ keyp path save++    case mp of+      Just (Part _ _ _ xs) -> return $ Just xs+      Nothing -> return Nothing++getPartitionData2 :: Loggable a => PartRef a   -> IO  a+getPartitionData2 (Ref node path save)  =  do+    mp <- ( atomically+                       $ readDBRef+                       $ getDBRef+                       $ keyp path save)+                  `onNothing` error ("not found DDS data: "++ keyp path save)+    case mp of+       (Part _ _ _ xs) -> return  xs++-- en caso de fallo de Node, se lanza un clustered en busca del path+--   si solo uno lo tiene, se copia a otro+--   se pone ese nodo de referencia en Part+runAtP :: Loggable a => Node  -> (Path -> IO a) -> Path -> Cloud a+runAtP node f uuid= do+   r <- streamFrom node $ onAll . liftIO $ (SLast <$> f uuid) `catch` sendAnyError+   case r of+     SLast r -> return r+     SError e -> do+         nodes <-  mclustered $ search uuid+         when(length nodes < 1) $ asyncDuplicate node uuid+         runAtP ( head nodes) f uuid++search uuid= error $ "chunk failover not yet defined. Lookin for: "++ uuid++asyncDuplicate node uuid= do+    forkTo node+    nodes <- onAll getNodes+    let node'= head $ nodes \\ [node]+    content <- onAll . liftIO $ readFile uuid+    runAt node' $ local $ liftIO $ writeFile uuid content++sendAnyError :: SomeException -> IO (StreamData a)+sendAnyError e= return $ SError  e+++-- | distribute a vector of values among many nodes.+-- If the vector is static and sharable, better use the get* primitives+-- since each node will load the data independently.+distribute :: (Loggable a, Distributable vector a ) => vector a -> DDS (vector a)+distribute = DDS . distribute'++distribute' xs= loggedc $  do+   nodes <- local getNodes                                        -- !> "DISTRIBUTE"+   let lnodes = length nodes+   let size= case F.length xs `div` (length nodes) of 0 ->1 ; n -> n+       xss= split size lnodes 1 xs                                     -- !> size+   r <- distribute'' xss nodes+   return r+   where+   split n s s' xs | s==s' = [xs]+   split n s s' xs=+      let (h,t)= Transient.MapReduce.splitAt n xs+      in h : split n s (s'+1) t++distribute'' :: (Loggable a, Distributable vector a)+             => [vector a] -> [Node] -> Cloud (PartRef (vector a))+distribute'' xss nodes =+   parallelize  move $ zip nodes xss   -- !> show xss+   where+   move (node, xs)=  runAt node $ local $ do+                        par <- generateRef  xs+                        return  par+          --   !> ("move", node,xs)++-- | input data from a text that must be static and shared by all the nodes.+-- The function parameter partition the text in words+getText  :: (Loggable a, Distributable vector a) => (String -> [a]) -> String -> DDS (vector a)+getText part str= DDS $ loggedc $ do+   nodes' <- local getNodes                                        -- !> "DISTRIBUTE"+   let nodes  = filter (not . isWebNode) nodes'+   let lnodes = length nodes++   parallelize  (process lnodes)  $ zip nodes [0..lnodes-1]+   where+   isWebNode node= "webnode" `elem` (map fst $ nodeServices node)++   process lnodes (node,i)= do+      runAt node $ local $ do+            let xs = part str+                size= case length xs `div` lnodes of 0 ->1 ; n -> n+                xss= Transient.MapReduce.fromList $+                       if i== lnodes-1 then drop (i* size) xs else  take size $ drop  (i *  size) xs+            generateRef  xss+++-- | get the worlds of an URL+textUrl :: String -> DDS (DV.Vector Text.Text)+textUrl= getUrl  (map Text.pack . words)++-- | generate a DDS from the content of a URL.+-- The first parameter is a function that divide the text in words+getUrl :: (Loggable a, Distributable vector a) => (String -> [a]) -> String -> DDS (vector a)+getUrl partitioner url= DDS $ do+   nodes <- local getNodes                                        -- !> "DISTRIBUTE"+   let lnodes = length nodes++   parallelize  (process lnodes)  $ zip nodes [0..lnodes-1]    -- !> show xss+   where+   process lnodes (node,i)=  runAt node $ local $ do+                        r <- liftIO . simpleHTTP $ getRequest url+                        body <- liftIO $  getResponseBody r+                        let xs = partitioner body+                            size= case length xs `div` lnodes of 0 ->1 ; n -> n+                            xss= Transient.MapReduce.fromList $ take size $ drop  (i *  size) xs+                        generateRef  xss+++-- | get the words of a file+textFile ::  String -> DDS (DV.Vector Text.Text)+textFile= getFile (map Text.pack . words)++-- | generate a DDS from a file. All the nodes must access the file with the same path+-- the first parameter is the parser that generates elements from the content+getFile :: (Loggable a, Distributable vector a) => (String -> [a]) ->  String -> DDS (vector a)+getFile partitioner file= DDS $ do+   nodes <- local getNodes                                        -- !> "DISTRIBUTE"+   let lnodes = length nodes++   parallelize  (process lnodes) $ zip nodes [0..lnodes-1]    -- !> show xss+   where+   process lnodes (node, i)=  runAt node $ local $ do+                        content <- liftIO $ readFile file+                        let xs = partitioner content+                            size= case length xs `div` lnodes of 0 ->1 ; n -> n+                            xss=Transient.MapReduce.fromList $ take size $ drop  (i *  size) xs  -- !> size+                        generateRef    xss++++generateRef :: Loggable a =>  a -> TransIO (PartRef a)+generateRef  x=  do+    node <- getMyNode+    liftIO $ do+       temp <- getTempName+       let reg=  Part node temp False  x+       atomically $ newDBRef reg+--       syncCache+       (return $ getRef reg)     -- !> ("generateRef",reg,node)++getRef (Part n t s x)= Ref n t s++getTempName :: IO String+getTempName=  ("DDS" ++) <$> replicateM  5 (randomRIO ('a','z'))+++-------------- Distributed  Datasource Streams ---------+-- | produce a stream of DDS's that can be map-reduced. Similar to spark streams.+-- each interval of time,a new DDS is produced.(to be tested)+streamDDS+  :: (Loggable a, Distributable vector a) =>+     Integer -> IO (StreamData a) -> DDS (vector a)+streamDDS time io= DDS $ do+     xs <- local . groupByTime time $ do+               r <- parallel io+               case r of+                    SDone -> empty+                    SLast x -> return x+                    SMore x -> return x+                    SError e -> error $ show e+     distribute'  $ Transient.MapReduce.fromList xs+++++#endif
src/Transient/Move.hs view
@@ -10,9 +10,15 @@ --
 -- | see <https://www.fpcomplete.com/user/agocorona/moving-haskell-processes-between-nodes-transient-effects-iv>
 -----------------------------------------------------------------------------
-{-# LANGUAGE DeriveDataTypeable , ExistentialQuantification, OverloadedStrings
-    ,ScopedTypeVariables, StandaloneDeriving, RecordWildCards, FlexibleContexts, CPP
-    ,GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE CPP                        #-}
+{-# LANGUAGE DeriveDataTypeable         #-}
+{-# LANGUAGE ExistentialQuantification  #-}
+{-# LANGUAGE FlexibleContexts           #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE OverloadedStrings          #-}
+{-# LANGUAGE RecordWildCards            #-}
+{-# LANGUAGE ScopedTypeVariables        #-}
+{-# LANGUAGE StandaloneDeriving         #-}
 module Transient.Move(
 
 Cloud(..),runCloudIO, runCloudIO',local,onAll,lazy, loggedc, lliftIO,localIO,
@@ -123,6 +129,10 @@ import Data.String
 
 
+-- * Handful Aliases.
+
+type EventMapRef = IORef (M.Map T.Text (EVar Dynamic))
+
 #ifdef ghcjs_HOST_OS
 type HostName  = String
 newtype PortID = PortNumber Int deriving (Read, Show, Eq, Typeable)
@@ -179,12 +189,12 @@ 
 -- #ifndef ghcjs_HOST_OS
 -- | run the cloud computation.
-runCloudIO :: Typeable a =>  Cloud a -> IO a
-runCloudIO (Cloud mx)= keep mx
+runCloudIO :: Typeable a => Cloud a -> IO a
+runCloudIO (Cloud mx) = keep mx
 
 -- | run the cloud computation with no console input
-runCloudIO' :: Typeable a =>  Cloud a -> IO a
-runCloudIO' (Cloud mx)= keep' mx
+runCloudIO' :: Typeable a => Cloud a -> IO a
+runCloudIO' (Cloud mx) = keep' mx
 
 -- #endif
 
@@ -590,72 +600,57 @@ #endif
 
 liftIOF :: IO b -> TransIO b
-liftIOF mx=do
-    ex <- liftIO $ (mx >>= return . Right) `catch` (\(e :: SomeException) -> return $ Left e)
-    case ex of
-      Left e -> finish $ Just e
-      Right x -> return x
-
-mconnect :: Node -> TransIO  Connection
-mconnect  node@(Node _ _ _ _ )=  do
-  nodes <- getNodes                                 --  !> ("connecting node", node)
-
-  let fnode =  filter (==node) nodes
-  case fnode of
-   [] -> addNodes [node] >> mconnect node
-   [Node host port  pool _] -> do
-
-
-    plist <- liftIO $ readMVar pool
-    case plist  of
-      handle:_ -> do
-                  delData $ Closure undefined
-                  return  handle                       --  !>   ("REUSED!", node)
+liftIOF mx =
+  do ex <- liftIO $
+       fmap Right mx `catch` (\(e :: SomeException) -> return $ Left e)
+     case ex of
+       Right x -> return x
+       Left  e -> finish (Just e)
 
-      _ -> do
---        liftIO $ putStr "*****CONNECTING NODE: " >> print node
-        my <- getMyNode
---        liftIO  $ putStr "OPENING CONNECTION WITH :" >> print port
-        Connection{comEvent= ev} <- getSData <|> error "connect: listen not set for this node"
+mconnect :: Node -> TransIO Connection
+mconnect  node@Node{} =
+  do nodes <- getNodes
+     let fnode =  filter (==node) nodes
+     case fnode of
+       []         -> addNodes [node] >> mconnect node
+       Node{..}:_ ->
+         do let pool = connection -- `connection` is a function of `Node`.
+            plist <- liftIO $ readMVar pool
+            conn <- case plist of
+              handle':_ -> return handle'
+              _         ->
+                do my <- getMyNode
+                   Connection { comEvent = ev } <-
+                     getSData <|> error "connect: listen not set for this node"
+                   c <- getConnection my nodeHost ev nodePort
+                   liftIO . modifyMVar_ pool $ \cs -> return (c:cs)
+                   putMailbox "connections" (c, node)
+                   return c
+            delData $ Closure undefined
+            return conn
+  where
+    getConnection :: Node -> HostName -> EventMapRef -> Int -> TransIO Connection
 #ifndef ghcjs_HOST_OS
-
-        conn <- liftIOF $ do
-          let size=8192
-          sock <-  connectTo' size  host $ PortNumber $ fromIntegral port
-                      -- !> ("CONNECTING ",port)
-
-          conn <- defConnection >>= \c -> return c{myNode=my,comEvent= ev,connData= Just $ Node2Node u  sock (error $ "addr: outgoing connection")}
-
-          SBS.send sock "CLOS a b\n\n"   -- !> "sending CLOS"
-
-
-          return conn
-
+    getConnection n h ev p = liftIOF $
+      do let s = 8192
+             u = undefined
+         sock <- connectTo' s h (PortNumber $ fromIntegral p)
+         conn <- defConnection >>= \c ->
+           return c { myNode   = n
+                    , comEvent = ev
+                    , connData = Just $
+                        Node2Node u sock (error "addr: outgoing connection")
+                    }
+         SBS.send sock "CLOS a b\n\n"
+         return conn
 #else
-        conn <- do
-
-          ws <- connectToWS host $ PortNumber $ fromIntegral port
-          conn <- defConnection >>= \c -> return c{comEvent= ev,connData= Just $ Web2Node ws}
-
-          return conn    -- !>  ("websocker CONNECION")
+    getConnection _ h ev p =
+      do ws <- connectToWS h (PortNumber $ fromIntegral p)
+         defConnection >>= \c ->
+           return c { comEvent = ev
+                    , connData = Just (Web2Node ws)
+                    }
 #endif
-        liftIO $ modifyMVar_ pool $  \plist -> return $ conn:plist
-
-        putMailbox "connections" (conn,node)
-
-        delData $ Closure undefined
-
-
-
-
-        return  conn
-
-  where u= undefined
-
-
-
--- mconnect _ = empty
-
 
 
 #ifndef ghcjs_HOST_OS
− src/Transient/Move/Services/MonitorService.hs
@@ -1,65 +0,0 @@------------------------------------------------------------------------------
---
--- Module      :  Transient.Move.Services.MonitorService
--- Copyright   :
--- License     :  MIT
---
--- Maintainer  :  agocorona@gmail.com
--- Stability   :
--- Portability :
---
--- |
---
------------------------------------------------------------------------------
-
-module Main where
-
-import Transient.Base
-
-import Transient.Move
-import Transient.Move.Utils
-import Transient.Move.Services
-import Control.Applicative
-import Control.Monad.IO.Class
-import Data.List ((\\))
-
-main = keep . runCloud $ do
-    runService monitorService $ \(ident,service) -> do
-       mnode <-  (local $ findInNodes service >>= return . Just . head) <|>
-                  requestInstall ident service
-       return (mnode :: Maybe Node)
-    where
-    installHere ident service@(package,program)= local $ do
-        thisNode <-  getMyNode
-        yn<- authorizeService ident service   -- !> "AUTHORIZE"
-        if yn
-          then do
-              node <- liftIO $ do
-                    port <- freePort
-                    putStr "Monitor: installing " >> putStrLn package
-                    install package program  (nodeHost thisNode) port
-                    putStrLn "INSTALLED"
-                    nodeService thisNode port service
-              addNodes [node]
-              return  $ Just node
-          else return Nothing
-
-    requestInstall :: String -> Service -> Cloud (Maybe Node)
-    requestInstall ident service= do
-        mnode <- installHere ident service          -- !> "INSTALLHERE"
-        case mnode of
-          Nothing -> installThere ident service
-          justnode -> return justnode
-
-    installThere ident service= do
-        nodes  <- onAll $ findInNodes monitorService   -- !> "installThere"
-        mynode <- onAll getMyNode                      -- !> nodes
-        request $ nodes \\ [mynode]
-        where
-        request []= empty
-        request (n:ns)= do
-             mnode <- callService' ident n (ident,service)  -- !> ("calling",n)
-             case mnode of
-                Nothing  -> request ns
-                justnode -> return justnode
-
src/Transient/Move/Utils.hs view
@@ -1,144 +1,144 @@------------------------------------------------------------------------------
---
--- Module      :  Transient.Move.Utils
--- Copyright   :
--- License     :  GPL-3
---
--- Maintainer  :  agocorona@gmail.com
--- Stability   :
--- Portability :
---
--- |
---
------------------------------------------------------------------------------
-
-module Transient.Move.Utils (initNode,inputNodes, simpleWebApp, initWebApp
-, onServer, onBrowser, runTestNodes)
- where
-
-import Transient.Base
---import Transient.Internals((!>))
-import Transient.Move
-import Control.Applicative
-import Control.Monad.IO.Class
-import Data.IORef
-
--- | ask in the console for the port number and initializes a node in the port specified
--- It needs the application to be initialized with `keep` to get input from the user.
--- the port can be entered in the command line with "<program> -p  start/<PORT>"
---
--- A node is also a web server that send to the browser the program if it has been
--- compiled to JavaScript with ghcjs. `initNode` also initializes the web nodes.
---
--- This sequence compiles to JScript and executes the program with a node in the port 8080
---
--- > ghc program.hs
--- > ghcjs program.hs -o static/out
--- > ./program -p start/8080
---
--- `initNode`, when the application has been loaded and executed in the browser, will perform a `wormhole` to his server node.
---  So the application run within this wormhole.
---
---  Since the code is executed both in server node and browser node, to avoid confusion and in order
--- to execute in a single logical thread, use `onServer` for code that you need to execute only in the server
--- node, and `onBrowser` for code that you need in the browser, although server code could call the browser
--- and vice-versa.
---
--- To invoke from browser to server and vice-versa, use `atRemote`.
---
--- To translate the code from the browser to the server node, use `teleport`.
---
-initNode :: Cloud () -> TransIO ()
-initNode app= do
-   node <- getNodeParams
-   initWebApp node  app
-
-
-  where
-  getNodeParams  :: TransIO Node
-  getNodeParams  =
-      if isBrowserInstance then  liftIO createWebNode else do
-          oneThread $ option "start" "re/start node"
-          host <- input (const True) "hostname of this node (must be reachable): "
-          port <- input (const True) "port to listen? "
-          liftIO $ createNode host port
-
--- | ask for nodes to be added to the list of known nodes. it also ask to connect to the node to get
--- his list of known nodes
-inputNodes= do
-   onServer $ do
-          local $ option "add"  "add a new node at any moment"
-
-          host <- local $ do
-                    r <- input (const True) "Host to connect to: (none): "
-                    if r ==  "" then stop else return r
-
-          port <-  local $ input (const True) "port? "
-
-          connectit <- local $ input (\x -> x=="y" || x== "n") "connect to the node to interchange nodes lists?"
-          nnode <- localIO $ createNode host port
-          if connectit== "y" then connect'  nnode
-                             else  local $ do
-                               liftIO $ putStr "Added node: ">> print nnode
-                               addNodes [nnode]
-   empty
-
-
-
--- | executes the application in the server and the Web browser.
--- the browser must point to http://hostname:port where port is the first parameter.
--- It creates a wormhole to the server.
--- The code of the program after `simpleWebApp` run in the browser unless `teleport` translates the execution to the server.
--- To run something in the server and get the result back to the browser, use  `atRemote`
--- This last also works in the other side; If the application was teleported to the server, `atRemote` will
--- execute his parameter in the browser.
---
--- It is necesary to compile the application with ghcjs:
---
--- > ghcjs program.js
--- > ghcjs program.hs -o static/out
---
--- > ./program
---
---
-simpleWebApp :: Integer -> Cloud () -> IO ()
-simpleWebApp port app = do
-   node <- createNode "localhost" port
-   keep $ initWebApp node app
-
--- | use this instead of smpleWebApp when you have to do some initializations in the server prior to the
--- initialization of the web server
-initWebApp :: Node -> Cloud () -> TransIO ()
-initWebApp node app=  do
-    conn <- defConnection
-    setData conn{myNode = node}
-    serverNode <- getWebServerNode  :: TransIO Node
-
-    mynode <- if isBrowserInstance
-                    then liftIO $ createWebNode
-                    else return serverNode
-
-    runCloud $ do
-        listen mynode <|> return()
-        wormhole serverNode app   -- !> ("servernode", serverNode)
-        return ()
-
--- only execute if the the program is executing in the browser. The code inside can contain calls to the server.
--- Otherwise return empty (so it stop the computation).
-onBrowser :: Cloud a -> Cloud a
-onBrowser x= do
-     r <- local $  return isBrowserInstance
-     if r then x else empty
-
--- only executes the computaion if it is in the server, but the computation can call the browser. Otherwise return empty
-onServer :: Cloud a -> Cloud a
-onServer x= do
-     r <- local $  return isBrowserInstance
-     if not r then x else empty
-
--- | run N nodes (N ports to listen) in the same program. For testing purposes.
--- It add them to the list of known nodes, so it is possible to perform `clustered` operations with them.
-runTestNodes ports= do
-    nodes <- onAll $  mapM (\p -> liftIO $ createNode "localhost" p) ports
-    foldl (<|>) empty (map listen nodes) <|> return()
-
+-----------------------------------------------------------------------------+--+-- Module      :  Transient.Move.Utils+-- Copyright   :+-- License     :  GPL-3+--+-- Maintainer  :  agocorona@gmail.com+-- Stability   :+-- Portability :+--+-- |+--+-----------------------------------------------------------------------------++module Transient.Move.Utils (initNode,inputNodes, simpleWebApp, initWebApp+, onServer, onBrowser, runTestNodes)+ where++import Transient.Base+--import Transient.Internals((!>))+import Transient.Move+import Control.Applicative+import Control.Monad.IO.Class+import Data.IORef++-- | ask in the console for the port number and initializes a node in the port specified+-- It needs the application to be initialized with `keep` to get input from the user.+-- the port can be entered in the command line with "<program> -p  start/<PORT>"+--+-- A node is also a web server that send to the browser the program if it has been+-- compiled to JavaScript with ghcjs. `initNode` also initializes the web nodes.+--+-- This sequence compiles to JScript and executes the program with a node in the port 8080+--+-- > ghc program.hs+-- > ghcjs program.hs -o static/out+-- > ./program -p start/8080+--+-- `initNode`, when the application has been loaded and executed in the browser, will perform a `wormhole` to his server node.+--  So the application run within this wormhole.+--+--  Since the code is executed both in server node and browser node, to avoid confusion and in order+-- to execute in a single logical thread, use `onServer` for code that you need to execute only in the server+-- node, and `onBrowser` for code that you need in the browser, although server code could call the browser+-- and vice-versa.+--+-- To invoke from browser to server and vice-versa, use `atRemote`.+--+-- To translate the code from the browser to the server node, use `teleport`.+--+initNode :: Cloud () -> TransIO ()+initNode app= do+   node <- getNodeParams+   initWebApp node  app+++  where+  getNodeParams  :: TransIO Node+  getNodeParams  =+      if isBrowserInstance then  liftIO createWebNode else do+          oneThread $ option "start" "re/start node"+          host <- input (const True) "hostname of this node (must be reachable): "+          port <- input (const True) "port to listen? "+          liftIO $ createNode host port++-- | ask for nodes to be added to the list of known nodes. it also ask to connect to the node to get+-- his list of known nodes+inputNodes= do+   onServer $ do+          local $ option "add"  "add a new node at any moment"++          host <- local $ do+                    r <- input (const True) "Host to connect to: (none): "+                    if r ==  "" then stop else return r++          port <-  local $ input (const True) "port? "++          connectit <- local $ input (\x -> x=="y" || x== "n") "connect to the node to interchange nodes lists?"+          nnode <- localIO $ createNode host port+          if connectit== "y" then connect'  nnode+                             else  local $ do+                               liftIO $ putStr "Added node: ">> print nnode+                               addNodes [nnode]+   empty++++-- | executes the application in the server and the Web browser.+-- the browser must point to http://hostname:port where port is the first parameter.+-- It creates a wormhole to the server.+-- The code of the program after `simpleWebApp` run in the browser unless `teleport` translates the execution to the server.+-- To run something in the server and get the result back to the browser, use  `atRemote`+-- This last also works in the other side; If the application was teleported to the server, `atRemote` will+-- execute his parameter in the browser.+--+-- It is necesary to compile the application with ghcjs:+--+-- > ghcjs program.js+-- > ghcjs program.hs -o static/out+--+-- > ./program+--+--+simpleWebApp :: Integer -> Cloud () -> IO ()+simpleWebApp port app = do+   node <- createNode "localhost" port+   keep $ initWebApp node app++-- | use this instead of smpleWebApp when you have to do some initializations in the server prior to the+-- initialization of the web server+initWebApp :: Node -> Cloud () -> TransIO ()+initWebApp node app=  do+    conn <- defConnection+    setData conn{myNode = node}+    serverNode <- getWebServerNode  :: TransIO Node++    mynode <- if isBrowserInstance+                    then liftIO $ createWebNode+                    else return serverNode++    runCloud $ do+        listen mynode <|> return()+        wormhole serverNode app   -- !> ("servernode", serverNode)+        return ()++-- only execute if the the program is executing in the browser. The code inside can contain calls to the server.+-- Otherwise return empty (so it stop the computation).+onBrowser :: Cloud a -> Cloud a+onBrowser x= do+     r <- local $  return isBrowserInstance+     if r then x else empty++-- only executes the computaion if it is in the server, but the computation can call the browser. Otherwise return empty+onServer :: Cloud a -> Cloud a+onServer x= do+     r <- local $  return isBrowserInstance+     if not r then x else empty++-- | run N nodes (N ports to listen) in the same program. For testing purposes.+-- It add them to the list of known nodes, so it is possible to perform `clustered` operations with them.+runTestNodes ports= do+    nodes <- onAll $  mapM (\p -> liftIO $ createNode "localhost" p) ports+    foldl (<|>) empty (map listen nodes) <|> return()+
− stack-ghcjs.yaml
@@ -1,17 +0,0 @@-resolver: lts-6.6
-packages:
-- '.'
-- location:
-    git: https://github.com/agocorona/transient.git
-    commit: b06645a46462e68a2712de8ecd0d8f325b07a520
-  extra-dep: true
-extra-package-dbs: []
-flags: {}
-
-compiler: ghcjs-0.2.0.20160703_ghc-7.10.3
-compiler-check: match-exact
-setup-info:
-  ghcjs:
-    source:
-      ghcjs-0.2.0.20160703_ghc-7.10.3:
-         url: http://ghcjs.luite.com/master-20160703.tar.gz
− stack.yaml
@@ -1,9 +0,0 @@-resolver: lts-6.6
-packages:
-- '.'
-- location:
-    git: https://github.com/agocorona/transient.git
-    commit: b06645a46462e68a2712de8ecd0d8f325b07a520
-  extra-dep: true
-extra-package-dbs: []
-flags: {}
transient-universe.cabal view
@@ -1,74 +1,74 @@-name: transient-universe
-version: 0.3.4
-cabal-version: >=1.10
-build-type: Simple
-license: MIT
-license-file: LICENSE
-maintainer: agocorona@gmail.com
-homepage: http://www.fpcomplete.com/user/agocorona
-bug-reports: https://github.com/agocorona/transient-universe/issues
-synopsis: Remote execution and map-reduce: distributed computing for Transient
-description:
-    See <http://github.com/agocorona/transient>.
-category: Control
-author: Alberto G. Corona
-
-source-repository head
-    type: git
-    location: https://github.com/agocorona/transient-universe
-
-library
-
-    if impl(ghcjs >=0.1)
-        build-depends:
-            ghcjs-base -any,
-            ghcjs-prim -any
-    else
-        build-depends:
-            HTTP                -any,
-            TCache              -any,
-            case-insensitive    -any,
-            directory           -any,
-            filepath            -any,
-            hashable            -any,
-            network             -any,
-            network-info        -any,
-            network-uri         -any,
-            vector              -any,
-            websockets          -any,
-            iproute             -any
-
-    if !impl(ghcjs >=0.1)
-        exposed-modules:
-            Transient.Move.Services
-    exposed-modules:
-        Transient.Move
-        Transient.MapReduce
-        Transient.Move.Utils
-    build-depends:
-        base                >4 && <5,
-        bytestring          -any,
-        containers          -any,
-        mtl                 -any,
-        process             -any,
-        random              -any,
-        stm                 -any,
-        text                -any,
-        time                -any,
-        transformers        -any,
-        transient           >=0.4.4
-    default-language: Haskell2010
-    hs-source-dirs: src .
-
-
-executable   monitorService
- if !impl(ghcjs >=0.1)
-    main-is :      MonitorService.hs
-    build-depends: base >4 && <5, transient, transient-universe, transformers
-    default-language:  Haskell2010
-    ghc-options:  -threaded -rtsopts
-    hs-source-dirs: src/Transient/Move/Services
- else
-    main-is : void.hs
-    build-depends: base
-
+name: transient-universe+version: 0.3.5+cabal-version: >=1.10+build-type: Simple+license: MIT+license-file: LICENSE+maintainer: agocorona@gmail.com+homepage: http://www.fpcomplete.com/user/agocorona+bug-reports: https://github.com/agocorona/transient-universe/issues+synopsis: Remote execution and map-reduce: distributed computing for Transient+description:+    See <http://github.com/agocorona/transient>.+category: Control+author: Alberto G. Corona++extra-source-files: app/client/Transient/Move/Services/MonitorService.hs+                    app/server/Transient/Move/Services/MonitorService.hs++source-repository head+    type: git+    location: https://github.com/agocorona/transient-universe++library+    exposed-modules:+        Transient.Move+        Transient.MapReduce+        Transient.Move.Utils+    if !impl(ghcjs >=0.1)+        exposed-modules:+            Transient.Move.Services++    build-depends: base                >4 && <5,+                   bytestring          -any,+                   containers          -any,+                   mtl                 -any,+                   process             -any,+                   random              -any,+                   stm                 -any,+                   text                -any,+                   time                -any,+                   transformers        -any,+                   transient           >=0.4.4+    if impl(ghcjs >=0.1)+        build-depends: ghcjs-base -any,+                       ghcjs-prim -any+    else+        build-depends: HTTP                -any,+                       TCache              -any,+                       case-insensitive    -any,+                       directory           -any,+                       filepath            -any,+                       hashable            -any,+                       iproute             -any,+                       network             -any,+                       network-info        -any,+                       network-uri         -any,+                       vector              -any,+                       websockets          -any+    default-language: Haskell2010+    hs-source-dirs: src .+++executable monitorService+  build-depends: base >4 && <5+  if !impl(ghcjs >=0.1)+    hs-source-dirs: app/server/Transient/Move/Services+    build-depends: transformers+                 , transient >=0.4.4+                 , transient-universe+  else+    hs-source-dirs: app/client/Transient/Move/Services+  main-is:      MonitorService.hs+  default-language:  Haskell2010+  ghc-options:  -threaded -rtsopts
− void.hs
@@ -1,1 +0,0 @@-main= return()