diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
Binary files a/.DS_Store and /dev/null differ
diff --git a/._.DS_Store b/._.DS_Store
deleted file mode 100644
Binary files a/._.DS_Store and /dev/null differ
diff --git a/.ghci b/.ghci
deleted file mode 100644
--- a/.ghci
+++ /dev/null
@@ -1,1 +0,0 @@
-:set -isrc
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
--- a/.gitignore
+++ /dev/null
@@ -1,49 +0,0 @@
-dist
-cabal-dev
-.hsenv
-*.o
-*.hi
-*.chi
-*.chs.h
-.virthualenv
-*.a
-*.cmxa
-*.cm[oxai]
-*.annot
-*.vmap
-*.di?
-*.native
-*.fqout
-*.out
-*.fq
-*.bfq
-*.annot
-*.cgi
-*.log
-*.html
-*.pyc
-build.sh
-config.make
-*.scalarlog
-*.tags
-_build
-*~
-*.swp
-*.swo
-dist-newstyle
-.cabal-sandbox/
-cabal.sandbox.config
-.ghc.environment.*
-cabal.project.local
-
-/.stack-work/
-/.vagrant/
-TAGS
-a.out
-*.json
-js/
-css/
-
-*.smt2
-.liquid
-.dir-locals.el
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
--- a/.gitmodules
+++ /dev/null
@@ -1,6 +0,0 @@
-[submodule "liquid-fixpoint"]
-	path = liquid-fixpoint
-	url = https://github.com/ucsd-progsys/liquid-fixpoint.git
-[submodule "ghc-options"]
-	path = ghc-options
-	url = https://github.com/ranjitjhala/ghc-options.git
diff --git a/AwakeTODO.md b/AwakeTODO.md
deleted file mode 100644
--- a/AwakeTODO.md
+++ /dev/null
@@ -1,6 +0,0 @@
-- see the Category issue
-- set-up atom
-- see Jeff's thread on Monoids
-- write a prefix checker
-- check the parser paper
-- check gab's slides
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Contributing
-------------
-
-Pull requests should be created against *develop* branch.
diff --git a/FAILING_TESTS.txt b/FAILING_TESTS.txt
deleted file mode 100644
--- a/FAILING_TESTS.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-      
-Language/Haskell/HsColour/Anchors.hs:         FAIL (683.88s)
-  Wrong exit code
-  expected: ExitSuccess
-  but got: ExitFailure 1
-
-Language/Haskell/HsColour/ACSS.hs:            FAIL (1.70s)
-  Wrong exit code
-  expected: ExitSuccess
-  but got: ExitFailure 2
-
-FindRec.hs:                                   FAIL (9.65s)
-  --eliminate crashes due to `cannot unify Tuple with FHandle error`.
-  A cons-gen bug tickled by --eliminate?
-
-CopyRec.hs:                                   FAIL (42.90s)
-  --eliminate seems to blow up (lack of pattern-inline)?
-
diff --git a/HLint.hs b/HLint.hs
deleted file mode 100644
--- a/HLint.hs
+++ /dev/null
@@ -1,5 +0,0 @@
-import "hint" HLint.Default
-import "hint" HLint.Dollar
-
-ignore "Eta reduce"
-ignore "Use ."
diff --git a/INSTALL.md b/INSTALL.md
deleted file mode 100644
--- a/INSTALL.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# Install LiquidHaskell
-
-To run `liquid` you need to install:
-
-1. An SMT solver
-2. The `liquid` binary via package manager *or* source.
-
-
-## Step 1: Install SMT Solver
-
-Download and install *at least one* of
-
-+ [Z3](https://github.com/Z3Prover/z3/releases)
-+ [CVC4](http://cvc4.cs.nyu.edu/)
-+ [MathSat](http://mathsat.fbk.eu/download.html)
-
-
-## Step 2: Install `liquid` via Package Manager
-
-Simply do:
-
-    cabal install liquidhaskell
-
-We are working to put `liquid` on `stackage`.
-
-Note: Currently, LiquidHaskell on hackage does not compile against GHC 8.
-Please make sure you are installing with GHC version less than 8. You can
-designate a specific version of LiquidHaskell to ensure that the correct
-GHC version is in the environment. As an example,
-
-    cabal install liquidhaskell-0.6.0.0
-
-## Step 2: Install `liquid` from Source
-
-If you want the most recent version, you can build from source as follows,
-either using `stack` (recommended) or `cabal`. In either case: *recursively*
-clone the repo and then build:
-
-### Build with `stack` (recommended)
-
-This requires that you have installed [stack][stack] (which we strongly recommend!)
-
-    git clone --recursive git@github.com:ucsd-progsys/liquidhaskell.git
-    cd liquidhaskell
-    stack install
-
-## Build with `cabal`
-
-    git clone --recursive git@github.com:ucsd-progsys/liquidhaskell.git
-    cd liquidhaskell
-
-    cabal sandbox init
-    cabal sandbox add-source ./liquid-fixpoint
-    cabal install
-
-## Troubleshooting
-
-
-1. If you're on Windows, please make sure the SMT solver is installed
-    in the **same** directory as LiquidHaskell itself (i.e. wherever
-    `cabal` or `stack` puts your binaries). That is, do:
-
-    ```
-    which liquid
-    ```
-
-    and make sure that `z3` or `cvc4` or `mathsat` are in the `PATH`
-    returned by the above.
-
-2. If you installed via `stack` and are experiencing path related woes, try:
-
-    ```
-    stack exec -- liquid path/to/file.hs
-    ```
-
-[stack]: https://github.com/commercialhaskell/stack/blob/master/doc/install_and_upgrade.md
diff --git a/Makefile b/Makefile
deleted file mode 100644
--- a/Makefile
+++ /dev/null
@@ -1,110 +0,0 @@
-THREADS=1
-SMTSOLVER=z3
-
-FASTOPTS=-O0
-DISTOPTS=-O2
-PROFOPTS=-O2 --enable-library-profiling --enable-executable-profiling
-LIQUIDOPTS=
-
-CABAL=cabal
-CABALI=$(CABAL) install
-CABALP=$(CABAL) install --enable-library-profiling
-
-# to deal with cabal sandboxes using dist/dist-sandbox-xxxxxx/build/test/test
-# TASTY=find dist -type f -name test | head -n1
-TASTY=./dist/build/test/test
-
-DEPS=--dependencies-only
-
-##############################################################################
-##############################################################################
-##############################################################################
-
-fast:
-	$(CABAL) install -fdevel $(FASTOPTS)
-
-first:
-	$(CABAL) install $(FASTOPTS) --only-dependencies --enable-tests --enable-benchmarks
-
-dist:
-	# $(CABAL) install $(DISTOPTS)
-	$(CABAL) configure -fdevel --enable-tests --disable-library-profiling -O2
-	$(CABAL) build
-	
-prof:
-	$(CABAL) install $(PROFOPTS)
-
-igotgoto:
-	$(CABAL) build $(OPTS)
-	cp dist/build/liquid/liquid ~/.cabal/bin/
-
-clean:
-	cabal clean
-
-docs:
-	$(CABAL) hscolour
-	$(CABAL) haddock --hoogle
-
-deps:
-	$(CABALI) $(DEPS)
-
-pdeps:
-	$(CABALP) $(DEPS)
-
-all-test-py:
-	cd tests && ./regrtest.py -a -t $(THREADS) && cd ../
-
-test-py:
-	cd tests && ./regrtest.py -t $(THREADS) && cd ../
-
-test:
-	$(CABAL) configure -fdevel --enable-tests --disable-library-profiling -O2
-	$(CABAL) build
-	$(CABAL) exec $(TASTY) -- --smtsolver $(SMTSOLVER) --hide-successes --rerun-update -p 'Unit/' -j$(THREADS) +RTS -N$(THREADS) -RTS
-	# $(CABAL) exec $(TASTY) -- --smtsolver $(SMTSOLVER) --liquid-opts='$(LIQUIDOPTS)' --hide-successes --rerun-update -p 'Unit/' -j$(THREADS) +RTS -N$(THREADS) -RTS
-
-test710:
-	$(CABAL) configure -fdevel --enable-tests --disable-library-profiling -O2
-	$(CABAL) build
-	$(TASTY) --smtsolver $(SMTSOLVER) --hide-successes --rerun-update -p 'Unit/' -j$(THREADS) +RTS -N$(THREADS) -RTS
-
-
-retest:
-	cabal configure -fdevel --enable-tests --disable-library-profiling -O2
-	cabal build
-	cabal exec $(TASTY) -- --smtsolver $(SMTSOLVER) --hide-successes --rerun-filter "exceptions,failures,new" --rerun-update -p 'Unit/' -j$(THREADS) +RTS -N$(THREADS) -RTS
-
-all-test:
-	cabal configure -fdevel --enable-tests --disable-library-profiling -O2
-	cabal build
-	cabal exec $(TASTY) -- --smtsolver $(SMTSOLVER) --hide-successes --rerun-update -j$(THREADS) +RTS -N$(THREADS) -RTS
-
-all-test-710:
-	cabal configure -fdevel --enable-tests --disable-library-profiling -O2
-	cabal build
-	$(TASTY) --smtsolver $(SMTSOLVER) --hide-successes --rerun-update -j$(THREADS) +RTS -N$(THREADS) -RTS
-
-
-
-all-retest:
-	cabal configure -fdevel --enable-tests --disable-library-profiling -O2
-	cabal build
-	cabal exec $(TASTY) -- --smtsolver $(SMTSOLVER) --hide-successes --rerun-filter "exceptions,failures,new" --rerun-update -j$(THREADS) +RTS -N$(THREADS) -RTS
-
-all-retest-710:
-	cabal configure -fdevel --enable-tests --disable-library-profiling -O2
-	cabal build
-	$(TASTY) --smtsolver $(SMTSOLVER) --hide-successes --rerun-filter "exceptions,failures,new" --rerun-update -j$(THREADS) +RTS -N$(THREADS) -RTS
-
-
-
-lint:
-	hlint --colour --report .
-
-tags:
-	hasktags -x -c src/
-	# hasktags -c src/
-	# hasktags -e src/
-
-ghcid:
-	ghcid --command "stack ghci --main-is liquidhaskell:exe:liquid"
diff --git a/NIX.md b/NIX.md
deleted file mode 100644
--- a/NIX.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Running LiquidHaskell with Nix
-
-Via [Gabriel Gonzalez](https://github.com/Gabriel439), 
-see [this issue](https://github.com/ucsd-progsys/liquidhaskell/issues/1099) for details.
-
-Nix lets you create transient GHC environments with corresponding 
-package databases that may be needed to run LH on specific programs.
-
-1. Create shell, that lists the extra dependencies: 
-
-- the version of GHC (must be the same as you build LH with, e.g. GHC 8.0.2)
-- any extra libraries (e.g. `vector`) 
-
-
-```
-$ nix-shell --packages 'haskell.packages.ghc802.ghcWithPackages (pkgs: [ pkgs.vector ])'
-```
-
-2. Set environment variables
-
-```
-[nix-shell]$ eval "$(egrep ^export "$(type -p ghc)")"
-```
-
-3. Run LH
-
-```
-[nix-shell]$ liquid examples/search.hs
-```
-
-Steps 1-3 can be encapsulated in a single `shell.nix` e.g. 
-
-```nix
-let
-  inherit (import <nixpkgs> { }) fetchFromGitHub;
-
-  nixpkgs = fetchFromGitHub {
-    owner = "NixOS";
-
-    repo = "nixpkgs";
-
-    rev = "1715436b75696d9885b345dd8159e12244d0f7f5";
-    sha256 = "18qp76cppm1yxmzdaak9kcllbypvv22c9g7iaycq2wz0qkka6rx5";
-  };
-
-  pkgs = import nixpkgs { };
-
-  liquid =
-    pkgs.runCommand "liquidhaskell" { buildInputs = [ pkgs.makeWrapper ]; } ''
-      mkdir -p $out/bin
-      ln -s ${pkgs.haskellPackages.liquidhaskell}/bin/liquid $out/bin
-      wrapProgram $out/bin/liquid --prefix PATH : ${pkgs.z3}/bin
-    '';
-
-  ghc = pkgs.haskellPackages.ghcWithPackages (ps: with ps; [
-          vector
-        ]);
-in
-  pkgs.stdenv.mkDerivation {
-    name = "my-haskell-env-0";
-    buildInputs = [ ghc liquid ];
-    shellHook = "eval $(egrep ^export ${ghc}/bin/ghc)";
-  }
-```
-
-
-
diff --git a/NVTODO.md b/NVTODO.md
deleted file mode 100644
--- a/NVTODO.md
+++ /dev/null
@@ -1,16 +0,0 @@
-- Porting to ghc-8
-  - restore benchmarks
-  - look at Target's model
-
-- Gradual Refinement Types
- - [ ] clean up code
- - [ ] restore old structures
- - [ ] pull request 
- - [ ] print readable solutions 
- - [ ] Implement Eric's validity with measures 
- - [x] Check how elimination interacts with graduals (eg Interpretation fails with elimination now)
- - [ ] Find interesting application
- - [ ] Present weakest result 
-
-
-- Proof by Symbolic Evaluation 
diff --git a/Syntax.md b/Syntax.md
deleted file mode 100644
--- a/Syntax.md
+++ /dev/null
@@ -1,40 +0,0 @@
-- Niki Vazou
-
-|                      | Current Syntax                | Future Syntax                 |
-|----------------------|-------------------------------|-------------------------------|
-| Abstract Refinements | `List <{\x v -> v >= x}> Int` | `List Int (\x v -> v >= x)`   |
-|                      | `[a<p>]<{\x v -> v >= x}>`    | `[a p] (\x v -> v >= x) (??)` |
-|                      | `Int<p>`                      | `Int p`                       |
-|                      | `Int<\x -> x >=0>`            | `Int (\x -> x >= 0)`          |
-|                      | `Maybe <<p>> (a<q>) (?)`      | `Maybe (a q) p`               |
-|                      | `Map <l, r> <<p>> k v  (?)`   | `Maybe k v l r p`             |
-| Type Arguments       | `ListN a {len xs + len ys}`   | `ListN a (len xs + len ys)`   |
-
-Q: How do I distinguish `Int p` with `ListN a n`?
-(`p` is a abstract refinement and `n` is an `Integer`)
-
-A: From the context!
-Use simple kinds, i.e.
-`ListN :: * -> Int -> *`
-`Int :: ?AR -> *`
-
-----------------------------
-
-- Chris Tetreault
-
-Currently for specifications, we write them as such:
-
-`{-@ unsafeLookup :: n:Nat ->  {v:Vector a | n < (vlen v)} -> a @-}`
-
-... where we bind `n` as a `Nat` and `v` as a `Vector a` _such that_ `[stuff]`. As a Haskeller, I find it strange to put logic into something that appears to be a function signature. I propose:
-
-```
-{-@
-   unsafeLookup :: Nat -> Vector a -> a
-   unsafeLookup n v _ | n < vlen v
-@-}
-```
-
-Here we have a "function" that takes a refined type `Nat` and a Haskell type `Vector a` and returns a Haskell type `a`. The definition of this refinement binds the `Nat` to `n` and the `Vector a` to `v`, and doesn't care about the `a`. Next, it specifies that `n < vlen v`.
-
-We could mix the syntax up a bit more to address my previous concern that it not look "too much like haskell", presuably drawing from the list of symbols that get used elsewhere, but I'm more concerned with getting this sort of "function syntax" than with what specific glyphs get used.
diff --git a/TODO.EASY.md b/TODO.EASY.md
deleted file mode 100644
--- a/TODO.EASY.md
+++ /dev/null
@@ -1,22 +0,0 @@
-- Verification of Libraries 
-  - [zlib](https://hackage.haskell.org/package/zlib)
-  - [probability](https://github.com/nikivazou/probability)
-  
-- fix parser error message
-  - Parse Errors [#241](https://github.com/ucsd-progsys/liquidhaskell/issues/241)
-  - Liquid Haskell doesn't accept Haskell names containing ' (single-quote) [#273](https://github.com/ucsd-progsys/liquidhaskell/issues/273)
-  - Error messages [#400](https://github.com/ucsd-progsys/liquidhaskell/issues/400)
-  - Add list of reserved tokens
-
-- Parse Propositional Variables in Refinements [#338](https://github.com/ucsd-progsys/liquidhaskell/issues/338)
-
-- Combine GHC and Liquid Type Aliases [#381](https://github.com/ucsd-progsys/liquidhaskell/issues/381)
-
-- Applying data type with wrong number of abstract refinement params could give better errors [#297](https://github.com/ucsd-progsys/liquidhaskell/issues/297)
-
-- Export qualifiers from measure types [#302](https://github.com/ucsd-progsys/liquidhaskell/issues/302)
-
-- systematically remove all error calls 
-
- NV: Not sure how easy this is, as it requires deep understanding of the code
-    to distinguish dead code from our errors.
diff --git a/TODO.md b/TODO.md
deleted file mode 100644
--- a/TODO.md
+++ /dev/null
@@ -1,1243 +0,0 @@
-
-
-
-
-### CallStack/Error
-
-The use of `Prelude.error` gives a crazy performance hit
-apparently even without cutvars being generated, this is
-because of some bizarro GHC transforms, that thwart eliminate.
-This is because GHC now threads `callstack` through such
-computations, which make a top-level signature no longer top-level.
-
-                 Prelude.error -> dummyError (no call-stack)
-  LambdaEval.hs  11  -> 4   -> 4
-  Map0.hs        27  -> 13  -> 13
-  Map2.hs        ""         
-  Map.hs         ""
-  Base           103 -> 76.18 -> 68
-
-Not clear
-Does all that `PatSelfBind` stuff help at all with these benchmarks?
-- NO.
-- Or do we need to really use a different `error`?
-- If not, REMOVE IT.
-
-- [ ] ES:fix Target
-- [ ] ES:bring back bench
-- [ ] NV: Termination requires Haskell signature in `tests/pos/Term.hs`
-- [ ] NV: bound syntax `tests/todo/dropWhile.hs`
-- [ ] NV: bound `icfp/pos/FindRec.hs`
-- [ ] NV: HACK IO TyCon lookup, it appears as a data con (in Lookup)
-
-TODO
-====
-
-
-Prune Unsorted Refs
--------------------
-
-* mergeDataConTypes
-* makeMeasureSpec'
-* meetDataConSpec
-
-The below gives a nice SORT error
-
-```haskell
-import Data.Set
-
-data RBTree a = Leaf | Node
-
-{-@ measure isB :: RBTree a -> (Set a)
-    isB (Leaf) = 1
-    isB (Node) = (Set_empty 0)
-  @-}
-```
-
-rjhala@borscht ~/r/s/liquidhaskell (prune-unsorted-error)> stack exec -- liquid tests/todo/prune.hs
-
- /Users/rjhala/research/stack/liquidhaskell/tests/todo/prune.hs:7:13-15: Error: Bad Type Specification
- measure isB :: (RBTree a b) -> (Set a)
-     Type constructor Prune.RBTree expects a maximum 1 arguments but was given 2 arguments
-
- /Users/rjhala/research/stack/liquidhaskell/tests/todo/prune.hs:14:13: Error: Bad Measure Specification
- measure  isB
-     The sort (Set_Set  @(42)) is not numeric
-     because
-        Cannot unify (Set_Set  @(42)) with int in expression: 1
-     because
-        Cannot cast 1 of sort int to incompatible sort func(1, [(Set_Set  @(0))])
-
-now put another SORT CHECK for measures:
-
-  * Input type should be "isGeneric"
-
-    isGeneric T if
-
-    * T is a TyConApp `c [t1...tn]`
-
-    where t1 .. tn are DISTINCT type variables.
-
-If the above SORT CHECK fails for any measure print an ERROR message saying:
-
-   please rerun with --prune-unsorted
-
-```haskell
-
-(:) :: Int -> [Int] -> [Int]
-
-sum :: [Int] -> Int
-sum []     = 0
-sum (x:xs) = x + sum xs
-
-
-sum :: Tree Int a -> Int
-sum Leaf         = 0
-sum Node k _ l r = k + sum l + sum r
-```
-
-Check Covariance
-----------------
-
-See https://github.com/ucsd-progsys/liquidhaskell/blob/master/tests/todo/kmpMonad.hs#L55
-It is safe is 100 is changed to 0. WHY?
-
-LAZYVAR
--------
-
-Restore LAZYVARS in `Data/Text.hs`, `Data/Text/Unsafe.hs`
-
-
-Automatically refine *inductors*
---------------------------------
-
-Proposed by Valentine: in dependent languages (Coq)
-inductors (like our `loop` for natural numbers)
-automatically get types abstracted over properties.
-Traversal should create such functions.
-Maybe we can automatically refine them.
-
-benchmarks
------------
-
-* benchmarks: Data.Bytestring
-    ? readsPrec
-    ? big constants issue : _word64 34534523452134213524525 due to (deriving Typeable)
-    - see others below
-
-* hmatrix
-
-* error messages (see issues on github)
-
-Benchmarks
-==========
-
-                        time(O|N|C)    TOTAL(O|N)   solve (O|N)      refines       iterfreq
-    Map.hs          :    54/50/32/10    21/15/8.7      14/8/4.3    9100/4900/2700    16/28/7
-    ListSort.hs     :   */7.5/5.5/2    */2.5/1.8     */1.5/1.0      */1100/600       */9/7
-    GhcListSort.hs  :    23/22/17/5    7.3/7.8/5   4.5/5.0/2.7    3700/4400/1900   10/23/6
-    LambdaEval.hs   :    36/32/25/12    17/12/10     11.7/6.0/5    8500/3100/2400   12/5/5
-    Base.hs         :        26mi/2m
-
-
-Benchmarks
-==========
-
-[OK]    Data.KMeans
-[OK]    GHC.List   (../benchmarks/ghc-7.4.1/List.lhs)
-[OK]    bytestring
-[OK]    text
-
-[??-PP] Data.Map (supersedes set)
-        - ordering [OK]
-        - size
-        - key-set-properties
-        - key-dependence
-        - balance (NO)
-
--   vector-algorithms "vector bounds checking"
-      - e.g. "unsafeSlice"
-      - maybe only specify types for Vector?
-
--   vector
--   repa
--   repa-algorithms
-- 	xmonad (stackset)
--   snap/security
--   hmatrix
-      > http://hackage.haskell.org/packages/archive/hmatrix/0.12.0.1/doc/html/src/Data-Packed-Internal-Matrix.html#Matrix
-      > http://hackage.haskell.org/packages/archive/hmatrix/0.12.0.1/doc/html/src/Data-Packed-Internal-Vector.html#fromList
-
-Other Benchmarks
-================
-
-->   FingerTrees (containers / Data.Seq)
-->   Union-Find (PLDI09 port if necessary?)
-->   BDD        (PLDI09 port if necessary?)
-
-[NO] Data.Set (Map redux)
-        > ordering
-        > size
-        > set-properties
-        > balance (NO)
-
-[NO] Data.IntSet
-     > tricky bit-level operations/invariants
-
-Paper #2
-
--> Haskell + DB / Yesod / Snap
--> NDM/catch benchmarks (with refinements)
-
-Known Bugs
-==========
-
--> tests/todo/fft.hs
-
--> binsearch crashes because you have chains like:
-
-        x1 = 2
-        x2 = x1
-        x3 = x2
-        z  = x3 / 2
-
-  so I guess you need some constprop inside the constraint simplification.
-
-- tests/pos/data-mono0.hs
-  partial pattern match desugars into exception syntax with unhandled
-  casts. Throws an error in fixpoint. At least throw error in Constraint Gen?
-          (\ _ ->
-             (Control.Exception.Base.irrefutPatError
-                @ () "pos/data-mono0.hs:8:9-23|(Test.Cons x _)")
-             `cast` (UnsafeCo () GHC.Types.Int :: () ~ GHC.Types.Int))
-            GHC.Prim.realWorld#;
-
-
-Xmonad Case Study
-=================
-
-Theorems (from Wouter Swierstra's Coq Development)
-
-    - Invariant: NoDuplicates
-
-    - prop_empty_I      : new  : ? -> {v | invariant(v)}
-    - prop_view_I       : view : ? -> {v | invariant(v)}
-    - prop_greedyView_I : view : ? -> {v | invariant(v)}
-    - prop_focusUp_I
-    - prop_focusMaster_I
-    - prop_focusDown_I
-    - prop_focus_I
-    - prop_insertUp_I
-    - prop_delete_I
-    - prop_swap_master_I
-    - prop_swap_left_I  
-    - prop_swap_right_I
-    - prop_shift_I
-    - prop_shift_win_I
-
-[prop_FOO_I] check that various functions outputs satisfy "invariant"
-
-    FOO :: ??? -> {v: StackSet | invariant(v)}
-
-    > Theorem prop_swap_master_I (s : StackSet.stackSet i l a sd) :
-    > Theorem prop_view_I (l a sd : Set) (n : nat) (s : StackSet.stackSet nat l a sd) :
-    > Theorem prop_greedyView_I (l a sd : Set) (n : nat) (s : StackSet.stackSet nat l a sd) :
-    > Theorem prop_focusUp_I (l a sd : Set) (n : nat) (s : StackSet.stackSet nat l a sd) :
-    > Theorem prop_focusDown_I (l a sd : Set) (n : nat) (s : StackSet.stackSet nat l a sd) :
-    > Theorem prop_focusMaster_I (l a sd : Set) (n : nat) (s : StackSet.stackSet nat l a sd) :
-    > Theorem prop_empty_I (m : l) (wids : {wids : list i | wids <> nil})
-    > Theorem prop_empty (m : l) (wids : {wids : list i | wids <> nil})
-    > Theorem prop_differentiate (xs : list a) :
-
-[prop_FOO_local] check that various functions preserve a [hidden_spaces] MEASURE
-
-    FOO :: x: StackSet -> {v: StackSet | hidden_spaces(v) = hidden_spaces(x) }
-
-    > Theorem prop_focus_down_local (s : stackSet i l a sd) :
-    > Theorem prop_focus_up_local (s : stackSet i l a sd) :
-    > Theorem prop_focus_master_local (s : stackSet i l a sd) :
-    > Theorem prop_delete_local (s : stackSet i l a sd) (eq_dec : forall x y, {x = y} + {x <> y}) :
-    > Theorem prop_swap_master_local (s : stackSet i l a sd) :
-    > Theorem prop_swap_left_local (s : stackSet i l a sd) :
-    > Theorem prop_swap_right_local (s : stackSet i l a sd) :
-    > Theorem prop_shift_master_local (s : stackSet i l a sd) :
-    > Theorem prop_insert_local (x : stackSet i l a sd) (eq_dec : forall x y, {x = y} + {x <> y}) :
-
-
-BAD: these check that: forall x: foo (bar x) == x
-
-    > Theorem prop_focus_right (s : StackSet.stackSet i l a sd) :
-    > Theorem prop_focus_left (s : StackSet.stackSet i l a sd) :
-
-[prop_swap_*_focus] check that various functions preserve a [peek] MEASURE
-    > Theorem prop_swap_master_focus (x : StackSet.stackSet i l a sd) :
-    > Theorem prop_swap_left_focus (x : StackSet.stackSet i l a sd) :
-    > Theorem prop_swap_right_focus (x : StackSet.stackSet i l a sd) :
-
-
-BAD? forall x. swapMaster (swapMaster x) == x
-    > Theorem prop_swap_master_idempotent (x : StackSet.stackSet i l a sd) :
-
-BAD? forall x. view i (view i x) == (view i x)
-    > Theorem prop_focusMaster_idem (x : StackSet.stackSet i l a sd) :
-
-    NO. Prove: view :: i -> x -> {v: focus(v) = i}
-                    :: i -> x -> {v: focus(x) = i => x = v }
-
-    To prove foo_IDEMPOTENT, find a property P such that:
-
-                foo :: x:t -> {v:t | P(v)}
-                foo :: x:t -> {v:t | P(x) => v = x }
-
-SETS:
-    > Theorem prop_screens (s : stackSet i l a sd) :
-
-
-TRIV/HARD: (function definition)
-    > [TRIV]  Theorem prop_screens_work (x : stackSet i l a sd) :
-    > Theorem prop_mapWorkspaceId (x : stackSet i l a sd) :
-    > Theorem prop_mapLayoutId (s : stackSet i l a sd) :
-    > Theorem prop_mapLayoutInverse (s : stackSet i nat a sd) :
-    > Theorem prop_mapWorkspaceInverse (s : stackSet nat l a sd) :
-
-Theorem prop_lookup_current (x : stackSet i l a sd) :
-Theorem prop_lookup_visible (x : stackSet i l a sd) :
-
-
-Random Links
-============
-
-- Useful for DIGRAPH VIZ: http://arborjs.org/halfviz/#
-
-
-Benchmark Tags
-==============
-
-- LIQUIDFAIL : impossible to do verify the spec here
-- LIQUIDTODO : possible with some further hacking
-
-
-
-----------------------------------------------------------------------------
-
-http://www.cs.st-andrews.ac.uk/~eb/writings/fi-cbc.pdf
-
-McBride's Stack Machine youtube mcbride icfp 2012 monday keynote agda-curious
-
-    data Instr = Push Val | Add
-    type Val   = Int
-
-    measure needs                :: [Instr] -> Int
-    needs (Add    : is)          = min (2, 1 + needs(is))
-    needs (Push v : is)          = 0
-
-    run                          :: is:[Instr] -> {v:[Val] | len(v) >= needs(is)} -> [Val]
-    run (Add:is)      (x1:x2:vs) = run is (x1 + x2 : vs)
-    run (Push v : is) vs         = run is (v : vs)
-
-PROJECT: Termination for Combinator-based Parsers
--------------------------------------------------
-
-btw, did you guys see this:
-
-http://www.reddit.com/r/haskell/comments/1okcmh/odd_space_leak_when_using_parsec/
-
-the poster probably feels silly, but I have, on several occasions, hit
-this issue with parsec. Wonder whether our termination checker could be used... hmm...
-
-Sure! You just have to give
-
-type GenParser tok st = Parsec [tok] st
-
-a size, I guess (len [tok]). The hard part will be to prove it when the size is actually decreasing...
-
-Hmm... Surely we need to track somehow the "effect" of executing a single parsing action.
-
-For example,
-
-    chars :: Char -> Parser [Char]
-    chars c = do z  <- char c
-                 zs <- chars c
-                 return (z:zs)
-
-What is the machinery by which the "recursive call" is run on a "smaller" GenParser?
-Does it help if we remove the `do` block?
-
-    chars :: Char -> Parser [Char]
-    chars c = char c  >>= \z  ->   
-              chars c >>= \zs ->
-              return (z:zs)
-
-I guess the question becomes, how/where do we specify (let alone verify) that the function
-`char c` *consumes* one character, hence causing the `chars` to run on a *smaller* input?
-
-
-Phew, after banging my head against this all day, this is what I came up with.
-
-You need a measure
-
-   measure eats :: Parser a -> Nat
-
-which describes (a lower bound) on the number of tokens consumed by the action `Parser a`.
-
-Now, you give
-
-   return :: a -> {v: Parser a | (eats v) = 0}
-
-and most importantly,
-
-   (>>=)  :: forall <Q :: Parser b -> Prop>
-             x: Parser a
-          -> f:{v: a -> Parser b <Q> | (rec v) => (eats x) > 0}
-          -> exists z:Parser b <Q>. {v:Parser b | (eats v) = (eats z) + (eats x)}
-
-(Of course you have to give appropriate signatures for the parsec combinators
--- perhaps one can even PROVE the `eats` measure. However, note that
-
-   type Parser a = [Char] -> (a, [Char])
-
-roughly speaking, and here `eats` is actually the DIFFERENCE of the lengths of
-the input and output [Char] ... so I'm not sure how exactly we would reason about
-the IMPLEMENTATION of `eats` but certainly we should be able to USE it in clients
-of parsec.
-
-Note that you need a refinement ON the function type, the idea being that:
-
-1. the BODY of a recursive function is checked in the termination-strengthened
-environment that constrains the function to satisfy the predicate `rec`
-
-2. whenever you use >>= on a recursive function, the PRECEDING action must have
-consumed some tokens.
-
-3. the number of tokens consumed by the combined action equals the sum of the two
-actions (all the business about exists z and Q is to allow us to depend on the output
-value of `f` (c.f. tests/pos/cont1.hs)
-
-
-PROJECT: HTT style ST/IO reasoning with Abstract Refinements
-------------------------------------------------------------
-
-+ Create a test case: `tests/todo/Eff*.hs`
-
-+ Introduce a new sort of refinement `Ref` (with alias `RTProp`)
-   + Types.hs: Add to `Ref` -- in addition to `RMono` [---> `RPropP`] and `RPoly` [---> `RProp`]
-   + Types.hs: Add a `World t` for SL formulas...
-
-
-+ Allow `PVar` to have the sort `HProp`
-   + CHANGE `ptype :: PVKind t` where `data PVKind t = PVProp t | PVHProp`
-   + Can we reuse `RAllP` to encode `HProp`-quantification? (YES)
-   + Update `RTyCon` to store `HProp` vars
-
-- Update consgen
-   + Can we reuse type-application sites for `HProp`-instantiation? (Yes)
-   - Constraint.hs  :1642:   = errorstar "TODO:EFFECTS:freshPredRef"
-   - PredType.hs         : go _ (_, RHProp _ _)    = errorstar "TODO:EFFECTS:replacePreds"
-
-- Write cons-solve
-  - eliminate/solve `HProp` constraints prior to subtype splitting.
-
-- Index `IO` or `State` by `HProp`
-   - Parse.hs: Update `data` parser to allow `TyCon` to be indexed by abstract `HProp`
-   - Bare.hs        :482 : addSymSortRef _ (RHProp _ _)   = errorstar "TODO:EFFECTS:addSymSortRef"
-
-**TODO:EFFECTS:ASKNIKI**
-+ What is `isBind`,`pushConsBind` in Constraint.hs?
-
-
-3. Suitable signatures for monadic operators
-
-### RHProp
-
-a. Following `RProp` we should have
-
-	* RHProp := x1:t1,...,xn:tn -> World
-
-b. Where `World` is a _spatial conjunction_ of
-
-	* WPreds : (h v1 ... vn), h2, ...
-	* Wbinds : x1 := T1, x2 := T2, ...
-
-c. Such that each `World` has _at most one_ `WPred` (that is _not rigid_ i.e. can be solved for.)
-
-**Problem:** rejigger _inference_ to account for parameters in heap variables.
-
-
-
-### RPoly  (---> RProp)
-
-Per Niki:
-
-	RProp := x1:t1,...,xn:tn -> RType
-
-with the 'predicate' application implicitly buried as a `ur_pred` inside the RType
-
-For example, we represent
-
-	[a]<p>
-
-as
-
-	RApp [] a (RPoly  [(h:a)] {v:a<p>}) true
-
-which is the `RTycon` for lists `[]` applied to:
-
-+ Tyvar `a`
-
-+ RPoly with:
-	* _params_ `h:a`
-	* _body_   `{v:a<p> | true}` which is really, `RVar a {ur_reft = true, ur_pred = (Predicate 'p' with params 'h')}`
-
-+ Outer refinement `true`
-
-
-
-
-
-
-
-**Heap Propositions** `HProp`
-
-```haskell
-CP := l :-> T * CP  -- Concrete Heap
-    | emp
-
-HP := CP       
-    | CP * H        -- Heap Variable
-```
-
-That is, an `HProp` is of the form:
-
-    H * l1 |-> T1 * ... * ln |-> Tn
-
-or
-
-    l1 |-> T1 * ... * ln |-> Tn
-
-I am disallowing multiple variables because it causes problems...
-
-
-**Abstractly Refined ST/IO**
-
-```haskell
-data IO a <Pre :: HProp, Post :: a -> HProp>
-```
-
-**Refined Monadic Operators**
-
-```haskell
-return :: forall a, <H :: HProp>.
-            a -> IO <H, \_ -> H> a
-
-(>>=)  :: forall a, b, <P :: HProp, Q :: a -> HProp, R :: b -> HProp>.
-            IO<P, Q> a -> (x:a -> IO<Q x, R> b) -> IO<P, R> b
-```
-
-**Q1.** How does LH *reason* about `HProp`?
-
-Via subtyping as always, so:
-
-         forall i. Γ |- Ti <: Ti'
-    -----------------------------------
-    Γ |- *_i li :-> Ti <: *_i li -> Ti'
-
-For this, we need to put in explicit `HProp` instantiations, just like
-tyvar (α) and  predvar (π) instinstatntiations. This is doable with a
-pre-pass that generates and solves `HProp` constraints as follows:
-
-1. At each instantiation, make up _fresh_ variables `h`
-2. Treat _bound_ heap-variables as **constants**
-3. Instantiation yields a set of constraints over `h`
-4. Solve constraints via algorithm below.
-
-**Q2.** Can you _name_ values inside `HProp`?
-
-Nope. There's no reason for this, but its tedious to have to make up
-new heap binders and what not. Clutters stuff. This is _slightly_
-problematic. For example, how do you write a function of the form:
-
-```haskell
-incr :: p:IORef Int -> IO Int
-```
-
-which _increments_ the value stored at the reference? Solution is slightly
-clunky: rather than the _implicit_ heap binder, add an explicit pure parameter:
-
-```haskell
-incr :: p:IORef Int -> i:Int -> IO {v:Int| v = i} <p |-> {v = i}, p |-> {v = i + 1}>
-```
-
-**Q3.** How to relate `Post`-condition to the `Pre`-conditions?
-
-Note that the `Post`-condition is a unary predicate -- i.e. _does not_
-refer to the input world. How then do we relate the input and output heaps?
-As above: _name_ the values of the input heap that you care about, and then
-relate `Post` to `Pre` via the name.
-
-**Q4.** How to _read_ values off the heap?
-
-Given that we don't have heap binders, this might seem like a problem? Not
-really. Just write signatures like:
-
-    read :: IORef a -> IO a
-
-aha, but there's a problem: the `a` is too _coarse_ or flow-insensitive: it
-holds a supertype of all the values written at the location, as opposed to the
-_current_ value. No matter, abstract refinements to the rescue:
-
-    read :: forall <I :: a -> Prop>.
-              p:IORef a -> IO <p |-> a<I>, p |-> a<I>> a<I>
-
-**Q5.** How do you do _subtyping_ on heaps/frame rule?
-
-Wait, how do I write _compositional_ signatures that only talk about a
-particular part of the state but allow me to say _other_ parts are unmodified
-etc? Don't you need heap subtyping? No: we can make the frame rule explicit by
-abstracting over heaps:
-
-    read :: forall <I :: a -> Prop, H :: HProp>.
-              p:IORef a -> IO <p |-> a<I> * H, p |-> a<I> * H> a<I>
-
-**Q6.** How to solve heap constraints?
-
-Heap constraints are of the form:
-
-+ (C0)  `ch1      = ch2`        -- constants
-+ (C1)  `H1 * ch1 = ch2`        -- 1-variable
-+ (C2)  `H1 * ch1 = H2 * ch2`   -- 2-variable
-
-Here, each `ch` is of the form:
-
-    l1 |-> τ1 * ... * ln -> τn * A1 * ... * An
-
-where each `Ai` is a _rigid_ or quantified heap var that is atomic,
-i.e. cannot be further solved for. For solving, we throw away _all_
-refinements, and just use the shape τ.
-
-```
-solve :: Sol -> [Constraint] -> Maybe Sol
-solve σ []     
-  = Just σ
-solve σ (c:cs)
-  = case c of
-      C0 ch1 ch2 ->
-        if ch1 `equals` ch2  then
-          -- c is trivially SAT,
-          solve σ cs
-        else
-          -- c and hence all constraints are unsat
-          Nothing
-
-      C1 (H1 * ch1) ch2 ->
-        if ch1 `subset` ch2 then
-          let σ' = [H1 := c2 `minus` c1]
-          solve (σ . σ') (σ' <$> cs)
-        else
-          -- c and hence all constraints are unsat
-          Nothing
-
-      C2 (H1 * ch1) (H2 * ch2) ->
-        let H = fresh heap variable
-        let σ'  = [H1 := H * ch2, H2 := H * ch1]
-        solve (σ . σ') (σ' <$> cs)
-```
-
-
-
-PROJECT: (OLD) HTT style ST/IO reasoning with Abstract Refinements
-------------------------------------------------------------------
-
-
-Can we use abstract refinements to do "stateful reasoning",
-e.g. about stuff in `IO` ? For example, to read files, this
-is the API:
-
-    open  :: FilePath -> IO Handle
-    read  :: Handle   -> IO String
-    write :: Handle   -> String -> IO ()
-    close :: Handle   -> IO ()
-
-The catch is that:
-
-+ `read` and `write` require the `Handle` to be in an "open" state,
-+ which is the state of the `Handle` returned by `open`,
-+ while `close` presumably puts the `Handle` in a "closed" state.
-
-So, suppose we parameterize IO with two predicates a `Pre` and `Post` condition
-
-    data IO a <Pre :: World -> Prop> <Post :: a -> World -> World -> Prop>
-
-where `World` is some abstract type denoting the global machine state.
-Now, it should be possible to give types like:
-
-   (>>=)  :: IO a <P, Q> -> (x:a -> IO b<Q x, R>) -> IO b<P, R>
-   return :: a -> IO a <P, P>
-
-which basically state whats going on with connecting the conditions, and then,
-give types to the File API:
-
-   open  :: FilePath -> IO Handle <\_ -> True> <\h _ w -> (IsOpen h w)>
-   read  :: h:Handle -> IO String <\w -> (IsOpen h w)> <\_ _ w -> (IsOpen h w)>
-   close :: h:Handle -> IO ()     <\w -> (IsOpen h w)> <\_ _ w -> not (IsOpen h w)>
-
-Wonder if something like this would work?
-
-Niki:
-My question is how do you make Q from a post-condition (Q :: a -> Word -> Word -> Prop)
-to a pre-condition.
-I guess you need to apply a value x :: a and a w :: Word to write (a -> IO b<Q x w, R>).
-
-I think the problem is that the "correct" values x and w are not "in scope"
-
-
-So assume
-
-    data IO a <P :: Word -> Prop, Q: a -> Word -> Word -> Prop>
-      = IO (x:Word<P> -> (y:a, Word<Q y x>))
-
-and you want to type
-
-    bind :: IO a <P,Q> -> (a -> IO b <Q x w, R>) -> IO b <P,R>
-    bind (IO m) k = IO $ \s -> case m s of
-                                 (a, s') -> unIO (k a) s'
-
-
-You have
-
-    IO m :: IO a <P. Q> => m :: xx:Word <P> -> (y:a, Word <Q y xx>)
-
-you can assume
-
-    s:: Word <P>
-
-so
-
-    m s         :: (y:a, Word <Q y s>)
-    k a         :: IO b <Q x w, R>
-    uniIO (k a) :: z:Word <Q x w> -> (xx:b, Word <R xx z>)
-
-and we want
-
-    (uniIO k a) s :: (xx:b , Word <R xx s>)
-
-so basically we need
-
-    P  => Q x w
-
-to be able to make the final application
-
-**Ranjit**
-You are right. We need to convert the "post" of the first action into the "pre"
-of the second, which is a problem since the former takes three, parameters while
-the latter takes only one.
-
-BUT, how about this (basically, all you need is an EXISTS).
-
-   -- | the type for `return` says that the output world satisfies
-   --   whatever predicate the input world satisfied.
-
-   return :: a -> IO a <P, {\_ _ w' -> (P w')}>
-
-   -- | the type for `bind` says that its action requires as input a world that satisfies
-   --   Q (for SOME input world w0) and produces as output an R world.
-   (>>=)  :: IO a <P, Q>
-          -> (x:a -> \exists w0:World. IO b<{\w -> (Q x w0 w)}, R>)
-          -> IO b<P, {\xb w w' -> \exists xa:a w0:World<Q xa w>.(R xb w0 w')}>
-
-
-
-Basically, I am using exists in the same way as in the "compose"
-
-https://github.com/ucsd-progsys/liquidhaskell/blob/master/tests/pos/funcomposition.hs
-
-to name the intermediate worlds and results (after all, this seems
-like a super fancy version of `.` ) -- may have not put them in the
-right place...
-
-Btw, the existential is also how the HOARE rule for strongest postcondition works,
-if you recall:
-
-   {P} x := e {exists x'. P[x'/x] /\ x = e[x'/x]}
-
-
-
-
-One of the hardest steps seem to type the monad function (>>=):
-
-
-So, suppose we parameterize IO with two predicates a `Pre` and `Post` condition
-
-    data IO a <Pre :: World -> Prop> <Post :: a -> World -> World -> Prop>
-
-where `World` is some abstract type denoting the global machine state.
-Now, it should be possible to give types like:
-
-   (>>=)  :: IO a <P, Q> -> (a -> IO b<Q, R>) -> IO b<P, R>
-   return :: a -> IO a <P, P>
-
-
-
-My question is how do you make Q from a post-condition (Q :: a -> Word -> Word -> Prop)
-to a pre-condition.
-I guess you need to apply a value x :: a and a w :: Word to write (a -> IO b<Q x w, R>).
-
-I think the problem is that the "correct" values x and w are not "in scope"
-
-
-So assume
-data IO a <P :: Word -> Prop, Q: a -> Word -> Word -> Prop> = IO (x:Word<P> -> (y:a, Word<Q y x>))
-
-and you want to type
-
-bind :: IO a <P,Q> -> (a -> IO b <Q x w, R>) -> IO b <P,R>
-bind (IO m) k = IO $ \s -> case m s of (a, s') -> (unIO (k a)) s'
-
-You have
-
-IO m :: IO a <P. Q>  
-             => m :: xx:Word <P> -> (y:a, Word <Q y xx>)
-
-you can assume
-s:: Word <P>
-
-so
-m s :: (y:a, Word <Q y s>)
-
-k a :: IO b <Q x w, R>
-
-uniIO (k a) :: z:Word <Q x w> -> (xx:b, Word <R xx z>)
-
-and we want
-(uniIO k a) s :: (xx:b , Word <R xx s>)
-
-so basically we need
-P  => Q x w
-to be able to make the final application
-
-
-bind :: ST a <P,Q> -> (a -> ST b <Q x w, R>) -> ST b <P,R>
-bind (ST f1) k = ST $ \s0 -> let (x, s1) = f1 s0  
-                                 ST f2   = k x
-                                 (y, s2) = f2 s1
-                             in
-                                 (y, s2)
-
-
-PROJECT: Using `Dynamic` + Refinements for Mixed Records
---------------------------------------------------------
-
-Haskell has a class (and related functions)
-
-    toDyn   :: (Typeable a) => a -> Dynamic
-    fromDyn :: (Typeable a) => Dynamic -> Maybe a
-
-Q: How to encode *heterogenous* maps like:
-
-    d1 = { "name"  : "Ranjit"
-         , "age"   : 36
-         , "alive" : True
-         }
-
-   and also:
-
-    d2 = { "name"    : "Jupiter"
-         , "position": 5
-         }
-
-   so that you can write generic *duck-typed* functions like
-
-    showName :: Dict -> String
-
-   and write
-
-    showName d1
-    showName d2
-
-   or even
-
-    map showName [d1, d2]
-
-Step 1: Encode dictionary as vanilla Haskell type
-
-    type Dict <Q :: String -> Dynamic -> Prop> = Map String Dynamic <Q>
-    empty :: Dict
-    put   :: (Dynamic a) => String -> a -> Dict -> Dict
-    get   :: (Dynamic a) => String -> Dict -> Dict
-
-Step 2: **Create** dictionaries
-
-    d1 = put "name"   "RJ"
-       $ put "age"    36
-       $ put "alive"  True
-       $ empty
-
-    d1 = put "name"   "Jupiter"
-       $ put "pos"    5
-       $ empty
-
-Step 3: **Lookup** dictionaries
-
-    showName :: Dict -> String
-    showName d = get "name" d
-
-    -- TODO: how to support
-    showName :: Dict -> Dict
-    incrAge d = put "age" (n + 1) d
-      where
-            n = get "age" d
-
-    -- TODO: how to support
-    concat :: Dict -> Dict -> Dict
-
-Step 4: Can directly, without any casting nonsense, call
-
-    showName d1
-    showName d2
-
-Need to reflect *Haskell Type* (or at least, `TypeRep` values)
-inside logic, so you can write measures like
-
-    measure TypeOf :: a -> Type
-
-and use it to define refinements like
-
-    (TypeOf v = Int)
-
-(TODO: too bad we don't have relational measures... or multi-param measures ... yet!)
-
-which we can macro up thus.
-
-    predicate HasType V T = (TypeOf V = T)
-
-    predicate Fld K V N T = (K = N => (HasType V T))
-
-Step 5: Refined Signatures for `Dict` API
-
-    put :: (Dynamic a) => key:String
-                       -> {value:a | (Q key value)}
-                       -> d:Dict <Q /\ {\k _ -> k /= key}>
-                       -> Dict <Q /\ {\k v -> (Fld k v key a)}>
-
-    get :: (Dynamic a) => key:String
-                       -> d:Dict <{\k v -> (Fld k v key a)}>
-                       -> a
-
-Step 6: Now, for example, we should be able to type our dictionaries as
-
-    {-@ d1 :: Dict<Q1> @-}
-
-where
-
-    Q1 == \k v -> Fld k v "name"  String /\
-                  Fld k v "age"   Int    /\
-                  Fld k v "alive" Bool   
-
-and
-
-    {-@ d2 :: Dict<Q2> @-}
-
-where
-
-    Q2 == \k v -> Fld k v "name"  String /\
-                  Fld k v "pos"   Int    /\
-
-**TODO:**
-
-+ add support for `Type` inside logic
-  + needed for `TypeOf` measure, equality checks
-  + requires doing type-substitutions inside refinements
-
-+ add support for
-  + update [isn't that just `put`?]
-  + concat
-
-+ add support traversals (cf. *Ur*)
-  - Fold   (over all fields, eg. to serialize into a String)
-  - Map?   (transform all fields to serialize) toDB?
-  - Filter (takes a predicate that should only read valid columns of the record)
-
-
-PROJECT: Equational Reasoning
------------------------------
-
-e.g. Type class laws.
-
-Many type-classes come with a set of laws that instances are expected
-to abide by, e.g.
-
-```
-fmap id  ==  id
-
-fmap (f . g)  ==  fmap f . fmap g
-```
-
-```
-mappend mempty x = x
-
-mappend x mempty = x
-
-mappend x (mappend y z) = mappend (mappend x y) z
-```
-
-**Strategy**
-
-**1. Representing Proofs**
-
-```
-data Proof  = Proof           -- void, pure refinement
-
-type Pf P   = {v:Proof | P}
-
-type Eq X Y = Pf (X == Y)
-```
-
-**2. Combining Proofs**
-
-```
-bound Imp P Q R = P => Q => R
-
-eq, imp :: (Imp P Q R) => Pf P -> Pf Q -> Pf R
-
-refl    :: x:a -> Eq a x x
-```
-
-**3. Axiomatizing arithmetic**
-
-```
-add :: x:Int -> y:Int -> {z:Int | z = x + y} -> Eq (x + y) z
-add x y z = auto
-```
-
-
-**Example 1: Arithmetic**
-
-Lets drill in: how to represent the following "equational" proof in LH?
-
-```
-     (1 + 2) + (3 + 4)       -- e0
-
-     { 1 + 2 == 3}
-
-  == 3 + (3 + 4)             -- e1
-
-     { 3 + 4 == 7}
-
-  == 3 + 7                   -- e2
-
-     { 3 + 7 == 10}
-
-  == 10                      -- e3
-```
-
-Now the above proof looks like this:
-
-```
-e0 :: Int
-e0 = (1 + 2) + (3 + 4)
-
-prop :: Eq e0 10
-prop = (((refl e0  `imp` (add 1 2 3))   -- :: Eq e0 (3 + (3 + 4))
-
-                   `imp` (add 3 4 7))   -- :: Eq e0 (3 + 7)
-
-                   `imp` (add 3 7 10))  -- :: Eq e0 10  
-```
-
-
-**Example 2: Lists**
-
-A more interesting example: Lets prove `prop_app_nil`:
-
-    prop_app_nil: forall xs. append xs [] = xs
-
-The definition of
-
-```
-append []     ys = ys
-append (x:xs) ys = x : append xs ys
-```
-
-yields the *axioms*
-
-```
-append_nil  :: ys:_ -> Eq (append [] ys) ys
-append_cons :: x:_ -> xs:_ -> ys:_ -> Eq (append (x:xs) ys) (x : append xs ys)
-```
-
-Code on left, "equations" on right.
-
-```
-prop_app_nil    :: xs:[a] -> Eq (append xs []) xs
-
-prop_app_nil []     = refl (append [] [])             
-                                                   -- append [] []
-                       `by` (append_nil [])        -- { append_nil [] }    
-                                                   -- == []  
-
-prop_app_nil (x:xs) = refl (append (x:xs) [])       
-                                                   -- append (x:xs) []
-                       `by` (append_cons x xs [])  -- { append_cons x xs [] }
-                                                   -- == x : append xs []
-                       `by` (prop_app_nil xs)      -- { IH: prop_app xs }
-                                                   -- == x : xs
-```
-
-**Example 4: Append Associates**
-
-
-```
-prop_app_assoc :: xs:_ -> ys:_ -> zs:_ ->
-                     Eq ((xs ++ ys) ++ zs) (xs ++ (ys ++ zs))
-
-prop_app_assoc [] ys zs
-  ([] ++ ys) ++ zs
-  { append_nil _ }    
-  == ys ++ zs
-  { append_nil _ }
-  == [] ++ (ys ++ zs)
-
-prop_app_assoc (x:xs) ys zs
-  ((x:xs) ++ ys) ++ zs
-  { append_cons _ _ _ }    
-  == (x : (xs ++ ys)) ++ zs
-  { append_cons _ _ _ }
-  == x : ((xs ++ ys) ++ zs)
-  { prop_app_assoc _ _ _ }
-  == x : (xs ++ (ys ++ zs))
-  { append_cons _ _ _ }
-  == (x : xs) ++ (ys ++ zs)
-```
-
-
-**Example 4: Map Fusion**
-
-Lets go fancier:
-
-
-    forall xs. map (f . g) xs = (map f . map g) xs
-
-Here's the classical (?) equational proof:
-
-```
-map (f . g) []   
-   { map_nil (f . g) }
-   == []
-   { map_nil f }
-   == map f []
-   { map_nil g }
-   == map f (map g [])
-   { dot f g }
-   == (map f . map g) []
-
-map (f . g) (x:xs)  
-   { map_cons (f . g) x xs }
-   == (f . g) x : map (f . g) xs
-   { map_dot f g xs }
-   == (f . g) x : (map f . map g) xs
-   { dot (map f) (map g) }
-   == (f . g) x : map f (map g xs)
-   { dot f g }
-   == f (g x) : map f (map g xs)
-   {map_cons f (g x) (map g xs) }
-   == map f (g x : map g xs)
-   {map_cons g x xs}
-   == map f (map g (x : xs))
-   { dot (map f) (map g) }
-   ==  (map f . map g) (x : xs)
-```
-
-Formalize thus (with functions/axioms)
-
-```
-map f []     = []               -- map_nil
-map f (x:xs) = f x  : map f xs  -- map_cons
-
-(f . g) x    =  f (g x)         -- dot
-```
-
-Now, we formalize map-fusion as:
-
-```
-map_fusion :: f:_ -> g:_ -> xs:_ ->
-              Eq (map (f . g) xs) (map f . map g) xs
-
-map_fusion f g []     = map_dot_nil f g
-map_fusion f g (x:xs) = map_dot_cons f g x xs
-```
-
-The hard work happens in the two "lemmas"
-
-```
-map_dot_nil :: f:_ -> g:_ ->
-               Eq (map (f . g) []) ((map f . map g) [])
-map_dot_nil f g
-  = refl (map (f . g) [])   
-                              -- map (f . g) []
-     `by` (map_nil (f . g))
-                              -- == []
-     `by` (map_nil f)
-                              -- == map f []
-     `by` (map_nil g)
-                              -- == map f (map g [])
-     `by` (dot f g)
-                              -- == (map f . map g) []
-```
-
-and
-
-```
-map_dot_cons :: f:_ -> g:_ -> x:_ -> xs:_ ->
-               Eq (map (f . g) (x:xs)) ((map f . map g) (x:xs))
-map_dot_cons f g x xs
-  = refl (map (f . g) (x:xs))
-                                          -- map (f . g) (x : xs)
-      `by` (map_cons (f . g) x xs)
-                                          -- == (f . g) x : map (f . g) xs
-      `by` (map_dot f g xs)
-                                          -- == (f . g) x : (map f . map g) xs
-      `by` (dot (map f) (map g))
-                                          -- == (f . g) x : map f (map g xs)
-      `by` (dot f g)
-                                          -- == f (g x) : map f (map g xs)
-      `by` (map_cons f (g x) (map g xs))
-                                          -- == map f (g x : map g xs)
-      `by` (map_cons g x xs)
-                                          -- == map f (map g (x : xs))
-      `by` (dot (map f) (map g))
-                                          -- ==  (map f . map g) (x : xs)
-```
-
-
-
-GHC 7.10
---------
-
-- **DONE** singleton type classes represented by newtype
-  - tried to work around by translating
-
-      foo `cast` (co :: a -> b ~ Foo)
-
-    to
-
-      D:Foo foo
-
-    but it still breaks when we don't have an LH class decl
-  - without LH class decl we never see D:Foo, so it doesn't go in CGEnv
-  - SOLUTION: put ALL visible dict constructors in CGEnv
-
-- `cast`s are used more often and we seem to lose information..
-  - seems particularly problematic with ST
-
-- srcloc annotations
-  - -g adds SourceNotes, but the html output is borked
-  - in particular, infix operators aren't annotated correctly (at all?)
-  - are we missing some SrcLocs??
-    - clearly not, if you look at the output of
-
-          ghc -g -ddump-ds -dppr-ticks <file.hs>
-
-      somewhere along our pipeline the ticks are either being dropped,
-      or the SrcSpans don't quite match the way they used to...
-
-- termination metrics are required in a few places where they were not previously
-  - my guess is that ghc's behaviour for grouping functions in a `Rec` binder have changed
diff --git a/cabal.project b/cabal.project
deleted file mode 100644
--- a/cabal.project
+++ /dev/null
@@ -1,11 +0,0 @@
--- For more information see
---  http://cabal.readthedocs.io/en/latest/nix-local-build-overview.html
-
-packages: .
-          ./liquid-fixpoint
-
-package liquid-fixpoint
-  flags: devel
-
-package liquidhaskell
-  flags: devel
diff --git a/circle.yml b/circle.yml
deleted file mode 100644
--- a/circle.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-machine:
-  #ghc:
-  #  version: 7.10.2
-  pre:
-    - sudo add-apt-repository -y ppa:hvr/z3
-    # - sudo add-apt-repository -y ppa:hvr/ghc
-    - sudo apt-get -y update
-    - sudo apt-get -y install z3 # ghc-7.10.3
-
-checkout:
-  post:
-    - git submodule sync
-    # fetch fixpoint pull requests
-    - sed -i '/fixpoint.git/a fetch = +refs/pull/*/head:refs/remotes/origin/pr/*' .git/modules/liquid-fixpoint/config
-    - git submodule update --init
-    - pwd
-
-dependencies:
-  cache_directories:
-    - "~/.stack"
-    - ".stack-work"
-  pre:
-    # - curl -sSL https://get.haskellstack.org/ | sh
-    - curl -SL https://www.stackage.org/stack/linux-x86_64-static | tar zx -C /tmp
-    # - curl -L https://github.com/commercialhaskell/stack/releases/download/v1.0.4/stack-1.0.4-linux-x86_64.tar.gz | tar zx -C /tmp
-    - sudo mv /tmp/stack-*-linux-x86_64-static/stack /usr/bin
-  override:
-    - stack setup
-    - rm -fr $(stack path --dist-dir) $(stack path --local-install-root)
-    - stack build liquidhaskell --only-dependencies --test --no-run-tests
-
-compile:
-  override:
-    # - stack build liquidhaskell --fast --pedantic --flag liquidhaskell:include --flag liquidhaskell:devel
-    - stack build liquidhaskell --flag liquidhaskell:include --flag liquidhaskell:devel
-    - stack build liquidhaskell --flag liquidhaskell:include --flag liquidhaskell:devel --test --no-run-tests
-
-test:
-  override:
-    - mkdir -p $CIRCLE_TEST_REPORTS/junit
-    - stack test liquidhaskell:test --flag liquidhaskell:include --flag liquidhaskell:devel --test-arguments="-t 1200s -j2 --xml=$CIRCLE_TEST_REPORTS/junit/main-test-results.xml --liquid-opts='--cores=1'":
-        timeout: 1800
-    - stack test liquidhaskell:liquidhaskell-parser --test-arguments="-j2 --xml=$CIRCLE_TEST_REPORTS/junit/parser-test-results.xml":
-        timeout: 1800
-    # - git ls-files | grep '\.l\?hs$' | xargs stack exec -- hlint -X QuasiQuotes "$@"
-    # - stack exec -- cabal update
-    # - stack exec --no-ghc-package-path -- cabal install --only-dependencies --dry-run --reorder-goals
-    # - stack exec -- packdeps *.cabal || true
-    # - stack exec -- cabal check
-    - stack sdist
-  post:
-    # - stack haddock liquidhaskell --no-haddock-deps --haddock-arguments="--no-print-missing-docs --odir=$CIRCLE_ARTIFACTS"
-    # - cp -r dist/doc $CIRCLE_ARTIFACTS
-    - mkdir -p $CIRCLE_TEST_REPORTS/tasty
-    - cp -r tests/logs/cur $CIRCLE_TEST_REPORTS/tasty/log
-    # - hpc-coveralls --exclude-dir=tests --repo-token=$COVERALLS_REPO_TOKEN
diff --git a/cleanup b/cleanup
deleted file mode 100644
--- a/cleanup
+++ /dev/null
@@ -1,1 +0,0 @@
-find . | grep -E -e '\.(smt2|bak|json|css|md|hi|out|fqout|fq|o|err|annot|log|html|cgi|liquid)$' | xargs rm -rf
diff --git a/docs/blog/2013-01-01-refinement-types-101.lhs b/docs/blog/2013-01-01-refinement-types-101.lhs
deleted file mode 100644
--- a/docs/blog/2013-01-01-refinement-types-101.lhs
+++ /dev/null
@@ -1,312 +0,0 @@
----
-layout: post
-title: "Refinement Types 101"
-date: 2013-01-01 16:12
-author: Ranjit Jhala
-published: true
-comments: true
-external-url:
-categories: basic
-demo: refinements101.hs
----
-
-One of the great things about Haskell is its brainy type system that
-allows one to enforce a variety of invariants at compile time, thereby
-nipping a large swathe of run-time errors in the bud. Refinement types
-allow us to use modern logic solvers (*aka* SAT and SMT engines) to
-dramatically extend the scope of invariants that can be statically
-verified.
-
-What is a Refinement Type?
---------------------------
-
-In a nutshell, 
-
-<blockquote><p>
-Refinement Types = Types + Logical Predicates
-</p></blockquote>
-
-That is, refinement types allow us to decorate types with 
-*logical predicates* (think *boolean-valued* Haskell expressions) 
-which constrain the set of values described by the type, and hence 
-allow us to specify sophisticated invariants of the underlying values. 
-
-Say what? 
-
-<!-- more -->
-
-(Btw, *click the title* to demo LiquidHaskell on the code in this article)
-
-\begin{code}
-module Intro where
-
-import Language.Haskell.Liquid.Prelude  (liquidAssert)
-\end{code}
-
-Let us jump right in with a simple example, the number `0 :: Int`. 
-As far as Haskell is concerned, the number is simply an `Int` (lets not
-worry about things like `Num` for the moment). So are `2`, `7`, and 
-`904`. With refinements we can dress up these values so that they 
-stand apart. For example, consider the binder
-
-\begin{code}
-zero' :: Int
-zero' = 0
-\end{code}
-
-We can ascribe to the variable `zero'` the refinement type
-
-\begin{code}
-{-@ zero' :: {v: Int | 0 <= v} @-}
-\end{code}
-
-which is simply the basic type `Int` dressed up with a predicate.
-The binder `v` is called the *value variable*, and so the above denotes 
-the set of `Int` values which are greater than `0`. Of course, we can
-attach other predicates to the above value, for example
-
-**Note:** We will use `@`-marked comments to write refinement type 
-annotations the Haskell source file, making these types, quite literally,
-machine-checked comments!
-
-
-\begin{code}
-{-@ zero'' :: {v: Int | (0 <= v && v < 100) } @-}
-zero'' :: Int
-zero'' = 0
-\end{code}
-
-which states that the number is in the range `0` to `100`, or
-
-\begin{code}
-{-@ zero''' :: {v: Int | ((v mod 2) = 0) } @-}
-zero''' :: Int
-zero''' = 0
-\end{code}
-
-where `mod` is the *modulus* operator in the refinement logic. Thus, the type
-above states that zero is an *even* number.
-
-We can also use a singleton type that precisely describes the constant
-
-\begin{code}
-{-@ zero'''' :: {v: Int | v = 0 } @-}
-zero'''' :: Int
-zero'''' = 0
-\end{code}
-
-(Aside: we use a different names `zero'`, `zero''` etc. for a silly technical 
-reason -- LiquidHaskell requires that we ascribe a single refinement type to 
-a top-level name.)
-
-Finally, we could write a single type that captures all the properties above:
-
-\begin{code}
-{-@ zero :: {v: Int | ((0 <= v) && ((v mod 2) = 0) && (v < 100)) } @-}
-zero     :: Int
-zero     =  0
-\end{code}
-
-The key points are:
-
-1. A refinement type is just a type *decorated* with logical predicates.
-2. A value can have *different* refinement types that describe different properties.
-3. If we *erase* the green bits (i.e. the logical predicates) we get back *exactly* 
-   the usual Haskell types that we know and love.
-4. A vanilla Haskell type, say `Int` has the trivial refinement `true` i.e. is 
-   really `{v: Int | true}`.
-
-We have built a refinement type-based verifier called LiquidHaskell. 
-Lets see how we can use refinement types to specify and verify interesting 
-program invariants in LiquidHaskell.
-
-Writing Safety Specifications
------------------------------
-
-We can use refinement types to write various kinds of more interesting
-safety specifications.
-
-First, we can write a wrapper around the usual `error` function 
-
-\begin{code}
-{-@ error' :: {v: String | false } -> a  @-}
-error'     :: String -> a
-error'     = error
-\end{code}
-
-The interesting thing about the type signature for `error'` is that the
-input type has the refinement `false`. That is, the function must only be
-called with `String`s that satisfy the predicate `false`. Of course, there
-are *no* such values. Thus, a program containing the above function
-typechecks *exactly* when LiquidHaskell can prove that the function
-`error'` is *never called*.
-
-Next, we can use refinements to encode arbitrary programmer-specified 
-**assertions** by defining a function
-
-\begin{code}
-{-@ lAssert     :: {v:Bool | (Prop v)} -> a -> a  @-}
-lAssert         :: Bool -> a -> a 
-lAssert True  x = x
-lAssert False _ = error' "lAssert failure" 
-\end{code}
-
-In the refinement, `(Prop v)` denotes the Haskell `Bool` value `v` 
-interpreted as a logical predicate. In other words, the input type for 
-this function specifies that the function must *only* be called with
-the value `True`.
-
-
-Refining Function Types : Preconditions
----------------------------------------
-
-Lets use the above to write a *divide* function that *only accepts* non-zero
-denominators. 
-
-\begin{code}
-divide     :: Int -> Int -> Int
-divide n 0 = error' "divide by zero"
-divide n d = n `div` d
-\end{code}
-
-We can specify that the non-zero denominator *precondition* with a suitable 
-refinement on the *input* component of the function's type 
-
-\begin{code}
-{-@ divide :: Int -> {v: Int | v != 0 } -> Int @-}
-\end{code}
-
-How *does* LiquidHaskell verify the above function? 
-
-The key step is that LiquidHaskell deduces that the expression 
-`"divide by zero"` is not merely of type `String`, but in fact 
-has the the refined type `{v:String | false}` *in the context* 
-in which the call to `error'` occurs.
-
-LiquidHaskell arrives at this conclusion by using the fact that 
-in the first equation for `divide` the *denominator* parameter 
-is in fact `0 :: {v: Int | v = 0}` which *contradicts* the 
-precondition (i.e. input) type.
-
-In other words, LiquidHaskell deduces by contradiction, that 
-the first equation is **dead code** and hence `error'` will 
-not be called at run-time.
-
-If you are paranoid, you can put in an explicit assertion
-
-\begin{code}
-{-@ divide' :: Int  -> {v:Int | v /= 0} -> Int @-}
-divide'     :: Int -> Int -> Int
-divide' n 0 = error' "divide by zero"
-divide' n d = lAssert (d /= 0) $ n `div` d
-\end{code}
-
-and LiquidHaskell will verify the assertion (by verifying the call to
-`lAssert`) for you.
-
-Refining Function Types : Postconditions
-----------------------------------------
-
-Next, lets see how we can use refinements to describe the *outputs* of a
-function. Consider the following simple *absolute value* function
-
-\begin{code}
-abz               :: Int -> Int
-abz n | 0 < n     = n
-      | otherwise = 0 - n
-\end{code}
-
-We can use a refinement on the output type to specify that the function 
-returns non-negative values
-
-\begin{code}
-{-@ abz :: Int -> {v: Int | 0 <= v } @-}
-\end{code}
-
-LiquidHaskell *verifies* that `abz` indeed enjoys the above type by
-deducing that `n` is trivially non-negative when `0 < n` and that in 
-the `otherwise` case, i.e. when `not (0 < n)` the value `0 - n` is
-indeed non-negative (lets not worry about underflows for the moment.)
-LiquidHaskell is able to automatically make these arithmetic deductions
-by using an [SMT solver](http://rise4fun.com/Z3/) which has decision
-built-in procedures for arithmetic, to reason about the logical
-refinements.
-
-
-
-Putting It All Together
------------------------
-
-Lets wrap up this introduction with a simple `truncate` function 
-that connects all the dots. 
-
-\begin{code}
-{-@ truncate :: Int -> Int -> Int @-}
-truncate i max  
-  | i' <= max' = i
-  | otherwise  = max' * (i `divide` i')
-    where i'   = abz i
-          max' = abz max 
-\end{code}
-
-`truncate i n` simply returns `i` if its absolute value is less the
-upper bound `max`, and otherwise *truncates* the value at the maximum.
-LiquidHaskell verifies that the use of `divide` is safe by inferring that 
-at the call site
-
-1. `i' > max'` from the branch condition.
-2. `0 <= i'`   from the `abz` postcondition (hover mouse over `i'`).
-3. `0 <= max'` from the `abz` postcondition (hover mouse over `max'`).
-
-From the above, LiquidHaskell infers that `i' != 0`. That is, at the
-call site `i' :: {v: Int | v != 0}`, thereby satisfying the
-precondition for `divide` and verifying that the program has no pesky 
-divide-by-zero errors. Again, if you *really* want to make sure, put 
-in an assertion
-
-\begin{code}
-{-@ truncate' :: Int -> Int -> Int @-}
-truncate' i max  
-  | i' <= max' = i
-  | otherwise  = lAssert (i' /= 0) $ max' * (i `divide` i')
-    where i'   = abz i
-          max' = abz max 
-\end{code}
-
-and *lo!* LiquidHaskell will verify it for you.
-
-Modular Verification
---------------------
-
-Incidentally, note the `import` statement at the top. Rather than rolling
-our own `lAssert` we can import and use a pre-defined version `liquidAssert` 
-defined in an external [module](https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/Language/Haskell/Liquid/Prelude.hs)
-
-\begin{code}
-{-@ truncate'' :: Int -> Int -> Int @-}
-truncate'' i max  
-  | i' <= max' = i
-  | otherwise  = liquidAssert (i' /= 0) $ max' * (i `divide` i')
-    where i'   = abz i
-          max' = abz max 
-\end{code}
-
-In fact, LiquidHaskell comes equipped with suitable refinements for
-standard functions and it is easy to add refinements as we shall
-demonstrate in subsequent articles.
-
-Conclusion
-----------
-
-This concludes our quick introduction to Refinement Types and
-LiquidHaskell. Hopefully you have some sense of how to 
-
-1. **Specify** fine-grained properties of values by decorating their
-   types with logical predicates.
-2. **Encode** assertions, preconditions, and postconditions with suitable
-   function types.
-3. **Verify** semantic properties of code by using automatic logic engines 
-   (SMT solvers) to track and establish the key relationships between 
-   program values.
-
-
diff --git a/docs/blog/2013-01-27-refinements101-reax.lhs b/docs/blog/2013-01-27-refinements101-reax.lhs
deleted file mode 100644
--- a/docs/blog/2013-01-27-refinements101-reax.lhs
+++ /dev/null
@@ -1,262 +0,0 @@
----
-layout: post
-title: "Refinements 101 (contd.)" 
-date: 2013-01-27 16:12
-author: Ranjit Jhala
-published: true 
-comments: true
-external-url:
-categories: basic
-demo: refinements101reax.hs
----
-
-Hopefully, the [previous][ref101] article gave you a basic idea about what
-refinement types look like. Several folks had interesting questions, that
-are worth discussing in a separate post, since they throw a lot of light 
-on the strengths (or weaknesses, depending on your point of view!) of
-LiquidHaskell.
-
-<!-- more -->
-
-\begin{code}
-module Refinements101Reax where
-\end{code}
-
-How to relate outputs and inputs 
---------------------------------
-
-Recall the function `divide`
-
-\begin{code}
-{-@ divide :: Int -> {v: Int | v /= 0 } -> Int @-}
-divide     :: Int -> Int -> Int
-divide n 0 = error "divide by zero"
-divide n d = n `div` d
-\end{code}
-
-and `abz` was the absolute value function
-
-\begin{code}
-abz               :: Int -> Int
-abz n | 0 < n     = n
-      | otherwise = 0 - n
-\end{code}
-
-[nanothief](http://www.reddit.com/user/nanothief) [remarked][qreddit101]
-that LiquidHaskell was unable to verify the safety of the following call to
-`divide` (i.e. was unable to show that `x` was non-zero at the callsite).
-
-\begin{code}
-{-@ f :: Int -> Int @-}
-f x | abz x == 0 = 3
-    | otherwise  = 3 `divide` x
-\end{code}
-
-Nanothief correctly argues that the code is clearly safe as *"`abz x == 0` being false implies `x /= 0`"*. 
-Indeed, the code *is safe*, however, the reason that LiquidHaskell
-rejected it has nothing to do with its inability
-to  *"track the constraints of values based on tests using new values derived from that value"* as Nanothief surmised,
-but instead, because LiquidHaskell supports **modular verification** 
-where the *only* thing known about `abz` at a *use site* is 
-whatever is specified in its *type*. 
-
-\begin{code}Concretely speaking, the type 
-abz :: Int -> {v: Int | 0 <= v }
-\end{code}
-
-is too anemic to verify `f` above, as it tells us nothing 
-about the *relationship* between the output and input -- looking at it,
-we have now way of telling that when the *output* (of `abz`) is 
-non-zero, the *input*  must also have been non-zero.
-
-\begin{code}Instead, we can write a *stronger* type which does capture this information, for example
-abz :: x:Int -> {v:Int | v = (if (x > 0) then x else (0 - x))}
-\end{code}
-
-\begin{code} where 
-v = (if p then e1 else e2)
-\end{code}
-
-\begin{code} is an abbreviation for the formula 
-(p => v == e1) && ((not p) => v = e2)
-\end{code}
-
-With this specification for `abz`, LiquidHaskell is able to reason that
-when `abz x` is non-zero, `x` is also non-zero. Of course, `abz` is trivial 
-enough that we can very precisely capture its *exact* semantics in the 
-refinement type, but thats is rarely the case. 
-
-Nevertheless, even here, you could write a somewhat *weaker* specification,
-that still had enough juice to allow the verification of the `divide` call
-in `f`. In particular, we might write
-
-\begin{code}
-{-@ abz :: x:Int -> {v:Int | ((0 <= v) && ((v = 0) <=> (x = 0))) } @-}
-\end{code}
-
-which states the output is `0` *if and only if* the input is `0`.
-LiquidHaskell will happily verify that `abz` implements this specification,
-and will use it to verify the safety of `f` above.
-
-(BTW, follow the link above to *demo this code*  yourself.)
-
-How to tell a Fib
------------------
-
-[Chris Done](https://twitter.com/christopherdone) [asked][qblog101]
-why LiquidHaskell refused to verify the following definition of `fib`.
-
-\begin{code}
-{-@ fib :: n:Int -> { b:Int | (n >= 0 && b >= n) } @-}
-fib :: Int -> Int
-fib 0 = 0
-fib 1 = 1
-fib n = fib (n-1) + fib (n-2)
-\end{code}
-
-Indeed, the both the *specification* and the *implementation* look pretty
-legit, so what gives?  It turns out that there are *two* different reasons why. 
-
-**Reason 1: Assumptions vs. Guarantees**
-
-What we really want to say over here is that the *input* `n` 
-is non-negative. However, putting the refinement `n >= 0` in 
-the *output* constraint means that it becomes something that 
-LiquidHaskell checks that the function `fib` **guarantees** 
-(or **ensures**).
-That is, the type states that we can pass `fib` *any* value 
-`n` (including *negative* values) and yet, `fib` must return 
-values `b` such that `b >= n` *and* `n >= 0`. 
-
-The latter requirement is a rather tall order when an arbitrary `n` 
-is passed in as input. `fib` can make no such guarantees since 
-it was *given* the value `n` as a parameter. The only way `n` could 
-be non-negative was that if the caller had sent in a non-negative value. 
-Thus, we want to put the *burden of proof* on the right entity here, 
-namely the caller.
-
-To assign the burden of proof appropriately, we place the
-non-negative refinement on the *input type*
-
-\begin{code}
-{-@ fib' :: n:{v:Int | v >= 0} -> {b:Int | (n >= 0 && b >= n) } @-}
-fib' :: Int -> Int
-fib' 0 = 0
-fib' 1 = 1
-fib' n = fib (n-1) + fib (n-2)
-\end{code}
-
-where now at *calls to* `fib'` LiquidHaskell will check that the argument
-is non-negative, and furthermore, when checking `fib'` LiquidHaskell will 
-**assume** that the parameter `n` is indeed non-negative. So now the
-constraint `n >= 0` on the output is somewhat redundant, and the
-non-negative `n` guarantee holds trivially.
-
-**Reason 2: The Specification is a Fib**
-
-If you run the above in the demo, you will see that LiquidHaskell still
-doth protest loudly, and frankly, one might start getting a little
-frustrated at the stubbornness and petulance of the checker.
-
-\begin{code} However, if you stare at the implementation, you will see that it in fact, *does not* meet the specification, as
-fib' 2  == fib' 1 + fib' 0
-        == 0 + 1
-        == 1
-\end{code}
-
-LiquidHaskell is reluctant to prove things that are false. Rather than 
-anthropomorphize frivolously, lets see why it is unhappy. 
-
-\begin{code}First, recall the somewhat simplified specification 
-fib' :: n:Int -> { b:Int | (b >= n) } 
-\end{code}
-
-As we saw in the discussion about `abz`, at each recursive callsite
-the *only information* LiquidHaskell uses about the returned value, 
-is that described in the *output type* for that function call.
-
-\begin{code}Thus, LiquidHaskell reasons that the expression:
-fib' (n-1) + fib' (n-2)
-\end{code}
-
-\begin{code}has the type
-{b: Int | exists b1, b2. b  == b1 + b2 
-                      && b1 >= n-1 
-                      && b2 >= n-2     }
-\end{code}
-
-where the `b1` and `b2` denote the values returned by the 
-recursive calls --- we get the above by plugging the parameters
-`n-1` and `n-2` in for the parameter `n` in output type for `fib'`.
-
-\begin{code}The SMT solver simplifies the above to
-{b: Int | b >= 2n - 3}
-\end{code}
-
-\begin{code} Finally, to check the output guarantee is met, LiquidHaskell asks the SMT solver to prove that
-(b >= 2n - 2)  =>  (b >= n)
-\end{code}
-
-The SMT solver will refuse, of course, since the above implication is 
-*not valid* (e.g. when `n` is `2`) Thus, via SMT, LiquidHaskell proclaims
-that the function `fib'` does not implement the advertised type and hence
-marks it *unsafe*.
-
-Fixing The Code
----------------
-
-How then, do we get Chris' specification to work out? It seems like it 
-*should* hold (except for that pesky case where `n=2`. Indeed,
-let's rig the code, so that all the base cases return `1`.
-
-\begin{code}
-{-@ fibOK :: n:Int -> {b:Int | ((b >= n) && (b >= 1))} @-}
-fibOK :: Int -> Int
-fibOK 0 = 1
-fibOK 1 = 1
-fibOK n = fibOK (n-1) + fibOK (n-2)
-\end{code}
-
-Here' we specify that not only is the output greater than the input, it is
-**also** greater than `1`. 
-
-\begin{code} Now in the recursive case, LiquidHaskell reasons that the value being output is
-{b: Int | exists b1, b2. b  == b1 + b2 
-                      && b1 >= n-1 && b1 >= 1 
-                      && b2 >= n-2 && b2 >= 1 }
-\end{code}
-
-\begin{code}which reduces to 
-{b: Int | b = 2n - 3 && n >= 2 }
-\end{code}
-
-\begin{code}which, the SMT solver is happy to verify, is indeed a subtype
-of (i.e. implies the refinement of) the specified output
-{b: Int | b >= n && b >= 1 } 
-\end{code}
-
-Conclusion
-----------
-
-There are several things to take away. 
-
-1. We need to distinguish between *assumptions* and *guarantees* 
-   when writing specifications for functions.
-
-2. For *modularity*, LiquidHaskell, like every type system, uses only
-   the (refinement) *type*  of each function at each use site, and not the 
-   function's *body*.
-
-3. Some seemingly intuitive specifications often aren't; in future work it
-   would be useful to actually [generate][mlton]  [tests][concolic] as 
-   [counterexamples][icse04] that illustrate when a specification
-   [fails][dsd].
-
-[qblog101]: /blog/2013/01/01/refinement-types-101.lhs/#comment-772807850
-[qreddit101]: http://www.reddit.com/r/haskell/comments/16w3hp/liquidhaskell_refinement_types_in_haskell_via_smt/c809160
-[ref101]:  /blog/2013/01/01/refinement-types-101.lhs/ 
-[concolic]: http://en.wikipedia.org/wiki/Concolic_testing
-[icse04]: http://goto.ucsd.edu/~rjhala/papers/generating_tests_from_counterexamples.html
-[dsd]: http://dl.acm.org/citation.cfm?doid=1348250.1348254
-[mlton]: http://www.cs.purdue.edu/homes/zhu103/pubs/vmcai13.pdf
-
diff --git a/docs/blog/2013-01-31-safely-catching-a-list-by-its-tail.lhs b/docs/blog/2013-01-31-safely-catching-a-list-by-its-tail.lhs
deleted file mode 100644
--- a/docs/blog/2013-01-31-safely-catching-a-list-by-its-tail.lhs
+++ /dev/null
@@ -1,378 +0,0 @@
----
-layout: post
-title: "Safely Catching A List By Its Tail"
-date: 2013-01-31 16:12
-author: Ranjit Jhala
-published: true 
-comments: true
-external-url:
-categories: measures 
-demo: lenMapReduce.hs
----
-
-[Previously][ref101] we [saw][ref102] some examples of how refinements
-could be used to encode invariants about basic `Int` values.  Today, let's
-see how refinements allow us specify and verify *structural invariants*
-about recursive data types like lists. In particular, we will
-learn about at a new mechanism called a `measure`, 
-use measures to describe the **length** of a list, and 
-use the resulting refinement types to obtain compile-time assurances
-that canonical list manipulating operations like `head`, `tail`, `foldl1`
-and (incomplete) pattern matches will not *blow up* at run-time.
-
-<!-- more -->
-
-\begin{code}
-module ListLengths where
-
-import Prelude hiding (length, map, filter, head, tail, foldl1)
-import Language.Haskell.Liquid.Prelude (liquidError)
-import qualified Data.HashMap.Strict as M
-import Data.Hashable 
-\end{code}
-
-Measuring the Length of a List
-------------------------------
-
-To begin, we need some instrument by which to measure the length of a list.
-To this end, let's introduce a new mechanism called **measures** which 
-define auxiliary (or so-called **ghost**) properties of data values.
-These properties are useful for specification and verification, but
-**don't actually exist at run-time**.
-That is, measures will appear in specifications but *never* inside code.
-
-
-
-
-\begin{code} Let's reuse this mechanism, this time, providing a [definition](https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/GHC/Base.spec) for the measure
-measure len :: forall a. [a] -> GHC.Types.Int
-len ([])     = 0
-len (y:ys)   = 1 + (len ys) 
-\end{code}
-
-The description of `len` above should be quite easy to follow. Underneath the 
-covers, LiquidHaskell transforms the above description into refined versions 
-of the types for the constructors `(:)` and `[]`,
-\begin{code}Something like 
-data [a] where 
-  []  :: forall a. {v: [a] | (len v) = 0 }
-  (:) :: forall a. y:a -> ys:[a] -> {v: [a] | (len v) = 1 + (len ys) } 
-\end{code}
-
-To appreciate this, note that we can now check that
-
-\begin{code}
-{-@ xs :: {v:[String] | (len v) = 1 } @-}
-xs = "dog" : []
-
-{-@ ys :: {v:[String] | (len v) = 2 } @-}
-ys = ["cat", "dog"]
-
-{-@ zs :: {v:[String] | (len v) = 3 } @-}
-zs = "hippo" : ys
-\end{code}
-
-Dually, when we *de-construct* the lists, LiquidHaskell is able to relate
-the type of the outer list with its constituents. For example,
-
-\begin{code}
-{-@ zs' :: {v:[String] | (len v) = 2 } @-}
-zs' = case zs of 
-        h : t -> t
-\end{code}
-
-Here, from the use of the `:` in the pattern, LiquidHaskell can determine
-that `(len zs) = 1 + (len t)`; by combining this fact with the nugget
-that `(len zs) = 3` LiquidHaskell concludes that `t`, and hence, `zs'`
-contains two elements.
-
-Reasoning about Lengths
------------------------
-
-Let's flex our new vocabulary by uttering types that describe the
-behavior of the usual list functions. 
-
-First up: a version of the [standard][ghclist] 
-`length` function, slightly simplified for exposition.
-
-\begin{code}
-{-@ length :: xs:[a] -> {v: Int | v = (len xs)} @-}
-length :: [a] -> Int
-length []     = 0
-length (x:xs) = 1 + length xs
-\end{code}
-
-**Note:** Recall that `measure` values don't actually exist at run-time.
-However, functions like `length` are useful in that they allow us to
-effectively *pull* or *materialize* the ghost values from the refinement
-world into the actual code world (since the value returned by `length` is
-logically equal to the `len` of the input list.)
-
-Similarly, we can speak and have confirmed, the types for the usual
-list-manipulators like
-
-\begin{code}
-{-@ map      :: (a -> b) -> xs:[a] -> {v:[b] | (len v) = (len xs)} @-}
-map _ []     = [] 
-map f (x:xs) = (f x) : (map f xs)
-\end{code}
-
-and
-
-\begin{code}
-{-@ filter :: (a -> Bool) -> xs:[a] -> {v:[a] | (len v) <= (len xs)} @-}
-filter _ []     = []
-filter f (x:xs) 
-  | f x         = x : filter f xs
-  | otherwise   = filter f xs
-\end{code}
-
-and, since doubtless you are wondering,
-
-\begin{code}
-{-@ append :: xs:[a] -> ys:[a] -> {v:[a] | (len v) = (len xs) + (len ys)} @-}
-append [] ys     = ys 
-append (x:xs) ys = x : append xs ys
-\end{code}
-
-We will return to the above at some later date. Right now, let's look at
-some interesting programs that LiquidHaskell can prove safe, by reasoning
-about the size of various lists.
-
-
-
-Example 1: Safely Catching A List by Its Tail (or Head) 
--------------------------------------------------------
-
-Now, let's see how we can use these new incantations to banish, forever,
-certain irritating kinds of errors. 
-\begin{code}Recall how we always summon functions like `head` and `tail` with a degree of trepidation, unsure whether the arguments are empty, which will awaken certain beasts
-Prelude> head []
-*** Exception: Prelude.head: empty list
-\end{code}
-
-LiquidHaskell allows us to use these functions with 
-confidence and surety! First off, let's define a predicate
-alias that describes non-empty lists:
-
-\begin{code}
-{-@ predicate NonNull X = ((len X) > 0) @-}
-\end{code}
-
-Now, we can type the potentially dangerous `head` as:
-
-\begin{code}
-{-@ head   :: {v:[a] | (NonNull v)} -> a @-}
-head (x:_) = x
-head []    = liquidError "Fear not! 'twill ne'er come to pass"
-\end{code}
-
-As with the case of [divide-by-zero][ref101], LiquidHaskell deduces that
-the second equation is *dead code* since the precondition (input) type
-states that the length of the input is strictly positive, which *precludes*
-the case where the parameter is `[]`.
-
-Similarly, we can write
-
-\begin{code}
-{-@ tail :: {v:[a] | (NonNull v)} -> [a] @-}
-tail (_:xs) = xs
-tail []     = liquidError "Relaxeth! this too shall ne'er be"
-\end{code}
-
-Once again, LiquidHaskell will use the precondition to verify that the 
-`liquidError` is never invoked. 
-
-Let's use the above to write a function that eliminates stuttering, that
-is which converts `"ssstringssss liiiiiike thisss"` to `"strings like this"`.
-
-\begin{code}
-{-@ eliminateStutter :: (Eq a) => [a] -> [a] @-}
-eliminateStutter xs = map head $ groupEq xs 
-\end{code}
-
-The heavy lifting is done by `groupEq`
-
-\begin{code}
-groupEq []     = []
-groupEq (x:xs) = (x:ys) : groupEq zs
-                 where (ys,zs) = span (x ==) xs
-\end{code}
-
-which gathers consecutive equal elements in the list into a single list.
-By using the fact that *each element* in the output returned by 
-`groupEq` is in fact of the form `x:ys`, LiquidHaskell infers that
-`groupEq` returns a *list of non-empty lists*. 
-(Hover over the `groupEq` identifier in the code above to see this.)
-Next, by automatically instantiating the type parameter for the `map` 
-in `eliminateStutter` to `(len v) > 0` LiquidHaskell deduces `head` 
-is only called on non-empty lists, thereby verifying the safety of 
-`eliminateStutter`. (Hover your mouse over `map` above to see the
-instantiated type for it!)
-
-Example 2: Risers 
------------------
-
-The above examples of `head` and `tail` are simple, but non-empty lists pop
-up in many places, and it is rather convenient to have the type system
-track non-emptiness without having to make up special types. Let's look at a
-more interesting example, popularized by [Neil Mitchell][risersMitchell]
-which is a key step in an efficient sorting procedure, which we may return
-to in the future when we discuss sorting algorithms.
-
-\begin{code}
-risers           :: (Ord a) => [a] -> [[a]]
-risers []        = []
-risers [x]       = [[x]]
-risers (x:y:etc) = if x <= y then (x:s):ss else [x]:(s:ss)
-    where 
-      (s, ss)    = safeSplit $ risers (y:etc)
-\end{code}
-
-The bit that should cause some worry is `safeSplit` which 
-simply returns the `head` and `tail` of its input, if they
-exist, and otherwise, crashes and burns
-
-\begin{code}
-safeSplit (x:xs)  = (x, xs)
-safeSplit _       = liquidError "don't worry, be happy"
-\end{code}
-
-How can we verify that `safeSplit` *will not crash* ?
-
-The matter is complicated by the fact that since `risers` 
-*does* sometimes return an empty list, we cannot blithely 
-specify that its output type has a `NonNull` refinement.
-
-Once again, logic rides to our rescue!
-
-The crucial property upon which the safety of `risers` rests
-is that when the input list is non-empty, the output list 
-returned by risers is *also* non-empty. It is quite easy to clue 
-LiquidHaskell in on this, namely through a type specification:
-
-\begin{code}
-{-@ risers :: (Ord a) 
-           => zs:[a] 
-           -> {v: [[a]] | ((NonNull zs) => (NonNull v)) } @-} 
-\end{code}
-
-Note how we relate the output's non-emptiness to the input's
-non-emptiness,through the (dependent) refinement type. With this 
-specification in place, LiquidHaskell is pleased to verify `risers` 
-(i.e. the call to `safeSplit`).
-
-Example 3: MapReduce 
---------------------
-
-Here's a longer example that illustrates this: a toy *map-reduce* implementation.
-
-First, let's write a function `keyMap` that expands a list of inputs into a 
-list of key-value pairs:
-
-\begin{code}
-keyMap :: (a -> [(k, v)]) -> [a] -> [(k, v)]
-keyMap f xs = concatMap f xs
-\end{code}
-
-Next, let's write a function `group` that gathers the key-value pairs into a
-`Map` from *keys* to the lists of values with that same key.
-
-\begin{code}
-group kvs = foldr (\(k, v) m -> inserts k v m) M.empty kvs 
-\end{code}
-
-The function `inserts` simply adds the new value `v` to the list of 
-previously known values `lookupDefault [] k m` for the key `k`.
-
-\begin{code}
-inserts k v m = M.insert k (v : vs) m 
-  where vs    = M.lookupDefault [] k m
-\end{code}
-
-Finally, a function that *reduces* the list of values for a given
-key in the table to a single value:
-
-\begin{code}
-reduce    :: (v -> v -> v) -> M.HashMap k [v] -> M.HashMap k v
-reduce op = M.map (foldl1 op)
-\end{code}
-
-where `foldl1` is a [left-fold over *non-empty* lists][foldl1]
-
-\begin{code}
-{-@ foldl1      :: (a -> a -> a) -> {v:[a] | (NonNull v)} -> a @-}
-foldl1 f (x:xs) =  foldl f x xs
-foldl1 _ []     =  liquidError "will. never. happen."
-\end{code}
-
-We can put the whole thing together to write a (*very*) simple *Map-Reduce* library
-
-\begin{code}
-mapReduce   :: (Eq k, Hashable k) 
-            => (a -> [(k, v)])    -- ^ key-mapper
-            -> (v -> v -> v)      -- ^ reduction operator
-            -> [a]                -- ^ inputs
-            -> [(k, v)]           -- ^ output key-values
-
-mapReduce f op  = M.toList 
-                . reduce op 
-                . group 
-                . keyMap f
-\end{code}
-
-Now, if we want to compute the frequency of `Char` in a given list of words, we can write:
-
-\begin{code}
-{-@ charFrequency :: [String] -> [(Char, Int)] @-}
-charFrequency     :: [String] -> [(Char, Int)]
-charFrequency     = mapReduce wordChars (+)
-  where wordChars = map (\c -> (c, 1)) 
-\end{code}
-
-You can take it out for a spin like so:
-
-\begin{code}
-f0 = charFrequency [ "the", "quick" , "brown"
-                   , "fox", "jumped", "over"
-                   , "the", "lazy"  , "cow"   ]
-\end{code}
-
-**Look Ma! No Types:** LiquidHaskell will gobble the whole thing up, and
-verify that none of the undesirable `liquidError` calls are triggered. By
-the way, notice that we didn't write down any types for `mapReduce` and
-friends.  The main invariant, from which safety follows is that the `Map`
-returned by the `group` function binds each key to a *non-empty* list of
-values.  LiquidHaskell deduces this invariant by inferring suitable types
-for `group`, `inserts`, `foldl1` and `reduce`, thereby relieving us of that
-tedium. In short, by riding on the broad and high shoulders of SMT and
-abstract interpretation, LiquidHaskell makes a little typing go a long way. 
-
-
-Conclusions
------------
-
-Well folks, thats all for now. I trust this article gave you a sense of
-
-1. How we can describe certain *structural properties* of data types, 
-   such as the length of a list, 
-
-2. How we might use refinements over these properties to describe key
-   invariants and establish, at compile-time, the safety of operations that
-   might blow up on unexpected values at run-time, and perhaps, most
-   importantly,
-
-3. How we can achieve the above, whilst just working with good old lists, 
-   without having to [make up new types][risersApple] (which have the 
-   unfortunate effect of cluttering programs with their attendant new 
-   functions) in order to enforce special invariants.
-
-
-[vecbounds]:  /blog/2013/01/05/bounding-vectors.lhs/ 
-[ghclist]:    https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/GHC/List.lhs#L125
-[foldl1]:     http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Data-List.html#foldl1
-[risersMitchell]: http://neilmitchell.blogspot.com/2008/03/sorting-at-speed.html
-[risersApple]: http://blog.jbapple.com/2008/01/extra-type-safety-using-polymorphic.html
-[ref101]:  /blog/2013/01/01/refinement-types-101.lhs/ 
-[ref102]:  /blog/2013/01/27/refinements101-reax.lhs/ 
-
diff --git a/docs/blog/2013-02-16-kmeans-clustering-I.lhs b/docs/blog/2013-02-16-kmeans-clustering-I.lhs
deleted file mode 100644
--- a/docs/blog/2013-02-16-kmeans-clustering-I.lhs
+++ /dev/null
@@ -1,335 +0,0 @@
----
-layout: post
-title: "KMeans Clustering I"
-date: 2013-02-16 16:12
-author: Ranjit Jhala
-published: true
-comments: true
-external-url:
-categories: basic measures
-demo: KMeansHelper.hs
----
-
-[Last time][safeList] we introduced a new specification mechanism called a
-*measure* and demonstrated how to use it to encode the *length* of a list.
-We saw how measures could be used to verify that functions like `head` and
-`tail` were only called with non-empty lists (whose length was strictly
-positive). As several folks pointed out, once LiquidHaskell can reason about
-lengths, it can do a lot more than just analyze non-emptiness.
-
-Indeed!
-
-Over the next *two* posts, lets see how one might implement a Kmeans
-algorithm that clusters `n`-dimensional points groups, and how LiquidHaskell
-can help us write and enforce various dimensionality invariants along the way.
-
-<!-- more -->
-
-<!-- For example, XXX pointed out that we can use the type system to give an *upper* bound on the size of a list, e.g. using lists
-     upper bounded by a gigantic `MAX_INT` value as a proxy for finite lists. -->
-
-
-\begin{code}
-module KMeansHelper where
-
-import Prelude                          hiding  (zipWith)
-import Data.List                                (span)
-import Language.Haskell.Liquid.Prelude          (liquidError)
-\end{code}
-
-Rather than reinvent the wheel, we will modify an existing implementation
-of K-Means, [available on hackage][URL-kmeans]. This may not be the
-most efficient implementation, but its a nice introduction to the algorithm,
-and the general invariants will hold for more sophisticated implementations.
-
-We have broken this entry into two convenient, bite-sized chunks:
-
-+ **Part I**  Introduces the basic types and list operations needed by KMeans,
-
-+ **Part II** Describes how the operations are used in the KMeans implementation.
-
-The Game: Clustering Points
----------------------------
-
-The goal of [K-Means clustering](http://en.wikipedia.org/wiki/K-means_clustering)
-is the following. Given
-
-- **Input** : A set of *points* represented by *n-dimensional points*
-  in *Euclidian* space, return
-
-- **Output** : A partitioning of the points, into K clusters, in a manner that
-  minimizes sum of distances between each point and its cluster center.
-
-
-The Players: Types
-------------------
-
-Lets make matters concrete by creating types for the different elements of the algorithm.
-
-**1. Fixed-Length Lists**  We will represent n-dimensional points using
-good old Haskell lists, refined with a predicate that describes the
-dimensionality (i.e. length.) To simplify matters, lets package this
-into a *type alias* that denotes lists of a given length `N`.
-
-\begin{code}
-{-@ type List a N = {v : [a] | (len v) = N} @-}
-\end{code}
-
-**2. Points** Next, we can represent an `N`-dimensional point as list of `Double` of length `N`,
-
-\begin{code}
-{-@ type Point N = List Double N @-}
-\end{code}
-
-**3. Clusters** A cluster is a **non-empty** list of points,
-
-\begin{code}
-{-@ type NonEmptyList a = {v : [a] | (len v) > 0} @-}
-\end{code}
-
-**4. Clustering** And finally, a clustering is a list of (non-empty) clusters.
-
-\begin{code}
-{-@ type Clustering a  = [(NonEmptyList a)] @-}
-\end{code}
-
-**Notation:** When defining refinement type aliases, we use uppercase variables like `N`
-to distinguish value- parameters from the lowercase type parameters like `a`.
-
-
-**Aside:** By the way, if you are familiar with the *index-style* length
-encoding e.g. as found in [DML][dml] or [Agda][agdavec], then its worth
-noting that despite appearances, our `List` and `Point` definitions are
-*not* indexed. We're just using the indices to define abbreviations for the
-refinement predicates, and we have deliberately chosen the predicates to
-facilitate SMT based checking and inference.
-
-Basic Operations on Points and Clusters
-=======================================
-
-Ok, with the types firmly in hand, let us go forth and develop the KMeans
-clustering implementation. We will use a variety of small helper functions
-(of the kind found in `Data.List`.) Lets get started by looking at them
-through our newly *refined* eyes.
-
-Grouping
---------
-
-The first such function is [groupBy][URL-groupBy]. We can
-refine its type so that instead of just producing a `[[a]]`
-we know that it produces a `Clustering a` which is a list
-of *non-empty* lists.
-
-\begin{code}
-{-@ groupBy       ::(a -> a -> Bool) -> [a] -> (Clustering a) @-}
-groupBy _  []     = []
-groupBy eq (x:xs) = (x:ys) : groupBy eq zs
-  where (ys,zs)   = span (eq x) xs
-\end{code}
-
-Intuitively, its pretty easy to see how LiquidHaskell verifies the refined
-specification:
-
-- Each element of the output list is of the form `x:ys`
-- For any list `ys` the length is non-negative, i.e. `(len ys) >= 0`
-- The `len` of `x:ys` is `1 + (len ys)`, that is, strictly positive.
-
-Partitioning
-------------
-
-Next, lets look the function
-
-\begin{code}
-{-@ partition :: size:PosInt -> [a] -> (Clustering a) @-}
-{-@ type PosInt = {v: Int | v > 0 } @-}
-\end{code}
-
-which is given a *strictly positive* integer argument,
-a list of `a` values, and returns a `Clustering a`,
-that is, a list of non-empty lists. (Each inner list has a length
-that is less than `size`, but we shall elide this for simplicity.)
-
-The function is implemented in a straightforward manner, using the
-library functions `take` and `drop`
-
-\begin{code}
-partition size []       = []
-partition size ys@(_:_) = zs : partition size zs'
-  where
-    zs                  = take size ys
-    zs'                 = drop size ys
-\end{code}
-
-To verify that a valid `Clustering` is produced, LiquidHaskell needs only
-verify that the list `zs` above is non-empty, by suitably connecting the
-properties of the inputs `size` and `ys` with the output.
-
-\begin{code} We have [verified elsewhere][URL-take] that
-take :: n:{v: Int | v >= 0 }
-     -> xs:[a]
-     -> {v:[a] | (len v) = (if ((len xs) < n) then (len xs) else n) }
-\end{code}
-
-In other words, the output list's length is the *smaller of* the input
-list's length and `n`.  Thus, since both `size` and the `(len ys)` are
-greater than `1`, LiquidHaskell deduces that the list returned by `take
-size ys` has a length greater than `1`, i.e., is non-empty.
-
-Zipping
--------
-
-To compute the *Euclidean distance* between two points, we will use
-the `zipWith` function. We must make sure that it is invoked on points
-with the same number of dimensions, so we write
-
-\begin{code}
-{-@ zipWith :: (a -> b -> c)
-            -> xs:[a] -> (List b (len xs)) -> (List c (len xs)) @-}
-zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
-zipWith _ [] []         = []
-\end{code}
-
-The type stipulates that the second input list and the output have
-the same length as the first input. Furthermore, it rules out the
-case where one list is empty and the other is not, as in that case
-the former's length is zero while the latter's is not.
-
-Transposing
------------
-
-The last basic operation that we will require is a means to
-*transpose* a `Matrix`, which itself is just a list of lists:
-
-\begin{code}
-{-@ type Matrix a Rows Cols = (List (List a Cols) Rows) @-}
-\end{code}
-
-The `transpose` operation flips the rows and columns. I confess that I
-can never really understand matrices without concrete examples,
-and even then, barely.
-
-\begin{code} So, lets say we have a *matrix*
-m1  :: Matrix Int 4 2
-m1  =  [ [1, 2]
-       , [3, 4]
-       , [5, 6]
-       , [7, 8] ]
-\end{code}
-
-\begin{code} then the matrix `m2 = transpose 2 3 m1` should be
-m2 :: Matrix Int 2 4
-m2  =  [ [1, 3, 5, 7]
-       , [2, 4, 6, 8] ]
-\end{code}
-
-We will use a `Matrix a m n` to represent a *single cluster* of `m` points
-each of which has `n` dimensions. We will transpose the matrix to make it
-easy to *sum* and *average* the points along *each* dimension, in order to
-compute the *center* of the cluster.
-
-As you can work out from the above, the code for `transpose` is quite
-straightforward: each *output row* is simply the list of `head`s of
-the *input rows*:
-
-\begin{code}
-transpose       :: Int -> Int -> [[a]] -> [[a]]
-
-transpose 0 _ _ = []
-
-transpose c r ((col00 : col01s) : row1s)
-  = row0' : row1s'
-    where
-      row0'  = col00  : [ col0  | (col0 : _)  <- row1s ]
-      rest   = col01s : [ col1s | (_ : col1s) <- row1s ]
-      row1s' = transpose (c-1) r rest
-\end{code}
-
-LiquidHaskell verifies that
-
-\begin{code}
-{-@ transpose :: c:Int -> r:PosInt -> Matrix a r c -> Matrix a c r @-}
-\end{code}
-
-Try to work it out for yourself on pencil and paper.
-
-If you like you can get a hint by seeing how LiquidHaskell figures it out.
-Lets work *backwards*.
-
-\begin{code} LiquidHaskell verifies the output type by inferring that
-row0'        :: (List a r)
-row1s'       :: List (List a r) (c - 1) -- i.e. Matrix a (c - 1) r
-\end{code}
-
-\begin{code} and so, by simply using the *measure-refined* type for `:`
-(:)          :: x:a -> xs:[a] -> { v : [a] | (len v) = 1 + (len xs) }
-\end{code}
-
-\begin{code} LiquidHaskell deduces that
-row0 : rows' :: List (List a r) c
-\end{code}
-
-\begin{code} That is,
-row0 : rows' :: Matrix a c r
-\end{code}
-
-Excellent! Now, lets work backwards. How does it infer the types of `row0'` and `row1s'`?
-
-The first case is easy: `row0'` is just the list of *heads* of each row, hence a `List a r`.
-
-\begin{code} Now, lets look at `row1s'`. Notice that `row1s` is the matrix of all *except* the first row of the input Matrix, and so
-row1s        :: Matrix a (r-1) c
-\end{code}
-
-\begin{code} and so, as
-col01s       :: List a (c-1)
-col1s        :: List a (c-1)
-\end{code}
-
-\begin{code} LiquidHaskell deduces that since `rest` is the concatenation of `r-1` tails from `row1s`
-rest         = col01s : [ col1s | (_ : col1s) <- row1s ]
-\end{code}
-
-\begin{code} the type of `rest` is
-rest         :: List (List a (c - 1)) r
-\end{code}
-
-\begin{code} which is just
-rest         :: Matrix a r (c-1)
-\end{code}
-
-Now, LiquidHaskell deduces `row1s' :: Matrix a (c-1) r` by inductively
-plugging in the output type of the recursive call, thereby checking the
-function's signature.
-
-
-*Whew!* That was a fair bit of work, wasn't it!
-
-Happily, we didn't have to do *any* of it. Instead, using the SMT solver,
-LiquidHaskell ploughs through calculations like that and guarantees to us
-that `transpose` indeed flips the dimensions of the inner and outer lists.
-
-**Aside: Comprehensions vs. Map** Incidentally, the code above is essentially
-that of `transpose` [from the Prelude][URL-transpose] with some extra
-local variables for exposition. You could instead use a `map head` and `map tail`
-and I encourage you to go ahead and [see for yourself.][demo]
-
-Intermission
-------------
-
-Time for a break -- [go see a cat video!][maru] -- or skip it, stretch your
-legs, and return post-haste for the [next installment][kmeansII], in which
-we will use the types and functions described above, to develop the clustering
-algorithm.
-
-[safeList]:      /blog/2013/01/31/safely-catching-a-list-by-its-tail.lhs/
-[kmeansI]:       /blog/2013/02/16/kmeans-clustering-I.lhs/
-[kmeansII]:      /blog/2013/02/17/kmeans-clustering-II.lhs/
-[URL-take]:      https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/GHC/List.lhs#L334
-[URL-groupBy]:   http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-List.html#v:groupBy
-[URL-transpose]: http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Data-List.html#transpose
-[maru]:          http://www.youtube.com/watch?v=8uDuls5TyNE
-[demo]:          http://goto.ucsd.edu/~rjhala/liquid/haskell/demo/#?demo=KMeansHelper.hs
-[URL-kmeans]:    http://hackage.haskell.org/package/kmeans
-[dml]:           http://www.cs.bu.edu/~hwxi/DML/DML.html
-[agdavec]:       http://code.haskell.org/Agda/examples/Vec.agda
-
diff --git a/docs/blog/2013-02-17-kmeans-clustering-II.lhs b/docs/blog/2013-02-17-kmeans-clustering-II.lhs
deleted file mode 100644
--- a/docs/blog/2013-02-17-kmeans-clustering-II.lhs
+++ /dev/null
@@ -1,436 +0,0 @@
----
-layout: post
-title: "KMeans Clustering II"
-date: 2013-02-17 16:12
-author: Ranjit Jhala
-published: true
-comments: true
-external-url:
-categories: basic measures
-demo: KMeans.hs
----
-
-**The story so far:** [Previously][kmeansI] we saw
-
-- how to encode `n`-dimensional points using plain old Haskell lists,
-- how to encode a matrix with `r` rows and `c` columns as a list of lists,
-- some basic operations on points and matrices via list-manipulating functions
-
-More importantly, we saw how easy it was to encode dimensionality with refinements over
-the `len` measure, thereby allowing LiquidHaskell to precisely track the dimensions across
-the various operations.
-
-Next, lets use the basic types and operations to develop the actual *KMeans clustering*
-algorithm, and, along the way, see how LiquidHaskell lets us write precise module
-contracts which will ward against various unpleasant *lumpenexceptions*.
-
-<!-- more -->
-
-\begin{code}
-{-# LANGUAGE ScopedTypeVariables, TypeSynonymInstances, FlexibleInstances #-}
-
-module KMeans (kmeans, kmeansGen) where
-
-import KMeansHelper
-import Prelude              hiding      (zipWith)
-import Data.List                        (sort, span, minimumBy)
-import Data.Function                    (on)
-import Data.Ord                         (comparing)
-import Language.Haskell.Liquid.Prelude  (liquidAssert, liquidError)
-
-instance Eq (WrapType [Double] a) where
-   (==) = (==) `on` getVect
-
-instance Ord (WrapType [Double] a) where
-    compare = comparing getVect
-\end{code}
-
-Recall that we are using a modified version of an [existing KMeans implementation][URL-kmeans].
-While not the swiftest implementation, it serves as a nice introduction to the algorithm,
-and the general invariants carry over to more sophisticated implementations.
-
-A Quick Recap
--------------
-
-Before embarking on the journey, lets remind ourselves of our destination:
-the goal of [K-Means clustering](http://en.wikipedia.org/wiki/K-means_clustering) is
-
-- **Take as Input** : A set of *points* represented by *n-dimensional points* in *Euclidian* space
-
-- **Return as Ouptut** : A partitioning of the points, into upto K clusters, in a manner that
-  minimizes the sum of distances between each point and its cluster center.
-
-Last time, we introduced a variety of refinement type aliases for Haskell lists
-
-\begin{code} **Fixed Length Lists**
-type List a N = {v : [a] | (len v) = N}
-\end{code}
-
-\begin{code} **Non-empty Lists**
-type NonEmptyList a = {v : [a] | (len v) > 0}
-\end{code}
-
-\begin{code} **N-Dimensional Points**
-type Point N = List Double N
-\end{code}
-
-\begin{code} **Matrices**
-type Matrix a Rows Cols = List (List a Cols) Rows
-\end{code}
-
-\begin{code} We also saw several basic list operations
-groupBy   :: (a -> a -> Bool) -> [a] -> (Clustering a)
-partition :: PosInt -> [a] -> (Clustering a)
-zipWith   :: (a -> b -> c) -> xs:[a] -> (List b (len xs)) -> (List c (len xs))
-transpose :: c:Int -> r:PosInt -> Matrix a r c -> Matrix a c r
-\end{code}
-
-whose types will prove essential in order to verify the invariants of the
-clustering algorithm. You might open the [previous episode][kmeansI] in a
-separate tab to keep those functions handy, but fear not, we will refresh
-our memory about them when we get around to using them below.
-
-Generalized Points
-------------------
-
-To be more flexible, we will support *arbitrary* points as long as they can
-be **projected** to Euclidian space. In addition to supporting, say, an
-image or a [cat video][maru] as a point, this will allow us to *weight*
-different dimensions to different degrees.
-
-We represent generalized points with a record
-
-\begin{code}
-data WrapType b a = WrapType {getVect :: b, getVal :: a}
-\end{code}
-
-and we can define an alias that captures the dimensionality of the point
-
-\begin{code}
-{-@ type GenPoint a N  = WrapType (Point N) a @-}
-\end{code}
-
-That is, `GenPoint a N` denotes a general `a` value that has an
-`N`-dimensional projection into Euclidean space.
-
-Algorithm: Iterative Clustering
--------------------------------
-
-Terrific, now that all the pieces are in place lets look at the KMeans
-algorithm. We have implemented a function `kmeans'`, which takes as input a
-dimension `n`, the maximum number of clusters `k` (which must be positive),
-a list of *generalized points* of dimension `n`, and returns a `Clustering`
-(i.e. a list of *non-empty lists*) of the generalized points.
-
-So much verbiage -- a type is worth a thousand comments!
-
-\begin{code}
-{-@ kmeans' :: n:Int
-            -> k:PosInt
-            -> points:[(GenPoint a n)]
-            -> (Clustering (GenPoint a n)) @-}
-\end{code}
-
-There! Crisp and to the point. Sorry. Anyhoo, the function implements the
-above type.
-
-\begin{code}
-kmeans' n k points    = fixpoint (refineCluster n) initialClustering
-  where
-    initialClustering = partition clusterSize points
-    clusterSize       = max 1 ((length points + k - 1) `div` k)
-
-    fixpoint          :: (Eq a) => (a -> a) -> a -> a
-    fixpoint f x      = if (f x) == x then x else fixpoint f (f x)
-\end{code}
-
-That is, `kmeans'` creates an `initialClustering` by
-`partition`-ing the `points` into chunks with `clusterSize` elements.
-Then, it invokes `fixpoint` to *iteratively refine* the initial
-clustering  with `refineCluster` until it converges to a stable
-clustering that cannot be improved upon. This stable clustering
-is returned as the output.
-
-LiquidHaskell verifies that `kmeans'` adheres to the given signature in two steps.
-
-**1. Initial Clustering**
-
-\begin{code} First, LiquidHaskell determines from
-max       :: (Ord a) => x:a -> y:a -> {v: a | (v >= x) && ( v >= y) }
-\end{code}
-
-\begin{code} that `clusterSize` is strictly positive, and hence, from
-partition :: size:PosInt -> [a] -> (Clustering a)
-\end{code}
-
-which we saw [last time][kmeansI], that `initialClustering` is indeed
-a valid `Clustering` of `(GenPoint a n)`.
-
-**2. Fixpoint**
-
-Next, LiquidHaskell infers that at the call `fixpoint (refineCluster n)
-...`, that the type parameter `a` of `fixpoint` can be *instantiated* with
-`Clustering (GenPoint a n)`.  This is because `initialClustering` is a
-valid clustering, as we saw above, and because `refineCluster` takes -- and
-returns -- valid `n`-dimensional clusterings, as we shall see below.
-Consequently, the value returned by `kmeans'` is also `Clustering` of
-`GenPoint a n` as required.
-
-Refining A Clustering
----------------------
-
-Thus, the real work in KMeans happens inside `refineCluster`, which takes a
-clustering and improves it, like so:
-
-\begin{code}
-refineCluster n clusters = clusters'
-  where
-    -- 1. Compute cluster centers
-    centers        = map (clusterCenter n) clusters
-
-    -- 2. Map points to their nearest center
-    points         = concat clusters
-    centeredPoints = sort [(nearestCenter n p centers, p) | p <- points]
-
-    -- 3. Group points by nearest center to get new clusters
-    centeredGroups = groupBy ((==) `on` fst) centeredPoints
-    clusters'      = map (map snd) centeredGroups
-\end{code}
-
-The behavior of `refineCluster` is pithily captured by its type
-
-\begin{code}
-{-@ refineCluster :: n:Int
-                  -> Clustering (GenPoint a n)
-                  -> Clustering (GenPoint a n) @-}
-\end{code}
-
-The refined clustering is computed in three steps.
-
-1. First, we compute the `centers :: [(Point n)]` of the current `clusters`.
-   This is achieved by using `clusterCenter`, which maps a list of generalized
-   `n`-dimensional points to a *single* `n` dimensional point (i.e. `Point n`).
-
-2. Next, we pair each point `p` in the list of all `points` with its `nearestCenter`.
-
-3. Finally, the pairs in the list of `centeredPoints` are grouped by the
-   center, i.e. the first element of the tuple. The resulting groups are
-   projected back to the original generalized points yielding the new
-   clustering.
-
-\begin{code} The type of the output follows directly from
-groupBy :: (a -> a -> Bool) -> [a] -> (Clustering a)
-\end{code}
-
-from [last time][kmeansI]. At the call site above, LiquidHaskell infers that
-`a` can be instantiated with `((Point n), (GenPoint a n))` thereby establishing
-that, after *projecting away* the first element, the output is a list of
-non-empty lists of generalized `n`-dimensional points.
-
-That leaves us with the two crucial bits of the algorithm: `clusterCenter`
-and `nearestCenter`.
-
-Computing the Center of a Cluster
----------------------------------
-
-The center of an `n`-dimensional cluster is simply an `n`-dimensional point
-whose value in each dimension is equal to the *average* value of that
-dimension across all the points in the cluster.
-
-\begin{code} For example, consider a cluster of 2-dimensional points,
-exampleCluster = [ [0,  0]
-                 , [1, 10]
-                 , [2, 20]
-                 , [4, 40]
-                 , [5, 50] ]
-\end{code}
-
-\begin{code} The center of the cluster is
-exampleCenter = [ (0 + 1  + 2  + 4  + 5 ) / 5
-                , (0 + 10 + 20 + 40 + 50) / 5 ]
-\end{code}
-
-\begin{code} which is just
-exampleCenter = [ 3, 30 ]
-\end{code}
-
-Thus, we can compute a `clusterCenter` via the following procedure
-
-\begin{code}
-clusterCenter n xs = map average xs'
-  where
-    numPoints      = length xs
-    xs'            = transpose n numPoints (map getVect xs)
-
-    average        :: [Double] -> Double
-    average        = (`safeDiv` numPoints) . sum
-\end{code}
-
-First, we `transpose` the matrix of points in the cluster.
-Suppose that `xs` is the `exampleCluster` from above
-(and so `n` is `2` and `numPoints` is `5`.)
-
-\begin{code} In this scenario, `xs'` is
-xs' = [ [0,  1,  2,  4,  5]
-      , [0, 10, 20, 40, 50] ]
-\end{code}
-
-and so `map average xs'` evaluates to `exampleCenter` from above.
-
-We have ensured that the division in the average does not lead to
-any nasty surprises via a *safe division* function whose precondition
-checks that the denominator is non-zero, [as illustrated here][ref101].
-
-\begin{code}
-{- safeDiv   :: (Fractional a) => a -> {v:Int | v != 0} -> a -}
-safeDiv     :: (Fractional a) => a -> Int -> a
-safeDiv n 0 = liquidError "divide by zero"
-safeDiv n d = n / (fromIntegral d)
-\end{code}
-
-LiquidHaskell verifies that the divide-by-zero never occurs, and furthermore,
-that `clusterCenter` indeed computes an `n`-dimensional center by inferring that
-
-\begin{code}
-{-@ clusterCenter :: n:Int -> NonEmptyList (GenPoint a n) -> Point n @-}
-\end{code}
-
-LiquidHaskell deduces that the *input* list of points `xs` is non-empty
-from the fact that `clusterCenter` is only invoked on the elements of a
-`Clustering` which comprise only non-empty lists. Since `xs` is non-empty,
-i.e. `(len xs) > 0`, LiquidHaskell infers that `numPoints` is positive
-(hover over `length` to understand why), and hence, LiquidHaskell is
-satisfied that the call to `safeDiv` will always proceed without any
-incident.
-
-\begin{code} To establish the *output* type `Point n` LiquidHaskell leans on the fact that
-transpose :: n:Int -> m:PosInt -> Matrix a m n -> Matrix a n m
-\end{code}
-
-to deduce that `xs'` is of type `Matrix Double n numPoints`, that is to
-say, a list of length `n` containing lists of length `numPoints`. Since
-`map` preserves the length, the value `map average xs'` is also a list
-of length `n`, i.e. `Point n`.
-
-
-Finding the Nearest Center
---------------------------
-
-The last piece of the puzzle is `nearestCenter` which maps each
-(generalized) point to the center that it is nearest. The code is
-pretty self-explanatory:
-
-\begin{code}
-nearestCenter     :: Int -> WrapType [Double] a -> [[Double]] -> [Double]
-nearestCenter n x = minKey . map (\c -> (c, distance c (getVect x)))
-\end{code}
-
-We `map` the centers to a tuple of center `c` and the `distance` between
-`x` and `c`, and then we select the tuple with the smallest distance
-
-\begin{code}
-minKey  :: (Ord v) => [(k, v)] -> k
-minKey  = fst . minimumBy (\x y -> compare (snd x) (snd y))
-\end{code}
-
-The interesting bit is that the `distance` function uses `zipWith` to
-ensure that the dimensionality of the center and the point match up.
-
-\begin{code}
-distance     :: [Double] -> [Double] -> Double
-distance a b = sqrt . sum $ zipWith (\v1 v2 -> (v1 - v2) ^ 2) a b
-\end{code}
-
-LiquidHaskell verifies `distance` by inferring that
-
-\begin{code}
-{-@ nearestCenter :: n:Int -> (GenPoint a n) -> [(Point n)] -> (Point n) @-}
-\end{code}
-
-First, LiquidHaskell deduces that each center in `cs` is indeed `n`-dimensional, which
-follows from the output type of `clusterCenter`. Since `x` is a `(GenPoint a n)`
-LiquidHaskell infers that both `c` and `getVect x` are of an equal length `n`.
-
-\begin{code} Consequently, the call to
-zipWith :: (a -> b -> c) -> xs:[a] -> (List b (len xs)) -> (List c (len xs))
-\end{code}
-
-[discussed last time][kmeansI] is determined to be safe.
-
-Finally, the value returned is just one of the input centers and so is a `(Point n)`.
-
-
-Putting It All Together: Top-Level API
---------------------------------------
-
-We can bundle the algorithm into two top-level API functions.
-
-First, a version that clusters *generalized* points. In this case, we
-require a function that can `project` an `a` value to an `n`-dimensional
-point. This function just wraps each `a`, clusters via `kmeans'` and then
-unwraps the points.
-
-\begin{code}
-{-@ kmeansGen :: n:Int
-              -> (a -> (Point n))
-              -> k:PosInt
-              -> xs:[a]
-              -> (Clustering a)
-  @-}
-
-kmeansGen n project k = map (map getVal)
-                      . kmeans' n k
-                      . map (\x -> WrapType (project x) x)
-\end{code}
-
-Second, a specialized version that operates directly on `n`-dimensional
-points. The specialized version just calls the general version with a
-trivial `id` projection.
-
-\begin{code}
-{-@ kmeans :: n:Int
-           -> k:PosInt
-           -> points:[(Point n)]
-           -> (Clustering (Point n))
-  @-}
-
-kmeans n   = kmeansGen n id
-\end{code}
-
-Conclusions
------------
-
-I hope that over the last two posts you have gotten a sense of
-
-1. What KMeans clustering is all about,
-
-2. How measures and refinements can be used to describe the behavior
-   of common list operations like `map`, `transpose`, `groupBy`, `zipWith`, and so on,
-
-3. How LiquidHaskell's automated inference makes it easy to write and
-   verify invariants of non-trivial programs.
-
-The sharp reader will have noticed that the one *major*, non syntactic, change to the
-[original code][URL-kmeans] is the addition of the dimension parameter `n` throughout
-the code. This is critically required so that we can specify the relevant
-invariants (which are in terms of `n`.) The value is actually a ghost, and
-never ever used. Fortunately, Haskell's laziness means that we don't have
-to worry about it (or other ghost variables) imposing any run-time overhead
-at all.
-
-**Exercise:** Incidentally, if you have followed thus far I would
-encourage you to ponder about how you might modify the types (and
-implementation) to verify that KMeans indeed produces at most `k` clusters...
-
-[ref101]:        /blog/2013/01/01/refinement-types-101.lhs/
-[safeList]:      /blog/2013/01/31/safely-catching-a-list-by-its-tail.lhs/
-[kmeansI]:       /blog/2013/02/16/kmeans-clustering-I.lhs/
-[kmeansII]:      /blog/2013/02/17/kmeans-clustering-II.lhs/
-[URL-take]:      https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/GHC/List.lhs#L334
-[URL-groupBy]:   http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-List.html#v:groupBy
-[URL-transpose]: http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Data-List.html#transpose
-[maru]:          http://www.youtube.com/watch?v=8uDuls5TyNE
-[demo]:          http://goto.ucsd.edu/~rjhala/liquid/haskell/demo/#?demo=KMeansHelper.hs
-[URL-kmeans]:    http://hackage.haskell.org/package/kmeans
-
-
diff --git a/docs/blog/2013-03-04-bounding-vectors.lhs b/docs/blog/2013-03-04-bounding-vectors.lhs
deleted file mode 100644
--- a/docs/blog/2013-03-04-bounding-vectors.lhs
+++ /dev/null
@@ -1,428 +0,0 @@
----
-layout: post
-title: "Bounding Vectors"
-date: 2013-03-04 16:12
-author: Ranjit Jhala
-published: true 
-comments: true
-external-url:
-categories: basic
-demo: vectorbounds.hs
----
-
-Today, lets look at a classic use-case for refinement types, namely, 
-the static verification of **vector access bounds**. Along the way, 
-we'll see some examples that illustrate how LiquidHaskell reasons 
-about *recursion*, *higher-order functions*, *data types*, and 
-*polymorphism*.
-
-<!-- more -->
-
-\begin{code}
-module VectorBounds (
-    safeLookup 
-  , unsafeLookup, unsafeLookup'
-  , absoluteSum, absoluteSum'
-  , dotProduct
-  , sparseProduct, sparseProduct'
-  ) where
-
-import Prelude      hiding (length)
-import Data.List    (foldl')
-import Data.Vector  hiding (foldl') 
-\end{code}
-
-Specifying Bounds for Vectors
------------------------------
-
-One [classical][dmlarray] use-case for refinement types is to verify
-the safety of accesses of arrays and vectors and such, by proving that
-the indices used in such accesses are *within* the vector bounds. 
-Lets see how to do this with LiquidHaskell by writing a few short
-functions that manipulate vectors, in particular, those from the 
-popular [vector][vec] library. 
-
-First things first. Lets **specify** bounds safety by *refining* 
-the types for the [key functions][vecspec] exported by the module 
-`Data.Vector`. 
-
-\begin{code}Specifications for `Data.Vector`
-module spec Data.Vector where
-
-import GHC.Base
-
-measure vlen  ::   (Vector a) -> Int 
-assume length :: x:(Vector a) -> {v:Int | v = (vlen x)}
-assume !      :: x:(Vector a) -> {v:Int | 0 <= v && v < (vlen x)} -> a 
-\end{code}
-
-In particular, we 
-
-- **define** a *property* called `vlen` which denotes the size of the vector,
-- **assume** that the `length` function *returns* an integer equal to the vector's size, and
-- **assume** that the lookup function `!` *requires* an index between `0` and the vector's size.
-
-There are several things worth paying close attention to in the above snippet.
-
-**Measures**
-
-[Recall][listtail] that measures define auxiliary (or so-called **ghost**)
-properties of data values that are useful for specification and verification, 
-but which *don't actually exist at run-time*. Thus, they will 
-*only appear in specifications*, i.e. inside type refinements, but *never* 
-inside code. Often we will use helper functions like `length` in this case, 
-which *pull* or *materialize* the ghost values from the refinement world 
-into the actual code world.
-
-**Assumes**
-
-We write `assume` because in this scenario we are not *verifying* the
-implementation of `Data.Vector`, we are simply *using* the properties of
-the library to verify client code.  If we wanted to verify the library
-itself, we would ascribe the above types to the relevant functions in the
-Haskell source for `Data.Vector`. 
-
-**Dependent Refinements**
-
-Notice that in the function type (e.g. for `length`) we have *named* the *input*
-parameter `x` so that we can refer to it in the *output* refinement. 
-
-\begin{code} In this case, the type 
-assume length   :: x:(Vector a) -> {v : Int | v = (vlen x)}
-\end{code}
-
-states that the `Int` output is exactly equal to the size of the input `Vector` named `x`.
-
-In other words, the output refinement **depends on** the input value, which
-crucially allows us to write properties that *relate* different program values.
-
-**Verifying a Simple Wrapper**
-
-Lets try write some simple functions to sanity check the above specifications. 
-First, consider an *unsafe* vector lookup function:
-
-\begin{code}
-unsafeLookup vec index = vec ! index
-\end{code}
-
-If we run this through LiquidHaskell, it will spit back a type error for
-the expression `x ! i` because (happily!) it cannot prove that `index` is
-between `0` and the `vlen vec`. Of course, we can specify the bounds 
-requirement in the input type
-
-\begin{code}
-{-@ unsafeLookup :: vec:Vector a 
-                 -> {v: Int | (0 <= v && v < (vlen vec))} 
-                 -> a 
-  @-}
-\end{code}
-
-then LiquidHaskell is happy to verify the lookup. Of course, now the burden
-of ensuring the index is valid is pushed to clients of `unsafeLookup`.
-
-Instead, we might write a *safe* lookup function that performs the *bounds check*
-before looking up the vector:
-
-\begin{code}
-{-@ safeLookup :: Vector a -> Int -> Maybe a @-}
-safeLookup x i 
-  | 0 <= i && i < length x = Just (x ! i)
-  | otherwise              = Nothing 
-\end{code}
-
-**Predicate Aliases**
-
-The type for `unsafeLookup` above is rather verbose as we have to spell out
-the upper and lower bounds and conjoin them. Just as we enjoy abstractions
-when programming, we will find it handy to have abstractions in the
-specification mechanism. To this end, LiquidHaskell supports 
-*predicate aliases*, which are best illustrated by example
-
-\begin{code}
-{-@ predicate Btwn Lo I Hi = (Lo <= I && I < Hi) @-}
-{-@ predicate InBounds I A = (Btwn 0 I (vlen A)) @-}
-\end{code}
-
-Now, we can simplify the type for the unsafe lookup function to
-
-\begin{code}
-{-@ unsafeLookup' :: x:Vector a -> {v:Int | (InBounds v x)} -> a @-}
-unsafeLookup' :: Vector a -> Int -> a
-unsafeLookup' x i = x ! i
-\end{code}
-
-
-Our First Recursive Function
-----------------------------
-
-OK, with the tedious preliminaries out of the way, lets write some code!
-
-To start: a vanilla recursive function that adds up the absolute values of
-the elements of an integer vector.
-
-\begin{code}
-absoluteSum       :: Vector Int -> Int 
-absoluteSum vec   = if 0 < n then go 0 0 else 0
-  where
-    go acc i 
-      | i /= n    = go (acc + abz (vec ! i)) (i + 1)
-      | otherwise = acc 
-    n             = length vec
-\end{code}
-
-where the function `abz` is the absolute value function from [before][ref101].
-
-\begin{code}
-abz n = if 0 <= n then n else (0 - n) 
-\end{code}
-
-Digression: Introducing Errors  
-------------------------------
-
-If you are following along in the demo page -- I heartily 
-recommend that you try the following modifications, 
-one at a time, and see what happens.
-
-**What happens if:** 
-
-1. You *remove* the check `0 < n` (see `absoluteSumNT` in the demo code)
-
-2. You *replace* the guard with `i <= n`
-
-In the *former* case, LiquidHaskell will *verify* safety, but
-in the *latter* case, it will grumble that your program is *unsafe*. 
-
-Do you understand why? 
-(Thanks to [smog_alado][smog_alado] for pointing this out :))
-
-
-Refinement Type Inference
--------------------------
-
-LiquidHaskell happily verifies `absoluteSum` -- or, to be precise, 
-the safety of the vector accesses `vec ! i`. The verification works 
-out because LiquidHaskell is able to automatically infer a suitable 
-type for `go`. Shuffle your mouse over the identifier above to see 
-the inferred type. Observe that the type states that the first 
-parameter `acc` (and the output) is `0 <= V`. That is, the returned
-value is non-negative.
-
-More importantly, the type states that the second parameter `i` is 
-`0 <= V` and `V <= n` and `V <= (vlen vec)`. That is, the parameter `i` 
-is between `0` and the vector length (inclusive). LiquidHaskell uses these 
-and the test that `i /= n` to establish that `i` is in fact between `0` 
-and `(vlen vec)` thereby verifing safety. 
-
-In fact, if we want to use the function externally (i.e. in another module) 
-we can go ahead and strengthen its type to specify that the output is 
-non-negative.
-
-\begin{code}
-{-@ absoluteSum :: Vector Int -> {v: Int | 0 <= v}  @-} 
-\end{code}
-
-**What happens if:** You *replace* the output type for `absoluteSum` with `{v: Int | 0 < v }` ?
-
-Bottling Recursion With a Higher-Order `loop`
----------------------------------------------
-
-Next, lets refactor the above low-level recursive function 
-into a generic higher-order `loop`.
-
-\begin{code}
-loop :: Int -> Int -> a -> (Int -> a -> a) -> a 
-loop lo hi base f = go base lo
-  where
-    go acc i     
-      | i /= hi   = go (f i acc) (i + 1)
-      | otherwise = acc
-\end{code}
-
-**Using `loop` to compute `absoluteSum`**
-
-We can now use `loop` to implement `absoluteSum` like so:
-
-\begin{code}
-absoluteSum' vec = if 0 < n then loop 0 n 0 body else 0
-  where body     = \i acc -> acc + (vec ! i)
-        n        = length vec
-\end{code}
-
-LiquidHaskell verifies `absoluteSum'` without any trouble.
-
-It is very instructive to see the type that LiquidHaskell *infers* 
-for `loop` -- it looks something like
-
-\begin{code}
-{-@ loop :: lo: {v: Int | (0 <= v) }  
-         -> hi: {v: Int | (lo <= v) } 
-         -> a 
-         -> (i: {v: Int | (Btwn lo v hi)} -> a -> a)
-         -> a 
-  @-}
-\end{code}
-
-In english, the above type states that 
-
-- `lo` the loop *lower* bound is a non-negative integer
-- `hi` the loop *upper* bound is a greater than `lo`,
-- `f`  the loop *body* is only called with integers between `lo` and `hi`.
-
-Inference is a rather convenient option -- it can be tedious to have to keep 
-typing things like the above! Of course, if we wanted to make `loop` a
-public or exported function, we could use the inferred type to generate 
-an explicit signature too.
-
-\begin{code}At the call 
-loop 0 n 0 body 
-\end{code}
-
-the parameters `lo` and `hi` are instantiated with `0` and `n` respectively
-(which, by the way is where the inference engine deduces non-negativity
-from) and thus LiquidHaskell concludes that `body` is only called with
-values of `i` that are *between* `0` and `(vlen vec)`, which shows the 
-safety of the call `vec ! i`.
-
-**Using `loop` to compute `dotProduct`**
-
-Here's another use of `loop` -- this time to compute the `dotProduct` 
-of two vectors. 
-
-\begin{code}
-dotProduct     :: Vector Int -> Vector Int -> Int
-dotProduct x y = loop 0 (length x) 0 (\i -> (+ (x ! i) * (y ! i))) 
-\end{code}
-
-The gimlet-eyed reader will realize that the above is quite unsafe -- what
-if `x` is a 10-dimensional vector while `y` has only 3-dimensions? 
-
-\begin{code}A nasty
-*** Exception: ./Data/Vector/Generic.hs:244 ((!)): index out of bounds ...
-\end{code}
-
-*Yech*. 
-
-This is precisely the sort of unwelcome surprise we want to do away with at 
-compile-time. Refinements to the rescue! We can specify that the vectors 
-have the same dimensions quite easily
-
-\begin{code}
-{-@ dotProduct :: x:(Vector Int) 
-               -> y:{v: (Vector Int) | (vlen v) = (vlen x)} 
-               -> Int 
-  @-}
-\end{code}
-
-after which LiquidHaskell will gladly verify that the implementation of
-`dotProduct` is indeed safe!
-
-Refining Data Types
--------------------
-
-Next, suppose we want to write a *sparse dot product*, that is, 
-the dot product of a vector and a **sparse vector** represented
-by a list of index-value tuples.
-
-**Representing Sparse Vectors**
-
-We can represent the sparse vector with a **refinement type alias** 
-
-\begin{code}
-{-@ type SparseVector a N = [({v: Int | (Btwn 0 v N)}, a)] @-}
-\end{code}
-
-As with usual types, the alias `SparseVector` on the left is just a 
-shorthand for the (longer) type on the right, it does not actually 
-define a new type. Thus, the above alias is simply a refinement of
-Haskell's `[(Int, a)]` type, with a size parameter `N` that facilitates 
-easy specification reuse. In this way, refinements let us express 
-invariants of containers like lists in a straightforward manner. 
-
-**Aside:** If you are familiar with the *index-style* length 
-encoding e.g. as found in [DML][dml] or [Agda][agdavec], then note
-that despite appearances, our `SparseVector` definition is *not* 
-indexed. Instead, we deliberately choose to encode properties 
-with logical refinement predicates, to facilitate SMT based 
-checking and inference.
-
-**Verifying Uses of Sparse Vectors**
-
-Next, we can write a recursive procedure that computes the sparse product
-
-\begin{code}
-{-@ sparseProduct :: (Num a) => x:(Vector a) 
-                             -> SparseVector a (vlen x) 
-                             -> a 
-  @-}
-sparseProduct x y  = go 0 y
-  where 
-    go sum ((i, v) : y') = go (sum + (x ! i) * v) y' 
-    go sum []            = sum
-\end{code}
-
-LiquidHaskell verifies the above by using the specification for `y` to
-conclude that for each tuple `(i, v)` in the list, the value of `i` is 
-within the bounds of the vector `x`, thereby proving the safety of the 
-access `x ! i`.
-
-Refinements and Polymorphism
-----------------------------
-
-The sharp reader will have undoubtedly noticed that the sparse product 
-can be more cleanly expressed as a [fold][foldl]. 
-
-\begin{code} Indeed! Let us recall the type of the `foldl` operation
-foldl' :: (a -> b -> a) -> a -> [b] -> a
-\end{code}
-
-Thus, we can simply fold over the sparse vector, accumulating the `sum`
-as we go along
-
-\begin{code}
-{-@ sparseProduct' :: (Num a) => x:(Vector a) 
-                             -> SparseVector a (vlen x) 
-                             -> a 
-  @-}
-sparseProduct' x y  = foldl' body 0 y   
-  where 
-    body sum (i, v) = sum + (x ! i) * v
-\end{code}
-
-LiquidHaskell digests this too, without much difficulty. 
-
-The main trick is in how the polymorphism of `foldl'` is instantiated. 
-
-1. The GHC type inference engine deduces that at this site, the type variable
-   `b` from the signature of `foldl'` is instantiated to the Haskell type `(Int, a)`. 
-
-2. Correspondingly, LiquidHaskell infers that in fact `b` can be instantiated
-   to the *refined* type `({v: Int | (Btwn 0 v (vlen x))}, a)`. 
-   
-Walk the mouse over to `i` to see this inferred type. (You can also hover over
-`foldl'`above to see the rather more verbose fully instantiated type.)
-
-Thus, the inference mechanism saves us a fair bit of typing and allows us to
-reuse existing polymorphic functions over containers and such without ceremony.
-
-Conclusion
-----------
-
-That's all for now folks! Hopefully the above gives you a reasonable idea of
-how one can use refinements to verify size related properties, and more
-generally, to specify and verify properties of recursive, and polymorphic
-functions operating over datatypes. Next time, we'll look at how we can
-teach LiquidHaskell to think about properties of recursive structures
-like lists and trees.
-
-[smog_alado]: http://www.reddit.com/user/smog_alado
-
-[vecspec]:  https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/Data/Vector.spec
-[vec]:      http://hackage.haskell.org/package/vector
-[dml]:      http://www.cs.bu.edu/~hwxi/DML/DML.html
-[agdavec]:  http://code.haskell.org/Agda/examples/Vec.agda
-[ref101]:   /blog/2013/01/01/refinement-types-101.lhs/ 
-[ref102]:   /blog/2013/01/27/refinements-101-reax.lhs/ 
-[foldl]:    http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Data-List.html
-[listtail]: /blog/2013/01/31/safely-catching-a-list-by-its-tail.lhs/
-[dmlarray]: http://www.cs.bu.edu/~hwxi/academic/papers/pldi98.pdf
-
diff --git a/docs/blog/2013-03-26-talking-about-sets.lhs b/docs/blog/2013-03-26-talking-about-sets.lhs
deleted file mode 100644
--- a/docs/blog/2013-03-26-talking-about-sets.lhs
+++ /dev/null
@@ -1,383 +0,0 @@
----
-layout: post
-title: "Talking About Sets"
-date: 2013-03-26 16:12
-comments: true
-external-url:
-categories: basic measures sets
-author: Ranjit Jhala
-published: true 
-demo: TalkingAboutSets.hs
----
-
-In the posts so far, we've seen how LiquidHaskell allows you to use SMT 
-solvers to specify and verify *numeric* invariants -- denominators 
-that are non-zero, integer indices that are within the range of an 
-array, vectors that have the right number of dimensions and so on.
-
-However, SMT solvers are not limited to numbers, and in fact, support
-rather expressive logics. In the next couple of posts, let's see how
-LiquidHaskell uses SMT to talk about **sets of values**, for example, 
-the contents of a list, and to specify and verify properties about 
-those sets.
-
-<!-- more -->
-
-\begin{code}
-module TalkingAboutSets where
-
-import Data.Set hiding (filter, split)
-import Prelude  hiding (reverse, filter)
-
-\end{code}
-
-Talking about Sets (In Logic)
-=============================
-
-First, we need a way to talk about sets in the refinement logic. We could
-roll our own special Haskell type, but why not just use the `Set a` type
-from `Data.Set`.
-
-The `import Data.Set` , also instructs LiquidHaskell to import in the various 
-specifications defined for the `Data.Set` module that we have *predefined* 
-in [Data/Set.spec][setspec] 
-
-\begin{code} Let's look at the specifications.
-module spec Data.Set where
-
-embed Set as Set_Set
-\end{code}
-
-The `embed` directive tells LiquidHaskell to model the **Haskell** 
-type constructor `Set` with the **SMT** type constructor `Set_Set`.
-
-\begin{code} First, we define the logical operators (i.e. `measure`s) 
-measure Set_sng  :: a -> (Set a)                    -- ^ singleton
-measure Set_cup  :: (Set a) -> (Set a) -> (Set a)   -- ^ union
-measure Set_cap  :: (Set a) -> (Set a) -> (Set a)   -- ^ intersection
-measure Set_dif  :: (Set a) -> (Set a) -> (Set a)   -- ^ difference 
-\end{code}
-
-\begin{code} Next, we define predicates on `Set`s 
-measure Set_emp  :: (Set a) -> Prop                 -- ^ emptiness
-measure Set_mem  :: a -> (Set a) -> Prop            -- ^ membership
-measure Set_sub  :: (Set a) -> (Set a) -> Prop      -- ^ inclusion 
-\end{code}
-
-
-Interpreted Operations
-----------------------
-
-The above operators are *interpreted* by the SMT solver. 
-
-\begin{code} That is, just like the SMT solver "knows that"
-2 + 2 == 4
-\end{code}
-
-\begin{code} the SMT solver also "knows that"
-(Set_sng 1) == (Set_cap (Set_sng 1) (Set_cup (Set_sng 2) (Set_sng 1)))
-\end{code}
-
-This is because, the above formulas belong to a decidable Theory of Sets
-which can be reduced to McCarthy's more general [Theory of Arrays][mccarthy]. 
-See [this recent paper][z3cal] if you want to learn more about how modern SMT 
-solvers "know" the above equality holds...
-
-Talking about Sets (In Code)
-============================
-
-Of course, the above operators exist purely in the realm of the 
-refinement logic, beyond the grasp of the programmer.
-
-To bring them down (or up, or left or right) within reach of Haskell code, 
-we can simply *assume* that the various public functions in `Data.Set` do 
-the *Right Thing* i.e. produce values that reflect the logical set operations:
-
-\begin{code} First, the functions that create `Set` values
-empty     :: {v:(Set a) | (Set_emp v)}
-singleton :: x:a -> {v:(Set a) | v = (Set_sng x)}
-\end{code}
-
-\begin{code} Next, the functions that operate on elements and `Set` values
-insert :: Ord a => x:a 
-                -> xs:(Set a) 
-                -> {v:(Set a) | v = (Set_cup xs (Set_sng x))}
-
-delete :: Ord a => x:a 
-                -> xs:(Set a) 
-                -> {v:(Set a) | v = (Set_dif xs (Set_sng x))}
-\end{code}
-
-\begin{code} Then, the binary `Set` operators
-union        :: Ord a => xs:(Set a) 
-                      -> ys:(Set a) 
-                      -> {v:(Set a) | v = (Set_cup xs ys)}
-
-intersection :: Ord a => xs:(Set a) 
-                      -> ys:(Set a) 
-                      -> {v:(Set a) | v = (Set_cap xs ys)}
-
-difference   :: Ord a => xs:(Set a) 
-                      -> ys:(Set a) 
-                      -> {v:(Set a) | v = (Set_dif xs ys)}
-\end{code}
-
-\begin{code} And finally, the predicates on `Set` values:
-isSubsetOf :: Ord a => xs:(Set a) 
-                    -> ys:(Set a) 
-                    -> {v:Bool | (Prop v) <=> (Set_sub xs ys)}
-
-member     :: Ord a => x:a 
-                    -> xs:(Set a) 
-                    -> {v:Bool | (Prop v) <=> (Set_mem x xs)}
-\end{code}
-
-**Note:** Of course we shouldn't and needn't really *assume*, but should and
-will *guarantee* that the functions from `Data.Set` implement the above types. 
-But thats a story for another day...
-
-Proving Theorems With LiquidHaskell
-===================================
-
-OK, let's take our refined operators from `Data.Set` out for a spin!
-One pleasant consequence of being able to precisely type the operators 
-from `Data.Set` is that we have a pleasant interface for using the SMT
-solver to *prove theorems* about sets, while remaining firmly rooted in
-Haskell. 
-
-First, let's write a simple function that asserts that its input is `True`
-
-\begin{code}
-{-@ boolAssert :: {v: Bool | (Prop v)} -> {v:Bool | (Prop v)} @-}
-boolAssert True   = True
-boolAssert False  = error "boolAssert: False? Never!"
-\end{code}
-
-Now, we can use `boolAssert` to write some simple properties. (Yes, these do
-indeed look like QuickCheck properties -- but here, instead of generating
-tests and executing the code, the type system is proving to us that the
-properties will *always* evaluate to `True`) 
-
-Let's check that `intersection` is commutative ...
-
-\begin{code}
-prop_cap_comm x y 
-  = boolAssert 
-  $ (x `intersection` y) == (y `intersection` x)
-\end{code}
-
-that `union` is associative ...
-
-\begin{code}
-prop_cup_assoc x y z 
-  = boolAssert 
-  $ (x `union` (y `union` z)) == (x `union` y) `union` z
-\end{code}
-
-and that `union` distributes over `intersection`.
-
-\begin{code}
-prop_cap_dist x y z 
-  = boolAssert 
-  $  (x `intersection` (y `union` z)) 
-  == (x `intersection` y) `union` (x `intersection` z) 
-\end{code}
-  
-Of course, while we're at it, let's make sure LiquidHaskell
-doesn't prove anything that *isn't* true ...
-
-\begin{code}
-prop_cup_dif_bad x y
-   = boolAssert 
-   $ x == (x `union` y) `difference` y
-\end{code}
-
-Hmm. You do know why the above doesn't hold, right? It would be nice to
-get a *counterexample* wouldn't it? Well, for the moment, there is
-QuickCheck!
-
-Thus, the refined types offer a nice interface for interacting with the SMT
-solver in order to prove theorems in LiquidHaskell. (BTW, The [SBV project][sbv]
-describes another approach for using SMT solvers from Haskell, without the 
-indirection of refinement types.)
-
-While the above is a nice warm up exercise to understanding how
-LiquidHaskell reasons about sets, our overall goal is not to prove 
-theorems about set operators, but instead to specify and verify 
-properties of programs. 
-
-
-
-The Set of Values in a List
-===========================
-
-Let's see how we might reason about sets of values in regular Haskell programs.
-
-We'll begin with Lists, the jack-of-all-data-types. Now, instead of just
-talking about the **number of** elements in a list, we can write a measure
-that describes the **set of** elements in a list:
-
-\begin{code} A measure for the elements of a list, from [Data/Set.spec][setspec]
-
-measure listElts :: [a] -> (Set a) 
-listElts ([])    = {v | (? Set_emp(v))}
-listElts (x:xs)  = {v | v = (Set_cup (Set_sng x) (listElts xs)) }
-\end{code}
-
-That is, `(listElts xs)` describes the set of elements contained in a list `xs`.
-
-Next, to make the specifications concise, let's define a few predicate aliases:
-
-\begin{code}
-{-@ predicate EqElts  X Y = 
-      ((listElts X) = (listElts Y))                        @-}
-
-{-@ predicate SubElts   X Y = 
-      (Set_sub (listElts X) (listElts Y))                  @-}
-
-{-@ predicate UnionElts X Y Z = 
-      ((listElts X) = (Set_cup (listElts Y) (listElts Z))) @-}
-\end{code}
-
-A Trivial Identity
-------------------
-
-OK, now let's write some code to check that the `listElts` measure is sensible!
-
-\begin{code}
-{-@ listId    :: xs:[a] -> {v:[a] | (EqElts v xs)} @-}
-listId []     = []
-listId (x:xs) = x : listId xs
-\end{code}
-
-That is, LiquidHaskell checks that the set of elements of the output list
-is the same as those in the input.
-
-A Less Trivial Identity
------------------------
-
-Next, let's write a function to `reverse` a list. Of course, we'd like to
-verify that `reverse` doesn't leave any elements behind; that is that the 
-output has the same set of values as the input list. This is somewhat more 
-interesting because of the *tail recursive* helper `go`. Do you understand 
-the type that is inferred for it? (Put your mouse over `go` to see the 
-inferred type.)
-
-\begin{code}
-{-@ reverse       :: xs:[a] -> {v:[a] | (EqElts v xs)} @-}
-reverse           = go [] 
-  where 
-    go acc []     = acc
-    go acc (y:ys) = go (y:acc) ys
-\end{code}
-
-Appending Lists
----------------
-
-Next, here's good old `append`, but now with a specification that states
-that the output indeed includes the elements from both the input lists.
-
-\begin{code}
-{-@ append       :: xs:[a] -> ys:[a] -> {v:[a]| (UnionElts v xs ys)} @-}
-append []     ys = ys
-append (x:xs) ys = x : append xs ys
-\end{code}
-
-Filtering Lists
----------------
-
-Let's round off the list trilogy, with `filter`. Here, we can verify
-that it returns a **subset of** the values of the input list.
-
-\begin{code}
-{-@ filter      :: (a -> Bool) -> xs:[a] -> {v:[a]| (SubElts v xs)} @-}
-
-filter f []     = []
-filter f (x:xs) 
-  | f x         = x : filter f xs 
-  | otherwise   = filter f xs
-\end{code}
-
-Merge Sort
-==========
-
-Let's conclude this entry with one larger example: `mergeSort`.
-We'd like to verify that, well, the list that is returned 
-contains the same set of elements as the input list. 
-
-And so we will!
-
-But first, let's remind ourselves of how `mergeSort` works:
-
-1. `split` the input list into two halves, 
-2. `sort`  each half, recursively, 
-3. `merge` the sorted halves to obtain the sorted list.
-
-
-Split
------
-
-We can `split` a list into two, roughly equal parts like so:
-
-\begin{code}
-split []     = ([], [])
-split (x:xs) = (x:zs, ys)
-  where 
-    (ys, zs) = split xs
-\end{code}
-
-LiquidHaskell verifies that the relevant property of split is
-
-\begin{code} 
-{-@ split :: xs:[a] -> ([a], [a])<{\ys zs -> (UnionElts xs ys zs)}> @-}
-\end{code}
-
-The funny syntax with angle brackets simply says that the output of `split` 
-is a *pair* `(ys, zs)` whose union is the list of elements of the input `xs`.
-(Yes, this is indeed a dependent pair; we will revisit these later to
-understand whats going on with the odd syntax.)
-
-Merge
------
-
-Next, we can `merge` two (sorted) lists like so:
-
-\begin{code}
-merge xs []         = xs
-merge [] ys         = ys
-merge (x:xs) (y:ys) 
-  | x <= y          = x : merge xs (y : ys)
-  | otherwise       = y : merge (x : xs) ys
-\end{code}
-
-As you might expect, the elements of the returned list are the union of the
-elements of the input, or as LiquidHaskell might say,
-
-\begin{code}
-{-@ merge :: (Ord a) => x:[a] -> y:[a] -> {v:[a]| (UnionElts v x y)} @-}
-\end{code}
-
-Sort
-----
-
-Finally, we put all the pieces together by
-
-\begin{code}
-{-@ mergeSort :: (Ord a) => xs:[a] -> {v:[a] | (EqElts v xs)} @-}
-mergeSort []  = []
-mergeSort [x] = [x]
-mergeSort xs  = merge (mergeSort ys) (mergeSort zs) 
-  where 
-    (ys, zs)  = split xs
-\end{code}
-
-The type given to `mergeSort`guarantees that the set of elements in the 
-output list is indeed the same as in the input list. Of course, it says 
-nothing about whether the list is *actually sorted*. 
-
-Well, Rome wasn't built in a day...
-
-[sbv]:      https://github.com/LeventErkok/sbv
-[setspec]:  https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/Data/Set.spec
-[mccarthy]: http://www-formal.stanford.edu/jmc/towards.ps
-[z3cal]:    http://research.microsoft.com/en-us/um/people/leonardo/fmcad09.pdf
diff --git a/docs/blog/2013-05-16-unique-zippers.lhs b/docs/blog/2013-05-16-unique-zippers.lhs
deleted file mode 100644
--- a/docs/blog/2013-05-16-unique-zippers.lhs
+++ /dev/null
@@ -1,313 +0,0 @@
----
-layout: post
-title: "Unique Zippers"
-date: 2013-05-10 16:12
-comments: true
-external-url:
-categories: basic measures sets zipper uniqueness
-author: Niki Vazou
-published: false 
-demo: TalkingAboutUniqueSets.hs
----
-
-**The story so far:** [Previously][talking-about-sets] we saw
-how we can use LiquidHaskell to talk about set of values and specifically
-the set of values in a list.
-
-In this post, we will extend this vocabulary to talk about the 
-set of duplicate values in a list. 
-If we constrain this set to be empty, 
-we encode a list without duplicates, or an **unique list**. 
-Once we express uniqueness on lists, it is straightforward to 
-describe uniqueness on other data structures that contain lists.
-As an example, we will illustrate the properties of a **unique zipper**.
-
-\begin{code}
-module UniqueZipper where
-
-import Prelude  hiding (reverse, (++), filter)
-import Data.Set hiding (filter)
-\end{code}
-
-
-A Quick Recap
-=============
-
-\begin{code} In the previous post we used a measure for the elements of a list, from [Data/Set.spec][setspec]
-measure listElts :: [a] -> (Set a)
-listElts ([])    = {v | (? Set_emp(v))}
-listElts (x:xs)  = {v | v = (Set_cup (Set_sng x) (listElts xs)) }
-\end{code}
-
-With this measure we defined predicate aliases 
-that describe relations between lists:
-
-\begin{code}
-{-@ predicate EqElts  X Y      = ((listElts X) = (listElts Y))                        @-}
-
-{-@ predicate DisjointElts X Y = (Set_emp (Set_cap (listElts X) (listElts Y)))        @-}
-
-{-@ predicate SubElts X Y      = (Set_sub (listElts X) (listElts Y))                  @-}
-
-{-@ predicate UnionElts X Y Z  = ((listElts X) = (Set_cup (listElts Y) (listElts Z))) @-}
-
-{-@ predicate ListElt N X      = (Set_mem N (listElts X))                             @-}
-\end{code}
-
-
-These predicates were our vocabulary on specifying properties of list functions.
-Remember, that `reverse` returns an output list that has the same elements, i.e., `EqElts`, with the input list.
-We can extend these predicates and express list uniqueness.
-So reversing a unique list should again return an output list that has the same
-elements as the input list, and also it is unique.
-
-Describing Unique Lists
-======================
-
-To describe unique lists, we follow two steps:
-first, we describe the set of duplicate values of
-a list;
-then, we demand this set to be empty.
-
-Towards the first step, we define a measure `listDup`
-that returns the duplicate values of its input list.
-This measure is recursively defined:
-The duplicates of an empty list is the empty set.
-We compute the duplicates of a non-empty list, 
-namely `x:xs`, as follows:
-
-- If `x` is member of the list values of `xs`, then `x` is a duplicate
-so `listDup` returns a set that contains `x` and the 
-list duplicates of `xs`, as computed recursively.
-
-- Otherwise, we can ignore `x` and recursively compute the duplicates of `xs`.
-
-\begin{code}
-{-@
-  measure listDup :: [a] -> (Set a)
-  listDup([])   = {v | (? (Set_emp v))}
-  listDup(x:xs) = {v | v = ((Set_mem x (listElts xs))?(Set_cup (Set_sng x) (listDup xs)):(listDup xs)) }
-  @-}
-\end{code}
-
-With `listDup` at hand, it is direct to describe unique lists.
-A list is unique, if the set of duplicates, 
-as computed by `listDup`
-is the empty set.
-We create a type alias for unique lists and name it `UList`.
-
-\begin{code}
-{-@ predicate ListUnique X = (Set_emp (listDup X)) @-}
-
-{-@ type UList a = {v:[a] | (ListUnique v)}        @-}
-\end{code}
-
-
-Functions on Unique Lists
-==========================
-
-In the previous post, we proved interesting properties about 
-the list trilogy, i.e., `append`, `reverse`, and `filter`.
-Now, we will prove that apart from these properties,
-all these function preserve list uniqueness.
-
-To begin with, 
-we proved that the output of append
-indeed includes the elements from both the input lists.
-Now, we can also prove that if both input lists are unique and 
-their values form disjoint sets, then the output list is also unique.
-
-\begin{code}
-infixr 5 ++
-{-@ UniqueZipper.++ :: xs:(UList a)
-                    -> ys:{v: UList a | (DisjointElts v xs)}
-                    -> {v: UList a | (UnionElts v xs ys)}
-  @-}
-(++)         :: [a] -> [a] -> [a]
-[] ++ ys     = ys
-(x:xs) ++ ys = x: (xs ++ ys)
-\end{code}
-
-Next, we can prove that if a unique list is reversed, 
-the output list has the same elements as the input,
-and also it is unique.
-\begin{code}
-{-@ reverse :: xs:(UList a)
-            -> {v: UList a | (EqElts v xs)} 
-  @-}
-reverse :: [a] -> [a]
-reverse = go []
-  where
-    go a []     = a
-    go a (x:xs) = go (x:a) xs 
-\end{code}
-
-Finally, filtering a unique list returns a list
-with a subset of values of the input list, that once again is unique! 
-
-\begin{code}
-{-@ filter :: (a -> Bool) -> xs:(UList a) -> {v:UList a | (SubElts v xs)} @-}
-filter      :: (a -> Bool) -> [a] -> [a]
-filter p [] = []
-filter p (x:xs) 
-  | p x       = x : filter p xs
-  | otherwise = filter p xs
-\end{code}
-
-Unique Zipper
-=============
-
-A [zipper][http://en.wikipedia.org/wiki/Zipper_(data_structure)] is an aggregate data stucture 
-that is used to arbitrary traverse the structure and update its contents.
-We define a zipper as a data type that contains 
-an element (called `focus`) that we are currently using,
-a list of elements (called `up`) before the current one,
-and a list of elements (called `down`) after the current one.
-
-\begin{code}
-data Zipper a = Zipper { focus :: a       -- focused element in this set
-                       , up    :: [a]     -- elements to the left
-                       , down  :: [a] }   -- elements to the right
-\end{code}
-
-
-We would like to state that all the values in the zipper 
-are unique.
-To start with, we would like to refine the `Zipper` data declaration
-to express that both the lists in the structure
-are unique **and** do not include `focus` in their values.
-
-LiquidHaskell allow us to refine data type declarations, 
-using the liquid comments.
-So, apart from above definition definition for the `Zipper`, 
-we add a refined one, stating that the data structure always enjoys 
-the desired properties.
-
-\begin{code}
-{-@ 
-data Zipper a = Zipper { focus :: a
-                       , up    :: UListDif a focus
-                       , down  :: UListDif a focus}
-  @-}
-
-{-@ type UListDif a N = {v:(UList a) | (not (ListElt N v))} @-}
-\end{code}
-
-With this annotation any time we use a `Zipper` in the code
-LiquidHaskell knows that 
-the `up` and `down` components are unique lists that do not include `focus`.
-Moreover, when a new `Zipper` is constructed we should prove that
-this property holds,
-otherwise a liquid error will occur.
-
-You may notice values inside the `Zipper` are not unique, as
-a value can appear in both the `up` and the `down` components.
-So, we have to specify that 
-these two elements form disjoint lists.
-To this end, we define two measures `getUp` and `getDown`
-that return the relevant parts of the `Zipper`
-
-\begin{code}
-{-@ measure getUp :: forall a. (Zipper a) -> [a] 
-    getUp (Zipper focus up down) = up
-  @-}
-
-{-@ measure getDown :: forall a. (Zipper a) -> [a] 
-    getDown (Zipper focus up down) = down
-  @-}
-\end{code}
-
-With these definitions, we create a type alias `UZipper` that states that 
-the two list components are disjoint.
-
-\begin{code}
-{-@ type UZipper a = {v:Zipper a | (DisjointElts (getUp v) (getDown v))} @-}
-\end{code}
-
-Functions on Unique Zipper
-===========================
-
-Since we defined a unique zipper, it is straightforward for
-LiquidHaskell to prove that
-operations on zippers preserve uniqueness.
-
-We can prove that a zipper that contains elements 
-from a unique list is indeed unique.
-
-\begin{code}
-{-@ differentiate :: UList a -> Maybe (UZipper a) @-}
-differentiate :: [a] -> Maybe (Zipper a)
-differentiate []     = Nothing
-differentiate (x:xs) = Just $ Zipper x [] xs
-\end{code}
-
-And vice versa, all elements of a unique zipper 
-can construct a unique list.
-
-\begin{code}
-{-@ integrate :: UZipper a -> UList a @-}
-integrate :: Zipper a -> [a]
-integrate (Zipper x l r) = reverse l ++ x : r
-\end{code}
-
-By the definition of `UZipper` we know that `l` is a unique list
-and that `x` is not an element of `l`.
-Thus, if `l` is reversed using the descriptive type of `reverse` 
-that we provided before, it preserves both these properties.
-The append operator also uses the 
-type that we show before. So LiquidHaskell, can prove that `x : r`
-is indeed a unique list with elements disjoint from `reverse l` and so we can append it to `reverse l` 
-and get a unique list.
-
-
-With the exact same reasoning, 
-we use the above list operations to create more zipper operations.
-
-So we can reverse a unique zipper
-\begin{code}
-{-@ reverseZipper :: UZipper a -> UZipper a @-}
-reverseZipper :: Zipper a -> Zipper a
-reverseZipper (Zipper t ls rs) = Zipper t rs ls
-\end{code}
-
-
-More the focus up or down
-\begin{code}
-{-@ focusUp, focusDown :: UZipper a -> UZipper a @-}
-focusUp, focusDown :: Zipper a -> Zipper a
-focusUp (Zipper t [] rs)     = Zipper x xs [] where (x:xs) = reverse (t:rs)
-focusUp (Zipper t (l:ls) rs) = Zipper l ls (t:rs)
-
-focusDown = reverseZipper . focusUp . reverseZipper
-
-{-@ q :: x:a ->  {v:[a] |(not (Set_mem x (listElts v)))} @-}
-q :: a -> [a]
-q _ = []
-\end{code}
-
-Finally, using the filter operation on lists
-allows LiquidHaskell to prove that filtering a zipper 
-also preserves uniqueness.
-\begin{code}
-{-@ filterZipper :: (a -> Bool) -> UZipper a -> Maybe (UZipper a) @-}
-filterZipper :: (a -> Bool) -> Zipper a -> Maybe (Zipper a)
-filterZipper p (Zipper f ls rs) = case filter p (f:rs) of
-    f':rs' -> Just $ Zipper f' (filter p ls) rs'    -- maybe move focus down
-    []     -> case filter p ls of                  -- filter back up
-                    f':ls' -> Just $ Zipper f' ls' [] -- else up
-                    []     -> Nothing
-\end{code}
-
-Conclusion
-==========
-
-That's all for now!
-This post illustrated
-
-- How we can use set theory to express properties the values of the list,
-such as list uniqueness.
-- How we can use LuquidHaskell to prove that these properties are preserved through list operations.
-- How we can embed this properties in complicated data structures that use lists, such as a zipper.
-
-
-
diff --git a/docs/blog/2013-05-24-unique-zipper.lhs b/docs/blog/2013-05-24-unique-zipper.lhs
deleted file mode 100644
--- a/docs/blog/2013-05-24-unique-zipper.lhs
+++ /dev/null
@@ -1,396 +0,0 @@
----
-layout: post
-title: "Unique Zippers"
-date: 2013-05-10 16:12
-comments: true
-external-url:
-categories: basic measures sets zipper uniqueness
-author: Niki Vazou
-published: true
-demo: UniqueZipper.hs
----
-
-**The story so far:** [Previously][about-sets] we saw
-how we can use LiquidHaskell to talk about set of values
-and specifically the *set of values* in a list.
-
-Often, we want to enforce the invariant that a particular data structure
-contains *no duplicates*. For example, we may have a structure that holds
-a collection of file handles, or other resources, where the presence of
-duplicates could lead to unpleasant leaks.
-
-In this post, we will see how to use LiquidHaskell to talk
-about the set of duplicate values in data structures, and 
-hence, let us specify and verify uniqueness, that is, the
-absence of duplicates.
-
-<!-- more -->
-
-To begin, lets extend our vocabulary to talk about the *set of duplicate
-values* in lists.  By constraining this set to be empty, we can specify a
-list without duplicates, or an **unique list**.  Once we express uniqueness
-on lists, it is straightforward to describe uniqueness on other data
-structures that contain lists.  As an example, we will illustrate the
-properties of a **unique zipper**.
-
-\begin{code}
-module UniqueZipper where
-
-import Prelude  hiding (reverse, (++), filter)
-import Data.Set hiding (filter)
-\end{code}
-
-
-A Quick Recap
-=============
-
-\begin{code} In the previous post we used a measure for the elements of a list, from [Data/Set.spec][setspec]
-measure listElts :: [a] -> (Set a)
-listElts ([])    = {v | (? (Set_emp v))}
-listElts (x:xs)  = {v | v = (Set_cup (Set_sng x) (listElts xs)) }
-\end{code}
-
-With this measure we defined predicate aliases 
-that describe relations between lists:
-
-\begin{code}
-{-@ predicate EqElts  X Y      = 
-      ((listElts X) = (listElts Y))                        @-}
-
-{-@ predicate DisjointElts X Y = 
-      (Set_emp (Set_cap (listElts X) (listElts Y)))        @-}
-
-{-@ predicate SubElts X Y      = 
-      (Set_sub (listElts X) (listElts Y))                  @-}
-
-{-@ predicate UnionElts X Y Z  = 
-      ((listElts X) = (Set_cup (listElts Y) (listElts Z))) @-}
-
-{-@ predicate ListElt N X      = 
-      (Set_mem N (listElts X))                             @-}
-\end{code}
-
-
-These predicates were our vocabulary on specifying properties of list functions.
-Remember, that `reverse` returns an output list that has the same elements, i.e., `EqElts`, with the input list.
-We can extend these predicates and express list uniqueness.
-So reversing a unique list should again return an output list that has the same
-elements as the input list, and also it is unique.
-
-Describing Unique Lists
-======================
-
-To describe unique lists, we follow two steps:
-
-1. we describe the set of duplicate values of a list; and 
-2. we demand this set to be empty.
-
-Towards the first step, we define a measure `dups`
-that returns the duplicate values of its input list.
-This measure is recursively defined:
-The duplicates of an empty list is the empty set.
-We compute the duplicates of a non-empty list, 
-namely `x:xs`, as follows:
-
-- If `x` is an element of `xs`, then `x` is a duplicate.
-  Hence, `dups` is `x` plus the (recursively computed) 
-  duplicates in `xs`.
-
-- Otherwise, we can ignore `x` and recursively compute 
-  the duplicates of `xs`.
-
-The above intuition can be formalized as a measure:
-
-\begin{code}
-{-@
-  measure dups :: [a] -> (Set a)
-  dups([])   = {v | (? (Set_emp v))}
-  dups(x:xs) = {v | v = (if (Set_mem x (listElts xs))
-                         then (Set_cup (Set_sng x) (dups xs))
-                         else (dups xs)) }
-  @-}
-\end{code}
-
-With `dups` in hand, it is direct to describe unique lists:
-
-A list is unique, if the set of duplicates, as computed by `dups` is empty.
-
-We create a type alias for unique lists and name it `UList`.
-
-\begin{code}
-{-@ predicate ListUnique X = (Set_emp (dups X)) @-}
-
-{-@ type UList a = {v:[a] | (ListUnique v)}     @-}
-\end{code}
-
-
-Functions on Unique Lists
-==========================
-
-In the previous post, we proved interesting properties about 
-the list trilogy, i.e., `append`, `reverse`, and `filter`.
-Now, we will prove that apart from these properties,
-all these functions preserve list uniqueness.
-
-Append
-------
-
-To begin with, we proved that the output of append
-indeed includes the elements from both the input lists.
-Now, we can also prove that if both input lists are 
-unique *and their elements are disjoint*, then the 
-output list is also unique.
-
-\begin{code}
-infixr 5 ++
-{-@ UniqueZipper.++ :: xs:(UList a)
-                    -> ys:{v: UList a | (DisjointElts v xs)}
-                    -> {v: UList a | (UnionElts v xs ys)}
-  @-}
-(++)         :: [a] -> [a] -> [a]
-[] ++ ys     = ys
-(x:xs) ++ ys = x:(xs ++ ys)
-\end{code}
-
-Reverse
--------
-
-Next, we can prove that if a unique list is reversed, 
-the output list has the same elements as the input,
-and also it is unique.
-
-\begin{code}
-{-@ reverse :: xs:(UList a) -> {v: UList a | (EqElts v xs)} @-}
-reverse :: [a] -> [a]
-reverse = go []
-  where
-    go a []     = a
-    go a (x:xs) = go (x:a) xs 
-\end{code}
-
-Filter
-------
-
-Finally, filtering a unique list returns a list with a subset of
-values of the input list, that once again is unique! 
-
-\begin{code}
-{-@ filter :: (a -> Bool) 
-           -> xs:(UList a) 
-           -> {v:UList a | (SubElts v xs)} 
-  @-}
-filter p [] = []
-filter p (x:xs) 
-  | p x       = x : filter p xs
-  | otherwise = filter p xs
-\end{code}
-
-
-Unique Zipper
-=============
-
-That was easy enough! Now, lets look at a slightly more interesting
-structure fashioned from lists.  A [zipper][wiki-zipper] is an aggregate
-data stucture that is used to arbitrary traverse the structure and update
-its contents.
-
-We define a zipper as a data type that contains an element (called `focus`)
-that we are currently using, a list of elements (called `up`) before
-the current one, and a list of elements (called `down`) after the current one.
-
-\begin{code}
-data Zipper a = Zipper { focus :: a       -- focused element in this set
-                       , up    :: [a]     -- elements to the left
-                       , down  :: [a] }   -- elements to the right
-\end{code}
-
-
-One well-known application of zippers is in the
-[XMonad](http://xmonad.org/) tiling window manager. 
-The set of windows being managed is stored in a zipper 
-similar to the above. The `focus` happily coincides with 
-the window currently in focus, and the `up` and `down` 
-to the list of windows that come before and after it.
-
-One crucial invariant maintained by XMonad is that the zipper structure is
-unique -- i.e. each window appears at most once inside the zipper.
-
-Lets see how we can state and check that all the values in a zipper are unique.
-
-To start with, we would like to refine the `Zipper` data declaration
-to express that both the lists in the structure are unique **and** 
-do not include `focus` in their values.
-
-LiquidHaskell allow us to refine data type declarations, using the liquid comments.
-So, apart from above definition definition for the `Zipper`, we add a refined one,
-stating that the data structure always enjoys the desired properties.
-
-\begin{code}
-{-@ data Zipper a = Zipper { focus :: a
-                           , up    :: UListDif a focus
-                           , down  :: UListDif a focus}
-  @-}
-
-{-@ type UListDif a N = {v:(UList a) | (not (ListElt N v))} @-}
-\end{code}
-
-It is worth noting that the above is kind of *dependent* record in that
-the types of the `up` and `down` fields depend on the value of the `focus`
-field.
-
-With this annotation any time we use a `Zipper` in the code LiquidHaskell
-knows that the `up` and `down` components are unique lists
-that do not include `focus`. Moreover, when a new `Zipper` is constructed
-LiquidHaskell proves that this property holds, otherwise a liquid type 
-error is reported.
-
-
-Hold on a minute!
-
-The awake reader will have noticed that values inside the `Zipper` as 
-specified so far, are *not unique*, as nothing prevents a value from 
-appearing in both the `up` and the `down` components.
-
-So, we have to specify that the contents of those two fields are *disjoint*.
-
-One way to achieve this is by defining two measures `getUp` and `getDown`
-that return the relevant parts of the `Zipper`
-
-\begin{code}
-{-@ measure getUp :: forall a. (Zipper a) -> [a] 
-    getUp (Zipper focus up down) = up
-  @-}
-
-{-@ measure getDown :: forall a. (Zipper a) -> [a] 
-    getDown (Zipper focus up down) = down
-  @-}
-\end{code}
-
-With these definitions, we create a type alias `UZipper`
-that states that the two list components are disjoint, and hence,
-that we have a *unique zipper* with no duplicates.
-
-\begin{code}
-{-@ 
-  type UZipper a = {v:Zipper a | (DisjointElts (getUp v) (getDown v))} 
-  @-}
-\end{code}
-
-
-Functions on Unique Zippers
-===========================
-
-Now that we have defined a unique zipper, it is straightforward for
-LiquidHaskell to prove that operations on zippers preserve uniqueness.
-
-Differentiation
----------------
-
-We can prove that a zipper that built from elements from a unique list is
-indeed unique.
-
-\begin{code}
-{-@ differentiate :: UList a -> Maybe (UZipper a) @-}
-differentiate []     = Nothing
-differentiate (x:xs) = Just $ Zipper x [] xs
-\end{code}
-
-Integration
------------
-
-And vice versa, all elements of a unique zipper yield a unique list.
-
-\begin{code}
-{-@ integrate :: UZipper a -> UList a @-}
-integrate (Zipper x l r) = reverse l ++ x : r
-\end{code}
-
-Recall the types for `++` and `reverse` that we proved earlier -- hover
-your mouse over the identifiers to refresh your memory. Those types are
-essential for establishing the type of `integrate`. 
-
-- By the definition of `UZipper` we know that `l` is a unique list
-  and that `x` is not an element of `l`.
-
-- Thus via the type of `reverse` we know that  `reverse l` is also
-  unique and disjoint from `x` and `r`.
-
-- Finally, using the previously established type for `++` 
-  LiquidHaskell can prove that since `x : r` is a unique 
-  list with elements disjoint from `reverse l` the concatenation
-  of the two lists is also a unique list.
-
-
-With the exact same reasoning, we use the above list operations to create more zipper operations.
-
-Reverse
--------
-
-We can reverse a unique zipper
-
-\begin{code}
-{-@ reverseZipper :: UZipper a -> UZipper a @-}
-reverseZipper :: Zipper a -> Zipper a
-reverseZipper (Zipper t ls rs) = Zipper t rs ls
-\end{code}
-
-Shifting Focus
---------------
-
-More the focus up or down
-
-\begin{code}
-{-@ focusUp   :: UZipper a -> UZipper a @-}
-focusUp (Zipper t [] rs)     = Zipper x xs [] 
-  where 
-    (x:xs)                   = reverse (t:rs)
-
-focusUp (Zipper t (l:ls) rs) = Zipper l ls (t:rs)
-
-{-@ focusDown :: UZipper a -> UZipper a @-}
-focusDown = reverseZipper . focusUp . reverseZipper
-\end{code}
-
-Filter
-------
-
-Finally, using the filter operation on lists allows LiquidHaskell to prove
-that filtering a zipper also preserves uniqueness.
-
-\begin{code}
-{-@ filterZipper :: (a -> Bool) -> UZipper a -> Maybe (UZipper a) @-}
-filterZipper p (Zipper f ls rs) 
-  = case filter p (f:rs) of
-      f':rs' -> Just $ Zipper f' (filter p ls) rs'
-      []     -> case filter p ls of                  
-                  f':ls' -> Just $ Zipper f' ls' []
-                  []     -> Nothing
-\end{code}
-
-Conclusion
-==========
-
-That's all for now! This post illustrated
-
-1. How we can use set theory to express properties the values of the list,
-   such as list uniqueness.
-
-2. How we can use LuquidHaskell to prove that these properties are
-   preserved through list operations.
-
-3. How we can embed this properties in complicated data structures that use
-   lists, such as a zipper.
-
-
-[wiki-zipper]: http://en.wikipedia.org/wiki/Zipper_(data_structure)
-[about-sets]:  blog/2013/03/26/talking-about-sets.lhs/
-[setspec]:     https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/Data/Set.spec
-
-\begin{code}
--- TODO: Dummy function to provide qualifier hint.
-{-@ q :: x:a ->  {v:[a] |(not (Set_mem x (listElts v)))} @-}
-q :: a -> [a]
-q _ = []
-\end{code}
-
-
diff --git a/docs/blog/2013-06-03-abstracting-over-refinements.lhs b/docs/blog/2013-06-03-abstracting-over-refinements.lhs
deleted file mode 100644
--- a/docs/blog/2013-06-03-abstracting-over-refinements.lhs
+++ /dev/null
@@ -1,315 +0,0 @@
----
-layout: post
-title: "Abstracting Over Refinements"
-date: 2013-06-03 16:12
-comments: true
-external-url:
-author: Ranjit Jhala and Niki Vazou 
-published: true 
-categories: abstract-refinements
-demo: absref101.hs
----
-
-We've seen all sorts of interesting invariants that can be expressed with
-refinement predicates. For example, whether a divisor is [non-zero][blog-dbz], 
-the [dimension][blog-len] of lists, ensuring the safety of 
-[vector indices][blog-vec] and reasoning about the [set][blog-set] of values
-in containers and verifying their [uniqueness][blog-zip].
-In each of these cases, we were working with *specific* refinement predicates
-that described whatever property was of interest.
-
-Today, (drumroll please), I want to unveil a brand new feature of
-LiquidHaskell, which allows us to *abstract* over specific properties or
-invariants, which significantly increases the expressiveness of the 
-system, whilst still allowing our friend the SMT solver to carry 
-out verification and inference automatically.
-
-<!-- more -->
-
-\begin{code}
-
-module MickeyMouse where
-
-import Language.Haskell.Liquid.Prelude (isEven)
-\end{code}
-
-Pin The Specification On the Function 
--------------------------------------
-
-Lets look at some tiny *mickey-mouse* examples to see why we may want
-to abstract over refinements in the first place.
-
-Consider the following monomorphic `max` function on `Int` values:
-
-\begin{code}
-maxInt     :: Int -> Int -> Int 
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-\begin{code} We could give `maxInt` many, quite different and incomparable refinement types like
-maxInt :: {v:Int | v >= 0} -> {v:Int | v >= 0} -> {v:Int | v >= 0}
-\end{code}
-
-\begin{code}or
-maxInt :: {v:Int | v < 10} -> {v:Int | v < 10} -> {v:Int | v < 10}
-\end{code}
-
-\begin{code}or even 
-maxInt :: {v:Int | (Even v)} -> {v:Int | (Even v)} -> {v:Int | (Even v)}
-\end{code}
-
-All of the above are valid. 
-
-But which one is the *right* type? 
-
-At this point, you might be exasperated for one of two reasons.
-
-First, the type enthusiasts among you may cry out -- "What? Does this funny
-refinement type system not have **principal types**?"
-
-No. Or, to be precise, of course not!
-
-Principal typing is a lovely feature that is one of the many 
-reasons why Hindley-Milner is such a delightful sweet spot. 
-Unfortunately, the moment one wants fancier specifications 
-one must tearfully kiss principal typing good bye.
-
-Oh well.
-
-Second, you may very well say, "Yes yes, does it even matter? Just pick
-one and get on with it already!"
-
-Unfortunately, it matters quite a bit.
-
-Suppose we had a refined type describing valid RGB values:
-
-\begin{code}
-{-@ type RGB = {v: Int | ((0 <= v) && (v < 256)) } @-}
-\end{code}
-
-Now, if I wrote a function that selected the larger, that is to say, the
-more intense, of two RGB values, I would certainly like to check that it 
-produced an RGB value!
-
-\begin{code}
-{-@ intenser   :: RGB -> RGB -> RGB @-}
-intenser c1 c2 = maxInt c1 c2
-\end{code}
-
-Well, guess what. The first type (with `v >= 0`) one would tell us that 
-the output was non-negative, losing the upper bound. The second type (with
-`v < 10`) would cause LiquidHaskell to bellyache about `maxInt` being 
-called with improper arguments -- muttering darkly that an RGB value 
-is not necesarily less than `10`. As for the third type ... well, you get the idea.
-
-So alas, the choice of type *does* matter. 
-
-\begin{code} If we were clairvoyant, we would give `maxInt` a type like
-maxInt :: RGB -> RGB -> RGB 
-\end{code}
-
-but of course, that has its own issues. ("What? I have to write a
-*separate* function for picking the larger of two *4* digit numbers?!")
-
-Defining Parametric Invariants 
-------------------------------
-
-Lets take a step back from the types, and turn to a spot of handwaving.
-
-What's *really* going on with `maxInt`?
-
-Well, the function returns *one of* its two arguments `x` and `y`. 
-
-This means that if *both* arguments satisfy some property then the output
-*must* satisfy that property, *regardless of what that property was!*
-
-To teach LiquidHaskell to understand this notion of "regardless of
-property" we introduce the idea of **abstracting over refinements**
-or, if you prefer, parameterizing a type over its refinements.
-
-In particular, we type `maxInt` as
-
-\begin{code}
-{-@ maxInt :: forall <p :: Int -> Prop>. Int<p> -> Int<p> -> Int<p>@-}
-\end{code}
-
-Here, the definition says explicitly: *for any property* `p` that is a
-property of `Int`, the function takes two inputs each of which satisfy `p`
-and returns an output that satisfies `p`. That is to say, `Int<p>` is 
-just an abbreviation for `{v:Int | (p v)}`
-
-**Digression: Whither Decidability?** 
-At first glance, it may appear that these abstract `p` have taken us into
-the realm of higher-order logics, where we must leave decidable checking
-and our faithful SMT companion at that door, and instead roll up our 
-sleeves for interactive proofs (not that there's anything wrong with that!) 
-Fortunately, that's not the case. We simply encode abstract refinements `p` 
-as *uninterpreted function symbols* in the refinement logic. 
-
-\begin{code} Uninterpreted functions are special symbols `p` which satisfy only the *congruence axiom*.
-forall X, Y. if (X = Y) then  p(X) = p(Y)
-\end{code}
-
-Happily, reasoning with such uninterpreted functions is quite decidable
-(thanks to Ackermann, yes, *that* Ackermann) and actually rather efficient.
-Thus, via SMT, LiquidHaskell happily verifies that `maxInt` indeed behaves
-as advertised: the input types ensure that both `(p x)` and `(p y)` hold 
-and hence that the returned value in either branch of `maxInt` satisfies 
-the refinement  `{v:Int | p(v)}`, thereby ensuring the output type. 
-
-By the same reasoning, we can define the `maximumInt` operator on lists:
-
-\begin{code}
-{-@ maximumInt :: forall <p :: Int -> Prop>. x:[Int <p>] -> Int <p>@-}
-maximumInt (x:xs) = foldr maxInt x xs
-\end{code}
-
-Using Parametric Invariants
----------------------------
-
-Its only useful to parametrize over invariants if there is some easy way 
-to *instantiate* the parameters. 
-
-Concretely, consider the function:
-
-\begin{code}
-{-@ maxEvens1 :: xs:[Int] -> {v:Int | (Even v)} @-}
-maxEvens1 xs = maximumInt xs''
-  where 
-    xs'      = [ x | x <- xs, isEven x]
-    xs''     = 0 : xs'
-\end{code}
-
-\begin{code} where the function `isEven` is from the Language.Haskell.Liquid.Prelude library:
-{- isEven :: x:Int -> {v:Bool | (Prop(v) <=> (Even x))} -}
-isEven   :: Int -> Bool
-isEven x = x `mod` 2 == 0
-\end{code}
-
-where the predicate `Even` is defined as
-
-\begin{code}
-{-@ predicate Even X = ((X mod 2) = 0) @-}
-\end{code}
-
-To verify that `maxEvens1` returns an even number, LiquidHaskell 
-
-1. infers that the list `(0:xs')` has type `[{v:Int | (Even v)}]`, 
-   that is, is a list of even numbers.
-
-2. automatically instantiates the *refinement* parameter of 
-   `maximumInt` with the concrete refinement `{\v -> (Even v)}` and so
-
-3. concludes that the value returned by `maxEvens1` is indeed `Even`.
-
-Parametric Invariants and Type Classes
---------------------------------------
-
-Ok, lets be honest, the above is clearly quite contrived. After all,
-wouldn't you write a *polymorphic* `max` function? And having done so,
-we'd just get all the above goodness from old fashioned parametricity.
-
-\begin{code} That is to say, if we just wrote:
-max     :: forall a. a -> a -> a 
-max x y = if x > y then x else y
-
-maximum :: forall a. [a] -> a
-maximum (x:xs) = foldr max x xs
-\end{code}
-
-then we could happily *instantiate* the `a` with `{v:Int | v > 0}` or
-`{v:Int | (Even v)}` or whatever was needed at the call-site of `max`.
-Sigh. Perhaps we are still pining for Hindley-Milner.
-
-\begin{code} Well, if this was an ML perhaps we could but in Haskell, the types would be 
-(>)     :: (Ord a) => a -> a -> Bool
-max     :: (Ord a) => a -> a -> a
-maximum :: (Ord a) => [a] -> a
-\end{code}
-
-Our first temptation may be to furtively look over our shoulders, and
-convinced no one was watching, just pretend that funny `(Ord a)` business
-was not there, and quietly just treat `maximum` as `[a] -> a` and summon
-parametricity.
-
-That would be most unwise. We may get away with it with the harmless `Ord` but what of, say, `Num`. 
-
-\begin{code} Clearly a function 
-numCrunch :: (Num a) => [a] -> a
-\end{code}
-
-is not going to necessarily return one of its inputs as an output. 
-Thus, it is laughable to believe that `numCrunch` would, if given 
-a list of  of even (or positive, negative, prime, RGB, ...) integers, 
-return a even (or positive, negative, prime, RGB, ...) integer, since 
-the function might add or subtract or multiply or do other unspeakable
-things to the numbers in order to produce the output value.
-
-And yet, typeclasses are everywhere. 
-
-How could we possibly verify that
-
-\begin{code}
-{-@ maxEvens2 :: xs:[Int] -> {v:Int | (Even v) } @-}
-maxEvens2 xs = maximumPoly xs''
-  where 
-     xs'     = [ x | x <- xs, isEven x]
-     xs''    = 0 : xs'
-\end{code}
-
-where the helpers were in the usual `Ord` style?
-
-\begin{code}
-maximumPoly :: (Ord a) => [a] -> a
-maximumPoly (x:xs) = foldr maxPoly x xs
-
-maxPoly     :: (Ord a) => a -> a -> a 
-maxPoly x y = if x <= y then y else x
-\end{code}
-
-The answer: abstract refinements.
-
-First, via the same analysis as the monomorphic `Int` case, LiquidHaskell
-establishes that
-
-\begin{code}
-{-@ maxPoly :: forall <p :: a -> Prop>. 
-                 (Ord a) => x:a<p> -> y:a<p> -> a<p> @-}
-\end{code}
-
-and hence, that
-
-\begin{code}
-{-@ maximumPoly :: forall <p :: a -> Prop>. 
-                     (Ord a) => x:[a<p>] -> a<p>     @-}
-\end{code}
-
-Second, at the call-site for `maximumPoly` in `maxEvens2` LiquidHaskell 
-instantiates the type variable `a` with `Int`, and the abstract refinement
-parameter `p` with `{\v -> (Even v)}` after which, the verification proceeds 
-as described earlier (for the `Int` case).
-
-And So
-------
-
-If you've courageously slogged through to this point then you've learnt
-that 
-
-1. Sometimes, choosing the right type can be quite difficult! 
-
-2. But fortunately, with *abstract refinements* we needn't choose, but 
-   can write types that are parameterized over the actual concrete 
-   invariants or refinements, which
-
-3. Can be instantiated at the call-sites i.e. users of the functions.
-
-We started with some really frivolous examples, but buckle your seatbelt 
-and hold on tight, because we're going to see some rather nifty things that
-this new technique makes possible, including induction, reasoning about
-memoizing functions, and *ordering* and *sorting* data. Stay tuned.
-
-[blog-dbz]:     /blog/2013/01/01/refinement-types-101.lhs/ 
-[blog-len]:     /blog/2013/01/31/safely-catching-a-list-by-its-tail.lhs/ 
-[blog-vec]:     /blog/2013/03/04/bounding-vectors.lhs/
-[blog-set]:     /blog/2013/03/26/talking/about/sets.lhs/
-[blog-zip]:     /blog/2013/05/16/unique-zipper.lhs/
diff --git a/docs/blog/2013-07-29-putting-things-in-order.lhs b/docs/blog/2013-07-29-putting-things-in-order.lhs
deleted file mode 100644
--- a/docs/blog/2013-07-29-putting-things-in-order.lhs
+++ /dev/null
@@ -1,608 +0,0 @@
----
-layout: post
-title: "Putting Things In Order"
-date: 2013-07-29 16:12
-comments: true
-external-url:
-categories: abstract-refinements
-author: Niki Vazou and Ranjit Jhala
-published: true 
-demo: Order.hs
----
-
-Hello again! Since we last met, much has happened that
-we're rather excited about, and which we promise to get
-to in the fullness of time.
-
-Today, however, lets continue with our exploration of
-abstract refinements. We'll see that this rather innocent 
-looking mechanism packs quite a punch, by showing how 
-it can encode various **ordering** properties of 
-recursive data structures.
-
-<!-- more -->
-
-\begin{code}
-module PuttingThingsInOrder where
-
-import Prelude hiding (break)
-
--- Haskell Type Definitions
-plusOnes                         :: [(Int, Int)]
-insertSort, mergeSort, quickSort :: (Ord a) => [a] -> [a]
-\end{code}
-
-Abstract Refinements
---------------------
-
-\begin{code} Recall that *abstract refinements* are a mechanism that let us write and check types of the form
-maxInt :: forall <p :: Int -> Prop>. Int<p> -> Int<p> -> Int<p>
-\end{code}
-
-which states that the output of `maxInt` preserves 
-*whatever* invariants held for its two inputs as 
-long as both those inputs *also* satisfied those 
-invariants. 
-
-First, lets see how we can (and why we may want to) 
-abstractly refine data types. 
-
-Polymorphic Association Lists
------------------------------
-
-Suppose, we require a type for association lists. 
-Lets define one that is polymorphic over keys `k` 
-and values `v` 
-
-\begin{code}
-data AssocP k v = KVP [(k, v)]
-\end{code}
-
-Now, in a program, you might have multiple association
-lists, whose keys satisfy different properties. 
-For example, we might have a table for mapping digits 
-to the corresponding English string
-
-\begin{code}
-digitsP :: AssocP Int String
-digitsP = KVP [ (1, "one")
-              , (2, "two")
-              , (3, "three") ]
-\end{code}
-
-We could have a separate table for *sparsely* storing 
-the contents of an array of size `1000`.
-
-\begin{code}
-sparseVecP :: AssocP Int Double
-sparseVecP = KVP [ (12 ,  34.1 )
-                 , (92 , 902.83)
-                 , (451,   2.95)
-                 , (877,   3.1 )]
-\end{code}
-
-The **keys** used in the two tables have rather 
-different properties, which we may want to track 
-at compile time.
-
-- In `digitsP` the keys are between `0` and `9` 
-- In `sparseVecP` the keys are between `0` and `999`. 
-
-Well, since we had the foresight to parameterize 
-the key type in `AssocP`, we can express the above 
-properties by appropriately **instantiating** the type
-of `k` with refined versions
-
-\begin{code}
-{-@ digitsP :: AssocP {v:Int | (Btwn 0 v 9)} String @-}
-\end{code}
-
-and 
-
-\begin{code}
-{-@ sparseVecP :: AssocP {v:Int | (Btwn 0 v 1000)} Double @-}
-\end{code}
-
-where `Btwn` is just an alias 
-
-\begin{code}
-{-@ predicate Btwn Lo V Hi = (Lo <= V && V <= Hi) @-}
-\end{code}
-
-Monomorphic Association Lists
------------------------------
-
-Now, suppose that for one reason or another, we want to 
-specialize our association list so that the keys are of 
-type `Int`. 
-
-\begin{code}
-data Assoc v = KV [(Int, v)]
-\end{code}
-
-(We'd probably also want to exploit the `Int`-ness 
-in the implementation but thats a tale for another day.)
-
-Now, we have our two tables
-
-\begin{code}
-digits    :: Assoc String
-digits    = KV [ (1, "one")
-               , (2, "two")
-               , (3, "three") ]
-
-sparseVec :: Assoc Double
-sparseVec = KV [ (12 ,  34.1 )
-               , (92 , 902.83)
-               , (451,   2.95)
-               , (877,   3.1 )]
-\end{code}
-
-but since we didn't make the key type generic, it seems 
-we have no way to distinguish between the invariants of 
-the two sets of keys. Bummer!
-
-Abstractly Refined Data
------------------------
-
-We *could* define *two separate* types of association 
-lists that capture different invariants, but frankly, 
-thats rather unfortunate, as we'd then have to 
-duplicate the code the manipulates the structures. 
-Of course, we'd like to have (type) systems help 
-keep an eye on different invariants, but we'd 
-*really* rather not have to duplicate code to 
-achieve that end. Thats the sort of thing that
-drives a person to JavaScript ;-).
-
-Fortunately, all is not lost. 
-
-If you were paying attention [last time][blog-absref] 
-then you'd realize that this is the perfect job for 
-an abstract refinement, this time applied to a `data` 
-definition:
-
-\begin{code}
-{-@ data Assoc v <p :: Int -> Prop> 
-      = KV (z :: [(Int<p>, v)]) @-} 
-\end{code}
-
-The definition refines the type for `Assoc` to introduce
-an abstract refinement `p` which is, informally speaking,
-a property of `Int`. The definition states that each `Int`
-in the association list in fact satisfies `p` as, `Int<p>`
-is an abbreviation for `{v:Int| (p v)}`.
-
-Now, we can *have* our `Int` keys and *refine* them too!
-For example, we can write:
-
-\begin{code}
-{-@ digits :: Assoc (String) <{\v -> (Btwn 0 v 9)}> @-}
-\end{code}
-
-to track the invariant for the `digits` map, and write
-
-\begin{code}
-{-@ sparseVec :: Assoc Double <{\v -> (Btwn 0 v 1000)}> @-}
-\end{code}
-
-Thus, we can recover (some of) the benefits of abstracting 
-over the type of the key by instead parameterizing the type
-directly over the possible invariants. We will have much 
-[more to say][blog-absref-vec] on association lists 
-(or more generally, finite maps) and abstract refinements, 
-but lets move on for the moment.
-
-Dependent Tuples
-----------------
-
-It is no accident that we have reused Haskell's function 
-type syntax to define abstract refinements (`p :: Int -> Prop`);
-interesting things start to happen if we use multiple parameters.
-
-Consider the function `break` from the Prelude. 
-
-\begin{code}
-break                   :: (a -> Bool) -> [a] -> ([a], [a])
-break _ xs@[]           =  (xs, xs)
-break p xs@(x:xs')
-           | p x        =  ([], xs)
-           | otherwise  =  let (ys, zs) = break p xs' 
-                           in (x:ys,zs)
-\end{code}
-
-From the comments in [Data.List][data-list], `break p xs`: 
-"returns a tuple where the first element is longest prefix (possibly empty)
-`xs` of elements that do not satisfy `p` and second element is the 
-remainder of the list."
-
-We could formalize the notion of the *second-element-being-the-remainder* 
-using sizes. That is, we'd like to specify that the length of the second 
-element equals the length of `xs` minus the length of the first element.  
-That is, we need a way to allow the refinement of the second element to 
-*depend on* the value in the first refinement.
-Again, we could define a special kind of tuple-of-lists-type that 
-has the above property *baked in*, but thats just not how we roll.
-
-\begin{code} Instead, lets use abstract refinements to give us **dependent tuples**
-data (a,b)<p :: a -> b -> Prop> = (x:a, b<p x>) 
-\end{code}
-
-Here, the abstract refinement takes two parameters, 
-an `a` and a `b`. In the body of the tuple, the 
-first element is named `x` and we specify that 
-the second element satisfies the refinement `p x`, 
-i.e. a partial application of `p` with the first element. 
-In other words, the second element is a value of type
-`{v:b | (p x v)}`.
-
-As before, we can instantiate the `p` in *different* ways. 
-For example the whimsical
-
-\begin{code}
-{-@ plusOnes :: [(Int, Int)<{\x1 x2 -> x2 = x1 + 1}>] @-}
-plusOnes = [(0,1), (5,6), (999,1000)]
-\end{code}
-
-and returning to the *remainder* property for  `break` 
-
-\begin{code}
-{-@ break :: (a -> Bool) -> x:[a] 
-          -> ([a], [a])<{\y z -> (Break x y z)}> @-}
-\end{code}
-
-using the predicate alias
-
-\begin{code}
-{-@ predicate Break X Y Z   = (len X) = (len Y) + (len Z) @-}
-\end{code}
-
-
-Abstractly Refined Lists
-------------------------
-
-Right, we've been going on for a bit. Time to put things *in order*.
-
-To recap: we've already seen one way to abstractly refine lists: 
-to recover a *generic* means of refining a *monomorphic* list 
-(e.g. the list of `Int` keys.) However, in that case we were 
-talking about *individual* keys.
-Next, we build upon the dependent-tuples technique we just 
-saw to use abstract refinements to relate *different* 
-elements inside containers.
-
-In particular, we can use them to specify that *every pair* 
-of elements inside the list is related according to some 
-abstract relation `p`. By *instantiating* `p` appropriately,
-we will be able to recover various forms of (dis) order. 
-
-\begin{code} Consider the refined definition of good old Haskell lists:
-data [a] <p :: a -> a -> Prop> where
-  | []  :: [a] <p>
-  | (:) :: h:a -> [a<p h>]<p> -> [a]<p>
-\end{code}
-
-Whoa! Thats a bit of a mouthful. Lets break it down.
-
-* The type is parameterized with a refinement `p :: a -> a -> Prop` 
-  Think of `p` as a *binary relation* over the `a` values comprising
-  the list.
-
-* The empty list `[]` is a `[]<p>`. Clearly, the empty list has no
-  elements whatsoever and so every pair is trivially, or rather, 
-  vacuously related by `p`.
-
-* The cons constructor `(:)` takes a head `h` of type `a` and a tail
-  of `a<p h>` values, each of which is *related to* `h` **and** which 
-  (recursively) are pairwise related `[...]<p>` and returns a list where 
-  *all* elements are pairwise related `[a]<p>`.
-
-Pairwise Related
-----------------
-
-Note that we're being a bit sloppy when we say *pairwise* related.
-
-\begin{code} What we really mean is that if a list
-[x1,...,xn] :: [a]<p>
-\end{code}
-
-then for each `1 <= i < j <= n` we have `(p xi xj)`.
-
-\begin{code} To see why, consider the list
-[x1, x2, x3, ...] :: [a]<p>
-\end{code}
-
-\begin{code} This list unfolds into a head and tail 
-x1                :: a
-[x2, x3,...]      :: [a<p x1>]<p>
-\end{code}
-
-\begin{code} The above tail unfolds into
-x2                :: a<p x1>
-[x3, ...]         :: [a<p x1 && p x2>]<p>
-\end{code}
-
-\begin{code} And finally into 
-x3                :: a<p x1 && p x2>
-[...]             :: [a<p x1 && p x2 && p x3>]<p>
-\end{code}
-
-That is, each element `xj` satisfies the refinement 
-`(p xi xj)` for each `i < j`.
-
-Using Abstractly Refined Lists
-------------------------------
-
-Urgh. *Math is hard!*  
-
-Lets see how we can *program* with these funnily refined lists.
-
-For starters, we can define a few helpful type aliases.
-
-\begin{code}
-{-@ type IncrList a = [a]<{\xi xj -> xi <= xj}> @-}      
-{-@ type DecrList a = [a]<{\xi xj -> xi >= xj}> @-}
-{-@ type UniqList a = [a]<{\xi xj -> xi /= xj}> @-}
-\end{code}
-
-As you might expect, an `IncrList` is a list of values in *increasing* order:
-
-\begin{code}
-{-@ whatGosUp :: IncrList Integer @-}
-whatGosUp = [1,2,3]
-\end{code}
-
-Similarly, a `DecrList` contains its values in *decreasing* order:
-
-\begin{code}
-{-@ mustGoDown :: DecrList Integer @-}
-mustGoDown = [3,2,1]
-\end{code}
-
-My personal favorite though, is a `UniqList` which has *no duplicates*:
-
-\begin{code}
-{-@ noDuplicates :: UniqList Integer @-}
-noDuplicates = [1,3,2]
-\end{code}
-
-Sorting Lists
--------------
-
-Its all very well to *specify* lists with various kinds of invariants. 
-The question is, how easy is it to *establish* these invariants?
-
-Lets find out, by turning inevitably to that staple of all forms of
-formal verification: your usual textbook sorting procedures.
-
-**Insertion Sort**
-
-First up: insertion sort. Well, no surprises here:
-
-\begin{code}
-{-@ insertSort    :: (Ord a) => xs:[a] -> (IncrList a) @-}
-insertSort []     = []
-insertSort (x:xs) = insert x (insertSort xs) 
-\end{code}
-
-The hard work is done by `insert` which places an 
-element into the correct position of a sorted list
-
-\begin{code}
-insert y []     = [y]
-insert y (x:xs) 
-  | y <= x      = y : x : xs 
-  | otherwise   = x : insert y xs
-\end{code}
-
-LiquidHaskell infers that if you give `insert` an element 
-and a sorted list, it returns a sorted list.
-
-\begin{code}
-{-@ insert :: (Ord a) => a -> IncrList a -> IncrList a @-}
-\end{code}
-
-If you prefer the more Haskelly way of writing insertion sort, 
-i.e. with a `foldr`, that works too. Can you figure out why?
-
-\begin{code}
-{-@ insertSort' :: (Ord a) => [a] -> IncrList a @-}
-insertSort' xs  = foldr insert [] xs
-\end{code}
-
-**Merge Sort**
-
-Well, you know the song goes. First, we write a function 
-that **splits** the input into two parts:
-
-\begin{code}
-split          :: [a] -> ([a], [a])
-split (x:y:zs) = (x:xs, y:ys) 
-  where 
-    (xs, ys)   = split zs
-split xs       = (xs, [])
-\end{code}
-
-Then we need a function that **merges** two (sorted) lists
-
-\begin{code}
-merge xs []         = xs
-merge [] ys         = ys
-merge (x:xs) (y:ys) 
-  | x <= y          = x : merge xs (y:ys)
-  | otherwise       = y : merge (x:xs) ys
-\end{code}
-
-LiquidHaskell deduces that if both inputs are 
-ordered, then so is the output.
-
-\begin{code}
-{-@ merge :: (Ord a) => IncrList a 
-                     -> IncrList a 
-                     -> IncrList a 
-  @-}
-\end{code}
-
-Finally, using the above functions we write `mergeSort`:
-
-\begin{code}
-{-@ mergeSort :: (Ord a) => [a] -> IncrList a @-}
-mergeSort []  = []
-mergeSort [x] = [x]
-mergeSort xs  = merge (mergeSort ys) (mergeSort zs) 
-  where 
-    (ys, zs)  = split xs
-\end{code}
-
-Lets see how LiquidHaskell proves the output type. 
-
-+ The first two cases are trivial: for an empty 
-  or singleton list, we can vacuously instantiate 
-  the abstract refinement with *any* concrete 
-  refinement.
-
-+ For the last case, we can inductively assume 
- `mergeSort ys` and `mergeSort zs` are sorted 
-  lists, after which the type inferred for 
-  `merge` kicks in, allowing LiquidHaskell to conclude
-  that the output is also sorted.
-
-**Quick Sort**
-
-The previous two were remarkable because they were, well, quite *unremarkable*. 
-Pretty much the standard textbook implementations work *as is*. 
-Unlike the [classical][omega-sort] [developments][hasochism] 
-using indexed types we don't have to define any auxiliary 
-types for increasing lists, or lists whose value is in a 
-particular range, or any specialized `cons` operators and 
-so on.
-
-With *quick sort* we need to do a tiny bit of work.
-
-
-\begin{code} We would like to define `quickSort` as
-{-@ quickSort'    :: (Ord a) => [a] -> IncrList a @-}
-quickSort' []     = []
-quickSort' (x:xs) = lts ++ (x : gts) 
-  where 
-    lts           = quickSort' [y | y <- xs, y < x]
-    gts           = quickSort' [z | z <- xs, z >= x]
-\end{code}
-
-But, if you try it out, you'll see that LiquidHaskell 
-*does not approve*. What could possibly be the trouble?
-
-The problem lies with *append*. What type do we give `++`? 
-
-\begin{code} We might try something like
-(++) :: IncrList a -> IncrList a -> IncrList a
-\end{code}
-
-\begin{code} but of course, this is bogus, as 
-[1,2,4] ++ [3,5,6]
-\end{code}
-
-is decidedly not an `IncrList`!
-
-Instead, at this particular use of `++`, there is
-an extra nugget of information: there is a *pivot*
-element `x` such that every element in the first 
-argument is less than `x` and every element in 
-the second argument is greater than `x`. 
-
-There is no way we can give the usual append `++` 
-a type that reflects the above as there is no pivot 
-`x` to refer to. Thus, with a heavy heart, we must
-write a specialized pivot-append that uses this fact:
-
-\begin{code}
-pivApp piv []     ys  = piv : ys
-pivApp piv (x:xs) ys  = x   : pivApp piv xs ys
-\end{code}
-
-Now, LiquidHaskell infers that 
-
-\begin{code}
-{-@ pivApp :: piv:a 
-           -> IncrList {v:a | v <  piv} 
-           -> IncrList {v:a | v >= piv} 
-           -> IncrList a 
-  @-}
-\end{code}
-
-And we can use `pivApp` to define `quickSort' simply as:
-
-\begin{code}
-{-@ quickSort    :: (Ord a) => [a] -> IncrList a @-}
-quickSort []     = []
-quickSort (x:xs) = pivApp x lts gts 
-  where 
-    lts          = quickSort [y | y <- xs, y < x ]
-    gts          = quickSort [z | z <- xs, z >= x]
-\end{code}
-
-Really Sorting Lists
---------------------
-
-The convenient thing about our encoding is that the 
-underlying datatype is plain Haskell lists. 
-This yields two very concrete benefits. 
-First, as mentioned before, we can manipulate 
-sorted lists with the same functions we'd use 
-for regular lists.
-Second, by decoupling (or rather, parameterizing)
-the relation or property or invariant from the actual 
-data structure we can plug in different invariants, 
-sometimes in the *same* program.
-
-To see why this is useful, lets look at a *real-world* 
-sorting algorithm: the one used inside GHC's 
-`Data.List` [module][data-list].
-
-\begin{code}
-sort :: (Ord a) => [a] -> [a]
-sort = mergeAll . sequences
-  where
-    sequences (a:b:xs)
-      | a `compare` b == GT = descending b [a]  xs
-      | otherwise           = ascending  b (a:) xs
-    sequences [x] = [[x]]
-    sequences []  = [[]]
-
-    descending a as (b:bs)
-      | a `compare` b == GT = descending b (a:as) bs
-    descending a as bs      = (a:as): sequences bs
-
-    ascending a as (b:bs)
-      | a `compare` b /= GT = ascending b (\ys -> as (a:ys)) bs
-    ascending a as bs       = as [a]: sequences bs
-
-    mergeAll [x] = x
-    mergeAll xs  = mergeAll (mergePairs xs)
-
-    mergePairs (a:b:xs) = merge a b: mergePairs xs
-    mergePairs [x]      = [x]
-    mergePairs []       = []
-\end{code}
-
-The interesting thing about the procedure is that it 
-generates some intermediate lists that are increasing 
-*and* others that are decreasing, and then somehow
-miraculously whips this whirlygig into a single 
-increasing list.
-
-Yet, to check this rather tricky algorithm with 
-LiquidHaskell we need merely write:
-
-\begin{code}
-{-@ sort :: (Ord a) => [a] -> IncrList a  @-}
-\end{code}
-
-
-
-[blog-absref]:     /blog/2013/06/3/abstracting-over-refinements.lhs/
-[blog-absref-vec]: http://goto.ucsd.edu/~rjhala/liquid/abstract_refinement_types.pdf
-[data-list]:        http://www.haskell.org/ghc/docs/latest/html/libraries/base/src/Data-List.html#sort
-[omega-sort]:      http://web.cecs.pdx.edu/~sheard/Code/InsertMergeSort.html
-[hasochism]:       https://personal.cis.strath.ac.uk/conor.mcbride/pub/hasochism.pdf
-
diff --git a/docs/blog/2013-11-23-telling_lies.lhs b/docs/blog/2013-11-23-telling_lies.lhs
deleted file mode 100644
--- a/docs/blog/2013-11-23-telling_lies.lhs
+++ /dev/null
@@ -1,128 +0,0 @@
----
-layout: post
-title: "LiquidHaskell Caught Telling Lies!"
-date: 2013-11-23 16:12
-comments: true
-external-url:
-categories: termination
-author: Ranjit Jhala, Niki Vazou 
-published: true
-demo: TellingLies.hs
----
-
-One crucial goal of a type system is to provide the guarantee, 
-memorably phrased by Milner as *well-typed programs don't go wrong*. 
-The whole point of LiquidHaskell (and related systems) is to provide
-the above guarantee for expanded notions of "going wrong". 
-All this time, we've claimed (and believed) that LiquidHaskell 
-provided such a guarantee.
-
-We were wrong. 
-
-LiquidHaskell tells lies.
-
-<!-- more -->
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-
-module TellingLies where
-
-import Language.Haskell.Liquid.Prelude (liquidError)
-
-divide  :: Int -> Int -> Int
-foo     :: Int -> Int
-explode :: Int
-\end{code}
-
-To catch LiquidHaskell red-handed, we require
-
-1. a notion of **going wrong**,
-2. a **program** that clearly goes wrong, and the smoking gun,
-3. a **lie** from LiquidHaskell that the program is safe.
-
-The Going Wrong
----------------
-
-Lets keep things simple with an old fashioned `div`-ision operator.
-A division by zero would be, clearly *going wrong*.
-
-To alert LiquidHaskell to this possibility, we encode "not going wrong"
-with the precondition that the denominator be  non-zero.
-
-\begin{code}
-{-@ divide :: n:Int -> d:{v:Int | v /= 0} -> Int @-}
-divide n 0 = liquidError "no you didn't!"
-divide n d = n `div` d
-\end{code}
-
-The Program 
------------
-
-Now, consider the function `foo`.
-
-\begin{code}
-{-@ foo :: n:Int -> {v:Nat | v < n} @-}
-foo n | n > 0     = n - 1
-      | otherwise = foo n
-\end{code}
-
-Now, `foo` should only be called with strictly positive values. 
-In which case, the function returns a `Nat` that is strictly 
-smaller than the input. 
-The function diverges when called with `0` or negative inputs. 
-
-Note that the signature of `foo` is slightly different, but 
-nevertheless, legitimate, as *when* the function returns an 
-output, the output is indeed a `Nat` that is *strictly less than* 
-the input parameter `n`. Hence, LiquidHaskell happily checks 
-that `foo` does indeed satisfy its given type.
-
-So far, nothing has gone wrong either in the program, or 
-with LiquidHaskell, but consider this innocent little 
-function:
-
-\begin{code}
-explode = let z = 0
-          in  (\x -> (2013 `divide` z)) (foo z)
-\end{code}
-
-Thanks to *lazy evaluation*, the call to `foo` is ignored,
-and hence evaluating `explode` leads to a crash! Ugh!
-
-The Lie
--------
-
-However, LiquidHaskell produces a polyannish prognosis and 
-cheerfully declares the program *safe*. 
-
-Huh?
-
-Well, LiquidHaskell deduces that
-
-a. `z == 0`  from the binding,
-b. `x : Nat` from the output type for `foo`
-c. `x <  z`  from the output type for `foo`
-
-\begin{code} Of course, no such `x` exists! Or, rather, the SMT solver reasons
-    z == 0 && x >= 0 && x < z  => z /= 0
-\end{code}
-
-as the hypotheses are inconsistent. In other words, LiquidHaskell 
-deduces that the call to `divide` happens in an *impossible* environment,
-i.e. is dead code, and hence, the program is safe.
-
-In our defence, the above, sunny prognosis is not *totally misguided*. 
-Indeed, if Haskell was like ML and had *strict evaluation* then 
-indeed the program would be safe in that we would *not* go wrong 
-i.e. would not crash with a divide-by-zero.  
-
-But of course, thats a pretty lame excuse, since Haskell doesn't have 
-strict semantics. So looks like LiquidHaskell (and hence, we) 
-have been caught red-handed.
-
-Well then, is there a way to prevent LiquidHaskell from telling lies?
-That is, can we get Milner's *well-typed programs don't go wrong* 
-guarantee under lazy evaluation? 
-
-Thankfully, there is.
diff --git a/docs/blog/2013-12-01-getting-to-the-bottom.lhs b/docs/blog/2013-12-01-getting-to-the-bottom.lhs
deleted file mode 100644
--- a/docs/blog/2013-12-01-getting-to-the-bottom.lhs
+++ /dev/null
@@ -1,103 +0,0 @@
----
-layout: post
-title: "Getting To the Bottom of The Lies"
-date: 2013-12-01 16:12
-comments: true
-external-url:
-categories: termination
-author: Ranjit Jhala, Niki Vazou
-published: true
-demo: BasicTermination.hs
----
-
-[Previously][ref-lies], we caught LiquidHaskell telling a lie. Today, lets try to
-get to the bottom of this mendacity, in order to understand how we can ensure
-that it always tells the truth.
-
-<!-- more -->
-
-\begin{code}
-module GettingToTheBottom where
-\end{code}
-The Truth Lies At the Bottom
-----------------------------
-
-To figure out how we might prevent such mendacity, lets try to understand 
-whats really going on. We need to go back to the beginning.
-
-\begin{code} Recall that the refinement type:
-{v:Int | 0 <= v}
-\end{code}
-
-is supposed to denote the set of `Int` values that are greater than `0`.
-
-\begin{code} Consider a function:
-fib :: {n:Int | 0 <= n} -> {v:Int | 0 <= v}
-fib n = e
-\end{code}
-
-Intuitively, the type signature states that when checking the body `e` 
-we can **assume** that `0 <= n`. 
-
-This is indeed the case with **strict** evaluation, as we are guaranteed 
-that `n` will be evaluated before `e`. Thus, either:
-
-1. `n` diverges and so we don't care about `e` as we won't evaluate it, or,
-2. `n` is a non-negative value.
-
-Thus, either way, `e` is only evaluated in a context where `0 <= n`.
-
-But of course, this is not the case with **lazy** evaluation, as we may 
-well start evaluating `e` without evaluating `n`. Indeed, we may *finish*
-evaluating `e` without evaluating `n`. 
-
-Now of course, we know that *if* `n` is evaluated, it will yield a 
-non-negative value, but if it is not (or does not) evaluate to a
-value, we **cannot assume** that the rest of the computation is dead 
-(as with eager evaluation). 
-
-\begin{code} Thus, really with lazy evaluation, the refinement type `{n:Int | 0 <= n}` *actually* means:
-(n = _|_) || (0 <= n)
-\end{code}
-
-Keeping LiquidHaskell Honest
-----------------------------
-
-One approach to forcing LiquidHaskell to telling the truth is to force 
-it to *always* split cases and reason about `_|_`.
-
-\begin{code} Lets revisit `explode`
-explode = let z = 0
-          in  (\x -> 2013 `divide` z) (foo z)
-\end{code}
-
-\begin{code}This prevents the cheerful but bogus prognosis that `explode` above was safe, because the SMT solver cannot prove that at the call to `divide` 
-    z == 0 && (x = _|_ || (x >= 0 && x < z))  => z /= 0
-\end{code}
-
-PIC: PESSIMISTIC-ALWAYS-NO
-
-But alas, this cure is worse than the disease. Effectively it would end up
-lobotomizing LiquidHaskell making it unable to prove even trivial things like:
-
-\begin{code}_
-{-@ trivial    :: x:Int -> y:Int -> {pf: () | x < y} -> Int @-}
-trivial x y pf = liquidAssert (x < y) 10
-\end{code}
-
-\begin{code}as the corresponding SMT query
-    (pf = _|_ || x < y) => (x < y)
-\end{code}
-
-is, thanks to the pesky `_|_`, not valid. 
-
-Terminating The Bottom
-----------------------
-
-Thus, to make LiquidHaskell tell the truth while also not just pessimistically 
-rejecting perfectly good programs, we need a way to get rid of the `_|_`. That 
-is, we require a means of teaching LiquidHaskell to determine when a value
-is *definitely* not bottom. 
-
-In other words, we need to teach LiquidHaskell how to prove that a computation 
-definitely terminates.
diff --git a/docs/blog/2013-12-02-getting-to-the-bottom.lhs b/docs/blog/2013-12-02-getting-to-the-bottom.lhs
deleted file mode 100644
--- a/docs/blog/2013-12-02-getting-to-the-bottom.lhs
+++ /dev/null
@@ -1,103 +0,0 @@
----
-layout: post
-title: "Getting To the Bottom"
-date: 2013-12-02 16:12
-comments: true
-external-url:
-categories: termination
-author: Ranjit Jhala, Niki Vazou
-published: true 
-demo: TellingLies.hs
----
-
-[Previously][ref-lies], we caught LiquidHaskell telling a lie. Today, lets try to
-get to the bottom of this mendacity, in order to understand how we can ensure
-that it always tells the truth.
-
-<!-- more -->
-
-\begin{code}
-module GettingToTheBottom where
-\end{code}
-
-The Truth Lies At the Bottom
-----------------------------
-
-To figure out how we might prevent falsehoods, lets try to understand 
-whats really going on. We need to go back to the beginning.
-
-\begin{code} Recall that the refinement type:
-{v:Int | 0 <= v}
-\end{code}
-
-is supposed to denote the set of `Int` values that are greater than `0`.
-
-\begin{code} Consider a function:
-fib :: {n:Int | 0 <= n} -> {v:Int | 0 <= v}
-fib n = e
-\end{code}
-
-Intuitively, the type signature states that when checking the body `e` 
-we can **assume** that `0 <= n`. 
-
-This is indeed the case with **strict** evaluation, as we are guaranteed 
-that `n` will be evaluated before `e`. Thus, either:
-
-1. `n` diverges and so we don't care about `e` as we won't evaluate it, or,
-2. `n` is a non-negative value.
-
-Thus, either way, `e` is only evaluated in a context where `0 <= n`.
-
-But this is *not* the case with **lazy** evaluation, as we may 
-well start evaluating `e` without evaluating `n`. Indeed, we may
-*finish* evaluating `e` without evaluating `n`. 
-
-Of course, *if* `n` is evaluated, it will yield a non-negative value, 
-but if it is not (or does not) evaluate to a value, we **cannot assume** 
-that the rest of the computation is dead (as with eager evaluation). 
-
-\begin{code} That is, with lazy evaluation, the refinement type `{n:Int | 0 <= n}` *actually* means:
-(n = _|_) || (0 <= n)
-\end{code}
-
-Keeping LiquidHaskell Honest
-----------------------------
-
-One approach to forcing LiquidHaskell to telling the truth is to force 
-it to *always* split cases and reason about `_|_`.
-
-\begin{code} Lets revisit `explode`
-explode = let z = 0
-          in  (\x -> 2013 `divide` z) (foo z)
-\end{code}
-
-\begin{code}The case splitting prevents the cheerful but bogus prognosis that `explode` above was safe, because the SMT solver cannot prove that at the call to `divide` 
-    z == 0 && (x = _|_ || (x >= 0 && x < z))  => z /= 0
-\end{code}
-
-But alas, this cure is worse than the disease. 
-It would end up lobotomizing LiquidHaskell making it unable to prove even trivial things like:
-
-\begin{code}_
-{-@ trivial    :: x:Int -> y:Int -> {pf: () | x < y} -> Int @-}
-trivial x y pf = liquidAssert (x < y) 10
-\end{code}
-
-\begin{code}as the corresponding SMT query
-    (pf = _|_ || x < y) => (x < y)
-\end{code}
-
-is, thanks to the pesky `_|_`, not valid. 
-
-Terminating The Bottom
-----------------------
-
-Thus, to make LiquidHaskell tell the truth while also not just pessimistically 
-rejecting perfectly good programs, we need a way to get rid of the `_|_`. That 
-is, we require a means of teaching LiquidHaskell to determine when a value
-is *definitely* not bottom. 
-
-In other words, we need to teach LiquidHaskell how to prove that a computation 
-definitely terminates.
-
-[ref-lies]:  /blog/2013/11/23/telling_lies.lhs/ 
diff --git a/docs/blog/2013-12-09-checking-termination.lhs b/docs/blog/2013-12-09-checking-termination.lhs
deleted file mode 100644
--- a/docs/blog/2013-12-09-checking-termination.lhs
+++ /dev/null
@@ -1,173 +0,0 @@
----
-layout: post
-title: "Checking Termination"
-date: 2013-12-09 16:12
-comments: true
-external-url:
-categories: termination
-author: Niki Vazou
-published: true 
-demo: Termination.hs
----
-
-As explained in the [last][ref-lies] [two][ref-bottom] posts, we need a termination
-checker to ensure that LiquidHaskell is not tricked by divergent, lazy
-computations into telling lies. Happily, it turns out that with very 
-little retrofitting, and a bit of jiu jitsu, we can use refinements 
-themselves to prove termination!
-
-<!-- more -->
-
-<div class="row-fluid">
-   <div class="span12 pagination-centered">
-       <img src="http://img.dailymail.co.uk/i/pix/2007/06_01/TombstoneSWNS_468x526.jpg"
-       alt="Falling Down" width="300">
-       <br>
-       <br>
-       <br>
-       How do you prove this fellow will <b>stop falling?</b>
-       <br>
-       <br>
-       <br>
-   </div>
-</div>
-
-
-
-\begin{code}
-module Termination where
-
-import Prelude     hiding (sum)
-import Data.Vector hiding (sum)
-\end{code}
-
-Lets first see how LiquidHaskell proves termination on simple 
-recursive functions, and then later, we'll see how to look at 
-fancier cases.
-
-Looping Over Vectors
---------------------
-
-Lets write a bunch of little functions that operate on 1-dimensional vectors
-
-\begin{code}
-type Val = Int
-type Vec = Vector Val
-\end{code}
-
-Next, lets write a simple recursive function that loops over to add up
-the first `n` elements of a vector:
-
-\begin{code}
-sum     :: Vec -> Int -> Val
-sum a 0 = 0
-sum a n = (a ! (n-1)) + sum a (n-1)
-\end{code}
-
-Proving Termination By Hand(waving) 
------------------------------------
-
-Does `sum` terminate? 
-
-First off, it is apparent that if we call `sum` with a
-negative `n` then it **will not** terminate. 
-Thus, we should only call `sum` with non-negative integers.
-
-Fine, lets assume `n` is non-negative. Why then does it terminate?
-
-Intuitively,
-
-1. If `n` is `0` then it trivially returns with the value `0`.
-
-2. If `n` is non-zero, then we recurse *but* with a strictly smaller `n` ...
-
-3. ... but ultimately hit `0` at which point it terminates.
-
-Thus we can, somewhat more formally, prove termination by induction on `n`. 
-
-**Base Case** `n == 0` The function clearly terminates for the base case input of `0`.
-
-**Inductive Hypothesis** Lets assume that `sum` terminates on all `0 <= k < n`.
-
-**Inductive Step** Prove that `sum n` only recursively invokes `sum` with values that
-satisfy the inductive hypothesis and hence, which terminate.
-
-This reasoning suffices to convince ourselves that `sum i` terminates for 
-every natural number `i`. That is, we have shown that `sum` terminates 
-because a *well-founded metric* (i.e., the natural number `i`) is decreasing 
-at each recursive call.
-
-Proving Termination By Types
-----------------------------
-
-We can teach LiquidHaskell to prove termination by applying the same reasoning 
-as above, by rephrasing it in terms of refinement types.
-
-First, we specify that the input is restricted to the set of `Nat`ural numbers
-
-\begin{code}
-{-@ sum :: a:Vec -> {v:Nat | v < (vlen a)} -> Val @-}
-\end{code}
-
-where recall that `Nat` is just the refinement type `{v:Int | v >= 0}`.
-
-Second, we typecheck the *body* of `sum` under an environment that
-restricts `sum` to only be called on inputs less than `n`, i.e. using
-an environment:
-
--  `a   :: Vec`
--  `n   :: Nat`
--  `sum :: Vec -> n':{v:Nat | v < n} -> Val`
-
-This ensures that any (recursive) call in the body only calls `sum` 
-with inputs smaller than the current parameter `n`. Since its body 
-typechecks in this environment, i.e. `sum` is called with `n-1` which 
-is smaller than `n` and, in this case, a `Nat`, LiquidHaskell proves 
-that sum terminates for all `n`.
-
-For those keeping track at home, this is the technique of 
-[sized types](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.124.5589), 
-, expressed using refinements. Sized types themselves are an instance of 
-the classical method of proving termination via well founded metrics that 
-goes back, at least, to [Turing](http://www.turingarchive.org/viewer/?id=462&title=01b).
-
-Choosing the Correct Argument
------------------------------
-
-The example above is quite straightforward, and you might well wonder if this
-method works well for ``real-world" programs. With a few generalizations
-and extensions, and by judiciously using the wealth of information captured in
-refinement types, the answer is an emphatic, yes!
-
-Lets see one extension today.
-
-We saw that liquidHaskell can happily check that some Natural number is decreasing
-at each iteration, but it uses a na&#239;ve heuristic to choose which one -- for
-now, assume that it always chooses *the first* `Int` parameter.
-
-As you might imagine, this is quite simpleminded. 
-
-Consider, a tail-recursive implementation of `sum`:
-
-\begin{code}
-{-@ sum' :: a:Vec -> Val -> {v:Nat| v < (vlen a)} -> Val @-}
-sum' :: Vec -> Val -> Int -> Val
-sum' a acc 0 = acc + a!0 
-sum' a acc n = sum' a (acc + a!n) (n-1)
-\end{code}
-
-Clearly, the proof fails as liquidHaskell wants to prove that the `acc`umulator 
-is a `Nat`ural number that decreases at each iteration, neither of which may be
-true.
-
-\begin{code}The remedy is easy. We can point liquidHaskell to the correct argument `n` using a `Decrease` annotation: 
-{-@ Decrease sum' 3 @-}
-\end{code}
-which directs liquidHaskell to verify that the *third* argument (i.e., `n`) is decreasing. 
-With this hint, liquidHaskell will happily verify that `sum'` is indeed a terminating function.
-
-Thats all for now, next time we'll see how the basic technique can be extended
-to a variety of real-world settings.
-
-[ref-lies]:  /blog/2013/11/23/telling-lies.lhs/ 
-[ref-bottom]: /blog/2013/12/01/getting-to-the-bottom.lhs/
diff --git a/docs/blog/2013-12-14-gcd.lhs b/docs/blog/2013-12-14-gcd.lhs
deleted file mode 100644
--- a/docs/blog/2013-12-14-gcd.lhs
+++ /dev/null
@@ -1,110 +0,0 @@
----
-layout: post
-title: "Termination Requires Refinements"
-date: 2013-12-14 16:12
-comments: true
-external-url:
-categories: termination 
-author: Niki Vazou
-published: true 
-demo: GCD.hs
----
-
-We've seen how, in the presence of [lazy evaluation][ref-lies], refinements
-[require termination][ref-bottom]. [Next][ref-termination], we saw how 
-LiquidHaskell can be used to prove termination. 
-
-Today, lets see how **termination requires refinements**. 
-
-That is, a crucial feature of LiquidHaskell's termination prover is that it is 
-not syntactically driven, i.e. is not limited to say, structural recursion. 
-Instead, it uses the wealth of information captured by refinements that are
-at our disposal, in order to prove termination. 
-
-This turns out to be crucial in practice.
-As a quick toy example -- motivated by a question by [Elias][comment-elias] -- 
-lets see how, unlike purely syntax-directed (structural) approaches, 
-LiquidHaskell proves that recursive functions, such as Euclid's GCD 
-algorithm, terminates.
-
-<!-- more -->
-
-<br>
-<br>
-<br>
-
-<div class="row-fluid">
-  <div class="span12 pagination-centered">
-  <img src="http://faculty.etsu.edu/gardnerr/Geometry-History/Euclid_7-Raphael.jpg"
-       alt="Euclid" width="300">
-       <br>
-       <br>
-       <br>
-       With LiquidHaskell, Euclid wouldn't have had to wave his hands.
-       <br>
-       <br>
-       <br>
-  </div>
-</div>
-
-\begin{code}
-module GCD where
-
-import Prelude hiding (gcd, mod)
-
-mod :: Int -> Int -> Int
-gcd :: Int -> Int -> Int
-\end{code}
-
-The [Euclidean algorithm][ref-euclidean] is one of the oldest numerical algorithms 
-still in common use and calculates the the greatest common divisor (GCD) of two 
-natural numbers `a` and `b`.
-
-Assume that `a > b` and consider the following implementation of `gcd`
-
-\begin{code}
-{-@ gcd :: a:Nat -> b:{v:Nat | v < a} -> Int @-}
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-\end{code}
-
-From our previous post, to prove that `gcd` is terminating, it suffices to prove
-that the first argument decreases as each recursive call.
-
-By `gcd`'s type signature, `a < b` holds at each iteration, thus liquidHaskell 
-will happily discharge the terminating condition.
-
-The only condition left to prove is that `gcd`'s second argument, ie., `a `mod`
-b` is less that `b`. 
-
-This property follows from the behavior of the `mod` operator.
-
-So, to prove `gcd` terminating, liquidHaskell needs a refined signature for 
-`mod` that captures this behavior, i.e., that for any `a` and `b` the value 
-`mod a b` is less than `b`. Fortunately, we can stipulate this via a refined
-type:
-
-\begin{code}
-{-@ mod :: a:Nat -> b:{v:Nat| 0 < v} -> {v:Nat | v < b} @-}
-mod a b
-  | a < b = a
-  | otherwise = mod (a - b) b
-\end{code}
-
-\begin{code}Euclid's original version of `gcd` is different
-gcd' :: Int -> Int -> Int
-gcd' a b | a == b = a
-         | a >  b = gcd' (a - b) b 
-         | a <  b = gcd' a (b - a) 
-\end{code}
-
-Though this version is simpler, turns out that LiquidHaskell needs 
-a more sophisticated mechanism, called **lexicographic ordering**, to 
-prove it terminates. Stay tuned!
-
-
-[ref-euclidean]:    http://en.wikipedia.org/wiki/Euclidean_algorithm
-[ref-termination]:  /blog/2013/12/09/checking-termination.lhs/ 
-[ref-lies]:  /blog/2013/11/23/telling-lies.lhs/ 
-[ref-bottom]: /blog/2013/12/01/getting-to-the-bottom.lhs/
-[comment-elias]: http://goto.ucsd.edu/~rjhala/liquid/haskell/blog/blog/2013/12/09/checking-termination.lhs/#comment-1159606500
diff --git a/docs/blog/2013-12-22-measuring-the-size-of-structures.lhs b/docs/blog/2013-12-22-measuring-the-size-of-structures.lhs
deleted file mode 100644
--- a/docs/blog/2013-12-22-measuring-the-size-of-structures.lhs
+++ /dev/null
@@ -1,184 +0,0 @@
----
-layout: post
-title: "Measuring the size of Structures"
-date: 2013-12-22 16:12
-comments: false
-external-url:
-categories: termination, measures
-author: Niki Vazou
-published: false
-demo: TheSizeOfStructures.hs
----
-
-In the [previous][ref-termination] [two][ref-lexicographic] posts we saw how refinements can be used to prove
-termination. 
-In both posts functions recurse on integers.
-In Haskell the most common type of recursion is over recursive data structures.
-
-Today lets see how to prove termination on functions defined over
-recursive data structures.
-
-<!-- more -->
-
-\begin{code}
-module TheSizeOfStructures where
-
-import Prelude hiding (map)
-\end{code}
-
-Does list map Terminate?
-------------------------
-
-Lets define a `List` structure
-
-\begin{code}
-infixr `C`
-data List a = N | C a (List a)
-\end{code}
-
-and a map function `lmap` on it
-
-\begin{code}
-lmap              :: (a -> b) -> (List a) -> (List b)
-lmap _ N          = N
-lmap f (x `C` xs) = f x `C` lmap f xs
-\end{code}
-
-Does `lmap` terminate?
-
-At each iteration `lmap` is called with the tail of the input list.
-So, the *length* of the list is decreasing at each iteration
-and 
-if the input list is finite, its length will reach `0` and `lmap` will terminate.
-
-Since the length of the list is a natural number, it is
-a *well-founded metric*.
-
-From the [previous][ref-lexicographic] [two][ref-termination] posts a
-well-founded metric that decreases at each iteration is all
-liquidHaskell needs to prove termination on a recursive function.
-
-Two things are left to do: teach liquidHaskell to
-
-1. compute the length of a List
-
-2. use this length as the decreasing metric that decreases in `lmap`.
-
-
-Express Termination Metric
---------------------------
-
-First things first,
-we need to teach liquidHaskell to compute the length of the list.
-
-Remember *measures*?
-They were introduced in a [previous][ref-measure] post and in short measures
-provide a mechanism to define auxiliary properties on data
-values.
-
-Now we can define a measure `llen` than maps a list to its length:
-\begin{code}
-{-@ measure llen  :: (List a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)
-  @-}
-\end{code}
-
-
-and then, inform liquidHaskell that this measure is *well-formed*, ie., cannot
-be negative:
-
-\begin{code}
-{-@ invariant {v:(List a) | (llen v) >= 0}@-}
-\end{code}
-
-
-Relate List with its length
----------------------------
-
-The final step towards verification of `lmap`'s termination is to relate the List
-structure with its length `llen`.
-We can do this with the usual `data` annotation
-
-\begin{code}
-{-@ data List [llen] @-}
-\end{code}
-
-that informs the tool that `llen` measures the size of a list. 
-So each time the termination checker checks if a list is decreasing, it
-checks if its *default* size `llen` decreases. 
-
-
-Choosing the correct argument
------------------------------
-
-To prove termination liquidHaskell chooses one argument and tries to prove that
-is decreasing.
-But which argument? 
-It chooses the first one for which decreasing information exists.
-We have that for an integer to decrease its value should decrease 
-and we specified that a list decreases if its length `llen` decreases.
-
-In `lmap` there is no decreasing information for the function `f`, 
-so liquidHaskell will correclty guess that the list argument (ie., the second
-argument) should be
-decreasing.
-
-In a function that many arguments with decreasing information exist,
-liquidHaskell will na&#239;vely choose the first one.
-
-As an example, the following `posSum` function could not be proven to terminate
-without our `Decrease` hint.
-
-\begin{code}
-{-@ Decrease posSum 2 @-}
-posSum                            :: Int -> (List Int) -> Int
-posSum acc N                      = acc
-posSum acc (x `C` xs) | x > 0     = posSum (acc + x) xs
-                      | otherwise = posSum (acc)     xs
-\end{code}
-
-Standard lists
---------------
-You may think that all this is much work to prove that a function on a recursive
-structure is terminating.
-You have to both define the size of the structure and relate it with the
-structure.
-The good news is that this work is just performed once!
-
-Even better, for structures like standard lists liquidHaskell has done all this
-work for you!
-
-
-\begin{code} The standard list `[a]` comes with the build in measure 'len', defined as
- measure len :: [a] -> Int
- len ([])   = 1
- len (x:xs) = 1 + (len xs)
-\end{code}
-
-Thus liquidHaskell will just prove that functions recursive on standard lists
-shall terminate:
-
-\begin{code}
-map          :: (a -> b) -> [a] -> [b]
-map _ []     = []
-map f (x:xs) = f x : map f xs
-\end{code}
-
-Today we shaw how to prove termination on functions recursive over a data
-structure.
-You need to 
-
-1. define the size of the structure
-
-2. associate this size with the structure.
-
-In the next post, 
-we shall see our final mechanism to prove termination: *decreasing expressions*
-Stay tuned!
-
-[ref-measure]:       /blog/2013/01/31/sately-catching-a-list-by-its-tails.lhs/
-[ref-lies]:          /blog/2013/11/23/telling-lies.lhs/ 
-[ref-bottom]:        /blog/2013/12/01/getting-to-the-bottom.lhs/
-[ref-termination]:   /blog/2013/12/08/termination-checking.lhs/
-[ref-lexicographic]: /blog/2013/12/15/lexicographic-termination.lhs/
diff --git a/docs/blog/2013-12-24-lexicographic-termination.lhs b/docs/blog/2013-12-24-lexicographic-termination.lhs
deleted file mode 100644
--- a/docs/blog/2013-12-24-lexicographic-termination.lhs
+++ /dev/null
@@ -1,125 +0,0 @@
----
-layout: post
-title: "Lexicographic Termination"
-date: 2013-12-15 16:12
-comments: true
-external-url:
-categories: termination, lexicographic ordering
-author: Niki Vazou
-published: true 
-demo: LexicographicTermination.hs
----
-
-[Previously][ref-termination] we saw how refinements can be used to prove termination
-and we promised to extend our termination checker to handle "real-word" programs.
-
-Keeping our promise, today we shall see a trick that allows liquidHaskell to prove termination on
-more recursive functions, namely *lexicographic termination*.
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-module LexicographicTermination where
-
-import Language.Haskell.Liquid.Prelude (liquidError)
-\end{code}
-
-</div>
-
-Does Ackermann Function Terminate?
-----------------------------------
-
-Consider the famous [Ackermann
-function](http://en.wikipedia.org/wiki/Ackermann_function)
-
-\begin{code}
-{-@ ack :: m:Nat -> n:Nat -> Nat @-}
-ack :: Int -> Int -> Int
-ack m n
-    | m == 0          = n + 1
-    | m > 0 && n == 0 = ack (m-1) 1
-    | m > 0 && n >  0 = ack (m-1) (ack m (n-1))
-    | otherwise       = liquidError "Bad arguments!!!"
-\end{code}
-
-Does `ack` terminate?
-
-At each iteration
-
-1. Either `m` decreases, 
-
-2. or `m` remains the same and `n` decreases.
-
-Each time that `n` reaches `0`, `m` decreases, so `m` will
-eventaully reach `0` and `ack` will terminate.
-
-Expressed more technically the pair `(m, n)`
-decreases in the [lexicographic order](htpp://en.wikipedia/wiki/Lexicographic_order)
-on pairs, which is a well-ordering, ie.,
-we cannot go down infinitely many times.
-
-Express Termination Metric
---------------------------
-
-Great! The pair `(m, n)` is a *well-founded metric* on the Ackermann function that decreases.
-From the [previous post][ref-termination] a well-founded metric is all
-liquidHaskell needs to prove termination.
-So, we should feed the tool with this information.
-
-Remember the `Decrease` token?
-We used it [previously][ref-termination]
-to specify which is the decreasing argument.
-Now, we will use it with more arguments to specify 
-our decreasing pair. So,
-
-\begin{code}
-{-@ Decrease ack 1 2 @-}
-\end{code}
-
-says that the decreasing metric is the pair of the first
-and the second arguments, 
-ie., the pair `(m, n)`.
-
-Finally, we will see how liquidHaskell uses this annotation to prove
-termination.
-
-Proving Termination By Types
-----------------------------
-
-Following once more our [previous post][ref-termination],
-liquidHaskell typechecks the *body* of `ack` under an environment that
-restricts `ack` to only be called on inputs *less than* `(m,n)`.
-This time "less than" referes not to ordering on natural numbers, but to lexicographic
-ordering
-, i.e., using
-an environment:
-
--  `m   :: Nat`
--  `n   :: Nat`
--  `ack :: m':Nat -> n':{v:Nat | m' < m || (m' = m && v < n)} -> Nat`
-
-This ensures that any (recursive) call in the body only calls `ack` 
-with inputs smaller than the current parameter `(m, n)`. Since its body 
-typechecks in this environment, i.e. `ack` is called with smaller parameters, LiquidHaskell proves 
-that `ack` terminates.
-
-
-Someone may find the `Decrease` token annoying:
-if we insert another argument we should also update the decrease information.
-LiquidHaskell supports an alternative notation, 
-which lets you annotate the type signature 
-with a list of *decreasing expressions*.
-
-\begin{code} So, `ack` will also typecheck against the signature:
-{-@ ack :: m:Nat -> n:Nat -> Nat / [m, n] @-}
-\end{code}
-
-But what is the syntax of the decreasing expressions?
-Are they restricted to function parameters?
-No, but that is the subject of a next post!
-
-[ref-lies]:        /blog/2013/11/23/telling-lies.lhs/ 
-[ref-bottom]:      /blog/2013/12/01/getting-to-the-bottom.lhs/
-[ref-termination]: /blog/2013/12/08/termination-checking.lhs/
diff --git a/docs/blog/2013-12-29-decreasing-expressions.lhs b/docs/blog/2013-12-29-decreasing-expressions.lhs
deleted file mode 100644
--- a/docs/blog/2013-12-29-decreasing-expressions.lhs
+++ /dev/null
@@ -1,153 +0,0 @@
----
-layout: post
-title: "Decreasing Expressions"
-date: 2013-12-29 16:12
-comments: true
-external-url:
-categories: termination, measures
-author: Niki Vazou
-published: false
-demo: DecreasingExpressions.hs
----
-
-So far we proved that many recursive functions terminate.
-All the functions we used share a characteristic.
-They had (a list of) arguments that were (lexicographically) decreasing.
-
-What if no argument decreases?
-Consider an argument `i` that increases up to a higher value `hi`.
-As `i` increases the difference `hi - i` decreases and will eventually reach
-`0`.
-This difference "witnesses" termination.
-
-Today we will describe 
-the last mechanism liquidHaskell uses to prove termination:
-*decreasing expressions*
-that allow us to annotate functions with termination withnesses.
-
-<!-- more -->
-
-\begin{code}
-module DecreasingExpressions where
-
-range ::          Int -> Int -> [Int]
-merge :: Ord a => [a] -> [a] -> [a]
-\end{code}
-
-Termination on Increasing Arguments
------------------------------------
-
-Consider a `range` function that takes two integers 
-a `lo`wer and a `hi`gher and returns the list `[lo, lo+1, ..., hi-1]`
-
-\begin{code}
-range lo hi | lo < hi   = lo : range (lo + 1) hi
-            | otherwise = []
-\end{code}
-
-Clearly the difference `hi - lo` is decreasing at each iteration and will
-eventually reach `0`.
-That is, `hi - lo` is a *well-founded metric* that decreases.
-[Previously][ref-termination] we discussed that this is exactly what 
-liquidHaksell needs to prove termination.
-
-Sadly, liquidHaskell cannot synthesize this metric.
-But provides a mechanism for the user to specify it.
-With *decreasing expressions*, 
-we can annotate the type of a recursive function
-with the termination witness. Thus
-
-\begin{code}
-{-@ range :: lo:Int -> hi:Int -> [Int] / [(hi - lo)] @-}
-\end{code}
-
-makes liquidHaskell 
-prove that `hi - lo` is a non-negative quantily that decreases at
-each iteration, 
-
-Termination on a Function of the Arguments
-------------------------------------------
-
-Lets illustrate the power of decreasing expressions with a more involved
-example.
-
-Consider the standard `merge` from the homonymous sorting function 
-
-\begin{code}
-merge (x:xs) (y:ys) 
-  | x < y     = x : merge xs     (y:ys)
-  | otherwise = y : merge (x:xs) ys
-\end{code}
-
-Does `merge` terminate?
-Well it does because at each iteration the sum of the lengths of the two
-arguments decreases. 
-Using liquidHaskell's build in [measure][ref-measure] `len`
-to get the length of a list, we can specify 
-`(len xs) + (len ys)`
-as the decreasing expression for `merge`
-
-\begin{code}_
-{-@ merge :: Ord a => xs:[a] -> ys:[a] -> [a] / [(len xs) + (len ys)] @-}
-\end{code}
-
-
-By the way, the power of liquidHaskell does not stop at proving `merge`
-terminating. 
-It extends to proving that given two sorted lists, `merge` will actually return
-a sorted list!
-
-[Some time ago][ref-slist], we represented Sorted Lists as
-\begin{code}
-{-@ type SL a = [a]<{\x v -> x <= v}> @-}
-\end{code}
-
-With this, all we need to prove that sortedness is preserved is to type `merge`
-as
-\begin{code}
-{-@ merge :: Ord a => xs:(SL a) -> ys:(SL a) -> (SL a) 
-           / [(len xs) + (len ys)]                                    @-}
-\end{code}
-
-
-Wrapping Up Termination Checking
---------------------------------
-
-In the last couple of posts, we presented the mechanisms liquidHaskell uses to
-prove termination
-
-- We [started][ref-termination] with functions recursive on some natural namber
-  `i` that served as a decreasing metric to prove termination.
-
-- [Then][ref-lex], we used lexicographic ordering to prove termination on functions where
-  the decreasing metric constists of a list of arguments.
-
-- [After][ref-structures], we saw how to handle recursion on data structures: by proving the size of
-  this structure is decreasing, and
-
-- Today, we saw how to express more complicated decreasing metrics.
-
-Obviously liquidHaskell does not solve the halting problem: there do exist
-terminating functions that cannot be proven terminating.
-Worse, there do exist some cases of non-terminating functions tha fool
-liquidHaskell: 
-for instance, you can trick the tool 
-if you encode termination via [recursive types][ref-rec] or
-[references][ref-ref].
-We aim to soon address such corner cases.
-
-We claim that the above mechanisms suffice to prove 
-termination on numerous functions.
-Even *mutually recursive* ones, as we shall soon see.
-
-
-
-[ref-ref]:          https://github.com/ucsd-progsys/liquidhaskell/blob/master/tests/todo/Recursion1.hs
-[ref-rec]:          http://en.wikipedia.org/wiki/Fixed-point_combinator#Example_of_encoding_via_recursive_types 
-[ref-lies]:        /blog/2013/11/23/telling-lies.lhs/ 
-[ref-bottom]:      /blog/2013/12/01/getting-to-the-bottom.lhs/
-[ref-termination]: /blog/2013/12/08/termination-checking.lhs/
-[ref-lex]:         /blog/2013/12/15/lexicographic-termination.lhs/
-[ref-structures]:  /blog/2013/12/22/measuring-the-size-of-structures.lhs/
-[ref-measure]:     /blog/2013/01/31/safely-catching-a-list-by-its-tail.lhs/
-[ref-slist]:       /blog/2013/07/29/putting-things-in-order.lhs/
diff --git a/docs/blog/2014-02-11-the-advantage-of-measures.lhs b/docs/blog/2014-02-11-the-advantage-of-measures.lhs
deleted file mode 100644
--- a/docs/blog/2014-02-11-the-advantage-of-measures.lhs
+++ /dev/null
@@ -1,375 +0,0 @@
----
-layout: post
-title: "The Advantage of Measures"
-date: 2014-02-11
-author: Eric Seidel
-published: true
-comments: true
-external-url:
-categories: basic measures
----
-
-Yesterday someone asked on [Reddit][] how one might define GHC's [OrdList][] 
-in a way that statically enforces its three key invariants. The accepted
-solution required rewriting `OrdList` as a `GADT` indexed by a proof of
-*emptiness* (which is essentially created by a run-time check), and used
-the new Closed Type Families extension in GHC 7.8 to define a type-level 
-join of the Emptiness index.
-
-Today, let's see a somewhat more direct way of tackling this problem in 
-LiquidHaskell, in which we need not change a single line of code 
-(well.. maybe one), and need not perform any dynamic checks. 
-
-<!-- more -->
-
-<div class="hidden">
-\begin{code}
-module OrdList(
-    OrdList, 
-        nilOL, isNilOL, unitOL, appOL, consOL, snocOL, concatOL,
-        mapOL, fromOL, toOL, foldrOL, foldlOL, foldr', concatOL'
-) where
-
-infixl 5  `appOL`
-infixl 5  `snocOL`
-infixr 5  `consOL`
--- UGH parsing issues...
-{-@
-data OrdList [olen] a = None
-                      | One  (x  :: a)
-                      | Many (xs :: ListNE a)
-                      | Cons (x  :: a)           (xs :: OrdList a)
-                      | Snoc (xs :: OrdList a)   (x  :: a)
-                      | Two  (x  :: OrdListNE a) (y  :: OrdListNE a)
-@-}
-\end{code}
-</div>
-
-The OrdList Type
-----------------
-
-The `OrdList` type is defined as follows:
-
-\begin{code}
-data OrdList a
-  = None
-  | One a
-  | Many [a]        -- Invariant: non-empty
-  | Cons a (OrdList a)
-  | Snoc (OrdList a) a
-  | Two (OrdList a) -- Invariant: non-empty
-        (OrdList a) -- Invariant: non-empty
-\end{code}
-
-As indicated by the comments the key invariants are that:
-
-* `Many` should take a *non-empty* list,
-* `Two` takes two non-empty `OrdList`s. 
-
-What is a Non-Empty OrdList?
-----------------------------
-
-To proceed, we must tell LiquidHaskell what non-empty means. We do this
-with a [measure][] that describes the *number of elements* in a structure.
-When this number is strictly positive, the structure is non-empty.
-
-\begin{code} We've previously seen how to measure the size of a list.
-measure len :: [a] -> Int
-len ([])   = 0
-len (x:xs) = 1 + (len xs)
-\end{code}
-
-We can use the same technique to measure the size of an `OrdList`.
-
-\begin{code}
-{-@ measure olen :: OrdList a -> Int
-    olen (None)      = 0
-    olen (One x)     = 1
-    olen (Many xs)   = (len xs)
-    olen (Cons x xs) = 1 + (olen xs)
-    olen (Snoc xs x) = 1 + (olen xs)
-    olen (Two x y)   = (olen x) + (olen y)
-  @-}
-
-{-@ invariant {v:OrdList a | (olen v) >= 0} @-}
-\end{code}
-
-Now, we can use the measures to define aliases for **non-empty** lists and `OrdList`s.
-
-\begin{code}
-{-@ type ListNE    a = {v:[a]       | (len v)  > 0} @-}
-{-@ type OrdListNE a = {v:OrdList a | (olen v) > 0} @-}
-\end{code}
-
-Capturing the Invariants In a Refined Type
-------------------------------------------
-
-Let's return to the original type, and refine it with the above non-empty
-variants to specify the invariants as
-\begin{code} part of the data declaration
-{-@ data OrdList [olen] a
-      = None
-      | One  (x  :: a)
-      | Many (xs :: ListNE a)
-      | Cons (x  :: a)           (xs :: OrdList a)
-      | Snoc (xs :: OrdList a)   (x  :: a)
-      | Two  (x  :: OrdListNE a) (y  :: OrdListNE a)
-  @-}
-\end{code}
-
-Notice immediately that LiquidHaskell can use the refined definition to warn us 
-about malformed `OrdList` values.
-
-\begin{code}
-ok     = Many [1,2,3]
-bad    = Many []
-badder = Two None ok
-\end{code}
-
-All of the above are accepted by GHC, but only the first one is actually a valid
-`OrdList`. Happily, LiquidHaskell will reject the latter two, as they violate
-the invariants.
-
-
-Basic Functions
----------------
-
-Now let's look at some of the functions!
-
-First, we'll define a handy alias for `OrdList`s of a given size:
-
-\begin{code}
-{-@ type OrdListN a N = {v:OrdList a | (olen v) = N} @-}
-\end{code}
-
-Now, the `nilOL` constructor returns an empty `OrdList`:
-
-\begin{code}
-{-@ nilOL :: OrdListN a {0} @-}
-nilOL = None
-\end{code}
-
-the `unitOL` constructor returns an `OrdList` with one element:
-
-\begin{code}
-{-@ unitOL :: a -> OrdListN a {1} @-}
-unitOL as = One as
-\end{code}
-
-and `snocOL` and `consOL` return outputs with precisely one more element:
-
-\begin{code}
-{-@ snocOL :: xs:OrdList a -> a -> OrdListN a {1 + (olen xs)} @-}
-snocOL as b = Snoc as b
-
-{-@ consOL :: a -> xs:OrdList a -> OrdListN a {1 + (olen xs)} @-}
-consOL a bs = Cons a bs
-\end{code}
-
-**Note:** The `OrdListN a {e}` syntax just lets us use LiquidHaskell 
-expressions `e` as a parameter to the type alias `OrdListN`.
-
-
-<div class="hidden">
-\begin{code}
-{-@ isNilOL :: xs:OrdList a -> {v:Bool | ((Prop v) <=> ((olen xs) = 0))} @-}
-isNilOL None = True
-isNilOL _    = False
-\end{code}
-</div>
-
-Appending `OrdList`s
---------------------
-
-The above functions really aren't terribly interesting, however, since their 
-types fall right out of the definition of `olen`. 
-
-So how about something that takes a little thinking?
-
-\begin{code}
-{-@ appOL :: xs:OrdList a -> ys:OrdList a
-          -> OrdListN a {(olen xs) + (olen ys)}
-  @-}
-None  `appOL` b     = b
-a     `appOL` None  = a
-One a `appOL` b     = Cons a b
-a     `appOL` One b = Snoc a b
-a     `appOL` b     = Two a b
-\end{code}
-
-`appOL` takes two `OrdList`s and returns a list whose length is the **sum of** 
-the two input lists. The most important thing to notice here is that we haven't 
-had to insert any extra checks in `appOL`, unlike the [GADT][] solution. 
-
-LiquidHaskell uses the definition of `olen` to infer that in the last case of 
-`appOL`, `a` and `b` *must be non-empty*, so they are valid arguments to `Two`.
-
-We can prove other things about `OrdList`s as well, like the fact
-that converting an `OrdList` to a Haskell list preserves length
-
-\begin{code}
-{-@ toOL :: xs:[a] -> OrdListN a {(len xs)} @-}
-toOL [] = None
-toOL xs = Many xs
-\end{code}
-
-as does mapping over an `OrdList`
-
-\begin{code}
-{-@ mapOL :: (a -> b) -> xs:OrdList a -> OrdListN b {(olen xs)} @-}
-mapOL _ None        = None
-mapOL f (One x)     = One (f x)
-mapOL f (Cons x xs) = Cons (f x) (mapOL f xs)
-mapOL f (Snoc xs x) = Snoc (mapOL f xs) (f x)
-mapOL f (Two x y)   = Two (mapOL f x) (mapOL f y)
-mapOL f (Many xs)   = Many (map f xs)
-\end{code}
-
-as does converting a Haskell list to an `OrdList`.
-
-\begin{code}
-{-@ type ListN a N = {v:[a] | (len v) = N} @-}
-
-{-@ fromOL :: xs:OrdList a -> ListN a {(olen xs)} @-}
-fromOL a = go a []
-  where
-    {-@ go :: xs:_ -> ys:_
-           -> {v:_ | (len v) = (olen xs) + (len ys)}
-      @-}
-    go None       acc = acc
-    go (One a)    acc = a : acc
-    go (Cons a b) acc = a : go b acc
-    go (Snoc a b) acc = go a (b:acc)
-    go (Two a b)  acc = go a (go b acc)
-    go (Many xs)  acc = xs ++ acc
-\end{code}
-
-<div class="hidden">
-though for this last one we actually need to provide an explicit
-qualifier, which we haven't really seen so far. Can anyone guess why?
-
-\begin{code}
-{-@ qualif Go(v:List a, xs:OrdList a, ys:List a):
-      (len v) = (olen xs) + (len ys)
-  @-}
-\end{code}
-
-The answer is that the return type of `go` must refer to the length
-of the `OrdList` that it's folding over *as well as* the length of
-the accumulator `acc`! We haven't written a refinement like that in
-any of our type signatures in this module, so LiquidHaskell doesn't
-know to guess that type.
-</div>
-
-There's nothing super interesting to say about the `foldOL`s but I'll
-include them here for completeness' sake.
-
-\begin{code}
-foldrOL :: (a->b->b) -> b -> OrdList a -> b
-foldrOL _ z None        = z
-foldrOL k z (One x)     = k x z
-foldrOL k z (Cons x xs) = k x (foldrOL k z xs)
-foldrOL k z (Snoc xs x) = foldrOL k (k x z) xs
-foldrOL k z (Two b1 b2) = foldrOL k (foldrOL k z b2) b1
-foldrOL k z (Many xs)   = foldr k z xs
-
-foldlOL :: (b->a->b) -> b -> OrdList a -> b
-foldlOL _ z None        = z
-foldlOL k z (One x)     = k z x
-foldlOL k z (Cons x xs) = foldlOL k (k z x) xs
-foldlOL k z (Snoc xs x) = k (foldlOL k z xs) x
-foldlOL k z (Two b1 b2) = foldlOL k (foldlOL k z b1) b2
-foldlOL k z (Many xs)   = foldl k z xs
-\end{code}
-
-
-Concatenatation: Nested Measures
---------------------------------
-
-Now, the astute readers will have probably noticed that I'm missing 
-one function, `concatOL`, which glues a list of `OrdList`s into a 
-single long `OrdList`.
-
-With LiquidHaskell we can give `concatOL` a super precise type, which 
-states that the size of the output list equals the *sum-of-the-sizes* 
-of the input `OrdLists`.
-
-\begin{code}
-{-@ concatOL :: xs:[OrdList a] -> OrdListN a {(olens xs)} @-}
-concatOL []       = None
-concatOL (ol:ols) = ol `appOL` concatOL ols
-\end{code}
-
-The notion of *sum-of-the-sizes* of the input lists is specifed by the measure
-
-\begin{code}
-{-@ measure olens :: [OrdList a] -> Int
-    olens ([])     = 0
-    olens (ol:ols) = (olen ol) + (olens ols)
-  @-}
-
-{-@ invariant {v:[OrdList a] | (olens v) >= 0} @-}
-\end{code}
-
-LiquidHaskell is happy to verify the above signature, again without 
-requiring any explict proofs. 
-
-Conclusion
-----------
-
-The above illustrates the flexibility provided by LiquidHaskell *measures*.
-
-Instead of having to bake particular invariants into a datatype using indices
-or phantom types (as in the [GADT][] approach), we are able to split our 
-properties out into independent *views* of the datatype, yielding an approach
-that is more modular as 
-
-* we didn't have to go back and change the definition of `[]` to talk about `OrdList`s,
-* we didn't have to provide explict non-emptiness witnesses,
-* we obtained extra information about the behavior of API functions like `concatOL`.
-
-
-<div class="hidden">
-We can actually even verify the original definition of `concatOL` with a
-clever use of *abstract refinements*, but we have to slightly change
-the signature of `foldr`.
-
-\begin{code}
-{- UGH CAN'T PARSE `GHC.Types.:`...
-foldr' :: forall <p :: [a] -> b -> Prop>.
-          (xs:[a] -> x:a -> b<p xs> -> b<p (GHC.Types.: x xs)>)
-       -> b<p GHC.Types.[]>
-       -> ys:[a]
-       -> b<p ys>
-@-}
-foldr' f z []     = z
-foldr' f z (x:xs) = f xs x (foldr' f z xs)
-\end{code}
-
-We've added a *ghost parameter* to the folding function, letting us
-refer to the tail of the list at each folding step. This lets us
-encode inductive reasoning in the type of `foldr`, specifically that
-
-1. given a base case `z` that satisfies `p []`
-2. and a function that, given a value that satisfies `p xs`, returns
-a value satisfying `p (x:xs)`
-3. the value returned by `foldr f z ys` must satisfy `p ys`!
-
-LiquidHaskell can use this signature, instantiating `p` with `\xs
--> {v:OrdList a | (olen v) = (olens xs)}` to prove the original
-definition of `concatOL`!
-
-\begin{code}
-{- concatOL' :: xs:[OrdList a] -> OrdListN a {(olens xs)} @-}
-concatOL' aas = foldr' (const appOL) None aas
-\end{code}
-
-We haven't added the modified version of `foldr` to the LiquidHaskell
-Prelude yet because it adds the ghost variable to the Haskell
-type-signature.
-</div>
-
-[GADT]: http://www.reddit.com/r/haskell/comments/1xiurm/how_to_define_append_for_ordlist_defined_as_gadt/cfbrinr
-[Reddit]: http://www.reddit.com/r/haskell/comments/1xiurm/how_to_define_append_for_ordlist_defined_as_gadt/
-[OrdList]: http://www.haskell.org/platform/doc/2013.2.0.0/ghc-api/OrdList.html
-[measure]: http://goto.ucsd.edu/~rjhala/liquid/haskell/blog/blog/2013/01/31/safely-catching-a-list-by-its-tail.lhs/
diff --git a/docs/blog/2014-02-16-text-read.lhs b/docs/blog/2014-02-16-text-read.lhs
deleted file mode 100644
--- a/docs/blog/2014-02-16-text-read.lhs
+++ /dev/null
@@ -1,345 +0,0 @@
----
-layout: post
-title: "Text Read"
-date: 2014-02-16
-comments: true
-external-url:
-author: Eric Seidel
-published: false
-categories: benchmarks, text
-demo: TextRead.hs
----
-
-Welcome back! Last time we left off on a bit of a cliffhanger with the
-`unstream` example. Remember, the issue we found was that some `Char`s
-can't fit into a single `Word16`, so the safety of a write depends not
-only on the *index*, but also on the *value* being written! Before we
-can resolve this issue with `unstream` we'll have to learn about
-UTF-16, so let's take a short detour and look at how one *consumes* a
-`Text`.
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-{-# LANGUAGE BangPatterns, CPP, MagicHash, Rank2Types,
-    RecordWildCards, UnboxedTuples, ExistentialQuantification #-}
-{-@ LIQUID "--no-termination" @-}
-module TextRead where
-
-import GHC.Base hiding (unsafeChr)
-import GHC.ST
-import GHC.Word (Word16(..))
-import Data.Bits hiding (shiftL)
-import Data.Word
-
-import Language.Haskell.Liquid.Prelude
-
-
---------------------------------------------------------------------------------
---- From TextInternal
---------------------------------------------------------------------------------
-
-{-@ shiftL :: i:Nat -> n:Nat -> {v:Nat | ((n = 1) => (v = (i * 2)))} @-}
-shiftL :: Int -> Int -> Int
-shiftL = undefined -- (I# x#) (I# i#) = I# (x# `iShiftL#` i#)
-
-{-@ data Array = Array { aBA  :: ByteArray#
-                       , aLen :: Nat 
-                       } 
-  @-}
-
-data Array = Array {
-    aBA  :: ByteArray#
-  , aLen :: !Int
-  }
-
-{-@ measure alen     :: Array -> Int
-    alen (Array a n) = n
-  @-}
-
-{-@ aLen :: a:Array -> {v:Nat | v = (alen a)}  @-}
-
-{-@ type ArrayN  N   = {v:Array | (alen v) = N} @-}
-
-{-@ type AValidI A   = {v:Nat | v     <  (alen A)} @-}
-{-@ type AValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type AValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-{-@ data MArray s = MArray { maBA  :: MutableByteArray# s
-                           , maLen :: Nat } @-}
-
-data MArray s = MArray {
-    maBA  :: MutableByteArray# s
-  , maLen :: !Int
-  }
-
-{-@ measure malen :: MArray s -> Int
-    malen (MArray a n) = n
-  @-}
-
-{-@ maLen :: a:MArray s -> {v:Nat | v = (malen a)}  @-}
-
-{-@ type MArrayN s N = {v:MArray s | (malen v) = N} @-}
-
-{-@ type MAValidO MA = {v:Nat | v <= (malen MA)} @-}
-
-{-@ new :: forall s. n:Nat -> ST s (MArrayN s n) @-}
-new          :: forall s. Int -> ST s (MArray s)
-new n
-  | n < 0 || n .&. highBit /= 0 = error $ "Data.Text.Array.new: size overflow"
-  | otherwise = ST $ \s1# ->
-       case newByteArray# len# s1# of
-         (# s2#, marr# #) -> (# s2#, MArray marr# n #)
-  where !(I# len#) = bytesInArray n
-        highBit    = maxBound `xor` (maxBound `shiftR` 1)
-        bytesInArray n = n `shiftL` 1
-
-{-@ unsafeFreeze :: ma:MArray s -> ST s (ArrayN (malen ma)) @-}
-unsafeFreeze :: MArray s -> ST s Array
-unsafeFreeze MArray{..} = ST $ \s# ->
-                          (# s#, Array (unsafeCoerce# maBA) maLen #)
-
-{-@ unsafeIndex :: a:Array -> AValidI a -> Word16 @-}
-unsafeIndex  :: Array -> Int -> Word16
-unsafeIndex Array{..} i@(I# i#)
-  | i < 0 || i >= aLen = liquidError "out of bounds"
-  | otherwise = case indexWord16Array# aBA i# of
-                  r# -> (W16# r#)
-
-data Text = Text Array Int Int
-{-@ data Text [tlen] = Text (tarr :: Array)
-                            (toff :: TValidO tarr)
-                            (tlen :: TValidL toff tarr)
-  @-}
-
-{-@ type TValidI T   = {v:Nat | v     <  (tlen T)} @-}
-{-@ type TValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type TValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-
---------------------------------------------------------------------------------
---- Helpers
---------------------------------------------------------------------------------
-
-{-@ invariant {v:Text | (tlength v) = (numchars (tarr v) (toff v) (tlen v))} @-}
-
-{-@ axiom_lead_surr :: x:Word16 -> a:Array -> o:Nat -> l:Nat -> i:Nat
-                  -> {v:Bool | ((Prop v) <=> (if (55296 <= x && x <= 56319)
-                                              then (SpanChar 2 a o l i)
-                                              else (SpanChar 1 a o l i)))}
-  @-}
-axiom_lead_surr :: Word16 -> Array -> Int -> Int -> Int -> Bool
-axiom_lead_surr = undefined
-
-{-@ empty :: {v:Text | (tlen v) = 0} @-}
-empty :: Text
-empty = Text arrEmpty 0 0
-  where
-    {-@ arrEmpty :: (ArrayN {0}) @-}
-    arrEmpty = runST $ new 0 >>= unsafeFreeze
-
-unsafeChr :: Word16 -> Char
-unsafeChr (W16# w#) = C# (chr# (word2Int# w#))
-
-chr2 :: Word16 -> Word16 -> Char
-chr2 (W16# a#) (W16# b#) = C# (chr# (upper# +# lower# +# 0x10000#))
-    where
-      !x# = word2Int# a#
-      !y# = word2Int# b#
-      !upper# = uncheckedIShiftL# (x# -# 0xD800#) 10#
-      !lower# = y# -# 0xDC00#
-
-{-@ qualif Min(v:int, t:Text, i:int):
-      (if ((tlength t) < i)
-       then ((numchars (tarr t) (toff t) v) = (tlength t))
-       else ((numchars (tarr t) (toff t) v) = i))
-  @-}
-
-{-@ qualif NumChars(v:int, t:Text, i:int): v = (numchars (tarr t) (toff t) i) @-}
-
-{-@ qualif TLengthLE(v:int, t:Text): v <= (tlength t) @-}
-
-\end{code}
-
-</div>
-
-Let's begin with a simple example, `unsafeHead`.
-
-\begin{code}
-{-@ type TextNE = {v:Text | (tlen v) > 0} @-}
-
-{-@ unsafeHead :: TextNE -> Char @-}
-unsafeHead :: Text -> Char
-unsafeHead (Text arr off _len)
-    | m < 0xD800 || m > 0xDBFF = unsafeChr m
-    | otherwise                = chr2 m n
-    where m = unsafeIndex arr off
-          n = unsafeIndex arr (off+1)
-\end{code}
-
-LiquidHaskell can prove the first `unsafeIndex` is safe because the
-precondition states that the `Text` must not be empty, i.e. `_len > 0`
-must hold. Combine this with the core `Text` invariant that
-`off + _len <= alen arr` and we get that `off < alen arr`, which satisfies
-the precondition for `unsafeIndex`.
-
-However, the same calculation *fails* for the second index because we
-can't prove that `off + 1 < alen arr`. The solution is going to
-require some understanding of UTF-16, so let's take a brief detour.
-
-The UTF-16 standard represents all code points below `U+10000` with a
-single 16-bit word; all others are split into two 16-bit words, known
-as a *surrogate pair*. The first word, or *lead*, is guaranteed to be
-in the range `[0xD800, 0xDBFF]` and the second, or *trail*, is
-guaranteed to be in the range `[0xDC00, 0xDFFF]`.
-
-Armed with this knowledge of UTF-16 we can return to
-`unsafeHead`. Note the case-split on `m`, which determines whether `m`
-is a lead surrogate. If `m` is a lead surrogate then we know there
-must be a trail surrogate at `off+1`; we can define a specialized
-version of `unsafeIndex` that encodes this domain knowledge.
-
-\begin{code}
-{-@ unsafeIndexF :: a:Array -> o:AValidO a -> l:AValidL o a
-                 -> i:{v:Nat | (o <= v && v < (o + l))}
-                 -> {v:Word16 | (if (55296 <= v && v <= 56319)
-                                 then (SpanChar 2 a o l i)
-                                 else (SpanChar 1 a o l i))}
-  @-}
-unsafeIndexF :: Array -> Int -> Int -> Int -> Word16
-unsafeIndexF a o l i = let x = unsafeIndex a i
-                       in liquidAssume (axiom_lead_surr x a o l i) x
-\end{code}
-
-Our variant `unsafeIndexF` (F as in "forward") takes an array, an
-offset, and a length (which together must form a valid `Text`); a
-valid index into the `Text`; and returns a `Word16` with an
-interesting type. The best way to read this type would be "if `v` is
-in the range `[0xD800, 0xDBFF]`, then the character that starts at
-index `i` in the array `a` spans two slots, otherwise it only spans
-one slot." Intuitively, we know what it means for a character to span
-`n` slots, but LiquidHaskell needs to know three things:
-
-1. `a[o:i+n]` contains one more character than `a[o:i]` (borrowing
-   Python's wonderful slicing syntax)
-2. `a[o:i+n]` contains no more characters than `a[o:l]`
-3. `i-o+n <= l`
-
-2 and 3 encode the well-formedness of a `Text` value, i.e. `i+1`
-*must* be a valid index if a lead surrogate is at index `i`.
-
-We can encode these properties in the refinement logic as follows.
-
-\begin{code}
-{-@ measure numchars :: Array -> Int -> Int -> Int @-}
-{-@ predicate SpanChar N A O L I =
-      (((numchars (A) (O) ((I-O)+N)) = (1 + (numchars (A) (O) (I-O))))
-    && ((numchars (A) (O) ((I-O)+N)) <= (numchars A O L))
-    && (((I-O)+N) <= L))
-  @-}
-\end{code}
-
-The `numchars` measure takes an array, an offset, and a length
-(e.g. the `arr`, `off`, and `len` fields of a `Text`) and denotes the
-number of characters contained in the `length` slots beginning at
-`offset`. Since we can't compute this in the refinement logic, we
-leave the measure abstract. We can, however, provide LiquidHaskell
-with a few invariants about the behavior of `numchars`, specifically
-that (1) `numchars` always returns a `Nat`, (2) there are no
-characters contained in a empty span, and (3) there are at most as
-many characters as words in a `Text`. We encode these using a special
-`invariant` annotation.
-
-\begin{code}
-{-@ invariant {v:Text | (numchars (tarr v) (toff v) (tlen v)) >= 0}        @-}
-{-@ invariant {v:Text | (numchars (tarr v) (toff v) 0)         = 0}        @-}
-{-@ invariant {v:Text | (numchars (tarr v) (toff v) (tlen v)) <= (tlen v)} @-}
-\end{code}
-
-Finally returning to `unsafeHead`, we can use `unsafeIndexF` to
-strengthen the inferred type for `m`. LiquidHaskell can now prove that
-the second `unsafeIndex` is in fact safe, because it is only demanded
-if `m` is a lead surrogate.
-
-\begin{code}
-{-@ unsafeHead' :: TextNE -> Char @-}
-unsafeHead' :: Text -> Char
-unsafeHead' (Text arr off _len)
-    | m < 0xD800 || m > 0xDBFF = unsafeChr m
-    | otherwise                = chr2 m n
-    where m = unsafeIndexF arr off _len off
-          {-@ LAZYVAR n @-}
-          n = unsafeIndex arr (off+1)
-\end{code}
-
-The `LAZYVAR` annotation is currently required because LiquidHaskell
-doesn't know that `n` will only be demanded in one branch; one can
-imagine a transformation that would push the `where` bindings inward
-to the use-site, which would alleviate this issue.
-
-Before signing off, let's take a look at a slightly more interesting
-function, `take`.
-
-\begin{code}
-{-@ take :: n:Nat -> t:Text -> {v:Text | (Min (tlength v) (tlength t) n)} @-}
-take :: Int -> Text -> Text
-take n t@(Text arr off len)
-    | n <= 0    = empty
-    | n >= len  = t
-    | otherwise = Text arr off (loop 0 0)
-  where
-     loop !i !cnt
-          | i >= len || cnt >= n = i
-          | otherwise            = let d = iter_ t i
-                                   in loop (i+d) (cnt+1)
-\end{code}
-
-`take` gets a `Nat` and a `Text`, and returns a `Text` that contains
-the first `n` characters of `t`. That is, unless `n >= tlength t`, in
-which case it just returns `t`.
-
-`tlength` is a simple wrapper around `numchars`.
-
-\begin{code}
-{-@ measure tlength :: Text -> Int
-    tlength (Text a o l) = (numchars a o l)
-  @-}
-\end{code}
-
-The bulk of the work is done by the
-inner `loop`, which has to track the current index `i` and the number
-of characters we have seen, `cnt`. `loop` uses an auxiliary function
-`iter_` to determine the *width* of the character that starts at `i`,
-bumps `cnt`, and recursively calls itself at `i+d` until it either
-reaches the end of `t` or sees `n` characters, returning the final
-index.
-
-The `iter_` function is quite simple, it just determines whether the
-word at index `i` is a lead surrogate, and returns the appropriate
-span.
-
-\begin{code}
-{-@ predicate SpanCharT N T I =
-      (SpanChar N (tarr T) (toff T) (tlen T) ((toff T)+I))
-  @-}
-
-{-@ iter_ :: t:Text -> i:TValidI t
-          -> {v:Nat | (SpanCharT v t i)}
-  @-}
-iter_ :: Text -> Int -> Int
-iter_ (Text arr off len) i
-    | m < 0xD800 || m > 0xDBFF = 1
-    | otherwise                = 2
- where m = unsafeIndexF arr off len (off+i)
-\end{code}
-
-Again, we use `unsafeIndexF` to learn more about the structure of `t`
-by observing a small piece of it. It's also worth noting that we've
-encoded all of the domain knowledge we need into a single function,
-which has the benefit of letting us focus our attention on one type
-when we try to ensure that we've encoded it correctly.
-
-Next time, we'll continue our exploration of `text` and see how to
-construct a `Text` while ensuring the absence of out-of-bounds writes.
diff --git a/docs/blog/2014-02-23-text-write.lhs b/docs/blog/2014-02-23-text-write.lhs
deleted file mode 100644
--- a/docs/blog/2014-02-23-text-write.lhs
+++ /dev/null
@@ -1,323 +0,0 @@
----
-layout: post
-title: "Text Write"
-date: 2014-02-23
-comments: true
-external-url:
-author: Eric Seidel
-published: false
-categories: benchmarks, text
-demo: TextWrite.hs
----
-
-Last time, we showed how to reason about Unicode and a variable-width
-encoding of `Char`s when consuming a `Text` value, today we'll look at
-the same issue from the perspective of *building* a `Text`.
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-{-# LANGUAGE BangPatterns, CPP, MagicHash, Rank2Types,
-    RecordWildCards, UnboxedTuples, ExistentialQuantification #-}
-{-@ LIQUID "--no-termination" @-}
-module TextWrite where
-
-import Control.Monad.ST.Unsafe (unsafeIOToST)
-import Foreign.C.Types (CSize)
-import GHC.Base hiding (unsafeChr)
-import GHC.ST
-import GHC.Word (Word16(..))
-import Data.Bits hiding (shiftL)
-import Data.Word
-
-import Language.Haskell.Liquid.Prelude
-
---------------------------------------------------------------------------------
---- From TextInternal
---------------------------------------------------------------------------------
-
-{-@ shiftL :: i:Nat -> n:Nat -> {v:Nat | ((n = 1) => (v = (i * 2)))} @-}
-shiftL :: Int -> Int -> Int
-shiftL = undefined -- (I# x#) (I# i#) = I# (x# `iShiftL#` i#)
-
-{-@ measure isUnknown :: Size -> Prop
-    isUnknown (Exact n) = false
-    isUnknown (Max   n) = false
-    isUnknown (Unknown) = true
-  @-}
-{-@ measure getSize :: Size -> Int
-    getSize (Exact n) = n
-    getSize (Max   n) = n
-  @-}
-
-{-@ invariant {v:Size | (getSize v) >= 0} @-}
-
-data Size = Exact {-# UNPACK #-} !Int -- ^ Exact size.
-          | Max   {-# UNPACK #-} !Int -- ^ Upper bound on size.
-          | Unknown                   -- ^ Unknown size.
-            deriving (Eq, Show)
-
-{-@ upperBound :: k:Nat -> s:Size -> {v:Nat | v = ((isUnknown s) ? k : (getSize s))} @-}
-upperBound :: Int -> Size -> Int
-upperBound _ (Exact n) = n
-upperBound _ (Max   n) = n
-upperBound k _         = k
-
-data Step s a = Done
-              | Skip !s
-              | Yield !a !s
-
-data Stream a =
-    forall s. Stream
-    (s -> Step s a)             -- stepper function
-    !s                          -- current state
-    !Size                       -- size hint
-
-{-@ data Array = Array { aBA  :: ByteArray#
-                       , aLen :: Nat 
-                       } 
-  @-}
-
-data Array = Array {
-    aBA  :: ByteArray#
-  , aLen :: !Int
-  }
-
-{-@ measure alen     :: Array -> Int
-    alen (Array a n) = n
-  @-}
-
-{-@ aLen :: a:Array -> {v:Nat | v = (alen a)}  @-}
-
-{-@ type ArrayN  N   = {v:Array | (alen v) = N} @-}
-
-{-@ type AValidI A   = {v:Nat | v     <  (alen A)} @-}
-{-@ type AValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type AValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-{-@ data MArray s = MArray { maBA  :: MutableByteArray# s
-                           , maLen :: Nat } @-}
-
-data MArray s = MArray {
-    maBA  :: MutableByteArray# s
-  , maLen :: !Int
-  }
-
-{-@ measure malen :: MArray s -> Int
-    malen (MArray a n) = n
-  @-}
-
-{-@ maLen :: a:MArray s -> {v:Nat | v = (malen a)}  @-}
-
-{-@ type MArrayN s N = {v:MArray s | (malen v) = N} @-}
-
-{-@ type MAValidI MA = {v:Nat | v <  (malen MA)} @-}
-{-@ type MAValidO MA = {v:Nat | v <= (malen MA)} @-}
-
-{-@ new :: forall s. n:Nat -> ST s (MArrayN s n) @-}
-new          :: forall s. Int -> ST s (MArray s)
-new n
-  | n < 0 || n .&. highBit /= 0 = error $ "Data.Text.Array.new: size overflow"
-  | otherwise = ST $ \s1# ->
-       case newByteArray# len# s1# of
-         (# s2#, marr# #) -> (# s2#, MArray marr# n #)
-  where !(I# len#) = bytesInArray n
-        highBit    = maxBound `xor` (maxBound `shiftR` 1)
-        bytesInArray n = n `shiftL` 1
-
-{-@ unsafeWrite :: ma:MArray s -> MAValidI ma -> Word16 -> ST s () @-}
-unsafeWrite  :: MArray s -> Int -> Word16 -> ST s ()
-unsafeWrite MArray{..} i@(I# i#) (W16# e#)
-  | i < 0 || i >= maLen = liquidError "out of bounds"
-  | otherwise = ST $ \s1# ->
-      case writeWord16Array# maBA i# e# s1# of
-        s2# -> (# s2#, () #)
-
-{-@ copyM :: dest:MArray s 
-          -> didx:MAValidO dest
-          -> src:MArray s 
-          -> sidx:MAValidO src
-          -> {v:Nat | (((didx + v) <= (malen dest))
-                    && ((sidx + v) <= (malen src)))}
-          -> ST s ()
-  @-}
-copyM        :: MArray s               -- ^ Destination
-             -> Int                    -- ^ Destination offset
-             -> MArray s               -- ^ Source
-             -> Int                    -- ^ Source offset
-             -> Int                    -- ^ Count
-             -> ST s ()
-copyM dest didx src sidx count
-    | count <= 0 = return ()
-    | otherwise =
-    liquidAssert (sidx + count <= maLen src) .
-    liquidAssert (didx + count <= maLen dest) .
-    unsafeIOToST $ memcpyM (maBA dest) (fromIntegral didx)
-                           (maBA src) (fromIntegral sidx)
-                           (fromIntegral count)
-
-{-@ memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO () @-}
-memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO ()
-memcpyM = undefined
-
-{-@ unsafeFreeze :: ma:MArray s -> ST s (ArrayN (malen ma)) @-}
-unsafeFreeze :: MArray s -> ST s Array
-unsafeFreeze MArray{..} = ST $ \s# ->
-                          (# s#, Array (unsafeCoerce# maBA) maLen #)
-
-{-@ unsafeIndex :: a:Array -> AValidI a -> Word16 @-}
-unsafeIndex  :: Array -> Int -> Word16
-unsafeIndex Array{..} i@(I# i#)
-  | i < 0 || i >= aLen = liquidError "out of bounds"
-  | otherwise = case indexWord16Array# aBA i# of
-                  r# -> (W16# r#)
-
-data Text = Text Array Int Int
-{-@ data Text [tlen] = Text (tarr :: Array)
-                            (toff :: TValidO tarr)
-                            (tlen :: TValidL toff tarr)
-  @-}
-
-{-@ type TValidI T   = {v:Nat | v     <  (tlen T)} @-}
-{-@ type TValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type TValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-
---------------------------------------------------------------------------------
---- From TextRead
---------------------------------------------------------------------------------
-
-{-@ measure numchars :: Array -> Int -> Int -> Int @-}
-{-@ measure tlength :: Text -> Int @-}
-{-@ invariant {v:Text | (tlength v) = (numchars (tarr v) (toff v) (tlen v))} @-}
-
---------------------------------------------------------------------------------
---- Helpers
---------------------------------------------------------------------------------
-
-{-@ qualif Ord(v:int, i:int, x:Char)
-        : ((((ord x) <  65536) => (v = i))
-        && (((ord x) >= 65536) => (v = (i + 1))))
-  @-}
-
-\end{code}
-
-</div>
-
-We mentioned previously that `text` uses stream fusion to optimize
-multiple loops over a `Text` into a single loop; as a result many of
-the top-level API functions are simple wrappers around equivalent
-functions over `Stream`s. The creation of `Text` values is then
-largely handled by a single function, `unstream`, which converts a
-`Stream` into a `Text`.
-
-\begin{code}
-unstream :: Stream Char -> Text
-unstream (Stream next0 s0 len) = runST $ do
-  let mlen = upperBound 4 len
-  arr0 <- new mlen
-  let outer arr top = loop
-       where
-        loop !s !i =
-            case next0 s of
-              Done          -> do
-                arr' <- unsafeFreeze arr
-                return $! Text arr' 0 i
-              Skip s'       -> loop s' i
-              Yield x s'
-                | j >= top  -> do
-                  let top' = (top + 1) `shiftL` 1
-                  arr' <- new top'
-                  copyM arr' 0 arr 0 top
-                  outer arr' top' s i
-                | otherwise -> do
-                  d <- writeChar arr i x
-                  loop s' (i+d)
-                where j | ord x < 0x10000 = i
-                        | otherwise       = i + 1
-  outer arr0 mlen s0 0
-\end{code}
-
-Since we're focusing on memory safety here we won't go into detail
-about how `Stream`s work. Let's instead jump right into the inner
-`loop` and look at the `Yield` case. Here we need to write a char `x`
-into `arr`, so we compute the maximal index `j` to which we will
-write -- i.e. if `x >= U+10000` then `j = i + 1` -- and determine
-whether we can safely write at `j`. If the write is unsafe we have to
-allocate a larger array before continuing, otherwise we write `x` and
-increment `i` by `x`s width.
-
-Since `writeChar` has to handle writing *any* Unicode value, we need
-to assure it that there will always be room to write `x` into `arr`,
-regardless of `x`s width. Indeed, this is expressed in the type we
-give to `writeChar`.
-
-\begin{code}
-{-@ writeChar :: ma:MArray s -> i:Nat -> {v:Char | (Room v ma i)}
-              -> ST s {v:Nat | (RoomN v ma i)}
-  @-}
-\end{code}
-
-The predicate aliases `Room` and `RoomN` express that a character can
-fit in the array at index `i` and that there are at least `n` slots
-available starting at `i` respectively.
-
-\begin{code}
-{-@ predicate Room C MA I = (((One C) => (RoomN 1 MA I))
-                          && ((Two C) => (RoomN 2 MA I)))
-  @-}
-{-@ predicate RoomN N MA I = (I+N <= (malen MA)) @-}
-\end{code}
-
-The `One` and `Two` predicates express that a character will be
-encoded in one or two 16-bit words, by reasoning about its ordinal
-value.
-
-\begin{code}
-{-@ predicate One C = ((ord C) <  65536) @-}
-{-@ predicate Two C = ((ord C) >= 65536) @-}
-\end{code}
-
-As with `numchars`, we leave `ord` abstract, but inform LiquidHaskell
-that the `ord` *function* does in fact return the ordinal value of the
-character.
-
-\begin{code}
-{-@ measure ord :: Char -> Int @-}
-{-@ ord :: c:Char -> {v:Int | v = (ord c)} @-}
-\end{code}
-
-Since `writeChar` assumes that it will never be called unless there is room to
-write `c`, it is safe to just split `c` into 16-bit words and write them into
-the array.
-
-\begin{code}
-writeChar :: MArray s -> Int -> Char -> ST s Int
-writeChar marr i c
-    | n < 0x10000 = do
-        unsafeWrite marr i (fromIntegral n)
-        return 1
-    | otherwise = do
-        unsafeWrite marr i lo
-        unsafeWrite marr (i+1) hi
-        return 2
-    where n = ord c
-          m = n - 0x10000
-          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
-          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
-\end{code}
-
-In typical design-by-contract style, we're putting the burden of proof to
-establish safety on `writeChar`s caller. Now, scroll back up to
-`unstream` and mouse over `j` to see its inferred type.
-\begin{code} You should see something like
-{v:Int | ((ord x >= 65536) => (v == i+1))
-      && ((ord x <  65536) => (v == i))}
-\end{code}
-which, combined with the case-split on `j >= top`, provides the proof that
-writing `x` will be safe!
-
-Stay tuned, next time we'll look at another example of building a `Text` where
-LiquidHaskell fails to infer this crucial refinement...
diff --git a/docs/blog/2014-03-01-text-bug.lhs b/docs/blog/2014-03-01-text-bug.lhs
deleted file mode 100644
--- a/docs/blog/2014-03-01-text-bug.lhs
+++ /dev/null
@@ -1,333 +0,0 @@
----
-layout: post
-title: "Text Bug"
-date: 2014-03-01
-comments: true
-external-url:
-author: Eric Seidel
-published: false
-categories: benchmarks, text
-demo: TextBug.hs
----
-
-For our last post on `text`, we return to the topic of building a new `Text`
-value, i.e. proving the safety of write operations.
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-{-# LANGUAGE BangPatterns, CPP, MagicHash, Rank2Types,
-    RecordWildCards, UnboxedTuples, ExistentialQuantification #-}
-{-@ LIQUID "--no-termination" @-}
-module TextBug where
-
-import Control.Monad.ST.Unsafe (unsafeIOToST)
-import Foreign.C.Types (CSize)
-import GHC.Base hiding (unsafeChr)
-import GHC.ST
-import GHC.Word (Word16(..))
-import Data.Bits hiding (shiftL)
-import Data.Word
-
-import Language.Haskell.Liquid.Prelude
-
---------------------------------------------------------------------------------
---- From TextInternal
---------------------------------------------------------------------------------
-
-{-@ shiftL :: i:Nat -> n:Nat -> {v:Nat | ((n = 1) => (v = (i * 2)))} @-}
-shiftL :: Int -> Int -> Int
-shiftL = undefined -- (I# x#) (I# i#) = I# (x# `iShiftL#` i#)
-
-{-@ measure isUnknown :: Size -> Prop
-    isUnknown (Exact n) = false
-    isUnknown (Max   n) = false
-    isUnknown (Unknown) = true
-  @-}
-{-@ measure getSize :: Size -> Int
-    getSize (Exact n) = n
-    getSize (Max   n) = n
-  @-}
-
-{-@ invariant {v:Size | (getSize v) >= 0} @-}
-
-data Size = Exact {-# UNPACK #-} !Int -- ^ Exact size.
-          | Max   {-# UNPACK #-} !Int -- ^ Upper bound on size.
-          | Unknown                   -- ^ Unknown size.
-            deriving (Eq, Show)
-
-{-@ upperBound :: k:Nat -> s:Size -> {v:Nat | v = ((isUnknown s) ? k : (getSize s))} @-}
-upperBound :: Int -> Size -> Int
-upperBound _ (Exact n) = n
-upperBound _ (Max   n) = n
-upperBound k _         = k
-
-data Step s a = Done
-              | Skip !s
-              | Yield !a !s
-
-data Stream a =
-    forall s. Stream
-    (s -> Step s a)             -- stepper function
-    !s                          -- current state
-    !Size                       -- size hint
-
-{-@ data Array = Array { aBA  :: ByteArray#
-                       , aLen :: Nat 
-                       } 
-  @-}
-
-data Array = Array {
-    aBA  :: ByteArray#
-  , aLen :: !Int
-  }
-
-{-@ measure alen     :: Array -> Int
-    alen (Array a n) = n
-  @-}
-
-{-@ aLen :: a:Array -> {v:Nat | v = (alen a)}  @-}
-
-{-@ type ArrayN  N   = {v:Array | (alen v) = N} @-}
-
-{-@ type AValidI A   = {v:Nat | v     <  (alen A)} @-}
-{-@ type AValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type AValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-{-@ data MArray s = MArray { maBA  :: MutableByteArray# s
-                           , maLen :: Nat } @-}
-
-data MArray s = MArray {
-    maBA  :: MutableByteArray# s
-  , maLen :: !Int
-  }
-
-{-@ measure malen :: MArray s -> Int
-    malen (MArray a n) = n
-  @-}
-
-{-@ maLen :: a:MArray s -> {v:Nat | v = (malen a)}  @-}
-
-{-@ type MArrayN s N = {v:MArray s | (malen v) = N} @-}
-
-{-@ type MAValidI MA = {v:Nat | v <  (malen MA)} @-}
-{-@ type MAValidO MA = {v:Nat | v <= (malen MA)} @-}
-
-{-@ new :: forall s. n:Nat -> ST s (MArrayN s n) @-}
-new          :: forall s. Int -> ST s (MArray s)
-new n
-  | n < 0 || n .&. highBit /= 0 = error $ "Data.Text.Array.new: size overflow"
-  | otherwise = ST $ \s1# ->
-       case newByteArray# len# s1# of
-         (# s2#, marr# #) -> (# s2#, MArray marr# n #)
-  where !(I# len#) = bytesInArray n
-        highBit    = maxBound `xor` (maxBound `shiftR` 1)
-        bytesInArray n = n `shiftL` 1
-
-{-@ unsafeWrite :: ma:MArray s -> MAValidI ma -> Word16 -> ST s () @-}
-unsafeWrite  :: MArray s -> Int -> Word16 -> ST s ()
-unsafeWrite MArray{..} i@(I# i#) (W16# e#)
-  | i < 0 || i >= maLen = liquidError "out of bounds"
-  | otherwise = ST $ \s1# ->
-      case writeWord16Array# maBA i# e# s1# of
-        s2# -> (# s2#, () #)
-
-{-@ copyM :: dest:MArray s 
-          -> didx:MAValidO dest
-          -> src:MArray s 
-          -> sidx:MAValidO src
-          -> {v:Nat | (((didx + v) <= (malen dest))
-                    && ((sidx + v) <= (malen src)))}
-          -> ST s ()
-  @-}
-copyM        :: MArray s               -- ^ Destination
-             -> Int                    -- ^ Destination offset
-             -> MArray s               -- ^ Source
-             -> Int                    -- ^ Source offset
-             -> Int                    -- ^ Count
-             -> ST s ()
-copyM dest didx src sidx count
-    | count <= 0 = return ()
-    | otherwise =
-    liquidAssert (sidx + count <= maLen src) .
-    liquidAssert (didx + count <= maLen dest) .
-    unsafeIOToST $ memcpyM (maBA dest) (fromIntegral didx)
-                           (maBA src) (fromIntegral sidx)
-                           (fromIntegral count)
-
-{-@ memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO () @-}
-memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO ()
-memcpyM = undefined
-
-{-@ unsafeFreeze :: ma:MArray s -> ST s (ArrayN (malen ma)) @-}
-unsafeFreeze :: MArray s -> ST s Array
-unsafeFreeze MArray{..} = ST $ \s# ->
-                          (# s#, Array (unsafeCoerce# maBA) maLen #)
-
-{-@ unsafeIndex :: a:Array -> AValidI a -> Word16 @-}
-unsafeIndex  :: Array -> Int -> Word16
-unsafeIndex Array{..} i@(I# i#)
-  | i < 0 || i >= aLen = liquidError "out of bounds"
-  | otherwise = case indexWord16Array# aBA i# of
-                  r# -> (W16# r#)
-
-data Text = Text Array Int Int
-{-@ data Text [tlen] = Text (tarr :: Array)
-                            (toff :: TValidO tarr)
-                            (tlen :: TValidL toff tarr)
-  @-}
-
-{-@ type TValidI T   = {v:Nat | v     <  (tlen T)} @-}
-{-@ type TValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type TValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-
---------------------------------------------------------------------------------
---- From TextRead
---------------------------------------------------------------------------------
-
-{-@ measure numchars :: Array -> Int -> Int -> Int @-}
-{-@ measure tlength :: Text -> Int @-}
-{-@ invariant {v:Text | (tlength v) = (numchars (tarr v) (toff v) (tlen v))} @-}
-
---------------------------------------------------------------------------------
---- From TextWrite
---------------------------------------------------------------------------------
-
-{-@ qualif Ord(v:int, i:int, x:Char)
-        : ((((ord x) <  65536) => (v = i))
-        && (((ord x) >= 65536) => (v = (i + 1))))
-  @-}
-
-{-@ predicate Room C MA I = (((One C) => (RoomN 1 MA I))
-                          && ((Two C) => (RoomN 2 MA I)))
-  @-}
-{-@ predicate RoomN N MA I = (I+N <= (malen MA)) @-}
-
-{-@ measure ord :: Char -> Int @-}
-{-@ ord :: c:Char -> {v:Int | v = (ord c)} @-}
-{-@ predicate One C = ((ord C) <  65536) @-}
-{-@ predicate Two C = ((ord C) >= 65536) @-}
-
-{-@ writeChar :: ma:MArray s -> i:Nat -> {v:Char | (Room v ma i)}
-              -> ST s {v:Nat | (RoomN v ma i)}
-  @-}
-writeChar :: MArray s -> Int -> Char -> ST s Int
-writeChar marr i c
-    | n < 0x10000 = do
-        unsafeWrite marr i (fromIntegral n)
-        return 1
-    | otherwise = do
-        unsafeWrite marr i lo
-        unsafeWrite marr (i+1) hi
-        return 2
-    where n = ord c
-          m = n - 0x10000
-          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
-          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
-
---------------------------------------------------------------------------------
---- Helpers
---------------------------------------------------------------------------------
-
-{-@ qualif MALenLE(v:int, a:MArray s): v <= (malen a) @-}
-{-@ qualif ALenLE(v:int, a:Array): v <= (alen a) @-}
-
-\end{code}
-
-</div>
-
-Let's take a look at `mapAccumL`, which combines a map and a fold
-over a `Stream` and bundles the result of the map into a new `Text`.
-Again, we'll want to focus our attention on the `Yield` case of the
-inner loop.
-
-\begin{code}
-mapAccumL f z0 (Stream next0 s0 len) =
-  (nz, Text na 0 nl)
- where
-  mlen = upperBound 4 len
-  (na,(nz,nl)) = runST $ do
-       (marr,x) <- (new mlen >>= \arr ->
-                    outer arr mlen z0 s0 0)
-       arr      <- unsafeFreeze marr
-       return (arr,x)
-  outer arr top = loop
-   where
-    loop !z !s !i =
-      case next0 s of
-        Done          -> return (arr, (z,i))
-        Skip s'       -> loop z s' i
-        Yield x s'
-          | j >= top  -> do
-            let top' = (top + 1) `shiftL` 1
-            arr' <- new top'
-            copyM arr' 0 arr 0 top
-            outer arr' top' z s i
-          | otherwise -> do
-            let (z',c) = f z x
-            d <- writeChar arr i c
-            loop z' s' (i+d)
-          where j | ord x < 0x10000 = i
-                  | otherwise       = i + 1
-\end{code}
-
-If you recall `unstream` from last time, you'll notice that this loop body
-looks almost identical to the one found in `unstream`, but LiquidHaskell has
-flagged the `writeChar` call as unsafe! What's going on here?
-
-Let's take a look at `j`, recalling that it carried a crucial part of the safety
-\begin{code} proof last time, and see what LiquidHaskell was able to infer.
-{v:Int | ((ord x >= 65536) => (v == i+1))
-      && ((ord x <  65536) => (v == i))}
-\end{code}
-
-Well that's not very useful at all! LiquidHaskell can prove that it's safe to
-write `x` but here we are trying to write `c` into the array. This is actually
-a *good* thing though, because `c` is the result of calling an arbitrary
-function `f` on `x`! We haven't constrained `f` in any way, so it could easily
-return a character above `U+10000` given any input.
-
-So `mapAccumL` is actually *unsafe*, and our first wild bug caught by
-LiquidHaskell! The fix is luckily easy, we simply have to lift the
-`let (z',c) = f z x` binder into the `where` clause, and change `j` to
-depend on `ord c` instead.
-
-\begin{code}
-mapAccumL' f z0 (Stream next0 s0 len) =
-  (nz, Text na 0 nl)
- where
-  mlen = upperBound 4 len
-  (na,(nz,nl)) = runST $ do
-       (marr,x) <- (new mlen >>= \arr ->
-                    outer arr mlen z0 s0 0)
-       arr      <- unsafeFreeze marr
-       return (arr,x)
-  outer arr top = loop
-   where
-    loop !z !s !i =
-      case next0 s of
-        Done          -> return (arr, (z,i))
-        Skip s'       -> loop z s' i
-        Yield x s'
-          | j >= top  -> do
-            let top' = (top + 1) `shiftL` 1
-            arr' <- new top'
-            copyM arr' 0 arr 0 top
-            outer arr' top' z s i
-          | otherwise -> do
-            d <- writeChar arr i c
-            loop z' s' (i+d)
-          where (z',c) = f z x
-                j | ord c < 0x10000 = i
-                  | otherwise       = i + 1
-\end{code}
-
-LiquidHaskell happily accepts our revised `mapAccumL`, as did the `text`
-maintainers.
-
-We hope you've enjoyed this whirlwind tour of using LiquidHaskell to verify
-production code, we have many more examples in the `benchmarks` folder of
-our GitHub repository for the intrepid reader.
diff --git a/docs/blog/2014-05-28-pointers-gone-wild.lhs b/docs/blog/2014-05-28-pointers-gone-wild.lhs
deleted file mode 100644
--- a/docs/blog/2014-05-28-pointers-gone-wild.lhs
+++ /dev/null
@@ -1,467 +0,0 @@
----
-layout: post
-title: "Pointers Gone Wild"
-date: 2014-05-28
-comments: true
-external-url:
-author: Eric Seidel
-published: true
-categories: benchmarks, text
-demo: TextInternal.hs
----
-
-A large part of the allure of Haskell is its elegant, high-level ADTs
-that ensure[^compilercorrectness] that programs won't be plagued by problems
-like the infamous [SSL heartbleed bug](http://en.wikipedia.org/wiki/Heartbleed).
-
-[^compilercorrectness]: Assuming the absence of errors in the compiler and run-time...
-
-However, another part of Haskell's charm is that when you really really 
-need to, you can drop down to low-level pointer twiddling to squeeze the 
-most performance out of your machine. But of course, that opens the door 
-to the #heartbleeds.
-
-Can we have have our cake and eat it too? 
-
-Can we twiddle pointers and still get the nice safety assurances of high-level types?
-
-<!-- more -->
-
-To understand the potential for potential bleeding,
-let's study the popular `text` library for efficient 
-text processing. The library provides the high-level 
-API Haskellers have come to expect while using stream 
-fusion and byte arrays under the hood to guarantee 
-high performance.
-
-Suppose we wanted to get the *i*th `Char` of a `Text`,
-\begin{code} we could write a function[^bad]
-charAt (Text a o l) i = word2char $ unsafeIndex a (o+i)
-  where 
-    word2char         = chr . fromIntegral
-\end{code}
-which extracts the underlying array `a`, indexes into it starting
-at the offset `o` and casts the `Word16` to a `Char`, using 
-functions exported by `text`.
-
-[^bad]: This function is bad for numerous reasons, least of which is that `Data.Text.index` is already provided, but stay with us...
-
-\begin{code}Let's try this out in GHCi.
-ghci> let t = pack ['d','o','g']
-ghci> charAt t 0
-'d'
-ghci> charAt t 2
-'g'
-\end{code}
-
-\begin{code}Looks good so far, what happens if we keep going?
-ghci> charAt t 3
-'\NUL'
-ghci> charAt t 100
-'\8745'
-\end{code}
-
-Oh dear, not only did we not get any sort of exception from Haskell, 
-we weren't even stopped by the OS with a segfault. This is quite 
-dangerous since we have no idea what sort of data we just read! 
-To be fair to the library's authors, we did use a function that 
-was clearly branded `unsafe`, but these functions, while not 
-intended for *clients*, pervade the implementation of the *library*.
-
-Wouldn't it be nice to have these last two calls *rejected at compile time*?
-
-In this post we'll see exactly how prevent invalid memory accesses 
-like this with LiquidHaskell.
-
-
-<div class="hidden">
-
-\begin{code}
-{-# LANGUAGE BangPatterns, MagicHash, Rank2Types,
-    RecordWildCards, UnboxedTuples, ExistentialQuantification #-}
-{-@ LIQUID "--no-termination" @-}
-module TextInternal (test, goodMain, badMain, charAt, charAt') where
-
-import qualified Control.Exception as Ex
-import Control.Applicative     ((<$>))
-import Control.Monad           (when)
-import Control.Monad.ST.Unsafe (unsafeIOToST)
-import Data.Bits (shiftR, xor, (.&.))
-import Data.Char
-import Foreign.C.Types (CSize)
-import GHC.Base (Int(..), ByteArray#, MutableByteArray#, newByteArray#,
-                 writeWord16Array#, indexWord16Array#, unsafeCoerce#, ord,
-                 iShiftL#)
-import GHC.ST (ST(..), runST)
-import GHC.Word (Word16(..))
-
-import qualified Data.Text.Lazy.IO as TIO
-import qualified Data.Text as T
-import qualified Data.Text.Internal as T
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ aLen :: a:Array -> {v:Nat | v = (aLen a)}  @-}
-
-{-@ maLen :: a:MArray s -> {v:Nat | v = (maLen a)}  @-}
-
-new          :: forall s. Int -> ST s (MArray s)
-unsafeWrite  :: MArray s -> Int -> Word16 -> ST s ()
-unsafeFreeze :: MArray s -> ST s Array
-unsafeIndex  :: Array -> Int -> Word16
-copyM        :: MArray s               -- ^ Destination
-             -> Int                    -- ^ Destination offset
-             -> MArray s               -- ^ Source
-             -> Int                    -- ^ Source offset
-             -> Int                    -- ^ Count
-             -> ST s ()
-
-{-@ memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO () @-}
-memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO ()
-memcpyM = undefined
-
---------------------------------------------------------------------------------
---- Helper Code
---------------------------------------------------------------------------------
-{-@ shiftL :: i:Nat -> n:Nat -> {v:Nat | ((n = 1) => (v = (i * 2)))} @-}
-shiftL :: Int -> Int -> Int
-shiftL = undefined -- (I# x#) (I# i#) = I# (x# `iShiftL#` i#)
-
-pack :: String -> Text
-pack = undefined -- not "actually" using
-
-assert b a = Ex.assert b a
-
-
-data Text = Text Array Int Int
-
-{-@ tLength :: t:Text -> {v:_ | v = (tLen t)} @-}
-tLength (Text _ _ n)  =  n
-\end{code}
-
-</div>
-
-The `Text` Lifecycle
---------------------
-`text` splits the reading and writing array operations between two
-types of arrays, immutable `Array`s and mutable `MArray`s. This leads to
-the following general lifecycle:
-
-![The lifecycle of a `Text`](/images/text-lifecycle.png)
-
-The main four array operations we care about are:
-
-1. **creating** an `MArray`,
-2. **writing** into an `MArray`,
-3. **freezing** an `MArray` into an `Array`, and
-4. **reading** from an `Array`.
-
-Creating an `MArray`
---------------------
-
-The (mutable) `MArray` is a thin wrapper around GHC's primitive
-`MutableByteArray#`, additionally carrying the number of `Word16`s it
-can store.
-
-\begin{code}
-data MArray s = MArray { maBA  :: MutableByteArray# s
-                       , maLen :: !Int
-                       }
-\end{code}
-
-It doesn't make any sense to have a negative length, so we *refine*
-the data definition to require that `maLen` be non-negative. 
-
-\begin{code}
-{-@ data MArray s = MArray { maBA  :: MutableByteArray# s
-                           , maLen :: Nat
-                           }
-  @-}
-\end{code}
-
-
-\begin{code} As an added bonus, the above specification generates **field-accessor measures** that we will use inside the refined types:
-{-@ measure maLen :: MArray s -> Int
-    maLen (MArray a l) = l
-  @-}
-\end{code}
-
-We can use these accessor measures to define `MArray`s of size `N`:
-
-\begin{code}
-{-@ type MArrayN a N = {v:MArray a | (maLen v) = N} @-}
-\end{code}
-
-and we can use the above alias, to write a type that tracks the size
-of an `MArray` at the point where it is created:
-
-\begin{code}
-{-@ new :: forall s. n:Nat -> ST s (MArrayN s n) @-}
-new n
-  | n < 0 || n .&. highBit /= 0 = error "size overflow"
-  | otherwise = ST $ \s1# ->
-       case newByteArray# len# s1# of
-         (# s2#, marr# #) -> (# s2#, MArray marr# n #)
-  where !(I# len#) = bytesInArray n
-        highBit    = maxBound `xor` (maxBound `shiftR` 1)
-        bytesInArray n = n `shiftL` 1
-\end{code}
-
-`new n` is an `ST` action that produces an `MArray s` with `n` slots each 
-of which is 2 bytes (as internally `text` manipulates `Word16`s).
-
-The verification process here is quite simple; LH recognizes that 
-the `n` used to construct the returned array (`MArray marr# n`) 
-the same `n` passed to `new`. 
-
-Writing into an `MArray`
-------------------------
-
-Once we have *created* an `MArray`, we'll want to write our data into it. 
-
-A `Nat` is a valid index into an `MArray` if it is *strictly less than* 
-the size of the array.
-
-\begin{code}
-{-@ type MAValidI MA = {v:Nat | v < (maLen MA)} @-}
-\end{code}
-
-We use this valid index alias to refine the type of `unsafeWrite`
-
-\begin{code}
-{-@ unsafeWrite :: ma:MArray s -> MAValidI ma -> Word16 -> ST s () @-}
-unsafeWrite MArray{..} i@(I# i#) (W16# e#)
-  | i < 0 || i >= maLen = assert False $ error "out of bounds"
-  | otherwise = ST $ \s1# ->
-      case writeWord16Array# maBA i# e# s1# of
-        s2# -> (# s2#, () #)
-\end{code}
-
-Note that, when compiled with appropriate options, the implementation of
-`text` checks the bounds at run-time. However, LiquidHaskell can statically
-prove that the error branch is unreachable, i.e. the `assert` **cannot fail**
-(as long as the inputs adhere to the given specification) by giving `assert`
-the type:
-
-\begin{code}
-{-@ assert assert :: {v:Bool | (Prop v)} -> a -> a @-}
-\end{code}
-
-Bulk Writing into an `MArray`
------------------------------
-
-So now we can write individual `Word16`s into an array, but maybe we
-have a whole bunch of text we want to dump into the array. Remember,
-`text` is supposed to be fast! C has `memcpy` for cases like this but 
-it's notoriously unsafe; with the right type however, we can regain safety. 
-`text` provides a wrapper around `memcpy` to copy `n` elements from 
-one `MArray` to another.
-
-`copyM` requires two `MArray`s and valid offsets into each -- note
-that a valid offset is **not** necessarily a valid *index*, it may
-be one element out-of-bounds
-
-\begin{code}
-{-@ type MAValidO MA = {v:Nat | v <= (maLen MA)} @-}
-\end{code}
-
--- and a `count` of elements to copy.
-The `count` must represent a valid region in each `MArray`, in
-other words `offset + count <= length` must hold for each array.
-
-\begin{code}
-{-@ copyM :: dest:MArray s
-          -> didx:MAValidO dest
-          -> src:MArray s
-          -> sidx:MAValidO src
-          -> {v:Nat | (((didx + v) <= (maLen dest))
-                    && ((sidx + v) <= (maLen src)))}
-          -> ST s ()
-  @-}
-copyM dest didx src sidx count
-    | count <= 0 = return ()
-    | otherwise =
-    assert (sidx + count <= maLen src) .
-    assert (didx + count <= maLen dest) .
-    unsafeIOToST $ memcpyM (maBA dest) (fromIntegral didx)
-                           (maBA src) (fromIntegral sidx)
-                           (fromIntegral count)
-\end{code}
-
-Again, the two `assert`s in the function were in the original code as 
-(optionally compiled out) run-time checks of the precondition, but with 
-LiquidHaskell we can actually *prove* that the `assert`s **always succeed**.
-
-Freezing an `MArray` into an `Array`
-------------------------------------
-
-Before we can package up our `MArray` into a `Text`, we need to
-*freeze* it, preventing any further mutation. The key property 
-here is of course that the frozen `Array` should have the same 
-length as the `MArray`.
-
-Just as `MArray` wraps a mutable array, `Array` wraps an *immutable*
-`ByteArray#` and carries its length in `Word16`s.
-
-\begin{code}
-data Array = Array { aBA  :: ByteArray#
-                   , aLen :: !Int
-                   }
-\end{code}
-
-As before, we get free accessor measures `aBA` and `aLen` just by
-refining the data definition
-
-\begin{code}
-{-@ data Array = Array { aBA  :: ByteArray#
-                       , aLen :: Nat
-                       }
-  @-}
-\end{code}
-
-so we can refer to the components of an `Array` in our refinements.
-Using these measures, we can define
-
-\begin{code}
-{-@ type ArrayN N = {v:Array | (aLen v) = N} @-}
-{-@ unsafeFreeze :: ma:MArray s -> ST s (ArrayN (maLen ma)) @-}
-unsafeFreeze MArray{..} = ST $ \s# ->
-                          (# s#, Array (unsafeCoerce# maBA) maLen #)
-\end{code}
-
-Again, LiquidHaskell is happy to prove our specification as we simply
-copy the length parameter `maLen` over into the `Array`.
-
-Reading from an `Array`
-------------------------
-Finally, we will eventually want to read a value out of the
-`Array`. As with `unsafeWrite` we require a valid index into the
-`Array`, which we denote using the `AValidI` alias.
-
-\begin{code}
-{-@ type AValidI A = {v:Nat | v < (aLen A)} @-}
-{-@ unsafeIndex :: a:Array -> AValidI a -> Word16 @-}
-unsafeIndex Array{..} i@(I# i#)
-  | i < 0 || i >= aLen = assert False $ error "out of bounds"
-  | otherwise = case indexWord16Array# aBA i# of
-                  r# -> (W16# r#)
-\end{code}
-
-As before, LiquidHaskell can easily prove that the error branch
-is unreachable, i.e. is *never* executed at run-time.
-
-Wrapping it all up
-------------------
-
-Now we can finally define the core datatype of the `text` package!
-A `Text` value consists of three fields:
-
-A. an `Array`,
-
-B. an `Int` offset into the *middle* of the array, and
-
-C. an `Int` length denoting the number of valid indices *after* the offset.
-
-We can specify the invariants for fields (b) and (c) with the refined type:
-
-\begin{code}
-{-@ data Text
-      = Text { tArr :: Array
-             , tOff :: {v:Nat | v      <= (aLen tArr)}
-             , tLen :: {v:Nat | v+tOff <= (aLen tArr)}
-             }
-  @-}
-\end{code}
-
-These invariants ensure that any *index* we pick between `tOff` and
-`tOff + tLen` will be a valid index into `tArr`. 
-
-As shown above with `new`, `unsafeWrite`, and `unsafeFreeze`, we can type the
-top-level function that creates a `Text` from a `[Char]` as:
-
-\begin{code}
-{-@ pack :: s:String -> {v:Text | (tLen v) = (len s)} @-}
-\end{code}
-
-Preventing Bleeds
------------------
-
-Now, let us close the circle and return to potentially *bleeding* function:
-
-\begin{code}
-charAt' (Text a o l) i = word2char $ unsafeIndex a (o+i)
-  where 
-    word2char          = chr . fromIntegral
-\end{code}
-
-Aha! LiquidHaskell flags the call to `unsafeIndex` because of course, `i` may fall
-outside the bounds of the given array `a`! We can remedy that by specifying
-a bound for the index:
-
-\begin{code}
-{-@ charAt :: t:Text -> {v:Nat | v < (tLen t)} -> Char @-}
-charAt (Text a o l) i = word2char $ unsafeIndex a (o+i)
-  where 
-    word2char         = chr . fromIntegral
-\end{code}
-
-That is, we can access the `i`th `Char` as long as `i` is a `Nat` less
-than the the size of the text, namely `tLen t`. Now LiquidHaskell is convinced
-that the call to `unsafeIndex` is safe, but of course, we have passed
-the burden of proof onto users of `charAt`.
-
-Now, if we try calling `charAt` as we did at the beginning
-
-\begin{code}
-test = [good,bad]
-  where
-    dog  = ['d','o','g']
-    good = charAt (pack dog) 2
-    bad  = charAt (pack dog) 3
-\end{code}
-
-we see that LiquidHaskell verifies the `good` call, but flags `bad` as
-**unsafe**.
-
-Enforcing Sanitization
-----------------------
-
-EDIT: As several folks have pointed out, the #heartbleed error was
-due to inputs not being properly sanitized. The above approach 
-**ensures, at compile time**, that proper sanitization has been 
-performed. 
-
-To see this in action, lets write a little function that just shows the 
-character at a given position:
-
-\begin{code}
-{-@ showCharAt :: t:_ -> {v:Nat | v < (tLen t)} -> _ @-}
-showCharAt t i = putStrLn $ show $ charAt t i
-\end{code}
-
-Now, the following function, that correctly sanitizes is **accepted**
-
-\begin{code}
-goodMain :: IO ()
-goodMain 
-  = do txt <- pack <$> getLine
-       i   <- readLn
-       if 0 <= i && i < tLength txt 
-         then showCharAt txt i 
-         else putStrLn "Bad Input!"
-\end{code}
-
-but this function, which has insufficient sanitization, is **rejected**
-
-\begin{code}
-badMain :: IO ()
-badMain 
-  = do txt <- pack <$> getLine 
-       i   <- readLn
-       if 0 <= i 
-         then showCharAt txt i 
-         else putStrLn "Bad Input!"
-\end{code}
-
-Thus, we can use LiquidHaskell to block, at compile time, any serious bleeding
-from pointers gone wild.
diff --git a/docs/blog/2014-08-15-a-finer-filter.lhs b/docs/blog/2014-08-15-a-finer-filter.lhs
deleted file mode 100644
--- a/docs/blog/2014-08-15-a-finer-filter.lhs
+++ /dev/null
@@ -1,303 +0,0 @@
----
-layout: post
-title: "A Finer Filter"
-date: 2014-08-15 16:12
-author: Ranjit Jhala
-published: true
-comments: true
-external-url:
-categories: abstract-refinements 
-demo: filter.hs
----
-
-This morning, I came across this [nice post](https://twitter.com/ertesx/status/500034598042996736) which describes how one can write a very expressive type for 
-`filter` using [singletons](https://hackage.haskell.org/package/singletons).
-
-Lets see how one might achieve this with [abstract refinements][absref].
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-
-{-@ LIQUID "--short-names" @-}
-
-module Filter (filter) where
-
-import Prelude hiding (filter)
-import Data.Set (Set)
-
-import Prelude hiding (filter)
-isPos, isEven, isOdd :: Int -> Maybe Int
-filter, filter3 :: (a -> Maybe a) -> [a] -> [a]
-
-{-@ measure elts :: [a] -> (Set a) 
-    elts ([])   = {v | Set_emp v }
-    elts (x:xs) = {v | v = Set_cup (Set_sng x) (elts xs) }
-  @-}
- 
-\end{code}
-
-</div>
-
-Goal
-----
-
-What we're after is a way to write a `filter` function such that:
-
-\begin{code} 
-{-@ getPoss  :: [Int] -> [Pos] @-}
-getPoss      = filter isPos
-
-{-@ getEvens :: [Int] -> [Even] @-}
-getEvens     = filter isEven
-
-{-@ getOdds  :: [Int] -> [Odd] @-}
-getOdds      = filter isOdd
-\end{code}
-
-where `Pos`, `Even` and `Odd` are just subsets of `Int`:
-
-\begin{code}
-{-@ type Pos  = {v:Int| 0 < v}        @-}
-
-{-@ type Even = {v:Int| v mod 2 == 0} @-}
-
-{-@ type Odd  = {v:Int| v mod 2 /= 0} @-}
-\end{code}
-
-Take 1: Map, maybe?
--------------------
-
-Bowing to the anti-boolean sentiment currently in the air, lets eschew 
-the classical approach where the predicates (`isPos` etc.) return `True` 
-or `False` and instead implement `filter` using a map.
-
-\begin{code}
-filter1          :: (a -> Maybe b) -> [a] -> [b]
-
-filter1 f []     = []
-filter1 f (x:xs) = case f x of
-                     Just y  -> y : filter1 f xs 
-                     Nothing ->     filter1 f xs
-\end{code}
-
-To complete the picture, we need just define the predicates as
-functions returning a `Maybe`:
-
-\begin{code}
-{- isPos          :: Int -> Maybe Pos  @-}
-isPos x
-  | x > 0          = Just x
-  | otherwise      = Nothing
-
-{- isEven         :: Int -> Maybe Even @-}
-isEven x
-  | x `mod` 2 == 0 = Just x
-  | otherwise      = Nothing
-
-{- isOdd          :: Int -> Maybe Odd  @-}
-isOdd x
-  | x `mod` 2 /= 0 = Just x
-  | otherwise      = Nothing
-\end{code}
-
-and now, we can achieve our goal!
-
-\begin{code}
-{-@ getPoss1 :: [Int] -> [Pos] @-}
-getPoss1     = filter1 isPos
-
-{-@ getEvens1 :: [Int] -> [Even] @-}
-getEvens1    = filter1 isEven
-
-{-@ getOdds1 :: [Int] -> [Odd] @-}
-getOdds1     = filter1 isOdd
-\end{code}
-
-**The Subset Guarantee**
-
-Well that was easy! Or was it?
-
-I fear we've *cheated* a little bit.
-
-One of the nice things about the *classical* `filter` is that by eyeballing
-the signature:
-
-\begin{spec}
-filter :: (a -> Bool) -> [a] -> [a]
-\end{spec}
-
-we are guaranteed, via parametricity, that the output list's elements are
-a *subset of* the input list's elements. The signature for our new-fangled
-
-\begin{spec}
-filter1 :: (a -> Maybe b) -> [a] -> [b]
-\end{spec}
-
-yields no such guarantee!
-
-In this case, things work out, because in each case, LiquidHaskell *instantiates*
-the type variables `a` and `b` in the signature of `filter1` suitably:
-
-* In `getPoss ` LH instantiates `a := Int` and `b := Pos`
-* In `getEvens` LH instantiates `a := Int` and `b := Even`
-* In `getOdds ` LH instantiates `a := Int` and `b := Odd`
-
-(Hover over the different instances of `filter1` above to confirm this.)
-
-But in general, we'd rather *not* lose the nice "subset" guarantee that the
-classical `filter` provides.
-
-
-Take 2: One Type Variable
--------------------------
-
-Easy enough! Why do we need *two* type variables anyway?
-
-\begin{code}
-filter2          :: (a -> Maybe a) -> [a] -> [a]
-
-filter2 f []     = []
-filter2 f (x:xs) = case f x of
-                     Just y  -> y : filter2 f xs 
-                     Nothing ->     filter2 f xs
-\end{code}
-
-There! Now the `f` is forced to take or leave its input `x`, 
-and so we can breathe easy knowing that `filter2` returns a 
-subset of its inputs.
-
-But...
-
-\begin{code}
-{-@ getPoss2 :: [Int] -> [Pos] @-}
-getPoss2     = filter2 isPos
-
-{-@ getEvens2 :: [Int] -> [Even] @-}
-getEvens2    = filter2 isEven
-
-{-@ getOdds2 :: [Int] -> [Odd] @-}
-getOdds2     = filter2 isOdd
-\end{code}
-
-Yikes, LH is not impressed -- the red highlight indicates that LH is not
-convinced that the functions have the specified types.
-
-Perhaps you know why already?
-
-Since we used **the same** type variable `a` for *both* the 
-input *and* output, LH must instantiate `a` with a type that 
-matches *both* the input and output, i.e. is a *super-type*
-of both, which is simply `Int` in all the cases. 
-
-Consequently, we get the errors above -- "expected `Pos` but got `Int`".
-
-Take 3: Add Abstract Refinement
--------------------------------
-
-What we need is a generic way of specifying that the 
-output of the predicate is not just an `a` but an `a` 
-that *also* enjoys whatever property we are filtering for. 
-
-This sounds like a job for [abstract refinements][absref] which
-let us parameterize a signature over its refinements:
-
-\begin{code}
-{-@ filter3      :: forall a <p :: a -> Prop>.
-                      (a -> Maybe a<p>) -> [a] -> [a<p>] @-}
-filter3 f []     = []
-filter3 f (x:xs) = case f x of
-                     Just x'  -> x' : filter3 f xs 
-                     Nothing ->       filter3 f xs
-\end{code}
-
- Now, we've **decoupled** the filter-property from the type variable `a`.
-
-The input still is a mere `a`, but the output is an `a` with bells on,
-specifically, which satisfies the (abstract) refinement `p`.
-
-Voila!
-
-\begin{code}
-{-@ getPoss3  :: [Int] -> [Pos] @-}
-getPoss3      = filter3 isPos
-
-{-@ getEvens3 :: [Int] -> [Even] @-}
-getEvens3     = filter3 isEven
-
-{-@ getOdds3  :: [Int] -> [Odd] @-}
-getOdds3      = filter3 isOdd
-\end{code}
-
-Now, LH happily accepts each of the above.
-
-At each *use* of `filter` LH separately *instantiates* the `a` and
-the `p`. In each case, the `a` is just `Int` but the `p` is instantiated as:
-
-+ In `getPoss ` LH instantiates `p := \v -> 0 <= v`
-+ In `getEvens` LH instantiates `p := \v -> v mod 2 == 0`
-+ In `getOdds ` LH instantiates `p := \v -> v mod 2 /= 0`
-
-That is, in each case, LH instantiates `p` with the refinement that describes
-the output type we are looking for.
-
-**Edit:** At this point, I was ready to go to bed, and so happily 
-declared victory and turned in. The next morning, [mypetclone](http://www.reddit.com/r/haskell/comments/2dozs5/liquidhaskell_a_finer_filter/cjrrx3y)
-graciously pointed out my folly: the signature for `filter3` makes no guarantees
-about the subset property. In fact, 
-
-\begin{code}
-doubles = filter3 (\x -> Just (x + x)) 
-\end{code}
-
-typechecks just fine, while `doubles` clearly violates the subset property. 
-
-Take 4: 
--------
-
-I suppose the moral is that it may be tricky -- for me at least! -- to read more into
-a type than what it *actually says*. Fortunately, with refinements, our types can say
-quite a lot.
-
-In particular, lets make the subset property explicit, by
-
-1. Requiring the predicate return its input (or nothing), and,
-2. Ensuring  the output is indeed a subset of the inputs.
-
-\begin{code}
-{-@ filter      :: forall a <p :: a -> Prop>.
-                       (x:a -> Maybe {v:a<p> | v = x})
-                    -> xs:[a]
-                    -> {v:[a<p>] | Set_sub (elts v) (elts xs)} @-}
-
-filter f []     = []
-filter f (x:xs) = case f x of
-                    Just x'  -> x' : filter f xs 
-                    Nothing ->       filter f xs
-\end{code}
-
-where `elts` describes the [set of elements in a list][sets].
-
-**Note:** The *implementation* of each of the above `filter` functions are
-the same; they only differ in their type *specification*.
-
-Conclusion
-----------
-
-And so, using abstract refinements, we've written a `filter` whose signature guarantees:
-
-* The outputs must be a *subset* of the inputs, and
-* The outputs indeed satisfy the property being filtered for.
-
-Another thing that I've learnt from this exercise, is that the old 
-school `Boolean` approach has its merits. Take a look at the clever 
-"latent predicates" technique of [Tobin-Hochstadt and Felleisen][racket]
-or this lovely new [paper by Kaki and Jagannathan][catalyst] which
-shows how refinements can be further generalized to make Boolean filters fine.
-
-[sets]:   /blog/2013/03/26/talking-about-sets.lhs/ 
-[absref]:   /blog/2013/06/03/abstracting-over-refinements.lhs/ 
-[racket]:   http://www.ccs.neu.edu/racket/pubs/popl08-thf.pdf
-[catalyst]: http://gowthamk.github.io/docs/icfp77-kaki.pdf
diff --git a/docs/blog/2015-01-30-okasakis-lazy-queue.lhs b/docs/blog/2015-01-30-okasakis-lazy-queue.lhs
deleted file mode 100644
--- a/docs/blog/2015-01-30-okasakis-lazy-queue.lhs
+++ /dev/null
@@ -1,338 +0,0 @@
----
-layout: post
-title: "Okasaki's Lazy Queues"
-date: 2015-01-28
-comments: true
-external-url:
-author: Ranjit Jhala 
-published: true
-categories: measures
-demo: LazyQueue.hs
----
-
-The "Hello World!" example for fancy type systems is probably the sized vector
-or list `append` function ("The output has size equal to the *sum* of the
-inputs!").  One the one hand, it is perfect: simple enough to explain without
-pages of code, yet complex enough to show off whats cool about dependency. On
-the other hand, like the sweater I'm sporting right now, it's a bit well-worn and
-worse, was never wholly convincing ("Why do I *care* what the *size* of the
-output list is anyway?")
-
-Recently, I came across a nice example that is almost as simple, but is also
-well motivated: Okasaki's beautiful [Lazy Amortized Queues][okasaki95].  This
-structure leans heavily on an invariant to provide fast *insertion* and
-*deletion*. Let's see how to enforce that invariant with LiquidHaskell.
-
-<!-- more -->
-
-<div class="hidden">
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--total"          @-}
-{-@ LIQUID "--maxparams=3"    @-}
-
-module LazyQueue (Queue, insert, remove, emp) where
-
-import Prelude hiding (length)
-
--- | Size function actually returns the size: (Duh!)
-
-{-@ size :: q:SList a -> {v:Nat | v = size q} @-}
-data Queue a = Q  { front :: SList a
-                  , back  :: SList a
-                  }
-
--- Source: Okasaki, JFP 1995
--- http://www.westpoint.edu/eecs/SiteAssets/SitePages/Faculty%20Publication%20Documents/Okasaki/jfp95queue.pdf
-
-\end{code}
-</div>
-
-Queues 
-------
-
-A [queue][queue-wiki] is a structure into which we can `insert` and `remove` data
-such that the order in which the data is removed is the same as the order in which
-it was inserted.
-
-![A Queue](/images/queue.png)
-
-To implement a queue *efficiently* one needs to have rapid access to both
-the "head" as well as the "tail" because we `remove` elements from former
-and `insert` elements into the latter. This is quite straightforward with
-explicit pointers and mutation -- one uses an old school linked list and
-maintains pointers to the head and the tail. But can we implement the
-structure efficiently without having stoop so low?
-
-Queues = Pair of Lists
-----------------------
-
-Almost two decades ago, Chris Okasaki came up with a very cunning way
-to implement queues using a *pair* of lists -- let's call them `front`
-and `back` which represent the corresponding parts of the Queue.
-
-+ To `insert` elements, we just *cons* them onto the `back` list,
-+ To `remove` elements, we just *un-cons* them from the `front` list.
-
-![A Queue is Two Lists](/images/queue-lists.png)
-
-
-The catch is that we need to shunt elements from the back to the
-front every so often, e.g. when
-
-1. a `remove` call is triggered, and
-2. the `front` list is empty,
-
-We can transfer the elements from the `back` to the `front`.
-
-
-![Transferring Elements from Back to Front](/images/queue-rotate.png)
-
-Okasaki observed that every element is only moved *once* from the
-front to the back; hence, the time for `insert` and `lookup` could be
-`O(1)` when *amortized* over all the operations. Awesome, right?!
-
-Almost. Some set of unlucky `remove` calls (which occur when
-the `front` is empty) are stuck paying the bill. They have a
-rather high latency up to `O(n)` where `n` is the total number
-of operations. Oops.
-
-Queue = Balanced Lazy Lists
----------------------------
-
-This is where Okasaki's beautiful insights kick in. Okasaki
-observed that all we need to do is to enforce a simple invariant:
-
-**Invariant:** Size of `front` >= Size of `back`
-
-Now, if the lists are *lazy* i.e. only constructed as the head
-value is demanded, then a single `remove` needs only a tiny `O(log n)`
-in the worst case, and so no single `remove` is stuck paying the bill.
-
-Let's see how to represent these Queues and ensure the crucial invariant(s)
-with LiquidHaskell. What we need are the following ingredients:
-
-1. A type for `List`s, and a way to track their `size`,
-
-2. A type for `Queue`s which encodes the *balance* invariant -- ``front longer than back",
-
-3. A way to implement the `insert`, `remove` and `transfer` operations.
-
-Sized Lists
-------------
-
-The first part is super easy. Let's define a type:
-
-\begin{code}
-data SList a = SL { size :: Int, elems :: [a]}
-\end{code}
-
-We have a special field that saves the `size` because otherwise, we
-have a linear time computation that wrecks Okasaki's careful
-analysis. (Actually, he presents a variant which does *not* require
-saving the size as well, but that's for another day.)
-
-But how can we be sure that `size` is indeed the *real size* of `elems`?
-
-Let's write a function to *measure* the real size:
-
-\begin{code}
-{-@ measure realSize @-}
-realSize      :: [a] -> Int
-realSize []     = 0
-realSize (_:xs) = 1 + realSize xs
-\end{code}
-
-and now, we can simply specify a *refined* type for `SList` that ensures
-that the *real* size is saved in the `size` field:
-
-\begin{code}
-{-@ data SList a = SL {
-       size  :: Nat 
-     , elems :: {v:[a] | realSize v = size}
-     }
-  @-}
-\end{code}
-
-As a sanity check, consider this:
-
-\begin{code}
-okList  = SL 1 ["cat"]    -- accepted
-
-badList = SL 1 []         -- rejected
-\end{code}
-
-It is helpful to define a few aliases for `SList`s of a size `N` and
-non-empty `SList`s:
-
-\begin{code}
--- | SList of size N
-
-{-@ type SListN a N = {v:SList a | size v = N} @-}
-
--- | Non-Empty SLists:
-
-{-@ type NEList a = {v:SList a | size v > 0} @-}
-
-\end{code}
-
-Finally, we can define a basic API for `SList`.
-
-**To Construct** lists, we use `nil` and `cons`:
-
-\begin{code}
-{-@ nil          :: SListN a 0  @-}
-nil              = SL 0 []
-
-{-@ cons         :: a -> xs:SList a -> SListN a {size xs + 1}   @-}
-cons x (SL n xs) = SL (n+1) (x:xs)
-\end{code}
-
-**To Destruct** lists, we have `hd` and `tl`.
-
-\begin{code}
-{-@ tl           :: xs:NEList a -> SListN a {size xs - 1}  @-}
-tl (SL n (_:xs)) = SL (n-1) xs
-
-{-@ hd           :: xs:NEList a -> a @-}
-hd (SL _ (x:_))  = x 
-\end{code}
-
-Don't worry, they are perfectly *safe* as LiquidHaskell will make
-sure we *only* call these operators on non-empty `SList`s. For example,
-
-\begin{code}
-okHd  = hd okList       -- accepted
-
-badHd = hd (tl okList)  -- rejected
-\end{code}
-
-
-Queue Type
------------
-
-Now, it is quite straightforward to define the `Queue` type, as a pair of lists,
-`front` and `back`, such that the latter is always smaller than the former:
-
-\begin{code}
-{-@ data Queue a = Q {
-       front :: SList a 
-     , back  :: SListLE a (size front)
-     }
-  @-}
-\end{code}
-
-Where the alias `SListLE a L` corresponds to lists with less than `N` elements:
-
-\begin{code}
-{-@ type SListLE a N = {v:SList a | size v <= N} @-}
-\end{code}
-
-As a quick check, notice that we *cannot represent illegal Queues*:
-
-\begin{code}
-okQ  = Q okList nil  -- accepted, |front| > |back| 
-
-badQ = Q nil okList  -- rejected, |front| < |back|
-\end{code}
-
-**To Measure Queue Size** let us define a function
-
-\begin{code}
-{-@ measure qsize @-}
-qsize         :: Queue a -> Int
-qsize (Q l r) = size l + size r
-\end{code}
-
-This will prove helpful to define `Queue`s of a given size `N` and
-non-empty `Queue`s (from which values can be safely removed.)
-
-\begin{code}
-{-@ type QueueN a N = {v:Queue a | N = qsize v} @-}
-{-@ type NEQueue a  = {v:Queue a | 0 < qsize v} @-}
-\end{code}
-
-
-Queue Operations
-----------------
-
-Almost there! Now all that remains is to define the `Queue` API. The
-code below is more or less identical to Okasaki's (I prefer `front`
-and `back` to his `left` and `right`.)
-
-
-**The Empty Queue** is simply one where both `front` and `back` are `nil`.
-
-\begin{code}
-{-@ emp :: QueueN a 0 @-}
-emp = Q nil nil
-\end{code}
-
-**To Insert** an element we just `cons` it to the `back` list, and call
-the *smart constructor* `makeq` to ensure that the balance invariant holds:
-
-\begin{code}
-{-@ insert       :: a -> q:Queue a -> QueueN a {qsize q + 1}   @-}
-insert e (Q f b) = makeq f (e `cons` b)
-\end{code}
-
-**To Remove** an element we pop it off the `front` by using `hd` and `tl`.
-Notice that the `remove` is only called on non-empty `Queue`s, which together
-with the key balance invariant, ensures that the calls to `hd` and `tl` are safe.
-
-\begin{code}
-{-@ remove       :: q:NEQueue a -> (a, QueueN a {qsize q - 1}) @-}
-remove (Q f b)   = (hd f, makeq (tl f) b)
-\end{code}
-
-*Aside:* Why didn't we (or Okasaki) use a pattern match here?
-
-**To Ensure the Invariant** we use the smart constructor `makeq`,
-which is where the heavy lifting, such as it is, happens. The
-constructor takes two lists, the front `f` and back `b` and if they
-are balanced, directly returns the `Queue`, and otherwise transfers
-the elements from `b` over using `rot`ate.
-
-\begin{code}
-{-@ makeq :: f:SList a
-          -> b:SListLE a {size f + 1 }
-          -> QueueN a {size f + size b}
-  @-}
-makeq l r
-  | size r <= size l = Q l r
-  | otherwise        = Q (rot l r nil) nil
-\end{code}
-
-**The Rotate** function is only called when the `back` is one larger
-than the `front` (we never let things drift beyond that). It is
-arranged so that it the `hd` is built up fast, before the entire
-computation finishes; which, combined with laziness provides the
-efficient worst-case guarantee.
-
-\begin{code}
-{-@ rot :: l:SList a
-        -> r:SListN _ {1 + size l}
-        -> a:SList _
-        -> SListN _ {size l + size r + size a}
-  @-}
-rot l r a
-  | size l == 0 = hd r `cons` a
-  | otherwise   = hd l `cons` rot (tl l) (tl r) (hd r `cons` a)
-\end{code}
-
-Conclusion
-----------
-
-Well there you have it; Okasaki's beautiful lazy Queue, with the
-invariants easily expressed and checked with LiquidHaskell. I find
-this example particularly interesting because the refinements express
-invariants that are critical for efficiency, and furthermore the code
-introspects on the `size` in order to guarantee the invariants.  Plus,
-it's just marginally more complicated than `append` and so, (I hope!)
-was easy to follow.
-
-
-
-[okasaki95]: http://www.westpoint.edu/eecs/SiteAssets/SitePages/Faculty%20Publication%20Documents/Okasaki/jfp95queue.pdf
-
-[queue-wiki]: http://en.wikipedia.org/wiki/Queue_%28abstract_data_type%29
diff --git a/docs/blog/2015-06-13-bounded-refinement-types.lhs b/docs/blog/2015-06-13-bounded-refinement-types.lhs
deleted file mode 100644
--- a/docs/blog/2015-06-13-bounded-refinement-types.lhs
+++ /dev/null
@@ -1,337 +0,0 @@
----
-layout: post
-title: "Bounded Refinement Types"
-date: 2015-06-13
-comments: true
-external-url:
-author: Niki Vazou
-published: true
-categories: bounded-refinements, abstract-refinements, function-composition
-demo: BoundedRefinementTypes.hs
----
-
-While refinement types let SMT solvers do a lot of the "boring" analysis,
-they are limited to decidable (first order) logics which can prevent us
-from writing *modular* and *reusable* specifications for *higher-order*
-functions. Next, lets see why modularity is important, and how we can
-recover it using a new technique called **Bounded Refinements**.
-
-<!-- more -->
-
-<div class="hidden">
-\begin{code}
-module BoundedRefinementTypes where
-import Prelude hiding ((.), maximum)
-import Language.Haskell.Liquid.Prelude
-
-incr  :: Int -> Int
-incr2 :: Int -> Int
-incr3 :: Int -> Int
-
-compose1 :: (Int -> Int) -> (Int -> Int) -> Int -> Int
-compose1 f g x = f (g x)
-incr2'     :: Int -> Int
-compose2 :: (b -> c) -> (a -> b) -> a -> c
-\end{code}
-</div>
-
-Reusable Specifications
------------------------
-
-Let us suppose, for just a moment, that we live in a dystopian future
-where parametric polymorphism and typeclasses have been eliminated
-from Haskell. Now, consider the function that returns the largest
-element of a list:
-
-\begin{code}
-maximum         :: [Int] -> Int
-maximum [x]    = x
-maximum (x:xs) = max x (maximum xs)
-  where
-    max a b    = if a < b then b else a
-\end{code}
-
-Now, suppose we have refinements:
-
-\begin{code}
-{-@ type Pos  = {v:Int | 0 < v} @-}
-{-@ type Neg  = {v:Int | 0 > v} @-}
-\end{code}
-
-**Here's the problem:** how can *specify* the behavior of `maximum`
-in a way that lets us verify that:
-
-\begin{code}
-{-@ posMax :: [Int] -> Pos @-}
-posMax xs = maximum [x | x <- xs, x > 0]
-
-{-@ negMax :: [Int] -> Neg @-}
-negMax xs = maximum [x | x <- xs, x < 0]
-\end{code}
-
-In the first case, the output of `maximum` must be
-a `Pos` because *every* input was a `Pos`. Thus, we
-might try to type:
-
-\begin{spec}
-maximum :: [Pos] -> Pos
-\end{spec}
-
-But this specification will not let us verify `negMax`.
-Thus, we have a problem: how can we write a precise
-specification for `maximum` that we can *reuse* at
-different call-sites. Further, how can we do so
-enumerating *a priori* the possible contexts (e.g.
-`Pos` and `Neg` lists) in which the function may
-be used?
-
-Abstracting Refinements
------------------------
-
-The first idea is one we've [seen before][AbstractRefinements].
-Notice that `maximum` returns _one of_ the elements in its input
-list. Thus, if *every* element of the list satisfies some
-refinement `p` then the output value is also guaranteed to
-satisfy `p`. We formalize this notion by *abstracting refinements*
-over type specifications. That is, we can type `maximum` as:
-
-\begin{code}
-{-@ maximum :: forall <p:: Int -> Prop>. [Int<p>] -> Int<p> @-}
-\end{code}
-
-Informally, `Int<p>` stands for `{v:Int | p v}`, that is, `Int`s that
-satisfy the property `p`. The signature states that for any property
-`p` (of `Int`s), if the input is a list of elements satisfying `p` then
-the output is an `Int` satisfying `p`. We can coax SMT solvers into
-proving the above type by encoding `p v` as an [uninterpreted function](https://en.wikipedia.org/wiki/Uninterpreted_function)
-in the refinement logic.
-
-Thus, refinement abstraction is analagous to type abstraction: it lets us
-parameterize signatures over *all* refinements (analogously, types) that
-may be _passed in_ at the call-site.
-
-Capturing Dependencies between Relations
-----------------------------------------
-
-Unfortunately, in the dependent setting, this is not enough.
-Consider `incr` which bumps up its input by 1:
-
-\begin{code}
-{-@ incr :: x:Int -> {v:Int | v = x + 1} @-}
-incr x = x + 1
-\end{code}
-
-We can use `incr` to write and check:
-
-\begin{code}
-{-@ incr2 :: x:Int -> {v:Int | v = x + 2} @-}
-incr2 x = let y = incr x
-              z = incr y
-          in
-              z
-\end{code}
-
-LH uses the specification of `incr` to infer that
-
-+ `y :: {v:Int | v = x + 1}`
-+ `z :: {v:Int | v = y + 1}`
-
-and hence, that the result `z` equals `x + 2`.
-
-Now, you're probably wondering to yourself: isn't
-this what _function composition_ is for? Indeed!
-Lets define:
-
-\begin{code}
-{-@ compose' :: (b -> c) -> (a -> b) -> a -> c @-}
-compose' f g x = f (g x)
-\end{code}
-
-Now, we might try:
-
-\begin{code}
-{-@ incr2' :: x:Int -> {v:Int | v = x + 2} @-}
-incr2' = compose' incr incr
-\end{code}
-
-**Problem 1: Cannot Relate Abstracted Types**
-
-LH _rejects_ the above. This might seem counterintuitive but
-in fact, its the right thing to do given the specification of
-`compose'` -- at this call-site, each of `a`, `b` and `c` are
-instantiated with `Int` as we have no way of *relating* the
-invariants associated with those types, e.g. that `b` is one
-greater than `a` and `c` is one greater than `b`.
-
-**Problem 2: Cannot Reuse Concrete Types**
-
-At the other extreme, we might try to give compose a concrete
-signature:
-
-\begin{code}
-{-@ compose'' :: (y:Int -> {z:Int | z = y + 1})
-              -> (x:Int -> {z:Int | z = x + 1})
-              ->  x:Int -> {z:Int | z = x + 2} @-}
-compose'' f g x = f (g x)
-\end{code}
-
-This time, LH does verify
-
-\begin{code}
-{-@ incr2'' :: x:Int -> {v:Int | v = x + 2} @-}
-incr2'' = compose'' incr incr
-\end{code}
-
-but this is a pyrhhic victory as we can only `compose` the
-toy `incr` function (with itself!) and any attempt to use
-it elsewhere will throw a type error.
-
-Goal: Relate Refinements But Keep them Abstract
------------------------------------------------
-
-The above toy example illustrates the _real_ problem: how
-can we **relate** the invariants of the type parameters for
-`compose` while simultaneously keeping them **abstract** ?
-
-**Can Abstract Refinements Help?**
-
-HEREHEREHERE
-
-Onto abstracting the type of compose we follow the route of [Abstract Refinements][AbstractRefinements].
-We make a second attempt to type function composition and give
-`compose2` a type that states that
-forall abstract refinements `p`, `q` and `r`
-if (1) the first functional argument `f` returns a value that satisfies a relation `p` with respect to its argument `y`, and
-   (2) the second functional argument `g` returns a value that satisfies a relation `q` with respect to its argument `x`,
-then the result function returns a value that satisfies a relation `r` with respect to its argument `x`:
-
-\begin{code}
-{-@ compose''' :: forall <p :: b -> c -> Prop,
-                          q :: a -> b -> Prop,
-                          r :: a -> c -> Prop>.
-                   (y:b -> c<p y>)
-                -> (x:a -> b<q x>)
-                -> x:a -> c<r x>                   @-}
-\end{code}
-
-With this type for `compose2` liquidHaskell will prove that composing `incr` by itself
-gives a function that increased its argument by `2`:
-
-\begin{code}
-{-@ incr2'' :: x:Int -> {v:Int | v = x + 2} @-}
-incr2''      = compose2 incr incr
-\end{code}
-
-To do so, liquidHaskell will employ the Abstract Refinement Types inference and guess
-the appropriate instantiations for `p`, `q`, and `r`.
-That is, liquidHaskell will infer that `p` and `q` relate two consecutive numbers
-`p, q := \x v -> v = x + 1`
-while `r` relates two numbers with distance `2`:
-`r := \x v -> v = x + 2`.
-Thus, at this specific call site the abstract type of `compose2` will be instantiated to
-the concrete type we gave to `compose1`.
-And, verification of `incr2''` will succeed.
-
-
-What is the catch now?
-In this second attempt we abstracted the type of `compose2` too much!
-In fact, LiquidHaskell cannot prove that the body of `compose2` satisfies its type, just because it does not.
-
-\begin{code}
-compose2 f g x = let z = g x in f z
-\end{code}
-
-By the precondition of `compose2` we know the result refinements of the functional arguments `f` and `g`.
-From the type of `g` we know that `z` satisfies `q` on `x`, i.e. `q x z` holds.
-Similarly, from the type of `f` we know that `f z` satisfies `q` on `x`, i.e. `q x z` holds.
-
-With these, liquidHaskell needs to prove that the result `f z` satisfies `r` on `x`, i.e., `r x z` holds.
-The required property `r x z` is not satisfied for _arbitrary_ abstract refinements `p`, `q` and `r`, but only for ones that satisfy a _chain property_ that states that for all `x`, `y` and `z`, if `q x y` and `p y z` holds, then `r x z` holds:
-
-<br>
-
-`\ x y z -> q x y ==> p y z ==> r x z`
-
-Bound Abstract Refinements by the Chain Property
-------------------------------------------------
-
-We made two attempts to type `compose`.
-The first one "failed" as our type was unrealistically specific.
-The second failed as it was unsoundly general.
-In our third and final attempt
-we give `compose` a type that is abstracted over three abstract refinements `p`, `q` and `r`.
-But, this time the three refinements are not arbitrary:
-they are bounded to satisfy the chain property.
-
-We encode the chain property as a boolean Haskell function:
-
-\begin{code}
-chain :: (b -> c -> Bool) -> (a -> b -> Bool)
-      -> (a -> c -> Bool) ->  a -> b -> c -> Bool
-chain p q r = \ x y z -> q x y ==> p y z ==> r x z
-\end{code}
-
-Then we use the new liquidHaskell keyword `bound` to lift the
-`chain` function into the a logical bound that
-can be used to constrain abstract refinements
-
-\begin{code}
-{-@ bound chain @-}
-\end{code}
-
-The above bound annotation defines the bound `Chain` that is used as a
-constraint that relates the abstract refinements `p`, `q` and `r`
-in the type signature of `compose`
-
-\begin{code}
-{-@
-compose :: forall <p :: b -> c -> Prop,
-                   q :: a -> b -> Prop,
-                   r :: a -> c -> Prop>.
-           (Chain b c a p q r)
-        => (y:b -> c<p y>)
-        -> (z:a -> b<q z>)
-        ->  x:a -> c<r x>
-@-}
-\end{code}
-
-This type of `compose` is both sound and general enough,
-as now we can easily prove that composing `incr` with `incr2`
-results in a function that increases its argument by `3`.
-
-\begin{code}
-{-@ incr2''' :: x:Int -> {v:Int | v = x + 2} @-}
-incr2'''      = compose incr incr
-
-{-@ incr3'' :: x:Int -> {v:Int | v = x + 3} @-}
-incr3''      = compose incr2'' incr
-\end{code}
-
-
-Conclusion
-----------
-We saw how bounds in refinement types allow us to specify a
-precise and general type for function composition.
-Bounds in refinement types are (haskell typeclases-like) constraints
-that constraint the abstract refinement variables to specify certain properties.
-
-We note that liquidHaskell desugars bounds to unbounded refinement types,
-thus verification is still performed decidably using the power of the SMT solvers.
-
-Moreover, function composition is not the exclusive user of
-Bounded Refinement Types.
-On the contrary, we used Bounded Refinement Types
-to verify a variety of code, from list-filtering to relational databases.
-
-Read more about bounds in our [ICFP'15 paper][icfp15],
-and stay tuned!
-
-<div class="hidden">
-\begin{code}
-\end{code}
-</div>
-
-
-[icfp15]: http://goto.ucsd.edu/~nvazou/icfp15/main.pdf
-[AbstractRefinements]: http://goto.ucsd.edu/~rjhala/liquid/haskell/blog/blog/2013/06/03/abstracting-over-refinements.lhs
-[queue-wiki]: http://en.wikipedia.org/wiki/Queue_%28abstract_data_type%29
diff --git a/docs/blog/2016-09-01-normal-forms.lhs b/docs/blog/2016-09-01-normal-forms.lhs
deleted file mode 100644
--- a/docs/blog/2016-09-01-normal-forms.lhs
+++ /dev/null
@@ -1,411 +0,0 @@
----
-layout: post
-title: "Normal Forms"
-date: 2016-09-05
-comments: true
-external-url:
-author: Ranjit Jhala
-published: true
-categories: measures
-demo: ANF.hs
----
-
-I have been preparing an undergraduate course on
-Compilers in which we build a compiler that crunches
-an ML-like language to X86 assembly.
-One of my favorite steps in the compilation is the
-[conversion to A-Normal Form (ANF)][anf-felleisen]
-where, informally speaking, each call or primitive
-operation's arguments are **immediate** values,
-i.e. constants or variable lookups whose values can
-be loaded with a single machine instruction. For example,
-the expression
-
-```haskell
-((2 + 3) * (12 - 4)) * (7 + 8)
-```
-
-has the A-Normal Form:
-
-```haskell
-"let anf0 = 2 + 3
-     anf1 = 12 - 4
-     anf2 = anf0 * anf1
-     anf3 = 7 + 8
-  in
-    anf2 * anf3
-```
-
-The usual presentation of ANF conversion
-is very elegant but relies upon a clever
-use of [continuations][anf-might].
-Lets look at another perhaps simpler approach,
-where we can use refinements to light the way.
-
-<!-- more -->
-
-<div class="hidden">
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--total"          @-}
-
-module ANF (Op (..), Expr (..), isImm, isAnf, toAnf) where
-
-import Control.Monad.State.Lazy
-
-mkLet :: [(Var, AnfExpr)] -> AnfExpr -> AnfExpr
-imm, immExpr :: Expr -> AnfM ([(Var, AnfExpr)], ImmExpr)
-anf   :: Expr -> AnfM AnfExpr
-
--- data IExpr
-  -- = IInt Int
-  -- | IVar Var
---
--- data AExpr
-  -- = AImm IExpr
-  -- | ABin Op    IExpr IExpr
-  -- | ALet Var   AExpr AExpr
-  -- | ALam Var   AExpr
-  -- | AApp IExpr IExpr
-
-type AnfExpr = Expr
-type ImmExpr = Expr
-\end{code}
-</div>
-
-Source Language
----------------
-
-Lets commence by defining the source language that we wish to work with:
-
-\begin{code}
-data Expr
-  = EInt  Int               -- ^ Integers
-  | EVar  Var               -- ^ Variables
-  | EBin  Op   Expr Expr    -- ^ Binary Operators
-  | ELet  Var  Expr Expr    -- ^ Let-binders
-  | ELam  Var  Expr         -- ^ Function definitions
-  | EApp  Expr Expr         -- ^ Function applications
-  deriving (Show)
-\end{code}
-
-The language, defined by `Expr` has integers, variables, binary operators,
-let-binders and function definitions (lambdas) and calls (applications).
-In the above, `Var` and `Op` are simply:
-
-\begin{code}
-type Var = String
-
-data Op  = Plus | Minus | Times
-         deriving (Show)
-\end{code}
-
-For example, the source expression above corresponds to the value:
-
-\begin{code}
--- ((2 + 3) * (12 - 4)) * (7 + 8)
-srcExpr :: Expr
-srcExpr = EBin Times
-            (EBin Times
-              (EBin Plus  (EInt  2) (EInt 3))
-              (EBin Minus (EInt 12) (EInt 4)))
-            (EBin Plus (EInt 7) (EInt 8))
-\end{code}
-
-A-Normal Form
--------------
-
-Before we can describe a _conversion_ to A-Normal Form (ANF),
-we must pin down what ANF _is_. Our informal description was:
-``each call or primitive operation's arguments are immediate
-  values, i.e. constants or variable lookups''.
-
-We _could_ define a brand new datatypes, say `IExpr` and `AExpr`
-whose values correspond to _immediate_ and _ANF_ terms.
-(Try it, as an exercise.) Unfortunately, doing so leads to a
-bunch of code duplication, e.g. duplicate printers for `Expr`
-and `AExpr`. Instead, lets see how we can use refinements to
-carve out suitable subsets.
-
-**Immediate Expressions**
-
-An `Expr` is **immediate** if it is a `Number` or a `Var`;
-we can formalize this as a Haskell predicate:
-
-\begin{code}
-{-@ measure isImm @-}
-isImm :: Expr -> Bool
-isImm (EInt _) = True
-isImm (EVar _) = True
-isImm _        = False
-\end{code}
-
-and then we can use the predicate to define a refinement type
-for _immediate_ expressions:
-
-\begin{code}
-{-@ type ImmExpr = {v:Expr | isImm v} @-}
-\end{code}
-
-For example, `e1` is immediate but `e2` is not:
-
-\begin{code}
-{-@ e1 :: ImmExpr @-}
-e1 = EInt 7
-
-{-@ e2 :: ImmExpr @-}
-e2 = EBin Plus e1 e1
-\end{code}
-
-**ANF Expressions**
-
-Similiarly, an `Expr` is in **ANF** if all arguments for operators
-and applications are **immediate**. Once again, we can formalize
-this intuition as a Haskell predicate:
-
-\begin{code}
-{-@ measure isAnf @-}
-isAnf :: Expr -> Bool
-isAnf (EInt {})      = True
-isAnf (EVar {})      = True
-isAnf (EBin _ e1 e2) = isImm e1 && isImm e2  -- args for operators
-isAnf (EApp e1 e2)   = isImm e1 && isImm e2  -- must be immediate,
-isAnf (ELet _ e1 e2) = isAnf e1 && isAnf e2  -- and sub-expressions
-isAnf (ELam _ e)     = isAnf e               -- must be in ANF
-\end{code}
-
-and then use the predicate to define the subset of _legal_ ANF expressions:
-
-\begin{code}
-{-@ type AnfExpr = {v:Expr | isAnf v} @-}
-\end{code}
-
-For example, `e2` above _is_ in ANF but `e3` is not:
-
-\begin{code}
-{-@ e2' :: AnfExpr @-}
-e2' = EBin Plus e1 e1
-
-{-@ e3 :: AnfExpr @-}
-e3 = EBin Plus e2' e2'
-\end{code}
-
-ANF Conversion: Intuition
--------------------------
-
-Now that we have clearly demarcated the territories belonging to plain `Expr`,
-immediate `ImmExpr` and A-Normal `AnfExpr`, lets see how we can convert the
-former to the latter.
-
-Our goal is to convert expressions like
-
-```haskell
-((2 + 3) * (12 - 4)) * (7 + 8)
-```
-
-into
-
-```haskell
-let anf0 = 2 + 3
-    anf1 = 12 - 4
-    anf2 = anf0 * anf1
-    anf3 = 7 + 8
-in
-    anf2 * anf3
-```
-
-Generalising a bit, we want to convert
-
-```haskell
-e1 + e2
-```
-
-into
-
-```
-let x1  = a1  ... xn  = an
-    x1' = a1' ... xm' = am'
-in
-    v1 + v2
-```
-
-where, `v1` and `v2` are immediate, and `ai` are ANF.
-
-**Making Arguments Immediate**
-
-In other words, the key requirement is a way to crunch
-arbitrary _argument expressions_ like `e1` into **a pair**
-
-```haskell
-([(x1, a1) ... (xn, an)], v1)
-```
-
-where
-
-1. `a1...an` are `AnfExpr`, and
-2. `v1` is an immediate `ImmExpr`
-
-such that `e1` is _equivalent_ to `let x1 = a1 ... xn = an in v1`.
-Thus, we need a function
-
-```haskell
-imm :: Expr -> ([(Var, AnfExpr)], ImmExpr)
-```
-
-which we will use to **make arguments immediate** thereby yielding
-a top level conversion function
-
-```haskell
-anf :: Expr -> AnfExpr
-```
-
-As we need to generate "temporary" intermediate
-binders, it will be convenient to work within a
-monad that generates `fresh` variables:
-
-\begin{code}
-type AnfM a = State Int a
-
-fresh :: AnfM Var
-fresh = do
-  n <- get
-  put (n+1)
-  return ("anf" ++ show n)
-\end{code}
-
-Thus, the conversion functions will have the types:
-
-```haskell
-anf :: Expr -> AnfM AnfExpr
-imm :: Expr -> AnfM ([(Var, AnfExpr)], ImmExpr)
-```
-
-ANF Conversion: Code
---------------------
-
-We can now define the top-level conversion thus:
-
-\begin{code}
---------------------------------------------------------------------------------
-{-@ anf :: Expr -> AnfM AnfExpr @-}
---------------------------------------------------------------------------------
-anf (EInt n) =
-  return (EInt n)
-
-anf (EVar x) =
-  return (EVar x)
-
-anf (ELet x e1 e2) = do
-  a1 <- anf e1
-  a2 <- anf e2
-  return (ELet x a1 a2)
-
-anf (EBin o e1 e2) = do
-  (b1s, v1) <- imm e1
-  (b2s, v2) <- imm e2
-  return (mkLet (b1s ++ b2s) (EBin o v1 v2))
-
-anf (ELam x e) = do
-  a <- anf e
-  return (ELam x a)
-
-anf (EApp e1 e2) = do
-  (b1s, v1) <- imm e1
-  (b2s, v2) <- imm e2
-  return (mkLet (b1s ++ b2s) (EApp v1 v2))
-\end{code}
-
-In `anf` the real work happens inside `imm` which takes an arbitary
-_argument_ expression and makes it **immediate** by generating temporary
-(ANF) bindings. The resulting bindings (and immediate values) are
-composed by the helper `mkLet` that takes a list of binders and a body
-`AnfExpr` and stitches them into a single `AnfExpr`:
-
-\begin{code}
-{-@ mkLet :: [(Var, AnfExpr)] -> AnfExpr -> AnfExpr @-}
-mkLet []         e' = e'
-mkLet ((x,e):bs) e' = ELet x e (mkLet bs e')
-\end{code}
-
-The arguments are made immediate by `imm` defined as:
-
-\begin{code}
---------------------------------------------------------------------------------
-{-@ imm :: Expr -> AnfM ([(Var, AnfExpr)], ImmExpr) @-}
---------------------------------------------------------------------------------
-imm (EInt n)       = return ([], EInt n)
-imm (EVar x)       = return ([], EVar x)
-imm e@(ELet {})    = immExpr e
-imm e@(ELam {})    = immExpr e
-imm (EBin o e1 e2) = imm2 e1 e2 (EBin o)
-imm (EApp e1 e2)   = imm2 e1 e2 EApp
-\end{code}
-
-* Numbers and variables are already immediate, and are returned directly.
-
-* Let-binders and lambdas are simply converted to ANF, and assigned to a fresh
-  binder:
-
-\begin{code}
-{-@ immExpr :: Expr -> AnfM ([(Var, AnfExpr)], ImmExpr) @-}
-immExpr e = do
-  a <- anf e
-  t <- fresh
-  return ([(t, a)], EVar t)
-\end{code}
-
-* Finally, binary operators and applications are converted by `imm2` that
-  takes two arbitrary expressions and an expression constructor, yielding
-  the anf-binders and immediate expression.
-
-\begin{code}
-imm2 :: Expr -> Expr -> (ImmExpr -> ImmExpr -> AnfExpr)
-     -> AnfM ([(Var, AnfExpr)], ImmExpr)
-imm2 e1 e2 f = do
-  (b1s, v1) <- imm e1
-  (b2s, v2) <- imm e2
-  t         <- fresh
-  let bs'    = b1s ++ b2s ++ [(t, f v1 v2)]
-  return      (bs', EVar t)
-\end{code}
-
-
-You can run it thus:
-
-\begin{code}
-toAnf :: Expr -> AnfExpr
-toAnf e = evalState (anf e) 0
-\end{code}
-
-```haskell
-ghci> toAnf srcExpr
-ELet "anf0" (EBin Plus (EInt 2) (EInt 3))
- (ELet "anf1" (EBin Minus (EInt 12) (EInt 4))
-   (ELet "anf2" (EBin Times (EVar "anf0") (EVar "anf1"))
-     (ELet "anf3" (EBin Plus (EInt 7) (EInt 8))
-       (EBin Times (EVar "anf2") (EVar "anf3")))))
-```
-
-which, can be pretty-printed to yield exactly the outcome desired at the top:
-
-```haskell
-let anf0 = 2 + 3
-    anf1 = 12 - 4
-    anf2 = anf0 * anf1
-    anf3 = 7 + 8
-in
-    anf2 * anf3
-```
-
-
-There! The refinements make this tricky conversion quite
-straightforward and natural, without requiring us to
-duplicate types and code. As an exercise, can you use
-refinements to:
-
-1. Port the classic [continuation-based conversion ?][anf-might]
-2. Check that the conversion yields [well-scoped terms ?][lh-scoped]
-
-[lh-scoped]: http://ucsd-progsys.github.io/liquidhaskell-tutorial/10-case-study-associative-maps.html#/using-maps-well-scoped-expressions
-[anf-felleisen]: https://users.soe.ucsc.edu/~cormac/papers/pldi93.pdf
-[anf-might]: http://matt.might.net/articles/a-normalization/
diff --git a/docs/blog/2016-09-18-refinement-reflection.lhs b/docs/blog/2016-09-18-refinement-reflection.lhs
deleted file mode 100644
--- a/docs/blog/2016-09-18-refinement-reflection.lhs
+++ /dev/null
@@ -1,408 +0,0 @@
----
-layout: post
-title: "Refinement Reflection: Haskell as a theorem prover"
-date: 2016-09-18
-comments: true
-external-url:
-author: Niki Vazou
-published: true
-categories: reflection
-demo: RefinementReflection.hs
----
-
-We've taught LiquidHaskell a new trick that we call ``Refinement Reflection''
-which lets us turn Haskell into a theorem prover capable of proving arbitrary
-properties of code. The key idea is to **reflect** the code of the function into
-its **output type**, which lets us then reason about the function at the
-(refinement) type level. Lets see how to use refinement types to express a
-theorem, for example that fibonacci is a monotonically increasing function, 
-then write plain Haskell code to reify a paper-and-pencil-style proof 
-for that theorem, that can be machine checked by LiquidHaskell.
-
-<!-- more -->
-
-<br>
-<br>
-<br>
-
-<div class="row-fluid">
-  <div class="span12 pagination-centered">
-  <img src="https://eyesofodysseus.files.wordpress.com/2013/06/full-moon-over-ocean-reflection.jpg"
-       alt="Reflection" width="300">
-       <br>
-       <br>
-       <br>
-       The beauty of Liquid Reflection.
-       <br>
-       <br>
-       <br>
-  </div>
-</div>
-
-
-<div class="hidden">
-\begin{code}
-{-@ LIQUID "--higherorder"     @-}
-{-@ LIQUID "--totality"        @-}
-module RefinementReflection where
-import Language.Haskell.Liquid.ProofCombinators
-
-fib :: Int -> Int
-propPlusComm :: Int -> Int -> Proof 
-propOnePlueOne :: () -> Proof 
-fibTwo :: () -> Proof 
-fibCongruence :: Int -> Int -> Proof
-fibUp :: Int -> Proof 
-fibTwoPretty :: Proof 
-fibThree :: () -> Proof 
-fMono :: (Int -> Int)
-      -> (Int -> Proof)
-      -> Int
-      -> Int 
-      -> Proof 
-fibMono :: Int -> Int -> Proof 
-
-\end{code}
-</div>
-
-Shallow vs. Deep Specifications
--------------------------------
-
-Up to now, we have been using Liquid Haskell to specify and verify "shallow"
-specifications that abstractly describe the behavior of functions.  For example,
-below, we specify and verify that `fib`restricted to natural numbers, always
-terminates returning a natural number.
-
-\begin{code}
-{-@ fib :: i:Nat -> Nat / [i] @-}
-fib i | i == 0    = 0 
-      | i == 1    = 1 
-      | otherwise = fib (i-1) + fib (i-2)
-\end{code}
-
-In this post we present how refinement reflection is used to verify 
-"deep" specifications that use the exact definition of Haskell functions. 
-For example, we will prove that the Haskell `fib` function is increasing.
-
-
-
-Propositions
-------------
-
-To begin, we import [ProofCombinators][proofcomb], a (Liquid) Haskell 
-library that defines and manipulates logical proofs. 
-
-```haskell
-import Language.Haskell.Liquid.ProofCombinators
-```
-
-A `Proof` is a data type that carries no run time information
-
-```haskell
-type Proof = ()
-```
-
-but can be refined with desired logical propositions.
-For example, the following type states that `1 + 1 == 2`
-
-\begin{code}
-{-@ type OnePlusOne = {v: Proof | 1 + 1 == 2} @-}
-\end{code}
-
-Since the `v` and `Proof` are irrelevant, we may as well abbreviate 
-the above to 
-
-\begin{code}
-{-@ type OnePlusOne' = { 1 + 1 == 2 } @-}
-\end{code}
-
-
-As another example, the following function type declares 
-that _for each_ `x` and `y` the plus operator commutes. 
-
-\begin{code}
-{-@ type PlusComm = x:Int -> y:Int -> {x + y == y + x} @-} 
-\end{code}
-
-
-
-Trivial Proofs
---------------
-
-We prove the above theorems using Haskell programs. 
-The `ProofCombinators` module defines the `trivial` proof
-
-```haskell
-trivial :: Proof 
-trivial = ()
-```
-
-and the "casting" operator `(***)` that makes proof terms look 
-nice:
-
-```haskell
-data QED = QED
-
-(***) :: a -> QED -> Proof
-_ *** _ = ()
-```
-
-Using the underlying SMT's knowledge on linear arithmetic, 
-we can trivially prove the above propositions.
-
-\begin{code}
-{-@ propOnePlusOne :: _ -> OnePlusOne @-} 
-propOnePlusOne _ = trivial *** QED 
-
-{-@ propPlusComm :: PlusComm @-} 
-propPlusComm _ _ = trivial *** QED 
-\end{code}
-
-
-We saw how we use SMT's knowledge on linear arithmetic 
-to trivially prove arithmetic properties. But how can 
-we prove ``deep'' properties on Haskell's functions?
-
-
-Refinement Reflection 
----------------------
-
-Refinement Reflection allows deep specification and 
-verification by reflecting the code implementing a Haskell
-function into the function’s output refinement type.
-
-Refinement Reflection proceeds in 3 steps: definition, reflection, and application.
-Consider reflecting the definition of `fib` into the logic
-
-\begin{code}
-{-@ reflect fib @-}
-\end{code}
-
-then the following three reflection steps will occur. 
-
-Step 1: Definition 
-------------------
-
-Reflection of the Haskell function `fib` defines in logic 
-an _uninterpreted_ function `fib` that satisfies the congruence axiom.
-
-In the logic the function `fib` is defined.
-
-```haskell
-fib :: Int -> Int 
-```
-
-SMT only knows that `fib` satisfies the congruence axiom.
-
-\begin{code}
-{-@ fibCongruence :: i:Nat -> j:Nat -> {i == j => fib i == fib j} @-}
-fibCongruence _ _ = trivial *** QED 
-\end{code}
-
-Other than congruence, SMT knowns nothing for the function `fib`,
-until reflection happens!
-
-
-Step 2: Reflection
-------------------
-
-As a second step, Liquid Haskell connects the Haskell function `fib`
-with the homonymous logical function, 
-by reflecting the implementation of `fib` in its result type. 
-
-
-The result type of `fib` is automatically strengthened to the following.
-
-```haskell
-fib :: i:Nat -> {v:Nat | v == fib i && v = fibP i }
-```
-
-That is, the result satisfies the `fibP` predicate
-exactly reflecting the implementation of `fib`.
-
-```haskell
-fibP i = if i == 0 then 0 else
-         if i == 1 then 1 else
-         fib (i-1) + fib (i-2)
-```
-
-Step 3: Application 
--------------------
-
-With the reflected refinement type,
-each application of `fib` automatically unfolds the definition of `fib` 
-once. 
-As an example, applying `fib` to `0`, `1`, and `2` allows us to prove that `fib 2 == 1`:
-
-\begin{code}
-{-@ fibTwo :: _ -> { fib 2 == 1 } @-}
-fibTwo _ = [fib 0, fib 1, fib 2] *** QED
-\end{code}
-
-Though valid, the above `fibTwo` proof is not pretty! 
-
-
-Structuring Proofs 
-------------------
-
-To make our proofs look nice, we use combinators from 
-the `ProofCombinators` library, which exports a family 
-of operators `(*.)` where `*` comes from the theory of 
-linear arithmetic and the refinement type of `x *. y` 
-
-+ **requires** that `x *. y` holds and 
-+ **ensures** that the returned value is equal to `x`.
-
-For example, `(==.)` and `(<=.)` are predefined in `ProofCombinators` as
-
-```haskell
-(==.) :: x:a -> y:{a| x==y} -> {v:a| v==x}
-x ==. _ = x
-
-(<=.) :: x:a -> y:{a| x<=y} -> {v:a| v==x}
-x <=. _ = x
-```
-
-Using these predefined operators, we construct paper and pencil-like proofs 
-for the `fib` function.
-
-\begin{code}
-{-@ fibTwoPretty :: { fib 2 == 1 } @-}
-fibTwoPretty 
-  =   fib 2 
-  ==. fib 1 + fib 0 
-  *** QED
-\end{code}
-
-
-
-Because operator 
------------------
-
-To allow the reuse of existing proofs, `ProofCombinators` defines the because 
-operator `(∵)`
-
-```haskell
-(∵) :: (Proof -> a) -> Proof -> a
-f ∵ y = f y
-```
-
-For example, `fib 3 == 2` holds because `fib 2 == 1`:
-
-\begin{code}
-{-@ fibThree :: _ -> { fib 3 == 2 } @-}
-fibThree _ 
-  =   fib 3 
-  ==. fib 2 + fib 1
-  ==. 1     + 1      ∵ fibTwoPretty
-  ==. 2 
-  *** QED
-\end{code}
-
-
-
-Proofs by Induction (i.e. Recursion) 
-------------------------------------
-
-Next, combining the above operators we specify and prove that 
-`fib` is increasing, that is for each natural number `i`, 
-`fib i <= fib (i+1)`. 
-
-We specify the theorem as a refinement type for `fibUp`
-and use Haskell code to persuade Liquid Haskell that 
-the theorem holds. 
-
-\begin{code}
-{-@ fibUp :: i:Nat -> {fib i <= fib (i+1)} @-}
-fibUp i
-  | i == 0
-  =   fib 0 <. fib 1
-  *** QED
-
-  | i == 1
-  =   fib 1 <=. fib 1 + fib 0 <=. fib 2
-  *** QED
-
-  | otherwise
-  =   fib i
-  ==. fib (i-1) + fib (i-2)
-  <=. fib i     + fib (i-2) ∵ fibUp (i-1)
-  <=. fib i     + fib (i-1) ∵ fibUp (i-2)
-  <=. fib (i+1)
-  *** QED
-\end{code}
-
-The proof proceeds _by induction on_ `i`. 
-
-+ The base cases `i == 0` and `i == 1` are represented 
-  as Haskell's case splitting. 
-
-+ The inductive hypothesis is represented by recursive calls 
-  on smaller inputs. 
-
-Finally, the SMT solves arithmetic reasoning to conclude the proof.  
-
-Higher Order Theorems
-----------------------
-
-Refinement Reflection can be used to express and verify higher order theorems!
-For example, `fMono` specifies that each locally increasing function is monotonic! 
-
-\begin{code}
-{-@ fMono :: f:(Nat -> Int)
-          -> fUp:(z:Nat -> {f z <= f (z+1)})
-          -> x:Nat
-          -> y:{Nat|x < y}
-          -> {f x <= f y} / [y] 
-  @-}
-fMono f thm x y  
-  | x + 1 == y
-  = f y ==. f (x + 1)
-         >. f x       ∵ thm x
-        *** QED
-
-  | x + 1 < y
-  = f x
-  <.  f (y-1)         ∵ fMono f thm x (y-1)
-  <.  f y             ∵ thm (y-1)
-  *** QED
-\end{code}
-
-Again, the recursive implementation of `fMono` depicts the paper and pencil 
-proof of `fMono` by induction on the decreasing argument `/ [y]`. 
-
-Since `fib` is proven to be locally increasing by `fUp`, we use `fMono` 
-to prove that `fib` is monotonic. 
-
-\begin{code}
-{-@ fibMono :: n:Nat -> m:{Nat | n < m }  -> {fib n <= fib m} @-}
-fibMono = fMono fib fibUp
-\end{code}
-
-
-Conclusion
-----------
-
-We saw how refinement reflection turns Haskell
-into a theorem prover by reflecting the code 
-implementing a Haskell function into the 
-function’s output refinement type.
-
-Refinement Types are used to express theorems, 
-Haskell code is used to prove such theorems
-expressing paper pencil proofs, and Liquid Haskell 
-verifies the validity of the proofs!
-
-Proving `fib` monotonic is great, but this is Haskell!
-Wouldn’t it be nice to prove theorems about inductive data types 
-and higher order functions? Like fusions and folds? 
-Or program equivalence on run-time optimizations like map-reduce?
-
-Stay tuned!
-
-Even better, if you happen you be in Nara for ICFP'16, 
-come to my [CUFP tutorial][cufp16] for more!
-
-
-[cufp16]: http://cufp.org/2016/t6-niki-vazou-liquid-haskell-intro.html
-[proofcomb]:https://github.com/ucsd-progsys/liquidhaskell/blob/develop/include/Language/Haskell/Liquid/ProofCombinators.hs
diff --git a/docs/blog/2016-10-06-structural-induction.lhs b/docs/blog/2016-10-06-structural-induction.lhs
deleted file mode 100644
--- a/docs/blog/2016-10-06-structural-induction.lhs
+++ /dev/null
@@ -1,280 +0,0 @@
----
-layout: post
-title: "Refinement Reflection on ADTs: Lists are Monoids"
-date: 2016-10-06
-comments: true
-external-url:
-author: Niki Vazou
-published: true
-categories: reflection, induction, measures, monoids
-demo: MonoidList.hs
----
-
-[Previously][refinement-reflection] we saw how Refinement Reflection
-can be used to write and prove **in Haskell** theorems **about Haskell**
-functions and have such proofs machine checked.
-
-Today, we will see how Refinement Reflection works on **recursive data types**.
-
-As an example, we will prove that **lists are monoids** (under nil and append).
-
-Lets see how to express
-
-* the (monoid) laws as liquid types,
-* the (monoid) proofs as plain haskell functions,
-
-and have LiquidHaskell check that the code indeed
-proves the corresponding laws.
-
-<!-- more -->
-
-<br>
-<br>
-<br>
-
-<div class="row-fluid">
-  <div class="span12 pagination-centered">
-  <img src="http://www.aaronartprints.org/images/Paintings/4597.jpg"
-       alt="Recursion" width="300">
-       <br>
-       <br>
-       <br>
-       Recursive Paper and Pencil Proofs.
-       "Drawing Hands" by Escher.
-       <br>
-       <br>
-       <br>
-  </div>
-</div>
-
-
-<div class="hidden">
-\begin{code}
-{-@ LIQUID "--higherorder"     @-}
-{-@ LIQUID "--totality"        @-}
-module StructuralInduction where
-import Language.Haskell.Liquid.ProofCombinators
-
-import Prelude hiding (length)
-
-length :: List a -> Int
-leftId :: List a -> Proof
-rightId :: List a -> Proof
-associativity :: List a -> List a -> List a -> Proof
-\end{code}
-</div>
-
-Lists
------
-
-First, lets define the `List a` data type
-
-\begin{code}
-data List a = N | C a (List a)
-\end{code}
-
-Induction on Lists
-------------------
-
-As we will see, *proofs* by structural induction will correspond to
-*programs* that perform *recursion* on lists. To keep things legit,
-we must verify that those programs are total and terminating.
-
-To that end, lets define a `length` function that
-computes the natural number that is the size of a
-list.
-
-\begin{code}
-{-@ measure length               @-}
-{-@ length      :: List a -> Nat @-}
-length N        = 0
-length (C x xs) = 1 + length xs
-\end{code}
-
-We lift `length` in the logic, as a [measure][the-advantage-of-measures].
-
-We can now tell Liquid Haskell that when proving termination
-on recursive functions with a list argument `xs`, it should
-check whether the `length xs` is decreasing.
-
-\begin{code}
-{-@ data List [length] a = N | C {hd :: a, tl :: List a} @-}
-\end{code}
-
-
-Reflecting Lists into the Logic
--------------------------------
-
-To talk about lists in the logic, we use the annotation
-
-\begin{code}
-{-@ LIQUID "--exact-data-cons" @-}
-\end{code}
-
-which **automatically** derives measures for
-
-* *testing* if a value has a given data constructor, and
-* *extracting* the corresponding field's value.
-
-For our example, LH will automatically derive the following
-functions in the refinement logic.
-
-\begin{spec}
-isN :: L a -> Bool         -- Haskell's null
-isC :: L a -> Bool         -- Haskell's not . null
-
-select_C_1 :: L a -> a     -- Haskell's head
-select_C_2 :: L a -> L a   -- Haskell's tail
-\end{spec}
-
-A programmer *never* sees the above operators; they are internally
-used by LH to **reflect** Haskell functions into the refinement logic,
-as we shall see shortly.
-
-Defining the Monoid Operators
------------------------------
-
-A structure is a monoid, when it has two operators:
-
-* the identity element `empty` and
-* an associative operator `<>`.
-
-Lets define these two operators for our `List`.
-
-* the identity element is the empty list, and
-* the associative operator `<>` is list append.
-
-\begin{code}
-{-@ reflect empty @-}
-empty  :: List a
-empty  = N
-
-{-@ infix   <> @-}
-{-@ reflect <> @-}
-(<>)           :: List a -> List a -> List a
-N        <> ys = ys
-(C x xs) <> ys = C x (xs <> ys)
-\end{code}
-
-LiquidHaskell automatically checked that the recursive `(<>)` 
-is terminating, by checking that the `length` of its first
-argument is decreasing. Since both the above operators are 
-provably terminating, LH lets us reflect them into logic.
-
-As with our [previous][refinement-reflection]
-`fibonacci` example, reflection of a function
-into logic, means strengthening the result type
-of the function with its implementation.
-
-Thus, the **automatically** derived, strengthened
-types for `empty` and `(<>)` will be
-
-\begin{spec}
-empty   :: {v:List a | v == empty && v == N }
-
-(<>) :: xs:List a -> ys:List a
-     -> {v:List a | v == xs <> ys &&
-                    v == if isN xs then ys else
-                         C (select_C_1 xs) (select_C_2 xs <> ys)
-        }
-\end{spec}
-
-In effect, the derived checker and selector functions are used
-to translate Haskell to logic. The above is just to *explain*
-how LH reasons about the operators; the programmer never (directly) 
-reads or writes the operators `isN` or `select_C_1` etc.
-
-Proving the Monoid Laws
-------------------------
-
-Finally, we have set everything up, (actually LiquidHaskell
-did most of the work for us) and we are ready to prove the
-monoid laws for the `List`.
-
-First we prove left identity of `empty`.
-
-\begin{code}
-{-@ leftId  :: x:List a -> { empty <> x == x } @-}
-leftId x
-   =   empty <> x
-   ==. N <> x
-   ==. x
-   *** QED
-\end{code}
-
-This proof was trivial, because left identity is satisfied
-by the way we defined `(<>)`.
-
-Next, we prove right identity of `empty`.
-
-\begin{code}
-{-@ rightId  :: x:List a -> { x <> empty  == x } @-}
-rightId N
-   =   N <> empty
-   ==. N
-   *** QED
-
-rightId (C x xs)
-   =   (C x xs) <> empty
-   ==. C x (xs <> empty)
-   ==. C x xs        ∵ rightId xs
-   *** QED
-\end{code}
-
-This proof is more tricky, as it requires **structural induction** which is
-encoded in LH proofs simply as **recursion**.  LH ensures that the inductive
-hypothesis is appropriately applied by checking that the recursive proof is
-total and terminating.  In the `rightId` case, for termination, Liquid Haskell
-checked that `length xs < length (C x xs)`.
-
-It turns out that we can prove lots of properties about lists using structural 
-induction, encoded in Haskell as
-
-* case splitting,
-* recursive calls, and
-* rewriting,
-
-To see a last example, lets prove the associativity of `(<>)`.
-
-\begin{code}
-{-@ associativity :: x:List a -> y:List a -> z:List a
-                  -> { x <> (y <> z) == (x <> y) <> z } @-}
-associativity N y z
-  =   N <> (y <> z)
-  ==. y <> z
-  ==. (N <> y) <> z
-  *** QED
-
-associativity (C x xs) y z
-  =  (C x xs) <> (y <> z)
-  ==. C x (xs <> (y <> z))
-  ==. C x ((xs <> y) <> z) ∵ associativity xs y z
-  ==. (C x (xs <> y)) <> z
-  ==. ((C x xs) <> y) <> z
-  *** QED
-\end{code}
-
-The above proof of associativity reifies the paper and pencil 
-proof by structural induction.
-
-With that, we can safely conclude that our user defined list
-is a monoid!
-
-
-Conclusion
-----------
-
-We saw how Refinement Reflection can be used to
-
-- specify properties of `ADTs`,
-- naturally encode structural inductive proofs of these properties, and
-- have these proofs machine checked by Liquid Haskell.
-
-Why is this useful? Because the theorems we prove refer to your Haskell
-functions!  Thus you (or in the future, the compiler) can use properties like
-monoid or monad laws to optimize your Haskell code.  In the future, we will
-present examples of code optimizations using monoid laws. Stay tuned!
-
-
-[refinement-reflection]: http://goto.ucsd.edu/~rjhala/liquid/haskell/blog/blog/2016/09/18/refinement-reflection.lhs/
-[the-advantage-of-measures]: http://goto.ucsd.edu/~rjhala/liquid/haskell/blog/blog/2014/02/11/the-advantage-of-measures.lhs/
diff --git a/docs/blog/2016-12-25-isomorphisms.lhs b/docs/blog/2016-12-25-isomorphisms.lhs
deleted file mode 100644
--- a/docs/blog/2016-12-25-isomorphisms.lhs
+++ /dev/null
@@ -1,342 +0,0 @@
----
-layout: post
-title: Isomorphisms for Proof Reductions
-date: 2016-12-25
-comments: true
-external-url:
-author: Vikraman Choudhury and Niki Vazou
-published: true
-categories: reflection 
-demo: Iso.hs
----
-
-[Previously][refinement-reflection] we saw how Refinement Reflection
-can be used to write and prove **in Haskell** theorems **about Haskell**
-functions and have such proofs machine checked by Liquid Haskell.
-
-As a limitation, Liquid Haskell offers no proof generation techniques: 
-The user needs to manually provide all the proofs. 
-
-Today we will see how proof generation can be simplified by data type isomorphisms. 
-
-As an example, a user defined `Peano` data type enjoyes all the 
-arithmetic properties of natural numbers since `Peano` and natural numbers 
-are provably **isomorphic**. 
-
-<!-- more -->
-
-<br>
-<br>
-<br>
-
-<div class="row-fluid">
-  <div class="span12 pagination-centered">
-  <img src="http://www.aaronartprints.org/images/Paintings/4597.jpg"
-       alt="Recursion" width="300">
-       <br>
-       <br>
-       <br>
-       Recursive Paper and Pencil Proofs.
-       "Drawing Hands" by Escher.
-       <br>
-       <br>
-       <br>
-  </div>
-</div>
-
-
-<div class="hidden">
-\begin{code}
-{-@ LIQUID "--higherorder" @-}
-{-@ LIQUID "--totalhaskell" @-}
-{-@ LIQUID "--exactdc" @-}
-{-@ LIQUID "--diffcheck" @-}
-{-@ LIQUID "--eliminate=some" @-}
-
-module Iso where
-
-import Language.Haskell.Liquid.ProofCombinators
-\end{code}
-
-</div>
-
-First, we define `Peano` numbers as a data type 
-and the function `leqPeano` that compares two peano numbers.
-
-
-\begin{code}
-{-@ data Peano [toNat] = Z | S Peano @-}
-data Peano = Z | S Peano deriving (Eq)
-
-{-@ axiomatize leqPeano @-}
-leqPeano :: Peano -> Peano -> Bool
-leqPeano Z _         = True
-leqPeano _ Z         = False
-leqPeano (S n) (S m) = leqPeano n m
-\end{code}
-
-We can use Refinement Reflection to provide an 
-explicit proof that comparison on peano numbers is *total*, 
-that is, for every two numbers `n` and `m` 
-either `leqPeano n m` or `leqPeano m n` always holds. 
-
-\begin{code}
-{-@ leqNTotal :: n:Peano -> m:Peano 
-              -> {(leqPeano n m) || (leqPeano m n)} 
-              / [toNat n + toNat m] @-}
-leqNTotal :: Peano -> Peano -> Proof
-leqNTotal Z m = leqPeano Z m *** QED
-leqNTotal n Z = leqPeano Z n *** QED
-leqNTotal (S n) (S m)
-  =   (leqPeano (S n) (S m) || leqPeano (S m) (S n))
-  ==. (leqPeano n m || leqPeano (S m) (S n)) 
-      ? (leqNTotal n m)
-  ==. (leqPeano n m || leqPeano m n) 
-      ? (leqNTotal m n)
-  *** QED
-\end{code}
-
-The proof proceeds by induction on the sum of `n` and `m`. 
-Liquid Haskell captures this generalized induction by 
-ensuring that the value `toNat n + toNat m` is decreasing
-where `toNat` maps Peano to Natural numbers. 
-
-\begin{code}
-{-@ measure toNat @-}
-{-@ toNat :: Peano -> Nat @-}
-toNat :: Peano -> Int
-toNat Z = 0
-toNat (S n) = 1 + toNat n
-\end{code}
-
-Note, that the type `Nat` is just a refinement for the Haskell's integers
-\begin{spec}
-type Nat = {v:Int | 0 <= v}
-\end{spec}
-
-
-First, we'll express verified typeclasses using Haskell records, but with LiquidHaskell refinements to express laws. As
-an example, let's define `VerifiedOrd`, which is the same as the `Ord` typeclass, but with total order laws added.
-
-\begin{code}
-{-@ data VerifiedOrd a = VerifiedOrd {
-      leq     :: a -> a -> Bool
-    , refl    :: x:a -> { leq x x }
-    , antisym :: x:a -> y:a -> { leq x y && leq y x ==> x == y }
-    , trans   :: x:a -> y:a -> z:a -> { leq x y && leq y z ==> leq x z }
-    , total   :: x:a -> y:a -> { leq x y || leq y x }
-    }
-@-}
-data VerifiedOrd a = VerifiedOrd {
-    leq     :: a -> a -> Bool
-  , refl    :: a -> Proof
-  , antisym :: a -> a -> Proof
-  , trans   :: a -> a -> a -> Proof
-  , total   :: a -> a -> Proof
-}
-\end{code}
-
-The `leq` function represents the `<=` operator in `Ord`, and `refl`, `antisym`, `trans`, `total`, express the
-reflexivity, antisymmetry, transitivity and totality properties respectively, that a total order requires. Notice how
-the refinements express the laws, and the actual code is simply a function that returns `Proof` or `()`.
-
-Now, let's see how to define some simple verified instances. We need to instantiate `leq` for our type, "reflect" it
-into the logic, and prove all the required properties. For primitive types like `Int` or `Double`, it's "trivial"
-because we trust the SMT solver which already knows about integers.
-
-\begin{code}
-{-@ axiomatize leqInt @-}
-leqInt :: Int -> Int -> Bool
-leqInt x y = x <= y
-
-{-@ leqIntRefl :: x:Int -> { leqInt x x } @-}
-leqIntRefl :: Int -> Proof
-leqIntRefl x = leqInt x x ==. x <= x *** QED
-
-{-@ leqIntAntisym :: x:Int -> y:Int -> { leqInt x y && leqInt y x ==> x == y } @-}
-leqIntAntisym :: Int -> Int -> Proof
-leqIntAntisym x y = (leqInt x y && leqInt y x) ==. (x <= y && y <= x) ==. x == y *** QED
-
-{-@ leqIntTrans :: x:Int -> y:Int -> z:Int -> { leqInt x y && leqInt y z ==> leqInt x z } @-}
-leqIntTrans :: Int -> Int -> Int -> Proof
-leqIntTrans x y z = (leqInt x y && leqInt y z) ==. (x <= y && y <= z) ==. x <= z ==. leqInt x z *** QED
-
-{-@ leqIntTotal :: x:Int -> y:Int -> { leqInt x y || leqInt y x } @-}
-leqIntTotal :: Int -> Int -> Proof
-leqIntTotal x y = (leqInt x y || leqInt y x) ==. (x <= y || y <= x) *** QED
-
-vordInt :: VerifiedOrd Int
-vordInt = VerifiedOrd leqInt leqIntRefl leqIntAntisym leqIntTrans leqIntTotal
-\end{code}
-
-How about a complex datatype? Let's consider an inductive datatype, the peano natural numbers. Not surprisingly, the
-proofs follow by induction. For conciseness, we only show totality and elide the rest.
-
-Writing down proofs for more complex datatypes is tedious, it requires case analysis for each constructor and using the
-induction hypothesis. However, we can decompose Haskell datatypes into sums and products, and we can build up compound
-proofs using isomorphisms! To that end, we design some machinery to express isomorphisms, and prove that laws are
-preserved under isomorphic images.
-
-\begin{code}
-{-@ data Iso a b = Iso {
-      to   :: a -> b
-    , from :: b -> a
-    , tof  :: y:b -> { to (from y) == y }
-    , fot  :: x:a -> { from (to x) == x }
-    }
-@-}
-data Iso a b = Iso {
-    to   :: a -> b
-  , from :: b -> a
-  , tof  :: b -> Proof
-  , fot  :: a -> Proof
-}
-\end{code}
-
-An isomorphism between types `a` and `b` is a pair of functions `to :: a -> b` and `from :: b -> a` that are mutually
-inverse to each other. We now claim that total order laws are preserved under `Iso`; this amounts to building up a
-`VerifiedOrd b`, given a `VerifiedOrd a` and an `Iso a b`.
-
-\begin{code}
-{-@ axiomatize leqFrom @-}
-leqFrom :: (a -> a -> Bool)
-        -> (b -> a)
-        -> (b -> b -> Bool)
-leqFrom leqa from x y = leqa (from x) (from y)
-
-{-@ leqFromRefl :: leqa:(a -> a -> Bool) -> leqaRefl:(x:a -> { leqa x x })
-                -> from:(b -> a)
-                -> x:b -> { leqFrom leqa from x x }
-@-}
-leqFromRefl :: (a -> a -> Bool) -> (a -> Proof)
-            -> (b -> a)
-            -> b -> Proof
-leqFromRefl leqa leqaRefl from x =
-      leqFrom leqa from x x
-  ==. leqa (from x) (from x)
-  ==. True ? leqaRefl (from x)
-  *** QED
-
-{-@ leqFromAntisym :: leqa:(a -> a -> Bool)
-                   -> leqaAntisym:(x:a -> y:a -> { leqa x y && leqa y x ==> x == y })
-                   -> to:(a -> b) -> from:(b -> a) -> tof:(y:b -> { to (from y) == y })
-                   -> x:b -> y:b -> { leqFrom leqa from x y && leqFrom leqa from y x ==> x == y }
-@-}
-leqFromAntisym :: (Eq a, Eq b)
-               => (a -> a -> Bool) -> (a -> a -> Proof)
-               -> (a -> b) -> (b -> a) -> (b -> Proof)
-               -> b -> b -> Proof
-leqFromAntisym leqa leqaAntisym to from tof x y
-  =   (leqFrom leqa from x y && leqFrom leqa from y x)
-  ==. (leqa (from x) (from y) && leqa (from y) (from x))
-  ==. from x == from y ? leqaAntisym (from x) (from y)
-  ==. to (from x) == to (from y)
-  ==. x == to (from y) ? tof x
-  ==. x == y           ? tof y
-  *** QED
-
-{-@ leqFromTrans :: leqa:(a -> a -> Bool)
-                 -> leqaTrans:(x:a -> y:a -> z:a -> { (leqa x y) && (leqa y z) ==> (leqa x z) })
-                 -> from:(b -> a)
-                 -> x:b -> y:b -> z:b
-                 -> { leqFrom leqa from x y && leqFrom leqa from y z ==> leqFrom leqa from x z }
-@-}
-leqFromTrans :: (a -> a -> Bool) -> (a -> a -> a -> Proof)
-             -> (b -> a)
-             -> b -> b -> b -> Proof
-leqFromTrans leqa leqaTrans from x y z =
-      (leqFrom leqa from x y && leqFrom leqa from y z)
-  ==. (leqa (from x) (from y) && leqa (from y) (from z))
-  ==. leqa (from x) (from z) ? leqaTrans (from x) (from y) (from z)
-  ==. leqFrom leqa from x z
-  *** QED
-
-{-@ leqFromTotal :: leqa:(a -> a -> Bool) -> leqaTotal:(x:a -> y:a -> { (leqa x y) || (leqa y x) })
-                 -> from:(b -> a) -> x:b -> y:b -> { leqFrom leqa from x y || leqFrom leqa from y x }
-@-}
-leqFromTotal :: (a -> a -> Bool) -> (a -> a -> Proof)
-             -> (b -> a) -> b -> b -> Proof
-leqFromTotal leqa leqaTotal from x y =
-      (leqFrom leqa from x y || leqFrom leqa from y x)
-  ==. (leqa (from x) (from y) || leqa (from y) (from x))
-  ==. True ? leqaTotal (from x) (from y)
-  ==. leqFrom leqa from y x
-  *** QED
-
-vordIso :: (Eq a, Eq b) => Iso a b -> VerifiedOrd a -> VerifiedOrd b
-vordIso (Iso to from tof fot) (VerifiedOrd leqa leqaRefl leqaAntisym leqaTrans leqaTotal) =
-  VerifiedOrd
-    (leqFrom leqa from)
-    (leqFromRefl leqa leqaRefl from)
-    (leqFromAntisym leqa leqaAntisym to from tof)
-    (leqFromTrans leqa leqaTrans from)
-    (leqFromTotal leqa leqaTotal from)
-\end{code}
-
-We can now write a `VerifiedOrd` for `Peano` by mapping it onto `type Nat = { n:Int | 0 <= n }`, which is easier to
-prove properties about because it's just an integer!
-
-\begin{code}
-{-@ type Nat = { n:Int | 0 <= n } @-}
-type Nat = Int
-
-{-@ axiomatize fromNat @-}
-{-@ fromNat :: Nat -> Peano @-}
-fromNat :: Nat -> Peano
-fromNat n
-  | n == 0 = Z
-  | otherwise = S (fromNat (n - 1))
-
-{-@ toFrom :: x:Nat -> { toNat (fromNat x) == x } @-}
-toFrom :: Nat -> Proof
-toFrom n
-  | n == 0 = toNat (fromNat 0) ==. toNat Z ==. 0 *** QED
-  | n > 0 = toNat (fromNat n)
-        ==. toNat (S (fromNat (n - 1)))
-        ==. 1 + toNat (fromNat (n - 1))
-        ==. 1 + (n - 1) ? toFrom (n - 1)
-        ==. n
-        *** QED
-
-{-@ fromTo :: x:Peano -> { fromNat (toNat x) == x } @-}
-fromTo :: Peano -> Proof
-fromTo Z = fromNat (toNat Z) ==. fromNat 0 ==. Z *** QED
-fromTo (S n) = fromNat (toNat (S n))
-           ==. fromNat (1 + toNat n)
-           ==. S (fromNat ((1 + toNat n) - 1))
-           ==. S (fromNat (toNat n))
-           ==. S n ? fromTo n
-           *** QED
-
-{-@ isoNatPeano :: Iso Nat Peano @-}
-isoNatPeano :: Iso Nat Peano
-isoNatPeano = Iso fromNat toNat fromTo toFrom
-
-vordNat :: VerifiedOrd Nat
-vordNat = VerifiedOrd leqInt leqIntRefl leqIntAntisym leqIntTrans leqIntTotal
-
-vordPeano :: VerifiedOrd Peano
-vordPeano = vordIso isoNatPeano vordNat
-\end{code}
-
-Similarly, we can break down compound datatypes into sums and products, just like what happens in `GHC.Generics`, and
-use the isomorphism to write down `VerifiedOrd` instances. We do however need to provide instances of `VerifiedOrd` for
-sums and products.
-
-\begin{code}
-vordProd :: VerifiedOrd a -> VerifiedOrd b -> VerifiedOrd (a, b)
-vordSum :: VerifiedOrd a -> VerifiedOrd b -> VerifiedOrd (Either a b)
-\end{code}
-
-\begin{comment}
-\begin{code}
-vordSum = undefined
-vordProd = undefined
-\end{code}
-\end{comment}
-
-Our [library](https://github.com/iu-parfunc/verified-instances) explores this idea to build some verified typeclasses,
-such as `VerifiedOrd` and `VerifiedMonoid`. We also provide combinators to build verified instances by using
-isomorphisms. Also, using a [reflection hack](https://www.schoolofhaskell.com/user/thoughtpolice/using-reflection), we
-can reify these "verified" terms to typeclass dictionaries at runtime, to call legacy functions which require `Ord`
-constraints and so on.
diff --git a/docs/blog/2017-01-06-reductions.lhs b/docs/blog/2017-01-06-reductions.lhs
deleted file mode 100644
--- a/docs/blog/2017-01-06-reductions.lhs
+++ /dev/null
@@ -1,261 +0,0 @@
----
-layout: post
-title: Proof Reductions on Homomorphisms
-date: 2017-01-02
-comments: true
-external-url:
-author: Niki Vazou and Vikraman Choudhury
-published: true
-categories: reflection, abstract-refinements
-demo: Reductions.hs
----
-
-[Previously][refinement-reflection] we saw how Refinement Reflection
-can be used to specify and prove theorems about Haskell code.
-
-Today we will see how proof generation can be simplified by 
-proof reduction on homomorphic data types. 
-
-As an example, we define a user-defined `Peano` data type
-and prove that it enjoys various arithmetic properties 
-(like totality of comparison) by 
-
-1. creating a proof that an arithmetic property holds on Natural numbers, and then 
-2. reduce the proof from Natural numbers to Peano numbers. 
-This proof reduction is possible since Peano numbers are homomorphic to Natural numbers. 
-
-<!-- more -->
-
-<br>
-<br>
-<br>
-
-<div class="row-fluid">
-  <div class="span12 pagination-centered">
-  <img src="http://4.bp.blogspot.com/-oltF9WI2KhY/VBMwdj15IvI/AAAAAAAAAtg/V3-k6IylIZM/s1600/picasso_bull.jpg"
-       alt="Picasso bull" width="400">
-       <br>
-       <br>
-       <br>
-  </div>
-</div>
-
-
-<div class="hidden">
-\begin{code}
-{-@ LIQUID "--higherorder"    @-}
-{-@ LIQUID "--totalhaskell"   @-}
-{-@ LIQUID "--exactdc"        @-}
-{-@ LIQUID "--diffcheck"      @-}
-{-@ LIQUID "--pruneunsorted"  @-}
-{-@ LIQUID "--eliminate=some" @-}
-
-module Reductions where
-
-import Language.Haskell.Liquid.ProofCombinators
-
-geqZero  :: Peano -> Proof 
-leqTotal :: Peano -> Peano -> Proof
-toNat    :: Peano -> Int
-
-geqZeroNat          :: Nat -> Proof 
-geqZeroByReduction  :: Peano -> Proof 
-leqTotalByReduction :: Peano -> Peano -> Proof 
-leqTotalNat         :: Nat -> Nat -> Proof
-
-\end{code}
-
-</div>
-
-Properties of Peano Numbers
-----------------------------
-
-First, we define `Peano` numbers as a data type 
-and the function `leqPeano` that compares two Peano numbers.
-
-
-\begin{code}
-{-@ data Peano [toNat] = Z | S {prev :: Peano } @-}
-data Peano = Z | S { prev :: Peano } deriving (Eq)
-
-{-@ reflect leqPeano @-}
-leqPeano :: Peano -> Peano -> Bool
-leqPeano Z _         = True
-leqPeano _ Z         = False
-leqPeano (S n) (S m) = leqPeano n m
-\end{code}
-
-We can use Refinement Reflection to provide an 
-**explicit proof** that no Peano number is greater than zero (`Z`).
-
-\begin{code}
-{-@ geqZero :: n:Peano -> {leqPeano Z n} @-}
-geqZero n = leqPeano Z n *** QED 
-\end{code}
-
-The proof proceeds simply by invocation of the 
-first case of the `leqPeano` definition. 
-
-As another Peano property, we can use Refinement Reflection to 
-show that comparison on Peano numbers is *total*, 
-that is, for every two numbers `n` and `m` 
-either `leqPeano n m` or `leqPeano m n` always holds. 
-
-\begin{code}
-{-@ leqTotal :: n:Peano -> m:Peano 
-             -> {(leqPeano n m) || (leqPeano m n)} 
-             /  [toNat n + toNat m] @-}
-leqTotal Z m = leqPeano Z m *** QED
-leqTotal n Z = leqPeano Z n *** QED
-leqTotal (S n) (S m)
-  =   (leqPeano (S n) (S m) || leqPeano (S m) (S n))
-  ==. (leqPeano n m || leqPeano (S m) (S n)) 
-      ? (leqTotal n m)
-  ==. (leqPeano n m || leqPeano m n) 
-      ? (leqTotal m n)
-  *** QED
-\end{code}
-
-The proof proceeds by induction on the sum of `n` and `m`. 
-Liquid Haskell captures this generalized induction by 
-ensuring that the value `toNat n + toNat m` is decreasing
-where `toNat` maps Peano to Natural numbers. 
-
-\begin{code}
-{-@ measure toNat @-}
-{-@ toNat :: Peano -> Nat @-}
-toNat Z     = 0
-toNat (S n) = 1 + toNat n
-\end{code}
-
-Note, that the type `Nat` is just a refinement on the Haskell's integers
-\begin{code}
-{-@ type Nat = { n:Int | 0 <= n } @-}
-type Nat     = Int
-\end{code}
-
-Following the totality proof, 
-one can prove further properties of Peano comparisons, 
-like reflexivity and transitivity.
-
-The above totality proof is verbose! 
-Moreover, it is very similar 
-to the classic totality on Natural numbers. 
-Since the SMT knowns that comparison of Nat is total, we can just reduce 
-Peano to Natural number totality!
-
-
-Reduction of Operators 
------------------------
-
-Since `toNat` is a homomorphism (i.e., a transformation) from `Peano` to `Nat`
-one can compare two Peano numbers via comparison of Natural numbers. 
-
-\begin{code}
-{-@ reflect leqPeanoNat @-}
-leqPeanoNat :: Peano -> Peano -> Bool 
-leqPeanoNat n m = toNat n `leqInt` toNat m  
-\end{code}
-
-where `leqInt` the Haskell comparison operator restricted to `Ints`.
-
-\begin{code}
-{-@ reflect leqInt @-}
-leqInt :: Int -> Int -> Bool 
-leqInt x y = x <= y
-\end{code}
-
-Note that `leqPeanoNat` is exactly equivalent to `leqPeano`. 
-For this blog post, we leave the equivalence proof as an exercise for the reader.
-
-
-Proof Reductions
------------------
-
-After reducing the Peano comparison operator to
-comparison on Natural numbers, we can reduce 
-proofs on Peano numbers to proofs on Natural numbers.
-The great benefit of this reduction is that proofs on Natural number
-are automated by the underlying SMT solver!
-
-For example, we prove that no Natural number is less than `0`
-by unfolding `leqInt` on `0` 
-and then let linear arithmetic decision procedure of the SMT complete the proof. 
-\begin{code}
-{-@ geqZeroNat :: n:Nat -> {leqInt 0 n} @-}
-geqZeroNat n = leqInt 0 n *** QED 
-\end{code}
-
-
-We then reduce the above property to the respective property on Peano numbers.
-\begin{code}
-{-@ geqZeroByReduction :: n:Peano -> {leqPeanoNat Z n} @-}
-geqZeroByReduction n 
-  = leqPeanoNat Z n ==. True 
-  ? reduction toNat geqZeroNat n 
-  *** QED 
-\end{code}
-
-The reduction occurs via the function `reduction`.
-The function `reduction f thm n`, for each homomorphism `f :: a -> b`, 
-reduces a theorem `thm x` on `a`s to the respective theorems on `b` via 
-[Abstract Refinements][abstract-refinements].
-\begin{code}
-{-@ reduction :: forall<p :: a -> Proof -> Bool>. 
-                 f:(b -> a) 
-              -> (x:a -> Proof<p x>) 
-              -> (y:b -> Proof<p (f y)>) @-}
-reduction :: (b -> a) -> (a -> Proof) -> (b -> Proof)
-reduction f thm y = thm (f y)              
-\end{code}
-
-Users with model theoretic background may observe that `reduction` 
-is actually encoding [Łoś–Tarski preservation theorem][preservation-theorem]!
-
-Similarly, `reduction2` reduces theorems with two `a` arguments
-to theorems with two `b` arguments via a homomorphism. 
-
-\begin{code}
-{-@ reduction2 :: forall<p :: a -> a -> Proof -> Bool >. 
-                  f:(b -> a) 
-               -> (x1:a -> x2:a -> Proof<p x1 x2>) 
-               -> (y1:b -> y2:b-> Proof<p (f y1) (f y2)>) @-}
-reduction2 :: (b -> a) -> (a -> a -> Proof) -> (b -> b -> Proof)
-reduction2 f thm y1 y2  = thm (f y1) (f y2)
-\end{code}
-
-For example, the SMT-automated proof of totality on Natural numbers 
-\begin{code}
-{-@ leqTotalNat :: n:Nat -> m:Nat -> { leqInt n m || leqInt m n } @-}
-leqTotalNat n m = (leqInt n m || leqInt m n) *** QED 
-\end{code}
-
-can be easily reduced to totality on Peano numbers
-
-\begin{code}
-{-@ leqTotalByReduction :: n:Peano -> m:Peano
-   -> { leqPeanoNat n m || leqPeanoNat m n } @-}
-leqTotalByReduction n m 
-  = (leqPeanoNat n m || leqPeanoNat m n) ==. True 
-  ? reduction2 toNat leqTotalNat n m  
-  *** QED 
-\end{code}
-
-
-Conclusion
------------
-
-We presented an example of how the SMT-automated proofs on 
-Natural numbers can be reduced to the respective proofs on the 
-Peano numbers, because Peano are homomorphic to Natural numbers. 
-
-Proof reduction greatly simplifies proof composition
-as it allows for shorter and more elegant proofs 
-that take advantage of SMT-automated or other existing
-proofs on homomorphic data structures. 
-
-
-[refinement-reflection]: http://goto.ucsd.edu/~rjhala/liquid/haskell/blog/blog/2016/09/18/refinement-reflection.lhs/
-[reduction-lib]: https://github.com/ucsd-progsys/liquidhaskell/tree/develop/include/Language/Haskell/Liquid/Reduction.hs
-[abstract-refinements]: http://goto.ucsd.edu/~rjhala/liquid/haskell/blog/blog/2013/06/03/abstracting-over-refinements.lhs/
-[preservation-theorem]: https://en.wikipedia.org/wiki/%C5%81o%C5%9B%E2%80%93Tarski_preservation_theorem
diff --git a/docs/blog/2017-03-20-arithmetic-overflows.lhs b/docs/blog/2017-03-20-arithmetic-overflows.lhs
deleted file mode 100644
--- a/docs/blog/2017-03-20-arithmetic-overflows.lhs
+++ /dev/null
@@ -1,363 +0,0 @@
----
-layout: post
-title: Arithmetic Overflows
-date: 2017-03-20
-author: Ranjit Jhala
-published: true
-comments: true
-tags: basic
-demo: overflow.hs
----
-
-
-Computers are great at crunching numbers.
-However, if programmers aren't careful, their
-machines can end up biting off more than
-they can chew: simple arithmetic operations
-over very large (or very tiny) inputs can
-*overflow* leading to bizarre crashes
-or vulnerabilities. For example,
-[Joshua Bloch's classic post][bloch]
-argues that nearly all binary searches
-are broken due to integer overflows.
-Lets see how we can teach LiquidHaskell
-to spot such overflows.
-
-<!-- more -->
-
-<div class="hidden">
-\begin{code}
-module Bounded where
-
-import           Control.Exception (assert)
-import           Prelude hiding (Num (..))
-import qualified Prelude
-
-plusStrict :: Int -> Int -> Int
-plusLazy   :: Int -> Int -> Int
-mono       :: Int -> Bool
-\end{code}
-</div>
-
-1. The Problem
---------------
-
-
-LiquidHaskell, like some programmers, likes to make believe
-that `Int` represents the set of integers. For example, you
-might define a function `plus` as:
-
-\begin{code}
-{-@ plus :: x:Int -> y:Int -> {v:Int | v == x + y} @-}
-plus :: Int -> Int -> Int
-plus x y = x Prelude.+ y
-\end{code}
-
-The output type of the function states that the returned value
-is equal to the \emph{logical} result of adding the two inputs.
-
-The above signature lets us "prove" facts like addition by one
-yields a bigger number:
-
-\begin{code}
-{-@ monoPlus :: Int -> {v:Bool | v <=> true } @-}
-monoPlus :: Int -> Bool
-monoPlus x = x < plus x 1
-\end{code}
-
-Unfortunately, the signature for plus and hence, the above
-"fact" are both lies.
-
-LH _checks_ `plus` as the same signature is _assumed_
-for the primitive `Int` addition operator `Prelude.+`.
-LH has to assume _some_ signature for this "foreign"
-machine operation, and by default, LH assumes that
-machine addition behaves like logical addition.
-
-However, this assumption, and its consequences are
-only true upto a point:
-
-```haskell
-λ>  monoPlus 0
-True
-λ>  monoPlus 100
-True
-λ>  monoPlus 10000
-True
-λ>  monoPlus 1000000
-True
-```
-
-Once we get to `maxBound` at the very edge of `Int`,
-a tiny bump is enough to send us tumbling backwards
-into a twilight zone.
-
-```haskell
-λ> monoPlus maxBound
-False
-
-λ> plus maxBound 1
--9223372036854775808
-```
-
-2. Keeping Int In Their Place
------------------------------
-
-The news isn't all bad: the glass half full
-view is that for "reasonable" values
-like 10, 100, 10000 and 1000000, the
-machine's arithmetic _is_ the same as
-logical arithmetic. Lets see how to impart
-this wisdom to LH. We do this in two steps:
-define the *biggest* `Int` value, and then,
-use this value to type the arithmetic operations.
-
-**A. The Biggest Int**
-
-First, we need a way to talk about
-"the edge" -- i.e. the largest `Int`
-value at which overflows occur.
-
-We could use the concrete number
-
-```haskell
-λ> maxBound :: Int
-9223372036854775807
-```
-
-However, instead of hardwiring a particular number,
-a more general strategy is to define a symbolic
-constant `maxInt` to represent _any_ arbitrary
-overflow value and thus, make the type checking
-robust to different machine integer widths.
-
-\begin{code}
--- defines an Int constant called `maxInt`
-{-@ measure maxInt :: Int @-}
-\end{code}
-
-To tell LH that `maxInt` is the "biggest" `Int`,
-we write a predicate that describes values bounded
-by `maxInt`:
-
-\begin{code}
-{-@ predicate Bounded N = 0 < N + maxInt && N < maxInt @-}
-\end{code}
-
-Thus, `Bounded n` means that the number `n` is in
-the range `[-maxInt, maxInt]`.
-
-**B.  Bounded Machine Arithmetic**
-
-Next, we can assign the machine arithmetic operations
-types that properly capture the possibility of arithmetic
-overflows. Here are _two_ possible specifications.
-
-**Strict: Thou Shalt Not Overflow** A _strict_ specification
-simply prohibits any overflow:
-
-\begin{code}
-{-@ plusStrict :: x:Int -> y:{Int|Bounded(x+y)} -> {v:Int|v = x+y} @-}
-plusStrict x y = x Prelude.+ y
-\end{code}
-
-The inputs `x` and `y` _must_ be such that the result is `Bounded`,
-and in that case, the output value is indeed their logical sum.
-
-**Lazy: Overflow at Thine Own Risk** Instead, a _lazy_
-specification could permit overflows but gives no
-guarantees about the output when they occur.
-
-\begin{code}
-{-@ plusLazy :: x:Int -> y:Int -> {v:Int|Bounded(x+y) => v = x+y} @-}
-plusLazy x y = x Prelude.+ y
-\end{code}
-
-The lazy specification says that while `plusLazy`
-can be called with any values you like, the
-result is the logical sum
-*only if there is no overflow*.
-
-
-To understand the difference between the two
-specifications, lets revisit the `monoPlus`
-property using the new machine-arithmetic
-sensitive signatures:
-
-\begin{code}
-{-@ monoPlusStrict :: Int -> {v:Bool | v <=> true } @-}
-monoPlusStrict x = x < plusStrict x 1
-
-{-@ monoPlusLazy :: Int -> {v:Bool | v <=> true } @-}
-monoPlusLazy x = x < plusLazy x 1
-\end{code}
-
-Both are rejected by LH, since, as we saw earlier,
-the functions _do not_ always evaluate to `True`.
-However, in the strict version the error is at the
-possibly overflowing call to `plusStrict`.
-In the lazy version, the call to `plusLazy` is
-accepted, but as the returned value is some
-arbitrary `Int` (not the logical `x+1`), the
-comparison may return `False` hence the output
-is not always `True`.
-
-**Exercise:** Can you fix the specification
-for `monoPlusStrict` and `monoPlusLazy` to
-get LH to verify the implementation?
-
-
-3. A Typeclass for Machine Arithmetic
--------------------------------------
-
-Its a bit inconvenient to write `plusStrict` and `plusLazy`,
-and really, we'd just like to write `+` and `-` and so on.
-We can do so, by tucking the above specifications into
-a _bounded numeric_ typeclass whose signatures capture machine
-arithmetic. First, we define a `BoundedNum` variant of `Num`
-
-\begin{code}
-class BoundedNum a where
-  (+) :: a -> a -> a
-  (-) :: a -> a -> a
-  -- other operations ...
-\end{code}
-
-and now, we can define its `Int` instance just as wrappers
-around the `Prelude` operations:
-
-\begin{code}
-instance BoundedNum Int where
-  x + y = x Prelude.+ y
-  x - y = x Prelude.- y
-\end{code}
-
-Finally, we can tell LH that the above above instance obeys the
-(strict) specifications for machine arithmetic:
-
-\begin{code}
-{-@ instance BoundedNum Int where
-      + :: x:Int -> y:{Int | Bounded (x+y)} -> {v:Int | v == x+y };
-      - :: x:Int -> y:{Int | Bounded (x-y)} -> {v:Int | v == x-y }
-  @-}
-\end{code}
-
-With the above instance in scope, we can just use the plain `+`
-operator and have LH flag potential overflows:
-
-\begin{code}
-{-@ mono :: Int -> {v:Bool | v <=> true} @-}
-mono x = x < x + 1
-\end{code}
-
-
-4. An Application: Binary Search
---------------------------------
-
-The above seems a bit paranoid. Do overflows _really_ matter?
-And if they do, is it really practical to check for them using
-the above?
-
-[Joshua Bloch's][bloch] famous article describes a
-tricky overflow bug in an implementation of binary-search
-that lay hidden in plain sight in classic textbooks and his
-own implementation in the JDK for nearly a decade.
-Gabriel Gonzalez wrote a lovely [introduction to LH][lh-gonzalez]
-using binary-search as an example, and a careful reader
-[pointed out][lh-overflow-reddit] that it had the same
-overflow bug!
-
-Lets see how we might spot and fix such bugs using `BoundedNum`.
-
-<div class="row">
-<div class="col-md-4">
-**A. Off by One** Lets begin by just using
-the default `Num Int` which ignores overflow.
-As Gabriel explains, LH flags a bunch of errors
-if we start the search with `loop x v 0 n` as
-the resulting search can access `v` at any
-index between `0` and `n` inclusive, which
-may lead to an out of bounds at `n`.
-We can fix the off-by-one by correcting the
-upper bound to `n-1`, at which point LH
-reports the code free of errors.
-</div>
-
-<div class="col-md-8">
-<img id="splash-binarySearch-A"
-     class="center-block anim"
-     png="/liquidhaskell-blog/static/img/splash-binarySearch-A.png"
-     src="/liquidhaskell-blog/static/img/splash-binarySearch-A.png">
-</div>
-</div>
-
-<br>
-
-
-<div class="row">
-<div class="col-md-8">
-<img id="splash-binarySearch-B"
-     class="center-block anim"
-     png="/liquidhaskell-blog/static/img/splash-binarySearch-B.png"
-     src="/liquidhaskell-blog/static/img/splash-binarySearch-B.png">
-</div>
-
-<div class="col-md-4">
-**B. Lots of Overflows** To spot arithmetic overflows, we need
-only hide the default `Prelude` and instead import the `BoundedNum`
-instance described above. Upon doing so, LH flags a whole bunch of
-potential errors -- essentially *all* the arithmetic operations which
-seems rather dire!
-</div>
-</div>
-
-
-<div class="row">
-<div class="col-md-4">
-**C. Vector Sizes are Bounded** Of course, things
-aren't _so_ bad. LH is missing the information that
-the size of any `Vector` must be `Bounded`. Once we
-inform LH about this invariant with the
-[`using` directive][lh-invariants], it infers that
-as the `lo` and `hi` indices are upper-bounded by
-the `Vector`'s size, all the arithmetic on them is
-also `Bounded` and hence, free of overflows.
-</div>
-
-<div class="col-md-8">
-<img id="splash-binarySearch-C"
-     class="center-block anim"
-     png="/liquidhaskell-blog/static/img/splash-binarySearch-C.png"
-     src="/liquidhaskell-blog/static/img/splash-binarySearch-C.png">
-</div>
-</div>
-
-<br>
-
-<div class="row">
-<div class="col-md-8">
-<img id="splash-binarySearch-D"
-     class="center-block anim"
-     png="/liquidhaskell-blog/static/img/splash-binarySearch-D.png"
-     src="/liquidhaskell-blog/static/img/splash-binarySearch-D.png">
-</div>
-
-<div class="col-md-4">
-**D. Staying In The Middle**
-Well, *almost* all. The one pesky pink highlight that
-remains is exactly the bug that Bloch made famous. Namely:
-the addition used to compute the new midpoint between `lo`
-and `hi` could overflow e.g. if the array was large and both
-those indices were near the end. To ensure the machine doesn't
-choke, we follow Bloch's suggestion and re-jigger the computation
-to instead compute the midpoint by splitting the difference
-between `hi` and `lo`! the code is now free of arithmetic
-overflows and truly memory safe.
-</div>
-</div>
-
-
-[lh-invariants]: https://github.com/ucsd-progsys/liquidhaskell/blob/develop/README.md#invariants
-[lh-gonzalez]: http://www.haskellforall.com/2015/12/compile-time-memory-safety-using-liquid.html
-[bloch]: https://research.googleblog.com/2006/06/extra-extra-read-all-about-it-nearly.html
-[lh-overflow-reddit]: https://www.reddit.com/r/haskell/comments/3ysh9k/haskell_for_all_compiletime_memory_safety_using/cyg8g60/
diff --git a/docs/blog/todo/Iso.lhs b/docs/blog/todo/Iso.lhs
deleted file mode 100644
--- a/docs/blog/todo/Iso.lhs
+++ /dev/null
@@ -1,281 +0,0 @@
----
-layout: post
-title: "Isomorphisms"
-date: 2016-24-12 
-author: Vikraman Choudhury 
-published: false
-comments: true
-external-url:
-categories: basic
-demo: Iso.hs
----
-
-\begin{comment}
-\begin{code}
-{-@ LIQUID "--higherorder" @-}
-{-@ LIQUID "--totalhaskell" @-}
-{-@ LIQUID "--exactdc" @-}
-{-@ LIQUID "--diffcheck" @-}
-
-module Iso where
-
-import Language.Haskell.Liquid.ProofCombinators
-\end{code}
-\end{comment}
-
-In this blog post, we show how to use Liquid Haskell to build "verified" typeclasses. A verified typeclass allows one to
-express typeclass laws directly as Haskell code. We also show a technique to build verified instances and scale them up
-to compound datatypes using isomorphisms.
-
-First, we'll express verified typeclasses using Haskell records, but with LiquidHaskell refinements to express laws. As
-an example, let's define `VerifiedOrd`, which is the same as the `Ord` typeclass, but with total order laws added.
-
-\begin{code}
-{-@ data VerifiedOrd a = VerifiedOrd {
-      leq     :: a -> a -> Bool
-    , refl    :: x:a -> { Prop (leq x x) }
-    , antisym :: x:a -> y:a -> { Prop (leq x y) && Prop (leq y x) ==> x == y }
-    , trans   :: x:a -> y:a -> z:a -> { Prop (leq x y) && Prop (leq y z) ==> Prop (leq x z) }
-    , total   :: x:a -> y:a -> { Prop (leq x y) || Prop (leq y x) }
-    }
-@-}
-data VerifiedOrd a = VerifiedOrd {
-    leq     :: a -> a -> Bool
-  , refl    :: a -> Proof
-  , antisym :: a -> a -> Proof
-  , trans   :: a -> a -> a -> Proof
-  , total   :: a -> a -> Proof
-}
-\end{code}
-
-The `leq` function represents the `<=` operator in `Ord`, and `refl`, `antisym`, `trans`, `total`, express the
-reflexivity, antisymmetry, transitivity and totality properties respectively, that a total order requires. Notice how
-the refinements express the laws, and the actual code is simply a function that returns `Proof` or `()`.
-
-Now, let's see how to define some simple verified instances. We need to instantiate `leq` for our type, "reflect" it
-into the logic, and prove all the required properties. For primitive types like `Int` or `Double`, it's "trivial"
-because we trust the SMT solver which already knows about integers.
-
-\begin{code}
-{-@ axiomatize leqInt @-}
-leqInt :: Int -> Int -> Bool
-leqInt x y = x <= y
-
-{-@ leqIntRefl :: x:Int -> { leqInt x x } @-}
-leqIntRefl :: Int -> Proof
-leqIntRefl x = leqInt x x ==. x <= x *** QED
-
-{-@ leqIntAntisym :: x:Int -> y:Int -> { leqInt x y && leqInt y x ==> x == y } @-}
-leqIntAntisym :: Int -> Int -> Proof
-leqIntAntisym x y = (leqInt x y && leqInt y x) ==. (x <= y && y <= x) ==. x == y *** QED
-
-{-@ leqIntTrans :: x:Int -> y:Int -> z:Int -> { leqInt x y && leqInt y z ==> leqInt x z } @-}
-leqIntTrans :: Int -> Int -> Int -> Proof
-leqIntTrans x y z = (leqInt x y && leqInt y z) ==. (x <= y && y <= z) ==. x <= z ==. leqInt x z *** QED
-
-{-@ leqIntTotal :: x:Int -> y:Int -> { leqInt x y || leqInt y x } @-}
-leqIntTotal :: Int -> Int -> Proof
-leqIntTotal x y = (leqInt x y || leqInt y x) ==. (x <= y || y <= x) *** QED
-
-vordInt :: VerifiedOrd Int
-vordInt = VerifiedOrd leqInt leqIntRefl leqIntAntisym leqIntTrans leqIntTotal
-\end{code}
-
-How about a complex datatype? Let's consider an inductive datatype, the peano natural numbers. Not surprisingly, the
-proofs follow by induction. For conciseness, we only show totality and elide the rest.
-
-\begin{code}
-{-@ data Peano [toNat] = Z | S Peano @-}
-data Peano = Z | S Peano deriving (Eq)
-
-{-@ measure toNat @-}
-{-@ toNat :: Peano -> { n:Int | 0 <= n } @-}
-toNat :: Peano -> Int
-toNat Z = 0
-toNat (S n) = 1 + toNat n
-
-{-@ axiomatize leqPeano @-}
-leqPeano :: Peano -> Peano -> Bool
-leqPeano Z _ = True
-leqPeano _ Z = False
-leqPeano (S n) (S m) = leqPeano n m
-
-{-@ leqNTotal :: n:Peano -> m:Peano -> {(leqPeano n m) || (leqPeano m n)} / [toNat n + toNat m] @-}
-leqNTotal :: Peano -> Peano -> Proof
-leqNTotal Z m = leqPeano Z m *** QED
-leqNTotal n Z = leqPeano Z n *** QED
-leqNTotal (S n) (S m)
-  =   (leqPeano (S n) (S m) || leqPeano (S m) (S n))
-  ==. (leqPeano n m || leqPeano (S m) (S n)) ? (leqNTotal n m )
-  ==. (leqPeano n m || leqPeano m n) ? (leqNTotal m n)
-  *** QED
-\end{code}
-
-Writing down proofs for more complex datatypes is tedious, it requires case analysis for each constructor and using the
-induction hypothesis. However, we can decompose Haskell datatypes into sums and products, and we can build up compound
-proofs using isomorphisms! To that end, we design some machinery to express isomorphisms, and prove that laws are
-preserved under isomorphic images.
-
-\begin{code}
-{-@ data Iso a b = Iso {
-      to   :: a -> b
-    , from :: b -> a
-    , tof  :: y:b -> { to (from y) == y }
-    , fot  :: x:a -> { from (to x) == x }
-    }
-@-}
-data Iso a b = Iso {
-    to   :: a -> b
-  , from :: b -> a
-  , tof  :: b -> Proof
-  , fot  :: a -> Proof
-}
-\end{code}
-
-An isomorphism between types `a` and `b` is a pair of functions `to :: a -> b` and `from :: b -> a` that are mutually
-inverse to each other. We now claim that total order laws are preserved under `Iso`; this amounts to building up a
-`VerifiedOrd b`, given a `VerifiedOrd a` and an `Iso a b`.
-
-\begin{code}
-{-@ axiomatize leqFrom @-}
-leqFrom :: (a -> a -> Bool)
-        -> (b -> a)
-        -> (b -> b -> Bool)
-leqFrom leqa from x y = leqa (from x) (from y)
-
-{-@ leqFromRefl :: leqa:(a -> a -> Bool) -> leqaRefl:(x:a -> { Prop (leqa x x) })
-                -> from:(b -> a)
-                -> x:b -> { leqFrom leqa from x x }
-@-}
-leqFromRefl :: (a -> a -> Bool) -> (a -> Proof)
-            -> (b -> a)
-            -> b -> Proof
-leqFromRefl leqa leqaRefl from x =
-      leqFrom leqa from x x
-  ==. leqa (from x) (from x)
-  ==. True ? leqaRefl (from x)
-  *** QED
-
-{-@ leqFromAntisym :: leqa:(a -> a -> Bool)
-                   -> leqaAntisym:(x:a -> y:a -> { Prop (leqa x y) && Prop (leqa y x) ==> x == y })
-                   -> to:(a -> b) -> from:(b -> a) -> tof:(y:b -> { to (from y) == y })
-                   -> x:b -> y:b -> { leqFrom leqa from x y && leqFrom leqa from y x ==> x == y }
-@-}
-leqFromAntisym :: (Eq a, Eq b)
-               => (a -> a -> Bool) -> (a -> a -> Proof)
-               -> (a -> b) -> (b -> a) -> (b -> Proof)
-               -> b -> b -> Proof
-leqFromAntisym leqa leqaAntisym to from tof x y
-  =   (leqFrom leqa from x y && leqFrom leqa from y x)
-  ==. (leqa (from x) (from y) && leqa (from y) (from x))
-  ==. from x == from y ? leqaAntisym (from x) (from y)
-  ==. to (from x) == to (from y)
-  ==. x == to (from y) ? tof x
-  ==. x == y           ? tof y
-  *** QED
-
-{-@ leqFromTrans :: leqa:(a -> a -> Bool)
-                 -> leqaTrans:(x:a -> y:a -> z:a -> { Prop (leqa x y) && Prop (leqa y z) ==> Prop (leqa x z) })
-                 -> from:(b -> a)
-                 -> x:b -> y:b -> z:b
-                 -> { leqFrom leqa from x y && leqFrom leqa from y z ==> leqFrom leqa from x z }
-@-}
-leqFromTrans :: (a -> a -> Bool) -> (a -> a -> a -> Proof)
-             -> (b -> a)
-             -> b -> b -> b -> Proof
-leqFromTrans leqa leqaTrans from x y z =
-      (leqFrom leqa from x y && leqFrom leqa from y z)
-  ==. (leqa (from x) (from y) && leqa (from y) (from z))
-  ==. leqa (from x) (from z) ? leqaTrans (from x) (from y) (from z)
-  ==. leqFrom leqa from x z
-  *** QED
-
-{-@ leqFromTotal :: leqa:(a -> a -> Bool) -> leqaTotal:(x:a -> y:a -> { Prop (leqa x y) || Prop (leqa y x) })
-                 -> from:(b -> a) -> x:b -> y:b -> { leqFrom leqa from x y || leqFrom leqa from y x }
-@-}
-leqFromTotal :: (a -> a -> Bool) -> (a -> a -> Proof)
-             -> (b -> a) -> b -> b -> Proof
-leqFromTotal leqa leqaTotal from x y =
-      (leqFrom leqa from x y || leqFrom leqa from y x)
-  ==. (leqa (from x) (from y) || leqa (from y) (from x))
-  ==. True ? leqaTotal (from x) (from y)
-  ==. leqFrom leqa from y x
-  *** QED
-
-vordIso :: (Eq a, Eq b) => Iso a b -> VerifiedOrd a -> VerifiedOrd b
-vordIso (Iso to from tof fot) (VerifiedOrd leqa leqaRefl leqaAntisym leqaTrans leqaTotal) =
-  VerifiedOrd
-    (leqFrom leqa from)
-    (leqFromRefl leqa leqaRefl from)
-    (leqFromAntisym leqa leqaAntisym to from tof)
-    (leqFromTrans leqa leqaTrans from)
-    (leqFromTotal leqa leqaTotal from)
-\end{code}
-
-We can now write a `VerifiedOrd` for `Peano` by mapping it onto `type Nat = { n:Int | 0 <= n }`, which is easier to
-prove properties about because it's just an integer!
-
-\begin{code}
-{-@ type Nat = { n:Int | 0 <= n } @-}
-type Nat = Int
-
-{-@ axiomatize fromNat @-}
-{-@ fromNat :: Nat -> Peano @-}
-fromNat :: Nat -> Peano
-fromNat n
-  | n == 0 = Z
-  | otherwise = S (fromNat (n - 1))
-
-{-@ toFrom :: x:Nat -> { toNat (fromNat x) == x } @-}
-toFrom :: Nat -> Proof
-toFrom n
-  | n == 0 = toNat (fromNat 0) ==. toNat Z ==. 0 *** QED
-  | n > 0 = toNat (fromNat n)
-        ==. toNat (S (fromNat (n - 1)))
-        ==. 1 + toNat (fromNat (n - 1))
-        ==. 1 + (n - 1) ? toFrom (n - 1)
-        ==. n
-        *** QED
-
-{-@ fromTo :: x:Peano -> { fromNat (toNat x) == x } @-}
-fromTo :: Peano -> Proof
-fromTo Z = fromNat (toNat Z) ==. fromNat 0 ==. Z *** QED
-fromTo (S n) = fromNat (toNat (S n))
-           ==. fromNat (1 + toNat n)
-           ==. S (fromNat ((1 + toNat n) - 1))
-           ==. S (fromNat (toNat n))
-           ==. S n ? fromTo n
-           *** QED
-
-{-@ isoNatPeano :: Iso Nat Peano @-}
-isoNatPeano :: Iso Nat Peano
-isoNatPeano = Iso fromNat toNat fromTo toFrom
-
-vordNat :: VerifiedOrd Nat
-vordNat = VerifiedOrd leqInt leqIntRefl leqIntAntisym leqIntTrans leqIntTotal
-
-vordPeano :: VerifiedOrd Peano
-vordPeano = vordIso isoNatPeano vordNat
-\end{code}
-
-Similarly, we can break down compound datatypes into sums and products, just like what happens in `GHC.Generics`, and
-use the isomorphism to write down `VerifiedOrd` instances. We do however need to provide instances of `VerifiedOrd` for
-sums and products.
-
-\begin{code}
-vordProd :: VerifiedOrd a -> VerifiedOrd b -> VerifiedOrd (a, b)
-vordSum :: VerifiedOrd a -> VerifiedOrd b -> VerifiedOrd (Either a b)
-\end{code}
-
-\begin{comment}
-\begin{code}
-vordSum = undefined
-vordProd = undefined
-\end{code}
-\end{comment}
-
-Our [library](https://github.com/iu-parfunc/verified-instances) explores this idea to build some verified typeclasses,
-such as `VerifiedOrd` and `VerifiedMonoid`. We also provide combinators to build verified instances by using
-isomorphisms. Also, using a [reflection hack](https://www.schoolofhaskell.com/user/thoughtpolice/using-reflection), we
-can reify these "verified" terms to typeclass dictionaries at runtime, to call legacy functions which require `Ord`
-constraints and so on.
diff --git a/docs/blog/todo/LambdaEval.hs b/docs/blog/todo/LambdaEval.hs
deleted file mode 100644
--- a/docs/blog/todo/LambdaEval.hs
+++ /dev/null
@@ -1,125 +0,0 @@
-module LambdaEval where
-
-import Data.List        (lookup)
-
-import Language.Haskell.Liquid.Prelude   
-
----------------------------------------------------------------------
------------------------ Datatype Definition -------------------------
----------------------------------------------------------------------
-
-type Bndr 
-  = Int
-
-data Expr 
-  = Lam Bndr Expr
-  | Var Bndr  
-  | App Expr Expr
-  | Const Int
-  | Plus Expr Expr
-  | Pair Expr Expr
-  | Fst Expr
-  | Snd Expr
-
-{-@
-measure isValue      :: Expr -> Prop
-isValue (Const i)    = true 
-isValue (Lam x e)    = true 
-isValue (Var x)      = false
-isValue (App e1 e2)  = false
-isValue (Plus e1 e2) = false 
-isValue (Fst e)      = false
-isValue (Snd e)      = false
-isValue (Pair e1 e2) = ((? (isValue(e1))) && (? (isValue(e2))))
-@-}
-
-{-@ type Value = {v: Expr | (? (isValue([v]))) } @-}
-
----------------------------------------------------------------------
--------------------------- The Evaluator ----------------------------
----------------------------------------------------------------------
-
-evalVar :: Bndr -> [(Bndr, Expr)] -> Expr
-evalVar x ((y,v):sto) 
-  | x == y
-  = v
-  | otherwise
-  = evalVar x sto
-
-evalVar x []      
-  = error "unbound variable"
-
-
-{-@ eval :: [(Bndr, Value)] -> Expr -> ([(Bndr, Value)], Value) @-}
-eval sto (Const i) 
-  = (sto, Const i)
-
-eval sto (Var x)  
-  = (sto, evalVar x sto) 
-
-eval sto (Plus e1 e2)
-  = let (_, e1') = eval sto e1
-        (_, e2') = eval sto e2
-    in case (e1, e2) of
-         (Const i1, Const i2) -> (sto, Const (i1 + i2))
-         _                    -> error "non-integer addition"
-
-eval sto (App e1 e2)
-  = let (_,    v2 ) = eval sto e2 
-        (sto1, e1') = eval sto e1
-    in case e1' of
-         (Lam x e) -> eval ((x, v2): sto1) e
-         _         -> error "non-function application"
-
-eval sto (Lam x e) 
-  = (sto, Lam x e)
-
-eval sto (Pair e1 e2)
-  = (sto, Pair v1 v2)
-  where (_, v1) = eval sto e1
-        (_, v2) = eval sto e2
-
-eval sto (Fst e)
-  = let (sto', e') = eval sto e in
-    case e' of
-      Pair v _ -> (sto', v)
-      _        -> error "non-tuple fst"
-
-eval sto (Snd e)
-  = let (sto', e') = eval sto e in
-    case e' of
-      Pair _ v -> (sto', v)
-      _        -> error "non-tuple snd"
-
----------------------------------------------------------------------
--------------------------- Value Checker ----------------------------
----------------------------------------------------------------------
-
-{-@ assert check :: {v: Expr | (? (isValue([v]))) } -> Bool @-}
-check (Const _)    = True
-check (Lam _ _)    = True
-check (Var _)      = liquidAssertB False
-check (App _ _)    = liquidAssertB False
-check (Pair v1 v2) = check v1 && check v2
-check (Fst _)      = liquidAssertB False
-check (Snd _)      = liquidAssertB False
-check (Plus _ _)   = liquidAssertB False
-
----------------------------------------------------------------------
--------------------------- Unit Tests -------------------------------
----------------------------------------------------------------------
-
-tests =
-  let (f,g,x) = (0,1,2) 
-      e1      = Lam x (Var x)
-      e2      = App e1 e1 
-      e3      = Lam f (Lam g (Lam x (App (Var f)  (App (Var g) (Var x)))))
-      e4      = Const 10
-      e5      = App e1 e4
-      e6      = Lam x (Plus (Var x) e4)
-      e7      = App (App e3 e6) e6
-      e8      = Pair (App e7 (Const 0)) (App e7 (Const 100))
-      e9      = Fst e8
-      e10     = Snd e9
-      vs      = map (snd . eval []) [e1, e2, e3, e4, e5, e6, e7, e8, e9, e10]
-  in map check vs
diff --git a/docs/blog/todo/Termination.hs b/docs/blog/todo/Termination.hs
deleted file mode 100644
--- a/docs/blog/todo/Termination.hs
+++ /dev/null
@@ -1,29 +0,0 @@
-{-# LANGUAGE BangPatterns #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-
-module Term where
-
-import Data.Vector.Algorithms.Common (shiftRI)
-import Language.Haskell.Liquid.Prelude (choose)
-
-
-{-@ loop :: twit:Nat -> l:Nat -> u:{v:Nat | v = l + twit} -> Int @-}
-loop :: Int -> Int -> Int -> Int
-loop twit l u 
-   | u <= l    = l
-   | otherwise = case compare (choose 0) 0 of
-                   LT -> loop (u - (k + 1)) (k+1) u 
-                   EQ -> k
-                   GT -> loop (k - l) l     k 
-  where k = (u + l) `shiftRI` 1
-
-{-@ loop1 :: l:Nat -> u:{v:Nat | l <= v} -> Int / [u + l] @-}
-loop1 :: Int -> Int -> Int
-loop1 l u 
-   | u <= l    = l
-   | otherwise = case compare (choose 0) 0 of
-                   LT -> loop1 (k+1) u 
-                   EQ -> k
-                   GT -> loop1 l     k 
-  where k = (u + l) `shiftRI` 1
-
diff --git a/docs/blog/todo/TextBug.lhs b/docs/blog/todo/TextBug.lhs
deleted file mode 100644
--- a/docs/blog/todo/TextBug.lhs
+++ /dev/null
@@ -1,345 +0,0 @@
----
-layout: post
-title: "Text Bug"
-date: 2014-03-01
-comments: true
-external-url:
-author: Eric Seidel
-published: false
-categories: benchmarks, text
-demo: TextBug.hs
----
-
-For our last post on `text`, we return to the topic of building a new `Text`
-value, i.e. proving the safety of write operations.
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-{-# LANGUAGE BangPatterns, CPP, MagicHash, Rank2Types,
-    RecordWildCards, UnboxedTuples, ExistentialQuantification #-}
-{-@ LIQUID "--no-termination" @-}
-module TextBug where
-
-import Control.Monad.ST.Unsafe (unsafeIOToST)
-import Foreign.C.Types (CSize)
-import GHC.Base hiding (unsafeChr)
-import GHC.ST
-import GHC.Word (Word16(..))
-import Data.Bits hiding (shiftL)
-import Data.Word
-
-import Language.Haskell.Liquid.Prelude
-
---------------------------------------------------------------------------------
---- From TextInternal
---------------------------------------------------------------------------------
-
-{-@ shiftL :: i:Nat -> n:Nat -> {v:Nat | ((n = 1) => (v = (i * 2)))} @-}
-shiftL :: Int -> Int -> Int
-shiftL = undefined -- (I# x#) (I# i#) = I# (x# `iShiftL#` i#)
-
-{-@ measure isUnknown :: Size -> Prop
-    isUnknown (Exact n) = false
-    isUnknown (Max   n) = false
-    isUnknown (Unknown) = true
-  @-}
-{-@ measure getSize :: Size -> Int
-    getSize (Exact n) = n
-    getSize (Max   n) = n
-  @-}
-
-{-@ invariant {v:Size | (getSize v) >= 0} @-}
-
-data Size = Exact {-# UNPACK #-} !Int -- ^ Exact size.
-          | Max   {-# UNPACK #-} !Int -- ^ Upper bound on size.
-          | Unknown                   -- ^ Unknown size.
-            deriving (Eq, Show)
-
-{-@ upperBound :: k:Nat -> s:Size -> {v:Nat | v = ((isUnknown s) ? k : (getSize s))} @-}
-upperBound :: Int -> Size -> Int
-upperBound _ (Exact n) = n
-upperBound _ (Max   n) = n
-upperBound k _         = k
-
-data Step s a = Done
-              | Skip !s
-              | Yield !a !s
-
-data Stream a =
-    forall s. Stream
-    (s -> Step s a)             -- stepper function
-    !s                          -- current state
-    !Size                       -- size hint
-
-{-@ data Array = Array { aBA  :: ByteArray#
-                       , aLen :: Nat 
-                       } 
-  @-}
-
-data Array = Array {
-    aBA  :: ByteArray#
-  , aLen :: !Int
-  }
-
-{-@ measure alen     :: Array -> Int
-    alen (Array a n) = n
-  @-}
-
-{-@ aLen :: a:Array -> {v:Nat | v = (alen a)}  @-}
-
-{-@ type ArrayN  N   = {v:Array | (alen v) = N} @-}
-
-{-@ type AValidI A   = {v:Nat | v     <  (alen A)} @-}
-{-@ type AValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type AValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-{-@ data MArray s = MArray { maBA  :: MutableByteArray# s
-                           , maLen :: Nat } @-}
-
-data MArray s = MArray {
-    maBA  :: MutableByteArray# s
-  , maLen :: !Int
-  }
-
-{-@ measure malen :: MArray s -> Int
-    malen (MArray a n) = n
-  @-}
-
-{-@ maLen :: a:MArray s -> {v:Nat | v = (malen a)}  @-}
-
-{-@ type MArrayN s N = {v:MArray s | (malen v) = N} @-}
-
-{-@ type MAValidI MA = {v:Nat | v <  (malen MA)} @-}
-{-@ type MAValidO MA = {v:Nat | v <= (malen MA)} @-}
-
-{-@ new :: forall s. n:Nat -> ST s (MArrayN s n) @-}
-new          :: forall s. Int -> ST s (MArray s)
-new n
-  | n < 0 || n .&. highBit /= 0 = error $ "new: size overflow"
-  | otherwise = ST $ \s1# ->
-       case newByteArray# len# s1# of
-         (# s2#, marr# #) -> (# s2#, MArray marr# n #)
-  where !(I# len#) = bytesInArray n
-        highBit    = maxBound `xor` (maxBound `shiftR` 1)
-        bytesInArray n = n `shiftL` 1
-
-{-@ unsafeWrite :: ma:MArray s -> MAValidI ma -> Word16 -> ST s () @-}
-unsafeWrite  :: MArray s -> Int -> Word16 -> ST s ()
-unsafeWrite MArray{..} i@(I# i#) (W16# e#)
-  | i < 0 || i >= maLen = liquidError "out of bounds"
-  | otherwise = ST $ \s1# ->
-      case writeWord16Array# maBA i# e# s1# of
-        s2# -> (# s2#, () #)
-
-{-@ copyM :: dest:MArray s 
-          -> didx:MAValidO dest
-          -> src:MArray s 
-          -> sidx:MAValidO src
-          -> {v:Nat | (((didx + v) <= (malen dest))
-                    && ((sidx + v) <= (malen src)))}
-          -> ST s ()
-  @-}
-copyM        :: MArray s               -- ^ Destination
-             -> Int                    -- ^ Destination offset
-             -> MArray s               -- ^ Source
-             -> Int                    -- ^ Source offset
-             -> Int                    -- ^ Count
-             -> ST s ()
-copyM dest didx src sidx count
-    | count <= 0 = return ()
-    | otherwise =
-    liquidAssert (sidx + count <= maLen src) .
-    liquidAssert (didx + count <= maLen dest) .
-    unsafeIOToST $ memcpyM (maBA dest) (fromIntegral didx)
-                           (maBA src) (fromIntegral sidx)
-                           (fromIntegral count)
-
-{-@ memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO () @-}
-memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO ()
-memcpyM = undefined
-
-{-@ unsafeFreeze :: ma:MArray s -> ST s (ArrayN (malen ma)) @-}
-unsafeFreeze :: MArray s -> ST s Array
-unsafeFreeze MArray{..} = ST $ \s# ->
-                          (# s#, Array (unsafeCoerce# maBA) maLen #)
-
-{-@ unsafeIndex :: a:Array -> AValidI a -> Word16 @-}
-unsafeIndex  :: Array -> Int -> Word16
-unsafeIndex Array{..} i@(I# i#)
-  | i < 0 || i >= aLen = liquidError "out of bounds"
-  | otherwise = case indexWord16Array# aBA i# of
-                  r# -> (W16# r#)
-
-data Text = Text Array Int Int
-{-@ data Text [tlen] = Text (arr :: Array)
-                            (off :: TValidO arr)
-                            (len :: TValidL off arr)
-  @-}
-
-{-@ measure tarr :: Text -> Array
-    tarr (Text a o l) = a
-  @-}
-
-{-@ measure toff :: Text -> Int
-    toff (Text a o l) = o
-  @-}
-
-{-@ measure tlen :: Text -> Int
-    tlen (Text a o l) = l
-  @-}
-
-{-@ type TValidI T   = {v:Nat | v     <  (tlen T)} @-}
-{-@ type TValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type TValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-
---------------------------------------------------------------------------------
---- From TextRead
---------------------------------------------------------------------------------
-
-{-@ measure numchars :: Array -> Int -> Int -> Int @-}
-{-@ measure tlength :: Text -> Int @-}
-{-@ invariant {v:Text | (tlength v) = (numchars (tarr v) (toff v) (tlen v))} @-}
-
---------------------------------------------------------------------------------
---- From TextWrite
---------------------------------------------------------------------------------
-
-{-@ qualif Ord(v:int, i:int, x:Char)
-        : ((((ord x) <  65536) => (v = i))
-        && (((ord x) >= 65536) => (v = (i + 1))))
-  @-}
-
-{-@ predicate Room C MA I = (((One C) => (RoomN 1 MA I))
-                          && ((Two C) => (RoomN 2 MA I)))
-  @-}
-{-@ predicate RoomN N MA I = (I+N <= (malen MA)) @-}
-
-{-@ measure ord :: Char -> Int @-}
-{-@ ord :: c:Char -> {v:Int | v = (ord c)} @-}
-{-@ predicate One C = ((ord C) <  65536) @-}
-{-@ predicate Two C = ((ord C) >= 65536) @-}
-
-{-@ writeChar :: ma:MArray s -> i:Nat -> {v:Char | (Room v ma i)}
-              -> ST s {v:Nat | (RoomN v ma i)}
-  @-}
-writeChar :: MArray s -> Int -> Char -> ST s Int
-writeChar marr i c
-    | n < 0x10000 = do
-        unsafeWrite marr i (fromIntegral n)
-        return 1
-    | otherwise = do
-        unsafeWrite marr i lo
-        unsafeWrite marr (i+1) hi
-        return 2
-    where n = ord c
-          m = n - 0x10000
-          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
-          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
-
---------------------------------------------------------------------------------
---- Helpers
---------------------------------------------------------------------------------
-
-{-@ qualif MALenLE(v:int, a:MArray s): v <= (malen a) @-}
-{-@ qualif ALenLE(v:int, a:Array): v <= (alen a) @-}
-
-\end{code}
-
-</div>
-
-Let's take a look at `mapAccumL`, which combines a map and a fold
-over a `Stream` and bundles the result of the map into a new `Text`.
-Again, we'll want to focus our attention on the `Yield` case of the
-inner loop.
-
-\begin{code}
-mapAccumL f z0 (Stream next0 s0 len) =
-  (nz, Text na 0 nl)
- where
-  mlen = upperBound 4 len
-  (na,(nz,nl)) = runST $ do
-       (marr,x) <- (new mlen >>= \arr ->
-                    outer arr mlen z0 s0 0)
-       arr      <- unsafeFreeze marr
-       return (arr,x)
-  outer arr top = loop
-   where
-    loop !z !s !i =
-      case next0 s of
-        Done          -> return (arr, (z,i))
-        Skip s'       -> loop z s' i
-        Yield x s'
-          | j >= top  -> do
-            let top' = (top + 1) `shiftL` 1
-            arr' <- new top'
-            copyM arr' 0 arr 0 top
-            outer arr' top' z s i
-          | otherwise -> do
-            let (z',c) = f z x
-            d <- writeChar arr i c
-            loop z' s' (i+d)
-          where j | ord x < 0x10000 = i
-                  | otherwise       = i + 1
-\end{code}
-
-If you recall `unstream` from last time, you'll notice that this loop body
-looks almost identical to the one found in `unstream`, but LiquidHaskell has
-flagged the `writeChar` call as unsafe! What's going on here?
-
-Let's take a look at `j`, recalling that it carried a crucial part of the safety
-\begin{code} proof last time, and see what LiquidHaskell was able to infer.
-{v:Int | ((ord x >= 65536) => (v == i+1))
-      && ((ord x <  65536) => (v == i))}
-\end{code}
-
-Well that's not very useful at all! LiquidHaskell can prove that it's safe to
-write `x` but here we are trying to write `c` into the array. This is actually
-a *good* thing though, because `c` is the result of calling an arbitrary
-function `f` on `x`! We haven't constrained `f` in any way, so it could easily
-return a character above `U+10000` given any input.
-
-So `mapAccumL` is actually *unsafe*, and our first wild bug caught by
-LiquidHaskell! The fix is luckily easy, we simply have to lift the
-`let (z',c) = f z x` binder into the `where` clause, and change `j` to
-depend on `ord c` instead.
-
-\begin{code}
-mapAccumL' f z0 (Stream next0 s0 len) =
-  (nz, Text na 0 nl)
- where
-  mlen = upperBound 4 len
-  (na,(nz,nl)) = runST $ do
-       (marr,x) <- (new mlen >>= \arr ->
-                    outer arr mlen z0 s0 0)
-       arr      <- unsafeFreeze marr
-       return (arr,x)
-  outer arr top = loop
-   where
-    loop !z !s !i =
-      case next0 s of
-        Done          -> return (arr, (z,i))
-        Skip s'       -> loop z s' i
-        Yield x s'
-          | j >= top  -> do
-            let top' = (top + 1) `shiftL` 1
-            arr' <- new top'
-            copyM arr' 0 arr 0 top
-            outer arr' top' z s i
-          | otherwise -> do
-            d <- writeChar arr i c
-            loop z' s' (i+d)
-          where (z',c) = f z x
-                j | ord c < 0x10000 = i
-                  | otherwise       = i + 1
-\end{code}
-
-LiquidHaskell happily accepts our revised `mapAccumL`, as did the `text`
-maintainers.
-
-We hope you've enjoyed this whirlwind tour of using LiquidHaskell to verify
-production code, we have many more examples in the `benchmarks` folder of
-our GitHub repository for the intrepid reader.
diff --git a/docs/blog/todo/TextInternal.lhs b/docs/blog/todo/TextInternal.lhs
deleted file mode 100644
--- a/docs/blog/todo/TextInternal.lhs
+++ /dev/null
@@ -1,384 +0,0 @@
----
-layout: post
-title: "Text Internals"
-date: 2014-02-09
-comments: true
-external-url:
-author: Eric Seidel
-published: false
-categories: benchmarks, text
-demo: TextInternal.hs
----
-
-So far we have mostly discussed LiquidHaskell in the context of
-recursive data structures like lists, but there comes a time in 
-many programs when you have to put down the list and pick up an 
-array for the sake of performance. 
-In this series we're going to examine the `text` library, which 
-does exactly this in addition to having extensive Unicode support.
-
-`text` is a popular library for efficient text processing. 
-It provides the high-level API haskellers have come to expect while 
-using stream fusion and byte arrays under the hood to guarantee high
-performance. 
-
-The thing that makes `text` stand out as an interesting target for 
-LiquidHaskell, however, is its use of Unicode. 
-Specifically, `text` uses UTF-16 as its internal encoding, where 
-each character is represented with either two or four bytes. 
-We'll see later on how this encoding presents a challenge for 
-verifying memory-safety, but first let us look at how a `Text` 
-is represented.
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-{-# LANGUAGE BangPatterns, CPP, MagicHash, Rank2Types,
-    RecordWildCards, UnboxedTuples, ExistentialQuantification #-}
-{-@ LIQUID "--no-termination" @-}
-module TextInternal where
-
-import Control.Monad.ST.Unsafe (unsafeIOToST)
-import Data.Bits (shiftR, xor, (.&.))
-import Foreign.C.Types (CSize)
-import GHC.Base (Int(..), ByteArray#, MutableByteArray#, newByteArray#,
-                 writeWord16Array#, indexWord16Array#, unsafeCoerce#, ord,
-                 iShiftL#)
-import GHC.ST (ST(..), runST)
-import GHC.Word (Word16(..))
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ data Array = Array { aBA  :: ByteArray#
-                       , aLen :: Nat 
-                       } 
-  @-}
-
-{-@ aLen :: a:Array -> {v:Nat | v = (alen a)}  @-}
-
-{-@ data MArray s = MArray { maBA  :: MutableByteArray# s
-                           , maLen :: Nat } @-}
-
-{-@ maLen :: a:MArray s -> {v:Nat | v = (malen a)}  @-}
-
-new          :: forall s. Int -> ST s (MArray s)
-unsafeWrite  :: MArray s -> Int -> Word16 -> ST s ()
-unsafeFreeze :: MArray s -> ST s Array
-unsafeIndex  :: Array -> Int -> Word16
-copyM        :: MArray s               -- ^ Destination
-             -> Int                    -- ^ Destination offset
-             -> MArray s               -- ^ Source
-             -> Int                    -- ^ Source offset
-             -> Int                    -- ^ Count
-             -> ST s ()
-
---------------------------------------------------------------------------------
---- Helper Code
---------------------------------------------------------------------------------
-{-@ predicate RoomN N MA I = (I+N <= (malen MA)) @-}
-
-{-@ writeChar :: ma:MArray s -> i:{Nat | i < (malen ma) - 1} -> Char
-              -> ST s {v:Nat | (RoomN v ma i)}
-  @-}
-writeChar :: MArray s -> Int -> Char -> ST s Int
-writeChar marr i c
-    | n < 0x10000 = do
-        unsafeWrite marr i (fromIntegral n)
-        return 1
-    | otherwise = do
-        unsafeWrite marr i lo
-        unsafeWrite marr (i+1) hi
-        return 2
-    where n = ord c
-          m = n - 0x10000
-          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
-          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
-
-
-{-@ measure isUnknown :: Size -> Prop
-    isUnknown (Exact n) = false
-    isUnknown (Max   n) = false
-    isUnknown (Unknown) = true
-  @-}
-{-@ measure getSize :: Size -> Int
-    getSize (Exact n) = n
-    getSize (Max   n) = n
-  @-}
-
-{-@ invariant {v:Size | (getSize v) >= 0} @-}
-
-data Size = Exact {-# UNPACK #-} !Int -- ^ Exact size.
-          | Max   {-# UNPACK #-} !Int -- ^ Upper bound on size.
-          | Unknown                   -- ^ Unknown size.
-            deriving (Eq, Show)
-
-{-@ upperBound :: k:Nat -> s:Size -> {v:Nat | v = ((isUnknown s) ? k : (getSize s))} @-}
-upperBound :: Int -> Size -> Int
-upperBound _ (Exact n) = n
-upperBound _ (Max   n) = n
-upperBound k _         = k
-
-data Step s a = Done
-              | Skip !s
-              | Yield !a !s
-
-data Stream a =
-    forall s. Stream
-    (s -> Step s a)             -- stepper function
-    !s                          -- current state
-    !Size                       -- size hint
-
-{-@ shiftL :: i:Nat -> n:Nat -> {v:Nat | ((n = 1) => (v = (i * 2)))} @-}
-shiftL :: Int -> Int -> Int
-shiftL = undefined -- (I# x#) (I# i#) = I# (x# `iShiftL#` i#)
-
-{-@ memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO () @-}
-memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO ()
-memcpyM = undefined
-
-\end{code}
-
-</div>
-
-`text` splits the reading and writing array operations between two
-types of arrays, immutable `Array`s and mutable `MArray`s. This leads to
-the following general lifecycle:
-
-![The lifecycle of a `Text`](/images/text-lifecycle.png)
-
-
-\begin{code}
-data Array = Array {
-    aBA  :: ByteArray#
-  , aLen :: !Int
-  }
-
-{-@ measure alen     :: Array -> Int
-    alen (Array a n) = n
-  @-}
-
-data MArray s = MArray {
-    maBA  :: MutableByteArray# s
-  , maLen :: !Int
-  }
-
-{-@ measure malen :: MArray s -> Int
-    malen (MArray a n) = n
-  @-}
-
-\end{code}
-
-Both types carry around with them the number of `Word16`s they can
-hold (this is actually only true when you compile with asserts turned
-on, but we use this to ease the verification process).
-
-The main three array operations we care about are: 
-
-1. **writing** into an `MArray`, 
-2. **reading** from an `Array`, and 
-3. **freezing** an `MArray` into an `Array`. 
-
-But first, let's see how one creates an `MArray`.
-
-\begin{code}
-{-@ type MArrayN s N = {v:MArray s | (malen v) = N} @-}
-
-{-@ new :: forall s. n:Nat -> ST s (MArrayN s n) @-}
-new n
-  | n < 0 || n .&. highBit /= 0 = error $ "new: size overflow"
-  | otherwise = ST $ \s1# ->
-       case newByteArray# len# s1# of
-         (# s2#, marr# #) -> (# s2#, MArray marr# n #)
-  where !(I# len#) = bytesInArray n
-        highBit    = maxBound `xor` (maxBound `shiftR` 1)
-        bytesInArray n = n `shiftL` 1
-\end{code}
-
-`new n` is an `ST` action that produces an `MArray s` with `n` slots,
-denoted by the type alias `MArrayN s n`. Note that we are not talking
-about bytes here, `text` deals with `Word16`s internally and as such
-we actualy allocate `2*n` bytes.  While this may seem like a lot of
-code to just create an array, the verification process here is quite
-simple. LiquidHaskell simply recognizes that the `n` used to construct
-the returned array (`MArray marr# n`) is the same `n` passed to
-`new`. It should be noted that we're abstracting away some detail here
-with respect to the underlying `MutableByteArray#`, specifically we're
-making the assumption that any *unsafe* operation will be caught and
-dealt with before the `MutableByteArray#` is touched.
-
-Once we have an `MArray` in hand, we'll want to be able to write our
-data into it. A `Nat` is a valid index into an `MArray` `ma` if it is
-less than the number of slots, for which we have another type alias
-`MAValidI ma`. `text` includes run-time assertions that check this
-property, but LiquidHaskell can statically prove the assertions will
-always pass.
-
-\begin{code}
-{-@ type MAValidI MA = {v:Nat | v < (malen MA)} @-}
-{-@ unsafeWrite :: ma:MArray s -> MAValidI ma -> Word16 -> ST s () @-}
-unsafeWrite MArray{..} i@(I# i#) (W16# e#)
-  | i < 0 || i >= maLen = liquidError "out of bounds"
-  | otherwise = ST $ \s1# ->
-      case writeWord16Array# maBA i# e# s1# of
-        s2# -> (# s2#, () #)
-\end{code}
-
-So now we can write individual `Word16`s into an array, but maybe we
-have a whole bunch of text we want to dump into the array. Remember,
-`text` is supposed to be fast!
-C has `memcpy` for cases like this but it's notoriously unsafe; with
-the right type however, we can regain safety. `text` provides a wrapper around
-`memcpy` to copy `n` elements from one `MArray` to another.
-
-\begin{code}
-{-@ type MAValidO MA = {v:Nat | v <= (malen MA)} @-}
-{-@ copyM :: dest:MArray s
-          -> didx:MAValidO dest
-          -> src:MArray s 
-          -> sidx:MAValidO src
-          -> {v:Nat | (((didx + v) <= (malen dest))
-                    && ((sidx + v) <= (malen src)))}
-          -> ST s ()
-  @-}
-copyM dest didx src sidx count
-    | count <= 0 = return ()
-    | otherwise =
-    liquidAssert (sidx + count <= maLen src) .
-    liquidAssert (didx + count <= maLen dest) .
-    unsafeIOToST $ memcpyM (maBA dest) (fromIntegral didx)
-                           (maBA src) (fromIntegral sidx)
-                           (fromIntegral count)
-\end{code}
-
-`copyM` requires two `MArray`s and valid offsets into each -- note 
-that a valid offset is **not** necessarily a valid *index*, it may 
-be one element out-of-bounds -- and a `count` of elements to copy.
-The `count` must represent a valid region in each `MArray`, in 
-other words `offset + count <= length` must hold for each array. 
-`memcpyM` is an FFI function writen in C, which we don't currently
-support, so we simply leave it `undefined`.
-
-Before we can package up our `MArray` into a `Text`, we need to
-*freeze* it, preventing any further mutation. The key property here is
-of course that the frozen `Array` should have the same length as the
-`MArray`.
-
-\begin{code}
-{-@ type ArrayN N = {v:Array | (alen v) = N} @-}
-{-@ unsafeFreeze :: ma:MArray s -> ST s (ArrayN (malen ma)) @-}
-unsafeFreeze MArray{..} = ST $ \s# ->
-                          (# s#, Array (unsafeCoerce# maBA) maLen #)
-\end{code}
-
-Again, LiquidHaskell is happy to prove our specification as we simply
-copy the length parameter `maLen` over into the `Array`.
-
-Finally, we will eventually want to read a value out of the
-`Array`. As with `unsafeWrite` we require a valid index into the
-`Array`, which we denote using the `AValidI` alias.
-
-\begin{code}
-{-@ type AValidI A = {v:Nat | v < (alen A)} @-}
-{-@ unsafeIndex :: a:Array -> AValidI a -> Word16 @-}
-unsafeIndex Array{..} i@(I# i#)
-  | i < 0 || i >= aLen = liquidError "out of bounds"
-  | otherwise = case indexWord16Array# aBA i# of
-                  r# -> (W16# r#)
-\end{code}
-
-As before, LiquidHaskell can easily prove that the run-time assertions
-will never fail.
-
-
-Now we can finally define the core datatype of the `text` package! 
-A `Text` value consists of an *array*, an *offset*, and a *length*. 
-The offset and length are `Nat`s satisfying two properties: 
-
-1. `off <= alen arr`, and 
-2. `off + len <= alen arr`
-
-These invariants ensure that any *index* we pick between `off` and
-`off + len` will be a valid index into `arr`. If you're not quite
-convinced, consider the following `Text`s.
-
-![Multiple valid `Text` configurations, all using an `Array` with 10 slots. The valid slots are shaded. Note that the key invariant is that `off + len <= alen`.](/images/text-layout.png)
-
-\begin{code}
-data Text = Text Array Int Int
-{-@ data Text [tlen] = Text (arr :: Array)
-                            (off :: TValidO arr)
-                            (len :: TValidL off arr)
-  @-}
-
-{-@ measure tarr :: Text -> Array
-    tarr (Text a o l) = a
-  @-}
-
-{-@ measure toff :: Text -> Int
-    toff (Text a o l) = o
-  @-}
-
-{-@ measure tlen :: Text -> Int
-    tlen (Text a o l) = l
-  @-}
-\end{code}
-
-The liquid-type for `Text` makes use of the following two type-aliases to
-express the core invariant.
-
-\begin{code}
-{-@ type TValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type TValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-\end{code}
-
-Before we go, let's take a quick look at a function that combines
-`MArray`s, `Array`s, and `Text`s. `unstream` is a major workhorse of
-the `text` library. It transforms a `Stream` of `Char`s into a `Text`,
-and enables GHC use a technique called *stream fusion* to combine
-multiple loops over a sequence into a single loop.
-
-\begin{code}
-unstream :: Stream Char -> Text
-unstream (Stream next0 s0 len) = runST $ do
-  let mlen = upperBound 4 len
-  arr0 <- new mlen
-  let outer arr top = loop
-       where
-        loop !s !i =
-            case next0 s of
-              Done          -> do
-                arr' <- unsafeFreeze arr
-                return $! Text arr' 0 i
-              Skip s'       -> loop s' i
-              Yield x s'
-                | j >= top  -> do
-                  let top' = (top + 1) `shiftL` 1
-                  arr' <- new top'
-                  copyM arr' 0 arr 0 top
-                  outer arr' top' s i
-                | otherwise -> do
-                  d <- writeChar arr i x
-                  loop s' (i+d)
-                where j | ord x < 0x10000 = i
-                        | otherwise       = i + 1
-  outer arr0 mlen s0 0
-\end{code}
-
-`unstream` repeatedly writes the characters coming out of the `Stream`
-into the `arr`, until it runs out of room. Then it has to allocate a
-new, larger `MArray` and copy everything into the new array before
-continuing. Note that LiquidHaskell has successfully inferred that
-`arr'` is longer than `arr` and that `top` is a valid offset into
-both, thus proving that the call to `copyM` is safe! Unfortunately for
-us, however, the `writeChar` call is flagged as *unsafe*.. Astute
-readers will notice that `writeChar` (whose implementation we haven't
-yet seen) has a slightly odd type, it requires that the index `i` be
-less than `malen arr - 1`. This is indeed odd and, I should add, not
-the final type, but it is a safe approximation because not all `Char`s
-are created equal. Depending on your encoding, some won't fit into a
-single `Word16`, so we may need extra room to write!
-
-Stay tuned, next time we'll dig into how `text` uses Unicode to
-represent `Char`s internally.
diff --git a/docs/blog/todo/TextRead.lhs b/docs/blog/todo/TextRead.lhs
deleted file mode 100644
--- a/docs/blog/todo/TextRead.lhs
+++ /dev/null
@@ -1,357 +0,0 @@
----
-layout: post
-title: "Text Read"
-date: 2014-02-16
-comments: true
-external-url:
-author: Eric Seidel
-published: false
-categories: benchmarks, text
-demo: TextRead.hs
----
-
-Welcome back! Last time we left off on a bit of a cliffhanger with the
-`unstream` example. Remember, the issue we found was that some `Char`s
-can't fit into a single `Word16`, so the safety of a write depends not
-only on the *index*, but also on the *value* being written! Before we
-can resolve this issue with `unstream` we'll have to learn about
-UTF-16, so let's take a short detour and look at how one *consumes* a
-`Text`.
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-{-# LANGUAGE BangPatterns, CPP, MagicHash, Rank2Types,
-    RecordWildCards, UnboxedTuples, ExistentialQuantification #-}
-{-@ LIQUID "--no-termination" @-}
-module TextRead where
-
-import GHC.Base hiding (unsafeChr)
-import GHC.ST
-import GHC.Word (Word16(..))
-import Data.Bits hiding (shiftL)
-import Data.Word
-
-import Language.Haskell.Liquid.Prelude
-
-
---------------------------------------------------------------------------------
---- From TextInternal
---------------------------------------------------------------------------------
-
-{-@ shiftL :: i:Nat -> n:Nat -> {v:Nat | ((n = 1) => (v = (i * 2)))} @-}
-shiftL :: Int -> Int -> Int
-shiftL = undefined -- (I# x#) (I# i#) = I# (x# `iShiftL#` i#)
-
-{-@ data Array = Array { aBA  :: ByteArray#
-                       , aLen :: Nat 
-                       } 
-  @-}
-
-data Array = Array {
-    aBA  :: ByteArray#
-  , aLen :: !Int
-  }
-
-{-@ measure alen     :: Array -> Int
-    alen (Array a n) = n
-  @-}
-
-{-@ aLen :: a:Array -> {v:Nat | v = (alen a)}  @-}
-
-{-@ type ArrayN  N   = {v:Array | (alen v) = N} @-}
-
-{-@ type AValidI A   = {v:Nat | v     <  (alen A)} @-}
-{-@ type AValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type AValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-{-@ data MArray s = MArray { maBA  :: MutableByteArray# s
-                           , maLen :: Nat } @-}
-
-data MArray s = MArray {
-    maBA  :: MutableByteArray# s
-  , maLen :: !Int
-  }
-
-{-@ measure malen :: MArray s -> Int
-    malen (MArray a n) = n
-  @-}
-
-{-@ maLen :: a:MArray s -> {v:Nat | v = (malen a)}  @-}
-
-{-@ type MArrayN s N = {v:MArray s | (malen v) = N} @-}
-
-{-@ type MAValidO MA = {v:Nat | v <= (malen MA)} @-}
-
-{-@ new :: forall s. n:Nat -> ST s (MArrayN s n) @-}
-new          :: forall s. Int -> ST s (MArray s)
-new n
-  | n < 0 || n .&. highBit /= 0 = error $ "new: size overflow"
-  | otherwise = ST $ \s1# ->
-       case newByteArray# len# s1# of
-         (# s2#, marr# #) -> (# s2#, MArray marr# n #)
-  where !(I# len#) = bytesInArray n
-        highBit    = maxBound `xor` (maxBound `shiftR` 1)
-        bytesInArray n = n `shiftL` 1
-
-{-@ unsafeFreeze :: ma:MArray s -> ST s (ArrayN (malen ma)) @-}
-unsafeFreeze :: MArray s -> ST s Array
-unsafeFreeze MArray{..} = ST $ \s# ->
-                          (# s#, Array (unsafeCoerce# maBA) maLen #)
-
-{-@ unsafeIndex :: a:Array -> AValidI a -> Word16 @-}
-unsafeIndex  :: Array -> Int -> Word16
-unsafeIndex Array{..} i@(I# i#)
-  | i < 0 || i >= aLen = liquidError "out of bounds"
-  | otherwise = case indexWord16Array# aBA i# of
-                  r# -> (W16# r#)
-
-data Text = Text Array Int Int
-{-@ data Text [tlen] = Text (arr :: Array)
-                            (off :: TValidO arr)
-                            (len :: TValidL off arr)
-  @-}
-
-{-@ measure tarr :: Text -> Array
-    tarr (Text a o l) = a
-  @-}
-
-{-@ measure toff :: Text -> Int
-    toff (Text a o l) = o
-  @-}
-
-{-@ measure tlen :: Text -> Int
-    tlen (Text a o l) = l
-  @-}
-
-{-@ type TValidI T   = {v:Nat | v     <  (tlen T)} @-}
-{-@ type TValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type TValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-
---------------------------------------------------------------------------------
---- Helpers
---------------------------------------------------------------------------------
-
-{-@ invariant {v:Text | (tlength v) = (numchars (tarr v) (toff v) (tlen v))} @-}
-
-{-@ axiom_lead_surr :: x:Word16 -> a:Array -> o:Nat -> l:Nat -> i:Nat
-                  -> {v:Bool | ((Prop v) <=> (if (55296 <= x && x <= 56319)
-                                              then (SpanChar 2 a o l i)
-                                              else (SpanChar 1 a o l i)))}
-  @-}
-axiom_lead_surr :: Word16 -> Array -> Int -> Int -> Int -> Bool
-axiom_lead_surr = undefined
-
-{-@ empty :: {v:Text | (tlen v) = 0} @-}
-empty :: Text
-empty = Text arrEmpty 0 0
-  where
-    {-@ arrEmpty :: (ArrayN {0}) @-}
-    arrEmpty = runST $ new 0 >>= unsafeFreeze
-
-unsafeChr :: Word16 -> Char
-unsafeChr (W16# w#) = C# (chr# (word2Int# w#))
-
-chr2 :: Word16 -> Word16 -> Char
-chr2 (W16# a#) (W16# b#) = C# (chr# (upper# +# lower# +# 0x10000#))
-    where
-      !x# = word2Int# a#
-      !y# = word2Int# b#
-      !upper# = uncheckedIShiftL# (x# -# 0xD800#) 10#
-      !lower# = y# -# 0xDC00#
-
-{-@ qualif Min(v:int, t:Text, i:int):
-      (if ((tlength t) < i)
-       then ((numchars (tarr t) (toff t) v) = (tlength t))
-       else ((numchars (tarr t) (toff t) v) = i))
-  @-}
-
-{-@ qualif NumChars(v:int, t:Text, i:int): v = (numchars (tarr t) (toff t) i) @-}
-
-{-@ qualif TLengthLE(v:int, t:Text): v <= (tlength t) @-}
-
-\end{code}
-
-</div>
-
-Let's begin with a simple example, `unsafeHead`.
-
-\begin{code}
-{-@ type TextNE = {v:Text | (tlen v) > 0} @-}
-
-{-@ unsafeHead :: TextNE -> Char @-}
-unsafeHead :: Text -> Char
-unsafeHead (Text arr off _len)
-    | m < 0xD800 || m > 0xDBFF = unsafeChr m
-    | otherwise                = chr2 m n
-    where m = unsafeIndex arr off
-          n = unsafeIndex arr (off+1)
-\end{code}
-
-LiquidHaskell can prove the first `unsafeIndex` is safe because the
-precondition states that the `Text` must not be empty, i.e. `_len > 0`
-must hold. Combine this with the core `Text` invariant that
-`off + _len <= alen arr` and we get that `off < alen arr`, which satisfies
-the precondition for `unsafeIndex`.
-
-However, the same calculation *fails* for the second index because we
-can't prove that `off + 1 < alen arr`. The solution is going to
-require some understanding of UTF-16, so let's take a brief detour.
-
-The UTF-16 standard represents all code points below `U+10000` with a
-single 16-bit word; all others are split into two 16-bit words, known
-as a *surrogate pair*. The first word, or *lead*, is guaranteed to be
-in the range `[0xD800, 0xDBFF]` and the second, or *trail*, is
-guaranteed to be in the range `[0xDC00, 0xDFFF]`.
-
-Armed with this knowledge of UTF-16 we can return to
-`unsafeHead`. Note the case-split on `m`, which determines whether `m`
-is a lead surrogate. If `m` is a lead surrogate then we know there
-must be a trail surrogate at `off+1`; we can define a specialized
-version of `unsafeIndex` that encodes this domain knowledge.
-
-\begin{code}
-{-@ unsafeIndexF :: a:Array -> o:AValidO a -> l:AValidL o a
-                 -> i:{v:Nat | (o <= v && v < (o + l))}
-                 -> {v:Word16 | (if (55296 <= v && v <= 56319)
-                                 then (SpanChar 2 a o l i)
-                                 else (SpanChar 1 a o l i))}
-  @-}
-unsafeIndexF :: Array -> Int -> Int -> Int -> Word16
-unsafeIndexF a o l i = let x = unsafeIndex a i
-                       in liquidAssume (axiom_lead_surr x a o l i) x
-\end{code}
-
-Our variant `unsafeIndexF` (F as in "forward") takes an array, an
-offset, and a length (which together must form a valid `Text`); a
-valid index into the `Text`; and returns a `Word16` with an
-interesting type. The best way to read this type would be "if `v` is
-in the range `[0xD800, 0xDBFF]`, then the character that starts at
-index `i` in the array `a` spans two slots, otherwise it only spans
-one slot." Intuitively, we know what it means for a character to span
-`n` slots, but LiquidHaskell needs to know three things:
-
-1. `a[o:i+n]` contains one more character than `a[o:i]` (borrowing
-   Python's wonderful slicing syntax)
-2. `a[o:i+n]` contains no more characters than `a[o:l]`
-3. `i-o+n <= l`
-
-2 and 3 encode the well-formedness of a `Text` value, i.e. `i+1`
-*must* be a valid index if a lead surrogate is at index `i`.
-
-We can encode these properties in the refinement logic as follows.
-
-\begin{code}
-{-@ measure numchars :: Array -> Int -> Int -> Int @-}
-{-@ predicate SpanChar N A O L I =
-      (((numchars (A) (O) ((I-O)+N)) = (1 + (numchars (A) (O) (I-O))))
-    && ((numchars (A) (O) ((I-O)+N)) <= (numchars A O L))
-    && (((I-O)+N) <= L))
-  @-}
-\end{code}
-
-The `numchars` measure takes an array, an offset, and a length
-(e.g. the `arr`, `off`, and `len` fields of a `Text`) and denotes the
-number of characters contained in the `length` slots beginning at
-`offset`. Since we can't compute this in the refinement logic, we
-leave the measure abstract. We can, however, provide LiquidHaskell
-with a few invariants about the behavior of `numchars`, specifically
-that (1) `numchars` always returns a `Nat`, (2) there are no
-characters contained in a empty span, and (3) there are at most as
-many characters as words in a `Text`. We encode these using a special
-`invariant` annotation.
-
-\begin{code}
-{-@ invariant {v:Text | (numchars (tarr v) (toff v) (tlen v)) >= 0}        @-}
-{-@ invariant {v:Text | (numchars (tarr v) (toff v) 0)         = 0}        @-}
-{-@ invariant {v:Text | (numchars (tarr v) (toff v) (tlen v)) <= (tlen v)} @-}
-\end{code}
-
-Finally returning to `unsafeHead`, we can use `unsafeIndexF` to
-strengthen the inferred type for `m`. LiquidHaskell can now prove that
-the second `unsafeIndex` is in fact safe, because it is only demanded
-if `m` is a lead surrogate.
-
-\begin{code}
-{-@ unsafeHead' :: TextNE -> Char @-}
-unsafeHead' :: Text -> Char
-unsafeHead' (Text arr off _len)
-    | m < 0xD800 || m > 0xDBFF = unsafeChr m
-    | otherwise                = chr2 m n
-    where m = unsafeIndexF arr off _len off
-          {-@ LAZYVAR n @-}
-          n = unsafeIndex arr (off+1)
-\end{code}
-
-The `LAZYVAR` annotation is currently required because LiquidHaskell
-doesn't know that `n` will only be demanded in one branch; one can
-imagine a transformation that would push the `where` bindings inward
-to the use-site, which would alleviate this issue.
-
-Before signing off, let's take a look at a slightly more interesting
-function, `take`.
-
-\begin{code}
-{-@ take :: n:Nat -> t:Text -> {v:Text | (Min (tlength v) (tlength t) n)} @-}
-take :: Int -> Text -> Text
-take n t@(Text arr off len)
-    | n <= 0    = empty
-    | n >= len  = t
-    | otherwise = Text arr off (loop 0 0)
-  where
-     loop !i !cnt
-          | i >= len || cnt >= n = i
-          | otherwise            = let d = iter_ t i
-                                   in loop (i+d) (cnt+1)
-\end{code}
-
-`take` gets a `Nat` and a `Text`, and returns a `Text` that contains
-the first `n` characters of `t`. That is, unless `n >= tlength t`, in
-which case it just returns `t`.
-
-`tlength` is a simple wrapper around `numchars`.
-
-\begin{code}
-{-@ measure tlength :: Text -> Int
-    tlength (Text a o l) = (numchars a o l)
-  @-}
-\end{code}
-
-The bulk of the work is done by the
-inner `loop`, which has to track the current index `i` and the number
-of characters we have seen, `cnt`. `loop` uses an auxiliary function
-`iter_` to determine the *width* of the character that starts at `i`,
-bumps `cnt`, and recursively calls itself at `i+d` until it either
-reaches the end of `t` or sees `n` characters, returning the final
-index.
-
-The `iter_` function is quite simple, it just determines whether the
-word at index `i` is a lead surrogate, and returns the appropriate
-span.
-
-\begin{code}
-{-@ predicate SpanCharT N T I =
-      (SpanChar N (tarr T) (toff T) (tlen T) ((toff T)+I))
-  @-}
-
-{-@ iter_ :: t:Text -> i:TValidI t
-          -> {v:Nat | (SpanCharT v t i)}
-  @-}
-iter_ :: Text -> Int -> Int
-iter_ (Text arr off len) i
-    | m < 0xD800 || m > 0xDBFF = 1
-    | otherwise                = 2
- where m = unsafeIndexF arr off len (off+i)
-\end{code}
-
-Again, we use `unsafeIndexF` to learn more about the structure of `t`
-by observing a small piece of it. It's also worth noting that we've
-encoded all of the domain knowledge we need into a single function,
-which has the benefit of letting us focus our attention on one type
-when we try to ensure that we've encoded it correctly.
-
-Next time, we'll continue our exploration of `text` and see how to
-construct a `Text` while ensuring the absence of out-of-bounds writes.
diff --git a/docs/blog/todo/TextWrite.lhs b/docs/blog/todo/TextWrite.lhs
deleted file mode 100644
--- a/docs/blog/todo/TextWrite.lhs
+++ /dev/null
@@ -1,335 +0,0 @@
----
-layout: post
-title: "Text Write"
-date: 2014-02-23
-comments: true
-external-url:
-author: Eric Seidel
-published: false
-categories: benchmarks, text
-demo: TextWrite.hs
----
-
-Last time, we showed how to reason about Unicode and a variable-width
-encoding of `Char`s when consuming a `Text` value, today we'll look at
-the same issue from the perspective of *building* a `Text`.
-
-<!-- more -->
-
-<div class="hidden">
-
-\begin{code}
-{-# LANGUAGE BangPatterns, CPP, MagicHash, Rank2Types,
-    RecordWildCards, UnboxedTuples, ExistentialQuantification #-}
-{-@ LIQUID "--no-termination" @-}
-module TextWrite where
-
-import Control.Monad.ST.Unsafe (unsafeIOToST)
-import Foreign.C.Types (CSize)
-import GHC.Base hiding (unsafeChr)
-import GHC.ST
-import GHC.Word (Word16(..))
-import Data.Bits hiding (shiftL)
-import Data.Word
-
-import Language.Haskell.Liquid.Prelude
-
---------------------------------------------------------------------------------
---- From TextInternal
---------------------------------------------------------------------------------
-
-{-@ shiftL :: i:Nat -> n:Nat -> {v:Nat | ((n = 1) => (v = (i * 2)))} @-}
-shiftL :: Int -> Int -> Int
-shiftL = undefined -- (I# x#) (I# i#) = I# (x# `iShiftL#` i#)
-
-{-@ measure isUnknown :: Size -> Prop
-    isUnknown (Exact n) = false
-    isUnknown (Max   n) = false
-    isUnknown (Unknown) = true
-  @-}
-{-@ measure getSize :: Size -> Int
-    getSize (Exact n) = n
-    getSize (Max   n) = n
-  @-}
-
-{-@ invariant {v:Size | (getSize v) >= 0} @-}
-
-data Size = Exact {-# UNPACK #-} !Int -- ^ Exact size.
-          | Max   {-# UNPACK #-} !Int -- ^ Upper bound on size.
-          | Unknown                   -- ^ Unknown size.
-            deriving (Eq, Show)
-
-{-@ upperBound :: k:Nat -> s:Size -> {v:Nat | v = ((isUnknown s) ? k : (getSize s))} @-}
-upperBound :: Int -> Size -> Int
-upperBound _ (Exact n) = n
-upperBound _ (Max   n) = n
-upperBound k _         = k
-
-data Step s a = Done
-              | Skip !s
-              | Yield !a !s
-
-data Stream a =
-    forall s. Stream
-    (s -> Step s a)             -- stepper function
-    !s                          -- current state
-    !Size                       -- size hint
-
-{-@ data Array = Array { aBA  :: ByteArray#
-                       , aLen :: Nat 
-                       } 
-  @-}
-
-data Array = Array {
-    aBA  :: ByteArray#
-  , aLen :: !Int
-  }
-
-{-@ measure alen     :: Array -> Int
-    alen (Array a n) = n
-  @-}
-
-{-@ aLen :: a:Array -> {v:Nat | v = (alen a)}  @-}
-
-{-@ type ArrayN  N   = {v:Array | (alen v) = N} @-}
-
-{-@ type AValidI A   = {v:Nat | v     <  (alen A)} @-}
-{-@ type AValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type AValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-{-@ data MArray s = MArray { maBA  :: MutableByteArray# s
-                           , maLen :: Nat } @-}
-
-data MArray s = MArray {
-    maBA  :: MutableByteArray# s
-  , maLen :: !Int
-  }
-
-{-@ measure malen :: MArray s -> Int
-    malen (MArray a n) = n
-  @-}
-
-{-@ maLen :: a:MArray s -> {v:Nat | v = (malen a)}  @-}
-
-{-@ type MArrayN s N = {v:MArray s | (malen v) = N} @-}
-
-{-@ type MAValidI MA = {v:Nat | v <  (malen MA)} @-}
-{-@ type MAValidO MA = {v:Nat | v <= (malen MA)} @-}
-
-{-@ new :: forall s. n:Nat -> ST s (MArrayN s n) @-}
-new          :: forall s. Int -> ST s (MArray s)
-new n
-  | n < 0 || n .&. highBit /= 0 = error $ "new: size overflow"
-  | otherwise = ST $ \s1# ->
-       case newByteArray# len# s1# of
-         (# s2#, marr# #) -> (# s2#, MArray marr# n #)
-  where !(I# len#) = bytesInArray n
-        highBit    = maxBound `xor` (maxBound `shiftR` 1)
-        bytesInArray n = n `shiftL` 1
-
-{-@ unsafeWrite :: ma:MArray s -> MAValidI ma -> Word16 -> ST s () @-}
-unsafeWrite  :: MArray s -> Int -> Word16 -> ST s ()
-unsafeWrite MArray{..} i@(I# i#) (W16# e#)
-  | i < 0 || i >= maLen = liquidError "out of bounds"
-  | otherwise = ST $ \s1# ->
-      case writeWord16Array# maBA i# e# s1# of
-        s2# -> (# s2#, () #)
-
-{-@ copyM :: dest:MArray s 
-          -> didx:MAValidO dest
-          -> src:MArray s 
-          -> sidx:MAValidO src
-          -> {v:Nat | (((didx + v) <= (malen dest))
-                    && ((sidx + v) <= (malen src)))}
-          -> ST s ()
-  @-}
-copyM        :: MArray s               -- ^ Destination
-             -> Int                    -- ^ Destination offset
-             -> MArray s               -- ^ Source
-             -> Int                    -- ^ Source offset
-             -> Int                    -- ^ Count
-             -> ST s ()
-copyM dest didx src sidx count
-    | count <= 0 = return ()
-    | otherwise =
-    liquidAssert (sidx + count <= maLen src) .
-    liquidAssert (didx + count <= maLen dest) .
-    unsafeIOToST $ memcpyM (maBA dest) (fromIntegral didx)
-                           (maBA src) (fromIntegral sidx)
-                           (fromIntegral count)
-
-{-@ memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO () @-}
-memcpyM :: MutableByteArray# s -> CSize -> MutableByteArray# s -> CSize -> CSize -> IO ()
-memcpyM = undefined
-
-{-@ unsafeFreeze :: ma:MArray s -> ST s (ArrayN (malen ma)) @-}
-unsafeFreeze :: MArray s -> ST s Array
-unsafeFreeze MArray{..} = ST $ \s# ->
-                          (# s#, Array (unsafeCoerce# maBA) maLen #)
-
-{-@ unsafeIndex :: a:Array -> AValidI a -> Word16 @-}
-unsafeIndex  :: Array -> Int -> Word16
-unsafeIndex Array{..} i@(I# i#)
-  | i < 0 || i >= aLen = liquidError "out of bounds"
-  | otherwise = case indexWord16Array# aBA i# of
-                  r# -> (W16# r#)
-
-data Text = Text Array Int Int
-{-@ data Text [tlen] = Text (arr :: Array)
-                            (off :: TValidO arr)
-                            (len :: TValidL off arr)
-  @-}
-
-{-@ measure tarr :: Text -> Array
-    tarr (Text a o l) = a
-  @-}
-
-{-@ measure toff :: Text -> Int
-    toff (Text a o l) = o
-  @-}
-
-{-@ measure tlen :: Text -> Int
-    tlen (Text a o l) = l
-  @-}
-
-{-@ type TValidI T   = {v:Nat | v     <  (tlen T)} @-}
-{-@ type TValidO A   = {v:Nat | v     <= (alen A)} @-}
-{-@ type TValidL O A = {v:Nat | (v+O) <= (alen A)} @-}
-
-
---------------------------------------------------------------------------------
---- From TextRead
---------------------------------------------------------------------------------
-
-{-@ measure numchars :: Array -> Int -> Int -> Int @-}
-{-@ measure tlength :: Text -> Int @-}
-{-@ invariant {v:Text | (tlength v) = (numchars (tarr v) (toff v) (tlen v))} @-}
-
---------------------------------------------------------------------------------
---- Helpers
---------------------------------------------------------------------------------
-
-{-@ qualif Ord(v:int, i:int, x:Char)
-        : ((((ord x) <  65536) => (v = i))
-        && (((ord x) >= 65536) => (v = (i + 1))))
-  @-}
-
-\end{code}
-
-</div>
-
-We mentioned previously that `text` uses stream fusion to optimize
-multiple loops over a `Text` into a single loop; as a result many of
-the top-level API functions are simple wrappers around equivalent
-functions over `Stream`s. The creation of `Text` values is then
-largely handled by a single function, `unstream`, which converts a
-`Stream` into a `Text`.
-
-\begin{code}
-unstream :: Stream Char -> Text
-unstream (Stream next0 s0 len) = runST $ do
-  let mlen = upperBound 4 len
-  arr0 <- new mlen
-  let outer arr top = loop
-       where
-        loop !s !i =
-            case next0 s of
-              Done          -> do
-                arr' <- unsafeFreeze arr
-                return $! Text arr' 0 i
-              Skip s'       -> loop s' i
-              Yield x s'
-                | j >= top  -> do
-                  let top' = (top + 1) `shiftL` 1
-                  arr' <- new top'
-                  copyM arr' 0 arr 0 top
-                  outer arr' top' s i
-                | otherwise -> do
-                  d <- writeChar arr i x
-                  loop s' (i+d)
-                where j | ord x < 0x10000 = i
-                        | otherwise       = i + 1
-  outer arr0 mlen s0 0
-\end{code}
-
-Since we're focusing on memory safety here we won't go into detail
-about how `Stream`s work. Let's instead jump right into the inner
-`loop` and look at the `Yield` case. Here we need to write a char `x`
-into `arr`, so we compute the maximal index `j` to which we will
-write -- i.e. if `x >= U+10000` then `j = i + 1` -- and determine
-whether we can safely write at `j`. If the write is unsafe we have to
-allocate a larger array before continuing, otherwise we write `x` and
-increment `i` by `x`s width.
-
-Since `writeChar` has to handle writing *any* Unicode value, we need
-to assure it that there will always be room to write `x` into `arr`,
-regardless of `x`s width. Indeed, this is expressed in the type we
-give to `writeChar`.
-
-\begin{code}
-{-@ writeChar :: ma:MArray s -> i:Nat -> {v:Char | (Room v ma i)}
-              -> ST s {v:Nat | (RoomN v ma i)}
-  @-}
-\end{code}
-
-The predicate aliases `Room` and `RoomN` express that a character can
-fit in the array at index `i` and that there are at least `n` slots
-available starting at `i` respectively.
-
-\begin{code}
-{-@ predicate Room C MA I = (((One C) => (RoomN 1 MA I))
-                          && ((Two C) => (RoomN 2 MA I)))
-  @-}
-{-@ predicate RoomN N MA I = (I+N <= (malen MA)) @-}
-\end{code}
-
-The `One` and `Two` predicates express that a character will be
-encoded in one or two 16-bit words, by reasoning about its ordinal
-value.
-
-\begin{code}
-{-@ predicate One C = ((ord C) <  65536) @-}
-{-@ predicate Two C = ((ord C) >= 65536) @-}
-\end{code}
-
-As with `numchars`, we leave `ord` abstract, but inform LiquidHaskell
-that the `ord` *function* does in fact return the ordinal value of the
-character.
-
-\begin{code}
-{-@ measure ord :: Char -> Int @-}
-{-@ ord :: c:Char -> {v:Int | v = (ord c)} @-}
-\end{code}
-
-Since `writeChar` assumes that it will never be called unless there is room to
-write `c`, it is safe to just split `c` into 16-bit words and write them into
-the array.
-
-\begin{code}
-writeChar :: MArray s -> Int -> Char -> ST s Int
-writeChar marr i c
-    | n < 0x10000 = do
-        unsafeWrite marr i (fromIntegral n)
-        return 1
-    | otherwise = do
-        unsafeWrite marr i lo
-        unsafeWrite marr (i+1) hi
-        return 2
-    where n = ord c
-          m = n - 0x10000
-          lo = fromIntegral $ (m `shiftR` 10) + 0xD800
-          hi = fromIntegral $ (m .&. 0x3FF) + 0xDC00
-\end{code}
-
-In typical design-by-contract style, we're putting the burden of proof to
-establish safety on `writeChar`s caller. Now, scroll back up to
-`unstream` and mouse over `j` to see its inferred type.
-\begin{code} You should see something like
-{v:Int | ((ord x >= 65536) => (v == i+1))
-      && ((ord x <  65536) => (v == i))}
-\end{code}
-which, combined with the case-split on `j >= top`, provides the proof that
-writing `x` will be safe!
-
-Stay tuned, next time we'll look at another example of building a `Text` where
-LiquidHaskell fails to infer this crucial refinement...
diff --git a/docs/blog/todo/basic_termination.lhs b/docs/blog/todo/basic_termination.lhs
deleted file mode 100644
--- a/docs/blog/todo/basic_termination.lhs
+++ /dev/null
@@ -1,192 +0,0 @@
----
-layout: post
-title: "Termination Checking"
-date: 2013-11-18 16:12
-comments: true
-external-url:
-categories: termination
-author: Niki Vazou
-published: false 
-demo: TerminationBasic.hs
----
-
-As explained in the [last](LINK) [two](LINK) posts, we need a termination
-checker to ensure that LiquidHaskell is not tricked by divergent, lazy
-computations into telling lies. Well, proving termination is not easy, but
-happily, it turns out that with very little retrofitting, we can use 
-refinements to prove termination.
-
-In this post, lets see how LiquidHaskell proves termination on simple 
-recursive functions, and then later, we'll see how to look at fancier 
-cases.
-
-<!-- more -->
-
-\begin{code}
-module Termination where
-
-import Prelude hiding (sum, (!!))
-import Data.List      (lookup)
-\end{code}
-
-Termination Check with Refinement Types
----------------------------------------
-
-Consider a `Vec`tor that maps `Int`egers to `Val`ues:
-
-\begin{code}
-type Val   = Int
-data Vec   = V [(Int, Val)]
-
-(!!)       :: Vec -> Int -> Val
-(V a) !! i = case i `lookup` a of {Just v -> v; _ -> 0}
-\end{code}
-
-Let `sum a i` add the `i` first elements of the vector `a`:
-
-\begin{code}
-sum     :: Vec -> Int -> Val
-sum a 0 = 0
-sum a i = (a !! (i-1)) + sum a (i-1)
-\end{code}
-
-Does `sum` terminate?
-We observe that if `i` is not `0` then `sum i` will call `sum (i-1)`, otherwise
-it will return.
-This reasoning suffices to convince ourselves that `sum i` terminates for every
-natural number `i`.
-Formally, we shown that `sum` terminates because a *well-founded metric* (i.e., the
-natural number `i`) is decreasing at each iteration.
-Thus, to ensure termination it suffices to restrict `i` on Natural numbers,
-which we can do with a liquid-type signature.
-\begin{code}
-{-@ sum :: Vec -> Nat -> Val @-}
-\end{code}
-
-LiquidHaskell will apply the same reasoning to prove `sum`
-terminates:
-Conventionally, to typecheck `sum` we would check the body assuming an
-environment
-
-`a:Vec`, `i:Nat`, `sum:Vec -> Nat -> Val`
-
-Instead, we *weaken* the environment to 
-
-`a:Vec`, `i:Nat`, `sum:Vec -> {v:Nat| v < i} -> Val`
-
-Now, the type of `sum` stipulates that it *only* be recursively called with
-`Nat` (so well-founded) values that are *strictly less than* the current parameter `i`. 
-Since its body typechecks in this environment, `sum` terminates for
-every `i` on `Nat`s.
-
-Choosing the correct argument
------------------------------
-
-We saw that liquidHaskell can happily check that a Natural number is decreasing
-at each iteration; but it uses a na&#239;ve heuristic to choose which one. 
-For this post we can assume that it always chooses *the first* Integer. 
-
-So, a tail-recursive implementation of `sum`:
-\begin{code}
-{-@ sum' :: Vec -> Val -> Nat -> Val @-}
-sum' :: Vec -> Val -> Int -> Val
-sum' a acc 0 = acc + a!!0 
-sum' a acc i = sum' a (acc + a!!i) (i-1)
-\end{code}
-
-will fail, as liquidHaskell wants to prove that the `acc`umulator is the `Nat`ural
-number that
-decreases at each iteration.
-
-\begin{code}The remedy is simple. We can direct liquidHaskell to the correct argument `i` using a `Decrease` annotation: 
-{-@ Decrease sum' 3 @-}
-\end{code}
-which directs liquidHaskell to check whether the *third*
-argument (i.e., `i`) is decreasing.
-With this hint, liquidHaskell will happily verify that `sum'` is indeed a
-terminating function.
-
-
-Lexicographic Termination
--------------------------
-
-Lets complicate the things a little bit.
-To do so, lets compute the `sum` of a 2D `Vec`tor:
-
-\begin{code}
-data Vec2D    = V2D [((Int, Int), Val)]
-
-(!!!)         :: Vec2D -> (Int,Int) -> Val
-(V2D a) !!! i = case i `lookup` a of {Just v -> v; _ -> 0}
-\end{code}
-
-Now we write a `sum2D a n m` function that computes the sum of the first 
-`(n+1)(m+1)` elements of `a`
-
-\begin{code}
-{-@ sum2D :: Vec2D -> Nat -> Nat -> Val @-}
-sum2D :: Vec2D -> Int -> Int -> Val
-sum2D a n m = go n m
-  where 
-       {-@ Decrease go 1 2 @-}
-        go 0 0             = 0
-        go i j | j == 0    =  a!!!(i, 0) + go (i-1) m
-               | otherwise =  a!!!(i, j) + go i (j-1)
-\end{code}
-
-Here there is no decreasing argument, 
-if `j>0`, `j` decreases (line `139`), otherwise `i` decreases (line `138`).
-Though, liquidHaskell succeed in verifying that `sum2D` terminates and the reason
-is our `Decrease go 1 2` annotation.
-This annotation informs the tool that the decreasing measure is the
-*lexicographically ordered* pair `[i,j]`. 
-LiquidHaskell will verify that this pair is indeed decreasing: at each
-iteration either `i` decreases (line `138`) or `i` remains the same and `j`
-decreases (line `139`).
-
-\begin{code}An alternative annotation to express the above decreasing measure is:
-       {-@ go :: i:Nat -> j:Nat -> Val / [i, j] @-}
-\end{code}
-where after the type signature for `go` we write the list of lexicographic
-decreasing *expressions*.
-This mechanism, as we shall see, allows us to prove termination in functions
-where the decreasing measure in a *function* of the arguments.
-
-Decreasing expressions
-----------------------
-Back to our `1D` Vector, 
-we now define a function `sumFromTo a lo hi` that sums the elements form `a!!lo`
-to `a!!hi`:
-
-\begin{code}
-{-@ sumFromTo :: Vec -> lo:Nat -> hi:{v:Nat|v>=lo} -> Val @-}
-sumFromTo :: Vec -> Int -> Int ->  Val
-sumFromTo a lo hi = go lo hi
-  where 
-       {-@ go :: lo:Nat -> hi:{v:Nat|v>=lo} -> Val / [hi-lo] @-}
-        go lo hi | lo == hi  =  a!!lo
-                 | otherwise =  a!!lo + go (lo+1) hi
-\end{code}
-
-No argument is decreasing in this function, 
-but still it does terminate, as at each iteration `lo` is increased and
-execution will terminate when `lo` reaches `hi`.
-Here the decreasing measure is the expression `hi-lo`.
-LiquidHaskell has no way to generate such a measure, but,
-if the user generates it, i.e., by annotating `go`'s signature,
-liquidHaskell will happily check that `lo-hi` is indeed a well-founded measure (as it is
-a natural number) that decreases at each iteration.
-
-
-Powered with decreasing expressions and the `Decrease` hint,
-we can prove termination on a great number of functions 
-ranging from 
-ones defined on recursive data structures
-to mutual recursive ones. 
-We shall soon see how to prove termination on more complicated functions, why
-is termination analysis required by liquidHaskell and when is it safe to
-deactivate it.
-
-\begin{code}Until then, bear in mind that you can disable termination checking using the `no-termination` flag:
-{-@ LIQUID "--no-termination" @-}
-\end{code}
diff --git a/docs/blog/todo/binary-search-trees.lhs b/docs/blog/todo/binary-search-trees.lhs
deleted file mode 100644
--- a/docs/blog/todo/binary-search-trees.lhs
+++ /dev/null
@@ -1,167 +0,0 @@
----
-layout: post
-title: "Binary Search Trees"
-date: 2013-02-15 16:12
-comments: true
-external-url:
-categories: abstract-refinements
-author: Niki Vazou
-published: false
----
-
-In this example, we show how we can use multi-parameter abstract refinements 
-to encode ordering invarants on tree structures.
-
-\begin{code}
-module Map where
-\end{code}
-
-Take for example the following refined type used to encode functional maps (from Data.Map):
-
-\begin{code}
-{-@ 
-  data Map k a <l :: root:k -> k -> Prop, r :: root:k -> k -> Prop>
-      = Tip 
-      | Bin (sz    :: Size) 
-            (key   :: k) 
-            (value :: a) 
-            (left  :: Map <l, r> (k <l key>) a) 
-            (right :: Map <l, r> (k <r key>) a) 
-  @-}
-
-data Map k a = Tip
-             | Bin Size k a (Map k a) (Map k a)
-
-type Size    = Int
-\end{code}
-
-The abstract refinements `l` and `r` relate each `key` of the tree with `all` the keys in the `left` and `right` subtrees of `key`, as those keys are respectively of type `k <l key>` and `k <r key>`.
-
-Thus, if we instantiate the refinements with the following predicates
-
-\begin{code}
-{-@ type BST k a     = Map <\r -> {v:k | v < r }, \r -> {v:k | v > r }> k a @-}
-{-@ type MinHeap k a = Map <\r -> {v:k | r <= v}, \r -> {v:k | r <= v}> k a @-}
-{-@ type MaxHeap k a = Map <\r -> {v:k | r >= v}, \r -> {v:k | r >= v}> k a @-}
-\end{code}
-
-then `BST k v`, `MinHeap k v` and `MaxHeap k v` denote exactly binary-search-ordered, min-heap-ordered, and max-heap-ordered trees (with keys and values of types `k` and `v`).  
-
-We can use the above types to automatically verify ordering properties of complex libraries.
-
-For example, we cab use `BST` to prove that `Data.Map`'s `insert` and `delete` functions return a binary search tree:
-
-\begin{code}
-{-@ insert :: Ord k => k:k -> a:a -> t:BST k a -> BST k a @-}
-insert :: Ord k => k -> a -> Map k a -> Map k a
-insert kx x t
-  = case t of 
-     Tip -> singleton kx x
-     Bin sz ky y l r
-         -> case compare kx ky of
-              LT -> balance ky y (insert kx x l) r
-              GT -> balance ky y l (insert kx x r)
-              EQ -> Bin sz kx x l r
-
-{-@ delete :: (Ord k) => k:k -> t:BST k a -> BST k a @-}
-delete :: Ord k => k -> Map k a -> Map k a
-delete k t 
-  = case t of 
-      Tip -> Tip
-      Bin _ kx x l r
-          -> case compare k kx of 
-               LT -> balance kx x (delete k l) r
-               GT -> balance kx x l (delete k r)
-               EQ -> glue kx l r
-\end{code}
-
-
-Below are the functions used by `insert` and `delete`:
-
-\begin{code}
-singleton :: k -> a -> Map k a
-singleton k x
-  = Bin 1 k x Tip Tip
-
-
-glue :: k -> Map k a -> Map k a -> Map k a
-glue k Tip r = r
-glue k l Tip = l
-glue k l r
-  | size l > size r = let (km1, vm, lm) = deleteFindMax l in balance km1 vm lm r
-  | otherwise       = let (km2, vm, rm) = deleteFindMin r in balance km2 vm l rm
-
-deleteFindMax t 
-  = case t of
-      Bin _ k x l Tip -> (k, x, l)
-      Bin _ k x l r -> let (km3, vm, rm) = deleteFindMax r in 
-                       (km3, vm, (balance k x l rm))
-      Tip           -> (error ms, error ms, Tip)
-  where ms = "Map.deleteFindMax : can not return the maximal element of an empty Map"   
-
-
-deleteFindMin t 
-  = case t of
-      Bin _ k x Tip r -> (k, x, r)
-      Bin _ k x l r -> let (km4, vm, lm) = deleteFindMin l in 
-                       (km4, vm, (balance k x lm r))
-      Tip             -> (error ms, error ms, Tip)
-  where ms = "Map.deleteFindMin : can not return the maximal element of an empty Map"   
-
-
--------------------------------------------------------------------------------
---------------------------------- BALANCE -------------------------------------
--------------------------------------------------------------------------------
-
-delta, ratio :: Int
-delta = 5
-ratio = 2
-
-balance :: k -> a -> Map k a -> Map k a -> Map k a 
-balance k x l r 
-  | sizeL + sizeR <= 1   = Bin sizeX k x l r
-  | sizeR >= delta*sizeL = rotateL k x l r
-  | sizeL >= delta*sizeR = rotateR k x l r
-  | otherwise            = Bin sizeX k x l r
-  where sizeL = size l
-        sizeR = size r
-        sizeX = sizeL + sizeR + 1
-
--- rotate
-rotateL :: a -> b -> Map a b -> Map a b -> Map a b
-rotateL k x l r@(Bin _ _ _ ly ry) 
-  | size ly < ratio*size ry  = singleL k x l r
-  | otherwise                = doubleL k x l r
-rotateL _ _ _ Tip = error "rotateL Tip"
-
-rotateR :: a -> b -> Map a b -> Map a b -> Map a b
-rotateR k x l@(Bin _ _ _ ly ry) r
-  | size ry < ratio*size ly  = singleR k x l r
-  | otherwise                = doubleR k x l r
-rotateR _ _ _ Tip = error "rotateR Tip"
-
--- basic rotations
-singleL, singleR :: a -> b -> Map a b -> Map a b -> Map a b
-singleL k1 x1 t1 (Bin _ k2 x2 t2 t3) = bin k2 x2 (bin k1 x1 t1 t2) t3
-singleL _  _  _ Tip = error "sinlgeL Tip"
-singleR k1 x1 (Bin _ k2 x2 t1 t2) t3 = Bin 0 k2 x2 t1 (Bin 0 k1 x1 t2 t3)
-singleR _  _  _ Tip = error "sinlgeR Tip"
-
-doubleL, doubleR :: a -> b -> Map a b -> Map a b -> Map a b
-doubleL k1 x1 t1 (Bin _ k2 x2 (Bin _ k3 x3 t2 t3) t4)
- =bin k3 x3 (bin k1 x1 t1 t2) (bin k2 x2 t3 t4)
-doubleL _ _ _ _ = error "doubleL" 
-doubleR k1 x1 (Bin _ k2 x2 t1 (Bin _ k3 x3 t2 t3)) t4 
-  = bin k3 x3 (bin k2 x2 t1 t2) (bin k1 x1 t3 t4)
-doubleR _ _ _ _ = error "doubleR" 
-
-bin :: k -> a -> Map k a -> Map k a -> Map k a
-bin k x l r 
-  = Bin (size l + size r + 1) k x l r
-
-size :: Map k a -> Int
-size t 
-  = case t of 
-      Tip            -> 0
-      Bin sz _ _ _ _ -> sz
-\end{code}
diff --git a/docs/blog/todo/encoding-induction.lhs b/docs/blog/todo/encoding-induction.lhs
deleted file mode 100644
--- a/docs/blog/todo/encoding-induction.lhs
+++ /dev/null
@@ -1,122 +0,0 @@
-
----
-layout: post
-title: "Encoding Induction with Abstract Refinements"
-date: 2013-02-20 16:12
-comments: true
-external-url:
-categories: abstract-refinements 
-author: Niki Vazou
-published: false
----
-
-In this example, we explain how abstract refinements allow us to formalize
-some kinds of structural induction within the type system. 
-
-\begin{code}
-module Inductive where
-\end{code}
-
-Measures
---------
-First, lets define an inductive data type `Vec`
-
-\begin{code}
-data Vec a = Nil | Cons a (Vec a)
-\end{code}
-
-And let us formalize a notion of _length_ for lists within the refinement logic. 
-
-To do so, we define a special `llen` measure by structural induction
-
-\begin{code}
-{-@ measure llen     :: forall a. Vec a -> Int 
-    llen (Nil)       = 0 
-    llen (Cons x xs) = 1 + llen(xs)
-  @-}
-\end{code}
-
-
-Note that the symbol `llen` is encoded as an _uninterpreted_ function in the refinement logic, and is, except for the congruence axiom, opaque to the SMT solver. The measures are guaranteed, by construction, to terminate, and so we can soundly use them as uninterpreted functions in the refinement logic. Notice also, that we can define _multiple_ measures for a type; in this case we simply conjoin the refinements from each measure when refining each data constructor.
-
-As a warmup, lets check that a _real_ length function indeed computes the length of the list:
-
-\begin{code}
-{-@ sizeOf :: xs:Vec a -> {v: Int | v = llen(xs)} @-}
-sizeOf             :: Vec a -> Int
-sizeOf Nil         = 0
-sizeOf (Cons _ xs) = 1 + sizeOf xs
-\end{code}
-
-
-
-With these strengthened constructor types, we can verify, for example, that `myappend` produces a list whose length is the sum of the input lists'
-lengths:
-
-\begin{code}
-{-@ myappend :: l: (Vec a) -> m: (Vec a) -> {v: Vec a | llen(v)=llen(l)+llen(m)} @-}
-myappend Nil         zs = zs
-myappend (Cons y ys) zs = Cons y (myappend ys zs)
-\end{code}
-
-
-\begin{code}However, consider an alternate definition of `myappend` that uses `foldr`
-myappend' ys zs = foldr (:) zs ys 
-\end{code}
-
-where `foldr :: (a -> b -> b) -> b -> [a] -> b`.
-It is unclear how to give `foldr` a (first-order) refinement type that captures the rather complex fact that the fold-function is ''applied'' all over the list argument, or, that it is a catamorphism. Hence, hitherto, it has not been possible to verify the second definition of `append`.
-
-
-Typing Folds
-------------
-
-Abstract refinements allow us to solve this problem with a very expressive type for _foldr_ whilst remaining firmly within the boundaries of SMT-based decidability. We write a slightly modified fold:
-
-\begin{code}
-{-@ efoldr :: forall a b <p :: x0:Vec a -> x1:b -> Prop>. 
-                op:(xs:Vec a -> x:a -> b:b <p xs> -> 
-                  exists [xxs : {v: Vec a | v = (Inductive.Cons x xs)}].
-                     b <p xxs>) 
-              -> vs:(exists [zz: {v: Vec a | v = Inductive.Nil}]. b <p zz>) 
-              -> ys: Vec a
-              -> b <p ys>
-  @-}
-efoldr :: (Vec a -> a -> b -> b) -> b -> Vec a -> b
-efoldr op b Nil         = b
-efoldr op b (Cons x xs) = op xs x (efoldr op b xs) 
-\end{code}
-
-The trick is simply to quantify over the relationship `p` that `efoldr` establishes between the input list `xs` and the output `b` value. This is formalized by the type signature, which encodes an induction principle for lists: 
-the base value `b` must (1) satisfy the relation with the empty list, and the function `op` must take (2) a value that satisfies the relationship with the tail `xs` (we have added the `xs` as an extra "ghost" parameter to `op`), (3) a head value `x`, and return (4) a new folded value that satisfies the relationship with `x:xs`.
-If all the above are met, then the value returned by `efoldr` satisfies the relation with the input list `ys`.
-
-This scheme is not novel in itself --- what is new is the encoding, via uninterpreted predicate symbols, in an SMT-decidable refinement type system.
-
-Using Folds
------------
-
-Finally, we can use the expressive type for the above `foldr` to verify various inductive properties of client functions:
-
-\begin{code}
-{-@ size :: xs:Vec a -> {v: Int | v = llen(xs)} @-}
-size :: Vec a -> Int
-size = efoldr (\_ _ n -> suc n) 0
-
-{-@ suc :: x:Int -> {v: Int | v = x + 1} @-}
-suc :: Int -> Int
-suc x = x + 1 
-
-{-@ 
-   myappend'  :: xs: Vec a -> ys: Vec a -> {v: Vec a | llen(v) = llen(xs) + llen(ys)} 
-  @-} 
-myappend' xs ys = efoldr (\_ z zs -> Cons z zs) ys xs 
-\end{code}
-
-
-\begin{code}The verification proceeds by just (automatically) instantiating the refinement parameter `p` of `efoldr` with the concrete refinements, via Liquid typing:
-
-{\xs v -> v = llen(xs)}                   -- for size
-{\xs v -> llen(v) = llen(xs) + llen(zs)}  -- for myappend'
-\end{code}
-
diff --git a/docs/blog/todo/index-dependent-maps.hs b/docs/blog/todo/index-dependent-maps.hs
deleted file mode 100644
--- a/docs/blog/todo/index-dependent-maps.hs
+++ /dev/null
@@ -1,217 +0,0 @@
--- ---
--- layout: post
--- title: "Index-Dependent Maps"
--- date: 2013-01-20 16:12
--- comments: true
--- external-url:
--- categories: abstract-refinement, basic
--- author: Niki Vazou
--- published: false
--- ---
-
--- In this example, we illustrate how abstract invariants allow us to specify
--- and verify index-dependent invariants of key-value maps.  To this end, we
--- develop a small library of _extensible vectors_ encoded, for purposes of
--- illustration, as functions from `Int` to some generic range `a`.
-
-
-module LiquidArray where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume)
-
-
--- \begin{code}We specify vectors as
--- type Vec a <dom :: Int -> Prop, rng :: Int -> a -> Prop>
---   = (i:Int <dom> -> a<rng i>)
--- \end{code}
-
-
-type Vec a = Int -> a
-
-
--- Here, we are parametrizing the definition of the type `Vec` with _two_ abstract refinements, `dom` and `rng`, which respectively describe the _domain_ and _range_ of the vector.
--- That is, `dom` describes the set of _valid_ indices, and `rng` specifies an invariant relating each `Int` index with the value stored at that index.
-
--- Creating Vectors
--- ----------------
-
--- We can use the following basic functions to create vectors:
-
-
-{- empty :: forall <rng :: Int -> a -> Prop>.
-              i:{v: Int | 0 = 1} ->  a<rng> -}
-
-{-@ empty :: i: {v: Int | 0 = 1} -> a @-}
-empty :: Vec a
-empty = \_ -> (error "Empty Vec")
-
-{-@ create :: x:a -> (i:Int -> {v:a | v = x}) @-}
-create :: a -> Vec a
-create x = (\_ -> x)
-
-
--- The signature for `empty` states that its domain is empty (ie is the set of indices satisfying the predicate `False`), and that the range satisfies _any_ invariant. The signature for `create`, instead, defines a _constant_ vector that maps every index to the constant `x`.
-
--- Accessing Vectors
--- -----------------
-
--- We can write the following `get` function for reading the contents of a vector at a given index:
-
-
-{-@ get :: forall a <d :: x0:Int -> Prop, r :: x0: Int -> x1:a -> Prop>.
-             i: Int<d> ->
-             a: (j: Int<d> -> a<r j>) ->
-             a<r i>
-  @-}
-get :: Int -> Vec a -> a
-get i a = a i
-
-
--- The signature states that for any domain `d` and range `r`, if the index `i` is a valid index, ie is of type, `Int<d>` then the returned value is an `a` that additionally satisfies the range refinement at the index `i`.
-
--- The type for `set`, which _updates_ the vector at a given index, is even more interesting, as it allows us to _extend_ the domain of the vector:
-
-
-{-@ set :: forall a <r :: x0: Int -> x1: a -> Prop, d :: x0: Int -> Prop>.
-      i: Int<d> ->
-      x: a<r i> ->
-      a: (j: {v: Int<d> | v != i} -> a<r j>) ->
-      (k : Int<d> -> a<r k>)
-  @-}
-set :: Int -> a -> Vec a -> Vec a
-set i x a = \k -> if k == i then x else a k
-
-
--- The signature for `set` requires that (a) the input vector is defined everywhere at `d` _except_ the index `i`, and (b) the value supplied must be of type `a<r i>`, ie satisfy the range relation at the index `i` at which the vector is being updated.
--- The signature ensures that the output vector is defined at `d` and each value satisfies the index-dependent range refinement `r`.
-
--- Note that it is legal to call `get` with a vector that is _also_ defined at the index `i` since, by contravariance, such a vector is a subtype of that required by (a).
-
-
--- Initializing Vectors
--- --------------------
-
--- Next, we can write the following function, `init`, that ''loops'' over a vector, to `set` each index to a value given by some function.
-
-
-{-@ initialize :: forall a <r :: x0: Int -> x1: a -> Prop>.
-      f: (z: Int -> a<r z>) ->
-      i: {v: Int | v >= 0} ->
-      n: Int ->
-      a: (j: {v: Int | (0 <= v && v < i)} -> a<r j>) ->
-      (k: {v: Int | (0 <= v && v < n)} -> a<r k>) @-}
-initialize :: (Int -> a) -> Int -> Int -> Vec a -> Vec a
-initialize f i n a
-  | i >= n    = a
-  | otherwise = initialize f (i + 1) n (set i (f i) a)
-
-
--- The signature requires that (a) the higher-order function `f` produces values that satisfy the range refinement `r`, and (b) the vector is initialized from `0` to `i`.
--- The function ensures that the output vector is initialized from `0`
--- through `n`.
-
--- We can thus verify that
-
-
-{-@ idVec :: n:Int -> (k: {v: Int | (0 <= v && v < n)} -> {v: Int | v = k}) @-}
-idVec :: Int -> (Vec Int)
-idVec n = initialize (\i -> i) 0 n empty
-
-
--- ie `idVec` returns an vector of size `n` where each key is mapped to itself. Thus, abstract refinement types allow us to verify low-level idioms such as the incremental initialization of vectors, which have previously required special analyses.
-
--- Null-Terminated Strings
--- -----------------------
-
--- We can also use abstract refinements to verify code which manipulates C-style null-terminated strings, where each character is represented as an `Int` and the termination character `\0`, and only that, is represented as `0`.
-
--- \begin{code}Formally, a null-terminated string, represented by `Int`s, of size `n` has the type
--- type NullTerm n
---      = Vec <{\v -> 0<=v<n}, {\i v -> i=n-1 => v=0}> Int
--- \end{code}
-
--- The above type describes a length-`n` vector of characters whose last element must be a null character, signalling the end of the string.
-
--- We can use this type in the specification of a function, `upperCase`, which iterates through the characters of a string, uppercasing each one until it encounters the null terminator:
-
-
-ucs :: Int -> Int -> Vec Int -> Vec Int
-ucs n i s =
-  case get i s of
-  0 -> s
-  c -> ucs n (i + 1) (set i (c + 32) s)
-
-{-@ upperCaseString ::
-      n: {v: Int | v > 0} ->
-      s: (j: {v : Int | (0 <= v && v < n)} ->
-          {v: Int | (j = n - 1 => v = 0)}) ->
-      (j: {v : Int | (0 <= v && v < n)} ->
-       {v: Int | (j = n - 1 => v = 0)})
-@-}
-upperCaseString :: Int -> Vec Int -> Vec Int
-upperCaseString n s = ucs n 0 s
-
-
-
--- Note that the length parameter `n` is provided solely as a ''witness'' for the length of the string `s`, which allows us to use the length of `s` in the type of `upperCaseString`; `n` is not used in the computation.
-
--- In order to establish that each call to `get` accesses string `s` within its bounds, our type system must establish that, at each call to the inner function `ucs`, `i` satisfies the type `{v: Int | 0 <= v && v < n}`.
-
--- This invariant is established as follows:
-
--- First, the invariant trivially holds on the first call to `ucs`, as
--- `n` is positive and `i` is `0`.
--- Second, we assume that `i` satisfies the type `{v: Int | 0 <= v && v < n}`, and, further, we know from the types of `s` and `get` that `c` has the type `{v: Int | i = n - 1 => c = 0}`.
--- Thus, if `c` is non-null, then `i` cannot be equal to `n - 1`.
--- This allows us to strengthen our type for `i` in the else branch to `{v: Int | 0 <= v && v < n - 1}` and thus to conclude that the value `i + 1` recursively passed as the `i` parameter to `ucs` satisfies the type `{v: Int | 0 <= v && v < n}`, establishing the inductive invariant and thus the safety of the `upperCaseString` function.
-
-
-
--- Memoization
--- -----------
-
--- Next, let us illustrate how the same expressive signatures allow us to verify memoizing functions. We can specify to the SMT solver the definition of the Fibonacci function via an uninterpreted function `fib` and an axiom:
-
-
-{-@ measure fib :: Int -> Int @-}
-
-{-@ axiom_fib :: i:Int -> {v: Bool | (Prop(v) <=>
-                            (fib(i) = ((i <= 1) ? 1 : ((fib(i-1)) + (fib(i-2))))))}
-  @-}
-axiom_fib :: Int -> Bool
-axiom_fib i = undefined
-
-
--- Next, we define a type alias `FibV` for the vector whose values are either `0` (ie undefined), or equal to the Fibonacci number of the corresponding index.
-
-
-{-@ type FibV = j:Int -> {v:Int| ((v != 0) => (v = fib(j)))} @-}
-
-
--- Finally, we can use the above alias to verify `fastFib`, an implementation of the Fibonacci function, which uses an vector memoize intermediate results
-
-
-{-@ fastFib :: x:Int -> {v:Int | v = fib(x)} @-}
-fastFib     :: Int -> Int
-fastFib n   = snd $ fibMemo (\_ -> 0) n
-
-{-@ fibMemo :: FibV -> i:Int -> (FibV, {v: Int | v = fib(i)}) @-}
-fibMemo t i
-  | i <= 1
-  = (t, liquidAssume (axiom_fib i) (1 :: Int))
-
-  | otherwise
-  = case get i t of
-      0 -> let (t1, n1) = fibMemo t  (i-1)
-               (t2, n2) = fibMemo t1 (i-2)
-               n        = liquidAssume (axiom_fib i) (n1 + n2)
-           in  (set i n t2,  n)
-      n -> (t, n)
-
-
--- Thus, abstract refinements allow us to define key-value maps with index-dependent refinements for the domain and range.
--- Quantification over the domain and range refinements allows us to define generic access operations (eg. `get`, `set`, `create`, `empty`) whose types enable us establish a variety of precise invariants.
-
-
-
-
diff --git a/docs/blog/todo/index-dependent-maps.lhs b/docs/blog/todo/index-dependent-maps.lhs
deleted file mode 100644
--- a/docs/blog/todo/index-dependent-maps.lhs
+++ /dev/null
@@ -1,217 +0,0 @@
----
-layout: post
-title: "Index-Dependent Maps"
-date: 2013-01-20 16:12
-comments: true
-external-url:
-categories: abstract-refinement, basic
-author: Niki Vazou
-published: false
----
-
-In this example, we illustrate how abstract invariants allow us to specify
-and verify index-dependent invariants of key-value maps.  To this end, we
-develop a small library of _extensible vectors_ encoded, for purposes of
-illustration, as functions from `Int` to some generic range `a`. 
-
-\begin{code}
-module LiquidArray where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume)
-\end{code}
-
-\begin{code}We specify vectors as 
-type Vec a <dom :: Int -> Prop, rng :: Int -> a -> Prop>
-  = (i:Int <dom> -> a<rng i>)
-\end{code}
-
-\begin{code}
-type Vec a = Int -> a
-\end{code}
-
-Here, we are parametrizing the definition of the type `Vec` with _two_ abstract refinements, `dom` and `rng`, which respectively describe the _domain_ and _range_ of the vector.
-That is, `dom` describes the set of _valid_ indices, and `rng` specifies an invariant relating each `Int` index with the value stored at that index.
-
-Creating Vectors
-----------------
-
-We can use the following basic functions to create vectors:
-
-\begin{code}
-{- empty :: forall <rng :: Int -> a -> Prop>. 
-              i:{v: Int | 0 = 1} ->  a<rng> -}
-
-{-@ empty :: i: {v: Int | 0 = 1} -> a @-}
-empty :: Vec a
-empty = \_ -> (error "Empty Vec")
-
-{-@ create :: x:a -> (i:Int -> {v:a | v = x}) @-}
-create :: a -> Vec a
-create x = (\_ -> x)
-\end{code}
-
-The signature for `empty` states that its domain is empty (ie is the set of indices satisfying the predicate `False`), and that the range satisfies _any_ invariant. The signature for `create`, instead, defines a _constant_ vector that maps every index to the constant `x`.
-
-Accessing Vectors
------------------
-
-We can write the following `get` function for reading the contents of a vector at a given index:
-
-\begin{code}
-{-@ get :: forall a <d :: x0:Int -> Prop, r :: x0: Int -> x1:a -> Prop>.
-             i: Int<d> ->
-             a: (j: Int<d> -> a<r j>) ->
-             a<r i> 
-  @-}
-get :: Int -> Vec a -> a
-get i a = a i
-\end{code}
-
-The signature states that for any domain `d` and range `r`, if the index `i` is a valid index, ie is of type, `Int<d>` then the returned value is an `a` that additionally satisfies the range refinement at the index `i`.
-
-The type for `set`, which _updates_ the vector at a given index, is even more interesting, as it allows us to _extend_ the domain of the vector:
-
-\begin{code}
-{-@ set :: forall a <r :: x0: Int -> x1: a -> Prop, d :: x0: Int -> Prop>.
-      i: Int<d> ->
-      x: a<r i> ->
-      a: (j: {v: Int<d> | v != i} -> a<r j>) ->
-      (k : Int<d> -> a<r k>)
-  @-}
-set :: Int -> a -> Vec a -> Vec a
-set i x a = \k -> if k == i then x else a k
-\end{code}
-
-The signature for `set` requires that (a) the input vector is defined everywhere at `d` _except_ the index `i`, and (b) the value supplied must be of type `a<r i>`, ie satisfy the range relation at the index `i` at which the vector is being updated.
-The signature ensures that the output vector is defined at `d` and each value satisfies the index-dependent range refinement `r`.
-
-Note that it is legal to call `get` with a vector that is _also_ defined at the index `i` since, by contravariance, such a vector is a subtype of that required by (a).
-
-
-Initializing Vectors
---------------------
-
-Next, we can write the following function, `init`, that ''loops'' over a vector, to `set` each index to a value given by some function.
-
-\begin{code}
-{-@ initialize :: forall a <r :: x0: Int -> x1: a -> Prop>.
-      f: (z: Int -> a<r z>) ->
-      i: {v: Int | v >= 0} ->
-      n: Int ->
-      a: (j: {v: Int | (0 <= v && v < i)} -> a<r j>) ->
-      (k: {v: Int | (0 <= v && v < n)} -> a<r k>) @-}
-initialize :: (Int -> a) -> Int -> Int -> Vec a -> Vec a
-initialize f i n a 
-  | i >= n    = a
-  | otherwise = initialize f (i + 1) n (set i (f i) a)
-\end{code}
-
-The signature requires that (a) the higher-order function `f` produces values that satisfy the range refinement `r`, and (b) the vector is initialized from `0` to `i`.
-The function ensures that the output vector is initialized from `0`
-through `n`.
-
-We can thus verify that
-
-\begin{code}
-{-@ idVec :: n:Int -> (k: {v: Int | (0 <= v && v < n)} -> {v: Int | v = k}) @-}
-idVec :: Int -> (Vec Int)
-idVec n = initialize (\i -> i) 0 n empty
-\end{code}
-
-ie `idVec` returns an vector of size `n` where each key is mapped to itself. Thus, abstract refinement types allow us to verify low-level idioms such as the incremental initialization of vectors, which have previously required special analyses.
-
-Null-Terminated Strings
------------------------
-
-We can also use abstract refinements to verify code which manipulates C-style null-terminated strings, where each character is represented as an `Int` and the termination character `\0`, and only that, is represented as `0`.
-
-\begin{code}Formally, a null-terminated string, represented by `Int`s, of size `n` has the type
-type NullTerm n 
-     = Vec <{\v -> 0<=v<n}, {\i v -> i=n-1 => v=0}> Int
-\end{code}
-
-The above type describes a length-`n` vector of characters whose last element must be a null character, signalling the end of the string.
-
-We can use this type in the specification of a function, `upperCase`, which iterates through the characters of a string, uppercasing each one until it encounters the null terminator:
-
-\begin{code}
-ucs :: Int -> Int -> Vec Int -> Vec Int
-ucs n i s =
-  case get i s of
-  0 -> s
-  c -> ucs n (i + 1) (set i (c + 32) s)
-
-{-@ upperCaseString ::
-      n: {v: Int | v > 0} ->
-      s: (j: {v : Int | (0 <= v && v < n)} ->
-          {v: Int | (j = n - 1 => v = 0)}) ->
-      (j: {v : Int | (0 <= v && v < n)} ->
-       {v: Int | (j = n - 1 => v = 0)})
-@-}
-upperCaseString :: Int -> Vec Int -> Vec Int
-upperCaseString n s = ucs n 0 s
-\end{code}
-
-
-Note that the length parameter `n` is provided solely as a ''witness'' for the length of the string `s`, which allows us to use the length of `s` in the type of `upperCaseString`; `n` is not used in the computation.
-
-In order to establish that each call to `get` accesses string `s` within its bounds, our type system must establish that, at each call to the inner function `ucs`, `i` satisfies the type `{v: Int | 0 <= v && v < n}`.
-
-This invariant is established as follows:
-
-First, the invariant trivially holds on the first call to `ucs`, as
-`n` is positive and `i` is `0`.
-Second, we assume that `i` satisfies the type `{v: Int | 0 <= v && v < n}`, and, further, we know from the types of `s` and `get` that `c` has the type `{v: Int | i = n - 1 => c = 0}`.
-Thus, if `c` is non-null, then `i` cannot be equal to `n - 1`.
-This allows us to strengthen our type for `i` in the else branch to `{v: Int | 0 <= v && v < n - 1}` and thus to conclude that the value `i + 1` recursively passed as the `i` parameter to `ucs` satisfies the type `{v: Int | 0 <= v && v < n}`, establishing the inductive invariant and thus the safety of the `upperCaseString` function.
-
-
-
-Memoization 
------------
-
-Next, let us illustrate how the same expressive signatures allow us to verify memoizing functions. We can specify to the SMT solver the definition of the Fibonacci function via an uninterpreted function `fib` and an axiom:
-
-\begin{code}
-{-@ measure fib :: Int -> Int @-}
-
-{-@ axiom_fib :: i:Int -> {v: Bool | (Prop(v) <=> 
-                            (fib(i) = ((i <= 1) ? 1 : ((fib(i-1)) + (fib(i-2))))))} 
-  @-}
-axiom_fib :: Int -> Bool
-axiom_fib i = undefined
-\end{code}
-
-Next, we define a type alias `FibV` for the vector whose values are either `0` (ie undefined), or equal to the Fibonacci number of the corresponding index. 
-
-\begin{code}
-{-@ type FibV = j:Int -> {v:Int| ((v != 0) => (v = fib(j)))} @-}
-\end{code}
-
-Finally, we can use the above alias to verify `fastFib`, an implementation of the Fibonacci function, which uses an vector memoize intermediate results 
-
-\begin{code}
-{-@ fastFib :: x:Int -> {v:Int | v = fib(x)} @-}
-fastFib     :: Int -> Int
-fastFib n   = snd $ fibMemo (\_ -> 0) n
-
-{-@ fibMemo :: FibV -> i:Int -> (FibV, {v: Int | v = fib(i)}) @-}
-fibMemo t i 
-  | i <= 1    
-  = (t, liquidAssume (axiom_fib i) (1 :: Int))
-  
-  | otherwise 
-  = case get i t of   
-      0 -> let (t1, n1) = fibMemo t  (i-1)
-               (t2, n2) = fibMemo t1 (i-2)
-               n        = liquidAssume (axiom_fib i) (n1 + n2)
-           in  (set i n t2,  n)
-      n -> (t, n)
-\end{code}
-
-Thus, abstract refinements allow us to define key-value maps with index-dependent refinements for the domain and range. 
-Quantification over the domain and range refinements allows us to define generic access operations (eg. `get`, `set`, `create`, `empty`) whose types enable us establish a variety of precise invariants.
-
-
-
-
diff --git a/docs/blog/todo/kmeans-full.lhs b/docs/blog/todo/kmeans-full.lhs
deleted file mode 100644
--- a/docs/blog/todo/kmeans-full.lhs
+++ /dev/null
@@ -1,270 +0,0 @@
----
-layout: post
-title: "KMeans Clustering N-Dimensional Points"
-date: 2013-02-14 16:12
-author: Ranjit Jhala
-published: false 
-comments: true
-external-url:
-categories: basic measures 
-demo: kmeans.hs
----
-
-[Last time][safeList] we introduced a new specification called a *measure*
-and demonstrated how to use it to encode the *length* of a list, and
-thereby verify that functions like `head` and `tail` were only called with
-non-empty lists (whose length was *strictly* greater than `0`.) As several
-folks pointed out, once LiquidHaskell can reason about lengths, it can do a
-lot more than just analyze non-emptiness. 
-
-Indeed! 
-
-So today, let me show you how one might implement a k-means algorithm that
-clusters `n`-dimensional points into at most k groups, and how
-LiquidHaskell can help us write and enforce these size requirements. 
-
-<!-- For example, XXX pointed out that we can use the type
-system to give an *upper* bound on the size of a list, e.g. 
-using lists upper bounded by a gigantic `MAX_INT` value as
-a proxy for finite lists.
--->
-
-<!-- more -->
-
-Rather than reinvent the wheel, lets start with an existing implementation
-of K-Means, available [on hackage](hackage-kmeans). This may not be the most 
-efficient implementation, but its a nice introduction to the algorithm, and we 
-speculate that the general invariants will hold for more sophisticated
-implementations.
-
-
-\begin{code}
-
-nearest centers x   = minimumKey distances
-  where distances   = M.map (distance x) centers
-
-minimumKey   :: (Ord v) => M.Map k v -> k
-minimumKey   = fst . minimumBy (\x y -> compare (snd x) (snd y)) . M.toList 
-
-distance     :: [Double] -> [Double] -> [Double]
-distance a b = sqrt . sum $ zipWith (\x y -> (x - y) ^ 2) a b
-
-normalize (n :: Int) = M.map (\(c, s) -> map (`safeDiv` s) c) 
-
-initialCenters :: [a] -> M.HashMap Int [a] -> 
-
-{-@ NNList a      = {v: [a] | ((len v) > 0) }           @-}
-{-@ BoundInt  K   = {v: Int | (0 <= v) && (v < K) }     @-}
-{-@ Point a   N   = {v: [a] | (len v) = N }             @-}
-{-@ Points a  N   = NNList (Point a n)                  @-}
-{-@ Cluster a K N = M.HashMap (BoundInt K) (Point a N)  @-}
-
-{-@ initialCenters  :: k:{k:Int | k > 0} -> [a] -> M.HashMap (BoundInt k) (NNList a) @-}
-initialCenters      :: Int -> [a] -> M.HashMap Int [a]  
-initialCenters k xs = M.fromList $ zip indices partitions 
-  where 
-    clusterSize     = max 1 ((length points + k - 1) `div` k)
-    parts           = partition clusterSize points
-    nParts          = length parts
-    indices         = liquidAssume (nParts <= k) [1..nParts]
-
-{-@ partition        :: {v:Int | v > 0} -> [a] -> [(NNList a)] @-}
-partition n []       = []
-partition n ys@(_:_) = zs : part n zs' 
-  where 
-    zs               = take n ys
-    zs'              = drop n ys
-
-kmeansStep :: n:Int -> [Point Double n] -> M.Map k (Point Double n) -> M.Map k (Point Double n) 
-kmeansStep (n :: Int) centers = M.fromList . mapReduce newCenter mergeCluster
-  where
-    recenter x              = [(nearest centers x, (x, 1))]
-    merge (c1, s1) (c2, s2) = (zipWith (+) c1 c2, s1 + s2)
-
-           
-kmeans n k xs  = initialCenters k xs
-
--- kgroupBy :: k:Int -> (a -> BoundInt k) -> [a] -> {v: [(NNList a)] | (len v) <= k }
-\end{code}
-
-
-
--- let rec ffor i j f = 
---   if i < j then (
---     f i; 
---     ffor (i+1) j f
---   )
--- 
--- let min_index a =
---   let min = ref 0 in
---   ffor 0 (Array.length a) (fun i ->
---     if a.(i) < a.(!min) then            (* ARRAY BOUNDS *)
---       min := i
---   );
---   !min
--- 
--- let nearest dist ctra x  =
---   let da = Array.map (dist x) ctra in
---   (min_index da, (x, 1))
--- 
--- let centroid plus p1 p2 = 
---   let (x1, size1) = p1 in
---   let (x2, size2) = p2 in 
---   (plus x1 x2, size1 + size2)
--- 
--- let update_centers div a ixs =
---   List.iter (fun (i, (x, size)) -> a.(i) <- div x size) ixs
---             (* ARRAY BOUNDS, DIV BY ZERO *)
--- 
--- let kmeans n dist plus div (points : 'a list) (centera : 'a array) =
---   assert (Array.length centera > 0); 
---   ffor 0 n begin fun _ ->
---     let point_centers   = map      (nearest dist centera) points      in
---     let center_clusters = group    point_centers                      in 
---     let new_centers     = reduce   (centroid plus) center_clusters    in
---     update_centers div centera new_centers
---   end  
-
-
-\begin{code}
-
-{-# LANGUAGE ScopedTypeVariables, TypeSynonymInstances, FlexibleInstances #-}
-
-module Data.KMeans (kmeans, kmeansGen) where
-
-import Data.List (sort, span, minimumBy)
-import Data.Function (on)
-import Data.Ord (comparing)
-import Language.Haskell.Liquid.Prelude (liquidAssert, liquidError)
-
-{-@ groupBy :: (a -> a -> Bool) 
-            -> [a] 
-            -> [{v:[a] | len(v) > 0}] 
-  @-}
-
-groupBy           :: (a -> a -> Bool) -> [a] -> [[a]]
-groupBy _  []     =  []
-groupBy eq (x:xs) =  (x:ys) : groupBy eq zs
-                     where (ys,zs) = span (eq x) xs
-
-{-@ type Vec a N      = { v : [a] | (len v) = N } @-}
-
-{-@ type Matrix a N M = Vec (Vec a N) M           @-}
-
-{-@ type PosInt       = {v:Int | v > 0}           @-}
-
-
-{-@ transpose :: n:Int -> m:PosInt -> Matrix a n m -> Matrix a m n @-}
-transpose     :: Int -> Int -> [[a]] -> [[a]]
-
-transpose 0 _ _              = []
-transpose n m ((x:xs) : xss) = (x : map head xss) : transpose (n - 1) m (xs : map tail xss)
--- transpose n m ((x:xs) : xss) = (x : [h | (h:_) <- xss]) : transpose (xs : [ t | (_:t) <- xss])
-transpose n m ([] : _)       = liquidError "transpose1" 
-transpose n m []             = liquidError "transpose2"
-
-
-data WrapType b a = WrapType {getVect :: b, getVal :: a}
-
-instance Eq (WrapType [Double] a) where
-   (==) = (==) `on` getVect
-
-instance Ord (WrapType [Double] a) where
-    compare = comparing getVect
-
--- dist ::  [Double] -> [Double] -> Double 
-dist a b = sqrt . sum $ zipWith (\x y -> (x - y) ^ 2) a b      -- zipWith dimensions
-
-safeDiv     :: (Fractional a) => a -> Int -> a
-safeDiv n 0 = liquidError "divide by zero"
-safeDiv n d = n / (fromIntegral d)
-
-
-centroid n points = map ((`safeDiv` m) . sum) points'              -- divide By Zero
-  where 
-    m             = length points 
-    points'       = transpose n m (map getVect points)
-
-
-recluster n clusters = recluster' n centroids points 
-  where 
-    points         = concat clusters 
-    centroids      = indexList $ map (centroid n) clusters
-    centeredPoints = [(closest n centroids (getVect p), p) | p <- points]
-    clusters'      = map (map snd)
-
-
-recluster' n centroids points = map (map snd) $ groupBy ((==) `on` fst) reclustered
-    where reclustered = sort [(closest n centroids (getVect p), p) | p <- points]
-
-
-closest :: Int -> [(Int, [Double])] -> [Double] -> Int
-closest (n :: Int) centroids point = minimumKey distances 
-  where 
-    distances = [(i, dist point ci) | (i, ci) <- icentroids ]
-
-minimumKey :: (Ord v) => [(k, v)] -> k
-minimumKey kvs = minimumBy (\x y -> compare (snd x) (snd y)) kvs
-
-indexList :: [a] -> [(Int, a)]
-indexList xs         = zip [1..(length xs)] xs
-
-
-
-
-
-{-@ part        :: n:{v:Int | v > 0} -> [a] -> [{v:[a] | len(v) > 0}] @-}
-part n []       = []
-part n ys@(_:_) = zs : part n zs' 
-                  where zs  = take n ys
-                        zs' = drop n ys
-
--- | Recluster points
-kmeans'' n clusters
-  | clusters == clusters' = clusters
-  | otherwise             = kmeans'' n clusters'
-  where clusters'         = recluster n clusters
-
-kmeans' n k points = kmeans'' n $ part l points
-    where l = max 1 ((length points + k - 1) `div` k)
-
--- | Cluster points in a Euclidian space, represented as lists of Doubles, into at most k clusters.
--- The initial clusters are chosen arbitrarily.
-{-@ kmeans :: n:Int 
-           -> k:Int 
-           -> points:[(Vec Double n)] 
-           -> [[(Vec Double n)]] 
-  @-}
-kmeans :: Int -> Int -> [[Double]] -> [[[Double]]]
-kmeans n = kmeansGen n id
-
--- | A generalized kmeans function. This function operates not on points, but an arbitrary type 
---   which may be projected into a Euclidian space. Since the projection may be chosen freely, 
--- this allows for weighting dimensions to different degrees, etc.
-
-{-@ kmeansGen :: n: Int -> f:(a -> (Vec Double n)) -> k:Int -> points:[a] -> [[a]] @-}
-kmeansGen :: Int -> (a -> [Double]) -> Int -> [a] -> [[a]]
-kmeansGen n f k points = map (map getVal) . kmeans' n k . map (\x -> WrapType (f x) x) $ points
-
-
-\end{code}
-
-
-
-Conclusions
------------
-
-1. How to do *K-Means Clustering* !
-
-2. Track precise length properties with **measures**
-
-3. Circumvent limitations of SMT with a touch of **dynamic** checking using **assumes**
-
-
-[vecbounds]:  /blog/2013/01/05/bounding-vectors.lhs/ 
-[ghclist]:    https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/GHC/List.lhs#L125
-[foldl1]:     http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Data-List.html#foldl1
-[safeList]:   /blog/2013/01/31/safely-catching-a-list-by-its-tail.lhs/ 
-
-
-
diff --git a/docs/blog/todo/lets-talk-about-sets.lhs.markdown b/docs/blog/todo/lets-talk-about-sets.lhs.markdown
deleted file mode 100644
--- a/docs/blog/todo/lets-talk-about-sets.lhs.markdown
+++ /dev/null
@@ -1,671 +0,0 @@
----
-layout: post
-title: "Lets Talk About Sets"
-date: 2013-01-05 16:12
-comments: true
-external-url:
-categories: basic, measures, sets
-author: Ranjit Jhala
-published: false 
----
-
-In the posts so far, we've seen how LiquidHaskell allows you to use SMT 
-solvers to specify and verify *numeric* invariants -- denominators 
-that are non-zero, integer indices that are within the range of an 
-array, vectors that have the right number of dimensions and so on.
-
-However, SMT solvers are not limited to numbers, and in fact, support
-rather expressive logics. In the next couple of posts, lets see how 
-LiquidHaskell uses SMT to talk about **sets of values**, for example, 
-the contents of a list, and to specify and verify properties about 
-those sets.
-
-
-<pre><span class=hs-linenum>24: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>ListSets</span> <span class='hs-keyword'>where</span>
-</pre>
-
-Talking about Sets (In Logic)
-=============================
-
-First, we need a way to talk about sets in the refinement logic. We could
-roll our own special Haskell type, but why not just use the `Set a` type
-from `Data.Set`.
-
-
-<pre><span class=hs-linenum>35: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Set</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>filter</span><span class='hs-layout'>,</span> <span class='hs-varid'>split</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>36: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span>  <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span><span class='hs-layout'>,</span> <span class='hs-varid'>filter</span><span class='hs-layout'>)</span>
-</pre>
-
-The above, also instructs LiquidHaskell to import in the various 
-specifications defined for the `Data.Set` module that we have *predefined* 
-in [Data/Set.spec][setspec] 
-
-Lets look at the specifications.
-
- The `embed` directive tells LiquidHaskell to model the **Haskell** 
-<pre><span class=hs-linenum>46: </span><span class='hs-keyword'>type</span> <span class='hs-varid'>constructor</span> <span class='hs-varop'>`Set`</span> <span class='hs-varid'>with</span> <span class='hs-varid'>the</span> <span class='hs-varop'>**</span><span class='hs-conid'>SMT</span><span class='hs-varop'>**</span> <span class='hs-keyword'>type</span> <span class='hs-varid'>constructor</span> <span class='hs-varop'>`Set_Set`</span><span class='hs-varop'>.</span>
-<span class=hs-linenum>47: </span>
-<span class=hs-linenum>48: </span><span class='hs-keyword'>module</span> <span class='hs-varid'>spec</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Set</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>49: </span>
-<span class=hs-linenum>50: </span><span class='hs-definition'>embed</span> <span class='hs-conid'>Set</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Set_Set</span>
-</pre>
-
- First, we define the logical operators (i.e. `measure`s) 
-<pre><span class=hs-linenum>54: </span><span class='hs-definition'>measure</span> <span class='hs-conid'>Set_sng</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>                    <span class='hs-comment'>-- ^ singleton</span>
-<span class=hs-linenum>55: </span><span class='hs-definition'>measure</span> <span class='hs-conid'>Set_cup</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-comment'>-- ^ union</span>
-<span class=hs-linenum>56: </span><span class='hs-definition'>measure</span> <span class='hs-conid'>Set_cap</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-comment'>-- ^ intersection</span>
-<span class=hs-linenum>57: </span><span class='hs-definition'>measure</span> <span class='hs-conid'>Set_dif</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>   <span class='hs-comment'>-- ^ difference </span>
-</pre>
-
- Next, we define predicates on `Set`s 
-<pre><span class=hs-linenum>61: </span><span class='hs-definition'>measure</span> <span class='hs-conid'>Set_emp</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>                 <span class='hs-comment'>-- ^ emptiness</span>
-<span class=hs-linenum>62: </span><span class='hs-definition'>measure</span> <span class='hs-conid'>Set_mem</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>            <span class='hs-comment'>-- ^ membership</span>
-<span class=hs-linenum>63: </span><span class='hs-definition'>measure</span> <span class='hs-conid'>Set_sub</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>      <span class='hs-comment'>-- ^ inclusion </span>
-</pre>
-
-
-Interpreted Operations
-----------------------
-
-The above operators are *interpreted* by the SMT solver. That is, just 
-like the SMT solver *"knows that"* 
-
-    2 + 2 == 4
-
-the SMT solver *"knows that"* 
-
-    (Set_sng 1) == (Set_cap (Set_sng 1) (Set_cup (Set_sng 2) (Set_sng 1)))
-
-This is because, the above formulas belong to a decidable Theory of Sets
-which can be reduced to McCarthy's more general [Theory of Arrays][mccarthy]. 
-See [this recent paper][z3cal] if you want to learn more about how modern SMT 
-solvers *"know"* the above equality holds...
-
-Talking about Sets (In Code)
-============================
-
-Of course, the above operators exist purely in the realm of the 
-refinement logic, beyond the grasp of the programmer.
-
-To bring them down (or up, or left or right) within reach of Haskell code, 
-we can simply *assume* that the various public functions in `Data.Set` do 
-the *Right Thing* i.e. produce values that reflect the logical set operations:
-
- First, the functions that create `Set` values
-<pre><span class=hs-linenum>95: </span><span class='hs-definition'>empty</span>     <span class='hs-keyglyph'>::</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_emp</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>96: </span><span class='hs-definition'>singleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_sng</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-</pre>
-
- Next, the functions that operate on elements and `Set` values
-<pre><span class=hs-linenum>100: </span><span class='hs-definition'>insert</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_cup</span> <span class='hs-varid'>xs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_sng</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>101: </span><span class='hs-definition'>delete</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_dif</span> <span class='hs-varid'>xs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_sng</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-</pre>
-
- Then, the binary `Set` operators
-<pre><span class=hs-linenum>105: </span><span class='hs-definition'>union</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_cup</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>106: </span><span class='hs-definition'>intersection</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_cap</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>107: </span><span class='hs-definition'>difference</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_dif</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-</pre>
-
- And finally, the predicates on `Set` values:
-<pre><span class=hs-linenum>111: </span><span class='hs-definition'>isSubsetOf</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-conid'>Prop</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_sub</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>112: </span><span class='hs-definition'>member</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-conid'>Prop</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_mem</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-</pre>
-
-**Note:** Oh quite. We shouldn't and needn't really *assume*, but should and
-will *guarantee* that the functions from `Data.Set` implement the above types. 
-But thats a story for another day...
-
-Proving Theorems With LiquidHaskell
-===================================
-
-OK, lets take our refined operators from `Data.Set` out for a spin!
-One pleasant consequence of being able to precisely type the operators 
-from `Data.Set` is that we have a pleasant interface for using the SMT
-solver to *prove theorems* about sets, while remaining firmly rooted in
-Haskell. 
-
-First, lets write a simple function that asserts that its input is `True`
-
-
-<pre><span class=hs-linenum>131: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>boolAssert</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>{v:</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>| (Prop v)}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Bool</span> <span class='hs-keyword'>| (Prop v)}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>132: </span><a class=annot href="#"><span class=annottext>{VV : (GHC.Types.Bool) | (? Prop([VV]))}
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV]))}</span><span class='hs-definition'>boolAssert</span></a> <span class='hs-conid'>True</span>   <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : (GHC.Types.Bool) | (? Prop([VV])),(VV = True)}</span><span class='hs-conid'>True</span></a>
-<span class=hs-linenum>133: </span><span class='hs-definition'>boolAssert</span> <span class='hs-conid'>False</span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>[(GHC.Types.Char)] -&gt; {VV : (GHC.Types.Bool) | false}</span><span class='hs-varid'>error</span></a> <a class=annot href="#"><span class=annottext>{VV : [(GHC.Types.Char)] | (len([VV]) &gt;= 0)}</span><span class='hs-str'>"boolAssert: False? Never!"</span></a>
-</pre>
-
-Now, we can use `boolAssert` to write some simple properties. (Yes, these do
-indeed look like QuickCheck properties -- but here, instead of generating
-tests and executing the code, the type system is proving to us that the
-properties will *always* evaluate to `True`) 
-
-Lets check that `intersection` is commutative ...
-
-
-<pre><span class=hs-linenum>144: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>prop_cap_comm</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>145: </span><span class='hs-definition'>prop_cap_comm</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
-<span class=hs-linenum>146: </span><a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))
--&gt; (Data.Set.Base.Set (GHC.Types.Int)) -&gt; (GHC.Types.Bool)</span><span class='hs-definition'>prop_cap_comm</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>y</span></a> 
-<span class=hs-linenum>147: </span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : (GHC.Types.Bool) | (? Prop([VV]))}
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV]))}</span><span class='hs-varid'>boolAssert</span></a> 
-<span class=hs-linenum>148: </span>  <a class=annot href="#"><span class=annottext>({VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}
- -&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)})
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}</span><span class='hs-varop'>$</span></a> <a class=annot href="#"><span class=annottext>(GHC.Types.Bool)</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cap([xs;
-                                                              ys]))}</span><span class='hs-varop'>`intersection`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = y)}</span><span class='hs-varid'>y</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>GHC.Classes.Eq (Data.Set.Base.Set GHC.Types.Int)</span><span class='hs-varop'>==</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cap([xs;
-                                                              ys]))}</span><span class='hs-varop'>`intersection`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a><span class='hs-layout'>)</span>
-</pre>
-
-that `union` is associative ...
-
-
-<pre><span class=hs-linenum>154: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>prop_cup_assoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>155: </span><span class='hs-definition'>prop_cup_assoc</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
-<span class=hs-linenum>156: </span><a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))
--&gt; (Data.Set.Base.Set (GHC.Types.Int))
--&gt; (Data.Set.Base.Set (GHC.Types.Int))
--&gt; (GHC.Types.Bool)</span><span class='hs-definition'>prop_cup_assoc</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>z</span></a> 
-<span class=hs-linenum>157: </span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : (GHC.Types.Bool) | (? Prop([VV]))}
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV]))}</span><span class='hs-varid'>boolAssert</span></a> 
-<span class=hs-linenum>158: </span>  <a class=annot href="#"><span class=annottext>({VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}
- -&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)})
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}</span><span class='hs-varop'>$</span></a> <a class=annot href="#"><span class=annottext>(GHC.Types.Bool)</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cup([xs;
-                                                              ys]))}</span><span class='hs-varop'>`union`</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cup([xs;
-                                                              ys]))}</span><span class='hs-varop'>`union`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = z)}</span><span class='hs-varid'>z</span></a><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>x:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; y:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (GHC.Types.Bool) | ((? Prop([VV])) &lt;=&gt; (x = y))}</span><span class='hs-varop'>==</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cup([xs;
-                                                              ys]))}</span><span class='hs-varop'>`union`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = y)}</span><span class='hs-varid'>y</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cup([xs;
-                                                              ys]))}</span><span class='hs-varop'>`union`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = z)}</span><span class='hs-varid'>z</span></a>
-</pre>
-
-and that `union` distributes over `intersection`.
-
-
-<pre><span class=hs-linenum>164: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>prop_cap_dist</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>165: </span><span class='hs-definition'>prop_cap_dist</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
-<span class=hs-linenum>166: </span><a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))
--&gt; (Data.Set.Base.Set (GHC.Types.Int))
--&gt; (Data.Set.Base.Set (GHC.Types.Int))
--&gt; (GHC.Types.Bool)</span><span class='hs-definition'>prop_cap_dist</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>z</span></a> 
-<span class=hs-linenum>167: </span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : (GHC.Types.Bool) | (? Prop([VV]))}
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV]))}</span><span class='hs-varid'>boolAssert</span></a> 
-<span class=hs-linenum>168: </span>  <a class=annot href="#"><span class=annottext>({VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}
- -&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)})
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}</span><span class='hs-varop'>$</span></a>  <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cap([xs;
-                                                              ys]))}</span><span class='hs-varop'>`intersection`</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cup([xs;
-                                                              ys]))}</span><span class='hs-varop'>`union`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = z)}</span><span class='hs-varid'>z</span></a><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>169: </span>  <a class=annot href="#"><span class=annottext>x:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; y:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (GHC.Types.Bool) | ((? Prop([VV])) &lt;=&gt; (x = y))}</span><span class='hs-varop'>==</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cap([xs;
-                                                              ys]))}</span><span class='hs-varop'>`intersection`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = y)}</span><span class='hs-varid'>y</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cup([xs;
-                                                              ys]))}</span><span class='hs-varop'>`union`</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cap([xs;
-                                                              ys]))}</span><span class='hs-varop'>`intersection`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = z)}</span><span class='hs-varid'>z</span></a><span class='hs-layout'>)</span> 
-</pre>
-  
-Of course, while we're at it, lets make sure LiquidHaskell 
-doesn't prove anything thats *not* true ...
-
-
-<pre><span class=hs-linenum>176: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>prop_cup_dif_bad</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>177: </span><span class='hs-definition'>prop_cup_dif_bad</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Set</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
-<span class=hs-linenum>178: </span><a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))
--&gt; (Data.Set.Base.Set (GHC.Types.Int)) -&gt; (GHC.Types.Bool)</span><span class='hs-definition'>prop_cup_dif_bad</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-varid'>y</span></a>
-<span class=hs-linenum>179: </span>   <span class='hs-keyglyph'>=</span> <span class=hs-error><a class=annot href="#"><span class=annottext>{VV : (GHC.Types.Bool) | (? Prop([VV]))}
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV]))}</span><span class='hs-varid'>boolAssert</span></a></span> 
-<span class=hs-linenum>180: </span>   <a class=annot href="#"><span class=annottext>((GHC.Types.Bool)
- -&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)})
--&gt; (GHC.Types.Bool)
--&gt; {VV : (GHC.Types.Bool) | (? Prop([VV])),(VV != False)}</span><span class='hs-varop'>$</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; y:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (GHC.Types.Bool) | ((? Prop([VV])) &lt;=&gt; (x = y))}</span><span class='hs-varop'>==</span></a> <a class=annot href="#"><span class=annottext>(Data.Set.Base.Set (GHC.Types.Int))</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_cup([xs;
-                                                              ys]))}</span><span class='hs-varop'>`union`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = y)}</span><span class='hs-varid'>y</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>xs:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; ys:(Data.Set.Base.Set (GHC.Types.Int))
--&gt; {VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = Set_dif([xs;
-                                                              ys]))}</span><span class='hs-varop'>`difference`</span></a> <a class=annot href="#"><span class=annottext>{VV : (Data.Set.Base.Set (GHC.Types.Int)) | (VV = y)}</span><span class='hs-varid'>y</span></a>
-</pre>
-
-Hmm. You do know why the above doesn't hold, right? It would be nice to
-get a *counterexample* wouldn't it. Well, for the moment, there is
-QuickCheck!
-
-Thus, the refined types offer a nice interface for interacting with the SMT
-solver in order to prove theorems in LiquidHaskell. (BTW, The [SBV project][sbv]
-describes another approach for using SMT solvers from Haskell, without the 
-indirection of refinement types.)
-
-While the above is a nice warm up exercise to understanding how
-LiquidHaskell reasons about sets, our overall goal is not to prove 
-theorems about set operators, but instead to specify and verify 
-properties of programs. 
-
-
-The Set of Values in a List
-===========================
-
-Lets see how we might reason about sets of values in regular Haskell programs. 
-
-Lets begin with Lists, the jack-of-all-data-types. Now, instead of just
-talking about the **number of** elements in a list, we can write a measure
-that describes the **set of** elements in a list:
-
- A measure for the elements of a list, from [Data/Set.spec][setspec]
-<pre><span class=hs-linenum>208: </span>
-<span class=hs-linenum>209: </span><span class='hs-definition'>measure</span> <span class='hs-varid'>listElts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>210: </span><span class='hs-definition'>listElts</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varop'>?</span> <span class='hs-conid'>Set_emp</span><span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>211: </span><span class='hs-definition'>listElts</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_cup</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_sng</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>listElts</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
-</pre>
-
-That is, `(elts xs)` describes the set of elements contained in a list `xs`.
-
-Next, to make the specifications concise, lets define a few predicate aliases:
-
-
-<pre><span class=hs-linenum>219: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>predicate</span> <span class='hs-conid'>SameElts</span>  <span class='hs-conid'>X</span> <span class='hs-conid'>Y</span>   <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>listElts</span> <span class='hs-conid'>X</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>listElts</span> <span class='hs-conid'>Y</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>                        <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>220: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>predicate</span> <span class='hs-conid'>SubElts</span>   <span class='hs-conid'>X</span> <span class='hs-conid'>Y</span>   <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_sub</span> <span class='hs-layout'>(</span><span class='hs-varid'>listElts</span> <span class='hs-conid'>X</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>listElts</span> <span class='hs-conid'>Y</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>                   <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>221: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>predicate</span> <span class='hs-conid'>UnionElts</span> <span class='hs-conid'>X</span> <span class='hs-conid'>Y</span> <span class='hs-conid'>Z</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>listElts</span> <span class='hs-conid'>X</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Set_cup</span> <span class='hs-layout'>(</span><span class='hs-varid'>listElts</span> <span class='hs-conid'>Y</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>listElts</span> <span class='hs-conid'>Z</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-A Trivial Identity
-------------------
-
-OK, now lets write some code to check that the `elts` measure is sensible!
-
-
-<pre><span class=hs-linenum>230: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>listId</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyword'>| (SameElts v xs)}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>231: </span><a class=annot href="#"><span class=annottext>forall a.
-x1:[a]
--&gt; {VV : [a] | (len([VV]) = len([x1])),
-               (listElts([VV]) = Set_cup([listElts([x1]); listElts([x1])])),
-               (listElts([VV]) = listElts([x1])),
-               (listElts([x1]) = Set_cup([listElts([x1]); listElts([VV])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-definition'>listId</span></a> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-{VV : [{VV : a | false}]&lt;p&gt; | (? Set_emp([listElts([VV])])),
-                              (len([VV]) = 0)}</span><span class='hs-conid'>[]</span></a>
-<span class=hs-linenum>232: </span><span class='hs-definition'>listId</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-x1:[a]
--&gt; {VV : [a] | (len([VV]) = len([x1])),
-               (listElts([VV]) = Set_cup([listElts([x1]); listElts([x1])])),
-               (listElts([VV]) = listElts([x1])),
-               (listElts([x1]) = Set_cup([listElts([x1]); listElts([VV])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>listId</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = xs),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-</pre>
-
-That is, LiquidHaskell checks that the set of elements of the output list
-is the same as those in the input.
-
-A Less Trivial Identity
------------------------
-
-Next, lets write a function to `reverse` a list. Of course, we'd like to
-verify that `reverse` doesn't leave any elements behind; that is that the 
-output has the same set of values as the input list. This is somewhat more 
-interesting because of the *tail recursive* helper `go`. Do you understand 
-the type that is inferred for it? (Put your mouse over `go` to see the 
-inferred type.)
-
-
-<pre><span class=hs-linenum>249: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>reverse</span>       <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyword'>| (SameElts v xs)}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>250: </span><a class=annot href="#"><span class=annottext>forall a. xs:[a] -&gt; {VV : [a] | (listElts([VV]) = listElts([xs]))}</span><span class='hs-definition'>reverse</span></a>           <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{VV : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | (len([VV]) = 0)}
--&gt; x2:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([x2])])),
-               (listElts([VV]) = Set_cup([listElts([x2]); listElts([x1])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>go</span></a> <a class=annot href="#"><span class=annottext>{VV : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | (? Set_emp([listElts([VV])])),
-                                           (len([VV]) = 0),
-                                           (len([VV]) &gt;= 0)}</span><span class='hs-conid'>[]</span></a> 
-<span class=hs-linenum>251: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>252: </span>    <a class=annot href="#"><span class=annottext>acc:{VV : [a] | (len([VV]) &gt;= 0)}
--&gt; x1:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([acc]);
-                                          listElts([x1])])),
-               (listElts([VV]) = Set_cup([listElts([x1]); listElts([acc])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>go</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (len([VV]) &gt;= 0)}</span><span class='hs-varid'>acc</span></a> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = acc),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>acc</span></a>
-<span class=hs-linenum>253: </span>    <span class='hs-varid'>go</span> <span class='hs-varid'>acc</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>acc:{VV : [a] | (len([VV]) &gt;= 0)}
--&gt; x1:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([acc]);
-                                          listElts([x1])])),
-               (listElts([VV]) = Set_cup([listElts([x1]); listElts([acc])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>go</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV = y)}</span><span class='hs-varid'>y</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{VV : [a] | (VV = acc),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>acc</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = ys),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a>
-</pre>
-
-Appending Lists
----------------
-
-Next, here's good old `append`, but now with a specification that states
-that the output indeed includes the elements from both the input lists.
-
-
-<pre><span class=hs-linenum>263: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>append</span>       <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>| (UnionElts v xs ys) }</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>264: </span><a class=annot href="#"><span class=annottext>forall a.
-x1:[a]
--&gt; ys:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([ys])])),
-               (listElts([VV]) = Set_cup([listElts([ys]); listElts([x1])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-definition'>append</span></a> <span class='hs-conid'>[]</span>     <a class=annot href="#"><span class=annottext>[a]</span><span class='hs-varid'>ys</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = ys),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a>
-<span class=hs-linenum>265: </span><span class='hs-definition'>append</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varid'>ys</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-x1:[a]
--&gt; ys:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([ys])])),
-               (listElts([VV]) = Set_cup([listElts([ys]); listElts([x1])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>append</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = xs),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = ys),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a>
-</pre>
-
-Filtering Lists
----------------
-
-Lets round off the list trilogy, with `filter`. Here, we can verify
-that it returns a **subset of** the values of the input list.
-
-
-<pre><span class=hs-linenum>275: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>filter</span>      <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-keyword'>| (SubElts v xs)}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>276: </span>
-<span class=hs-linenum>277: </span><a class=annot href="#"><span class=annottext>forall a.
-(a -&gt; (GHC.Types.Bool))
--&gt; x2:[a]
--&gt; {VV : [a] | (? Set_sub([listElts([VV]); listElts([x2])])),
-               (listElts([x2]) = Set_cup([listElts([x2]); listElts([VV])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-definition'>filter</span></a> <a class=annot href="#"><span class=annottext>a -&gt; (GHC.Types.Bool)</span><span class='hs-varid'>f</span></a> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-{VV : [{VV : a | false}]&lt;p&gt; | (? Set_emp([listElts([VV])])),
-                              (len([VV]) = 0)}</span><span class='hs-conid'>[]</span></a>
-<span class=hs-linenum>278: </span><span class='hs-definition'>filter</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>279: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>a -&gt; (GHC.Types.Bool)</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a>         <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(a -&gt; (GHC.Types.Bool))
--&gt; x2:[a]
--&gt; {VV : [a] | (? Set_sub([listElts([VV]); listElts([x2])])),
-               (listElts([x2]) = Set_cup([listElts([x2]); listElts([VV])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>filter</span></a> <a class=annot href="#"><span class=annottext>a -&gt; (GHC.Types.Bool)</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = xs),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a> 
-<span class=hs-linenum>280: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>   <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a.
-(a -&gt; (GHC.Types.Bool))
--&gt; x2:[a]
--&gt; {VV : [a] | (? Set_sub([listElts([VV]); listElts([x2])])),
-               (listElts([x2]) = Set_cup([listElts([x2]); listElts([VV])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>filter</span></a> <a class=annot href="#"><span class=annottext>a -&gt; (GHC.Types.Bool)</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = xs),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-</pre>
-
-Merge Sort
-==========
-
-Lets conclude this entry with one larger example: `mergeSort`. 
-We'd like to verify that, well, the list that is returned 
-contains the same set of elements as the input list. 
-
-And so we will!
-
-But first, lets remind ourselves of how `mergeSort` works
-
-1. `split` the input list into two halves, 
-2. `sort`  each half, recursively, 
-3. `merge` the sorted halves to obtain the sorted list.
-
-
-Split
------
-
-We can `split` a list into two, roughly equal parts like so:
-
-
-<pre><span class=hs-linenum>305: </span><a class=annot href="#"><span class=annottext>forall a.
-x1:[a]
--&gt; ({VV : [a] | (? Set_sub([listElts([VV]); listElts([x1])])),
-                (listElts([x1]) = Set_cup([listElts([x1]); listElts([VV])])),
-                (len([VV]) &gt;= 0)} , {VV : [a] | (? Set_sub([listElts([VV]);
-                                                            listElts([x1])])),
-                                                (listElts([x1]) = Set_cup([listElts([x1]);
-                                                                           listElts([VV])])),
-                                                (len([VV]) &gt;= 0)})&lt;\x1 VV -&gt; (? Set_sub([listElts([VV]);
-                                                                                         listElts([x1])])),
-                                                                             (listElts([x1]) = Set_cup([listElts([x1]);
-                                                                                                        listElts([VV])])),
-                                                                             (listElts([x1]) = Set_cup([listElts([x1]);
-                                                                                                        listElts([VV])])),
-                                                                             (len([VV]) &gt;= 0)&gt;</span><span class='hs-definition'>split</span></a> <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a b &lt;p2 :: a -&gt; b -&gt; Bool&gt;. x1:a -&gt; b&lt;p2 x1&gt; -&gt; (a , b)&lt;p2&gt;</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{VV : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | (? Set_emp([listElts([VV])])),
-                                           (len([VV]) = 0),
-                                           (len([VV]) &gt;= 0)}</span><span class='hs-conid'>[]</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{VV : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | (? Set_emp([listElts([VV])])),
-                                           (len([VV]) = 0),
-                                           (len([VV]) &gt;= 0)}</span><span class='hs-conid'>[]</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>306: </span><span class='hs-definition'>split</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a b &lt;p2 :: a -&gt; b -&gt; Bool&gt;. x1:a -&gt; b&lt;p2 x1&gt; -&gt; (a , b)&lt;p2&gt;</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{VV : [a] | (? Set_sub([listElts([VV]); listElts([xs])])),
-            (VV = zs),
-            (VV = zs),
-            (len([VV]) = len([zs])),
-            (listElts([VV]) = Set_cup([listElts([zs]); listElts([zs])])),
-            (listElts([VV]) = listElts([zs])),
-            (listElts([xs]) = Set_cup([listElts([xs]); listElts([VV])])),
-            (listElts([xs]) = Set_cup([listElts([ys]); listElts([VV])])),
-            (listElts([xs]) = Set_cup([listElts([ys]); listElts([VV])])),
-            (listElts([zs]) = Set_cup([listElts([zs]); listElts([VV])])),
-            (len([VV]) &gt;= 0)}</span><span class='hs-varid'>zs</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (? Set_sub([listElts([VV]); listElts([xs])])),
-            (VV = ys),
-            (VV = ys),
-            (len([VV]) = len([ys])),
-            (listElts([VV]) = Set_cup([listElts([ys]); listElts([ys])])),
-            (listElts([VV]) = listElts([ys])),
-            (listElts([xs]) = Set_cup([listElts([xs]); listElts([VV])])),
-            (listElts([xs]) = Set_cup([listElts([zs]); listElts([VV])])),
-            (listElts([ys]) = Set_cup([listElts([ys]); listElts([VV])])),
-            (len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>307: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>308: </span>    <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : [a] | (? Set_sub([listElts([VV]); listElts([xs])])),
-            (VV = ys),
-            (len([VV]) = len([ys])),
-            (listElts([VV]) = Set_cup([listElts([ys]); listElts([ys])])),
-            (listElts([VV]) = listElts([ys])),
-            (listElts([xs]) = Set_cup([listElts([xs]); listElts([VV])])),
-            (listElts([xs]) = Set_cup([listElts([zs]); listElts([VV])])),
-            (listElts([ys]) = Set_cup([listElts([ys]); listElts([VV])])),
-            (len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (? Set_sub([listElts([VV]); listElts([xs])])),
-            (VV = zs),
-            (len([VV]) = len([zs])),
-            (listElts([VV]) = Set_cup([listElts([zs]); listElts([zs])])),
-            (listElts([VV]) = listElts([zs])),
-            (listElts([xs]) = Set_cup([listElts([xs]); listElts([VV])])),
-            (listElts([xs]) = Set_cup([listElts([ys]); listElts([VV])])),
-            (listElts([xs]) = Set_cup([listElts([ys]); listElts([VV])])),
-            (listElts([zs]) = Set_cup([listElts([zs]); listElts([VV])])),
-            (len([VV]) &gt;= 0)}</span><span class='hs-varid'>zs</span></a><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a.
-x1:[a]
--&gt; ({VV : [a] | (? Set_sub([listElts([VV]); listElts([x1])])),
-                (listElts([x1]) = Set_cup([listElts([x1]); listElts([VV])])),
-                (len([VV]) &gt;= 0)} , {VV : [a] | (? Set_sub([listElts([VV]);
-                                                            listElts([x1])])),
-                                                (listElts([x1]) = Set_cup([listElts([x1]);
-                                                                           listElts([VV])])),
-                                                (len([VV]) &gt;= 0)})&lt;\x1 VV -&gt; (? Set_sub([listElts([VV]);
-                                                                                         listElts([x1])])),
-                                                                             (listElts([x1]) = Set_cup([listElts([x1]);
-                                                                                                        listElts([VV])])),
-                                                                             (listElts([x1]) = Set_cup([listElts([x1]);
-                                                                                                        listElts([VV])])),
-                                                                             (len([VV]) &gt;= 0)&gt;</span><span class='hs-varid'>split</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = xs),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-</pre>
-
-LiquidHaskell verifies that the relevant property of `split` is
-
-
-<pre><span class=hs-linenum>314: </span><span class='hs-keyword'>{-@</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>ys</span> <span class='hs-varid'>zs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>UnionElts</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ys</span> <span class='hs-varid'>zs</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-The funny syntax with angle brackets simply says that the output is a 
-a *pair* `(ys, zs)` whose union is the list of elements of the input.
-
-(**Aside** yes, this is indeed a dependent tuple; we will revisit tuples
-later to understand whats going on with the odd syntax.)
-
-Merge
------
-
-Dually, we `merge` two (sorted) lists like so:
-
-
-<pre><span class=hs-linenum>329: </span><a class=annot href="#"><span class=annottext>forall a.
-(GHC.Classes.Ord a) =&gt;
-xs:[a]
--&gt; x1:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([xs])])),
-               (listElts([VV]) = Set_cup([listElts([xs]); listElts([x1])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-definition'>merge</span></a> <a class=annot href="#"><span class=annottext>[a]</span><span class='hs-varid'>xs</span></a> <span class='hs-conid'>[]</span>         <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = xs),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-<span class=hs-linenum>330: </span><span class='hs-definition'>merge</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>ys</span>         <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a>
-<span class=hs-linenum>331: </span><span class='hs-definition'>merge</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>yozz</span><span class='hs-conop'>:</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>332: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x:a
--&gt; y:a -&gt; {VV : (GHC.Types.Bool) | ((? Prop([VV])) &lt;=&gt; (x &lt;= y))}</span><span class='hs-varop'>&lt;=</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV = yozz)}</span><span class='hs-varid'>yozz</span></a>       <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(GHC.Classes.Ord a) =&gt;
-xs:[a]
--&gt; x1:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([xs])])),
-               (listElts([VV]) = Set_cup([listElts([xs]); listElts([x1])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>merge</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = xs),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV = yozz)}</span><span class='hs-varid'>yozz</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{VV : [a] | (VV = ys),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>333: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>       <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV = yozz)}</span><span class='hs-varid'>yozz</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(GHC.Classes.Ord a) =&gt;
-xs:[a]
--&gt; x1:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([xs])])),
-               (listElts([VV]) = Set_cup([listElts([xs]); listElts([x1])])),
-               (len([VV]) &gt;= 0)}</span><span class='hs-varid'>merge</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-y:a
--&gt; ys:[a&lt;p y&gt;]&lt;p&gt;
--&gt; {VV : [a]&lt;p&gt; | (len([VV]) = (1 + len([ys]))),
-                  (listElts([VV]) = Set_cup([Set_sng([y]); listElts([ys])]))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{VV : [a] | (VV = xs),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = ys),(len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a>
-</pre>
-
-As you might expect, the elements of the returned list are the union of the
-elements of the input, or as LiquidHaskell might say,
-
-
-<pre><span class=hs-linenum>340: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>merge</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>| (UnionElts v x y)}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-Sort
-----
-
-Finally, we put all the pieces together by
-
-
-<pre><span class=hs-linenum>349: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>mergeSort</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyword'>| (SameElts v xs)}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>350: </span><a class=annot href="#"><span class=annottext>forall a.
-(GHC.Classes.Ord a) =&gt;
-x1:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([x1])])),
-               (listElts([VV]) = listElts([x1])),
-               (listElts([x1]) = Set_cup([listElts([x1]); listElts([VV])]))}</span><span class='hs-definition'>mergeSort</span></a> <span class='hs-conid'>[]</span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: a -&gt; a -&gt; Bool&gt;.
-{VV : [{VV : a | false}]&lt;p&gt; | (? Set_emp([listElts([VV])])),
-                              (len([VV]) = 0)}</span><span class='hs-conid'>[]</span></a>
-<span class=hs-linenum>351: </span><span class='hs-definition'>mergeSort</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | (? Set_emp([listElts([VV])])),
-                                           (len([VV]) = 0),
-                                           (len([VV]) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{VV : a | (VV = x)}</span><span class='hs-varid'>x</span></a><span class='hs-keyglyph'>]</span>
-<span class=hs-linenum>352: </span><span class='hs-definition'>mergeSort</span> <span class='hs-varid'>xs</span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x:[a]
--&gt; y:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x]);
-                                          listElts([y])]))}</span><span class='hs-varid'>merge</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>forall a.
-(GHC.Classes.Ord a) =&gt;
-x1:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([x1])])),
-               (listElts([VV]) = listElts([x1])),
-               (listElts([x1]) = Set_cup([listElts([x1]); listElts([VV])]))}</span><span class='hs-varid'>mergeSort</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = ys),
-            (VV = ys),
-            (len([VV]) = len([ys])),
-            (listElts([VV]) = Set_cup([listElts([ys]); listElts([ys])])),
-            (listElts([VV]) = listElts([ys])),
-            (listElts([ys]) = Set_cup([listElts([ys]); listElts([VV])])),
-            (len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>forall a.
-(GHC.Classes.Ord a) =&gt;
-x1:[a]
--&gt; {VV : [a] | (listElts([VV]) = Set_cup([listElts([x1]);
-                                          listElts([x1])])),
-               (listElts([VV]) = listElts([x1])),
-               (listElts([x1]) = Set_cup([listElts([x1]); listElts([VV])]))}</span><span class='hs-varid'>mergeSort</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = zs),
-            (VV = zs),
-            (len([VV]) = len([zs])),
-            (listElts([VV]) = Set_cup([listElts([zs]); listElts([zs])])),
-            (listElts([VV]) = listElts([zs])),
-            (listElts([zs]) = Set_cup([listElts([zs]); listElts([VV])])),
-            (len([VV]) &gt;= 0)}</span><span class='hs-varid'>zs</span></a><span class='hs-layout'>)</span> 
-<span class=hs-linenum>353: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>354: </span>    <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : [a] | (VV = ys),
-            (len([VV]) = len([ys])),
-            (listElts([VV]) = Set_cup([listElts([ys]); listElts([ys])])),
-            (listElts([VV]) = listElts([ys])),
-            (listElts([ys]) = Set_cup([listElts([ys]); listElts([VV])])),
-            (len([VV]) &gt;= 0)}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV = zs),
-            (len([VV]) = len([zs])),
-            (listElts([VV]) = Set_cup([listElts([zs]); listElts([zs])])),
-            (listElts([VV]) = listElts([zs])),
-            (listElts([zs]) = Set_cup([listElts([zs]); listElts([VV])])),
-            (len([VV]) &gt;= 0)}</span><span class='hs-varid'>zs</span></a><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>xs:[a]
--&gt; ([a] , [a])&lt;\ys VV -&gt; (listElts([xs]) = Set_cup([listElts([ys]);
-                                                    listElts([VV])]))&gt;</span><span class='hs-varid'>split</span></a> <a class=annot href="#"><span class=annottext>{VV : [a] | (len([VV]) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-</pre>
-
-The type given to `mergeSort`guarantees that the set of elements in the 
-output list is indeed the same as in the input list. Of course, it says 
-nothing about whether the list is *actually sorted*. 
-
-Well, Rome wasn't built in a day...
-
-[sbv]:      https://github.com/LeventErkok/sbv
-[setspec]:  https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/Data/Set.spec
-[mccarthy]: http://www-formal.stanford.edu/jmc/towards.ps
-[z3cal]:    http://research.microsoft.com/en-us/um/people/leonardo/fmcad09.pdf
diff --git a/docs/blog/todo/red-black-intro.lhs b/docs/blog/todo/red-black-intro.lhs
deleted file mode 100644
--- a/docs/blog/todo/red-black-intro.lhs
+++ /dev/null
@@ -1,111 +0,0 @@
----
-layout: post
-title: "Composing Specifications: Red Black Trees" 
-date: 2014-04-05 16:12
-author: Ranjit Jhala
-published: false 
-comments: true
-external-url:
-categories: measures, abstract-refinements, red-black 
----
-
-TODO: **Conjoining Specifications** lamport. 
-TODO: composing, and, for example, 
-TODO: red-black trees.
-
-[Red Black trees][RBTwiki] trees are a classic, cold-war era, 
-data structure used to efficiently represent sets, using trees
-whose nodes are labeled by the set's elements, and additionally, 
-are colored *red* or *black*. 
-
-The key to efficiency is that the the trees be *balanced*. 
-
-Of course, the easiest way to do this is to just add a *height* 
-label and check that the difference of heights at each node is 
-bounded (cf. [AVL trees][AVLTwiki]). But, back in the olden 
-days, every bit counted -- the super cunning thing about 
-Red-Black Trees is that they ensure balancedness, at the 
-throwaway price of a *single bit* per node.
-
-The catch is that the invariants are devilishly tricky.
-
-<!-- more -->
-
-1. **Order:** Each node's value is between those in its left and right subtrees,
-2. **Color:** Each red node's children are colored black,
-3. **Height:** Each root-to-leaf path has the same number of black nodes.
-
-There are ways to encode various subsets of these using 
-GADTs and such, but, like [Appel][RBTappel], I find the 
-encodings rather too clever as they require a variety 
-of different types and constructors to capture each 
-invariant. 
-
-One advantage of refinements is we fix the data type, 
-and can then *pick and choose* which invariants we want
-to verify, and *compose* them, quite trivially, via
-conjunction.
-
-Red Black Trees
----------------
-
-Lets start with the basic type describing trees.
-
-\begin{code}
-data RBTree a = Leaf 
-              | Node Color a !(RBTree a) !(RBTree a)
-              deriving (Show)
-\end{code}
-
-A tree is either a `Leaf` (an empty set) or a `Node c x l r` where:
-
-* `x` is the value at the node, 
-* `l` and `r` are the left and right subtrees, and
-* `c` is either `B` (black) or `R` (red). 
-
-\begin{code}
-data Color    = B -- ^ Black
-              | R -- ^ Red
-              deriving (Eq,Show)
-\end{code}
-
-Intuitively, the set denoted by a tree is the set of values at 
-the nodes of the tree.
-
-Over the next few posts, we will develop an implementation 
-([based off this][coqRBT]) of a set library using the `RBTree` 
-datatype. In particular, we will implement the API:
-
-\begin{code} <div/>
-empty  :: RBTree a
-member :: a -> RBTree a -> Bool
-insert :: a -> RBTree a -> RBTree a
-delete :: a -> RBTree a -> RBTree a
-toList :: RBTree a -> [a] 
-\end{code}
-
-and will use LiquidHaskell to *directly* and *compositionally* 
-specify and enforce the various invariants.
-
-Continue to:
-
-* [Order][rbtOrder]
-
-Coming soon:
-
-* Color
-* Height
-* Compose
-
-[rbtOrder]   : /blog/2014/04/07/red-black-order.lhs/ 
-
-<!--
-
-* [Color][rbtColor]
-* [Height][rbtHeight]
-* [Compose][rbtAll]
-
-[rbtColor]   : /blog/2014/04/14/red-black-color.lhs/ 
-[rbtHeight]  : /blog/2014/04/21/red-black-height.lhs/ 
-[rbtCompose] : /blog/2014/04/28/red-black-compose.lhs/
--->
diff --git a/docs/blog/todo/red-black-order.lhs b/docs/blog/todo/red-black-order.lhs
deleted file mode 100644
--- a/docs/blog/todo/red-black-order.lhs
+++ /dev/null
@@ -1,254 +0,0 @@
----
-layout: post
-title: "Red-Black Trees: Order"
-date: 2014-04-05 16:12
-author: Ranjit Jhala
-published: false 
-comments: true
-external-url:
-categories: measures, abstract-refinements 
-demo: RBTree-ord.hs
----
-
-A data structure that implements a *set* interface, must 
-provide an efficient way to determine *membership*, i.e. 
-a function 
-
-\begin{code}
-member :: a -> RBTree a -> Bool
-\end{code}
-
-where `elem x xs` returns `True` iff `x` is in the set denoted by `xs`.
-
-Red Black trees are use 
-
-To enable effici
-
-Abstract Refinements vs. Indices
---------------------------------
-
-Most formal accounts of Red Black trees eschew the order 
-invariant as it is rather cumbersome to encode using GADTs
-and indexed-types -- one must index the structure with lower
-and upper bounds, and appropriately adjust these bounds at 
-rotations. 
-
-
-TODO: **Conjoining Specifications** lamport. 
-TODO: composing, and, for example, 
-TODO: red-black trees.
-
-[Red Black trees][RBTwiki] trees are a classic, cold-war era, 
-data structure used to efficiently represent sets, using trees
-whose nodes are labeled by the set's elements, and additionally, 
-are colored *red* or *black*. 
-
-The key to efficiency is that the the trees be *balanced*. 
-
-Of course, the easiest way to do this is to just add a *height* 
-label and check that the difference of heights at each node is 
-bounded (cf. [AVL trees][AVLTwiki]). But, back in the olden 
-days, every bit counted -- the super cunning thing about 
-Red-Black Trees is that they ensure balancedness, at the 
-throwaway price of a *single bit* per node.
-
-The catch is that the invariants are devilishly tricky.
-
-<!-- more -->
-
-1. **Order:** Each node's value is between those in its left and right subtrees,
-2. **Color:** Each red node's children are colored black,
-3. **Height:** Each root-to-leaf path has the same number of black nodes.
-
-There are ways to encode various subsets of these using 
-GADTs and such, but, like [Appel][RBTappel], I find the 
-encodings rather too clever as they require a variety 
-of different types and constructors to capture each 
-invariant. 
-
-One advantage of refinements is we fix the data type, 
-and can then *pick and choose* which invariants we want
-to verify, and *compose* them, quite trivially, via
-conjunction.
-
-Continue to:
-
-* [Order][rbtOrder]
-* [Color][rbtColor]
-* [Height][rbtHeight]
-* [Composition][rbtAll]
-
-[rbtOrder]   : /blog/2014/04/07/red-black-order.lhs/ 
-[rbtColor]   : /blog/2014/04/14/red-black-color.lhs/ 
-[rbtHeight]  : /blog/2014/04/21/red-black-height.lhs/ 
-[rbtCompose] : /blog/2014/04/28/red-black-compose.lhs/
-
-
-Red-Black Trees
----------------
-
-Abstract Refinements
---------------------
-
-Ordered Trees
--------------
-
-
-Over the next several posts, lets see how to develop an
-RBTree library, using LiquidHaskell to directly and 
-compositionally specify and enforce the above invariants.
-
-
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination"   @-}
-module Foo (add, remove, deleteMin, deleteMin') where
-import Language.Haskell.Liquid.Prelude
-\end{code}
-
-</div>
-
-ADD
-
-\begin{code}
-data Color    = B -- ^ Black
-              | R -- ^ Red
-              deriving (Eq,Show)
-\end{code}
-
-\begin{code}
-data RBTree a = Leaf 
-              | Node Color a !(RBTree a) !(RBTree a)
-              deriving (Show)
-\end{code}
-
----------------------------------------------------------------------------
--- | Add an element -------------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ add :: (Ord a) => a -> ORBT a -> ORBT a @-}
-add x s = makeBlack (ins x s)
-
-{-@ ins :: (Ord a) => a -> ORBT a -> ORBT a @-}
-ins kx Leaf             = Node R kx Leaf Leaf
-ins kx s@(Node B x l r) = case compare kx x of
-                            LT -> let t = lbal x (ins kx l) r in t 
-                            GT -> let t = rbal x l (ins kx r) in t 
-                            EQ -> s
-ins kx s@(Node R x l r) = case compare kx x of
-                            LT -> Node R x (ins kx l) r
-                            GT -> Node R x l (ins kx r)
-                            EQ -> s
-
----------------------------------------------------------------------------
--- | Delete an element ----------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ remove :: (Ord a) => a -> ORBT a -> ORBT a @-}
-remove x t = makeBlack (del x t)
-
-{-@ del              :: (Ord a) => a -> ORBT a -> ORBT a @-}
-del x Leaf           = Leaf
-del x (Node _ y a b) = case compare x y of
-   EQ -> append y a b 
-   LT -> case a of
-           Leaf         -> Node R y Leaf b
-           Node B _ _ _ -> lbalS y (del x a) b
-           _            -> let t = Node R y (del x a) b in t 
-   GT -> case b of
-           Leaf         -> Node R y a Leaf 
-           Node B _ _ _ -> rbalS y a (del x b)
-           _            -> Node R y a (del x b)
-
-{-@ append  :: y:a -> ORBT {v:a | v < y} -> ORBT {v:a | y < v} -> ORBT a @-}
-append :: a -> RBTree a -> RBTree a -> RBTree a
-
-append _ Leaf r                               
-  = r
-
-append _ l Leaf                               
-  = l
-
-append piv (Node R lx ll lr) (Node R rx rl rr)  
-  = case append piv lr rl of 
-      Node R x lr' rl' -> Node R x (Node R lx ll lr') (Node R rx rl' rr)
-      lrl              -> Node R lx ll (Node R rx lrl rr)
-
-append piv (Node B lx ll lr) (Node B rx rl rr)  
-  = case append piv lr rl of 
-      Node R x lr' rl' -> Node R x (Node B lx ll lr') (Node B rx rl' rr)
-      lrl              -> lbalS lx ll (Node B rx lrl rr)
-
-append piv l@(Node B _ _ _) (Node R rx rl rr)   
-  = Node R rx (append piv l rl) rr
-
-append piv l@(Node R lx ll lr) r@(Node B _ _ _) 
-  = Node R lx ll (append piv lr r)
-
----------------------------------------------------------------------------
--- | Delete Minimum Element -----------------------------------------------
----------------------------------------------------------------------------
-
-{-@ deleteMin  :: ORBT a -> ORBT a @-}
-deleteMin (Leaf)         = Leaf
-deleteMin (Node _ x l r) = makeBlack t
-  where 
-    (_, t)               = deleteMin' x l r
-
-
-{-@ deleteMin' :: k:a -> ORBT {v:a | v < k} -> ORBT {v:a | k < v} -> (a, ORBT a) @-}
-deleteMin' k Leaf r              = (k, r)
-deleteMin' x (Node R lx ll lr) r = (k, Node R x l' r)   where (k, l') = deleteMin' lx ll lr 
-deleteMin' x (Node B lx ll lr) r = (k, lbalS x l' r )   where (k, l') = deleteMin' lx ll lr 
-
----------------------------------------------------------------------------
--- | Rotations ------------------------------------------------------------
----------------------------------------------------------------------------
-
-lbalS k (Node R x a b) r              = Node R k (Node B x a b) r
-lbalS k l (Node B y a b)              = let t = rbal k l (Node R y a b) in t 
-lbalS k l (Node R z (Node B y a b) c) = Node R y (Node B k l a) (rbal z b (makeRed c))
-lbalS k l r                           = error "nein" 
-
-rbalS k l (Node R y b c)              = Node R k l (Node B y b c)
-rbalS k (Node B x a b) r              = let t = lbal k (Node R x a b) r in t 
-rbalS k (Node R x a (Node B y b c)) r = Node R y (lbal x (makeRed a) b) (Node B k c r)
-rbalS k l r                           = error "nein"
-
-lbal k (Node R y (Node R x a b) c) r  = Node R y (Node B x a b) (Node B k c r)
-lbal k (Node R x a (Node R y b c)) r  = Node R y (Node B x a b) (Node B k c r)
-lbal k l r                            = Node B k l r
-
-rbal x a (Node R y b (Node R z c d))  = Node R y (Node B x a b) (Node B z c d)
-rbal x a (Node R z (Node R y b c) d)  = Node R y (Node B x a b) (Node B z c d)
-rbal x l r                            = Node B x l r
-
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-
-makeRed (Node _ x l r)   = Node R x l r
-makeRed Leaf             = error "nein" 
-
-makeBlack Leaf           = Leaf
-makeBlack (Node _ x l r) = Node B x l r
-
----------------------------------------------------------------------------
--- | Specifications -------------------------------------------------------
----------------------------------------------------------------------------
-
--- | Ordered Red-Black Trees
-
-{-@ type ORBT a = RBTree <{\root v -> v < root }, {\root v -> v > root}> a @-}
-
--- | Binary Search Ordering
-
-{-@ data RBTree a <l :: a -> a -> Prop, r :: a -> a -> Prop>
-            = Leaf
-            | Node (c    :: Color)
-                   (key  :: a)
-                   (left :: RBTree <l, r> (a <l key>))
-                   (left :: RBTree <l, r> (a <r key>))
-  @-}
diff --git a/docs/blog/todo/telling-lies-old.lhs b/docs/blog/todo/telling-lies-old.lhs
deleted file mode 100644
--- a/docs/blog/todo/telling-lies-old.lhs
+++ /dev/null
@@ -1,122 +0,0 @@
----
-layout: post
-title: "LiquidHaskell Caught Telling Lies!"
-date: 2013-11-19 16:12
-comments: true
-external-url:
-categories: termination
-author: Niki Vazou
-published: false
-demo: TellingLies.hs
----
-
-If you used liquidHaskell lately, you may have noticed some type errors that
-just make no sense.
-Well, that is not a bug, but a ... **termination checker** failing to prove that
-your function terminates.
-
-LiquidHaskell, *by default*, performs a termination check while verifying your
-code.
-Of course the tool would be useless if it required all your functions
-to terminate.
-Instead, it just requires that non-terminating functions return unrefined
-results.
-We will shortly explain when and how one can turn off termination checking while preserve
-sound type checking.
-To do so, we should start by explaining why termination is requied. 
-
-<!-- more -->
-
-\begin{code}
-module TellingLies where
-
-import Prelude  hiding (repeat)
-import Language.Haskell.Liquid.Prelude (liquidAssert)
-\end{code}
-
-Why is Termination Analysis Required
--------------------------------------
-
-Consider a no-terminating function:
-
-\begin{code}
-{-@ foo :: Int -> {v:Int | false} @-}
-foo     :: Int -> Int
-foo n   = foo n
-\end{code}
-
-According to the *partial correctness property*
-the type signature for `foo` means that any
-value `foo` returns will satisfy the result refinement
-`false`. 
-Since `foo` never returns, 
-it can return *none* value, thus it trivially satisfies its
-type.
-
-Now, in an environment where `false` (i.e., `foo`'s result)
-exists, liquidHaskell can prove anything, 
-even the contradiction `0==1`:
-
-\begin{code}
-prop = liquidAssert ((\_ -> 0==1) (foo 0))
-\end{code}
-
-This is totally valid under *eager* evaluation, where
-to execute the assertion one should first compute the argument
-`foo 0` which never returns.
-But, it is not valid under haskell's *lazy* semantics
-where execution ignores the unused argument, and fails.
-
-From the above discussion we see that partial correctness is not enough to
-verify Haskell's lazy code.
-To restore soundness we require *total correctness*, or
-that each function terminates.
-This explains why termination checking is set as default to liquidHaskell (as is
-in many other verifiers, like Coq or Agda.)
-
-Turning off Termination Checking
---------------------------------
-
-Of course, you cannot prove termination of functions like `repeat`
-
-\begin{code}
-{-@ repeat :: a -> [a] @-}
-repeat     :: a -> [a]
-repeat a   = a : repeat a
-\end{code}
-
-Instead, you can mark `repeat` as `Lazy` to disable termination for these
-functions:
-\begin{code}
-{-@ Lazy repeat @-}
-\end{code}
-
-But, be careful!
-By marking a function as `Lazy` *you* also guarantee that *the result type
-cannot contain inconsistencies*.
-In our previous example, liquidHaskell typechecked the unsafe `prop`, just
-because we marked `foo` (who's return type contains inconsistency) as `Lazy`
-\begin{code}
-{-@ Lazy foo @-}
-\end{code}
-
-Even though it is hard to decide if a type can contain inconsistencies,
-trivially *unrefined types* (or types refined to `true`) cannot ever be resolved
-to `false`.
-In other words, it is always safe to mark as `Lazy` functions with unrefined
-result.
-
-\begin{code}Finally, you have the option to totally disable termination checking, using the `no-termination` flag:
-{-@ LIQUID "--no-termination" @-}
-\end{code}
-
-
-Prevent liquidHaskell from Telling Lies
----------------------------------------
-
-In this post, we saw why termination is required for sound type checking and when
-it is safe to deactivate it.
-But still, we didn't discuss how to prevent the tool from telling lies, i.e., how
-to actually prove termination.
-Turns out that liquidHaskell is powerful enough to prove
-termination on a great number of functions, but this is a topic of another post.
diff --git a/docs/blog/todo/termination.lhs b/docs/blog/todo/termination.lhs
deleted file mode 100644
--- a/docs/blog/todo/termination.lhs
+++ /dev/null
@@ -1,288 +0,0 @@
----
-layout: post
-title: "Termination Checking"
-date: 2013-11-18 16:12
-comments: true
-external-url:
-categories: termination
-author: Niki Vazou
-published: false
-demo: Termination.hs
----
-
-If you used liquidHaskell lately, you may have noticed some type errors that
-just make no sense.
-Well, that is not a bug, but a ... **termination checker** failing to prove that
-your function terminates.
-
-In this post, we present how you can use liquidHaskell to prove termination on
-simple recursive functions and explain why termination is required for sound
-type checking.
-Of course liquidHaskell would be useless if it required that all your functions
-do terminate.
-Instead, it just requires that non-terminating functions return unrefined
-results.
-We will shortly explain how one can turn off termination checking while preserve
-sound type checking.
-
-<!-- more -->
-
-\begin{code}
-module Termination where
-
-import Prelude hiding (sum, (!!), repeat)
-import Data.List      (lookup)
-import Data.Maybe     (fromJust)
-
-import Language.Haskell.Liquid.Prelude (liquidAssert)
-\end{code}
-
-Termination Check with Refinement Types
----------------------------------------
-
-Consider a `Vec`tor that maps `Int`egers to `Val`ues:
-
-\begin{code}
-type Val   = Int
-data Vec   = V [(Int, Val)]
-
-(!!)       :: Vec -> Int -> Val
-(V a) !! i = case i `lookup` a of {Just v -> v; _ -> 0}
-\end{code}
-
-Let `sum a i` add the `i` first elements of the vector `a`:
-
-\begin{code}
-sum     :: Vec -> Int -> Val
-sum a 0 = 0
-sum a i = (a !! (i-1)) + sum a (i-1)
-\end{code}
-
-Does `sum` terminate?
-We observe that if `i` is not `0` then `sum i` will call `sum (i-1)`, otherwise
-it will return.
-This reasoning suffices to convince ourselves that `sum i` terminates for every
-natural number `i`.
-Formally, we shown that `sum` terminates because a *well-founded metric* (i.e., the
-natural number `i`) is decreasing at each iteration.
-Thus, to ensure termination it suffices to restrict `i` on Natural numbers,
-which we can do with a liquid-type signature.
-\begin{code}
-{-@ sum :: Vec -> Nat -> Val @-}
-\end{code}
-
-LiquidHaskell will apply the same reasoning to prove `sum`
-terminates:
-Conventionally, to typecheck `sum` we would check the body assuming an
-environment
-
-`a:Vec`, `i:Nat`, `sum:Vec -> Nat -> Val`
-
-Instead, we *weaken* the environment to 
-
-`a:Vec`, `i:Nat`, `sum:Vec -> {v:Nat| v < i} -> Val`
-
-Now, the type of `sum` stipulates that it *only* be recursively called with
-`Nat` (so well-founded) values that are *strictly less than* the current parameter `i`. 
-Since its body typechecks in this environment, `sum` terminates for
-every `i` on `Nat`s.
-
-Choosing the correct argument
------------------------------
-
-We saw that liquidHaskell can happily check that a Natural number is decreasing
-at each iteration; but it uses a na&#239;ve heuristic to choose which one. 
-For this post we can assume that it always chooses *the first* Integer. 
-
-So, a tail-recursive implementation of `sum`:
-\begin{code}
-{-@ sum' :: Vec -> Val -> Nat -> Val @-}
-sum' :: Vec -> Val -> Int -> Val
-sum' a acc 0 = acc + a!!0 
-sum' a acc i = sum' a (acc + a!!i) (i-1)
-\end{code}
-
-will fail, as liquidHaskell wants to prove that the `acc`umulator is the `Nat`ural
-number that
-decreases at each iteration.
-
-\begin{code}The remedy is simple. We can direct liquidHaskell to the correct argument `i` using a `Decrease` annotation: 
-{-@ Decrease sum' 3 @-}
-\end{code}
-which directs liquidHaskell to check whether the *third*
-argument (i.e., `i`) is decreasing.
-With this hint, liquidHaskell will happily verify that `sum'` is indeed a
-terminating function.
-
-Lexicographic Termination
--------------------------
-
-Lets complicate the things a little bit.
-To do so, lets compute the `sum` of a 2D `Vec`tor:
-
-\begin{code}
-data Vec2D    = V2D [((Int, Int), Val)]
-
-(!!!)         :: Vec2D -> (Int,Int) -> Val
-(V2D a) !!! i = case i `lookup` a of {Just v -> v; _ -> 0}
-\end{code}
-
-Now we write a `sum2D a n m` function that computes the sum of the first 
-`(n+1) (m+1)` elements of `a`
-
-\begin{code}
-{-@ sum2D :: Vec2D -> Nat -> Nat -> Val @-}
-sum2D :: Vec2D -> Int -> Int -> Val
-sum2D a n m = go n m
-  where 
-    {-@ Decrease go 1 2 @-}
-    go 0 0             = 0
-    go i j | j == 0    =  a!!!(i, 0) + go (i-1) m
-           | otherwise =  a!!!(i, j) + go i (j-1)
-\end{code}
-
-Here there is no decreasing argument, 
-if `j>0`, `j` decreases (line `139`), otherwise `i` decreases (line `138`).
-Though, liquidHaskell succeed in verifying that `sum2D` terminates and the reason
-is our `Decrease go 1 2` annotation.
-This annotation informs the tool that the decreasing measure is the
-*lexicographically ordered* pair `[i,j]`. 
-LiquidHaskell will verify that this pair is indeed decreasing: at each
-iteration either `i` decreases (line `138`) or `i` remains the same and `j`
-decreases (line `139`).
-
-\begin{code}An alternative annotation to express the above decreasing measure is:
-       {-@ go :: i:Nat -> j:Nat -> Val / [i, j] @-}
-\end{code}
-where after the type signature for `go` we write the list of lexicographic
-decreasing *expressions*.
-This mechanism, as we shall see, allows us to prove termination in functions
-where the decreasing measure in a *function* of the arguments.
-
-Decreasing expressions
-----------------------
-Back to our `1D` Vector, 
-we now define a function `sumFromTo a lo hi` that sums the elements form `a!!lo`
-to `a!!hi`:
-
-\begin{code}
-{-@ sumFromTo :: Vec -> lo:Nat -> hi:{v:Nat|v>=lo} -> Val @-}
-sumFromTo :: Vec -> Int -> Int ->  Val
-sumFromTo a lo hi = go lo hi
-  where 
-       {-@ go :: lo:Nat -> hi:{v:Nat|v>=lo} -> Val / [hi-lo] @-}
-        go lo hi | lo == hi  =  a!!lo
-                 | otherwise =  a!!lo + go (lo+1) hi
-\end{code}
-
-No argument is decreasing in this function, 
-but still it does terminate, as at each iteration `lo` is increased and
-execution will terminate when `lo` reaches `hi`.
-Here the decreasing measure is the expression `hi-lo`.
-LiquidHaskell has no way to generate such a measure, but,
-if the user generates it, i.e., by annotating `go`'s signature,
-liquidHaskell will happily check that `lo-hi` is indeed a well-founded measure (as it is
-a natural number) that decreases at each iteration.
-
-
-Powered with decreasing expressions and the `Decrease` hint,
-we can prove termination on a great number of functions 
-ranging from 
-ones defined on recursive data structures
-to mutual recursive ones. 
-Of course, we can never prove termination on non-terminating functions that
-naturally exist on haskell source code.
-So, we postpone 
-proving termination on more interesting functions
-and instead lets see how and when you can safely turn termination check off.
-
-Why is Termination Analysis Required
--------------------------------------
-
-Consider a no-terminating function:
-
-\begin{code}
-{-@ foo :: Int -> {v:Int | false} @-}
-foo     :: Int -> Int
-foo n   = foo n
-\end{code}
-
-According to the *partial correctness property*
-the type signature for `foo` means that any
-value `foo` returns will satisfy the result refinement
-`false`. 
-Since `foo` never returns, 
-it can return *none* value, thus it trivially satisfies its
-type.
-
-Now, in an environment where `false` (i.e., `foo`'s result)
-exists, liquidHaskell can prove anything, 
-even the contradiction `0==1`:
-
-\begin{code}
-prop = liquidAssert ((\_ -> 0==1) (foo 0))
-\end{code}
-
-This is totally valid under *eager* evaluation, where
-to execute the assertion one should first compute the argument
-`foo 0` which never returns.
-But, it is not valid under haskell's *lazy* semantics
-where execution ignores the unused argument, and fails.
-
-From the above discussion we see that partial correctness is not enough to
-verify Haskell's lazy code.
-To restore soundness we require *total correctness*, or
-that each function terminates.
-This explains why termination checking is set as default to liquidHaskell (as is
-in many other verifiers, like Coq or Agda.)
-
-Turning off Termination Checking
---------------------------------
-
-Of course, you cannot prove termination of functions like `repeat`
-
-\begin{code}
-{-@ repeat :: a -> [a] @-}
-repeat     :: a -> [a]
-repeat a   = a : repeat a
-\end{code}
-
-Instead, you can mark `repeat` as `Lazy` to disable termination for these
-functions:
-\begin{code}
-{-@ Lazy repeat @-}
-\end{code}
-
-But, be careful!
-By marking a function as `Lazy` *you* also guarantee that *the result type
-cannot contain inconsistencies*.
-In our previous example, liquidHaskell typechecked the unsafe `prop`, just
-because we marked `foo` (who's return type contains inconsistency) as `Lazy`
-\begin{code}
-{-@ Lazy foo @-}
-\end{code}
-
-Even though it is hard to decide if a type can contain inconsistencies,
-trivially *unrefined types* (or types refined to `true`) cannot ever be resolved
-to `false`.
-In other words, it is always safe to mark as `Lazy` functions with unrefined
-result.
-
-\begin{code} Finally, you have the option to totally disable termination checking, using the `no-termination` flag:
-{-@ LIQUID "--no-termination" @-}
-\end{code}
-
-Conclusion
-----------
-
-In this post, 
-
-- We saw how to use liquidHaskell to prove termination of simple recursive
-  functions, and
-
-- We learned why termination is required for sound type checking and when
-  it is safe to deactivate it.
-
-Termination checking may sound a big demand,
-but soon we will see that liquidHaskell is powerful enough to prove
-termination on a great number of functions
diff --git a/docs/blog/todo/text-layout.png b/docs/blog/todo/text-layout.png
deleted file mode 100644
Binary files a/docs/blog/todo/text-layout.png and /dev/null differ
diff --git a/docs/blog/todo/text-lifecycle.png b/docs/blog/todo/text-lifecycle.png
deleted file mode 100644
Binary files a/docs/blog/todo/text-lifecycle.png and /dev/null differ
diff --git a/docs/blog/todo/verifying-efficient-sorting-algorithms.lhs b/docs/blog/todo/verifying-efficient-sorting-algorithms.lhs
deleted file mode 100644
--- a/docs/blog/todo/verifying-efficient-sorting-algorithms.lhs
+++ /dev/null
@@ -1,185 +0,0 @@
----
-layout: post
-title: "Verifing Efficient Sorting Algorithms"
-date: 2013-02-15 16:12
-comments: true
-external-url:
-categories: abstract-refinements
-author: Niki Vazou
-published: false
----
-
-
-In this example, we will see how abstract refinements can be used to verify
-complex sorting algorithms, like the ones implemented in `Data.List`.
-
-\begin{code}
-module GhcSort (sort, sort1, sort2) where
-\end{code}
-
-Once again, we defined the type of sorted lists as:
-
-\begin{code}
-{-@ type SList a = [a]<{v: a | (v >= fld)}> @-}
-\end{code}
-
-and we aim to prove that all sorting functions return a list if this type.
-
-QuickSort
----------
-
-Prelude used to implement the below variant of quicksort, as its sorting algorithm.
-
-First, we define `qsort`:
-\begin{code}
-qsort :: (Ord a) =>  a -> [a] -> [a] -> [a]
-qsort _ []     r = r
-qsort _ [x]    r = x:r
-qsort w (x:xs) r = qpart w x xs [] [] r
-\end{code}
-
-
-In `qsort w ys r`, `r` is a sorted list with values greater than `w` and `ys` is a non-sorted list with values lower or equal to `w`.
-If there is at most one element in `ys`, `qsort` returns the sorted list `ys++r`.
-Otherwise, `ys=(x:xs)`, and to short `ys`, `qsort` choses as _pivot element_ the `x` and calls `qpart`:
-
-\begin{code}
-qpart :: (Ord a) => a -> a -> [a] -> [a] -> [a] -> [a] -> [a]
-qpart w x [] rlt rge r =
-    -- rlt and rge are in reverse order and must be sorted with an
-    -- anti-stable sorting
-    rqsort x rlt (x:rqsort w rge r)
-qpart w x (y:ys) rlt rge r =
-    case compare x y of
-        GT -> qpart w x ys (y:rlt) rge r
-        _  -> qpart w x ys rlt (y:rge) r
-\end{code}
-
-In `qpart w x xs rlt rge r`, `r` is a sorted list with values greater than `w`, all other argument lists are not sorted and their values are less or equal to `w`. Moreover, `rge` (`rlt`) has values greater or equal (less) than the pivot element `x`.
-`qpart` splits `xs` values between `rlt` and `rge` and when there are no more values in `xs` it calls `qsort` on these two lists to recursively sort them.
-But, since `qpart` reverses the order of equal values, it actually calls `rqsort` that behaves similar to `qsort`, apart from reversing once more the order of equal values: 
-
-\begin{code}
--- rqsort is as qsort but anti-stable, i.e. reverses equal elements
-rqsort :: (Ord a) => a -> [a] -> [a] -> [a]
-rqsort _ []     r = r
-rqsort _ [x]    r = x:r
-rqsort w (x:xs) r = rqpart w x xs [] [] r
-
-rqpart :: (Ord a) => a -> a -> [a] -> [a] -> [a] -> [a] -> [a]
-rqpart w x [] rle rgt r =
-    qsort x rle (x:qsort w rgt r)
-rqpart w x (y:ys) rle rgt r =
-    case compare y x of
-        GT -> rqpart w x ys rle (y:rgt) r
-        _  -> rqpart w x ys (y:rle) rgt r
-\end{code}
-
-Finally, to sort a list `ls` we have to call `qsort` with an empty initially sorted list. Also, we have to provide a `w` such that all elements in `ls` are less or equal to `w`. So, we have the sorting function:
-
-\begin{code}
-{-@ sort1 :: (Ord a) => w:a -> ls:[{v:a|v<=w}] -> SList a @-}
-sort1 :: (Ord a) => a -> [a] -> [a]
-sort1 w ls = qsort w ls []
-\end{code}
-
-We note that the `w` that appears in all functions is a ``ghost'' variable that we added so we can prove the correctness of the function. In other words, `w` is not actually used by the functions, but it is needed so that we can prove that always any value in the sorted list `r` is greater than any value in the other lists.
-
-
-
-Mergesort
----------
-In 2002, Ian Lynagh proposed that GHC should use a sorting algorithm with nlogn worst case performance, so he proposed proposed the below mergesort function:
-
-
-\begin{code}
-mergesort :: (Ord a) => [a] -> [a]
-mergesort = mergesort' . map wrap
-
-mergesort' :: (Ord a) => [[a]] -> [a]
-mergesort' [] = []
-mergesort' [xs] = xs
-mergesort' xss = mergesort' (merge_pairs xss)
-
-merge_pairs :: (Ord a) => [[a]] -> [[a]]
-merge_pairs [] = []
-merge_pairs [xs] = [xs]
-merge_pairs (xs:ys:xss) = merge xs ys : merge_pairs xss
-
-merge :: (Ord a) => [a] -> [a] -> [a]
-merge [] ys = ys
-merge xs [] = xs
-merge (x:xs) (y:ys)
- = case x `compare` y of
-        GT -> y : merge (x:xs)   ys
-        _  -> x : merge    xs (y:ys)
-
-wrap :: a -> [a]
-wrap x = [x]
-\end{code}
-
-This is a usual merge sort function: Initially each element of the list is wrapped in an one-element list. So, a list of sorted lists in constructed and applied to `mergesort'`. `mergesort'` is always called on list of sorted lists, so if its argument has zero or one elements it trivially returns a sorted list, otherwise it merges all consequtive pairs, with `merge_pairs`, and recursivelly calls itself. In the same way, `merge_pairs` either returns a trivially sorted list, or it merges two consequtive lists and recursivelly calls itself on the rest. Finally, two sorted lists are merged by `merge` in the expected way.
-
-
-Without any code modifications, our system can prove that all invariants are kept, and ultimately `mergesort` returns a sorted list:
-
-\begin{code}
-{-@ sort2 :: (Ord a) => [a] -> SList a @-}
-sort2 :: (Ord a) => [a] -> [a]
-sort2 = mergesort
-\end{code}
-
-
-Official GHC Sort
------------------
-In 2009 `mergesort` was replaced by the bellow function, which is similar to "A smooth applicative merge sort", as proposed in 1982 by Richard O'Keefe:
-
-First we define `descending a as bs`, that has the invariant tha all values in `as` are greater than `a` and returns a list whose first element is the greatest descending prefix list in `bs`, reversed. 
-
-\begin{code}
-descending a as (b:bs)
-  | a `compare` b == GT = descending b (a:as) bs
-descending a as bs      = (a:as): sequences bs
-\end{code}
-
-Then we define `ascending a as bs`, that has the invariant tha all arguments of `as` are greater than or equal to `a` and returns a list whose first element is the greatest ascending prefix list in `bs`. To avoid reversing this sublist, `as` is not a list, but a function that every time stores the beggining of the lists and expects its ending.
-
-\begin{code}  
-ascending a as (b:bs)
-  | a `compare` b /= GT = ascending b (\ys -> as (a:ys)) bs
-ascending a as bs       = as [a]: sequences bs
-\end{code}
-
-Since, an arbitrary list can be split in consecutive ascending or descending sublists we define the function `sequences ls` that recursively uses `ascending` and `descending` to split `ls` in these sublists.
-
-\begin{code}
-sequences (a:b:xs)
-  | a `compare` b == GT = descending b [a]  xs
-  | otherwise           = ascending  b (a:) xs
-sequences [x] = [[x]]
-sequences []  = [[]]
-\end{code}
-
-Then, we define a `mergeAll` function that merges sorted lists: 
-
-\begin{code}
-mergeAll [x] = x
-mergeAll xs  = mergeAll (mergePairs xs)
-
-mergePairs (a:b:xs) = merge a b: mergePairs xs
-mergePairs [x]      = [x]
-mergePairs []       = []
-\end{code}
-
-Finally, we define the sorting function that applies `mergeAll` to the result of `sequences` applied in the initial list.
-
-\begin{code}
-{-@ sort :: (Ord a) => [a] -> SList a @-}
-sort :: (Ord a) => [a] -> [a]
-sort = mergeAll . sequences
-\end{code}
-
-Our system can again prove that all the above invariants hold, and `sort` produces a sorted list.
-
-We have to note that the initial ghc functions take comparing function as an argument. But to prove sortedness, we have to transfer the information we get from comparison to the type system. So we actually modified all the above code, by inlining the `compare` function instead of passing it as an argument.
-
diff --git a/docs/language/Makefile b/docs/language/Makefile
deleted file mode 100644
--- a/docs/language/Makefile
+++ /dev/null
@@ -1,55 +0,0 @@
-TARGET= main
-
-TECH=main
-URL=nvazou@goto.ucsd.edu:~/public_html/lazytechreport.pdf
-
-STY = liquidHaskell.sty commands.sty
-TEX = main.tex language.tex typeInference.tex 
-BIB = sw.bib
-CLS = sigplanconf.cls
-SRCFILES = Makefile ${TEX} ${STY} ${CLS}
-
-
-all: ${TEX}
-	pdflatex main
-	bibtex main
-	pdflatex main
-	bibtex main
-	pdflatex main
-
-tech: ${SRCFILES}
-	cp $(SHOWPROOFS) $(PROOFCNF)
-	pdflatex ${TECH}
-	bibtex ${TECH}
-	pdflatex ${TECH}
-	bibtex ${TECH}
-	pdflatex ${TECH}
-	cp $(HIDEPROOFS) $(PROOFCNF)
-
-
-uploadtech: ${TECH}.pdf
-	scp ${TECH}.pdf ${URL}
-withproofs:
-	cp $(SHOWPROOFS) $(PROOFCNF)
-
-noproofs:
-	cp $(HIDEPROOFS) $(PROOFCNF)
-
-clean:
-	$(RM) *.log *.aux *.ps *.dvi *.bbl *.blg *.bak *.fdb_latexmk *.out *~ proofs/*.log
-
-reallyclean: clean
-	$(RM) *.ps *.pdf
-
-distclean: reallyclean
-
-pdfshow: $(TARGET).pdf
-	xpdf $(TARGET).pdf
-
-acroshow: $(TARGET).pdf
-	acroread $(TARGET).pdf
-
-pack: reallyclean
-	tar cvfz liquidHaskell_tex.tar.gz ${SRCFILES}
-
-PHONY : ps all clean reallyclean distclean
diff --git a/docs/language/commands.sty b/docs/language/commands.sty
deleted file mode 100644
--- a/docs/language/commands.sty
+++ /dev/null
@@ -1,41 +0,0 @@
-\usepackage[usenames,dvipsnames]{xcolor}
-
-%% \def\mynote#1{{\sf $\clubsuit$ #1$\clubsuit$}}
-%% \def\RJ#1{\textcolor{Red}{\sf RJ:$\clubsuit$ #1$\clubsuit$}}
-%% \def\NV#1{\textcolor{Plum}{\sf NV:$\clubsuit$ #1$\clubsuit$}}
-\def\NV#1{\textcolor{Green}{\sf NV:$\clubsuit$ #1$\clubsuit$}}
-%% \def\ES#1{\textcolor{Blue}{\sf ES:$\clubsuit$ #1$\clubsuit$}}
-
-
-\def\myex#1{\smallskip\noindent{\emphbf{Example: {#1}.}}}
-\newcommand\spara[1]{\smallskip\noindent\textbf{\emph{#1}}\xspace}
-\newcommand\mypara[1]{\spara{#1}}
-%\def\mypara#1{\smallskip\noindent\textbf{#1.}\ }
-
-
-
-\newcommand\etc{\textit{etc.}\xspace}
-\newcommand\eg{\textit{e.g.}\xspace}
-\newcommand\ie{\textit{i.e.}\xspace}
-\newcommand\ala{\textit{a la}\xspace}
-\newcommand\etal{\textit{et al.}\xspace}
-
-\def\emphbf#1{\textbf{\emph{#1}}}
-\def\spmid{\ \mid \ }
-
-\def\colon{\ensuremath{\text{:}}}
-
-\newcommand{\relDescription}[1]{\ensuremath{\textrm{\textbf{#1}}}}
-\newcommand{\judgementHead}[2]{\ensuremath{\relDescription{#1}\hfill\fbox{#2}}}
-\newcommand{\judgementHeadNameOnly}[1]{\ensuremath{\relDescription{#1}\hfill}}
-
-\newenvironment{sitemize}{\begin{list}
-   {$\bullet$}
-   {\setlength{\topsep}{0pt}
-    \setlength{\itemsep}{0pt}
-    \setlength{\leftmargin}{15pt}
-    }
-  }
-  {\end{list}}
-
-
diff --git a/docs/language/haskellListings.tex b/docs/language/haskellListings.tex
deleted file mode 100644
--- a/docs/language/haskellListings.tex
+++ /dev/null
@@ -1,113 +0,0 @@
-\usepackage{listings}
-
-% uncomment next line to restore colors
-% \def\withcolor{}
-
-\ifdefined\withcolor
-	\definecolor{haskellblue}{rgb}{0.0, 0.0, 1.0}
-	\definecolor{haskellblue}{rgb}{1.0, 0.0, 0.0}
-	\definecolor{gray_ulisses}{gray}{0.55}
-	\definecolor{castanho_ulisses}{rgb}{0.71,0.33,0.14}
-	\definecolor{preto_ulisses}{rgb}{0.41,0.20,0.04}
-	\definecolor{green_ulisses}{rgb}{0.0,0.4,0.0}
-\else
-	\definecolor{haskellblue}{gray}{0.1}
-	\definecolor{haskellred}{gray}{0.1}
-	\definecolor{gray_ulisses}{gray}{0.1}
-	\definecolor{castanho_ulisses}{gray}{0.1}
-	\definecolor{preto_ulisses}{gray}{0.1}
-	\definecolor{green_ulisses}{gray}{0.1}
-\fi
-
-
-\def\codesize{\normalsize}
-
-\lstdefinelanguage{HaskellUlisses} {
-	basicstyle=\ttfamily\codesize,
-	sensitive=true,
-	morecomment=[l][\color{gray_ulisses}\ttfamily\codesize]{--},
-	%% morecomment=[s][\color{gray_ulisses}\ttfamily\codesize]{\{-}{-\}},
-	morestring=[b]",
-	stringstyle=\color{haskellred},
-	showstringspaces=false,
-	numberstyle=\codesize,
-	numberblanklines=true,
-	showspaces=false,
-	breaklines=true,
-	showtabs=false,
-	emph=
-	{[1]
-		FilePath,IOError,abs,acos,acosh,all,and,any,appendFile,approxRational,asTypeOf,asin,
-		asinh,atan,atan2,atanh,basicIORun,break,catch,ceiling,chr,compare,concat,concatMap,
-		const,cos,cosh,curry,cycle,decodeFloat,denominator,digitToInt,div,divMod,drop,
-		dropWhile,either,elem,encodeFloat,enumFrom,enumFromThen,enumFromThenTo,enumFromTo,
-		error,even,exp,exponent,fail,filter,flip,floatDigits,floatRadix,floatRange,floor,
-		fmap,foldl,foldl1,foldr,foldr1,fromDouble,fromEnum,fromInt,fromInteger,
-		fromRational,fst,gcd,getChar,getContents,getLine,head,id,inRange,index,init,intToDigit,
-		interact,ioError,isAlpha,isAlphaNum,isAscii,isControl,isDenormalized,isDigit,isHexDigit,
-		isIEEE,isInfinite,isLower,isNaN,isNegativeZero,isOctDigit,isPrint,isSpace,isUpper,iterate,
-		last,lcm,length,lex,lexDigits,lexLitChar,lines,log,logBase,lookup,map,mapM,mapM_,max,
-		maxBound,maximum,maybe,min,minBound,minimum,mod,negate,not,notElem,numerator,odd,
-		or,pi,pred,primExitWith,print,product,properFraction,putChar,putStr,putStrLn,quot,
-		quotRem,range,rangeSize,read,readDec,readFile,readFloat,readHex,readIO,readInt,readList,readLitChar,
-		readLn,readOct,readParen,readSigned,reads,readsPrec,realToFrac,recip,rem,repeat,replicate,
-		reverse,round,scaleFloat,scanl,scanl1,scanr,scanr1,seq,sequence,sequence_,show,showChar,showInt,
-		showList,showLitChar,showParen,showSigned,showString,shows,showsPrec,significand,signum,sin,
-		sinh,snd,span,splitAt,sqrt,subtract,succ,sum,tail,take,takeWhile,tan,tanh,threadToIOResult,toEnum,
-		toInt,toInteger,toLower,toRational,toUpper,truncate,uncurry,undefined,unlines,until,unwords,unzip,
-		unzip3,userError,words,writeFile,zip,zip3,zipWith,zipWith3,listArray,doParse,for,initTo,
-        maxEvens,create,get,set,initialize,idVec,fastFib,fibMemo,
-        insert,union,split,size,fromList,initUpto,trim,quickSort,insertSort,append,upperCase,
-        copy, group, doDownLoop, mapAccumR, peekByteOff,
-        pokeByteOff,spanByte, 
-        good, bad, foo, explode, 
-        fib, ack, 
-        tLen,
-        memcpy,writeChar,unsafeWrite,unsafeFreeze,
-        singleton
-	},
-	emphstyle={[1]\color{haskellblue}},
-	emph=
-	{[2]
-		Bool,Char,Double,Either,Float,IO,Integer,Int,Maybe,Ordering,Rational,Ratio,ReadS,ShowS,String,
-		Word8,Nat,NonZero,Nat64,Text,ByteString,ByteStringSZ,ByteStringN,
-        Ptr,ForeignPtr,CSize
-        InPacket,Tree,Prop,TreeEq,TreeLt,Vec,
-        NullTerm,IncrList,DecrList,UniqList,BST,MinHeap,MaxHeap,
-        PtrN,ByteStringN,ByteStringEq,VO,ByteStringsEq,ByteStringNE
-	},
-	emphstyle={[2]\color{castanho_ulisses}},
-	emph=
-	{[3]
-		case,class,data,deriving,do,else,if,import,in,infixl,infixr,instance,let,
-		module,measure,predicate,of,primitive,then,refinement,type,where
-	},
-	emphstyle={[3]\color{preto_ulisses}\textbf},
-	emph=
-	{[4]
-		quot,rem,div,mod,elem,notElem,seq
-	},
-	emphstyle={[4]\color{castanho_ulisses}\textbf},
-	emph=
-	{[5]
-		PS,Tip,Node,EQ,False,GT,Just,LT,Left,Nothing,Right,True,Show,Eq,Ord,Num
-	},
-	emphstyle={[5]\color{green_ulisses}}
-}
-
-%%%ORIG
-%%%\lstnewenvironment{code}
-%%%{\textbf{Haskell Code} \hspace{1cm} \hrulefill \lstset{language=HaskellUlisses}}
-%%%{\hrule\smallskip}
-
-%V1
-%\lstnewenvironment{code}
-%{\smallskip \lstset{language=HaskellUlisses}}
-%{\smallskip}
-
-\lstnewenvironment{code}
-{\lstset{language=HaskellUlisses}}
-{}
-
-\lstMakeShortInline[language=HaskellUlisses]@
-
diff --git a/docs/language/language.tex b/docs/language/language.tex
deleted file mode 100644
--- a/docs/language/language.tex
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-\begin{figure}[t!]
-\centering
-$$
-\begin{array}{rrcl}
-\emphbf{Basic Types} \quad
-  & b 
-  & ::=
-  & \alpha
-  \spmid \tfun{x}{\tau}{\tau}
-  \spmid \tcon{C}{\bar{\tau}}{\bar{\ref}}
-  \spmid \tapp{\tau}{\tau}
-  \\[0.05in]
-
-\emphbf{Types} \quad
-  & \tau 
-  & ::=
-  & \tref{v}{b}{\ref}
-  \spmid \tcl{Cl}{\bar{\tau}}
-  \\[0.05in]
-
-\emphbf{Abstract Refinements} \quad
-  & \pi
-  & ::=
-  & \forall \left\langle p \colon \tau \right\rangle . \pi 
-  \spmid \tau
-  \\[0.05in]
-
-\emphbf{Type Schemata} \quad
-  & \sigma
-  & ::=
-  & \tall{\alpha}{\sigma} 
-  \spmid \pi
-  \\[0.05in]
-
-\emphbf{Refinements} \quad
-  & \ref
-  & ::=
-  & (\aref,\cref)
-  \\[0.05in]
-
-\emphbf{Abstract Refinements} \quad
-  & \aref
-  & ::= 
-  &  [] \spmid p\ \bar{e}, \aref
-  \\[0.05in]
-
-\emphbf{Concrete Refinements} \quad
-  & \cref
-  & ::=
-  &  k \sub{x}{e}
-  \spmid \pr
-  \spmid \cref \land \cref
-  \\[0.05in]
-
-\emphbf{Predicates} \quad
-  & \pr
-  & ::=
-  &  \ptrue \spmid \pfalse 
-  \spmid \pand{\bar{\pr}}
-  \spmid \por{\bar{\pr}}
-  \spmid \pnot{\pr}
-  \spmid \pimp{\pr}{\pr}
-  \spmid \piff{\pr}{\pr}
-  \\ && \spmid &  e 
-  \spmid e \left[= \mid \neq \mid > \mid < \mid \geq \mid \leq \right] e
-  \\[0.05in]
-
-\emphbf{Expressions} \quad
-  & e
-  & ::=
-  &  c \spmid n \spmid x \spmid \eapp{c}{\bar{e}} \spmid \eif{\pr}{e}{e} 
-  \spmid e \left[+ \mid - \mid * \mid / \mid \% \right] e 
-
-
-  \end{array}
-$$
-\caption{Syntax of \corelan}
-\label{fig:syntax}
-\end{figure}
diff --git a/docs/language/liquidHaskell.sty b/docs/language/liquidHaskell.sty
deleted file mode 100644
--- a/docs/language/liquidHaskell.sty
+++ /dev/null
@@ -1,199 +0,0 @@
-\newcommand{\C}{\textsc{C}\xspace}
-\newcommand{\toolname}{\textsc{LiquidHaskell}\xspace}
-%\newcommand{\bytestring}{\textsc{bytestring}\xspace}
-%\newcommand{\libtext}{\textsc{text}\xspace}
-\newcommand{\bytestring}{\texttt{Bytestring}\xspace}
-\newcommand{\libtext}{\texttt{Text}\xspace}
-
-%% 
-
-\newcommand{\CRASH}{\ensuremath{\mathtt{crash}}\xspace}
-\newcommand{\defeq}{\ \doteq\ }
-\providecommand{\dbrkts}[1]{[\![#1]\!]}
-%\newcommand\embed[1]{\dbrkts{#1}}
-\newcommand\embed[1]{\dbrkts{#1}}
-\newcommand\R{\ensuremath{\mathsf{Fin}\xspace}}
-\newcommand\FORCE[1]{#1 \in \R}
-\newcommand\NOFORCE[1]{#1 \not \in \R}
-
-\newcommand\corelan{$\lambda_\downarrow$\xspace}
-\newcommand\ttbind[2]{\ensuremath{\mathtt{#1}:\mathtt{#2}}}
-\newcommand\tbind[2]{{#1} \colon {#2}}
-\newcommand\ttref[1]{\ensuremath{\mathtt{\{#1\}}}}
-\newcommand\ttreft[3]{\ttref{\tbind{#1}{#2}\mid {#3}}}
-
-\newcommand\subt[2]{\ensuremath{#1 \preceq #2}}
-\newcommand\subtref[2]{\subt{\ttref{#1}}{\ttref{#2}}}
-
-\newcommand\hastypet[3]{\ensuremath{#1 \vdash \tbind{#2}{#3}}}
-\newcommand\hastype[3]{\ensuremath{#1 \vdash #2 : #3}}
-
-\newcommand\issubtype[3]{\ensuremath{#1 \vdash #2 \preceq #3}}
-\newcommand\iswellformed[2]{\ensuremath{#1 \vdash #2}}
-\newcommand\wellformedsub[2]{\ensuremath{#1 \models #2}}
-\newcommand\ismodeled[2]{\ensuremath{#1 \models #2}}
-\newcommand\wfmodels[2]{\ismodeled{#1}{#2}}
-
-\newcommand\stepsym{\hookrightarrow}
-\newcommand\stepv{\stepsym_v}
-\newcommand\stepn{\stepsym_n}
-\newcommand\stepo{\stepsym_o}
-
-\newcommand\eval[2]{\evalR{\stepsym}{#1}{#2}}
-\newcommand\evalR[3]{\ensuremath{#2 #1 #3}}
-\newcommand\evalGen[4]{\evalR{\stepsym_{#3}^{#4}}{#1}{#2}}
-
-\newcommand\evalv[2]{\evalGen{#1}{#2}{v}{}}
-\newcommand\evaln[2]{\evalGen{#1}{#2}{n}{}}
-\newcommand\evalo[2]{\evalGen{#1}{#2}{o}{}}
-\newcommand\evalvs[2]{\evalGen{#1}{#2}{v}{*}}
-\newcommand\evalns[2]{\evalGen{#1}{#2}{n}{*}}
-\newcommand\evalos[2]{\evalGen{#1}{#2}{o}{*}}
-
-% termination eval
-\newcommand\evalt[3]{\evalGen{#1}{#2}{o}{#3}}
-\newcommand\evalts[2]{\evalGen{#1}{#2}{o}{*}}
-
-
-
-
-
-
-\newcommand\sub[2]{\ensuremath{\left[#2/#1\right]}}
-%\newcommand\sub[2]{\ensuremath{\left[#1 \mapsto #2\right]}}
-\newcommand{\SUBST}[3]{{#1}\sub{#2}{#3}}
-
-\newcommand\shape{\ensuremath{\text{shape}}\xspace}
-\newcommand\termincon[1]{\ensuremath\textcolor{Red}{#1}}
-
-%TT
-\newcommand\Env{\Gamma}
-
-\newcommand\ttack{\mathtt{ack}}
-
-\newcommand\tttLen{\mathtt{tLen}}
-\newcommand\ttsz{\mathtt{sz}}
-\newcommand\ttt{\mathtt{t}}
-\newcommand\tttp{\mathtt{t'}}
-\newcommand\ttb{\mathtt{b}}
-\newcommand\tta{\mathtt{a}}
-\newcommand\ttm{\mathtt{m}}
-\newcommand\ttmp{\mathtt{m'}}
-\newcommand\ttnp{\mathtt{n'}}
-\newcommand\ttn{\mathtt{n}}
-\newcommand\ttp{\mathtt{p}}
-\newcommand\ttv{\mathtt{v}}
-\newcommand\ttx{\mathtt{x}}
-\newcommand\tty{\mathtt{y}}
-\newcommand\ttz{\mathtt{z}}
-\newcommand\tte{\mathtt{e}}
-\newcommand\ttf{\mathtt{e}}
-\newcommand\ttg{\mathtt{e}}
-\newcommand\ttInt{\mathtt{Int}}
-\newcommand\ttNonzero{\mathtt{NonZero}}
-\newcommand\ttNat{\mathtt{Nat}}
-\newcommand\ttfib{\mathtt{fib}}
-
-% MISC 
-
-\newcommand\smtvalid[1]{\ensuremath{\mathsf{SmtValid}(#1)}}
-\newcommand\strict{\ensuremath{\mathsf{Trivial}}}
-\newcommand\constty[1]{\ensuremath{\mathsf{Ty}(#1)}}
-\newcommand\serious{serious\xspace}
-\newcommand\trivial{trivial\xspace}
-
-
-% Expressions
-\newcommand\efun[3]{\ensuremath{\lambda #1. #3}}
-\newcommand\eapp[2]{\ensuremath{#1 \ #2}}
-\newcommand\eif[3]{\ensuremath{\mathtt{if}\ #1\ \mathtt{then}\ #2\ \mathtt{else}\ #3}}
-\newcommand\elet[3]{\ensuremath{\mathtt{let}\ #1 = #2\ \mathtt{in}\ #3}}
-\newcommand\erec[3]{\ensuremath{\mu #1.\lambda #2. #3}}
-\newcommand\etabs[2]{\ensuremath{\left[\Lambda #1\right] #2}}
-\newcommand\etapp[2]{\ensuremath{#1 \left[ #2 \right]}}
-\newcommand\etrue{\ensuremath{\mathtt{true}}\xspace}
-\newcommand\efalse{\ensuremath{\mathtt{false}}\xspace}
-\newcommand\eletsub[2]{\ensuremath{#1 #2}}
-
-%Labels
-\newcommand\ltop{\ensuremath{\downarrow}\xspace}
-\newcommand\lbot{\ensuremath{\uparrow}\xspace}
-
-% Types
-\newcommand\tbool{\ensuremath{\mathtt{bool}}\xspace}
-\newcommand\tint{\ensuremath{\mathtt{nat}}\xspace}
-\newcommand\tref[4]{\ensuremath{\{ \tbind{#1}{#2^{#3}} \mid #4 \}}}
-\newcommand\tfun[3]{\ensuremath{\tbind{#1}{#2} \rightarrow #3}}
-\newcommand\tabs[2]{\ensuremath{\forall #1 . #2}}
-
-%Rule Names
-\newcommand\rulename[1]{\textsc{#1}\xspace}
-\newcommand{\rtsub}{\rulename{T-Sub}}
-\newcommand{\rtvara}{\rulename{T-Var-Base}}
-\newcommand{\rtvarb}{\rulename{T-Var}}
-\newcommand{\rtconst}{\rulename{T-Con}}
-\newcommand{\rtfun}{\rulename{T-Fun}}
-\newcommand{\rtapp}{\rulename{T-App}}
-\newcommand{\rtappa}{\rulename{T-App-$\lbot$}}
-\newcommand{\rtappb}{\rulename{T-App-$\ltop$}}
-\newcommand{\rtif}{\rulename{T-If}}
-\newcommand{\rtlet}{\rulename{T-Let}}
-\newcommand{\rtgen}{\rulename{T-Gen}}
-\newcommand{\rtinst}{\rulename{T-Inst}}
-\newcommand{\rtrec}{\rulename{T-Rec}}
-\newcommand{\rtrecs}{\rulename{T-Rec-$\lbot$}}
-\newcommand{\rtrect}{\rulename{T-Rec-$\ltop$}}
-%% \newcommand{\rtrecs}{\rulename{TR-Ser}}
-%% \newcommand{\rtrect}{\rulename{TR-Tr}}
-
-\newcommand{\rsbasetop}{\rulename{$\preceq$-Base-$\ltop$}}
-\newcommand{\rsbasebot}{\rulename{$\preceq$-Base-$\lbot$}}
-\newcommand{\rsvar}{\rulename{$\preceq$-Var}}
-\newcommand{\rsfun}{\rulename{$\preceq$-Fun}}
-\newcommand{\rspoly}{\rulename{$\preceq$-Poly}}
-
-\newcommand{\rwbasetop}{\rulename{WF-Base-$\ltop$}}
-\newcommand{\rwbasebot}{\rulename{WF-Base-$\lbot$}}
-\newcommand{\rwbase}{\NV{TODO}}
-\newcommand{\rwvar}{\rulename{WF-Var}}
-\newcommand{\rwfun}{\rulename{WF-Fun}}
-\newcommand{\rwpoly}{\rulename{WF-Poly}}
-
-\newcommand{\rwsempty}{\rulename{WS-Empty}}
-\newcommand{\rwsext}{\rulename{WS-Ext}}
-\newcommand{\rwsgxt}{\rulename{WS-Gxt}}
-
-
-\newcommand{\reapp}{\rulename{E-AppL}}
-\newcommand{\reappb}{\rulename{E-App}}
-\newcommand{\reappc}{\rulename{E-AppT}}
-\newcommand{\reappd}{\rulename{E-AppTB}}
-\newcommand{\reconsta}{\rulename{E-ConstA}}
-\newcommand{\reconstb}{\rulename{E-Con}}
-\newcommand{\reif}{\rulename{E-If}}
-\newcommand{\reiftrue}{\rulename{E-If-True}}
-\newcommand{\reiffalse}{\rulename{E-If-False}}
-\newcommand{\rereca}{\rulename{E-Rec}}
-\newcommand{\rerecb}{\NV{UNIFIED}}
-\newcommand{\rerecc}{\rulename{E-RecC}}
-\newcommand{\reinst}{\NV{TODO}}
-\newcommand{\reinsta}{\rulename{E-InstA}}
-\newcommand{\reinstb}{\rulename{E-InstB}}
-\newcommand{\reinstc}{\rulename{E-InstC}}
-\newcommand{\releta}{\rulename{E-Let}}
-\newcommand{\reletb}{\rulename{E-LetX}}
-\newcommand{\recntx}{\rulename{E-Com}}
-\newcommand{\reletc}{\rulename{E-LetTB}}
-
-%%%%%%%% TABLE
-
-\newcommand\bfModule{\textbf{Module}\xspace}
-\newcommand\bfAnnot{\textbf{Annot}\xspace}
-\newcommand\bfQualif{\textbf{Qualif}\xspace}
-\newcommand\bfLOC{\textbf{LOC}\xspace}
-\newcommand\bfSpecs{\textbf{Specs}\xspace}
-\newcommand\bfLetRec{\textbf{Rec}\xspace}
-\newcommand\bfMutRec{\textbf{Mut}\xspace}
-\newcommand\bfHint{\textbf{Hint}\xspace}
-\newcommand\bfWitness{\textbf{Wit}\xspace}
-
diff --git a/docs/language/main.pdf b/docs/language/main.pdf
deleted file mode 100644
Binary files a/docs/language/main.pdf and /dev/null differ
diff --git a/docs/language/main.tex b/docs/language/main.tex
deleted file mode 100644
--- a/docs/language/main.tex
+++ /dev/null
@@ -1,110 +0,0 @@
-\documentclass[10pt,a4paper]{article}
-
-%\documentclass{llncs}
-%\documentclass[nocopyrightspace]{sigplanconf}
-%%% \usepackage[top=1.5cm,bottom=1.5cm,left=2.3cm,right=2cm]{geometry}
-
-\pagestyle{plain}
-\usepackage{times}
-%\usepackage[nocompress]{cite} % AR: comment this out if you wish hyperrefs 
-\usepackage{hyperref}
-
-\usepackage{amsmath,amssymb, latexsym}
-
-\usepackage{amsmath}
-\usepackage{amsthm}
-
-\newtheorem{lemma}{Lemma}
-\newtheorem{theorem}{Theorem}
-\newtheorem*{theorem*}{Theorem}
-\newtheorem{definition}{Definition}
-\newtheorem*{lemma*}{Lemma}
-
-\usepackage{amsfonts}
-\usepackage{amssymb}
-
-\usepackage{commands}
-\usepackage{liquidHaskell}
-\usepackage[inference]{semantic}
-
-\usepackage{enumerate}
-\def\url{}
-\usepackage{xspace}
-\usepackage{epsfig}
-\usepackage{booktabs}
-\usepackage{listings}
-\usepackage{comment}
-\usepackage{ifthen}
-
-\newcommand{\isTechReport}{false} % true or false
-\newcommand{\includeProof}[1]{
-  \ifthenelse{\equal{\isTechReport}{true}}{
-    #1
-  }{
-  }
-}
-
-%%%%%\usepackage{fancyvrb}
-%%%%%\DefineVerbatimEnvironment{code}{Verbatim}{fontsize=\small}
-%%%%%\DefineVerbatimEnvironment{example}{Verbatim}{fontsize=\small}
-%%%%%\newcommand{\ignore}[1]{}
-
-% command to end a proof or definition:
-%\def\qed{\rule{0.4em}{1.4ex}}
-\def\qed{\hfill$\Box$}
-
-% space at the beginning of an environment:
-\def\@envspa{\hspace{0.3em}}
-\def\@sa{\hspace{-0.2em}}
-\def\@sb{\hspace{0.5em}}
-\def\@sc{\hspace{-0.1em}}
-
-\def\sk{\smallskip}		% space before and after theorems
-
-\newtheorem{notation}{Notation}{\itshape}{}
-\newtheorem{invariant}{Invariant}
-\newtheorem*{hypothesis}{Hypothesis}
-
-\input{haskellListings}
-
-
-\begin{document}
-%% BEGIN MOVE 
-% these are mostly redefined commands, move them to commands
-
-\renewcommand\tref[3]{\ensuremath{\{#1 : #2 \mid #3 \}}}
-\renewcommand\tfun[3]{\ensuremath{#1 : #2 \rightarrow #3}}
-\newcommand\tcon[3]{\ensuremath{#1 \ #2 \ #3}}
-\newcommand\tapp[2]{\ensuremath{#1 \ #2}}
-\newcommand\tall[2]{\ensuremath{ \forall #1 .  #2}}
-\newcommand\tcl[2]{\ensuremath{#1 \ #2}}
-\renewcommand\ref{r}
-\newcommand\pr{pr}
-\newcommand\aref{ar}
-\newcommand\cref{cr}
-
-\newcommand\ptrue{\ensuremath{true}}
-\newcommand\pfalse{\ensuremath{false}}
-\newcommand\pand[1]{\ensuremath{\bigwedge \ #1}}
-\newcommand\por[1]{\ensuremath{\bigvee \ #1}}
-\newcommand\pnot[1]{\ensuremath{\lnot #1}}
-\newcommand\pimp[2]{\ensuremath{#1 \Rightarrow #2}}
-\newcommand\piff[2]{\ensuremath{#1 \Leftrightarrow #2}}
-
-\renewcommand\eapp[2]{\ensuremath{#1 \ #2}}
-\renewcommand\eif[3]{\ensuremath{if \ #1 \ then \ #2 \ else \ #3}}
-\renewcommand\corelan{\texttt{liquidHaskell}}
-
-%% END MOVE
-
-% \maketitle
-
-\input{language}
-\input{typeInference}
-
-% {
-% \bibliographystyle{plain}
-% \bibliography{sw}
-% }
-
-\end{document}
diff --git a/docs/language/typeInference.tex b/docs/language/typeInference.tex
deleted file mode 100644
--- a/docs/language/typeInference.tex
+++ /dev/null
@@ -1,325 +0,0 @@
-\renewcommand\hastype[4]{\ensuremath{#1 \vdash #2 \uparrow #3 ; #4}}
-\newcommand\checktype[4]{\ensuremath{#1 \vdash #2 \downarrow #3 ; #4}}
-\newcommand\hastypealt[5]{\ensuremath{#1 ; #2 \downarrow #3 \colon #4 ; #5}}
-\newcommand\ty[1]{\ensuremath{ty(#1)}}
-
-\NV{TODO : \\
-1. Add termination checker.}
-
-\section*{Constraint Generation (without the termination checker)}
-
-\hfill\textbf{Type synthesis}\qquad\mbox{\hastype{\Gamma}{e}{\sigma}{C}}
-
-
-$$
-\inference{
-	(x, \tref{v}{b}{e}) \in \Gamma
-}{
-	\hastype{\Gamma}{x}{\tref{v}{b}{e \land x = v}}{\emptyset}
-}
-\qquad
-\inference{
-	(x, \sigma \in \Gamma) &&
-	\sigma \neq \tref{v}{b}{e}
-}{
-	\hastype{\Gamma}{x}{\sigma}{\emptyset}
-}
-$$
-
-$$
-\inference{
-}{
-	\hastype{\Gamma}{c}{\tref{v}{\ty{c}}{v = c}}{\emptyset}
-}
-$$
-
-\newcommand\wfc[2]{\ensuremath{\texttt{WfC}\ #1 \ #2}}
-\newcommand\subc[3]{\ensuremath{\texttt{SubC}\ #1 \ #2\ #3}}
-\newcommand\freshty[1]{\ensuremath{freshTy(#1)}}
-\newcommand\truety[1]{\ensuremath{trueTy(#1)}}
-\newcommand\truetyExpr[1]{\ensuremath{trueTyExpr(#1)}}
-\newcommand\isGenericty[2]{\ensuremath{isGeneric(#1, #2)}}
-\newcommand\freshPredsty[1]{\ensuremath{freshPreds(\Gamma, #1)}}
-\newcommand\varTemplate[1]{\ensuremath{varTemplate(#1)}}
-\newcommand\dataconty[2]{\ensuremath{dataConTy(#1, #2)}}
-
-$$
-\inference{
-	\hastype{\Gamma}{e}{\tall{\alpha}{\sigma}}{C} \\
-	\tau' = if\ \isGenericty{\alpha}{\sigma}\ then\ \freshty{\tau}\ else\ \truety{\tau}
-}{
-	\hastype{\Gamma}{\etapp{e}{\tau}}{\sigma\sub{\alpha}{\tau'}}{(\wfc{\Gamma}{\tau'}, C)}
-}
-$$
-
-$$
-\inference{
-	\hastype{\Gamma}{e_1}{\tau_1}{C_1} &&
-	\checktype{\Gamma}{e_2}{\tau_x}{C_2} &&\\
-	(\tau_1', C_p) = \freshPredsty{\tau_1} &&
-	\tfun{x}{\tau_x}{\tau} = \tau_1'
-}{
-	\hastype{\Gamma}{\eapp{e_1}{e_2}}{\tau\sub{x}{e_2}}
-			{(C_1, C_2, C_p)}
-}
-$$
-
-
-$$
-\inference{
-	\hastype{\Gamma}{e}{\sigma}{C}
-}{
-	\hastype{\Gamma}{\etabs{\alpha}{e}}{\tall{\alpha}{\sigma}}{C}
-}
-$$
-
-$$
-\inference{
-	\hastype{\Gamma, x : \tau_x}{e}{\tau}{C} &&
-	t_x = freshty(varType\ x)
-}{
-	\hastype{\Gamma}{(\efun{x}{}{e})}{(\tfun{x}{\tau_x}{\tau})}{(\wfc{\Gamma}{\tau_x}, C)}
-}
-$$
-
-$$
-\inference{
-	\hastype{\Gamma}{e}{\sigma}{C}
-}{
-	\hastype{\Gamma}{Tick\ t\ e}{\sigma}{C}
-}
-$$
-
-$$
-\inference{
-}{
-	\hastype{\Gamma}{Cast\ e\ c}{\truetyExpr{Cast\ e\ c}}{\emptyset}
-}
-$$
-
-$$
-\inference{
-}{
-	\hastype{\Gamma}{Coercion\ c}{\truetyExpr{Coercion\ c}}{\emptyset}
-}
-$$
-
-$$
-\inference{
-	\sigma = \freshty{e} &&
-	\checktype{\Gamma}{\elet{{x_i}}{e_{x_i}}{e}}{\sigma}{C}
-}{
-	\hastype{\Gamma}{\elet{{x_i}}{e_{x_i}}{e}}{\sigma}{(\wfc \Gamma \sigma, C)}
-}
-$$
-
-$$
-\inference{
-	\sigma = \freshty{e} &&
-	\checktype{\Gamma}{Case\ e\ x\ alt_i}{\sigma}{C}
-}{
-	\hastype{\Gamma}{Case\ e\ x\ alt_i}{\sigma}{(\wfc \Gamma \sigma, C)}
-}
-$$
-
-
-
-\hfill\textbf{Type checking}\qquad\mbox{\checktype{\Gamma}{e}{\sigma}{C}}
-
-
-
-
-%% This rule allows more general types for let binds.
-%% Eg. (tests/pos/meas1.hs)
-%% goo x = [x] :: a -> {v:[a] | ((null v) <=> false)} -- by default
-%% this rule also allows 
-%% goo :: a -> {v:[a] | ((len v) > 0)}
-
-\newcommand\userType[1]{\ensuremath{userType(#1)}}
-
-$$
-\inference{
-	\tau_x  = userTypes(x) &&
-	\checktype{\Gamma}{e_x}{\tau_x}{C_x} \\&&
-	\checktype{\Gamma, x\colon\tau_x}{e}{\sigma}{C}
-}{
-	\checktype{\Gamma}{\elet{x}{e_x}{e}}{\sigma}{(C_x,C)}
-}
-$$
-
-$$
-\inference{
-	x \notin userTypes &&
-	\hastype{\Gamma}{e_x}{\tau_x}{C_x} \\&&
-	\checktype{\Gamma, x\colon\tau_x}{e}{\sigma}{C}
-}{
-	\checktype{\Gamma}{\elet{x}{e_x}{e}}{\sigma}{(C_x,C)}
-}
-$$
-
-$$
-\inference{
-	\checktype{\Gamma, \overline{{x_i} : \tau_{x_i}}}{e}{\sigma}{C} &&\\
-	(C_{x_i}, \tau_{x_i}) = \varTemplate{x_i} &&
-	\checktype{\Gamma, \overline{{x_i} : \tau_{x_i}}}{e_{x_i}}{\tau_{x_i}}{C_{x_i}'}
-}{
-	\hastype{\Gamma}{\elet{{x_i}}{e_{x_i}}{e}}{\sigma}{(C_{x_i}, C_{x_i}', C)}
-}
-$$
-
-$$
-\inference{
-	\hastype{\Gamma}{e}{\tau_x}{C_x} &&
-	\hastypealt{(\Gamma, x:\tau_x)}{x}{alt_i}{\sigma}{C_i}
-}{
-	\checktype{\Gamma}{Case\ e\ x\ alt_i}{\sigma}{(C_x, C_i)}
-}
-$$
-
-$$
-\inference{
-	\checktype{\Gamma}{e}{\sigma\sub{\alpha'}{\alpha}}{C}
-}{
-	\checktype{\Gamma}{\etabs{\alpha}{e}}{\tall{\alpha'}{\sigma}}{C}
-}
-$$
-
-$$
-\inference{
-	\checktype{\Gamma, x : \tau_y}{e}{\tau\sub{y}{x}}{C}
-}{
-	\checktype{\Gamma}{\efun{x}{\tau}{e}}{(\tfun{y}{\tau_y}{\tau})}{C}
-}
-$$
-
-$$
-\inference{
-	\checktype{\Gamma}{e}{\sigma}{C}
-}{
-	\checktype{\Gamma}{Tick\ t\ e}{\sigma}{C}
-}
-$$
-
-$$
-\inference{
-	\sigma' = \truety{Cast\ c\ e}
-}{
-	\checktype{\Gamma}{Cast\ c\ e}{\sigma}{(C, \subc{\Gamma}{\sigma'}{\sigma})}
-}
-$$
-
-$$
-\inference{
-	\checktype{\Gamma, p \colon \tau}
-	{e}{\sigma}{C} %% here replacePredsWithRefs is used
-}{
-	\checktype{\Gamma}{e}
-	{\forall \left\langle p \colon \tau \right\rangle . \sigma}{C}
-}
-$$
-
-$$
-\inference{
-	\hastype{\Gamma}{e}{\sigma'}{C} &&
-	(\sigma'', C_p) = \freshPredsty{\sigma'}
-}{
-	\checktype{\Gamma}{e}{\sigma}
-	{(C, C_p, \subc{\Gamma}{\sigma''}{\sigma})}
-}
-$$
-
-
-\hfill\mbox{\hastypealt{\Gamma}{x}{alt}{\sigma}{C}}
-$$
-\inference{
-	(x,\tau_x^0) \in \Gamma  && \tau_x^0 = \tref{v}{C\ {t_C}_l\ {r_C}_j }{r}  &&
-	\ty{C} = \forall \alpha_l p_j . y_1\colon t_1 \rightarrow \dots y_n \colon t_n \rightarrow t &&\\
-	\theta = \sub{\alpha_l}{{t_C}_l}\sub{p_j}{{r_C}_j}\sub{y_i}{x_i} &&\\
-	\tau_{x_i} = \theta t_i && \tau_x = \theta t \land \tau_x^0 \land \dataconty{C}{x_i} &&\\
-	\checktype{\Gamma, x\colon \tau_x, x_i \colon \tau_{x_i}}{e}{\sigma}{C}
-}{
-	\hastypealt{\Gamma}{x}{(C, x_i, e)}{\sigma}{C}
-}
-$$
-
-
-% FUNCTIONS
-\section*{Helper Functions}
-\hfill\isGenericty{\alpha}{\sigma} -- not constrained by class predicates
-$$\isGenericty{\alpha}{\sigma} \Leftrightarrow \alpha \notin ClassConstraints(\sigma)$$ 
-
-\begin{align*}
-classConstraints(\tall{\alpha}{\sigma}) &= classConstraints(\sigma)\\ 
-classConstraints(\tall{p}{\sigma}) &= classConstraints(\sigma)\\ 
-classConstraints(C \alpha_i \rightarrow \tau) &= \alpha_i \cup classConstraints(\tau) 
-\end{align*}
-
-\hfill\freshty{\sigma} { -- type with liquid variables for all refinements}\\
-
-\newcommand\freshref{\ensuremath{fref}} %([], k_i)}}
-\newcommand\trueref{\ensuremath{tref}}  %([], true)}}
-$$
-\begin{array}{lcl}
-\freshty{\tref{v}{\alpha}{r}} &=& \tref{v}{\alpha}{\freshref}\\
-\freshty{\tref{v}{\tfun{x}{\tau_x}{\tau}}{r}} &=& \tref{v}{\tfun{x}{\freshty{\tau_x}}{\freshty{\tau}}}{\trueref}\\
-\freshty{\tref{v}{\tcon{C}{\overline{\tau}}{\overline{\ref}}}{r}} 
-	&=& \tref{v}{\tcon{C}{\overline{\freshty{\tau}}}{\overline{\freshref}}}{\freshref}\\
-\freshty{\tref{v}{\tapp{\tau_1}{\tau_2}}{r}} &=& \tref{v}{\tapp{\freshty{\tau_1}}{\freshty{\tau_2}}}{\trueref}\\
-\freshty{\tcl{Cl}{\bar{\tau}}} &=& \tcl{Cl}{\bar{\tau}}\\
-\freshty{\tall{\alpha}{\sigma}} &=& \tall{\alpha}{\freshty{\sigma}}\\
-\freshty{\forall \left\langle p \colon \tau \right\rangle . \sigma} 
-	&=& {\forall \left\langle p \colon \tau \right\rangle . \freshty{\sigma}}
-\end{array}
-$$
-where $fref = {([], k_i)}$, $tref = {([], true)}$
-
-\hfill\truety{\sigma} { -- type with true for all refinements}\\
-$$
-\begin{array}{lcl}
-\truety{\tref{v}{\alpha}{r}} 
-	&=& \tref{v}{\alpha}{\trueref}\\
-\truety{\tref{v}{\tfun{x}{\tau_x}{\tau}}{r}} 
-	&=& \tref{v}{\tfun{x}{\truety{\tau_x}}{\truety{\tau}}}{\trueref}\\
-\truety{\tref{v}{\tcon{C}{\overline{\tau}}{\overline{\ref}}}{r}} 
-	&=& \tref{v}{\tcon{C}{\overline{\truety{\tau}}}{\overline{\trueref}}}{\trueref}\\
-\truety{\tref{v}{\tapp{\tau_1}{\tau_2}}{r}} 
-	&=& \tref{v}{\tapp{\truety{\tau_1}}{\truety{\tau_2}}}{\trueref}\\
-\truety{\tcl{Cl}{\bar{\tau}}} &=& \tcl{Cl}{\bar{\tau}}\\
-\truety{\tall{\alpha}{\sigma}} &=& \tall{\alpha}{\truety{\sigma}}\\
-\truety{\forall \left\langle p \colon \tau \right\rangle . \sigma} 
-	&=& {\forall \left\langle p \colon \tau \right\rangle . \truety{\sigma}}
-\end{array}
-$$
-
-
-\hfill \freshPredsty{\sigma}  -- replace predicate occurrences with liquid variables
-$$
-\begin{array}{lclll}
-\freshPredsty{\tall{\alpha}{\sigma}}  
-	&=& (\tall{\alpha}{\sigma'}, C) & where& (\sigma', C) = \freshPredsty{\sigma}\\
-\freshPredsty{\forall \left\langle p \colon \tau \right\rangle .\sigma}  
-	&=& (\sigma'\sub{p}{k_i}, (C,\wfc{\Gamma'}{k_i})) & where& (\sigma', C) = \freshPredsty{\sigma}\\ 
-	&&&&  x_1\colon\tau_1 \rightarrow \dots x_n \colon\tau_n \rightarrow Prop= \tau\\
-	&&&&  \Gamma' = \Gamma, x_1\colon\tau_1 \rightarrow \dots x_{n-1} \colon\tau_{n-1}\\
-\freshPredsty{\tau}  
-	&=& (\tau, \emptyset) && \\
-\end{array}
-$$
-
-\begin{align*}
-%\isGenericty{\alpha}{\sigma} & \text{ -- not constrained by class predicates}\\
-%\freshty{\sigma} & \text{ -- type with liquid variables for all refinements}\\
-%\truety{\sigma} & \text{ -- type with true for all refinements}\\
-\truetyExpr{e} & \text{ -- type of expression with true for all refinements}\\
-\varTemplate{x} & \text{ -- type for variable x, user specified type or a fresh type}\\
-\end{align*}
-
-\begin{align*}
-\dataconty{C}{x_i} = 
-\left\lbrace \begin{array}{l l}
-Prop\ v & C = True\\
-\lnot (Prop\ v) & C = False\\
-v = x_1 & C = I\# \\
-v= C x_i & \text{otherwise}
-\end{array}\right.
-\end{align*}
diff --git a/docs/slides/BOS14/Makefile b/docs/slides/BOS14/Makefile
deleted file mode 100644
--- a/docs/slides/BOS14/Makefile
+++ /dev/null
@@ -1,95 +0,0 @@
-####################################################################
-SERVERHOME=nvazou@goto.ucsd.edu:~/public_html/liquidtutorial/
-RJSERVER=rjhala@goto.ucsd.edu:~/public_html/liquid/haskell/plpv/lhs/
-## LOCAL
-## MATHJAX=file:///Users/rjhala/research/MathJax
-## REMOTE 
-## MATHJAX=https://c328740.ssl.cf1.rackcdn.com/mathjax/latest
-## MATHJAX=https://c328740.ssl.cf1.rackcdn.com/mathjax/latest
-MATHJAX=http://cdn.mathjax.org/mathjax/latest
-
-####################################################################
-
-STRIPCODE=./MkCode.hs
-
-REVEAL=pandoc \
-	   --from=markdown\
-	   --to=html5                           \
-	   --standalone                         \
-	   --mathjax \
-	   --section-divs                       \
-	   --template=_support/template.reveal  \
-	   --variable reveal=../_support/reveal.js \
-	   --variable mathjax=$(MATHJAX)
-
-FREVEAL=pandoc \
- 	   --from=markdown+lhs\
-	   --to=html5                           \
-	   --standalone                         \
-	   --mathjax \
-	   --section-divs                       \
-	   --template=_support/template.reveal  \
-	   --variable reveal=../_support/reveal.js
-
-PANDOC=pandoc --columns=80  -s --mathjax --slide-level=2
-SLIDY=$(PANDOC) -t slidy
-DZSLIDES=$(PANDOC) --highlight-style tango --css=slides.css -w dzslides
-HANDOUT=$(PANDOC) --highlight-style tango --css=text.css -w html5
-WEBTEX=$(PANDOC) -s --webtex -i -t slidy
-BEAMER=pandoc -t beamer
-LIQUID=liquid --short-names 
-
-mdObjects   := $(patsubst %.lhs,%.lhs.markdown,$(wildcard lhs/*.lhs))
-htmlObjects := $(patsubst %.lhs,%.lhs.slides.html,$(wildcard lhs/*.lhs))
-pdfObjects  := $(patsubst %.lhs,%.lhs.slides.pdf,$(wildcard lhs/*.lhs))
-fhtmlObjects := $(patsubst %.lhs,%.fast.html,$(wildcard lhs/*.lhs))
-
-####################################################################
-
-
-all: slides 
-
-fast: $(fhtmlObjects)
-
-one: $(mdObjects)
-	$(REVEAL) lhs/.liquid/00_Index.lhs.markdown > lhs/index.html
-
-tut: $(mdObjects)
-	$(REVEAL) lhs/.liquid/*.markdown > lhs/tutorial.html 
-
-slides: $(htmlObjects)
-
-pdfslides: $(pdfObjects)
-
-lhs/.liquid/%.lhs.markdown: lhs/%.lhs
-	-$(LIQUID) $?
-
-
-lhs/%.fast: lhs/%.lhs
-	$(STRIPCODE) $? > $@ 
-
-lhs/%.fast.html: lhs/%.fast
-	$(FREVEAL) $? -o $@ 
-
-lhs/%.lhs.slides.html: lhs/.liquid/%.lhs.markdown
-	$(REVEAL) $? -o $@ 
-
-lhs/%.lhs.slides.pdf: lhs/.liquid/%.lhs.markdown
-	$(BEAMER) $? -o $@
-
-
-copy:
-	cp lhs/*lhs.html html/
-	cp lhs/*lhs.slides.html html/
-	cp css/*.css html/
-	cp -r fonts html/
-	cp index.html html/
-	cp Benchmarks.html html/
-
-clean:
-	cd lhs/ && ../cleanup && cd ../
-#	cd html/ && rm -rf * && cd ../
-#	cp index.html html/
-
-upload: 
-	scp -r html/* $(SERVERHOME)
diff --git a/docs/slides/BOS14/README.md b/docs/slides/BOS14/README.md
deleted file mode 100644
--- a/docs/slides/BOS14/README.md
+++ /dev/null
@@ -1,262 +0,0 @@
-Todo
-----
-
-+ CREATE 00_Motivation_Bugs.lhs **TUFTS**
-  + sequence, BUGs, 1984, etc.
-
-+ UPDATE 11_Evaluation.lhs **TUFTS,BOS** 
-  + Add bits about "comments" ---> "types"
-  + Nicer GRAPHS
-  
-+ CREATE HARDWIRED-RED-BLACK-BST.lhs **TUFTS**
-  + INV 1: COLOR
-  + INV 2: HEIGHT
-  + INV 3: ORDER
-
-+ CREATE 03_Memory.lhs **TUFTS, BOS**
-  + and associated demo file, from eseidel's BS demo.
-
-+ UPDATE 09_Laziness.lhs **BOS**
-  + Use math fonts
-  
-+ CHECK 10_Termination.lhs **BOS**
-  + link to Termination.hs demo
-  
-Comparison with DT
-------------------
-
--- Grisly HS+DT proof
-https://github.com/jstolarek/dep-typed-wbl-heaps-hs/blob/master/src/TwoPassMerge/CombinedProofs.hs#L68
-
--- HS (no proof)
-https://github.com/jstolarek/dep-typed-wbl-heaps-hs/blob/master/src/TwoPassMerge/NoProofs.hs#L96
-
--- HS+LH proof
-https://github.com/ucsd-progsys/liquidhaskell/blob/master/tests/pos/WBL.hs#L129
-
-
-BOS-Haskell Plan
-----------------
-
-[35] PART I "refinement types"
-
-* [5]  00_Motivation: "Go Wrong"
-
-* [15] 01_SimpleRefinements (upto VC, Abs) but no Kvar
-    + Demo : hs/000_Refinements.hs
-	+ Demo : hs/001_Refinements.hs
-	
-* [15] 02_Measures
-    + Demo : hs/01_Elements.hs
-
-[20] PART II "case studies"
-
-* [5]  lhs/02_RedBlack.lhs	
-* [15] lhs/13_Memory.lhs
-
-
-[25] PART III "haskell"
-
-* [10] lhs/09_Laziness.lhs
-* [10] lhs/10_Termination.lhs
-* [3]  lhs/11_Evaluation.lhs 
-* [2]  lhs/12_Conclusion.lhs
-
-[20] PART IV "abstract refinements"
-
-* [5]  04_Abstract Refinements.lhs
-    + Demo : 02_AbstractRefinements.hs (listMax)
-
-* [7] Demo Inductive
-    + Demo:  02_AbstractRefinements.hs (ifoldr, append, filter)
-	  
-* [8] Demo Recursive
-	+ Demo:  02_AbstractRefinements.hs (insertSort, ifoldr-insertSort)
-	+ Demo:  04_Streams.hs (repeat, take)
-
-? [10] Demo Indexed
-	+ Demo: KMP.hs
-
-Tufts Plan
-----------
-
-* [7]  00_Motivation_Long
-        + Bugs
-		+ Well typed Program Go Wrong
-		
-* [10]  01_SimpleRefinements
-        + upto VC, Abs
-
-* [10] 02_Measures 
-        + Demo    : 00_Refinements.hs
-        + Demo    : 01_Elements.hs
-
-* [5]  02_RedBlack 
-		+ Complex : RED-BLACK Trees
-
-* [5] 03_Memory_short?
-		+ Upto just the low-level API?
-		
-* [5]  11_Evaluation.lhs 
-		+ Add bits about "comments" ---> "types"
-		
-* [2]  12_Conclusion.lhs
-
-
-
-Brown Plan
-----------
-
-* [5]  00_Motivation: "Go Wrong"
-
-* [5]  01_SimpleRefinements (upto VC, Abs, but no Kvar)
-
-* [10] 02_Measures [TODO: cut RED-BLACK]
-    + Demo : 00_Refinements.hs
-    + Demo : 01_Elements.hs
-
-* [5]  04_Abstract Refinements
-    + Demo : 02_AbstractRefinements.hs (listMax)
-	
-* [5]  06_Inductive
-	+ Describe: [TODO: CUT ?foldn] foldr
-    + Demo:  02_AbstractRefinements.hs (foldr, append, filter)
-
-* [5]  08_Recursive
-	+ Describe: list-ord
-	+ Demo:  02_AbstractRefinements.hs (insertSort, ifoldr-insertSort)
-	+ Show:  GhcListSort.hs 
-	+ Describe: tree-ord
-	+ Demo:     Stream
- 
-* [3]  11_Evaluation.lhs 
-
-* [2]  12_Conclusion.lhs
-
-
-
-Harvard Plan
-------------
-
-* [5] 00_Motivation: "Go Wrong"
-
-* [5] 01_SimpleRefinements (upto VC, Abs, but no Kvar)
-
-* [10] 02_Measures [TODO: cut RED-BLACK]
-    + Demo : 00_Refinements.hs (upto "wtAverage")
-    + Demo : 01_Elements.hs
-
-* [5] 04_Abstract Refinements
-    + Demo : 02_AbstractRefinements.hs (listMax)
-	
-* [5] 06_Inductive
-	+ Describe: [TODO: CUT ?foldn] foldr
-    + Demo:  02_AbstractRefinements.hs (foldr, append, filter)
-
-* [5] 08_Recursive
-	+ Describe: list-ord
-	+ Demo:  02_AbstractRefinements.hs (insertSort, ifoldr-insertSort)
-
-	+ Show:  GhcListSort.hs 
-	+ Describe: tree-ord
-	+ [TODO: CUT] Demo:     RBTree-Ord
-	+ Demo:     Stream
-
-* [TODO: CUT] [5] 07_Array
-  [TODO: CUT] 	+ Describe: Array
-  [TODO: CUT] 	+ Demo:     KMP
-  
-* [3] 11_Evaluation.lhs 
-
-* [2] 12_Conclusion.lhs
-
-Bytestring Details
-------------------
-
--- | A variety of 'head' for non-empty ByteStrings. 'unsafeHead' omits
--- the check for the empty case, which is good for performance, but
--- there is an obligation on the programmer to provide a proof that the
--- ByteString is non-empty.
-{-@ unsafeHead :: ByteStringNE -> Char @-}
-unsafeHead :: ByteString -> Char
-unsafeHead  = w2c . B.unsafeHead
-{-# INLINE unsafeHead #-}
-
-
-type ByteStringNE = {v:ByteString | 0 < bLength v}
-
-
--- | Unsafe 'ByteString' index (subscript) operator, starting from 0, returning a 'Word8'
--- This omits the bounds check, which means there is an accompanying
--- obligation on the programmer to ensure the bounds are checked in some
--- other way.
-
-{-@ type OkIdx B = {v:Nat | v < bLength B} @-}
-
-{-@ unsafeIndex :: b:ByteString -> OkIdx b -> Word8 @-}
-unsafeIndex :: ByteString -> Int -> Word8
-unsafeIndex (PS x s l) i = assert (i >= 0 && i < l) $
-    inlinePerformIO $ withForeignPtr x $ \p -> peekByteOff p (s+i)
-
-
-Low-Level Memory
-----------------
-
-1. "Haskell HeartBleed" (using BS)
-
-2. Memory API (calls out to C)
-	+ mallocForeignPtrBytes
-	+ withForeignPtr 
-	+ peek
-	+ poke
-	+ plusPtr
-
-   First with types, then with Refined Types.
-
-3. Examples
-    + okPtr
-	+ badPtr (replace 3 with 6)
-
-4. `ByteString`
-   + invariant 
-   + goodBS1, goodBS2
-   + badBS1, badBS2
-
-5. `create`
-   + good call
-   + bad call
-   
-6. `pack`
-7. `unpack`
-8. `unsafeTake`
-9. `heartBleed` redux.
-
-`peekByteOff p i == peek (p `plusPtr` i)`
-
-\begin{code}
-module BSCrash where
-
-import Data.ByteString.Char8  as C
-import Data.ByteString        as B
-import Data.ByteString.Unsafe as U
-
-heartBleed s n = s'
-  where 
-    b          = C.pack s         -- "Ranjit"
-    b'         = U.unsafeTake n b -- 20
-    s'         = C.unpack b'
-
--- > let ex = "Ranjit Loves Burritos"
-    
--- > heartBleed ex 1
---   "R"
-    
--- > heartBleed ex 6
--- > "Ranjit"
-
--- > heartBleed ex 10
--- > "Ranjit Lov"
-    
--- > heartBleed ex 30
--- > "Ranjit Loves Burritos\NUL\NUL\NUL\201\&1j\DC3\SOH\NUL"
-\end{code}
diff --git a/docs/slides/BOS14/_support/liquid.css b/docs/slides/BOS14/_support/liquid.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/BOS14/_support/liquidhaskell.css b/docs/slides/BOS14/_support/liquidhaskell.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/liquidhaskell.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/BOS14/_support/reveal.js/.travis.yml b/docs/slides/BOS14/_support/reveal.js/.travis.yml
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - 0.8
-before_script:
-  - npm install -g grunt-cli
diff --git a/docs/slides/BOS14/_support/reveal.js/Gruntfile.js b/docs/slides/BOS14/_support/reveal.js/Gruntfile.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/Gruntfile.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/* global module:false */
-module.exports = function(grunt) {
-	var port = grunt.option('port') || 8000;
-	// Project configuration
-	grunt.initConfig({
-		pkg: grunt.file.readJSON('package.json'),
-		meta: {
-			banner:
-				'/*!\n' +
-				' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
-				' * http://lab.hakim.se/reveal-js\n' +
-				' * MIT licensed\n' +
-				' *\n' +
-				' * Copyright (C) 2014 Hakim El Hattab, http://hakim.se\n' +
-				' */'
-		},
-
-		qunit: {
-			files: [ 'test/*.html' ]
-		},
-
-		uglify: {
-			options: {
-				banner: '<%= meta.banner %>\n'
-			},
-			build: {
-				src: 'js/reveal.js',
-				dest: 'js/reveal.min.js'
-			}
-		},
-
-		cssmin: {
-			compress: {
-				files: {
-					'css/reveal.min.css': [ 'css/reveal.css' ]
-				}
-			}
-		},
-
-		sass: {
-			main: {
-				files: {
-					'css/theme/default.css': 'css/theme/source/default.scss',
-					'css/theme/beige.css': 'css/theme/source/beige.scss',
-					'css/theme/night.css': 'css/theme/source/night.scss',
-					'css/theme/serif.css': 'css/theme/source/serif.scss',
-					'css/theme/simple.css': 'css/theme/source/simple.scss',
-					'css/theme/sky.css': 'css/theme/source/sky.scss',
-					'css/theme/moon.css': 'css/theme/source/moon.scss',
-					'css/theme/solarized.css': 'css/theme/source/solarized.scss',
-					'css/theme/blood.css': 'css/theme/source/blood.scss'
-				}
-			}
-		},
-
-		jshint: {
-			options: {
-				curly: false,
-				eqeqeq: true,
-				immed: true,
-				latedef: true,
-				newcap: true,
-				noarg: true,
-				sub: true,
-				undef: true,
-				eqnull: true,
-				browser: true,
-				expr: true,
-				globals: {
-					head: false,
-					module: false,
-					console: false,
-					unescape: false
-				}
-			},
-			files: [ 'Gruntfile.js', 'js/reveal.js' ]
-		},
-
-		connect: {
-			server: {
-				options: {
-					port: port,
-					base: '.'
-				}
-			}
-		},
-
-		zip: {
-			'reveal-js-presentation.zip': [
-				'index.html',
-				'css/**',
-				'js/**',
-				'lib/**',
-				'images/**',
-				'plugin/**'
-			]
-		},
-
-		watch: {
-			main: {
-				files: [ 'Gruntfile.js', 'js/reveal.js', 'css/reveal.css' ],
-				tasks: 'default'
-			},
-			theme: {
-				files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ],
-				tasks: 'themes'
-			}
-		}
-
-	});
-
-	// Dependencies
-	grunt.loadNpmTasks( 'grunt-contrib-qunit' );
-	grunt.loadNpmTasks( 'grunt-contrib-jshint' );
-	grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
-	grunt.loadNpmTasks( 'grunt-contrib-uglify' );
-	grunt.loadNpmTasks( 'grunt-contrib-watch' );
-	grunt.loadNpmTasks( 'grunt-contrib-sass' );
-	grunt.loadNpmTasks( 'grunt-contrib-connect' );
-	grunt.loadNpmTasks( 'grunt-zip' );
-
-	// Default task
-	grunt.registerTask( 'default', [ 'jshint', 'cssmin', 'uglify', 'qunit' ] );
-
-	// Theme task
-	grunt.registerTask( 'themes', [ 'sass' ] );
-
-	// Package presentation to archive
-	grunt.registerTask( 'package', [ 'default', 'zip' ] );
-
-	// Serve presentation locally
-	grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
-
-	// Run tests
-	grunt.registerTask( 'test', [ 'jshint', 'qunit' ] );
-
-};
diff --git a/docs/slides/BOS14/_support/reveal.js/LICENSE b/docs/slides/BOS14/_support/reveal.js/LICENSE
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2014 Hakim El Hattab, http://hakim.se
-
-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.
diff --git a/docs/slides/BOS14/_support/reveal.js/README.md b/docs/slides/BOS14/_support/reveal.js/README.md
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/README.md
+++ /dev/null
@@ -1,933 +0,0 @@
-# reveal.js [![Build Status](https://travis-ci.org/hakimel/reveal.js.png?branch=master)](https://travis-ci.org/hakimel/reveal.js)
-
-A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://lab.hakim.se/reveal-js/).
-
-reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). It's best viewed in a browser with support for CSS 3D transforms but [fallbacks](https://github.com/hakimel/reveal.js/wiki/Browser-Support) are available to make sure your presentation can still be viewed elsewhere.
-
-
-#### More reading:
-- [Installation](#installation): Step-by-step instructions for getting reveal.js running on your computer.
-- [Changelog](https://github.com/hakimel/reveal.js/releases): Up-to-date version history.
-- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own!
-- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks.
-
-## Online Editor
-
-Presentations are written using HTML or markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [http://slid.es](http://slid.es).
-
-
-## Instructions
-
-### Markup
-
-Markup hierarchy needs to be ``<div class="reveal"> <div class="slides"> <section>`` where the ``<section>`` represents one slide and can be repeated indefinitely. If you place multiple ``<section>``'s inside of another ``<section>`` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and it will be included in the horizontal sequence. For example:
-
-```html
-<div class="reveal">
-	<div class="slides">
-		<section>Single Horizontal Slide</section>
-		<section>
-			<section>Vertical Slide 1</section>
-			<section>Vertical Slide 2</section>
-		</section>
-	</div>
-</div>
-```
-
-### Markdown
-
-It's possible to write your slides using Markdown. To enable Markdown, add the ```data-markdown``` attribute to your ```<section>``` elements and wrap the contents in a ```<script type="text/template">``` like the example below.
-
-This is based on [data-markdown](https://gist.github.com/1343518) from [Paul Irish](https://github.com/paulirish) modified to use [marked](https://github.com/chjj/marked) to support [Github Flavoured Markdown](https://help.github.com/articles/github-flavored-markdown). Sensitive to indentation (avoid mixing tabs and spaces) and line breaks (avoid consecutive breaks).
-
-```html
-<section data-markdown>
-	<script type="text/template">
-		## Page title
-
-		A paragraph with some text and a [link](http://hakim.se).
-	</script>
-</section>
-```
-
-#### External Markdown
-
-You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file. The ```data-charset``` attribute is optional and specifies which charset to use when loading the external file.
-
-When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup).
-
-```html
-<section data-markdown="example.md"  
-         data-separator="^\n\n\n"  
-         data-vertical="^\n\n"  
-         data-notes="^Note:"  
-         data-charset="iso-8859-15">
-</section>
-```
-
-#### Element Attributes
-
-Special syntax (in html comment) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things.
-
-```html
-<section data-markdown>
-	<script type="text/template">
-		- Item 1 <!-- .element: class="fragment" data-fragment-index="2" -->
-		- Item 2 <!-- .element: class="fragment" data-fragment-index="1" -->
-	</script>
-</section>
-```
-
-#### Slide Attributes
-
-Special syntax (in html comment) is available for adding attributes to the slide `<section>` elements generated by your Markdown.
-
-```html
-<section data-markdown>
-	<script type="text/template">
-	<!-- .slide: data-background="#ff0000" -->
-		Markdown content
-	</script>
-</section>
-```
-
-
-### Configuration
-
-At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below.
-
-```javascript
-Reveal.initialize({
-
-	// Display controls in the bottom right corner
-	controls: true,
-
-	// Display a presentation progress bar
-	progress: true,
-
-	// Display the page number of the current slide
-	slideNumber: false,
-
-	// Push each slide change to the browser history
-	history: false,
-
-	// Enable keyboard shortcuts for navigation
-	keyboard: true,
-
-	// Enable the slide overview mode
-	overview: true,
-
-	// Vertical centering of slides
-	center: true,
-
-	// Enables touch navigation on devices with touch input
-	touch: true,
-
-	// Loop the presentation
-	loop: false,
-
-	// Change the presentation direction to be RTL
-	rtl: false,
-
-	// Turns fragments on and off globally
-	fragments: true,
-
-	// Flags if the presentation is running in an embedded mode,
-	// i.e. contained within a limited portion of the screen
-	embedded: false,
-
-	// Number of milliseconds between automatically proceeding to the
-	// next slide, disabled when set to 0, this value can be overwritten
-	// by using a data-autoslide attribute on your slides
-	autoSlide: 0,
-
-	// Stop auto-sliding after user input
-	autoSlideStoppable: true,
-
-	// Enable slide navigation via mouse wheel
-	mouseWheel: false,
-
-	// Hides the address bar on mobile devices
-	hideAddressBar: true,
-
-	// Opens links in an iframe preview overlay
-	previewLinks: false,
-
-	// Transition style
-	transition: 'default', // default/cube/page/concave/zoom/linear/fade/none
-
-	// Transition speed
-	transitionSpeed: 'default', // default/fast/slow
-
-	// Transition style for full page slide backgrounds
-	backgroundTransition: 'default', // default/none/slide/concave/convex/zoom
-
-	// Number of slides away from the current that are visible
-	viewDistance: 3,
-
-	// Parallax background image
-	parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
-
-	// Parallax background size
-	parallaxBackgroundSize: '' // CSS syntax, e.g. "2100px 900px"
-
-
-});
-```
-
-Note that the new default vertical centering option will break compatibility with slides that were using transitions with backgrounds (`cube` and `page`). To restore the previous behavior, set `center` to `false`.
-
-
-The configuration can be updated after initialization using the ```configure``` method:
-
-```javascript
-// Turn autoSlide off
-Reveal.configure({ autoSlide: 0 });
-
-// Start auto-sliding every 5s
-Reveal.configure({ autoSlide: 5000 });
-```
-
-
-### Dependencies
-
-Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example:
-
-```javascript
-Reveal.initialize({
-	dependencies: [
-		// Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/
-		{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
-
-		// Interpret Markdown in <section> elements
-		{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-		{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-
-		// Syntax highlight for <code> elements
-		{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
-
-		// Zoom in and out with Alt+click
-		{ src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
-
-		// Speaker notes
-		{ src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } },
-
-		// Remote control your reveal.js presentation using a touch device
-		{ src: 'plugin/remotes/remotes.js', async: true, condition: function() { return !!document.body.classList; } },
-
-		// MathJax
-		{ src: 'plugin/math/math.js', async: true }
-	]
-});
-```
-
-You can add your own extensions using the same syntax. The following properties are available for each dependency object:
-- **src**: Path to the script to load
-- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false
-- **callback**: [optional] Function to execute when the script has loaded
-- **condition**: [optional] Function which must return true for the script to be loaded
-
-
-### Presentation Size
-
-All presentations have a normal size, that is the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport.
-
-See below for a list of configuration options related to sizing, including default values:
-
-```javascript
-Reveal.initialize({
-
-	...
-
-	// The "normal" size of the presentation, aspect ratio will be preserved
-	// when the presentation is scaled to fit different resolutions. Can be
-	// specified using percentage units.
-	width: 960,
-	height: 700,
-
-	// Factor of the display size that should remain empty around the content
-	margin: 0.1,
-
-	// Bounds for smallest/largest possible scale to apply to content
-	minScale: 0.2,
-	maxScale: 1.0
-
-});
-```
-
-
-### Auto-sliding
-
-Presentations can be configure to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides:
-
-```javascript
-// Slide every five seconds
-Reveal.configure({
-  autoSlide: 5000
-});
-```
-
-When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Sliding is also paused automatically as soon as the user starts navigating. You can disable these controls by specifying ```autoSlideStoppable: false``` in your reveal.js config.
-
-You can also override the slide duration for individual slides by using the ```data-autoslide``` attribute on individual sections:
-
-```html
-<section data-autoslide="10000">This will remain on screen for 10 seconds</section>
-```
-
-
-### Keyboard Bindings
-
-If you're unhappy with any of the default keyboard bindings you can override them using the ```keyboard``` config option:
-
-```javascript
-Reveal.configure({
-  keyboard: {
-    13: 'next', // go to the next slide when the ENTER key is pressed
-    27: function() {}, // do something custom when ESC is pressed
-    32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding)
-  }
-});
-```
-
-
-### API
-
-The ``Reveal`` class provides a JavaScript API for controlling navigation and reading state:
-
-```javascript
-// Navigation
-Reveal.slide( indexh, indexv, indexf );
-Reveal.left();
-Reveal.right();
-Reveal.up();
-Reveal.down();
-Reveal.prev();
-Reveal.next();
-Reveal.prevFragment();
-Reveal.nextFragment();
-Reveal.toggleOverview();
-Reveal.togglePause();
-
-// Retrieves the previous and current slide elements
-Reveal.getPreviousSlide();
-Reveal.getCurrentSlide();
-
-Reveal.getIndices(); // { h: 0, v: 0 } }
-
-// State checks
-Reveal.isFirstSlide();
-Reveal.isLastSlide();
-Reveal.isOverview();
-Reveal.isPaused();
-```
-
-### Ready Event
-
-The 'ready' event is fired when reveal.js has loaded all (synchronous) dependencies and is ready to start navigating.
-
-```javascript
-Reveal.addEventListener( 'ready', function( event ) {
-	// event.currentSlide, event.indexh, event.indexv
-} );
-```
-
-### Slide Changed Event
-
-An 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes.
-
-Some libraries, like MathJax (see [#226](https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609)), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback.
-
-```javascript
-Reveal.addEventListener( 'slidechanged', function( event ) {
-	// event.previousSlide, event.currentSlide, event.indexh, event.indexv
-} );
-```
-
-
-### States
-
-If you set ``data-state="somestate"`` on a slide ``<section>``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide.
-
-Furthermore you can also listen to these changes in state via JavaScript:
-
-```javascript
-Reveal.addEventListener( 'somestate', function() {
-	// TODO: Sprinkle magic
-}, false );
-```
-
-### Slide Backgrounds
-
-Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page background colors or images by applying a ```data-background``` attribute to your ```<section>``` elements. Below are a few examples.
-
-```html
-<section data-background="#ff0000">
-	<h2>All CSS color formats are supported, like rgba() or hsl().</h2>
-</section>
-<section data-background="http://example.com/image.png">
-	<h2>This slide will have a full-size background image.</h2>
-</section>
-<section data-background="http://example.com/image.png" data-background-size="100px" data-background-repeat="repeat">
-	<h2>This background image will be sized to 100px and repeated.</h2>
-</section>
-```
-
-Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing ```backgroundTransition: 'slide'``` to the ```Reveal.initialize()``` call. Alternatively you can set ```data-background-transition``` on any section with a background to override that specific transition.
-
-
-### Parallax Background
-
-If you want to use a parallax scrolling background, set the two following config properties when initializing reveal.js (the third one is optional).
-
-```javascript
-Reveal.initialize({
-
-	// Parallax background image
-	parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg"
-
-	// Parallax background size
-	parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto)
-
-	// This slide transition gives best results:
-	transition: linear
-
-});
-```
-
-Make sure that the background size is much bigger than screen size to allow for some scrolling. [View example](http://lab.hakim.se/reveal-js/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg&parallaxBackgroundSize=2100px%20900px).
-
-
-
-### Slide Transitions
-The global presentation transition is set using the ```transition``` config value. You can override the global transition for a specific slide by using the ```data-transition``` attribute:
-
-```html
-<section data-transition="zoom">
-	<h2>This slide will override the presentation transition and zoom!</h2>
-</section>
-
-<section data-transition-speed="fast">
-	<h2>Choose from three transition speeds: default, fast or slow!</h2>
-</section>
-```
-
-Note that this does not work with the page and cube transitions.
-
-
-### Internal links
-
-It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```<section id="some-slide">```):
-
-```html
-<a href="#/2/2">Link</a>
-<a href="#/some-slide">Link</a>
-```
-
-You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an ```enabled``` class when it's a valid navigation route based on the current slide.
-
-```html
-<a href="#" class="navigate-left">
-<a href="#" class="navigate-right">
-<a href="#" class="navigate-up">
-<a href="#" class="navigate-down">
-<a href="#" class="navigate-prev"> <!-- Previous vertical or horizontal slide -->
-<a href="#" class="navigate-next"> <!-- Next vertical or horizontal slide -->
-```
-
-
-### Fragments
-Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://lab.hakim.se/reveal-js/#/fragments
-
-The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment:
-
-```html
-<section>
-	<p class="fragment grow">grow</p>
-	<p class="fragment shrink">shrink</p>
-	<p class="fragment roll-in">roll-in</p>
-	<p class="fragment fade-out">fade-out</p>
-	<p class="fragment current-visible">visible only once</p>
-	<p class="fragment highlight-current-blue">blue only once</p>
-	<p class="fragment highlight-red">highlight-red</p>
-	<p class="fragment highlight-green">highlight-green</p>
-	<p class="fragment highlight-blue">highlight-blue</p>
-</section>
-```
-
-Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second.
-
-```html
-<section>
-	<span class="fragment fade-in">
-		<span class="fragment fade-out">I'll fade in, then out</span>
-	</span>
-</section>
-```
-
-The display order of fragments can be controlled using the ```data-fragment-index``` attribute.
-
-```html
-<section>
-	<p class="fragment" data-fragment-index="3">Appears last</p>
-	<p class="fragment" data-fragment-index="1">Appears first</p>
-	<p class="fragment" data-fragment-index="2">Appears second</p>
-</section>
-```
-
-### Fragment events
-
-When a slide fragment is either shown or hidden reveal.js will dispatch an event.
-
-Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback.
-
-```javascript
-Reveal.addEventListener( 'fragmentshown', function( event ) {
-	// event.fragment = the fragment DOM element
-} );
-Reveal.addEventListener( 'fragmenthidden', function( event ) {
-	// event.fragment = the fragment DOM element
-} );
-```
-
-### Code syntax highlighting
-
-By default, Reveal is configured with [highlight.js](http://softwaremaniacs.org/soft/highlight/en/) for code syntax highlighting. Below is an example with clojure code that will be syntax highlighted. When the `data-trim` attribute is present surrounding whitespace is automatically removed.
-
-```html
-<section>
-	<pre><code data-trim>
-(def lazy-fib
-  (concat
-   [0 1]
-   ((fn rfib [a b]
-        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
-	</code></pre>
-</section>
-```
-
-### Slide number
-If you would like to display the page number of the current slide you can do so using the ```slideNumber``` configuration value.
-
-```javascript
-Reveal.configure({ slideNumber: true });
-```
-
-
-### Overview mode
-
-Press "Esc" or "o" keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides,
-as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks:
-
-```javascript
-Reveal.addEventListener( 'overviewshown', function( event ) { /* ... */ } );
-Reveal.addEventListener( 'overviewhidden', function( event ) { /* ... */ } );
-
-// Toggle the overview mode programmatically
-Reveal.toggleOverview();
-```
-
-### Fullscreen mode
-Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode.
-
-
-### Embedded media
-Embedded HTML5 `<video>`/`<audio>` and YouTube iframes are automatically paused when you navigate away from a slide. This can be disabled by decorating your element with a `data-ignore` attribute.
-
-Add `data-autoplay` to your media element if you want it to automatically start playing when the slide is shown:
-
-```html
-<video data-autoplay src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
-```
-
-Additionally the framework automatically pushes two [post messages](https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) to all iframes, ```slide:start``` when the slide containing the iframe is made visible and ```slide:stop``` when it is hidden.
-
-
-### Stretching elements
-Sometimes it's desirable to have an element, like an image or video, stretch to consume as much space as possible within a given slide. This can be done by adding the ```.stretch``` class to an element as seen below:
-
-```html
-<section>
-	<h2>This video will use up the remaining space on the slide</h2>
-    <video class="stretch" src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
-</section>
-```
-
-Limitations:
-- Only direct descendants of a slide section can be stretched
-- Only one descendant per slide section can be stretched
-
-
-## PDF Export
-
-Presentations can be exported to PDF via a special print stylesheet. This feature requires that you use [Google Chrome](http://google.com/chrome).
-Here's an example of an exported presentation that's been uploaded to SlideShare: http://www.slideshare.net/hakimel/revealjs-13872948.
-
-1. Open your presentation with [css/print/pdf.css](https://github.com/hakimel/reveal.js/blob/master/css/print/pdf.css) included on the page. The default index HTML lets you add *print-pdf* anywhere in the query to include the stylesheet, for example: [lab.hakim.se/reveal-js?print-pdf](http://lab.hakim.se/reveal-js?print-pdf).
-2. Open the in-browser print dialog (CMD+P).
-3. Change the **Destination** setting to **Save as PDF**.
-4. Change the **Layout** to **Landscape**.
-5. Change the **Margins** to **None**.
-6. Click **Save**.
-
-![Chrome Print Settings](https://s3.amazonaws.com/hakim-static/reveal-js/pdf-print-settings.png)
-
-## Theming
-
-The framework comes with a few different themes included:
-
-- default: Gray background, white text, blue links
-- beige: Beige background, dark text, brown links
-- sky: Blue background, thin white text, blue links
-- night: Black background, thick white text, orange links
-- serif: Cappuccino background, gray text, brown links
-- simple: White background, black text, blue links
-- solarized: Cream-colored background, dark green text, blue links
-
-Each theme is available as a separate stylesheet. To change theme you will need to replace **default** below with your desired theme name in index.html:
-
-```html
-<link rel="stylesheet" href="css/theme/default.css" id="theme">
-```
-
-If you want to add a theme of your own see the instructions here: [/css/theme/README.md](https://github.com/hakimel/reveal.js/blob/master/css/theme/README.md).
-
-
-## Speaker Notes
-
-reveal.js comes with a speaker notes plugin which can be used to present per-slide notes in a separate browser window. The notes window also gives you a preview of the next upcoming slide so it may be helpful even if you haven't written any notes. Press the 's' key on your keyboard to open the notes window.
-
-Notes are defined by appending an ```<aside>``` element to a slide as seen below. You can add the ```data-markdown``` attribute to the aside element if you prefer writing notes using Markdown.
-
-When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup).
-
-```html
-<section>
-	<h2>Some Slide</h2>
-
-	<aside class="notes">
-		Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard).
-	</aside>
-</section>
-```
-
-If you're using the external Markdown plugin, you can add notes with the help of a special delimiter:
-
-```html
-<section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n" data-notes="^Note:"></section>
-
-# Title
-## Sub-title
-
-Here is some content...
-
-Note:
-This will only display in the notes window.
-```
-
-## Server Side Speaker Notes
-
-In some cases it can be desirable to run notes on a separate device from the one you're presenting on. The Node.js-based notes plugin lets you do this using the same note definitions as its client side counterpart. Include the required scripts by adding the following dependencies:
-
-```javascript
-Reveal.initialize({
-	...
-
-	dependencies: [
-		{ src: 'socket.io/socket.io.js', async: true },
-		{ src: 'plugin/notes-server/client.js', async: true }
-	]
-});
-```
-
-Then:
-
-1. Install [Node.js](http://nodejs.org/)
-2. Run ```npm install```
-3. Run ```node plugin/notes-server```
-
-
-## Multiplexing
-
-The multiplex plugin allows your audience to view the slides of the presentation you are controlling on their own phone, tablet or laptop. As the master presentation navigates the slides, all client presentations will update in real time. See a demo at [http://revealjs.jit.su/](http://revealjs.jit.su).
-
-The multiplex plugin needs the following 3 things to operate:
-
-1. Master presentation that has control
-2. Client presentations that follow the master
-3. Socket.io server to broadcast events from the master to the clients
-
-More details:
-
-#### Master presentation
-Served from a static file server accessible (preferably) only to the presenter. This need only be on your (the presenter's) computer. (It's safer to run the master presentation from your own computer, so if the venue's Internet goes down it doesn't stop the show.) An example would be to execute the following commands in the directory of your master presentation: 
-
-1. ```npm install node-static```
-2. ```static```
-
-If you want to use the speaker notes plugin with your master presentation then make sure you have the speaker notes plugin configured correctly along with the configuration shown below, then execute ```node plugin/notes-server``` in the directory of your master presentation. The configuration below will cause it to connect to the socket.io server as a master, as well as launch your speaker-notes/static-file server.
-
-You can then access your master presentation at ```http://localhost:1947```
-
-Example configuration:
-```javascript
-Reveal.initialize({
-	// other options...
-
-	multiplex: {
-		// Example values. To generate your own, see the socket.io server instructions.
-		secret: '13652805320794272084', // Obtained from the socket.io server. Gives this (the master) control of the presentation
-		id: '1ea875674b17ca76', // Obtained from socket.io server
-		url: 'revealjs.jit.su:80' // Location of socket.io server
-	},
-
-	// Don't forget to add the dependencies
-	dependencies: [
-		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
-		{ src: 'plugin/multiplex/master.js', async: true },
-
-		// and if you want speaker notes
-		{ src: 'plugin/notes-server/client.js', async: true }
-
-		// other dependencies...
-	]
-});
-```
-
-#### Client presentation
-Served from a publicly accessible static file server. Examples include: GitHub Pages, Amazon S3, Dreamhost, Akamai, etc. The more reliable, the better. Your audience can then access the client presentation via ```http://example.com/path/to/presentation/client/index.html```, with the configuration below causing them to connect to the socket.io server as clients.
-
-Example configuration:
-```javascript
-Reveal.initialize({
-	// other options...
-
-	multiplex: {
-		// Example values. To generate your own, see the socket.io server instructions.
-		secret: null, // null so the clients do not have control of the master presentation
-		id: '1ea875674b17ca76', // id, obtained from socket.io server
-		url: 'revealjs.jit.su:80' // Location of socket.io server
-	},
-
-	// Don't forget to add the dependencies
-	dependencies: [
-		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
-		{ src: 'plugin/multiplex/client.js', async: true }
-
-		// other dependencies...
-	]
-});
-```
-
-#### Socket.io server
-Server that receives the slideChanged events from the master presentation and broadcasts them out to the connected client presentations. This needs to be publicly accessible. You can run your own socket.io server with the commands:
-
-1. ```npm install```
-2. ```node plugin/multiplex```
-
-Or you use the socket.io server at [http://revealjs.jit.su](http://revealjs.jit.su).
-
-You'll need to generate a unique secret and token pair for your master and client presentations. To do so, visit ```http://example.com/token```, where ```http://example.com``` is the location of your socket.io server. Or if you're going to use the socket.io server at [http://revealjs.jit.su](http://revealjs.jit.su), visit [http://revealjs.jit.su/token](http://revealjs.jit.su/token).
-
-You are very welcome to point your presentations at the Socket.io server running at [http://revealjs.jit.su](http://revealjs.jit.su), but availability and stability are not guaranteed. For anything mission critical I recommend you run your own server. It is simple to deploy to nodejitsu, heroku, your own environment, etc.
-
-##### socket.io server as file static server
-
-The socket.io server can play the role of static file server for your client presentation, as in the example at [http://revealjs.jit.su](http://revealjs.jit.su). (Open [http://revealjs.jit.su](http://revealjs.jit.su) in two browsers. Navigate through the slides on one, and the other will update to match.) 
-
-Example configuration:
-```javascript
-Reveal.initialize({
-	// other options...
-
-	multiplex: {
-		// Example values. To generate your own, see the socket.io server instructions.
-		secret: null, // null so the clients do not have control of the master presentation
-		id: '1ea875674b17ca76', // id, obtained from socket.io server
-		url: 'example.com:80' // Location of your socket.io server
-	},
-
-	// Don't forget to add the dependencies
-	dependencies: [
-		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
-		{ src: 'plugin/multiplex/client.js', async: true }
-
-		// other dependencies...
-	]
-```
-
-It can also play the role of static file server for your master presentation and client presentations at the same time (as long as you don't want to use speaker notes). (Open [http://revealjs.jit.su](http://revealjs.jit.su) in two browsers. Navigate through the slides on one, and the other will update to match. Navigate through the slides on the second, and the first will update to match.) This is probably not desirable, because you don't want your audience to mess with your slides while you're presenting. ;)
-
-Example configuration:
-```javascript
-Reveal.initialize({
-	// other options...
-
-	multiplex: {
-		// Example values. To generate your own, see the socket.io server instructions.
-		secret: '13652805320794272084', // Obtained from the socket.io server. Gives this (the master) control of the presentation
-		id: '1ea875674b17ca76', // Obtained from socket.io server
-		url: 'example.com:80' // Location of your socket.io server
-	},
-
-	// Don't forget to add the dependencies
-	dependencies: [
-		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
-		{ src: 'plugin/multiplex/master.js', async: true },
-		{ src: 'plugin/multiplex/client.js', async: true }
-
-		// other dependencies...
-	]
-});
-```
-
-## Leap Motion
-The Leap Motion plugin lets you utilize your [Leap Motion](https://www.leapmotion.com/) device to control basic navigation of your presentation. The gestures currently supported are:
-
-##### 1 to 2 fingers
-Pointer &mdash; Point to anything on screen. Move your finger past the device to expand the pointer.
-
-##### 1 hand + 3 or more fingers (left/right/up/down)
-Navigate through your slides. See config options to invert movements.
-
-##### 2 hands upwards
-Toggle the overview mode. Do it a second time to exit the overview.
-
-#### Config Options
-You can edit the following options:
-
-| Property          | Default           | Description
-| ----------------- |:-----------------:| :-------------
-| autoCenter        | true              | Center the pointer based on where you put your finger into the leap motions detection field.
-| gestureDelay      | 500               | How long to delay between gestures in milliseconds.
-| naturalSwipe      | true              | Swipe as though you were touching a touch screen. Set to false to invert.
-| pointerColor      | #00aaff           | The color of the pointer.
-| pointerOpacity    | 0.7               | The opacity of the pointer.
-| pointerSize       | 15                | The minimum height and width of the pointer.
-| pointerTolerance  | 120               | Bigger = slower pointer.
-
-
-Example configuration:
-```js
-Reveal.initialize({
-
-	// other options...
-
-	leap: {
-		naturalSwipe   : false,    // Invert swipe gestures
-		pointerOpacity : 0.5,      // Set pointer opacity to 0.5
-		pointerColor   : '#d80000' // Red pointer
-	},
-
-	dependencies: [
-		{ src: 'plugin/leap/leap.js', async: true }
-	]
-
-});
-```
-
-## MathJax
-
-If you want to display math equations in your presentation you can easily do so by including this plugin. The plugin is a very thin wrapper around the [MathJax](http://www.mathjax.org/) library. To use it you'll need to include it as a reveal.js dependency, [find our more about dependencies here](#dependencies).
-
-The plugin defaults to using [LaTeX](http://en.wikipedia.org/wiki/LaTeX) but that can be adjusted through the ```math``` configuration object. Note that MathJax is loaded from a remote server. If you want to use it offline you'll need to download a copy of the library and adjust the ```mathjax``` configuration value. 
-
-Below is an example of how the plugin can be configured. If you don't intend to change these values you do not need to include the ```math``` config object at all.
-
-```js
-Reveal.initialize({
-
-	// other options ...
-
-	math: {
-		mathjax: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js',
-		config: 'TeX-AMS_HTML-full'  // See http://docs.mathjax.org/en/latest/config-files.html
-	},
-	
-	dependencies: [
-		{ src: 'plugin/math/math.js', async: true }
-	]
-
-});
-```
-
-Read MathJax's documentation if you need [HTTPS delivery](http://docs.mathjax.org/en/latest/start.html#secure-access-to-the-cdn) or serving of [specific versions](http://docs.mathjax.org/en/latest/configuration.html#loading-mathjax-from-the-cdn) for stability.
-
-
-## Installation
-
-The **basic setup** is for authoring presentations only. The **full setup** gives you access to all reveal.js features and plugins such as speaker notes as well as the development tasks needed to make changes to the source.
-
-### Basic setup
-
-The core of reveal.js is very easy to install. You'll simply need to download a copy of this repository and open the index.html file directly in your browser.
-
-1. Download the latest version of reveal.js from <https://github.com/hakimel/reveal.js/releases>
-
-2. Unzip and replace the example contents in index.html with your own
-
-3. Open index.html in a browser to view it
-
-
-### Full setup
-
-Some reveal.js features, like external markdown and speaker notes, require that presentations run from a local web server. The following instructions will set up such a server as well as all of the development tasks needed to make edits to the reveal.js source code.
-
-1. Install [Node.js](http://nodejs.org/)
-
-2. Install [Grunt](http://gruntjs.com/getting-started#installing-the-cli)
-
-4. Clone the reveal.js repository
-   ```sh
-   $ git clone https://github.com/hakimel/reveal.js.git
-   ```
-
-5. Navigate to the reveal.js folder
-   ```sh
-   $ cd reveal.js
-   ```
-
-6. Install dependencies
-   ```sh
-   $ npm install
-   ```
-
-7. Serve the presentation and monitor source files for changes
-   ```sh
-   $ grunt serve
-   ```
-
-8. Open <http://localhost:8000> to view your presentation
-
-   You can change the port by using `grunt serve --port 8001`.
-
-
-### Folder Structure
-- **css/** Core styles without which the project does not function
-- **js/** Like above but for JavaScript
-- **plugin/** Components that have been developed as extensions to reveal.js
-- **lib/** All other third party assets (JavaScript, CSS, fonts)
-
-
-### Contributing
-
-Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. If you are reporting a bug make sure to include information about which browser and operating system you are using as well as the necessary steps to reproduce the issue.
-
-If you have personal support questions use [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js).
-
-
-#### Pull requests
-
-- Should follow the coding style of the file you work in, most importantly:
-  - Tabs to indent
-  - Single-quoted strings
-- Should be made towards the **dev branch**
-- Should be submitted from a feature/topic branch (not your master)
-- Should not include the minified **reveal.min.js** file
-
-
-## License
-
-MIT licensed
-
-Copyright (C) 2014 Hakim El Hattab, http://hakim.se
diff --git a/docs/slides/BOS14/_support/reveal.js/css/print/paper.css b/docs/slides/BOS14/_support/reveal.js/css/print/paper.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/print/paper.css
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Default Print Stylesheet Template
-   by Rob Glazebrook of CSSnewbie.com
-   Last Updated: June 4, 2008
-
-   Feel free (nay, compelled) to edit, append, and
-   manipulate this file as you see fit. */
-
-
-/* SECTION 1: Set default width, margin, float, and
-   background. This prevents elements from extending
-   beyond the edge of the printed page, and prevents
-   unnecessary background images from printing */
-body {
-	background: #fff;
-	font-size: 13pt;
-	width: auto;
-	height: auto;
-	border: 0;
-	margin: 0 5%;
-	padding: 0;
-	float: none !important;
-	overflow: visible;
-}
-html {
-	background: #fff;
-	width: auto;
-	height: auto;
-	overflow: visible;
-}
-
-/* SECTION 2: Remove any elements not needed in print.
-   This would include navigation, ads, sidebars, etc. */
-.nestedarrow,
-.controls,
-.reveal .progress,
-.reveal.overview,
-.fork-reveal,
-.share-reveal,
-.state-background {
-	display: none !important;
-}
-
-/* SECTION 3: Set body font face, size, and color.
-   Consider using a serif font for readability. */
-body, p, td, li, div, a {
-	font-size: 16pt!important;
-	font-family: Georgia, "Times New Roman", Times, serif !important;
-	color: #000;
-}
-
-/* SECTION 4: Set heading font face, sizes, and color.
-   Differentiate your headings from your body text.
-   Perhaps use a large sans-serif for distinction. */
-h1,h2,h3,h4,h5,h6 {
-	color: #000!important;
-	height: auto;
-	line-height: normal;
-	font-family: Georgia, "Times New Roman", Times, serif !important;
-	text-shadow: 0 0 0 #000 !important;
-	text-align: left;
-	letter-spacing: normal;
-}
-/* Need to reduce the size of the fonts for printing */
-h1 { font-size: 26pt !important;  }
-h2 { font-size: 22pt !important; }
-h3 { font-size: 20pt !important; }
-h4 { font-size: 20pt !important; font-variant: small-caps; }
-h5 { font-size: 19pt !important; }
-h6 { font-size: 18pt !important; font-style: italic; }
-
-/* SECTION 5: Make hyperlinks more usable.
-   Ensure links are underlined, and consider appending
-   the URL to the end of the link for usability. */
-a:link,
-a:visited {
-	color: #000 !important;
-	font-weight: bold;
-	text-decoration: underline;
-}
-/*
-.reveal a:link:after,
-.reveal a:visited:after {
-	content: " (" attr(href) ") ";
-	color: #222 !important;
-	font-size: 90%;
-}
-*/
-
-
-/* SECTION 6: more reveal.js specific additions by @skypanther */
-ul, ol, div, p {
-	visibility: visible;
-	position: static;
-	width: auto;
-	height: auto;
-	display: block;
-	overflow: visible;
-	margin: auto;
-	text-align: left !important;
-}
-.reveal .slides {
-	position: static;
-	width: auto;
-	height: auto;
-
-	left: auto;
-	top: auto;
-	margin-left: auto;
-	margin-top: auto;
-	padding: auto;
-
-	overflow: visible;
-	display: block;
-
-	text-align: center;
-	-webkit-perspective: none;
-	   -moz-perspective: none;
-	    -ms-perspective: none;
-	        perspective: none;
-
-	-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-.reveal .slides>section,
-.reveal .slides>section>section {
-
-	visibility: visible !important;
-	position: static !important;
-	width: 90% !important;
-	height: auto !important;
-	display: block !important;
-	overflow: visible !important;
-
-	left: 0% !important;
-	top: 0% !important;
-	margin-left: 0px !important;
-	margin-top: 0px !important;
-	padding: 20px 0px !important;
-
-	opacity: 1 !important;
-
-	-webkit-transform-style: flat !important;
-	   -moz-transform-style: flat !important;
-	    -ms-transform-style: flat !important;
-	        transform-style: flat !important;
-
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-}
-.reveal section {
-	page-break-after: always !important;
-	display: block !important;
-}
-.reveal section .fragment {
-	opacity: 1 !important;
-	visibility: visible !important;
-
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-}
-.reveal section:last-of-type {
-	page-break-after: avoid !important;
-}
-.reveal section img {
-	display: block;
-	margin: 15px 0px;
-	background: rgba(255,255,255,1);
-	border: 1px solid #666;
-	box-shadow: none;
-}
diff --git a/docs/slides/BOS14/_support/reveal.js/css/print/pdf.css b/docs/slides/BOS14/_support/reveal.js/css/print/pdf.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/print/pdf.css
+++ /dev/null
@@ -1,190 +0,0 @@
-/* Default Print Stylesheet Template
-   by Rob Glazebrook of CSSnewbie.com
-   Last Updated: June 4, 2008
-
-   Feel free (nay, compelled) to edit, append, and
-   manipulate this file as you see fit. */
-
-
-/* SECTION 1: Set default width, margin, float, and
-   background. This prevents elements from extending
-   beyond the edge of the printed page, and prevents
-   unnecessary background images from printing */
-
-* {
-	-webkit-print-color-adjust: exact;
-}
-
-body {
-	font-size: 18pt;
-	width: 297mm;
-	height: 229mm;
-	margin: 0 auto !important;
-	border: 0;
-	padding: 0;
-	float: none !important;
-	overflow: visible;
-}
-
-html {
-	width: 100%;
-	height: 100%;
-	overflow: visible;
-}
-
-@page {
-	size: letter landscape;
-	margin: 0;
-}
-
-/* SECTION 2: Remove any elements not needed in print.
-   This would include navigation, ads, sidebars, etc. */
-.nestedarrow,
-.controls,
-.reveal .progress,
-.reveal.overview,
-.fork-reveal,
-.share-reveal,
-.state-background {
-	display: none !important;
-}
-
-/* SECTION 3: Set body font face, size, and color.
-   Consider using a serif font for readability. */
-body, p, td, li, div {
-	font-size: 18pt;
-}
-
-/* SECTION 4: Set heading font face, sizes, and color.
-   Differentiate your headings from your body text.
-   Perhaps use a large sans-serif for distinction. */
-h1,h2,h3,h4,h5,h6 {
-	text-shadow: 0 0 0 #000 !important;
-}
-
-/* SECTION 5: Make hyperlinks more usable.
-   Ensure links are underlined, and consider appending
-   the URL to the end of the link for usability. */
-a:link,
-a:visited {
-	font-weight: normal;
-	text-decoration: underline;
-}
-
-.reveal pre code {
-	overflow: hidden !important;
-	font-family: monospace !important;
-}
-
-
-/* SECTION 6: more reveal.js specific additions by @skypanther */
-ul, ol, div, p {
-	visibility: visible;
-	position: static;
-	width: auto;
-	height: auto;
-	display: block;
-	overflow: visible;
-	margin: auto;
-}
-.reveal {
-	width: auto !important;
-	height: auto !important;
-	overflow: hidden !important;
-}
-.reveal .slides {
-	position: static;
-	width: 100%;
-	height: auto;
-
-	left: auto;
-	top: auto;
-	margin: 0 !important;
-	padding: 0 !important;
-
-	overflow: visible;
-	display: block;
-
-	text-align: center;
-
-	-webkit-perspective: none;
-	   -moz-perspective: none;
-	    -ms-perspective: none;
-	        perspective: none;
-
-	-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-.reveal .slides section {
-
-	page-break-after: always !important;
-
-	visibility: visible !important;
-	position: relative !important;
-	width: 100% !important;
-	height: 229mm !important;
-	min-height: 229mm !important;
-	display: block !important;
-	overflow: hidden !important;
-
-	left: 0 !important;
-	top: 0 !important;
-	margin: 0 !important;
-	padding: 2cm 2cm 0 2cm !important;
-	box-sizing: border-box !important;
-
-	opacity: 1 !important;
-
-	-webkit-transform-style: flat !important;
-	   -moz-transform-style: flat !important;
-	    -ms-transform-style: flat !important;
-	        transform-style: flat !important;
-
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-}
-.reveal section.stack {
-	margin: 0 !important;
-	padding: 0 !important;
-	page-break-after: avoid !important;
-	height: auto !important;
-	min-height: auto !important;
-}
-.reveal .absolute-element {
-	margin-left: 2.2cm;
-	margin-top: 1.8cm;
-}
-.reveal section .fragment {
-	opacity: 1 !important;
-	visibility: visible !important;
-
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-}
-.reveal section .slide-background {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	z-index: 0;
-}
-.reveal section>* {
-	position: relative;
-	z-index: 1;
-}
-.reveal img {
-	box-shadow: none;
-}
-.reveal .roll {
-	overflow: visible;
-	line-height: 1em;
-}
-.reveal small a {
-	font-size: 16pt !important;
-}
diff --git a/docs/slides/BOS14/_support/reveal.js/css/reveal.css b/docs/slides/BOS14/_support/reveal.js/css/reveal.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/reveal.css
+++ /dev/null
@@ -1,1882 +0,0 @@
-@charset "UTF-8";
-
-/*!
- * reveal.js
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
- */
-
-
-/*********************************************
- * RESET STYLES
- *********************************************/
-
-html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe,
-.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre,
-.reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code,
-.reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp,
-.reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var,
-.reveal b, .reveal u, .reveal i, .reveal center,
-.reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li,
-.reveal fieldset, .reveal form, .reveal label, .reveal legend,
-.reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td,
-.reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed,
-.reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup,
-.reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary,
-.reveal time, .reveal mark, .reveal audio, video {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	font-size: 100%;
-	font: inherit;
-	vertical-align: baseline;
-}
-
-.reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure,
-.reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section {
-	display: block;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-html,
-body {
-	width: 100%;
-	height: 100%;
-	overflow: hidden;
-}
-
-body {
-	position: relative;
-	line-height: 1;
-}
-
-::selection {
-	background: #FF5E99;
-	color: #fff;
-	text-shadow: none;
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-	-webkit-hyphens: auto;
-	   -moz-hyphens: auto;
-	        hyphens: auto;
-
-	word-wrap: break-word;
-	line-height: 1;
-}
-
-.reveal h1 { font-size: 3.77em; }
-.reveal h2 { font-size: 1.85em;	}
-.reveal h3 { font-size: 1.55em;	}
-.reveal h4 { font-size: 1em;	}
-
-
-/*********************************************
- * VIEW FRAGMENTS
- *********************************************/
-
-.reveal .slides section .fragment {
-	opacity: 0;
-
-	-webkit-transition: all .2s ease;
-	   -moz-transition: all .2s ease;
-	    -ms-transition: all .2s ease;
-	     -o-transition: all .2s ease;
-	        transition: all .2s ease;
-}
-	.reveal .slides section .fragment.visible {
-		opacity: 1;
-	}
-
-.reveal .slides section .fragment.grow {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.grow.visible {
-		-webkit-transform: scale( 1.3 );
-		   -moz-transform: scale( 1.3 );
-		    -ms-transform: scale( 1.3 );
-		     -o-transform: scale( 1.3 );
-		        transform: scale( 1.3 );
-	}
-
-.reveal .slides section .fragment.shrink {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.shrink.visible {
-		-webkit-transform: scale( 0.7 );
-		   -moz-transform: scale( 0.7 );
-		    -ms-transform: scale( 0.7 );
-		     -o-transform: scale( 0.7 );
-		        transform: scale( 0.7 );
-	}
-
-.reveal .slides section .fragment.zoom-in {
-	opacity: 0;
-
-	-webkit-transform: scale( 0.1 );
-	   -moz-transform: scale( 0.1 );
-	    -ms-transform: scale( 0.1 );
-	     -o-transform: scale( 0.1 );
-	        transform: scale( 0.1 );
-}
-
-	.reveal .slides section .fragment.zoom-in.visible {
-		opacity: 1;
-
-		-webkit-transform: scale( 1 );
-		   -moz-transform: scale( 1 );
-		    -ms-transform: scale( 1 );
-		     -o-transform: scale( 1 );
-		        transform: scale( 1 );
-	}
-
-.reveal .slides section .fragment.roll-in {
-	opacity: 0;
-
-	-webkit-transform: rotateX( 90deg );
-	   -moz-transform: rotateX( 90deg );
-	    -ms-transform: rotateX( 90deg );
-	     -o-transform: rotateX( 90deg );
-	        transform: rotateX( 90deg );
-}
-	.reveal .slides section .fragment.roll-in.visible {
-		opacity: 1;
-
-		-webkit-transform: rotateX( 0 );
-		   -moz-transform: rotateX( 0 );
-		    -ms-transform: rotateX( 0 );
-		     -o-transform: rotateX( 0 );
-		        transform: rotateX( 0 );
-	}
-
-.reveal .slides section .fragment.fade-out {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.fade-out.visible {
-		opacity: 0;
-	}
-
-.reveal .slides section .fragment.semi-fade-out {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.semi-fade-out.visible {
-		opacity: 0.5;
-	}
-
-.reveal .slides section .fragment.current-visible {
-	opacity:0;
-}
-
-.reveal .slides section .fragment.current-visible.current-fragment {
-	opacity:1;
-}
-
-.reveal .slides section .fragment.highlight-red,
-.reveal .slides section .fragment.highlight-current-red,
-.reveal .slides section .fragment.highlight-green,
-.reveal .slides section .fragment.highlight-current-green,
-.reveal .slides section .fragment.highlight-blue,
-.reveal .slides section .fragment.highlight-current-blue {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.highlight-red.visible {
-		color: #ff2c2d
-	}
-	.reveal .slides section .fragment.highlight-green.visible {
-		color: #17ff2e;
-	}
-	.reveal .slides section .fragment.highlight-blue.visible {
-		color: #1b91ff;
-	}
-
-.reveal .slides section .fragment.highlight-current-red.current-fragment {
-	color: #ff2c2d
-}
-.reveal .slides section .fragment.highlight-current-green.current-fragment {
-	color: #17ff2e;
-}
-.reveal .slides section .fragment.highlight-current-blue.current-fragment {
-	color: #1b91ff;
-}
-
-
-/*********************************************
- * DEFAULT ELEMENT STYLES
- *********************************************/
-
-/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */
-.reveal:after {
-  content: '';
-  font-style: italic;
-}
-
-.reveal iframe {
-	z-index: 1;
-}
-
-/* Ensure certain elements are never larger than the slide itself */
-.reveal img,
-.reveal video,
-.reveal iframe {
-	max-width: 95%;
-	max-height: 95%;
-}
-
-/** Prevents layering issues in certain browser/transition combinations */
-.reveal a {
-	position: relative;
-}
-
-.reveal strong,
-.reveal b {
-	font-weight: bold;
-}
-
-.reveal em,
-.reveal i {
-	font-style: italic;
-}
-
-.reveal ol,
-.reveal ul {
-	display: inline-block;
-
-	text-align: left;
-	margin: 0 0 0 1em;
-}
-
-.reveal ol {
-	list-style-type: decimal;
-}
-
-.reveal ul {
-	list-style-type: disc;
-}
-
-.reveal ul ul {
-	list-style-type: square;
-}
-
-.reveal ul ul ul {
-	list-style-type: circle;
-}
-
-.reveal ul ul,
-.reveal ul ol,
-.reveal ol ol,
-.reveal ol ul {
-	display: block;
-	margin-left: 40px;
-}
-
-.reveal p {
-	margin-bottom: 10px;
-	line-height: 1.2em;
-}
-
-.reveal q,
-.reveal blockquote {
-	quotes: none;
-}
-
-.reveal blockquote {
-	display: block;
-	position: relative;
-	width: 70%;
-	margin: 5px auto;
-	padding: 5px;
-
-	font-style: italic;
-	background: rgba(255, 255, 255, 0.05);
-	box-shadow: 0px 0px 2px rgba(0,0,0,0.2);
-}
-	.reveal blockquote p:first-child,
-	.reveal blockquote p:last-child {
-		display: inline-block;
-	}
-
-.reveal q {
-	font-style: italic;
-}
-
-.reveal pre {
-	display: block;
-	position: relative;
-	width: 90%;
-	margin: 10px auto;
-
-	text-align: left;
-	font-size: 0.81em;
-	font-family: monospace;
-	line-height: 1.2em;
-
-	word-wrap: break-word;
-
-	box-shadow: 0px 0px 6px rgba(0,0,0,0.3);
-}
-.reveal code {
-	font-family: monospace;
-	font-size: 0.81em;
-}
-.reveal pre code {
-	padding: 5px;
-	overflow: auto;
-	max-height: 400px;
-	word-wrap: normal;
-}
-.reveal pre.stretch code {
-	height: 100%;
-	max-height: 100%;
-
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-
-.reveal table th,
-.reveal table td {
-	text-align: left;
-	padding-right: .3em;
-}
-
-.reveal table th {
-	font-weight: bold;
-}
-
-.reveal sup {
-	vertical-align: super;
-}
-.reveal sub {
-	vertical-align: sub;
-}
-
-.reveal small {
-	display: inline-block;
-	font-size: 0.6em;
-	line-height: 1.2em;
-	vertical-align: top;
-}
-
-.reveal small * {
-	vertical-align: top;
-}
-
-.reveal .stretch {
-	max-width: none;
-	max-height: none;
-}
-
-
-/*********************************************
- * CONTROLS
- *********************************************/
-
-.reveal .controls {
-	display: none;
-	position: fixed;
-	width: 110px;
-	height: 110px;
-	z-index: 30;
-	right: 10px;
-	bottom: 10px;
-}
-
-.reveal .controls div {
-	position: absolute;
-	opacity: 0.05;
-	width: 0;
-	height: 0;
-	border: 12px solid transparent;
-
-	-moz-transform: scale(.9999);
-
-	-webkit-transition: all 0.2s ease;
-	   -moz-transition: all 0.2s ease;
-	    -ms-transition: all 0.2s ease;
-	     -o-transition: all 0.2s ease;
-	        transition: all 0.2s ease;
-}
-
-.reveal .controls div.enabled {
-	opacity: 0.7;
-	cursor: pointer;
-}
-
-.reveal .controls div.enabled:active {
-	margin-top: 1px;
-}
-
-	.reveal .controls div.navigate-left {
-		top: 42px;
-
-		border-right-width: 22px;
-		border-right-color: #eee;
-	}
-		.reveal .controls div.navigate-left.fragmented {
-			opacity: 0.3;
-		}
-
-	.reveal .controls div.navigate-right {
-		left: 74px;
-		top: 42px;
-
-		border-left-width: 22px;
-		border-left-color: #eee;
-	}
-		.reveal .controls div.navigate-right.fragmented {
-			opacity: 0.3;
-		}
-
-	.reveal .controls div.navigate-up {
-		left: 42px;
-
-		border-bottom-width: 22px;
-		border-bottom-color: #eee;
-	}
-		.reveal .controls div.navigate-up.fragmented {
-			opacity: 0.3;
-		}
-
-	.reveal .controls div.navigate-down {
-		left: 42px;
-		top: 74px;
-
-		border-top-width: 22px;
-		border-top-color: #eee;
-	}
-		.reveal .controls div.navigate-down.fragmented {
-			opacity: 0.3;
-		}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	position: fixed;
-	display: none;
-	height: 3px;
-	width: 100%;
-	bottom: 0;
-	left: 0;
-	z-index: 10;
-}
-	.reveal .progress:after {
-		content: '';
-		display: 'block';
-		position: absolute;
-		height: 20px;
-		width: 100%;
-		top: -20px;
-	}
-	.reveal .progress span {
-		display: block;
-		height: 100%;
-		width: 0px;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-
-.reveal .slide-number {
-	position: fixed;
-	display: block;
-	right: 15px;
-	bottom: 15px;
-	opacity: 0.5;
-	z-index: 31;
-	font-size: 12px;
-}
-
-/*********************************************
- * SLIDES
- *********************************************/
-
-.reveal {
-	position: relative;
-	width: 100%;
-	height: 100%;
-
-	-ms-touch-action: none;
-}
-
-.reveal .slides {
-	position: absolute;
-    max-width: 1024px;
-	width: 120%;
-	height: 100%;
-	left: 50%;
-	top: 50%;
-
-	overflow: visible;
-	z-index: 1;
-	text-align: center;
-
-	-webkit-transition: -webkit-perspective .4s ease;
-	   -moz-transition: -moz-perspective .4s ease;
-	    -ms-transition: -ms-perspective .4s ease;
-	     -o-transition: -o-perspective .4s ease;
-	        transition: perspective .4s ease;
-
-	-webkit-perspective: 600px;
-	   -moz-perspective: 600px;
-	    -ms-perspective: 600px;
-	        perspective: 600px;
-
-	-webkit-perspective-origin: 0px -100px;
-	   -moz-perspective-origin: 0px -100px;
-	    -ms-perspective-origin: 0px -100px;
-	        perspective-origin: 0px -100px;
-}
-
-.reveal .slides>section {
-	-ms-perspective: 600px;
-}
-
-.reveal .slides>section,
-.reveal .slides>section>section {
-	display: none;
-	position: absolute;
-	width: 100%;
-	padding: 20px 0px;
-
-	z-index: 10;
-	line-height: 1.2em;
-	font-weight: inherit;
-
-	-webkit-transform-style: preserve-3d;
-	   -moz-transform-style: preserve-3d;
-	    -ms-transform-style: preserve-3d;
-	        transform-style: preserve-3d;
-
-	-webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						-webkit-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	   -moz-transition: -moz-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						-moz-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	    -ms-transition: -ms-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						-ms-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	     -o-transition: -o-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						-o-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	        transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-}
-
-/* Global transition speed settings */
-.reveal[data-transition-speed="fast"] .slides section {
-	-webkit-transition-duration: 400ms;
-	   -moz-transition-duration: 400ms;
-	    -ms-transition-duration: 400ms;
-	        transition-duration: 400ms;
-}
-.reveal[data-transition-speed="slow"] .slides section {
-	-webkit-transition-duration: 1200ms;
-	   -moz-transition-duration: 1200ms;
-	    -ms-transition-duration: 1200ms;
-	        transition-duration: 1200ms;
-}
-
-/* Slide-specific transition speed overrides */
-.reveal .slides section[data-transition-speed="fast"] {
-	-webkit-transition-duration: 400ms;
-	   -moz-transition-duration: 400ms;
-	    -ms-transition-duration: 400ms;
-	        transition-duration: 400ms;
-}
-.reveal .slides section[data-transition-speed="slow"] {
-	-webkit-transition-duration: 1200ms;
-	   -moz-transition-duration: 1200ms;
-	    -ms-transition-duration: 1200ms;
-	        transition-duration: 1200ms;
-}
-
-.reveal .slides>section {
-	left: -50%;
-	top: -50%;
-}
-
-.reveal .slides>section.stack {
-	padding-top: 0;
-	padding-bottom: 0;
-}
-
-.reveal .slides>section.present,
-.reveal .slides>section>section.present {
-	display: block;
-	z-index: 11;
-	opacity: 1;
-}
-
-.reveal.center,
-.reveal.center .slides,
-.reveal.center .slides section {
-	min-height: auto !important;
-}
-
-/* Don't allow interaction with invisible slides */
-.reveal .slides>section.future,
-.reveal .slides>section>section.future,
-.reveal .slides>section.past,
-.reveal .slides>section>section.past {
-	pointer-events: none;
-}
-
-.reveal.overview .slides>section,
-.reveal.overview .slides>section>section {
-	pointer-events: auto;
-}
-
-
-
-/*********************************************
- * DEFAULT TRANSITION
- *********************************************/
-
-.reveal .slides>section[data-transition=default].past,
-.reveal .slides>section.past {
-	display: block;
-	opacity: 0;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-}
-.reveal .slides>section[data-transition=default].future,
-.reveal .slides>section.future {
-	display: block;
-	opacity: 0;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-}
-
-.reveal .slides>section>section[data-transition=default].past,
-.reveal .slides>section>section.past {
-	display: block;
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
-	   -moz-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
-	    -ms-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
-	        transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
-}
-.reveal .slides>section>section[data-transition=default].future,
-.reveal .slides>section>section.future {
-	display: block;
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
-	   -moz-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
-	    -ms-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
-	        transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
-}
-
-
-/*********************************************
- * CONCAVE TRANSITION
- *********************************************/
-
-.reveal .slides>section[data-transition=concave].past,
-.reveal.concave  .slides>section.past {
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-}
-.reveal .slides>section[data-transition=concave].future,
-.reveal.concave .slides>section.future {
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-}
-
-.reveal .slides>section>section[data-transition=concave].past,
-.reveal.concave .slides>section>section.past {
-	-webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	   -moz-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	    -ms-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	        transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-}
-.reveal .slides>section>section[data-transition=concave].future,
-.reveal.concave .slides>section>section.future {
-	-webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	   -moz-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	    -ms-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	        transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-}
-
-
-/*********************************************
- * ZOOM TRANSITION
- *********************************************/
-
-.reveal .slides>section[data-transition=zoom],
-.reveal.zoom .slides>section {
-	-webkit-transition-timing-function: ease;
-	   -moz-transition-timing-function: ease;
-	    -ms-transition-timing-function: ease;
-	     -o-transition-timing-function: ease;
-	        transition-timing-function: ease;
-}
-
-.reveal .slides>section[data-transition=zoom].past,
-.reveal.zoom .slides>section.past {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(16);
-	   -moz-transform: scale(16);
-	    -ms-transform: scale(16);
-	     -o-transform: scale(16);
-	        transform: scale(16);
-}
-.reveal .slides>section[data-transition=zoom].future,
-.reveal.zoom .slides>section.future {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(0.2);
-	   -moz-transform: scale(0.2);
-	    -ms-transform: scale(0.2);
-	     -o-transform: scale(0.2);
-	        transform: scale(0.2);
-}
-
-.reveal .slides>section>section[data-transition=zoom].past,
-.reveal.zoom .slides>section>section.past {
-	-webkit-transform: translate(0, -150%);
-	   -moz-transform: translate(0, -150%);
-	    -ms-transform: translate(0, -150%);
-	     -o-transform: translate(0, -150%);
-	        transform: translate(0, -150%);
-}
-.reveal .slides>section>section[data-transition=zoom].future,
-.reveal.zoom .slides>section>section.future {
-	-webkit-transform: translate(0, 150%);
-	   -moz-transform: translate(0, 150%);
-	    -ms-transform: translate(0, 150%);
-	     -o-transform: translate(0, 150%);
-	        transform: translate(0, 150%);
-}
-
-
-/*********************************************
- * LINEAR TRANSITION
- *********************************************/
-
-.reveal.linear section {
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	    -ms-backface-visibility: hidden;
-	        backface-visibility: hidden;
-}
-
-.reveal .slides>section[data-transition=linear].past,
-.reveal.linear .slides>section.past {
-	-webkit-transform: translate(-150%, 0);
-	   -moz-transform: translate(-150%, 0);
-	    -ms-transform: translate(-150%, 0);
-	     -o-transform: translate(-150%, 0);
-	        transform: translate(-150%, 0);
-}
-.reveal .slides>section[data-transition=linear].future,
-.reveal.linear .slides>section.future {
-	-webkit-transform: translate(150%, 0);
-	   -moz-transform: translate(150%, 0);
-	    -ms-transform: translate(150%, 0);
-	     -o-transform: translate(150%, 0);
-	        transform: translate(150%, 0);
-}
-
-.reveal .slides>section>section[data-transition=linear].past,
-.reveal.linear .slides>section>section.past {
-	-webkit-transform: translate(0, -150%);
-	   -moz-transform: translate(0, -150%);
-	    -ms-transform: translate(0, -150%);
-	     -o-transform: translate(0, -150%);
-	        transform: translate(0, -150%);
-}
-.reveal .slides>section>section[data-transition=linear].future,
-.reveal.linear .slides>section>section.future {
-	-webkit-transform: translate(0, 150%);
-	   -moz-transform: translate(0, 150%);
-	    -ms-transform: translate(0, 150%);
-	     -o-transform: translate(0, 150%);
-	        transform: translate(0, 150%);
-}
-
-
-/*********************************************
- * CUBE TRANSITION
- *********************************************/
-
-.reveal.cube .slides {
-	-webkit-perspective: 1300px;
-	   -moz-perspective: 1300px;
-	    -ms-perspective: 1300px;
-	        perspective: 1300px;
-}
-
-.reveal.cube .slides section {
-	padding: 30px;
-	min-height: 700px;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	    -ms-backface-visibility: hidden;
-	        backface-visibility: hidden;
-
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-	.reveal.center.cube .slides section {
-		min-height: auto;
-	}
-	.reveal.cube .slides section:not(.stack):before {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		background: rgba(0,0,0,0.1);
-		border-radius: 4px;
-
-		-webkit-transform: translateZ( -20px );
-		   -moz-transform: translateZ( -20px );
-		    -ms-transform: translateZ( -20px );
-		     -o-transform: translateZ( -20px );
-		        transform: translateZ( -20px );
-	}
-	.reveal.cube .slides section:not(.stack):after {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 90%;
-		height: 30px;
-		left: 5%;
-		bottom: 0;
-		background: none;
-		z-index: 1;
-
-		border-radius: 4px;
-		box-shadow: 0px 95px 25px rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ(-90px) rotateX( 65deg );
-		   -moz-transform: translateZ(-90px) rotateX( 65deg );
-		    -ms-transform: translateZ(-90px) rotateX( 65deg );
-		     -o-transform: translateZ(-90px) rotateX( 65deg );
-		        transform: translateZ(-90px) rotateX( 65deg );
-	}
-
-.reveal.cube .slides>section.stack {
-	padding: 0;
-	background: none;
-}
-
-.reveal.cube .slides>section.past {
-	-webkit-transform-origin: 100% 0%;
-	   -moz-transform-origin: 100% 0%;
-	    -ms-transform-origin: 100% 0%;
-	        transform-origin: 100% 0%;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-}
-
-.reveal.cube .slides>section.future {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg);
-}
-
-.reveal.cube .slides>section>section.past {
-	-webkit-transform-origin: 0% 100%;
-	   -moz-transform-origin: 0% 100%;
-	    -ms-transform-origin: 0% 100%;
-	        transform-origin: 0% 100%;
-
-	-webkit-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	   -moz-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	    -ms-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	        transform: translate3d(0, -100%, 0) rotateX(90deg);
-}
-
-.reveal.cube .slides>section>section.future {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	   -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	    -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	        transform: translate3d(0, 100%, 0) rotateX(-90deg);
-}
-
-
-/*********************************************
- * PAGE TRANSITION
- *********************************************/
-
-.reveal.page .slides {
-	-webkit-perspective-origin: 0% 50%;
-	   -moz-perspective-origin: 0% 50%;
-	    -ms-perspective-origin: 0% 50%;
-	        perspective-origin: 0% 50%;
-
-	-webkit-perspective: 3000px;
-	   -moz-perspective: 3000px;
-	    -ms-perspective: 3000px;
-	        perspective: 3000px;
-}
-
-.reveal.page .slides section {
-	padding: 30px;
-	min-height: 700px;
-
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-	.reveal.page .slides section.past {
-		z-index: 12;
-	}
-	.reveal.page .slides section:not(.stack):before {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		background: rgba(0,0,0,0.1);
-
-		-webkit-transform: translateZ( -20px );
-		   -moz-transform: translateZ( -20px );
-		    -ms-transform: translateZ( -20px );
-		     -o-transform: translateZ( -20px );
-		        transform: translateZ( -20px );
-	}
-	.reveal.page .slides section:not(.stack):after {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 90%;
-		height: 30px;
-		left: 5%;
-		bottom: 0;
-		background: none;
-		z-index: 1;
-
-		border-radius: 4px;
-		box-shadow: 0px 95px 25px rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ(-90px) rotateX( 65deg );
-	}
-
-.reveal.page .slides>section.stack {
-	padding: 0;
-	background: none;
-}
-
-.reveal.page .slides>section.past {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	   -moz-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	    -ms-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	        transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-}
-
-.reveal.page .slides>section.future {
-	-webkit-transform-origin: 100% 0%;
-	   -moz-transform-origin: 100% 0%;
-	    -ms-transform-origin: 100% 0%;
-	        transform-origin: 100% 0%;
-
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-
-.reveal.page .slides>section>section.past {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	   -moz-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	    -ms-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	        transform: translate3d(0, -40%, 0) rotateX(80deg);
-}
-
-.reveal.page .slides>section>section.future {
-	-webkit-transform-origin: 0% 100%;
-	   -moz-transform-origin: 0% 100%;
-	    -ms-transform-origin: 0% 100%;
-	        transform-origin: 0% 100%;
-
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-
-
-/*********************************************
- * FADE TRANSITION
- *********************************************/
-
-.reveal .slides section[data-transition=fade],
-.reveal.fade .slides section,
-.reveal.fade .slides>section>section {
-    -webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	     -o-transform: none;
-	        transform: none;
-
-	-webkit-transition: opacity 0.5s;
-	   -moz-transition: opacity 0.5s;
-	    -ms-transition: opacity 0.5s;
-	     -o-transition: opacity 0.5s;
-	        transition: opacity 0.5s;
-}
-
-
-.reveal.fade.overview .slides section,
-.reveal.fade.overview .slides>section>section,
-.reveal.fade.overview-deactivating .slides section,
-.reveal.fade.overview-deactivating .slides>section>section {
-	-webkit-transition: none;
-	   -moz-transition: none;
-	    -ms-transition: none;
-	     -o-transition: none;
-	        transition: none;
-}
-
-
-/*********************************************
- * NO TRANSITION
- *********************************************/
-
-.reveal .slides section[data-transition=none],
-.reveal.none .slides section {
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	     -o-transform: none;
-	        transform: none;
-
-	-webkit-transition: none;
-	   -moz-transition: none;
-	    -ms-transition: none;
-	     -o-transition: none;
-	        transition: none;
-}
-
-
-/*********************************************
- * OVERVIEW
- *********************************************/
-
-.reveal.overview .slides {
-	-webkit-perspective-origin: 0% 0%;
-	   -moz-perspective-origin: 0% 0%;
-	    -ms-perspective-origin: 0% 0%;
-	        perspective-origin: 0% 0%;
-
-	-webkit-perspective: 700px;
-	   -moz-perspective: 700px;
-	    -ms-perspective: 700px;
-	        perspective: 700px;
-}
-
-.reveal.overview .slides section {
-	height: 600px;
-	top: -300px !important;
-	overflow: hidden;
-	opacity: 1 !important;
-	visibility: visible !important;
-	cursor: pointer;
-	background: rgba(0,0,0,0.1);
-}
-.reveal.overview .slides section .fragment {
-	opacity: 1;
-}
-.reveal.overview .slides section:after,
-.reveal.overview .slides section:before {
-	display: none !important;
-}
-.reveal.overview .slides section>section {
-	opacity: 1;
-	cursor: pointer;
-}
-	.reveal.overview .slides section:hover {
-		background: rgba(0,0,0,0.3);
-	}
-	.reveal.overview .slides section.present {
-		background: rgba(0,0,0,0.3);
-	}
-.reveal.overview .slides>section.stack {
-	padding: 0;
-	top: 0 !important;
-	background: none;
-	overflow: visible;
-}
-
-
-/*********************************************
- * PAUSED MODE
- *********************************************/
-
-.reveal .pause-overlay {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-	background: black;
-	visibility: hidden;
-	opacity: 0;
-	z-index: 100;
-
-	-webkit-transition: all 1s ease;
-	   -moz-transition: all 1s ease;
-	    -ms-transition: all 1s ease;
-	     -o-transition: all 1s ease;
-	        transition: all 1s ease;
-}
-.reveal.paused .pause-overlay {
-	visibility: visible;
-	opacity: 1;
-}
-
-
-/*********************************************
- * FALLBACK
- *********************************************/
-
-.no-transforms {
-	overflow-y: auto;
-}
-
-.no-transforms .reveal .slides {
-	position: relative;
-	width: 80%;
-	height: auto !important;
-	top: 0;
-	left: 50%;
-	margin: 0;
-	text-align: center;
-}
-
-.no-transforms .reveal .controls,
-.no-transforms .reveal .progress {
-	display: none !important;
-}
-
-.no-transforms .reveal .slides section {
-	display: block !important;
-	opacity: 1 !important;
-	position: relative !important;
-	height: auto;
-	min-height: auto;
-	top: 0;
-	left: -50%;
-	margin: 70px 0;
-
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	     -o-transform: none;
-	        transform: none;
-}
-
-.no-transforms .reveal .slides section section {
-	left: 0;
-}
-
-.reveal .no-transition,
-.reveal .no-transition * {
-	-webkit-transition: none !important;
-	   -moz-transition: none !important;
-	    -ms-transition: none !important;
-	     -o-transition: none !important;
-	        transition: none !important;
-}
-
-
-/*********************************************
- * BACKGROUND STATES [DEPRECATED]
- *********************************************/
-
-.reveal .state-background {
-	position: absolute;
-	width: 100%;
-	height: 100%;
-	background: rgba( 0, 0, 0, 0 );
-
-	-webkit-transition: background 800ms ease;
-	   -moz-transition: background 800ms ease;
-	    -ms-transition: background 800ms ease;
-	     -o-transition: background 800ms ease;
-	        transition: background 800ms ease;
-}
-.alert .reveal .state-background {
-	background: rgba( 200, 50, 30, 0.6 );
-}
-.soothe .reveal .state-background {
-	background: rgba( 50, 200, 90, 0.4 );
-}
-.blackout .reveal .state-background {
-	background: rgba( 0, 0, 0, 0.6 );
-}
-.whiteout .reveal .state-background {
-	background: rgba( 255, 255, 255, 0.6 );
-}
-.cobalt .reveal .state-background {
-	background: rgba( 22, 152, 213, 0.6 );
-}
-.mint .reveal .state-background {
-	background: rgba( 22, 213, 75, 0.6 );
-}
-.submerge .reveal .state-background {
-	background: rgba( 12, 25, 77, 0.6);
-}
-.lila .reveal .state-background {
-	background: rgba( 180, 50, 140, 0.6 );
-}
-.sunset .reveal .state-background {
-	background: rgba( 255, 122, 0, 0.6 );
-}
-
-
-/*********************************************
- * PER-SLIDE BACKGROUNDS
- *********************************************/
-
-.reveal>.backgrounds {
-	position: absolute;
-	width: 100%;
-	height: 100%;
-
-	-webkit-perspective: 600px;
-	   -moz-perspective: 600px;
-	    -ms-perspective: 600px;
-	        perspective: 600px;
-}
-	.reveal .slide-background {
-		position: absolute;
-		width: 100%;
-		height: 100%;
-		opacity: 0;
-		visibility: hidden;
-
-		background-color: rgba( 0, 0, 0, 0 );
-		background-position: 50% 50%;
-		background-repeat: no-repeat;
-		background-size: cover;
-
-		-webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-	.reveal .slide-background.present {
-		opacity: 1;
-		visibility: visible;
-	}
-
-	.print-pdf .reveal .slide-background {
-		opacity: 1 !important;
-		visibility: visible !important;
-	}
-
-/* Immediate transition style */
-.reveal[data-background-transition=none]>.backgrounds .slide-background,
-.reveal>.backgrounds .slide-background[data-background-transition=none] {
-	-webkit-transition: none;
-	   -moz-transition: none;
-	    -ms-transition: none;
-	     -o-transition: none;
-	        transition: none;
-}
-
-/* 2D slide */
-.reveal[data-background-transition=slide]>.backgrounds .slide-background,
-.reveal>.backgrounds .slide-background[data-background-transition=slide] {
-	opacity: 1;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	    -ms-backface-visibility: hidden;
-	        backface-visibility: hidden;
-}
-	.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,
-	.reveal>.backgrounds .slide-background.past[data-background-transition=slide] {
-		-webkit-transform: translate(-100%, 0);
-		   -moz-transform: translate(-100%, 0);
-		    -ms-transform: translate(-100%, 0);
-		     -o-transform: translate(-100%, 0);
-		        transform: translate(-100%, 0);
-	}
-	.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,
-	.reveal>.backgrounds .slide-background.future[data-background-transition=slide] {
-		-webkit-transform: translate(100%, 0);
-		   -moz-transform: translate(100%, 0);
-		    -ms-transform: translate(100%, 0);
-		     -o-transform: translate(100%, 0);
-		        transform: translate(100%, 0);
-	}
-
-	.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,
-	.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide] {
-		-webkit-transform: translate(0, -100%);
-		   -moz-transform: translate(0, -100%);
-		    -ms-transform: translate(0, -100%);
-		     -o-transform: translate(0, -100%);
-		        transform: translate(0, -100%);
-	}
-	.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,
-	.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide] {
-		-webkit-transform: translate(0, 100%);
-		   -moz-transform: translate(0, 100%);
-		    -ms-transform: translate(0, 100%);
-		     -o-transform: translate(0, 100%);
-		        transform: translate(0, 100%);
-	}
-
-
-/* Convex */
-.reveal[data-background-transition=convex]>.backgrounds .slide-background.past,
-.reveal>.backgrounds .slide-background.past[data-background-transition=convex] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-}
-.reveal[data-background-transition=convex]>.backgrounds .slide-background.future,
-.reveal>.backgrounds .slide-background.future[data-background-transition=convex] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-}
-
-.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past,
-.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
-	   -moz-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
-	    -ms-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
-	        transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
-}
-.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future,
-.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
-	   -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
-	    -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
-	        transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
-}
-
-
-/* Concave */
-.reveal[data-background-transition=concave]>.backgrounds .slide-background.past,
-.reveal>.backgrounds .slide-background.past[data-background-transition=concave] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-}
-.reveal[data-background-transition=concave]>.backgrounds .slide-background.future,
-.reveal>.backgrounds .slide-background.future[data-background-transition=concave] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-}
-
-.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past,
-.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
-	   -moz-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
-	    -ms-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
-	        transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
-}
-.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future,
-.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
-	   -moz-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
-	    -ms-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
-	        transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
-}
-
-/* Zoom */
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background,
-.reveal>.backgrounds .slide-background[data-background-transition=zoom] {
-	-webkit-transition-timing-function: ease;
-	   -moz-transition-timing-function: ease;
-	    -ms-transition-timing-function: ease;
-	     -o-transition-timing-function: ease;
-	        transition-timing-function: ease;
-}
-
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past,
-.reveal>.backgrounds .slide-background.past[data-background-transition=zoom] {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(16);
-	   -moz-transform: scale(16);
-	    -ms-transform: scale(16);
-	     -o-transform: scale(16);
-	        transform: scale(16);
-}
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future,
-.reveal>.backgrounds .slide-background.future[data-background-transition=zoom] {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(0.2);
-	   -moz-transform: scale(0.2);
-	    -ms-transform: scale(0.2);
-	     -o-transform: scale(0.2);
-	        transform: scale(0.2);
-}
-
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past,
-.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom] {
-	opacity: 0;
-		visibility: hidden;
-
-		-webkit-transform: scale(16);
-		   -moz-transform: scale(16);
-		    -ms-transform: scale(16);
-		     -o-transform: scale(16);
-		        transform: scale(16);
-}
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future,
-.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom] {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(0.2);
-	   -moz-transform: scale(0.2);
-	    -ms-transform: scale(0.2);
-	     -o-transform: scale(0.2);
-	        transform: scale(0.2);
-}
-
-
-/* Global transition speed settings */
-.reveal[data-transition-speed="fast"]>.backgrounds .slide-background {
-	-webkit-transition-duration: 400ms;
-	   -moz-transition-duration: 400ms;
-	    -ms-transition-duration: 400ms;
-	        transition-duration: 400ms;
-}
-.reveal[data-transition-speed="slow"]>.backgrounds .slide-background {
-	-webkit-transition-duration: 1200ms;
-	   -moz-transition-duration: 1200ms;
-	    -ms-transition-duration: 1200ms;
-	        transition-duration: 1200ms;
-}
-
-
-/*********************************************
- * RTL SUPPORT
- *********************************************/
-
-.reveal.rtl .slides,
-.reveal.rtl .slides h1,
-.reveal.rtl .slides h2,
-.reveal.rtl .slides h3,
-.reveal.rtl .slides h4,
-.reveal.rtl .slides h5,
-.reveal.rtl .slides h6 {
-	direction: rtl;
-	font-family: sans-serif;
-}
-
-.reveal.rtl pre,
-.reveal.rtl code {
-	direction: ltr;
-}
-
-.reveal.rtl ol,
-.reveal.rtl ul {
-	text-align: right;
-}
-
-.reveal.rtl .progress span {
-	float: right
-}
-
-/*********************************************
- * PARALLAX BACKGROUND
- *********************************************/
-
-.reveal.has-parallax-background .backgrounds {
-	-webkit-transition: all 0.8s ease;
-	   -moz-transition: all 0.8s ease;
-	    -ms-transition: all 0.8s ease;
-	        transition: all 0.8s ease;
-}
-
-/* Global transition speed settings */
-.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds {
-	-webkit-transition-duration: 400ms;
-	   -moz-transition-duration: 400ms;
-	    -ms-transition-duration: 400ms;
-	        transition-duration: 400ms;
-}
-.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds {
-	-webkit-transition-duration: 1200ms;
-	   -moz-transition-duration: 1200ms;
-	    -ms-transition-duration: 1200ms;
-	        transition-duration: 1200ms;
-}
-
-
-/*********************************************
- * LINK PREVIEW OVERLAY
- *********************************************/
-
- .reveal .preview-link-overlay {
- 	position: absolute;
- 	top: 0;
- 	left: 0;
- 	width: 100%;
- 	height: 100%;
- 	z-index: 1000;
- 	background: rgba( 0, 0, 0, 0.9 );
- 	opacity: 0;
- 	visibility: hidden;
-
- 	-webkit-transition: all 0.3s ease;
- 	   -moz-transition: all 0.3s ease;
- 	    -ms-transition: all 0.3s ease;
- 	        transition: all 0.3s ease;
- }
- 	.reveal .preview-link-overlay.visible {
- 		opacity: 1;
- 		visibility: visible;
- 	}
-
- 	.reveal .preview-link-overlay .spinner {
- 		position: absolute;
- 		display: block;
- 		top: 50%;
- 		left: 50%;
- 		width: 32px;
- 		height: 32px;
- 		margin: -16px 0 0 -16px;
- 		z-index: 10;
- 		background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);
-
- 		visibility: visible;
- 		opacity: 0.6;
-
- 		-webkit-transition: all 0.3s ease;
- 		   -moz-transition: all 0.3s ease;
- 		    -ms-transition: all 0.3s ease;
- 		        transition: all 0.3s ease;
- 	}
-
- 	.reveal .preview-link-overlay header {
- 		position: absolute;
- 		left: 0;
- 		top: 0;
- 		width: 100%;
- 		height: 40px;
- 		z-index: 2;
- 		border-bottom: 1px solid #222;
- 	}
- 		.reveal .preview-link-overlay header a {
- 			display: inline-block;
- 			width: 40px;
- 			height: 40px;
- 			padding: 0 10px;
- 			float: right;
- 			opacity: 0.6;
-
- 			box-sizing: border-box;
- 		}
- 			.reveal .preview-link-overlay header a:hover {
- 				opacity: 1;
- 			}
- 			.reveal .preview-link-overlay header a .icon {
- 				display: inline-block;
- 				width: 20px;
- 				height: 20px;
-
- 				background-position: 50% 50%;
- 				background-size: 100%;
- 				background-repeat: no-repeat;
- 			}
- 			.reveal .preview-link-overlay header a.close .icon {
- 				background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC);
- 			}
- 			.reveal .preview-link-overlay header a.external .icon {
- 				background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==);
- 			}
-
- 	.reveal .preview-link-overlay .viewport {
- 		position: absolute;
- 		top: 40px;
- 		right: 0;
- 		bottom: 0;
- 		left: 0;
- 	}
-
- 	.reveal .preview-link-overlay .viewport iframe {
- 		width: 100%;
- 		height: 100%;
- 		max-width: 100%;
- 		max-height: 100%;
- 		border: 0;
-
- 		opacity: 0;
- 		visibility: hidden;
-
- 		-webkit-transition: all 0.3s ease;
- 		   -moz-transition: all 0.3s ease;
- 		    -ms-transition: all 0.3s ease;
- 		        transition: all 0.3s ease;
- 	}
-
- 	.reveal .preview-link-overlay.loaded .viewport iframe {
- 		opacity: 1;
- 		visibility: visible;
- 	}
-
- 	.reveal .preview-link-overlay.loaded .spinner {
- 		opacity: 0;
- 		visibility: hidden;
-
- 		-webkit-transform: scale(0.2);
- 		   -moz-transform: scale(0.2);
- 		    -ms-transform: scale(0.2);
- 		        transform: scale(0.2);
- 	}
-
-
-
-/*********************************************
- * PLAYBACK COMPONENT
- *********************************************/
-
-.reveal .playback {
-	position: fixed;
-	left: 15px;
-	bottom: 15px;
-	z-index: 30;
-	cursor: pointer;
-
-	-webkit-transition: all 400ms ease;
-	   -moz-transition: all 400ms ease;
-	    -ms-transition: all 400ms ease;
-	        transition: all 400ms ease;
-}
-
-.reveal.overview .playback {
-	opacity: 0;
-	visibility: hidden;
-}
-
-
-/*********************************************
- * ROLLING LINKS
- *********************************************/
-
-.reveal .roll {
-	display: inline-block;
-	line-height: 1.2;
-	overflow: hidden;
-
-	vertical-align: top;
-
-	-webkit-perspective: 400px;
-	   -moz-perspective: 400px;
-	    -ms-perspective: 400px;
-	        perspective: 400px;
-
-	-webkit-perspective-origin: 50% 50%;
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-	.reveal .roll:hover {
-		background: none;
-		text-shadow: none;
-	}
-.reveal .roll span {
-	display: block;
-	position: relative;
-	padding: 0 2px;
-
-	pointer-events: none;
-
-	-webkit-transition: all 400ms ease;
-	   -moz-transition: all 400ms ease;
-	    -ms-transition: all 400ms ease;
-	        transition: all 400ms ease;
-
-	-webkit-transform-origin: 50% 0%;
-	   -moz-transform-origin: 50% 0%;
-	    -ms-transform-origin: 50% 0%;
-	        transform-origin: 50% 0%;
-
-	-webkit-transform-style: preserve-3d;
-	   -moz-transform-style: preserve-3d;
-	    -ms-transform-style: preserve-3d;
-	        transform-style: preserve-3d;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	        backface-visibility: hidden;
-}
-	.reveal .roll:hover span {
-	    background: rgba(0,0,0,0.5);
-
-	    -webkit-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	       -moz-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	        -ms-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	            transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	}
-.reveal .roll span:after {
-	content: attr(data-title);
-
-	display: block;
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0 2px;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	        backface-visibility: hidden;
-
-	-webkit-transform-origin: 50% 0%;
-	   -moz-transform-origin: 50% 0%;
-	    -ms-transform-origin: 50% 0%;
-	        transform-origin: 50% 0%;
-
-	-webkit-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	   -moz-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	    -ms-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	        transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-}
-
-
-/*********************************************
- * SPEAKER NOTES
- *********************************************/
-
-.reveal aside.notes {
-	display: none;
-}
-
-
-/*********************************************
- * ZOOM PLUGIN
- *********************************************/
-
-.zoomed .reveal *,
-.zoomed .reveal *:before,
-.zoomed .reveal *:after {
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-
-	-webkit-backface-visibility: visible !important;
-	   -moz-backface-visibility: visible !important;
-	    -ms-backface-visibility: visible !important;
-	        backface-visibility: visible !important;
-}
-
-.zoomed .reveal .progress,
-.zoomed .reveal .controls {
-	opacity: 0;
-}
-
-.zoomed .reveal .roll span {
-	background: none;
-}
-
-.zoomed .reveal .roll span:after {
-	visibility: hidden;
-}
-
-
diff --git a/docs/slides/BOS14/_support/reveal.js/css/reveal.min.css b/docs/slides/BOS14/_support/reveal.js/css/reveal.min.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/reveal.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-@charset "UTF-8";/*!
- * reveal.js
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
- */ html,body,.reveal div,.reveal span,.reveal applet,.reveal object,.reveal iframe,.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6,.reveal p,.reveal blockquote,.reveal pre,.reveal a,.reveal abbr,.reveal acronym,.reveal address,.reveal big,.reveal cite,.reveal code,.reveal del,.reveal dfn,.reveal em,.reveal img,.reveal ins,.reveal kbd,.reveal q,.reveal s,.reveal samp,.reveal small,.reveal strike,.reveal strong,.reveal sub,.reveal sup,.reveal tt,.reveal var,.reveal b,.reveal u,.reveal i,.reveal center,.reveal dl,.reveal dt,.reveal dd,.reveal ol,.reveal ul,.reveal li,.reveal fieldset,.reveal form,.reveal label,.reveal legend,.reveal table,.reveal caption,.reveal tbody,.reveal tfoot,.reveal thead,.reveal tr,.reveal th,.reveal td,.reveal article,.reveal aside,.reveal canvas,.reveal details,.reveal embed,.reveal figure,.reveal figcaption,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal output,.reveal ruby,.reveal section,.reveal summary,.reveal time,.reveal mark,.reveal audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}.reveal article,.reveal aside,.reveal details,.reveal figcaption,.reveal figure,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal section{display:block}html,body{width:100%;height:100%;overflow:hidden}body{position:relative;line-height:1}::selection{background:#FF5E99;color:#fff;text-shadow:none}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;word-wrap:break-word;line-height:1}.reveal h1{font-size:3.77em}.reveal h2{font-size:2.11em}.reveal h3{font-size:1.55em}.reveal h4{font-size:1em}.reveal .slides section .fragment{opacity:0;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .slides section .fragment.visible{opacity:1}.reveal .slides section .fragment.grow{opacity:1}.reveal .slides section .fragment.grow.visible{-webkit-transform:scale(1.3);-moz-transform:scale(1.3);-ms-transform:scale(1.3);-o-transform:scale(1.3);transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1}.reveal .slides section .fragment.shrink.visible{-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}.reveal .slides section .fragment.zoom-in{opacity:0;-webkit-transform:scale(0.1);-moz-transform:scale(0.1);-ms-transform:scale(0.1);-o-transform:scale(0.1);transform:scale(0.1)}.reveal .slides section .fragment.zoom-in.visible{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.reveal .slides section .fragment.roll-in{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}.reveal .slides section .fragment.roll-in.visible{opacity:1;-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-ms-transform:rotateX(0);-o-transform:rotateX(0);transform:rotateX(0)}.reveal .slides section .fragment.fade-out{opacity:1}.reveal .slides section .fragment.fade-out.visible{opacity:0}.reveal .slides section .fragment.semi-fade-out{opacity:1}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5}.reveal .slides section .fragment.current-visible{opacity:0}.reveal .slides section .fragment.current-visible.current-fragment{opacity:1}.reveal .slides section .fragment.highlight-red,.reveal .slides section .fragment.highlight-current-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-current-green,.reveal .slides section .fragment.highlight-blue,.reveal .slides section .fragment.highlight-current-blue{opacity:1}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal .slides section .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .slides section .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .slides section .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal iframe{z-index:1}.reveal img,.reveal video,.reveal iframe{max-width:95%;max-height:95%}.reveal a{position:relative}.reveal strong,.reveal b{font-weight:700}.reveal em,.reveal i{font-style:italic}.reveal ol,.reveal ul{display:inline-block;text-align:left;margin:0 0 0 1em}.reveal ol{list-style-type:decimal}.reveal ul{list-style-type:disc}.reveal ul ul{list-style-type:square}.reveal ul ul ul{list-style-type:circle}.reveal ul ul,.reveal ul ol,.reveal ol ol,.reveal ol ul{display:block;margin-left:40px}.reveal p{margin-bottom:10px;line-height:1.2em}.reveal q,.reveal blockquote{quotes:none}.reveal blockquote{display:block;position:relative;width:70%;margin:5px auto;padding:5px;font-style:italic;background:rgba(255,255,255,.05);box-shadow:0 0 2px rgba(0,0,0,.2)}.reveal blockquote p:first-child,.reveal blockquote p:last-child{display:inline-block}.reveal q{font-style:italic}.reveal pre{display:block;position:relative;width:90%;margin:15px auto;text-align:left;font-size:.55em;font-family:monospace;line-height:1.2em;word-wrap:break-word;box-shadow:0 0 6px rgba(0,0,0,.3)}.reveal code{font-family:monospace}.reveal pre code{padding:5px;overflow:auto;max-height:400px;word-wrap:normal}.reveal pre.stretch code{height:100%;max-height:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal table th,.reveal table td{text-align:left;padding-right:.3em}.reveal table th{font-weight:700}.reveal sup{vertical-align:super}.reveal sub{vertical-align:sub}.reveal small{display:inline-block;font-size:.6em;line-height:1.2em;vertical-align:top}.reveal small *{vertical-align:top}.reveal .stretch{max-width:none;max-height:none}.reveal .controls{display:none;position:fixed;width:110px;height:110px;z-index:30;right:10px;bottom:10px}.reveal .controls div{position:absolute;opacity:.05;width:0;height:0;border:12px solid transparent;-moz-transform:scale(.9999);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .controls div.enabled{opacity:.7;cursor:pointer}.reveal .controls div.enabled:active{margin-top:1px}.reveal .controls div.navigate-left{top:42px;border-right-width:22px;border-right-color:#eee}.reveal .controls div.navigate-left.fragmented{opacity:.3}.reveal .controls div.navigate-right{left:74px;top:42px;border-left-width:22px;border-left-color:#eee}.reveal .controls div.navigate-right.fragmented{opacity:.3}.reveal .controls div.navigate-up{left:42px;border-bottom-width:22px;border-bottom-color:#eee}.reveal .controls div.navigate-up.fragmented{opacity:.3}.reveal .controls div.navigate-down{left:42px;top:74px;border-top-width:22px;border-top-color:#eee}.reveal .controls div.navigate-down.fragmented{opacity:.3}.reveal .progress{position:fixed;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10}.reveal .progress:after{content:'';display:'block';position:absolute;height:20px;width:100%;top:-20px}.reveal .progress span{display:block;height:100%;width:0;-webkit-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);transition:width 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-number{position:fixed;display:block;right:15px;bottom:15px;opacity:.5;z-index:31;font-size:12px}.reveal{position:relative;width:100%;height:100%;-ms-touch-action:none}.reveal .slides{position:absolute;width:100%;height:100%;left:50%;top:50%;overflow:visible;z-index:1;text-align:center;-webkit-transition:-webkit-perspective .4s ease;-moz-transition:-moz-perspective .4s ease;-ms-transition:-ms-perspective .4s ease;-o-transition:-o-perspective .4s ease;transition:perspective .4s ease;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px;-webkit-perspective-origin:0 -100px;-moz-perspective-origin:0 -100px;-ms-perspective-origin:0 -100px;perspective-origin:0 -100px}.reveal .slides>section{-ms-perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;padding:20px 0;z-index:10;line-height:1.2em;font-weight:inherit;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:-webkit-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-webkit-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:-moz-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-moz-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:-ms-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-ms-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:-o-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-o-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);transition:transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow] .slides section{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides section[data-transition-speed=fast]{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal .slides section[data-transition-speed=slow]{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides>section{left:-50%;top:-50%}.reveal .slides>section.stack{padding-top:0;padding-bottom:0}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:auto!important}.reveal .slides>section.future,.reveal .slides>section>section.future,.reveal .slides>section.past,.reveal .slides>section>section.past{pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section[data-transition=default].past,.reveal .slides>section.past{display:block;opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section.future{display:block;opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section.past{display:block;opacity:0;-webkit-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-moz-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-ms-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section.future{display:block;opacity:0;-webkit-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-moz-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-ms-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides>section[data-transition=concave].past,.reveal.concave .slides>section.past{-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal.concave .slides>section.future{-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal.concave .slides>section>section.past{-webkit-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-moz-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-ms-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal.concave .slides>section>section.future{-webkit-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-moz-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-ms-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides>section[data-transition=zoom],.reveal.zoom .slides>section{-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-ms-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal.zoom .slides>section.past{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal.zoom .slides>section.future{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal.zoom .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=zoom].future,.reveal.zoom .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.linear section{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal.linear .slides>section.past{-webkit-transform:translate(-150%,0);-moz-transform:translate(-150%,0);-ms-transform:translate(-150%,0);-o-transform:translate(-150%,0);transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal.linear .slides>section.future{-webkit-transform:translate(150%,0);-moz-transform:translate(150%,0);-ms-transform:translate(150%,0);-o-transform:translate(150%,0);transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal.linear .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal.linear .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.cube .slides{-webkit-perspective:1300px;-moz-perspective:1300px;-ms-perspective:1300px;perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.center.cube .slides section{min-height:auto}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg);-moz-transform:translateZ(-90px) rotateX(65deg);-ms-transform:translateZ(-90px) rotateX(65deg);-o-transform:translateZ(-90px) rotateX(65deg);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0}.reveal.cube .slides>section.past{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg);transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg);-moz-transform:translate3d(100%,0,0) rotateY(90deg);-ms-transform:translate3d(100%,0,0) rotateY(90deg);transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg);-moz-transform:translate3d(0,-100%,0) rotateX(90deg);-ms-transform:translate3d(0,-100%,0) rotateX(90deg);transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg);-moz-transform:translate3d(0,100%,0) rotateX(-90deg);-ms-transform:translate3d(0,100%,0) rotateX(-90deg);transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{-webkit-perspective-origin:0 50%;-moz-perspective-origin:0 50%;-ms-perspective-origin:0 50%;perspective-origin:0 50%;-webkit-perspective:3000px;-moz-perspective:3000px;-ms-perspective:3000px;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0}.reveal.page .slides>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(-40%,0,0) rotateY(-80deg);-moz-transform:translate3d(-40%,0,0) rotateY(-80deg);-ms-transform:translate3d(-40%,0,0) rotateY(-80deg);transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,-40%,0) rotateX(80deg);-moz-transform:translate3d(0,-40%,0) rotateX(80deg);-ms-transform:translate3d(0,-40%,0) rotateX(80deg);transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section,.reveal.fade .slides>section>section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:opacity .5s;-moz-transition:opacity .5s;-ms-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section,.reveal.fade.overview-deactivating .slides section,.reveal.fade.overview-deactivating .slides>section>section{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal.overview .slides{-webkit-perspective-origin:0 0;-moz-perspective-origin:0 0;-ms-perspective-origin:0 0;perspective-origin:0 0;-webkit-perspective:700px;-moz-perspective:700px;-ms-perspective:700px;perspective:700px}.reveal.overview .slides section{height:600px;top:-300px!important;overflow:hidden;opacity:1!important;visibility:visible!important;cursor:pointer;background:rgba(0,0,0,.1)}.reveal.overview .slides section .fragment{opacity:1}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides section>section{opacity:1;cursor:pointer}.reveal.overview .slides section:hover{background:rgba(0,0,0,.3)}.reveal.overview .slides section.present{background:rgba(0,0,0,.3)}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0;overflow:visible}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;-webkit-transition:all 1s ease;-moz-transition:all 1s ease;-ms-transition:all 1s ease;-o-transition:all 1s ease;transition:all 1s ease}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.no-transforms{overflow-y:auto}.no-transforms .reveal .slides{position:relative;width:80%;height:auto!important;top:0;left:50%;margin:0;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none!important}.no-transforms .reveal .slides section{display:block!important;opacity:1!important;position:relative!important;height:auto;min-height:auto;top:0;left:-50%;margin:70px 0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}.no-transforms .reveal .slides section section{left:0}.reveal .no-transition,.reveal .no-transition *{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important;transition:none!important}.reveal .state-background{position:absolute;width:100%;height:100%;background:rgba(0,0,0,0);-webkit-transition:background 800ms ease;-moz-transition:background 800ms ease;-ms-transition:background 800ms ease;-o-transition:background 800ms ease;transition:background 800ms ease}.alert .reveal .state-background{background:rgba(200,50,30,.6)}.soothe .reveal .state-background{background:rgba(50,200,90,.4)}.blackout .reveal .state-background{background:rgba(0,0,0,.6)}.whiteout .reveal .state-background{background:rgba(255,255,255,.6)}.cobalt .reveal .state-background{background:rgba(22,152,213,.6)}.mint .reveal .state-background{background:rgba(22,213,75,.6)}.submerge .reveal .state-background{background:rgba(12,25,77,.6)}.lila .reveal .state-background{background:rgba(180,50,140,.6)}.sunset .reveal .state-background{background:rgba(255,122,0,.6)}.reveal>.backgrounds{position:absolute;width:100%;height:100%;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px}.reveal .slide-background{position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;background-color:rgba(0,0,0,0);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;-webkit-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);transition:all 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-background.present{opacity:1;visibility:visible}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal[data-background-transition=none]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=none]{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal[data-background-transition=slide]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=slide]{opacity:1;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=slide]{-webkit-transform:translate(-100%,0);-moz-transform:translate(-100%,0);-ms-transform:translate(-100%,0);-o-transform:translate(-100%,0);transform:translate(-100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=slide]{-webkit-transform:translate(100%,0);-moz-transform:translate(100%,0);-ms-transform:translate(100%,0);-o-transform:translate(100%,0);transform:translate(100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide]{-webkit-transform:translate(0,-100%);-moz-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-o-transform:translate(0,-100%);transform:translate(0,-100%)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide]{-webkit-transform:translate(0,100%);-moz-transform:translate(0,100%);-ms-transform:translate(0,100%);-o-transform:translate(0,100%);transform:translate(0,100%)}.reveal[data-background-transition=convex]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);-moz-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);-moz-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=zoom]{-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-ms-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl pre,.reveal.rtl code{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{float:right}.reveal.has-parallax-background .backgrounds{-webkit-transition:all .8s ease;-moz-transition:all .8s ease;-ms-transition:all .8s ease;transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .preview-link-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.visible{opacity:1;visibility:visible}.reveal .preview-link-overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal .preview-link-overlay header a{display:inline-block;width:40px;height:40px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal .preview-link-overlay header a:hover{opacity:1}.reveal .preview-link-overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal .preview-link-overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal .preview-link-overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal .preview-link-overlay .viewport{position:absolute;top:40px;right:0;bottom:0;left:0}.reveal .preview-link-overlay .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.loaded .viewport iframe{opacity:1;visibility:visible}.reveal .preview-link-overlay.loaded .spinner{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);transform:scale(0.2)}.reveal .playback{position:fixed;left:15px;bottom:15px;z-index:30;cursor:pointer;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;-webkit-perspective:400px;-moz-perspective:400px;-ms-perspective:400px;perspective:400px;-webkit-perspective-origin:50% 50%;-moz-perspective-origin:50% 50%;-ms-perspective-origin:50% 50%;perspective-origin:50% 50%}.reveal .roll:hover{background:0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);-webkit-transform:translate3d(0px,0,-45px) rotateX(90deg);-moz-transform:translate3d(0px,0,-45px) rotateX(90deg);-ms-transform:translate3d(0px,0,-45px) rotateX(90deg);transform:translate3d(0px,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:translate3d(0px,110%,0) rotateX(-90deg);-moz-transform:translate3d(0px,110%,0) rotateX(-90deg);-ms-transform:translate3d(0px,110%,0) rotateX(-90deg);transform:translate3d(0px,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.zoomed .reveal *,.zoomed .reveal :before,.zoomed .reveal :after{-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;transform:none!important;-webkit-backface-visibility:visible!important;-moz-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .progress,.zoomed .reveal .controls{opacity:0}.zoomed .reveal .roll span{background:0}.zoomed .reveal .roll span:after{visibility:hidden}
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/README.md b/docs/slides/BOS14/_support/reveal.js/css/theme/README.md
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-## Dependencies
-
-Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup
-
-You also need to install Ruby and then Sass (with `gem install sass`).
-
-## Creating a Theme
-
-To create your own theme, start by duplicating any ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source) and adding it to the compilation list in the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js).
-
-Each theme file does four things in the following order:
-
-1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)**
-Shared utility functions.
-
-2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)**
-Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3.
-
-3. **Override**
-This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding full selectors with hardcoded styles.
-
-4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)**
-The template theme file which will generate final CSS output based on the currently defined variables.
-
-When you are done, run `grunt themes` to compile the Sass file to CSS and you are ready to use your new theme.
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/beige.css b/docs/slides/BOS14/_support/reveal.js/css/theme/beige.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/beige.css
+++ /dev/null
@@ -1,148 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * Beige theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-@font-face {
-  font-family: 'League Gothic';
-  src: url("../../lib/font/league_gothic-webfont.eot");
-  src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg");
-  font-weight: normal;
-  font-style: normal; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f7f2d3;
-  background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3));
-  background: -webkit-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background: -o-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background: -ms-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background: radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background-color: #f7f3de; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #333333; }
-
-::selection {
-  color: white;
-  background: rgba(79, 64, 28, 0.99);
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #333333;
-  font-family: "League Gothic", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #8b743d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #c0a86e;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #564826; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #333333;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #8b743d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #8b743d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #8b743d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #8b743d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #8b743d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #c0a86e; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #c0a86e; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #c0a86e; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #c0a86e; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #8b743d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #8b743d; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/blood.css b/docs/slides/BOS14/_support/reveal.js/css/theme/blood.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/blood.css
+++ /dev/null
@@ -1,175 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
-/**
- * Blood theme for reveal.js
- * Author: Walther http://github.com/Walther
- *
- * Designed to be used with highlight.js theme
- * "monokai_sublime.css" available from
- * https://github.com/isagalaev/highlight.js/
- *
- * For other themes, change $codeBackground accordingly.
- *
- */
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #222222;
-  background: -moz-radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #626262), color-stop(100%, #222222));
-  background: -webkit-radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background: -o-radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background: -ms-radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background: radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background-color: #2b2b2b; }
-
-.reveal {
-  font-family: Ubuntu, "sans-serif";
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #eeeeee; }
-
-::selection {
-  color: white;
-  background: #aa2233;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #eeeeee;
-  font-family: Ubuntu, "sans-serif";
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: 2px 2px 2px #222222; }
-
-.reveal h1 {
-  text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #aa2233;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #dd5566;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #6a1520; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #eeeeee;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #aa2233;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #aa2233; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #aa2233; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #aa2233; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #aa2233; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #dd5566; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #dd5566; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #dd5566; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #dd5566; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #aa2233;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #aa2233; }
-
-.reveal p {
-  font-weight: 300;
-  text-shadow: 1px 1px #222222; }
-
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  font-weight: 700; }
-
-.reveal a:not(.image),
-.reveal a:not(.image):hover {
-  text-shadow: 2px 2px 2px #000; }
-
-.reveal small a:not(.image),
-.reveal small a:not(.image):hover {
-  text-shadow: 1px 1px 1px #000; }
-
-.reveal p code {
-  background-color: #23241f;
-  display: inline-block;
-  border-radius: 7px; }
-
-.reveal small code {
-  vertical-align: baseline; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/default.css b/docs/slides/BOS14/_support/reveal.js/css/theme/default.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/default.css
+++ /dev/null
@@ -1,148 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * Default theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-@font-face {
-  font-family: 'League Gothic';
-  src: url("../../lib/font/league_gothic-webfont.eot");
-  src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg");
-  font-weight: normal;
-  font-style: normal; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #1c1e20;
-  background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20));
-  background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background-color: #2b2b2b; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #eeeeee; }
-
-::selection {
-  color: white;
-  background: #ff5e99;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #eeeeee;
-  font-family: "League Gothic", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-.reveal h1 {
-  text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #13daec;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #71e9f4;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #0d99a5; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #eeeeee;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #13daec;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #13daec; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #13daec; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #13daec; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #13daec; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #71e9f4; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #71e9f4; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #71e9f4; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #71e9f4; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #13daec;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #13daec; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/moon.css b/docs/slides/BOS14/_support/reveal.js/css/theme/moon.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/moon.css
+++ /dev/null
@@ -1,148 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * Solarized Dark theme for reveal.js.
- * Author: Achim Staebler
- */
-@font-face {
-  font-family: 'League Gothic';
-  src: url("../../lib/font/league_gothic-webfont.eot");
-  src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg");
-  font-weight: normal;
-  font-style: normal; }
-
-/**
- * Solarized colors by Ethan Schoonover
- */
-html * {
-  color-profile: sRGB;
-  rendering-intent: auto; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #002b36;
-  background-color: #002b36; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #93a1a1; }
-
-::selection {
-  color: white;
-  background: #d33682;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #eee8d5;
-  font-family: "League Gothic", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #268bd2;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #78b9e6;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #1a6091; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #93a1a1;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #268bd2;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #268bd2; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #268bd2; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #268bd2; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #268bd2; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #78b9e6; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #78b9e6; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #78b9e6; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #78b9e6; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #268bd2;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #268bd2; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/night.css b/docs/slides/BOS14/_support/reveal.js/css/theme/night.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/night.css
+++ /dev/null
@@ -1,136 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
-/**
- * Black theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #111111;
-  background-color: #111111; }
-
-.reveal {
-  font-family: "Open Sans", sans-serif;
-  font-size: 30px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #eeeeee; }
-
-::selection {
-  color: white;
-  background: #e7ad52;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #eeeeee;
-  font-family: "Montserrat", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: -0.03em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #e7ad52;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #f3d7ac;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #d08a1d; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #eeeeee;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #e7ad52;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #e7ad52; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #e7ad52; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #e7ad52; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #e7ad52; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #f3d7ac; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #f3d7ac; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #f3d7ac; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #f3d7ac; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #e7ad52;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #e7ad52; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/seminar.css b/docs/slides/BOS14/_support/reveal.js/css/theme/seminar.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/seminar.css
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f0f1eb;
-  background-color: #f0f1eb; }
-
-.reveal {
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-.reveal a {
-  color: #8b7c69;
-  text-decoration: none;
-}
-::selection {
-  color: white;
-  background: #26351c;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 40px 0;
-  color: #383d3d;
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	// :color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.05em 0.05em 0.25em blue;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-/*
-.reveal a:not(.image) {
-  line-height: 1.3em; }
-
-
-.reveal a:not(.image) {
-  color: #51483d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #8b7c69;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #25211c; }
-
-*/
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #51483d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #51483d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #51483d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #51483d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #51483d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #8b7c69; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #8b7c69; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #8b7c69; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #8b7c69; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #51483d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #51483d; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/seminar.orig.css b/docs/slides/BOS14/_support/reveal.js/css/theme/seminar.orig.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/seminar.orig.css
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- * The default theme for reveal.js presentations.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.ttf') format('truetype');
-	font-weight: normal;
-	font-style: normal;
-}
-
-@font-face {
-		font-family: 'PTSansNarrow';
-        src: url('../../lib/font/PT_Sans-Narrow-Web-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-@font-face {
-		font-family: 'OpenSans';
-        src: url('../../lib/font/OpenSans-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'OpenSans', Times, 'Times New Roman', serif;
-	font-size: 36;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #eee;
-
-	background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiM1NTVhNWYiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMWMxZTIwIiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
-	background-color: #2b2b2b;
-	background: -moz-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%, rgba(28,30,32,1) 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(85,90,95,1)), color-stop(100%,rgba(28,30,32,1)));
-	background: -webkit-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -o-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-}
-
-
-/*********************************************
- * main.css OVERIDES
- *********************************************/
-
-
-/*--DW-- uncomment below to undo globally centered text from main.css*/
-
-/*.reveal .slides {
-	text-align: left;
-}
-
-.reveal li {
-	padding-bottom: 0.7em;
-	line-height: 1em;
-}
-.reveal ul ul {
-	padding-left: 8%;
-	padding-top: 0.7em;
-	font-size: 85%;
-}*/
-
-/*--DW--
-* override list width to make multiline list items
-* a bit more manageable
-*/
-.reveal ul {
-	max-width: 80%;
-}
-
-.reveal li {
-	padding-bottom: 0.3em;
-}
-
-/*--DW-- uncenter pararagraph blocks*/
-.reveal .slides p {
-	text-align: left
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2 {
-	margin: 0 0 20px 0;
-	color: #eee;
-	font-family: 'League Gothic', Impact, sans-serif;
-	line-height: 0.9em;
-	letter-spacing: 0.02em;
-	
-	text-align: center;
-	text-transform: uppercase;
-	text-shadow: 0px 1px 0px rgba(0,0,0,1);
-}
-
-.reveal h2 {
-	font-family: 'PTSansNarrow';
-	font-size: 130%;
-}
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-
-
-/*********************************************
- * BLOCKQUOTES
- *********************************************/
-
-/*--DW--*/
-.reveal blockquote
-{   background: rgba(255,255,255, .2);
-    font-size: 75%;
-    text-align: justify;
-    width: 70%;
-    padding: 0.5em 5% 0.2em;
-    margin: 0 10%;
-    border: 2px solid rgba(255, 255, 255, .1);
-    -webkit-box-shadow: .1em .1em .5em black inset;
-    -moz-box-shadow: .1em .1em .5em black inset;
-    box-shadow: .1em .1em .5em black inset;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: hsl(185, 85%, 50%);
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-.reveal a:not(.image):hover {
-	color: hsl(185, 85%, 70%);
-	
-	text-shadow: none;
-	border: none;
-	border-radius: 2px;
-}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: hsl(185, 60%, 35%);
-}
-
-
-/*********************************************
- * IMAGES AND FIGURES
- *********************************************/
-
-/*--DW-- added figures; changed img styling*/
-/*pandoc*/
-.reveal figure {
-	margin-left: auto;
-	margin-right: auto;
-}
-
-/*pandoc*/
-.reveal figcaption {
-	text-align: center;
-	font-size: 75%;
-	font-style: italic;
-}
-.reveal section img,
-.reveal section embed {
-/*	width: 80%;
-	height: 80%;
-*/	display: block;
-	margin-left: auto;
-	margin-right: auto;
-	padding: 15px;
-	background: rgba(255,255,255, .75);
-    border: 2px solid rgba(255, 255, 255, .1);
-    -webkit-box-shadow: .1em .1em .5em black inset;
-       -moz-box-shadow: .1em .1em .5em black inset;
-            box-shadow: .1em .1em .5em black inset;
-
-/*--DW-- original image box styling*/
-/*
--webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-
--webkit-transition: all .2s linear;
-   -moz-transition: all .2s linear;
-    -ms-transition: all .2s linear;
-     -o-transition: all .2s linear;
-        transition: all .2s linear;
-*/
-}
-
-.reveal a:hover img {
-	background: rgba(255,255,255,0.2);
-	border-color: #13DAEC;
-	
-	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		/*color: hsl(185, 85%, 70%);*/
-		color: rgba(138, 201, 85, 0.60);
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		/*background: hsl(185, 85%, 50%);*/
-		background: rgba(138, 201, 85, 0.60);
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/serif.css b/docs/slides/BOS14/_support/reveal.js/css/theme/serif.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/serif.css
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-.reveal a:not(.image) {
-  line-height: 1.3em; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f0f1eb;
-  background-color: #f0f1eb; }
-
-.reveal {
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-::selection {
-  color: white;
-  background: #26351c;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #383d3d;
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #51483d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #8b7c69;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #25211c; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #51483d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #51483d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #51483d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #51483d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #51483d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #8b7c69; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #8b7c69; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #8b7c69; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #8b7c69; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #51483d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #51483d; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/simple.css b/docs/slides/BOS14/_support/reveal.js/css/theme/simple.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/simple.css
+++ /dev/null
@@ -1,138 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is darkblue.
- *
- * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
- * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: white;
-  background-color: white; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-::selection {
-  color: white;
-  background: rgba(0, 0, 0, 0.99);
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: black;
-  font-family: "News Cycle", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: darkblue;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #0000f1;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #00003f; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: darkblue;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: darkblue; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: darkblue; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: darkblue; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: darkblue; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #0000f1; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #0000f1; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #0000f1; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #0000f1; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: darkblue;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: darkblue; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/sky.css b/docs/slides/BOS14/_support/reveal.js/css/theme/sky.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/sky.css
+++ /dev/null
@@ -1,145 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
-/**
- * Sky theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-.reveal a:not(.image) {
-  line-height: 1.3em; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #add9e4;
-  background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4));
-  background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background-color: #f7fbfc; }
-
-.reveal {
-  font-family: "Open Sans", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #333333; }
-
-::selection {
-  color: white;
-  background: #134674;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #333333;
-  font-family: "Quicksand", sans-serif;
-  line-height: 0.9em;
-  letter-spacing: -0.08em;
-  text-transform: uppercase;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #3b759e;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #74a7cb;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #264c66; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #333333;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #3b759e;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #3b759e; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #3b759e; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #3b759e; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #3b759e; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #74a7cb; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #74a7cb; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #74a7cb; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #74a7cb; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #3b759e;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #3b759e; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/solarized.css b/docs/slides/BOS14/_support/reveal.js/css/theme/solarized.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/solarized.css
+++ /dev/null
@@ -1,148 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * Solarized Light theme for reveal.js.
- * Author: Achim Staebler
- */
-@font-face {
-  font-family: 'League Gothic';
-  src: url("../../lib/font/league_gothic-webfont.eot");
-  src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg");
-  font-weight: normal;
-  font-style: normal; }
-
-/**
- * Solarized colors by Ethan Schoonover
- */
-html * {
-  color-profile: sRGB;
-  rendering-intent: auto; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #fdf6e3;
-  background-color: #fdf6e3; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #657b83; }
-
-::selection {
-  color: white;
-  background: #d33682;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #586e75;
-  font-family: "League Gothic", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #268bd2;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #78b9e6;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #1a6091; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #657b83;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #268bd2;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #268bd2; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #268bd2; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #268bd2; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #268bd2; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #78b9e6; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #78b9e6; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #78b9e6; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #78b9e6; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #268bd2;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #268bd2; }
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/beige.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/beige.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/beige.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Beige theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-
-// Override theme settings (see ../template/settings.scss)
-$mainColor: #333;
-$headingColor: #333;
-$headingTextShadow: none;
-$backgroundColor: #f7f3de;
-$linkColor: #8b743d;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: rgba(79, 64, 28, 0.99);
-$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
-
-// Background generator
-@mixin bodyBackground() {
-	@include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) );
-}
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/blood.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/blood.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/blood.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Blood theme for reveal.js
- * Author: Walther http://github.com/Walther
- *
- * Designed to be used with highlight.js theme
- * "monokai_sublime.css" available from
- * https://github.com/isagalaev/highlight.js/
- *
- * For other themes, change $codeBackground accordingly.
- *
- */
-
- // Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-// Include theme-specific fonts
-
-@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
-
-// Colors used in the theme
-$blood: #a23;
-$coal: #222;
-$codeBackground: #23241f;
-
-// Main text
-$mainFont: Ubuntu, 'sans-serif';
-$mainFontSize: 36px;
-$mainColor: #eee;
-
-// Headings
-$headingFont: Ubuntu, 'sans-serif';
-$headingTextShadow: 2px 2px 2px $coal;
-
-// h1 shadow, borrowed humbly from 
-// (c) Default theme by Hakim El Hattab
-$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
-
-// Links
-$linkColor: $blood;
-$linkColorHover: lighten( $linkColor, 20% );
-
-// Text selection
-$selectionBackgroundColor: $blood;
-$selectionColor: #fff;
-
-// Background generator
-@mixin bodyBackground() {
-    @include radial-gradient( $coal, lighten( $coal, 25% ) );
-}
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
-
-// some overrides after theme template import
-
-.reveal p {
-    font-weight: 300;
-    text-shadow: 1px 1px $coal;
-}
-
-.reveal h1, 
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-    font-weight: 700;
-}
-
-.reveal a:not(.image),
-.reveal a:not(.image):hover {
-    text-shadow: 2px 2px 2px #000;
-}
-
-.reveal small a:not(.image),
-.reveal small a:not(.image):hover {
-    text-shadow: 1px 1px 1px #000;
-}
-
-.reveal p code {
-    background-color: $codeBackground;
-    display: inline-block;
-    border-radius: 7px;
-}
-
-.reveal small code {
-    vertical-align: baseline;
-}
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/default.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/default.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/default.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Default theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-// Override theme settings (see ../template/settings.scss)
-$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
-
-// Background generator
-@mixin bodyBackground() {
-	@include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) );
-}
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/moon.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/moon.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/moon.scss
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Solarized Dark theme for reveal.js.
- * Author: Achim Staebler
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-/**
- * Solarized colors by Ethan Schoonover
- */
-html * {
-	color-profile: sRGB;
-	rendering-intent: auto;
-}
-
-// Solarized colors
-$base03:    #002b36;
-$base02:    #073642;
-$base01:    #586e75;
-$base00:    #657b83;
-$base0:     #839496;
-$base1:     #93a1a1;
-$base2:     #eee8d5;
-$base3:     #fdf6e3;
-$yellow:    #b58900;
-$orange:    #cb4b16;
-$red:       #dc322f;
-$magenta:   #d33682;
-$violet:    #6c71c4;
-$blue:      #268bd2;
-$cyan:      #2aa198;
-$green:     #859900;
-
-// Override theme settings (see ../template/settings.scss)
-$mainColor: $base1;
-$headingColor: $base2;
-$headingTextShadow: none;
-$backgroundColor: $base03;
-$linkColor: $blue;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: $magenta;
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/night.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/night.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/night.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Black theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-// Include theme-specific fonts
-@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
-
-
-// Override theme settings (see ../template/settings.scss)
-$backgroundColor: #111;
-
-$mainFont: 'Open Sans', sans-serif;
-$linkColor: #e7ad52;
-$linkColorHover: lighten( $linkColor, 20% );
-$headingFont: 'Montserrat', Impact, sans-serif;
-$headingTextShadow: none;
-$headingLetterSpacing: -0.03em;
-$headingTextTransform: none;
-$selectionBackgroundColor: #e7ad52;
-$mainFontSize: 30px;
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/serif.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/serif.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/serif.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Override theme settings (see ../template/settings.scss)
-$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
-$mainColor: #000;
-$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
-$headingColor: #383D3D;
-$headingTextShadow: none;
-$headingTextTransform: none;
-$backgroundColor: #F0F1EB;
-$linkColor: #51483D;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: #26351C;
-
-.reveal a:not(.image) {
-  line-height: 1.3em;
-}
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/simple.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/simple.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/simple.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is darkblue.
- *
- * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
- * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-
-// Override theme settings (see ../template/settings.scss)
-$mainFont: 'Lato', sans-serif;
-$mainColor: #000;
-$headingFont: 'News Cycle', Impact, sans-serif;
-$headingColor: #000;
-$headingTextShadow: none;
-$headingTextTransform: none;
-$backgroundColor: #fff;
-$linkColor: #00008B;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: rgba(0, 0, 0, 0.99);
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/sky.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/sky.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/sky.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Sky theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
-
-
-// Override theme settings (see ../template/settings.scss)
-$mainFont: 'Open Sans', sans-serif;
-$mainColor: #333;
-$headingFont: 'Quicksand', sans-serif;
-$headingColor: #333;
-$headingLetterSpacing: -0.08em;
-$headingTextShadow: none;
-$backgroundColor: #f7fbfc;
-$linkColor: #3b759e;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: #134674;
-
-// Fix links so they are not cut off
-.reveal a:not(.image) {
-	line-height: 1.3em;
-}
-
-// Background generator
-@mixin bodyBackground() {
-	@include radial-gradient( #add9e4, #f7fbfc );
-}
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/source/solarized.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/source/solarized.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/source/solarized.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Solarized Light theme for reveal.js.
- * Author: Achim Staebler
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-
-/**
- * Solarized colors by Ethan Schoonover
- */
-html * {
-	color-profile: sRGB;
-	rendering-intent: auto;
-}
-
-// Solarized colors
-$base03:    #002b36;
-$base02:    #073642;
-$base01:    #586e75;
-$base00:    #657b83;
-$base0:     #839496;
-$base1:     #93a1a1;
-$base2:     #eee8d5;
-$base3:     #fdf6e3;
-$yellow:    #b58900;
-$orange:    #cb4b16;
-$red:       #dc322f;
-$magenta:   #d33682;
-$violet:    #6c71c4;
-$blue:      #268bd2;
-$cyan:      #2aa198;
-$green:     #859900;
-
-// Override theme settings (see ../template/settings.scss)
-$mainColor: $base00;
-$headingColor: $base01;
-$headingTextShadow: none;
-$backgroundColor: $base3;
-$linkColor: $blue;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: $magenta;
-
-// Background generator
-// @mixin bodyBackground() {
-// 	@include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
-// }
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/template/mixins.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/template/mixins.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/template/mixins.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-@mixin vertical-gradient( $top, $bottom ) {
-	background: $top;
-	background: -moz-linear-gradient( top, $top 0%, $bottom 100% );
-	background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) );
-	background: -webkit-linear-gradient( top, $top 0%, $bottom 100% );
-	background: -o-linear-gradient( top, $top 0%, $bottom 100% );
-	background: -ms-linear-gradient( top, $top 0%, $bottom 100% );
-	background: linear-gradient( top, $top 0%, $bottom 100% );
-}
-
-@mixin horizontal-gradient( $top, $bottom ) {
-	background: $top;
-	background: -moz-linear-gradient( left, $top 0%, $bottom 100% );
-	background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) );
-	background: -webkit-linear-gradient( left, $top 0%, $bottom 100% );
-	background: -o-linear-gradient( left, $top 0%, $bottom 100% );
-	background: -ms-linear-gradient( left, $top 0%, $bottom 100% );
-	background: linear-gradient( left, $top 0%, $bottom 100% );
-}
-
-@mixin radial-gradient( $outer, $inner, $type: circle ) {
-	background: $outer;
-	background: -moz-radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-	background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) );
-	background: -webkit-radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-	background: -o-radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-	background: -ms-radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-	background: radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-}
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/template/settings.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/template/settings.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/template/settings.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-// Base settings for all themes that can optionally be
-// overridden by the super-theme
-
-// Background of the presentation
-$backgroundColor: #2b2b2b;
-
-// Primary/body text
-$mainFont: 'Lato', sans-serif;
-$mainFontSize: 36px;
-$mainColor: #eee;
-
-// Headings
-$headingMargin: 0 0 20px 0;
-$headingFont: 'League Gothic', Impact, sans-serif;
-$headingColor: #eee;
-$headingLineHeight: 0.9em;
-$headingLetterSpacing: 0.02em;
-$headingTextTransform: uppercase;
-$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
-$heading1TextShadow: $headingTextShadow;
-
-// Links and actions
-$linkColor: #13DAEC;
-$linkColorHover: lighten( $linkColor, 20% );
-
-// Text selection
-$selectionBackgroundColor: #FF5E99;
-$selectionColor: #fff;
-
-// Generates the presentation background, can be overridden
-// to return a background image or gradient
-@mixin bodyBackground() {
-	background: $backgroundColor;
-}
diff --git a/docs/slides/BOS14/_support/reveal.js/css/theme/template/theme.scss b/docs/slides/BOS14/_support/reveal.js/css/theme/template/theme.scss
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/css/theme/template/theme.scss
+++ /dev/null
@@ -1,170 +0,0 @@
-// Base theme template for reveal.js
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	@include bodyBackground();
-	background-color: $backgroundColor;
-}
-
-.reveal {
-	font-family: $mainFont;
-	font-size: $mainFontSize;
-	font-weight: normal;
-	letter-spacing: -0.02em;
-	color: $mainColor;
-}
-
-::selection {
-	color: $selectionColor;
-	background: $selectionBackgroundColor;
-	text-shadow: none;
-}
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-	margin: $headingMargin;
-	color: $headingColor;
-
-	font-family: $headingFont;
-	line-height: $headingLineHeight;
-	letter-spacing: $headingLetterSpacing;
-
-	text-transform: $headingTextTransform;
-	text-shadow: $headingTextShadow;
-}
-
-.reveal h1 {
-	text-shadow: $heading1TextShadow;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: $linkColor;
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		color: $linkColorHover;
-
-		text-shadow: none;
-		border: none;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: darken( $linkColor, 15% );
-}
-
-
-/*********************************************
- * IMAGES
- *********************************************/
-
-.reveal section img {
-	margin: 15px 0px;
-	background: rgba(255,255,255,0.12);
-	border: 4px solid $mainColor;
-
-	box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: $linkColor;
-
-		box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-	border-right-color: $linkColor;
-}
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-	border-left-color: $linkColor;
-}
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-	border-bottom-color: $linkColor;
-}
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-	border-top-color: $linkColor;
-}
-
-.reveal .controls div.navigate-left.enabled:hover {
-	border-right-color: $linkColorHover;
-}
-
-.reveal .controls div.navigate-right.enabled:hover {
-	border-left-color: $linkColorHover;
-}
-
-.reveal .controls div.navigate-up.enabled:hover {
-	border-bottom-color: $linkColorHover;
-}
-
-.reveal .controls div.navigate-down.enabled:hover {
-	border-top-color: $linkColorHover;
-}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: $linkColor;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: $linkColor;
-}
-
-
diff --git a/docs/slides/BOS14/_support/reveal.js/index.html b/docs/slides/BOS14/_support/reveal.js/index.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/index.html
+++ /dev/null
@@ -1,394 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - The HTML Presentation Framework</title>
-
-		<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
-		<meta name="author" content="Hakim El Hattab">
-
-		<meta name="apple-mobile-web-app-capable" content="yes" />
-		<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
-
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-		<link rel="stylesheet" href="css/reveal.min.css">
-		<link rel="stylesheet" href="css/theme/default.css" id="theme">
-
-		<!-- For syntax highlighting -->
-		<link rel="stylesheet" href="lib/css/zenburn.css">
-
-		<!-- If the query includes 'print-pdf', include the PDF print sheet -->
-		<script>
-			if( window.location.search.match( /print-pdf/gi ) ) {
-				var link = document.createElement( 'link' );
-				link.rel = 'stylesheet';
-				link.type = 'text/css';
-				link.href = 'css/print/pdf.css';
-				document.getElementsByTagName( 'head' )[0].appendChild( link );
-			}
-		</script>
-
-		<!--[if lt IE 9]>
-		<script src="lib/js/html5shiv.js"></script>
-		<![endif]-->
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<!-- Any section element inside of this container is displayed as a slide -->
-			<div class="slides">
-				<section>
-					<h1>Reveal.js</h1>
-					<h3>HTML Presentations Made Easy</h3>
-					<p>
-						<small>Created by <a href="http://hakim.se">Hakim El Hattab</a> / <a href="http://twitter.com/hakimel">@hakimel</a></small>
-					</p>
-				</section>
-
-				<section>
-					<h2>Heads Up</h2>
-					<p>
-						reveal.js is a framework for easily creating beautiful presentations using HTML. You'll need a browser with
-						support for CSS 3D transforms to see it in its full glory.
-					</p>
-
-					<aside class="notes">
-						Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard).
-					</aside>
-				</section>
-
-				<!-- Example of nested vertical slides -->
-				<section>
-					<section>
-						<h2>Vertical Slides</h2>
-						<p>
-							Slides can be nested inside of other slides,
-							try pressing <a href="#" class="navigate-down">down</a>.
-						</p>
-						<a href="#" class="image navigate-down">
-							<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
-						</a>
-					</section>
-					<section>
-						<h2>Basement Level 1</h2>
-						<p>Press down or up to navigate.</p>
-					</section>
-					<section>
-						<h2>Basement Level 2</h2>
-						<p>Cornify</p>
-						<a class="test" href="http://cornify.com">
-							<img width="280" height="326" src="https://s3.amazonaws.com/hakim-static/reveal-js/cornify.gif" alt="Unicorn">
-						</a>
-					</section>
-					<section>
-						<h2>Basement Level 3</h2>
-						<p>That's it, time to go back up.</p>
-						<a href="#/2" class="image">
-							<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Up arrow" style="-webkit-transform: rotate(180deg);">
-						</a>
-					</section>
-				</section>
-
-				<section>
-					<h2>Slides</h2>
-					<p>
-						Not a coder? No problem. There's a fully-featured visual editor for authoring these, try it out at <a href="http://slid.es" target="_blank">http://slid.es</a>.
-					</p>
-				</section>
-
-				<section>
-					<h2>Point of View</h2>
-					<p>
-						Press <strong>ESC</strong> to enter the slide overview.
-					</p>
-					<p>
-						Hold down alt and click on any element to zoom in on it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>. Alt + click anywhere to zoom back out.
-					</p>
-				</section>
-
-				<section>
-					<h2>Works in Mobile Safari</h2>
-					<p>
-						Try it out! You can swipe through the slides and pinch your way to the overview.
-					</p>
-				</section>
-
-				<section>
-					<h2>Marvelous Unordered List</h2>
-					<ul>
-						<li>No order here</li>
-						<li>Or here</li>
-						<li>Or here</li>
-						<li>Or here</li>
-					</ul>
-				</section>
-
-				<section>
-					<h2>Fantastic Ordered List</h2>
-					<ol>
-						<li>One is smaller than...</li>
-						<li>Two is smaller than...</li>
-						<li>Three!</li>
-					</ol>
-				</section>
-
-				<section data-markdown>
-					<script type="text/template">
-						## Markdown support
-
-						For those of you who like that sort of thing. Instructions and a bit more info available [here](https://github.com/hakimel/reveal.js#markdown).
-
-						```
-						<section data-markdown>
-						  ## Markdown support
-
-						  For those of you who like that sort of thing.
-						  Instructions and a bit more info available [here](https://github.com/hakimel/reveal.js#markdown).
-						</section>
-						```
-					</script>
-				</section>
-
-				<section id="transitions">
-					<h2>Transition Styles</h2>
-					<p>
-						You can select from different transitions, like: <br>
-						<a href="?transition=cube#/transitions">Cube</a> -
-						<a href="?transition=page#/transitions">Page</a> -
-						<a href="?transition=concave#/transitions">Concave</a> -
-						<a href="?transition=zoom#/transitions">Zoom</a> -
-						<a href="?transition=linear#/transitions">Linear</a> -
-						<a href="?transition=fade#/transitions">Fade</a> -
-						<a href="?transition=none#/transitions">None</a> -
-						<a href="?#/transitions">Default</a>
-					</p>
-				</section>
-
-				<section id="themes">
-					<h2>Themes</h2>
-					<p>
-						Reveal.js comes with a few themes built in: <br>
-						<a href="?#/themes">Default</a> -
-						<a href="?theme=sky#/themes">Sky</a> -
-						<a href="?theme=beige#/themes">Beige</a> -
-						<a href="?theme=simple#/themes">Simple</a> -
-						<a href="?theme=serif#/themes">Serif</a> -
-						<a href="?theme=night#/themes">Night</a> <br>
-						<a href="?theme=moon#/themes">Moon</a> -
-						<a href="?theme=solarized#/themes">Solarized</a>
-					</p>
-					<p>
-						<small>
-							* Theme demos are loaded after the presentation which leads to flicker. In production you should load your theme in the <code>&lt;head&gt;</code> using a <code>&lt;link&gt;</code>.
-						</small>
-					</p>
-				</section>
-
-				<section>
-					<h2>Global State</h2>
-					<p>
-						Set <code>data-state="something"</code> on a slide and <code>"something"</code>
-						will be added as a class to the document element when the slide is open. This lets you
-						apply broader style changes, like switching the background.
-					</p>
-				</section>
-
-				<section data-state="customevent">
-					<h2>Custom Events</h2>
-					<p>
-						Additionally custom events can be triggered on a per slide basis by binding to the <code>data-state</code> name.
-					</p>
-					<pre><code data-trim contenteditable style="font-size: 18px; margin-top: 20px;">
-Reveal.addEventListener( 'customevent', function() {
-	console.log( '"customevent" has fired' );
-} );
-					</code></pre>
-				</section>
-
-				<section>
-					<section data-background="#007777">
-						<h2>Slide Backgrounds</h2>
-						<p>
-							Set <code>data-background="#007777"</code> on a slide to change the full page background to the given color. All CSS color formats are supported.
-						</p>
-						<a href="#" class="image navigate-down">
-							<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
-						</a>
-					</section>
-					<section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png">
-						<h2>Image Backgrounds</h2>
-						<pre><code>&lt;section data-background="image.png"&gt;</code></pre>
-					</section>
-					<section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" data-background-repeat="repeat" data-background-size="100px">
-						<h2>Repeated Image Backgrounds</h2>
-						<pre><code style="word-wrap: break-word;">&lt;section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"&gt;</code></pre>
-					</section>
-				</section>
-
-				<section data-transition="linear" data-background="#4d7e65" data-background-transition="slide">
-					<h2>Background Transitions</h2>
-					<p>
-						Pass reveal.js the <code>backgroundTransition: 'slide'</code> config argument to make backgrounds slide rather than fade.
-					</p>
-				</section>
-
-				<section data-transition="linear" data-background="#8c4738" data-background-transition="slide">
-					<h2>Background Transition Override</h2>
-					<p>
-						You can override background transitions per slide by using <code>data-background-transition="slide"</code>.
-					</p>
-				</section>
-
-				<section>
-					<h2>Clever Quotes</h2>
-					<p>
-						These guys come in two forms, inline: <q cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
-						&ldquo;The nice thing about standards is that there are so many to choose from&rdquo;</q> and block:
-					</p>
-					<blockquote cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
-						&ldquo;For years there has been a theory that millions of monkeys typing at random on millions of typewriters would
-						reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.&rdquo;
-					</blockquote>
-				</section>
-
-				<section>
-					<h2>Pretty Code</h2>
-					<pre><code data-trim contenteditable>
-function linkify( selector ) {
-  if( supports3DTransforms ) {
-
-    var nodes = document.querySelectorAll( selector );
-
-    for( var i = 0, len = nodes.length; i &lt; len; i++ ) {
-      var node = nodes[i];
-
-      if( !node.className ) {
-        node.className += ' roll';
-      }
-    }
-  }
-}
-					</code></pre>
-					<p>Courtesy of <a href="http://softwaremaniacs.org/soft/highlight/en/description/">highlight.js</a>.</p>
-				</section>
-
-				<section>
-					<h2>Intergalactic Interconnections</h2>
-					<p>
-						You can link between slides internally,
-						<a href="#/2/3">like this</a>.
-					</p>
-				</section>
-
-				<section>
-					<section id="fragments">
-						<h2>Fragmented Views</h2>
-						<p>Hit the next arrow...</p>
-						<p class="fragment">... to step through ...</p>
-						<ol>
-							<li class="fragment"><code>any type</code></li>
-							<li class="fragment"><em>of view</em></li>
-							<li class="fragment"><strong>fragments</strong></li>
-						</ol>
-
-						<aside class="notes">
-							This slide has fragments which are also stepped through in the notes window.
-						</aside>
-					</section>
-					<section>
-						<h2>Fragment Styles</h2>
-						<p>There's a few styles of fragments, like:</p>
-						<p class="fragment grow">grow</p>
-						<p class="fragment shrink">shrink</p>
-						<p class="fragment roll-in">roll-in</p>
-						<p class="fragment fade-out">fade-out</p>
-						<p class="fragment highlight-red">highlight-red</p>
-						<p class="fragment highlight-green">highlight-green</p>
-						<p class="fragment highlight-blue">highlight-blue</p>
-						<p class="fragment current-visible">current-visible</p>
-						<p class="fragment highlight-current-blue">highlight-current-blue</p>
-					</section>
-				</section>
-
-				<section>
-					<h2>Spectacular image!</h2>
-					<a class="image" href="http://lab.hakim.se/meny/" target="_blank">
-						<img width="320" height="299" src="http://s3.amazonaws.com/hakim-static/portfolio/images/meny.png" alt="Meny">
-					</a>
-				</section>
-
-				<section>
-					<h2>Export to PDF</h2>
-					<p>Presentations can be <a href="https://github.com/hakimel/reveal.js#pdf-export">exported to PDF</a>, below is an example that's been uploaded to SlideShare.</p>
-					<iframe id="slideshare" src="http://www.slideshare.net/slideshow/embed_code/13872948" width="455" height="356" style="margin:0;overflow:hidden;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe>
-					<script>
-						document.getElementById('slideshare').attributeName = 'allowfullscreen';
-					</script>
-				</section>
-
-				<section>
-					<h2>Take a Moment</h2>
-					<p>
-						Press b or period on your keyboard to enter the 'paused' mode. This mode is helpful when you want to take distracting slides off the screen
-						during a presentation.
-					</p>
-				</section>
-
-				<section>
-					<h2>Stellar Links</h2>
-					<ul>
-						<li><a href="http://slid.es">Try the online editor</a></li>
-						<li><a href="https://github.com/hakimel/reveal.js">Source code on GitHub</a></li>
-						<li><a href="http://twitter.com/hakimel">Follow me on Twitter</a></li>
-					</ul>
-				</section>
-
-				<section>
-					<h1>THE END</h1>
-					<h3>BY Hakim El Hattab / hakim.se</h3>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="lib/js/head.min.js"></script>
-		<script src="js/reveal.min.js"></script>
-
-		<script>
-
-			// Full list of configuration options available here:
-			// https://github.com/hakimel/reveal.js#configuration
-			Reveal.initialize({
-				controls: true,
-				progress: true,
-				history: true,
-				center: true,
-
-				theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
-				transition: Reveal.getQueryHash().transition || 'default', // default/cube/page/concave/zoom/linear/fade/none
-
-				// Parallax scrolling
-				// parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg',
-				// parallaxBackgroundSize: '2100px 900px',
-
-				// Optional libraries used to extend on reveal.js
-				dependencies: [
-					{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
-					{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-					{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-					{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
-					{ src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
-					{ src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
-				]
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/js/reveal.js b/docs/slides/BOS14/_support/reveal.js/js/reveal.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/js/reveal.js
+++ /dev/null
@@ -1,3382 +0,0 @@
-/*!
- * reveal.js
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
- */
-var Reveal = (function(){
-
-	'use strict';
-
-	var SLIDES_SELECTOR = '.reveal .slides section',
-		HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section',
-		VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section',
-		HOME_SLIDE_SELECTOR = '.reveal .slides>section:first-of-type',
-
-		// Configurations defaults, can be overridden at initialization time
-		config = {
-
-			// The "normal" size of the presentation, aspect ratio will be preserved
-			// when the presentation is scaled to fit different resolutions
-			width: 960,
-			height: 700,
-
-			// Factor of the display size that should remain empty around the content
-			margin: 0.1,
-
-			// Bounds for smallest/largest possible scale to apply to content
-			minScale: 0.2,
-			maxScale: 1.0,
-
-			// Display controls in the bottom right corner
-			controls: true,
-
-			// Display a presentation progress bar
-			progress: true,
-
-			// Display the page number of the current slide
-			slideNumber: false,
-
-			// Push each slide change to the browser history
-			history: false,
-
-			// Enable keyboard shortcuts for navigation
-			keyboard: true,
-
-			// Enable the slide overview mode
-			overview: true,
-
-			// Vertical centering of slides
-			center: true,
-
-			// Enables touch navigation on devices with touch input
-			touch: true,
-
-			// Loop the presentation
-			loop: false,
-
-			// Change the presentation direction to be RTL
-			rtl: false,
-
-			// Turns fragments on and off globally
-			fragments: true,
-
-			// Flags if the presentation is running in an embedded mode,
-			// i.e. contained within a limited portion of the screen
-			embedded: false,
-
-			// Number of milliseconds between automatically proceeding to the
-			// next slide, disabled when set to 0, this value can be overwritten
-			// by using a data-autoslide attribute on your slides
-			autoSlide: 0,
-
-			// Stop auto-sliding after user input
-			autoSlideStoppable: true,
-
-			// Enable slide navigation via mouse wheel
-			mouseWheel: false,
-
-			// Apply a 3D roll to links on hover
-			rollingLinks: false,
-
-			// Hides the address bar on mobile devices
-			hideAddressBar: true,
-
-			// Opens links in an iframe preview overlay
-			previewLinks: false,
-
-			// Focuses body when page changes visiblity to ensure keyboard shortcuts work
-			focusBodyOnPageVisiblityChange: true,
-
-			// Theme (see /css/theme)
-			theme: null,
-
-			// Transition style
-			transition: 'default', // default/cube/page/concave/zoom/linear/fade/none
-
-			// Transition speed
-			transitionSpeed: 'default', // default/fast/slow
-
-			// Transition style for full page slide backgrounds
-			backgroundTransition: 'default', // default/linear/none
-
-			// Parallax background image
-			parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg"
-
-			// Parallax background size
-			parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px"
-
-			// Number of slides away from the current that are visible
-			viewDistance: 3,
-
-			// Script dependencies to load
-			dependencies: []
-
-		},
-
-		// Flags if reveal.js is loaded (has dispatched the 'ready' event)
-		loaded = false,
-
-		// The horizontal and vertical index of the currently active slide
-		indexh,
-		indexv,
-
-		// The previous and current slide HTML elements
-		previousSlide,
-		currentSlide,
-
-		previousBackground,
-
-		// Slides may hold a data-state attribute which we pick up and apply
-		// as a class to the body. This list contains the combined state of
-		// all current slides.
-		state = [],
-
-		// The current scale of the presentation (see width/height config)
-		scale = 1,
-
-		// Cached references to DOM elements
-		dom = {},
-
-		// Features supported by the browser, see #checkCapabilities()
-		features = {},
-
-		// Client is a mobile device, see #checkCapabilities()
-		isMobileDevice,
-
-		// Throttles mouse wheel navigation
-		lastMouseWheelStep = 0,
-
-		// Delays updates to the URL due to a Chrome thumbnailer bug
-		writeURLTimeout = 0,
-
-		// A delay used to activate the overview mode
-		activateOverviewTimeout = 0,
-
-		// A delay used to deactivate the overview mode
-		deactivateOverviewTimeout = 0,
-
-		// Flags if the interaction event listeners are bound
-		eventsAreBound = false,
-
-		// The current auto-slide duration
-		autoSlide = 0,
-
-		// Auto slide properties
-		autoSlidePlayer,
-		autoSlideTimeout = 0,
-		autoSlideStartTime = -1,
-		autoSlidePaused = false,
-
-		// Holds information about the currently ongoing touch input
-		touch = {
-			startX: 0,
-			startY: 0,
-			startSpan: 0,
-			startCount: 0,
-			captured: false,
-			threshold: 40
-		};
-
-	/**
-	 * Starts up the presentation if the client is capable.
-	 */
-	function initialize( options ) {
-
-		checkCapabilities();
-
-		if( !features.transforms2d && !features.transforms3d ) {
-			document.body.setAttribute( 'class', 'no-transforms' );
-
-			// If the browser doesn't support core features we won't be
-			// using JavaScript to control the presentation
-			return;
-		}
-
-		// Force a layout when the whole page, incl fonts, has loaded
-		window.addEventListener( 'load', layout, false );
-
-		var query = Reveal.getQueryHash();
-
-		// Do not accept new dependencies via query config to avoid
-		// the potential of malicious script injection
-		if( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies'];
-
-		// Copy options over to our config object
-		extend( config, options );
-		extend( config, query );
-
-		// Hide the address bar in mobile browsers
-		hideAddressBar();
-
-		// Loads the dependencies and continues to #start() once done
-		load();
-
-	}
-
-	/**
-	 * Inspect the client to see what it's capable of, this
-	 * should only happens once per runtime.
-	 */
-	function checkCapabilities() {
-
-		features.transforms3d = 'WebkitPerspective' in document.body.style ||
-								'MozPerspective' in document.body.style ||
-								'msPerspective' in document.body.style ||
-								'OPerspective' in document.body.style ||
-								'perspective' in document.body.style;
-
-		features.transforms2d = 'WebkitTransform' in document.body.style ||
-								'MozTransform' in document.body.style ||
-								'msTransform' in document.body.style ||
-								'OTransform' in document.body.style ||
-								'transform' in document.body.style;
-
-		features.requestAnimationFrameMethod = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
-		features.requestAnimationFrame = typeof features.requestAnimationFrameMethod === 'function';
-
-		features.canvas = !!document.createElement( 'canvas' ).getContext;
-
-		isMobileDevice = navigator.userAgent.match( /(iphone|ipod|android)/gi );
-
-	}
-
-
-    /**
-     * Loads the dependencies of reveal.js. Dependencies are
-     * defined via the configuration option 'dependencies'
-     * and will be loaded prior to starting/binding reveal.js.
-     * Some dependencies may have an 'async' flag, if so they
-     * will load after reveal.js has been started up.
-     */
-	function load() {
-
-		var scripts = [],
-			scriptsAsync = [],
-			scriptsToPreload = 0;
-
-		// Called once synchronous scripts finish loading
-		function proceed() {
-			if( scriptsAsync.length ) {
-				// Load asynchronous scripts
-				head.js.apply( null, scriptsAsync );
-			}
-
-			start();
-		}
-
-		function loadScript( s ) {
-			head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], function() {
-				// Extension may contain callback functions
-				if( typeof s.callback === 'function' ) {
-					s.callback.apply( this );
-				}
-
-				if( --scriptsToPreload === 0 ) {
-					proceed();
-				}
-			});
-		}
-
-		for( var i = 0, len = config.dependencies.length; i < len; i++ ) {
-			var s = config.dependencies[i];
-
-			// Load if there's no condition or the condition is truthy
-			if( !s.condition || s.condition() ) {
-				if( s.async ) {
-					scriptsAsync.push( s.src );
-				}
-				else {
-					scripts.push( s.src );
-				}
-
-				loadScript( s );
-			}
-		}
-
-		if( scripts.length ) {
-			scriptsToPreload = scripts.length;
-
-			// Load synchronous scripts
-			head.js.apply( null, scripts );
-		}
-		else {
-			proceed();
-		}
-
-	}
-
-	/**
-	 * Starts up reveal.js by binding input events and navigating
-	 * to the current URL deeplink if there is one.
-	 */
-	function start() {
-
-		// Make sure we've got all the DOM elements we need
-		setupDOM();
-
-		// Resets all vertical slides so that only the first is visible
-		resetVerticalSlides();
-
-		// Updates the presentation to match the current configuration values
-		configure();
-
-		// Read the initial hash
-		readURL();
-
-		// Update all backgrounds
-		updateBackground( true );
-
-		// Notify listeners that the presentation is ready but use a 1ms
-		// timeout to ensure it's not fired synchronously after #initialize()
-		setTimeout( function() {
-			// Enable transitions now that we're loaded
-			dom.slides.classList.remove( 'no-transition' );
-
-			loaded = true;
-
-			dispatchEvent( 'ready', {
-				'indexh': indexh,
-				'indexv': indexv,
-				'currentSlide': currentSlide
-			} );
-		}, 1 );
-
-	}
-
-	/**
-	 * Finds and stores references to DOM elements which are
-	 * required by the presentation. If a required element is
-	 * not found, it is created.
-	 */
-	function setupDOM() {
-
-		// Cache references to key DOM elements
-		dom.theme = document.querySelector( '#theme' );
-		dom.wrapper = document.querySelector( '.reveal' );
-		dom.slides = document.querySelector( '.reveal .slides' );
-
-		// Prevent transitions while we're loading
-		dom.slides.classList.add( 'no-transition' );
-
-		// Background element
-		dom.background = createSingletonNode( dom.wrapper, 'div', 'backgrounds', null );
-
-		// Progress bar
-		dom.progress = createSingletonNode( dom.wrapper, 'div', 'progress', '<span></span>' );
-		dom.progressbar = dom.progress.querySelector( 'span' );
-
-		// Arrow controls
-		createSingletonNode( dom.wrapper, 'aside', 'controls',
-			'<div class="navigate-left"></div>' +
-			'<div class="navigate-right"></div>' +
-			'<div class="navigate-up"></div>' +
-			'<div class="navigate-down"></div>' );
-
-		// Slide number
-		dom.slideNumber = createSingletonNode( dom.wrapper, 'div', 'slide-number', '' );
-
-		// State background element [DEPRECATED]
-		createSingletonNode( dom.wrapper, 'div', 'state-background', null );
-
-		// Overlay graphic which is displayed during the paused mode
-		createSingletonNode( dom.wrapper, 'div', 'pause-overlay', null );
-
-		// Cache references to elements
-		dom.controls = document.querySelector( '.reveal .controls' );
-
-		// There can be multiple instances of controls throughout the page
-		dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) );
-		dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) );
-		dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) );
-		dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) );
-		dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) );
-		dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) );
-
-	}
-
-	/**
-	 * Creates an HTML element and returns a reference to it.
-	 * If the element already exists the existing instance will
-	 * be returned.
-	 */
-	function createSingletonNode( container, tagname, classname, innerHTML ) {
-
-		var node = container.querySelector( '.' + classname );
-		if( !node ) {
-			node = document.createElement( tagname );
-			node.classList.add( classname );
-			if( innerHTML !== null ) {
-				node.innerHTML = innerHTML;
-			}
-			container.appendChild( node );
-		}
-		return node;
-
-	}
-
-	/**
-	 * Creates the slide background elements and appends them
-	 * to the background container. One element is created per
-	 * slide no matter if the given slide has visible background.
-	 */
-	function createBackgrounds() {
-
-		if( isPrintingPDF() ) {
-			document.body.classList.add( 'print-pdf' );
-		}
-
-		// Clear prior backgrounds
-		dom.background.innerHTML = '';
-		dom.background.classList.add( 'no-transition' );
-
-		// Helper method for creating a background element for the
-		// given slide
-		function _createBackground( slide, container ) {
-
-			var data = {
-				background: slide.getAttribute( 'data-background' ),
-				backgroundSize: slide.getAttribute( 'data-background-size' ),
-				backgroundImage: slide.getAttribute( 'data-background-image' ),
-				backgroundColor: slide.getAttribute( 'data-background-color' ),
-				backgroundRepeat: slide.getAttribute( 'data-background-repeat' ),
-				backgroundPosition: slide.getAttribute( 'data-background-position' ),
-				backgroundTransition: slide.getAttribute( 'data-background-transition' )
-			};
-
-			var element = document.createElement( 'div' );
-			element.className = 'slide-background';
-
-			if( data.background ) {
-				// Auto-wrap image urls in url(...)
-				if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) {
-					element.style.backgroundImage = 'url('+ data.background +')';
-				}
-				else {
-					element.style.background = data.background;
-				}
-			}
-
-			if( data.background || data.backgroundColor || data.backgroundImage ) {
-				element.setAttribute( 'data-background-hash', data.background + data.backgroundSize + data.backgroundImage + data.backgroundColor + data.backgroundRepeat + data.backgroundPosition + data.backgroundTransition );
-			}
-
-			// Additional and optional background properties
-			if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize;
-			if( data.backgroundImage ) element.style.backgroundImage = 'url("' + data.backgroundImage + '")';
-			if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;
-			if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat;
-			if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition;
-			if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );
-
-			container.appendChild( element );
-
-			return element;
-
-		}
-
-		// Iterate over all horizontal slides
-		toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( slideh ) {
-
-			var backgroundStack;
-
-			if( isPrintingPDF() ) {
-				backgroundStack = _createBackground( slideh, slideh );
-			}
-			else {
-				backgroundStack = _createBackground( slideh, dom.background );
-			}
-
-			// Iterate over all vertical slides
-			toArray( slideh.querySelectorAll( 'section' ) ).forEach( function( slidev ) {
-
-				if( isPrintingPDF() ) {
-					_createBackground( slidev, slidev );
-				}
-				else {
-					_createBackground( slidev, backgroundStack );
-				}
-
-			} );
-
-		} );
-
-		// Add parallax background if specified
-		if( config.parallaxBackgroundImage ) {
-
-			dom.background.style.backgroundImage = 'url("' + config.parallaxBackgroundImage + '")';
-			dom.background.style.backgroundSize = config.parallaxBackgroundSize;
-
-			// Make sure the below properties are set on the element - these properties are
-			// needed for proper transitions to be set on the element via CSS. To remove
-			// annoying background slide-in effect when the presentation starts, apply
-			// these properties after short time delay
-			setTimeout( function() {
-				dom.wrapper.classList.add( 'has-parallax-background' );
-			}, 1 );
-
-		}
-		else {
-
-			dom.background.style.backgroundImage = '';
-			dom.wrapper.classList.remove( 'has-parallax-background' );
-
-		}
-
-	}
-
-	/**
-	 * Applies the configuration settings from the config
-	 * object. May be called multiple times.
-	 */
-	function configure( options ) {
-
-		var numberOfSlides = document.querySelectorAll( SLIDES_SELECTOR ).length;
-
-		dom.wrapper.classList.remove( config.transition );
-
-		// New config options may be passed when this method
-		// is invoked through the API after initialization
-		if( typeof options === 'object' ) extend( config, options );
-
-		// Force linear transition based on browser capabilities
-		if( features.transforms3d === false ) config.transition = 'linear';
-
-		dom.wrapper.classList.add( config.transition );
-
-		dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );
-		dom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition );
-
-		dom.controls.style.display = config.controls ? 'block' : 'none';
-		dom.progress.style.display = config.progress ? 'block' : 'none';
-
-		if( config.rtl ) {
-			dom.wrapper.classList.add( 'rtl' );
-		}
-		else {
-			dom.wrapper.classList.remove( 'rtl' );
-		}
-
-		if( config.center ) {
-			dom.wrapper.classList.add( 'center' );
-		}
-		else {
-			dom.wrapper.classList.remove( 'center' );
-		}
-
-		if( config.mouseWheel ) {
-			document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
-			document.addEventListener( 'mousewheel', onDocumentMouseScroll, false );
-		}
-		else {
-			document.removeEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
-			document.removeEventListener( 'mousewheel', onDocumentMouseScroll, false );
-		}
-
-		// Rolling 3D links
-		if( config.rollingLinks ) {
-			enableRollingLinks();
-		}
-		else {
-			disableRollingLinks();
-		}
-
-		// Iframe link previews
-		if( config.previewLinks ) {
-			enablePreviewLinks();
-		}
-		else {
-			disablePreviewLinks();
-			enablePreviewLinks( '[data-preview-link]' );
-		}
-
-		// Auto-slide playback controls
-		if( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable && features.canvas && features.requestAnimationFrame ) {
-			autoSlidePlayer = new Playback( dom.wrapper, function() {
-				return Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 );
-			} );
-
-			autoSlidePlayer.on( 'click', onAutoSlidePlayerClick );
-			autoSlidePaused = false;
-		}
-		else if( autoSlidePlayer ) {
-			autoSlidePlayer.destroy();
-			autoSlidePlayer = null;
-		}
-
-		// Load the theme in the config, if it's not already loaded
-		if( config.theme && dom.theme ) {
-			var themeURL = dom.theme.getAttribute( 'href' );
-			var themeFinder = /[^\/]*?(?=\.css)/;
-			var themeName = themeURL.match(themeFinder)[0];
-
-			if(  config.theme !== themeName ) {
-				themeURL = themeURL.replace(themeFinder, config.theme);
-				dom.theme.setAttribute( 'href', themeURL );
-			}
-		}
-
-		sync();
-
-	}
-
-	/**
-	 * Binds all event listeners.
-	 */
-	function addEventListeners() {
-
-		eventsAreBound = true;
-
-		window.addEventListener( 'hashchange', onWindowHashChange, false );
-		window.addEventListener( 'resize', onWindowResize, false );
-
-		if( config.touch ) {
-			dom.wrapper.addEventListener( 'touchstart', onTouchStart, false );
-			dom.wrapper.addEventListener( 'touchmove', onTouchMove, false );
-			dom.wrapper.addEventListener( 'touchend', onTouchEnd, false );
-
-			// Support pointer-style touch interaction as well
-			if( window.navigator.msPointerEnabled ) {
-				dom.wrapper.addEventListener( 'MSPointerDown', onPointerDown, false );
-				dom.wrapper.addEventListener( 'MSPointerMove', onPointerMove, false );
-				dom.wrapper.addEventListener( 'MSPointerUp', onPointerUp, false );
-			}
-		}
-
-		if( config.keyboard ) {
-			document.addEventListener( 'keydown', onDocumentKeyDown, false );
-		}
-
-		if( config.progress && dom.progress ) {
-			dom.progress.addEventListener( 'click', onProgressClicked, false );
-		}
-
-		if( config.focusBodyOnPageVisiblityChange ) {
-			var visibilityChange;
-
-			if( 'hidden' in document ) {
-				visibilityChange = 'visibilitychange';
-			}
-			else if( 'msHidden' in document ) {
-				visibilityChange = 'msvisibilitychange';
-			}
-			else if( 'webkitHidden' in document ) {
-				visibilityChange = 'webkitvisibilitychange';
-			}
-
-			if( visibilityChange ) {
-				document.addEventListener( visibilityChange, onPageVisibilityChange, false );
-			}
-		}
-
-		[ 'touchstart', 'click' ].forEach( function( eventName ) {
-			dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } );
-			dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } );
-			dom.controlsUp.forEach( function( el ) { el.addEventListener( eventName, onNavigateUpClicked, false ); } );
-			dom.controlsDown.forEach( function( el ) { el.addEventListener( eventName, onNavigateDownClicked, false ); } );
-			dom.controlsPrev.forEach( function( el ) { el.addEventListener( eventName, onNavigatePrevClicked, false ); } );
-			dom.controlsNext.forEach( function( el ) { el.addEventListener( eventName, onNavigateNextClicked, false ); } );
-		} );
-
-	}
-
-	/**
-	 * Unbinds all event listeners.
-	 */
-	function removeEventListeners() {
-
-		eventsAreBound = false;
-
-		document.removeEventListener( 'keydown', onDocumentKeyDown, false );
-		window.removeEventListener( 'hashchange', onWindowHashChange, false );
-		window.removeEventListener( 'resize', onWindowResize, false );
-
-		dom.wrapper.removeEventListener( 'touchstart', onTouchStart, false );
-		dom.wrapper.removeEventListener( 'touchmove', onTouchMove, false );
-		dom.wrapper.removeEventListener( 'touchend', onTouchEnd, false );
-
-		if( window.navigator.msPointerEnabled ) {
-			dom.wrapper.removeEventListener( 'MSPointerDown', onPointerDown, false );
-			dom.wrapper.removeEventListener( 'MSPointerMove', onPointerMove, false );
-			dom.wrapper.removeEventListener( 'MSPointerUp', onPointerUp, false );
-		}
-
-		if ( config.progress && dom.progress ) {
-			dom.progress.removeEventListener( 'click', onProgressClicked, false );
-		}
-
-		[ 'touchstart', 'click' ].forEach( function( eventName ) {
-			dom.controlsLeft.forEach( function( el ) { el.removeEventListener( eventName, onNavigateLeftClicked, false ); } );
-			dom.controlsRight.forEach( function( el ) { el.removeEventListener( eventName, onNavigateRightClicked, false ); } );
-			dom.controlsUp.forEach( function( el ) { el.removeEventListener( eventName, onNavigateUpClicked, false ); } );
-			dom.controlsDown.forEach( function( el ) { el.removeEventListener( eventName, onNavigateDownClicked, false ); } );
-			dom.controlsPrev.forEach( function( el ) { el.removeEventListener( eventName, onNavigatePrevClicked, false ); } );
-			dom.controlsNext.forEach( function( el ) { el.removeEventListener( eventName, onNavigateNextClicked, false ); } );
-		} );
-
-	}
-
-	/**
-	 * Extend object a with the properties of object b.
-	 * If there's a conflict, object b takes precedence.
-	 */
-	function extend( a, b ) {
-
-		for( var i in b ) {
-			a[ i ] = b[ i ];
-		}
-
-	}
-
-	/**
-	 * Converts the target object to an array.
-	 */
-	function toArray( o ) {
-
-		return Array.prototype.slice.call( o );
-
-	}
-
-	/**
-	 * Measures the distance in pixels between point a
-	 * and point b.
-	 *
-	 * @param {Object} a point with x/y properties
-	 * @param {Object} b point with x/y properties
-	 */
-	function distanceBetween( a, b ) {
-
-		var dx = a.x - b.x,
-			dy = a.y - b.y;
-
-		return Math.sqrt( dx*dx + dy*dy );
-
-	}
-
-	/**
-	 * Applies a CSS transform to the target element.
-	 */
-	function transformElement( element, transform ) {
-
-		element.style.WebkitTransform = transform;
-		element.style.MozTransform = transform;
-		element.style.msTransform = transform;
-		element.style.OTransform = transform;
-		element.style.transform = transform;
-
-	}
-
-	/**
-	 * Retrieves the height of the given element by looking
-	 * at the position and height of its immediate children.
-	 */
-	function getAbsoluteHeight( element ) {
-
-		var height = 0;
-
-		if( element ) {
-			var absoluteChildren = 0;
-
-			toArray( element.childNodes ).forEach( function( child ) {
-
-				if( typeof child.offsetTop === 'number' && child.style ) {
-					// Count # of abs children
-					if( child.style.position === 'absolute' ) {
-						absoluteChildren += 1;
-					}
-
-					height = Math.max( height, child.offsetTop + child.offsetHeight );
-				}
-
-			} );
-
-			// If there are no absolute children, use offsetHeight
-			if( absoluteChildren === 0 ) {
-				height = element.offsetHeight;
-			}
-
-		}
-
-		return height;
-
-	}
-
-	/**
-	 * Returns the remaining height within the parent of the
-	 * target element after subtracting the height of all
-	 * siblings.
-	 *
-	 * remaining height = [parent height] - [ siblings height]
-	 */
-	function getRemainingHeight( element, height ) {
-
-		height = height || 0;
-
-		if( element ) {
-			var parent = element.parentNode;
-			var siblings = parent.childNodes;
-
-			// Subtract the height of each sibling
-			toArray( siblings ).forEach( function( sibling ) {
-
-				if( typeof sibling.offsetHeight === 'number' && sibling !== element ) {
-
-					var styles = window.getComputedStyle( sibling ),
-						marginTop = parseInt( styles.marginTop, 10 ),
-						marginBottom = parseInt( styles.marginBottom, 10 );
-
-					height -= sibling.offsetHeight + marginTop + marginBottom;
-
-				}
-
-			} );
-
-			var elementStyles = window.getComputedStyle( element );
-
-			// Subtract the margins of the target element
-			height -= parseInt( elementStyles.marginTop, 10 ) +
-						parseInt( elementStyles.marginBottom, 10 );
-
-		}
-
-		return height;
-
-	}
-
-	/**
-	 * Checks if this instance is being used to print a PDF.
-	 */
-	function isPrintingPDF() {
-
-		return ( /print-pdf/gi ).test( window.location.search );
-
-	}
-
-	/**
-	 * Hides the address bar if we're on a mobile device.
-	 */
-	function hideAddressBar() {
-
-		if( config.hideAddressBar && isMobileDevice ) {
-			// Events that should trigger the address bar to hide
-			window.addEventListener( 'load', removeAddressBar, false );
-			window.addEventListener( 'orientationchange', removeAddressBar, false );
-		}
-
-	}
-
-	/**
-	 * Causes the address bar to hide on mobile devices,
-	 * more vertical space ftw.
-	 */
-	function removeAddressBar() {
-
-		setTimeout( function() {
-			window.scrollTo( 0, 1 );
-		}, 10 );
-
-	}
-
-	/**
-	 * Dispatches an event of the specified type from the
-	 * reveal DOM element.
-	 */
-	function dispatchEvent( type, properties ) {
-
-		var event = document.createEvent( "HTMLEvents", 1, 2 );
-		event.initEvent( type, true, true );
-		extend( event, properties );
-		dom.wrapper.dispatchEvent( event );
-
-	}
-
-	/**
-	 * Wrap all links in 3D goodness.
-	 */
-	function enableRollingLinks() {
-
-		if( features.transforms3d && !( 'msPerspective' in document.body.style ) ) {
-			var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' );
-
-			for( var i = 0, len = anchors.length; i < len; i++ ) {
-				var anchor = anchors[i];
-
-				if( anchor.textContent && !anchor.querySelector( '*' ) && ( !anchor.className || !anchor.classList.contains( anchor, 'roll' ) ) ) {
-					var span = document.createElement('span');
-					span.setAttribute('data-title', anchor.text);
-					span.innerHTML = anchor.innerHTML;
-
-					anchor.classList.add( 'roll' );
-					anchor.innerHTML = '';
-					anchor.appendChild(span);
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * Unwrap all 3D links.
-	 */
-	function disableRollingLinks() {
-
-		var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a.roll' );
-
-		for( var i = 0, len = anchors.length; i < len; i++ ) {
-			var anchor = anchors[i];
-			var span = anchor.querySelector( 'span' );
-
-			if( span ) {
-				anchor.classList.remove( 'roll' );
-				anchor.innerHTML = span.innerHTML;
-			}
-		}
-
-	}
-
-	/**
-	 * Bind preview frame links.
-	 */
-	function enablePreviewLinks( selector ) {
-
-		var anchors = toArray( document.querySelectorAll( selector ? selector : 'a' ) );
-
-		anchors.forEach( function( element ) {
-			if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) {
-				element.addEventListener( 'click', onPreviewLinkClicked, false );
-			}
-		} );
-
-	}
-
-	/**
-	 * Unbind preview frame links.
-	 */
-	function disablePreviewLinks() {
-
-		var anchors = toArray( document.querySelectorAll( 'a' ) );
-
-		anchors.forEach( function( element ) {
-			if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) {
-				element.removeEventListener( 'click', onPreviewLinkClicked, false );
-			}
-		} );
-
-	}
-
-	/**
-	 * Opens a preview window for the target URL.
-	 */
-	function openPreview( url ) {
-
-		closePreview();
-
-		dom.preview = document.createElement( 'div' );
-		dom.preview.classList.add( 'preview-link-overlay' );
-		dom.wrapper.appendChild( dom.preview );
-
-		dom.preview.innerHTML = [
-			'<header>',
-				'<a class="close" href="#"><span class="icon"></span></a>',
-				'<a class="external" href="'+ url +'" target="_blank"><span class="icon"></span></a>',
-			'</header>',
-			'<div class="spinner"></div>',
-			'<div class="viewport">',
-				'<iframe src="'+ url +'"></iframe>',
-			'</div>'
-		].join('');
-
-		dom.preview.querySelector( 'iframe' ).addEventListener( 'load', function( event ) {
-			dom.preview.classList.add( 'loaded' );
-		}, false );
-
-		dom.preview.querySelector( '.close' ).addEventListener( 'click', function( event ) {
-			closePreview();
-			event.preventDefault();
-		}, false );
-
-		dom.preview.querySelector( '.external' ).addEventListener( 'click', function( event ) {
-			closePreview();
-		}, false );
-
-		setTimeout( function() {
-			dom.preview.classList.add( 'visible' );
-		}, 1 );
-
-	}
-
-	/**
-	 * Closes the iframe preview window.
-	 */
-	function closePreview() {
-
-		if( dom.preview ) {
-			dom.preview.setAttribute( 'src', '' );
-			dom.preview.parentNode.removeChild( dom.preview );
-			dom.preview = null;
-		}
-
-	}
-
-	/**
-	 * Applies JavaScript-controlled layout rules to the
-	 * presentation.
-	 */
-	function layout() {
-
-		if( dom.wrapper && !isPrintingPDF() ) {
-
-			// Available space to scale within
-			var availableWidth = dom.wrapper.offsetWidth,
-				availableHeight = dom.wrapper.offsetHeight;
-
-			// Reduce available space by margin
-			availableWidth -= ( availableHeight * config.margin );
-			availableHeight -= ( availableHeight * config.margin );
-
-			// Dimensions of the content
-			var slideWidth = config.width,
-				slideHeight = config.height,
-				slidePadding = 20; // TODO Dig this out of DOM
-
-			// Layout the contents of the slides
-			layoutSlideContents( config.width, config.height, slidePadding );
-
-			// Slide width may be a percentage of available width
-			if( typeof slideWidth === 'string' && /%$/.test( slideWidth ) ) {
-				slideWidth = parseInt( slideWidth, 10 ) / 100 * availableWidth;
-			}
-
-			// Slide height may be a percentage of available height
-			if( typeof slideHeight === 'string' && /%$/.test( slideHeight ) ) {
-				slideHeight = parseInt( slideHeight, 10 ) / 100 * availableHeight;
-			}
-
-			dom.slides.style.width = slideWidth + 'px';
-			dom.slides.style.height = slideHeight + 'px';
-
-			// Determine scale of content to fit within available space
-			scale = Math.min( availableWidth / slideWidth, availableHeight / slideHeight );
-
-			// Respect max/min scale settings
-			scale = Math.max( scale, config.minScale );
-			scale = Math.min( scale, config.maxScale );
-
-			// Prefer applying scale via zoom since Chrome blurs scaled content
-			// with nested transforms
-			if( typeof dom.slides.style.zoom !== 'undefined' && !navigator.userAgent.match( /(iphone|ipod|ipad|android)/gi ) ) {
-				dom.slides.style.zoom = scale;
-			}
-			// Apply scale transform as a fallback
-			else {
-				transformElement( dom.slides, 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)' );
-			}
-
-			// Select all slides, vertical and horizontal
-			var slides = toArray( document.querySelectorAll( SLIDES_SELECTOR ) );
-
-			for( var i = 0, len = slides.length; i < len; i++ ) {
-				var slide = slides[ i ];
-
-				// Don't bother updating invisible slides
-				if( slide.style.display === 'none' ) {
-					continue;
-				}
-
-				if( config.center || slide.classList.contains( 'center' ) ) {
-					// Vertical stacks are not centred since their section
-					// children will be
-					if( slide.classList.contains( 'stack' ) ) {
-						slide.style.top = 0;
-					}
-					else {
-						slide.style.top = Math.max( - ( getAbsoluteHeight( slide ) / 2 ) - slidePadding, -slideHeight / 2 ) + 'px';
-					}
-				}
-				else {
-					slide.style.top = '';
-				}
-
-			}
-
-			updateProgress();
-			updateParallax();
-
-		}
-
-	}
-
-	/**
-	 * Applies layout logic to the contents of all slides in
-	 * the presentation.
-	 */
-	function layoutSlideContents( width, height, padding ) {
-
-		// Handle sizing of elements with the 'stretch' class
-		toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) {
-
-			// Determine how much vertical space we can use
-			var remainingHeight = getRemainingHeight( element, ( height - ( padding * 2 ) ) );
-
-			// Consider the aspect ratio of media elements
-			if( /(img|video)/gi.test( element.nodeName ) ) {
-				var nw = element.naturalWidth || element.videoWidth,
-					nh = element.naturalHeight || element.videoHeight;
-
-				var es = Math.min( width / nw, remainingHeight / nh );
-
-				element.style.width = ( nw * es ) + 'px';
-				element.style.height = ( nh * es ) + 'px';
-
-			}
-			else {
-				element.style.width = width + 'px';
-				element.style.height = remainingHeight + 'px';
-			}
-
-		} );
-
-	}
-
-	/**
-	 * Stores the vertical index of a stack so that the same
-	 * vertical slide can be selected when navigating to and
-	 * from the stack.
-	 *
-	 * @param {HTMLElement} stack The vertical stack element
-	 * @param {int} v Index to memorize
-	 */
-	function setPreviousVerticalIndex( stack, v ) {
-
-		if( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) {
-			stack.setAttribute( 'data-previous-indexv', v || 0 );
-		}
-
-	}
-
-	/**
-	 * Retrieves the vertical index which was stored using
-	 * #setPreviousVerticalIndex() or 0 if no previous index
-	 * exists.
-	 *
-	 * @param {HTMLElement} stack The vertical stack element
-	 */
-	function getPreviousVerticalIndex( stack ) {
-
-		if( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) {
-			// Prefer manually defined start-indexv
-			var attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv';
-
-			return parseInt( stack.getAttribute( attributeName ) || 0, 10 );
-		}
-
-		return 0;
-
-	}
-
-	/**
-	 * Displays the overview of slides (quick nav) by
-	 * scaling down and arranging all slide elements.
-	 *
-	 * Experimental feature, might be dropped if perf
-	 * can't be improved.
-	 */
-	function activateOverview() {
-
-		// Only proceed if enabled in config
-		if( config.overview ) {
-
-			// Don't auto-slide while in overview mode
-			cancelAutoSlide();
-
-			var wasActive = dom.wrapper.classList.contains( 'overview' );
-
-			// Vary the depth of the overview based on screen size
-			var depth = window.innerWidth < 400 ? 1000 : 2500;
-
-			dom.wrapper.classList.add( 'overview' );
-			dom.wrapper.classList.remove( 'overview-deactivating' );
-
-			clearTimeout( activateOverviewTimeout );
-			clearTimeout( deactivateOverviewTimeout );
-
-			// Not the pretties solution, but need to let the overview
-			// class apply first so that slides are measured accurately
-			// before we can position them
-			activateOverviewTimeout = setTimeout( function() {
-
-				var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-
-				for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) {
-					var hslide = horizontalSlides[i],
-						hoffset = config.rtl ? -105 : 105;
-
-					hslide.setAttribute( 'data-index-h', i );
-
-					// Apply CSS transform
-					transformElement( hslide, 'translateZ(-'+ depth +'px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)' );
-
-					if( hslide.classList.contains( 'stack' ) ) {
-
-						var verticalSlides = hslide.querySelectorAll( 'section' );
-
-						for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) {
-							var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide );
-
-							var vslide = verticalSlides[j];
-
-							vslide.setAttribute( 'data-index-h', i );
-							vslide.setAttribute( 'data-index-v', j );
-
-							// Apply CSS transform
-							transformElement( vslide, 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)' );
-
-							// Navigate to this slide on click
-							vslide.addEventListener( 'click', onOverviewSlideClicked, true );
-						}
-
-					}
-					else {
-
-						// Navigate to this slide on click
-						hslide.addEventListener( 'click', onOverviewSlideClicked, true );
-
-					}
-				}
-
-				updateSlidesVisibility();
-
-				layout();
-
-				if( !wasActive ) {
-					// Notify observers of the overview showing
-					dispatchEvent( 'overviewshown', {
-						'indexh': indexh,
-						'indexv': indexv,
-						'currentSlide': currentSlide
-					} );
-				}
-
-			}, 10 );
-
-		}
-
-	}
-
-	/**
-	 * Exits the slide overview and enters the currently
-	 * active slide.
-	 */
-	function deactivateOverview() {
-
-		// Only proceed if enabled in config
-		if( config.overview ) {
-
-			clearTimeout( activateOverviewTimeout );
-			clearTimeout( deactivateOverviewTimeout );
-
-			dom.wrapper.classList.remove( 'overview' );
-
-			// Temporarily add a class so that transitions can do different things
-			// depending on whether they are exiting/entering overview, or just
-			// moving from slide to slide
-			dom.wrapper.classList.add( 'overview-deactivating' );
-
-			deactivateOverviewTimeout = setTimeout( function () {
-				dom.wrapper.classList.remove( 'overview-deactivating' );
-			}, 1 );
-
-			// Select all slides
-			toArray( document.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) {
-				// Resets all transforms to use the external styles
-				transformElement( slide, '' );
-
-				slide.removeEventListener( 'click', onOverviewSlideClicked, true );
-			} );
-
-			slide( indexh, indexv );
-
-			cueAutoSlide();
-
-			// Notify observers of the overview hiding
-			dispatchEvent( 'overviewhidden', {
-				'indexh': indexh,
-				'indexv': indexv,
-				'currentSlide': currentSlide
-			} );
-
-		}
-	}
-
-	/**
-	 * Toggles the slide overview mode on and off.
-	 *
-	 * @param {Boolean} override Optional flag which overrides the
-	 * toggle logic and forcibly sets the desired state. True means
-	 * overview is open, false means it's closed.
-	 */
-	function toggleOverview( override ) {
-
-		if( typeof override === 'boolean' ) {
-			override ? activateOverview() : deactivateOverview();
-		}
-		else {
-			isOverview() ? deactivateOverview() : activateOverview();
-		}
-
-	}
-
-	/**
-	 * Checks if the overview is currently active.
-	 *
-	 * @return {Boolean} true if the overview is active,
-	 * false otherwise
-	 */
-	function isOverview() {
-
-		return dom.wrapper.classList.contains( 'overview' );
-
-	}
-
-	/**
-	 * Checks if the current or specified slide is vertical
-	 * (nested within another slide).
-	 *
-	 * @param {HTMLElement} slide [optional] The slide to check
-	 * orientation of
-	 */
-	function isVerticalSlide( slide ) {
-
-		// Prefer slide argument, otherwise use current slide
-		slide = slide ? slide : currentSlide;
-
-		return slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i );
-
-	}
-
-	/**
-	 * Handling the fullscreen functionality via the fullscreen API
-	 *
-	 * @see http://fullscreen.spec.whatwg.org/
-	 * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode
-	 */
-	function enterFullscreen() {
-
-		var element = document.body;
-
-		// Check which implementation is available
-		var requestMethod = element.requestFullScreen ||
-							element.webkitRequestFullscreen ||
-							element.webkitRequestFullScreen ||
-							element.mozRequestFullScreen ||
-							element.msRequestFullScreen;
-
-		if( requestMethod ) {
-			requestMethod.apply( element );
-		}
-
-	}
-
-	/**
-	 * Enters the paused mode which fades everything on screen to
-	 * black.
-	 */
-	function pause() {
-
-		var wasPaused = dom.wrapper.classList.contains( 'paused' );
-
-		cancelAutoSlide();
-		dom.wrapper.classList.add( 'paused' );
-
-		if( wasPaused === false ) {
-			dispatchEvent( 'paused' );
-		}
-
-	}
-
-	/**
-	 * Exits from the paused mode.
-	 */
-	function resume() {
-
-		var wasPaused = dom.wrapper.classList.contains( 'paused' );
-		dom.wrapper.classList.remove( 'paused' );
-
-		cueAutoSlide();
-
-		if( wasPaused ) {
-			dispatchEvent( 'resumed' );
-		}
-
-	}
-
-	/**
-	 * Toggles the paused mode on and off.
-	 */
-	function togglePause() {
-
-		if( isPaused() ) {
-			resume();
-		}
-		else {
-			pause();
-		}
-
-	}
-
-	/**
-	 * Checks if we are currently in the paused mode.
-	 */
-	function isPaused() {
-
-		return dom.wrapper.classList.contains( 'paused' );
-
-	}
-
-	/**
-	 * Steps from the current point in the presentation to the
-	 * slide which matches the specified horizontal and vertical
-	 * indices.
-	 *
-	 * @param {int} h Horizontal index of the target slide
-	 * @param {int} v Vertical index of the target slide
-	 * @param {int} f Optional index of a fragment within the
-	 * target slide to activate
-	 * @param {int} o Optional origin for use in multimaster environments
-	 */
-	function slide( h, v, f, o ) {
-
-		// Remember where we were at before
-		previousSlide = currentSlide;
-
-		// Query all horizontal slides in the deck
-		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-
-		// If no vertical index is specified and the upcoming slide is a
-		// stack, resume at its previous vertical index
-		if( v === undefined ) {
-			v = getPreviousVerticalIndex( horizontalSlides[ h ] );
-		}
-
-		// If we were on a vertical stack, remember what vertical index
-		// it was on so we can resume at the same position when returning
-		if( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) {
-			setPreviousVerticalIndex( previousSlide.parentNode, indexv );
-		}
-
-		// Remember the state before this slide
-		var stateBefore = state.concat();
-
-		// Reset the state array
-		state.length = 0;
-
-		var indexhBefore = indexh || 0,
-			indexvBefore = indexv || 0;
-
-		// Activate and transition to the new slide
-		indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );
-		indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );
-
-		// Update the visibility of slides now that the indices have changed
-		updateSlidesVisibility();
-
-		layout();
-
-		// Apply the new state
-		stateLoop: for( var i = 0, len = state.length; i < len; i++ ) {
-			// Check if this state existed on the previous slide. If it
-			// did, we will avoid adding it repeatedly
-			for( var j = 0; j < stateBefore.length; j++ ) {
-				if( stateBefore[j] === state[i] ) {
-					stateBefore.splice( j, 1 );
-					continue stateLoop;
-				}
-			}
-
-			document.documentElement.classList.add( state[i] );
-
-			// Dispatch custom event matching the state's name
-			dispatchEvent( state[i] );
-		}
-
-		// Clean up the remains of the previous state
-		while( stateBefore.length ) {
-			document.documentElement.classList.remove( stateBefore.pop() );
-		}
-
-		// If the overview is active, re-activate it to update positions
-		if( isOverview() ) {
-			activateOverview();
-		}
-
-		// Find the current horizontal slide and any possible vertical slides
-		// within it
-		var currentHorizontalSlide = horizontalSlides[ indexh ],
-			currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );
-
-		// Store references to the previous and current slides
-		currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;
-
-		// Show fragment, if specified
-		if( typeof f !== 'undefined' ) {
-			navigateFragment( f );
-		}
-
-		// Dispatch an event if the slide changed
-		var slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore );
-		if( slideChanged ) {
-			dispatchEvent( 'slidechanged', {
-				'indexh': indexh,
-				'indexv': indexv,
-				'previousSlide': previousSlide,
-				'currentSlide': currentSlide,
-				'origin': o
-			} );
-		}
-		else {
-			// Ensure that the previous slide is never the same as the current
-			previousSlide = null;
-		}
-
-		// Solves an edge case where the previous slide maintains the
-		// 'present' class when navigating between adjacent vertical
-		// stacks
-		if( previousSlide ) {
-			previousSlide.classList.remove( 'present' );
-
-			// Reset all slides upon navigate to home
-			// Issue: #285
-			if ( document.querySelector( HOME_SLIDE_SELECTOR ).classList.contains( 'present' ) ) {
-				// Launch async task
-				setTimeout( function () {
-					var slides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.stack') ), i;
-					for( i in slides ) {
-						if( slides[i] ) {
-							// Reset stack
-							setPreviousVerticalIndex( slides[i], 0 );
-						}
-					}
-				}, 0 );
-			}
-		}
-
-		// Handle embedded content
-		if( slideChanged ) {
-			stopEmbeddedContent( previousSlide );
-			startEmbeddedContent( currentSlide );
-		}
-
-		updateControls();
-		updateProgress();
-		updateBackground();
-		updateParallax();
-		updateSlideNumber();
-
-		// Update the URL hash
-		writeURL();
-
-		cueAutoSlide();
-
-	}
-
-	/**
-	 * Syncs the presentation with the current DOM. Useful
-	 * when new slides or control elements are added or when
-	 * the configuration has changed.
-	 */
-	function sync() {
-
-		// Subscribe to input
-		removeEventListeners();
-		addEventListeners();
-
-		// Force a layout to make sure the current config is accounted for
-		layout();
-
-		// Reflect the current autoSlide value
-		autoSlide = config.autoSlide;
-
-		// Start auto-sliding if it's enabled
-		cueAutoSlide();
-
-		// Re-create the slide backgrounds
-		createBackgrounds();
-
-		sortAllFragments();
-
-		updateControls();
-		updateProgress();
-		updateBackground( true );
-		updateSlideNumber();
-
-	}
-
-	/**
-	 * Resets all vertical slides so that only the first
-	 * is visible.
-	 */
-	function resetVerticalSlides() {
-
-		var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-		horizontalSlides.forEach( function( horizontalSlide ) {
-
-			var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) );
-			verticalSlides.forEach( function( verticalSlide, y ) {
-
-				if( y > 0 ) {
-					verticalSlide.classList.remove( 'present' );
-					verticalSlide.classList.remove( 'past' );
-					verticalSlide.classList.add( 'future' );
-				}
-
-			} );
-
-		} );
-
-	}
-
-	/**
-	 * Sorts and formats all of fragments in the
-	 * presentation.
-	 */
-	function sortAllFragments() {
-
-		var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-		horizontalSlides.forEach( function( horizontalSlide ) {
-
-			var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) );
-			verticalSlides.forEach( function( verticalSlide, y ) {
-
-				sortFragments( verticalSlide.querySelectorAll( '.fragment' ) );
-
-			} );
-
-			if( verticalSlides.length === 0 ) sortFragments( horizontalSlide.querySelectorAll( '.fragment' ) );
-
-		} );
-
-	}
-
-	/**
-	 * Updates one dimension of slides by showing the slide
-	 * with the specified index.
-	 *
-	 * @param {String} selector A CSS selector that will fetch
-	 * the group of slides we are working with
-	 * @param {Number} index The index of the slide that should be
-	 * shown
-	 *
-	 * @return {Number} The index of the slide that is now shown,
-	 * might differ from the passed in index if it was out of
-	 * bounds.
-	 */
-	function updateSlides( selector, index ) {
-
-		// Select all slides and convert the NodeList result to
-		// an array
-		var slides = toArray( document.querySelectorAll( selector ) ),
-			slidesLength = slides.length;
-
-		if( slidesLength ) {
-
-			// Should the index loop?
-			if( config.loop ) {
-				index %= slidesLength;
-
-				if( index < 0 ) {
-					index = slidesLength + index;
-				}
-			}
-
-			// Enforce max and minimum index bounds
-			index = Math.max( Math.min( index, slidesLength - 1 ), 0 );
-
-			for( var i = 0; i < slidesLength; i++ ) {
-				var element = slides[i];
-
-				var reverse = config.rtl && !isVerticalSlide( element );
-
-				element.classList.remove( 'past' );
-				element.classList.remove( 'present' );
-				element.classList.remove( 'future' );
-
-				// http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute
-				element.setAttribute( 'hidden', '' );
-
-				if( i < index ) {
-					// Any element previous to index is given the 'past' class
-					element.classList.add( reverse ? 'future' : 'past' );
-
-					var pastFragments = toArray( element.querySelectorAll( '.fragment' ) );
-
-					// Show all fragments on prior slides
-					while( pastFragments.length ) {
-						var pastFragment = pastFragments.pop();
-						pastFragment.classList.add( 'visible' );
-						pastFragment.classList.remove( 'current-fragment' );
-					}
-				}
-				else if( i > index ) {
-					// Any element subsequent to index is given the 'future' class
-					element.classList.add( reverse ? 'past' : 'future' );
-
-					var futureFragments = toArray( element.querySelectorAll( '.fragment.visible' ) );
-
-					// No fragments in future slides should be visible ahead of time
-					while( futureFragments.length ) {
-						var futureFragment = futureFragments.pop();
-						futureFragment.classList.remove( 'visible' );
-						futureFragment.classList.remove( 'current-fragment' );
-					}
-				}
-
-				// If this element contains vertical slides
-				if( element.querySelector( 'section' ) ) {
-					element.classList.add( 'stack' );
-				}
-			}
-
-			// Mark the current slide as present
-			slides[index].classList.add( 'present' );
-			slides[index].removeAttribute( 'hidden' );
-
-			// If this slide has a state associated with it, add it
-			// onto the current state of the deck
-			var slideState = slides[index].getAttribute( 'data-state' );
-			if( slideState ) {
-				state = state.concat( slideState.split( ' ' ) );
-			}
-
-		}
-		else {
-			// Since there are no slides we can't be anywhere beyond the
-			// zeroth index
-			index = 0;
-		}
-
-		return index;
-
-	}
-
-	/**
-	 * Optimization method; hide all slides that are far away
-	 * from the present slide.
-	 */
-	function updateSlidesVisibility() {
-
-		// Select all slides and convert the NodeList result to
-		// an array
-		var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ),
-			horizontalSlidesLength = horizontalSlides.length,
-			distanceX,
-			distanceY;
-
-		if( horizontalSlidesLength ) {
-
-			// The number of steps away from the present slide that will
-			// be visible
-			var viewDistance = isOverview() ? 10 : config.viewDistance;
-
-			// Limit view distance on weaker devices
-			if( isMobileDevice ) {
-				viewDistance = isOverview() ? 6 : 1;
-			}
-
-			for( var x = 0; x < horizontalSlidesLength; x++ ) {
-				var horizontalSlide = horizontalSlides[x];
-
-				var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ),
-					verticalSlidesLength = verticalSlides.length;
-
-				// Loops so that it measures 1 between the first and last slides
-				distanceX = Math.abs( ( indexh - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0;
-
-				// Show the horizontal slide if it's within the view distance
-				horizontalSlide.style.display = distanceX > viewDistance ? 'none' : 'block';
-
-				if( verticalSlidesLength ) {
-
-					var oy = getPreviousVerticalIndex( horizontalSlide );
-
-					for( var y = 0; y < verticalSlidesLength; y++ ) {
-						var verticalSlide = verticalSlides[y];
-
-						distanceY = x === indexh ? Math.abs( indexv - y ) : Math.abs( y - oy );
-
-						verticalSlide.style.display = ( distanceX + distanceY ) > viewDistance ? 'none' : 'block';
-					}
-
-				}
-			}
-
-		}
-
-	}
-
-	/**
-	 * Updates the progress bar to reflect the current slide.
-	 */
-	function updateProgress() {
-
-		// Update progress if enabled
-		if( config.progress && dom.progress ) {
-
-			var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-
-			// The number of past and total slides
-			var totalCount = document.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length;
-			var pastCount = 0;
-
-			// Step through all slides and count the past ones
-			mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) {
-
-				var horizontalSlide = horizontalSlides[i];
-				var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) );
-
-				for( var j = 0; j < verticalSlides.length; j++ ) {
-
-					// Stop as soon as we arrive at the present
-					if( verticalSlides[j].classList.contains( 'present' ) ) {
-						break mainLoop;
-					}
-
-					pastCount++;
-
-				}
-
-				// Stop as soon as we arrive at the present
-				if( horizontalSlide.classList.contains( 'present' ) ) {
-					break;
-				}
-
-				// Don't count the wrapping section for vertical slides
-				if( horizontalSlide.classList.contains( 'stack' ) === false ) {
-					pastCount++;
-				}
-
-			}
-
-			dom.progressbar.style.width = ( pastCount / ( totalCount - 1 ) ) * window.innerWidth + 'px';
-
-		}
-
-	}
-
-	/**
-	 * Updates the slide number div to reflect the current slide.
-	 */
-	function updateSlideNumber() {
-
-		// Update slide number if enabled
-		if( config.slideNumber && dom.slideNumber) {
-
-			// Display the number of the page using 'indexh - indexv' format
-			var indexString = indexh;
-			if( indexv > 0 ) {
-				indexString += ' - ' + indexv;
-			}
-
-			dom.slideNumber.innerHTML = indexString;
-		}
-
-	}
-
-	/**
-	 * Updates the state of all control/navigation arrows.
-	 */
-	function updateControls() {
-
-		var routes = availableRoutes();
-		var fragments = availableFragments();
-
-		// Remove the 'enabled' class from all directions
-		dom.controlsLeft.concat( dom.controlsRight )
-						.concat( dom.controlsUp )
-						.concat( dom.controlsDown )
-						.concat( dom.controlsPrev )
-						.concat( dom.controlsNext ).forEach( function( node ) {
-			node.classList.remove( 'enabled' );
-			node.classList.remove( 'fragmented' );
-		} );
-
-		// Add the 'enabled' class to the available routes
-		if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' );	} );
-		if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } );
-		if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' );	} );
-		if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } );
-
-		// Prev/next buttons
-		if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } );
-		if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } );
-
-		// Highlight fragment directions
-		if( currentSlide ) {
-
-			// Always apply fragment decorator to prev/next buttons
-			if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-			if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-
-			// Apply fragment decorators to directional buttons based on
-			// what slide axis they are in
-			if( isVerticalSlide( currentSlide ) ) {
-				if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-				if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-			}
-			else {
-				if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-				if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-			}
-
-		}
-
-	}
-
-	/**
-	 * Updates the background elements to reflect the current
-	 * slide.
-	 *
-	 * @param {Boolean} includeAll If true, the backgrounds of
-	 * all vertical slides (not just the present) will be updated.
-	 */
-	function updateBackground( includeAll ) {
-
-		var currentBackground = null;
-
-		// Reverse past/future classes when in RTL mode
-		var horizontalPast = config.rtl ? 'future' : 'past',
-			horizontalFuture = config.rtl ? 'past' : 'future';
-
-		// Update the classes of all backgrounds to match the
-		// states of their slides (past/present/future)
-		toArray( dom.background.childNodes ).forEach( function( backgroundh, h ) {
-
-			if( h < indexh ) {
-				backgroundh.className = 'slide-background ' + horizontalPast;
-			}
-			else if ( h > indexh ) {
-				backgroundh.className = 'slide-background ' + horizontalFuture;
-			}
-			else {
-				backgroundh.className = 'slide-background present';
-
-				// Store a reference to the current background element
-				currentBackground = backgroundh;
-			}
-
-			if( includeAll || h === indexh ) {
-				toArray( backgroundh.childNodes ).forEach( function( backgroundv, v ) {
-
-					if( v < indexv ) {
-						backgroundv.className = 'slide-background past';
-					}
-					else if ( v > indexv ) {
-						backgroundv.className = 'slide-background future';
-					}
-					else {
-						backgroundv.className = 'slide-background present';
-
-						// Only if this is the present horizontal and vertical slide
-						if( h === indexh ) currentBackground = backgroundv;
-					}
-
-				} );
-			}
-
-		} );
-
-		// Don't transition between identical backgrounds. This
-		// prevents unwanted flicker.
-		if( currentBackground ) {
-			var previousBackgroundHash = previousBackground ? previousBackground.getAttribute( 'data-background-hash' ) : null;
-			var currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' );
-			if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== previousBackground ) {
-				dom.background.classList.add( 'no-transition' );
-			}
-
-			previousBackground = currentBackground;
-		}
-
-		// Allow the first background to apply without transition
-		setTimeout( function() {
-			dom.background.classList.remove( 'no-transition' );
-		}, 1 );
-
-	}
-
-	/**
-	 * Updates the position of the parallax background based
-	 * on the current slide index.
-	 */
-	function updateParallax() {
-
-		if( config.parallaxBackgroundImage ) {
-
-			var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),
-				verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR );
-
-			var backgroundSize = dom.background.style.backgroundSize.split( ' ' ),
-				backgroundWidth, backgroundHeight;
-
-			if( backgroundSize.length === 1 ) {
-				backgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 );
-			}
-			else {
-				backgroundWidth = parseInt( backgroundSize[0], 10 );
-				backgroundHeight = parseInt( backgroundSize[1], 10 );
-			}
-
-			var slideWidth = dom.background.offsetWidth;
-			var horizontalSlideCount = horizontalSlides.length;
-			var horizontalOffset = -( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) * indexh;
-
-			var slideHeight = dom.background.offsetHeight;
-			var verticalSlideCount = verticalSlides.length;
-			var verticalOffset = verticalSlideCount > 0 ? -( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ) * indexv : 0;
-
-			dom.background.style.backgroundPosition = horizontalOffset + 'px ' + verticalOffset + 'px';
-
-		}
-
-	}
-
-	/**
-	 * Determine what available routes there are for navigation.
-	 *
-	 * @return {Object} containing four booleans: left/right/up/down
-	 */
-	function availableRoutes() {
-
-		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),
-			verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR );
-
-		var routes = {
-			left: indexh > 0 || config.loop,
-			right: indexh < horizontalSlides.length - 1 || config.loop,
-			up: indexv > 0,
-			down: indexv < verticalSlides.length - 1
-		};
-
-		// reverse horizontal controls for rtl
-		if( config.rtl ) {
-			var left = routes.left;
-			routes.left = routes.right;
-			routes.right = left;
-		}
-
-		return routes;
-
-	}
-
-	/**
-	 * Returns an object describing the available fragment
-	 * directions.
-	 *
-	 * @return {Object} two boolean properties: prev/next
-	 */
-	function availableFragments() {
-
-		if( currentSlide && config.fragments ) {
-			var fragments = currentSlide.querySelectorAll( '.fragment' );
-			var hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.visible)' );
-
-			return {
-				prev: fragments.length - hiddenFragments.length > 0,
-				next: !!hiddenFragments.length
-			};
-		}
-		else {
-			return { prev: false, next: false };
-		}
-
-	}
-
-	/**
-	 * Start playback of any embedded content inside of
-	 * the targeted slide.
-	 */
-	function startEmbeddedContent( slide ) {
-
-		if( slide && !isSpeakerNotes() ) {
-			// HTML5 media elements
-			toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) {
-				if( el.hasAttribute( 'data-autoplay' ) ) {
-					el.play();
-				}
-			} );
-
-			// iframe embeds
-			toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) {
-				el.contentWindow.postMessage( 'slide:start', '*' );
-			});
-
-			// YouTube embeds
-			toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) {
-				if( el.hasAttribute( 'data-autoplay' ) ) {
-					el.contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' );
-				}
-			});
-		}
-
-	}
-
-	/**
-	 * Stop playback of any embedded content inside of
-	 * the targeted slide.
-	 */
-	function stopEmbeddedContent( slide ) {
-
-		if( slide ) {
-			// HTML5 media elements
-			toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) {
-				if( !el.hasAttribute( 'data-ignore' ) ) {
-					el.pause();
-				}
-			} );
-
-			// iframe embeds
-			toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) {
-				el.contentWindow.postMessage( 'slide:stop', '*' );
-			});
-
-			// YouTube embeds
-			toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) {
-				if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) {
-					el.contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' );
-				}
-			});
-		}
-
-	}
-
-	/**
-	 * Checks if this presentation is running inside of the
-	 * speaker notes window.
-	 */
-	function isSpeakerNotes() {
-
-		return !!window.location.search.match( /receiver/gi );
-
-	}
-
-	/**
-	 * Reads the current URL (hash) and navigates accordingly.
-	 */
-	function readURL() {
-
-		var hash = window.location.hash;
-
-		// Attempt to parse the hash as either an index or name
-		var bits = hash.slice( 2 ).split( '/' ),
-			name = hash.replace( /#|\//gi, '' );
-
-		// If the first bit is invalid and there is a name we can
-		// assume that this is a named link
-		if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) {
-			// Find the slide with the specified name
-			var element = document.querySelector( '#' + name );
-
-			if( element ) {
-				// Find the position of the named slide and navigate to it
-				var indices = Reveal.getIndices( element );
-				slide( indices.h, indices.v );
-			}
-			// If the slide doesn't exist, navigate to the current slide
-			else {
-				slide( indexh || 0, indexv || 0 );
-			}
-		}
-		else {
-			// Read the index components of the hash
-			var h = parseInt( bits[0], 10 ) || 0,
-				v = parseInt( bits[1], 10 ) || 0;
-
-			if( h !== indexh || v !== indexv ) {
-				slide( h, v );
-			}
-		}
-
-	}
-
-	/**
-	 * Updates the page URL (hash) to reflect the current
-	 * state.
-	 *
-	 * @param {Number} delay The time in ms to wait before
-	 * writing the hash
-	 */
-	function writeURL( delay ) {
-
-		if( config.history ) {
-
-			// Make sure there's never more than one timeout running
-			clearTimeout( writeURLTimeout );
-
-			// If a delay is specified, timeout this call
-			if( typeof delay === 'number' ) {
-				writeURLTimeout = setTimeout( writeURL, delay );
-			}
-			else {
-				var url = '/';
-
-				// If the current slide has an ID, use that as a named link
-				if( currentSlide && typeof currentSlide.getAttribute( 'id' ) === 'string' ) {
-					url = '/' + currentSlide.getAttribute( 'id' );
-				}
-				// Otherwise use the /h/v index
-				else {
-					if( indexh > 0 || indexv > 0 ) url += indexh;
-					if( indexv > 0 ) url += '/' + indexv;
-				}
-
-				window.location.hash = url;
-			}
-		}
-
-	}
-
-	/**
-	 * Retrieves the h/v location of the current, or specified,
-	 * slide.
-	 *
-	 * @param {HTMLElement} slide If specified, the returned
-	 * index will be for this slide rather than the currently
-	 * active one
-	 *
-	 * @return {Object} { h: <int>, v: <int>, f: <int> }
-	 */
-	function getIndices( slide ) {
-
-		// By default, return the current indices
-		var h = indexh,
-			v = indexv,
-			f;
-
-		// If a slide is specified, return the indices of that slide
-		if( slide ) {
-			var isVertical = isVerticalSlide( slide );
-			var slideh = isVertical ? slide.parentNode : slide;
-
-			// Select all horizontal slides
-			var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-
-			// Now that we know which the horizontal slide is, get its index
-			h = Math.max( horizontalSlides.indexOf( slideh ), 0 );
-
-			// If this is a vertical slide, grab the vertical index
-			if( isVertical ) {
-				v = Math.max( toArray( slide.parentNode.querySelectorAll( 'section' ) ).indexOf( slide ), 0 );
-			}
-		}
-
-		if( !slide && currentSlide ) {
-			var hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0;
-			if( hasFragments ) {
-				var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );
-				f = visibleFragments.length - 1;
-			}
-		}
-
-		return { h: h, v: v, f: f };
-
-	}
-
-	/**
-	 * Return a sorted fragments list, ordered by an increasing
-	 * "data-fragment-index" attribute.
-	 *
-	 * Fragments will be revealed in the order that they are returned by
-	 * this function, so you can use the index attributes to control the
-	 * order of fragment appearance.
-	 *
-	 * To maintain a sensible default fragment order, fragments are presumed
-	 * to be passed in document order. This function adds a "fragment-index"
-	 * attribute to each node if such an attribute is not already present,
-	 * and sets that attribute to an integer value which is the position of
-	 * the fragment within the fragments list.
-	 */
-	function sortFragments( fragments ) {
-
-		fragments = toArray( fragments );
-
-		var ordered = [],
-			unordered = [],
-			sorted = [];
-
-		// Group ordered and unordered elements
-		fragments.forEach( function( fragment, i ) {
-			if( fragment.hasAttribute( 'data-fragment-index' ) ) {
-				var index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 );
-
-				if( !ordered[index] ) {
-					ordered[index] = [];
-				}
-
-				ordered[index].push( fragment );
-			}
-			else {
-				unordered.push( [ fragment ] );
-			}
-		} );
-
-		// Append fragments without explicit indices in their
-		// DOM order
-		ordered = ordered.concat( unordered );
-
-		// Manually count the index up per group to ensure there
-		// are no gaps
-		var index = 0;
-
-		// Push all fragments in their sorted order to an array,
-		// this flattens the groups
-		ordered.forEach( function( group ) {
-			group.forEach( function( fragment ) {
-				sorted.push( fragment );
-				fragment.setAttribute( 'data-fragment-index', index );
-			} );
-
-			index ++;
-		} );
-
-		return sorted;
-
-	}
-
-	/**
-	 * Navigate to the specified slide fragment.
-	 *
-	 * @param {Number} index The index of the fragment that
-	 * should be shown, -1 means all are invisible
-	 * @param {Number} offset Integer offset to apply to the
-	 * fragment index
-	 *
-	 * @return {Boolean} true if a change was made in any
-	 * fragments visibility as part of this call
-	 */
-	function navigateFragment( index, offset ) {
-
-		if( currentSlide && config.fragments ) {
-
-			var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment' ) );
-			if( fragments.length ) {
-
-				// If no index is specified, find the current
-				if( typeof index !== 'number' ) {
-					var lastVisibleFragment = sortFragments( currentSlide.querySelectorAll( '.fragment.visible' ) ).pop();
-
-					if( lastVisibleFragment ) {
-						index = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );
-					}
-					else {
-						index = -1;
-					}
-				}
-
-				// If an offset is specified, apply it to the index
-				if( typeof offset === 'number' ) {
-					index += offset;
-				}
-
-				var fragmentsShown = [],
-					fragmentsHidden = [];
-
-				toArray( fragments ).forEach( function( element, i ) {
-
-					if( element.hasAttribute( 'data-fragment-index' ) ) {
-						i = parseInt( element.getAttribute( 'data-fragment-index' ), 10 );
-					}
-
-					// Visible fragments
-					if( i <= index ) {
-						if( !element.classList.contains( 'visible' ) ) fragmentsShown.push( element );
-						element.classList.add( 'visible' );
-						element.classList.remove( 'current-fragment' );
-
-						if( i === index ) {
-							element.classList.add( 'current-fragment' );
-						}
-					}
-					// Hidden fragments
-					else {
-						if( element.classList.contains( 'visible' ) ) fragmentsHidden.push( element );
-						element.classList.remove( 'visible' );
-						element.classList.remove( 'current-fragment' );
-					}
-
-
-				} );
-
-				if( fragmentsHidden.length ) {
-					dispatchEvent( 'fragmenthidden', { fragment: fragmentsHidden[0], fragments: fragmentsHidden } );
-				}
-
-				if( fragmentsShown.length ) {
-					dispatchEvent( 'fragmentshown', { fragment: fragmentsShown[0], fragments: fragmentsShown } );
-				}
-
-				updateControls();
-
-				return !!( fragmentsShown.length || fragmentsHidden.length );
-
-			}
-
-		}
-
-		return false;
-
-	}
-
-	/**
-	 * Navigate to the next slide fragment.
-	 *
-	 * @return {Boolean} true if there was a next fragment,
-	 * false otherwise
-	 */
-	function nextFragment() {
-
-		return navigateFragment( null, 1 );
-
-	}
-
-	/**
-	 * Navigate to the previous slide fragment.
-	 *
-	 * @return {Boolean} true if there was a previous fragment,
-	 * false otherwise
-	 */
-	function previousFragment() {
-
-		return navigateFragment( null, -1 );
-
-	}
-
-	/**
-	 * Cues a new automated slide if enabled in the config.
-	 */
-	function cueAutoSlide() {
-
-		cancelAutoSlide();
-
-		if( currentSlide ) {
-
-			var parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null;
-			var slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' );
-
-			// Pick value in the following priority order:
-			// 1. Current slide's data-autoslide
-			// 2. Parent slide's data-autoslide
-			// 3. Global autoSlide setting
-			if( slideAutoSlide ) {
-				autoSlide = parseInt( slideAutoSlide, 10 );
-			}
-			else if( parentAutoSlide ) {
-				autoSlide = parseInt( parentAutoSlide, 10 );
-			}
-			else {
-				autoSlide = config.autoSlide;
-			}
-
-			// If there are media elements with data-autoplay,
-			// automatically set the autoSlide duration to the
-			// length of that media
-			toArray( currentSlide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) {
-				if( el.hasAttribute( 'data-autoplay' ) ) {
-					if( autoSlide && el.duration * 1000 > autoSlide ) {
-						autoSlide = ( el.duration * 1000 ) + 1000;
-					}
-				}
-			} );
-
-			// Cue the next auto-slide if:
-			// - There is an autoSlide value
-			// - Auto-sliding isn't paused by the user
-			// - The presentation isn't paused
-			// - The overview isn't active
-			// - The presentation isn't over
-			if( autoSlide && !autoSlidePaused && !isPaused() && !isOverview() && ( !Reveal.isLastSlide() || config.loop === true ) ) {
-				autoSlideTimeout = setTimeout( navigateNext, autoSlide );
-				autoSlideStartTime = Date.now();
-			}
-
-			if( autoSlidePlayer ) {
-				autoSlidePlayer.setPlaying( autoSlideTimeout !== -1 );
-			}
-
-		}
-
-	}
-
-	/**
-	 * Cancels any ongoing request to auto-slide.
-	 */
-	function cancelAutoSlide() {
-
-		clearTimeout( autoSlideTimeout );
-		autoSlideTimeout = -1;
-
-	}
-
-	function pauseAutoSlide() {
-
-		autoSlidePaused = true;
-		clearTimeout( autoSlideTimeout );
-
-		if( autoSlidePlayer ) {
-			autoSlidePlayer.setPlaying( false );
-		}
-
-	}
-
-	function resumeAutoSlide() {
-
-		autoSlidePaused = false;
-		cueAutoSlide();
-
-	}
-
-	function navigateLeft() {
-
-		// Reverse for RTL
-		if( config.rtl ) {
-			if( ( isOverview() || nextFragment() === false ) && availableRoutes().left ) {
-				slide( indexh + 1 );
-			}
-		}
-		// Normal navigation
-		else if( ( isOverview() || previousFragment() === false ) && availableRoutes().left ) {
-			slide( indexh - 1 );
-		}
-
-	}
-
-	function navigateRight() {
-
-		// Reverse for RTL
-		if( config.rtl ) {
-			if( ( isOverview() || previousFragment() === false ) && availableRoutes().right ) {
-				slide( indexh - 1 );
-			}
-		}
-		// Normal navigation
-		else if( ( isOverview() || nextFragment() === false ) && availableRoutes().right ) {
-			slide( indexh + 1 );
-		}
-
-	}
-
-	function navigateUp() {
-
-		// Prioritize hiding fragments
-		if( ( isOverview() || previousFragment() === false ) && availableRoutes().up ) {
-			slide( indexh, indexv - 1 );
-		}
-
-	}
-
-	function navigateDown() {
-
-		// Prioritize revealing fragments
-		if( ( isOverview() || nextFragment() === false ) && availableRoutes().down ) {
-			slide( indexh, indexv + 1 );
-		}
-
-	}
-
-	/**
-	 * Navigates backwards, prioritized in the following order:
-	 * 1) Previous fragment
-	 * 2) Previous vertical slide
-	 * 3) Previous horizontal slide
-	 */
-	function navigatePrev() {
-
-		// Prioritize revealing fragments
-		if( previousFragment() === false ) {
-			if( availableRoutes().up ) {
-				navigateUp();
-			}
-			else {
-				// Fetch the previous horizontal slide, if there is one
-				var previousSlide = document.querySelector( HORIZONTAL_SLIDES_SELECTOR + '.past:nth-child(' + indexh + ')' );
-
-				if( previousSlide ) {
-					var v = ( previousSlide.querySelectorAll( 'section' ).length - 1 ) || undefined;
-					var h = indexh - 1;
-					slide( h, v );
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * Same as #navigatePrev() but navigates forwards.
-	 */
-	function navigateNext() {
-
-		// Prioritize revealing fragments
-		if( nextFragment() === false ) {
-			availableRoutes().down ? navigateDown() : navigateRight();
-		}
-
-		// If auto-sliding is enabled we need to cue up
-		// another timeout
-		cueAutoSlide();
-
-	}
-
-
-	// --------------------------------------------------------------------//
-	// ----------------------------- EVENTS -------------------------------//
-	// --------------------------------------------------------------------//
-
-	/**
-	 * Called by all event handlers that are based on user
-	 * input.
-	 */
-	function onUserInput( event ) {
-
-		if( config.autoSlideStoppable ) {
-			pauseAutoSlide();
-		}
-
-	}
-
-	/**
-	 * Handler for the document level 'keydown' event.
-	 */
-	function onDocumentKeyDown( event ) {
-
-		onUserInput( event );
-
-		// Check if there's a focused element that could be using
-		// the keyboard
-		var activeElement = document.activeElement;
-		var hasFocus = !!( document.activeElement && ( document.activeElement.type || document.activeElement.href || document.activeElement.contentEditable !== 'inherit' ) );
-
-		// Disregard the event if there's a focused element or a
-		// keyboard modifier key is present
-		if( hasFocus || (event.shiftKey && event.keyCode !== 32) || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		// While paused only allow "unpausing" keyboard events (b and .)
-		if( isPaused() && [66,190,191].indexOf( event.keyCode ) === -1 ) {
-			return false;
-		}
-
-		var triggered = false;
-
-		// 1. User defined key bindings
-		if( typeof config.keyboard === 'object' ) {
-
-			for( var key in config.keyboard ) {
-
-				// Check if this binding matches the pressed key
-				if( parseInt( key, 10 ) === event.keyCode ) {
-
-					var value = config.keyboard[ key ];
-
-					// Callback function
-					if( typeof value === 'function' ) {
-						value.apply( null, [ event ] );
-					}
-					// String shortcuts to reveal.js API
-					else if( typeof value === 'string' && typeof Reveal[ value ] === 'function' ) {
-						Reveal[ value ].call();
-					}
-
-					triggered = true;
-
-				}
-
-			}
-
-		}
-
-		// 2. System defined key bindings
-		if( triggered === false ) {
-
-			// Assume true and try to prove false
-			triggered = true;
-
-			switch( event.keyCode ) {
-				// p, page up
-				case 80: case 33: navigatePrev(); break;
-				// n, page down
-				case 78: case 34: navigateNext(); break;
-				// h, left
-				case 72: case 37: navigateLeft(); break;
-				// l, right
-				case 76: case 39: navigateRight(); break;
-				// k, up
-				case 75: case 38: navigateUp(); break;
-				// j, down
-				case 74: case 40: navigateDown(); break;
-				// home
-				case 36: slide( 0 ); break;
-				// end
-				case 35: slide( Number.MAX_VALUE ); break;
-				// space
-				case 32: isOverview() ? deactivateOverview() : event.shiftKey ? navigatePrev() : navigateNext(); break;
-				// return
-				case 13: isOverview() ? deactivateOverview() : triggered = false; break;
-				// b, period, Logitech presenter tools "black screen" button
-				case 66: case 190: case 191: togglePause(); break;
-				// f
-				case 70: enterFullscreen(); break;
-				default:
-					triggered = false;
-			}
-
-		}
-
-		// If the input resulted in a triggered action we should prevent
-		// the browsers default behavior
-		if( triggered ) {
-			event.preventDefault();
-		}
-		// ESC or O key
-		else if ( ( event.keyCode === 27 || event.keyCode === 79 ) && features.transforms3d ) {
-			if( dom.preview ) {
-				closePreview();
-			}
-			else {
-				toggleOverview();
-			}
-
-			event.preventDefault();
-		}
-
-		// If auto-sliding is enabled we need to cue up
-		// another timeout
-		cueAutoSlide();
-
-	}
-
-	/**
-	 * Handler for the 'touchstart' event, enables support for
-	 * swipe and pinch gestures.
-	 */
-	function onTouchStart( event ) {
-
-		touch.startX = event.touches[0].clientX;
-		touch.startY = event.touches[0].clientY;
-		touch.startCount = event.touches.length;
-
-		// If there's two touches we need to memorize the distance
-		// between those two points to detect pinching
-		if( event.touches.length === 2 && config.overview ) {
-			touch.startSpan = distanceBetween( {
-				x: event.touches[1].clientX,
-				y: event.touches[1].clientY
-			}, {
-				x: touch.startX,
-				y: touch.startY
-			} );
-		}
-
-	}
-
-	/**
-	 * Handler for the 'touchmove' event.
-	 */
-	function onTouchMove( event ) {
-
-		// Each touch should only trigger one action
-		if( !touch.captured ) {
-			onUserInput( event );
-
-			var currentX = event.touches[0].clientX;
-			var currentY = event.touches[0].clientY;
-
-			// If the touch started with two points and still has
-			// two active touches; test for the pinch gesture
-			if( event.touches.length === 2 && touch.startCount === 2 && config.overview ) {
-
-				// The current distance in pixels between the two touch points
-				var currentSpan = distanceBetween( {
-					x: event.touches[1].clientX,
-					y: event.touches[1].clientY
-				}, {
-					x: touch.startX,
-					y: touch.startY
-				} );
-
-				// If the span is larger than the desire amount we've got
-				// ourselves a pinch
-				if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) {
-					touch.captured = true;
-
-					if( currentSpan < touch.startSpan ) {
-						activateOverview();
-					}
-					else {
-						deactivateOverview();
-					}
-				}
-
-				event.preventDefault();
-
-			}
-			// There was only one touch point, look for a swipe
-			else if( event.touches.length === 1 && touch.startCount !== 2 ) {
-
-				var deltaX = currentX - touch.startX,
-					deltaY = currentY - touch.startY;
-
-				if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
-					touch.captured = true;
-					navigateLeft();
-				}
-				else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
-					touch.captured = true;
-					navigateRight();
-				}
-				else if( deltaY > touch.threshold ) {
-					touch.captured = true;
-					navigateUp();
-				}
-				else if( deltaY < -touch.threshold ) {
-					touch.captured = true;
-					navigateDown();
-				}
-
-				// If we're embedded, only block touch events if they have
-				// triggered an action
-				if( config.embedded ) {
-					if( touch.captured || isVerticalSlide( currentSlide ) ) {
-						event.preventDefault();
-					}
-				}
-				// Not embedded? Block them all to avoid needless tossing
-				// around of the viewport in iOS
-				else {
-					event.preventDefault();
-				}
-
-			}
-		}
-		// There's a bug with swiping on some Android devices unless
-		// the default action is always prevented
-		else if( navigator.userAgent.match( /android/gi ) ) {
-			event.preventDefault();
-		}
-
-	}
-
-	/**
-	 * Handler for the 'touchend' event.
-	 */
-	function onTouchEnd( event ) {
-
-		touch.captured = false;
-
-	}
-
-	/**
-	 * Convert pointer down to touch start.
-	 */
-	function onPointerDown( event ) {
-
-		if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) {
-			event.touches = [{ clientX: event.clientX, clientY: event.clientY }];
-			onTouchStart( event );
-		}
-
-	}
-
-	/**
-	 * Convert pointer move to touch move.
-	 */
-	function onPointerMove( event ) {
-
-		if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) {
-			event.touches = [{ clientX: event.clientX, clientY: event.clientY }];
-			onTouchMove( event );
-		}
-
-	}
-
-	/**
-	 * Convert pointer up to touch end.
-	 */
-	function onPointerUp( event ) {
-
-		if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) {
-			event.touches = [{ clientX: event.clientX, clientY: event.clientY }];
-			onTouchEnd( event );
-		}
-
-	}
-
-	/**
-	 * Handles mouse wheel scrolling, throttled to avoid skipping
-	 * multiple slides.
-	 */
-	function onDocumentMouseScroll( event ) {
-
-		if( Date.now() - lastMouseWheelStep > 600 ) {
-
-			lastMouseWheelStep = Date.now();
-
-			var delta = event.detail || -event.wheelDelta;
-			if( delta > 0 ) {
-				navigateNext();
-			}
-			else {
-				navigatePrev();
-			}
-
-		}
-
-	}
-
-	/**
-	 * Clicking on the progress bar results in a navigation to the
-	 * closest approximate horizontal slide using this equation:
-	 *
-	 * ( clickX / presentationWidth ) * numberOfSlides
-	 */
-	function onProgressClicked( event ) {
-
-		onUserInput( event );
-
-		event.preventDefault();
-
-		var slidesTotal = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length;
-		var slideIndex = Math.floor( ( event.clientX / dom.wrapper.offsetWidth ) * slidesTotal );
-
-		slide( slideIndex );
-
-	}
-
-	/**
-	 * Event handler for navigation control buttons.
-	 */
-	function onNavigateLeftClicked( event ) { event.preventDefault(); onUserInput(); navigateLeft(); }
-	function onNavigateRightClicked( event ) { event.preventDefault(); onUserInput(); navigateRight(); }
-	function onNavigateUpClicked( event ) { event.preventDefault(); onUserInput(); navigateUp(); }
-	function onNavigateDownClicked( event ) { event.preventDefault(); onUserInput(); navigateDown(); }
-	function onNavigatePrevClicked( event ) { event.preventDefault(); onUserInput(); navigatePrev(); }
-	function onNavigateNextClicked( event ) { event.preventDefault(); onUserInput(); navigateNext(); }
-
-	/**
-	 * Handler for the window level 'hashchange' event.
-	 */
-	function onWindowHashChange( event ) {
-
-		readURL();
-
-	}
-
-	/**
-	 * Handler for the window level 'resize' event.
-	 */
-	function onWindowResize( event ) {
-
-		layout();
-
-	}
-
-	/**
-	 * Handle for the window level 'visibilitychange' event.
-	 */
-	function onPageVisibilityChange( event ) {
-
-		var isHidden =  document.webkitHidden ||
-						document.msHidden ||
-						document.hidden;
-
-		// If, after clicking a link or similar and we're coming back,
-		// focus the document.body to ensure we can use keyboard shortcuts
-		if( isHidden === false && document.activeElement !== document.body ) {
-			document.activeElement.blur();
-			document.body.focus();
-		}
-
-	}
-
-	/**
-	 * Invoked when a slide is and we're in the overview.
-	 */
-	function onOverviewSlideClicked( event ) {
-
-		// TODO There's a bug here where the event listeners are not
-		// removed after deactivating the overview.
-		if( eventsAreBound && isOverview() ) {
-			event.preventDefault();
-
-			var element = event.target;
-
-			while( element && !element.nodeName.match( /section/gi ) ) {
-				element = element.parentNode;
-			}
-
-			if( element && !element.classList.contains( 'disabled' ) ) {
-
-				deactivateOverview();
-
-				if( element.nodeName.match( /section/gi ) ) {
-					var h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),
-						v = parseInt( element.getAttribute( 'data-index-v' ), 10 );
-
-					slide( h, v );
-				}
-
-			}
-		}
-
-	}
-
-	/**
-	 * Handles clicks on links that are set to preview in the
-	 * iframe overlay.
-	 */
-	function onPreviewLinkClicked( event ) {
-
-		var url = event.target.getAttribute( 'href' );
-		if( url ) {
-			openPreview( url );
-			event.preventDefault();
-		}
-
-	}
-
-	/**
-	 * Handles click on the auto-sliding controls element.
-	 */
-	function onAutoSlidePlayerClick( event ) {
-
-		// Replay
-		if( Reveal.isLastSlide() && config.loop === false ) {
-			slide( 0, 0 );
-			resumeAutoSlide();
-		}
-		// Resume
-		else if( autoSlidePaused ) {
-			resumeAutoSlide();
-		}
-		// Pause
-		else {
-			pauseAutoSlide();
-		}
-
-	}
-
-
-	// --------------------------------------------------------------------//
-	// ------------------------ PLAYBACK COMPONENT ------------------------//
-	// --------------------------------------------------------------------//
-
-
-	/**
-	 * Constructor for the playback component, which displays
-	 * play/pause/progress controls.
-	 *
-	 * @param {HTMLElement} container The component will append
-	 * itself to this
-	 * @param {Function} progressCheck A method which will be
-	 * called frequently to get the current progress on a range
-	 * of 0-1
-	 */
-	function Playback( container, progressCheck ) {
-
-		// Cosmetics
-		this.diameter = 50;
-		this.thickness = 3;
-
-		// Flags if we are currently playing
-		this.playing = false;
-
-		// Current progress on a 0-1 range
-		this.progress = 0;
-
-		// Used to loop the animation smoothly
-		this.progressOffset = 1;
-
-		this.container = container;
-		this.progressCheck = progressCheck;
-
-		this.canvas = document.createElement( 'canvas' );
-		this.canvas.className = 'playback';
-		this.canvas.width = this.diameter;
-		this.canvas.height = this.diameter;
-		this.context = this.canvas.getContext( '2d' );
-
-		this.container.appendChild( this.canvas );
-
-		this.render();
-
-	}
-
-	Playback.prototype.setPlaying = function( value ) {
-
-		var wasPlaying = this.playing;
-
-		this.playing = value;
-
-		// Start repainting if we weren't already
-		if( !wasPlaying && this.playing ) {
-			this.animate();
-		}
-		else {
-			this.render();
-		}
-
-	};
-
-	Playback.prototype.animate = function() {
-
-		var progressBefore = this.progress;
-
-		this.progress = this.progressCheck();
-
-		// When we loop, offset the progress so that it eases
-		// smoothly rather than immediately resetting
-		if( progressBefore > 0.8 && this.progress < 0.2 ) {
-			this.progressOffset = this.progress;
-		}
-
-		this.render();
-
-		if( this.playing ) {
-			features.requestAnimationFrameMethod.call( window, this.animate.bind( this ) );
-		}
-
-	};
-
-	/**
-	 * Renders the current progress and playback state.
-	 */
-	Playback.prototype.render = function() {
-
-		var progress = this.playing ? this.progress : 0,
-			radius = ( this.diameter / 2 ) - this.thickness,
-			x = this.diameter / 2,
-			y = this.diameter / 2,
-			iconSize = 14;
-
-		// Ease towards 1
-		this.progressOffset += ( 1 - this.progressOffset ) * 0.1;
-
-		var endAngle = ( - Math.PI / 2 ) + ( progress * ( Math.PI * 2 ) );
-		var startAngle = ( - Math.PI / 2 ) + ( this.progressOffset * ( Math.PI * 2 ) );
-
-		this.context.save();
-		this.context.clearRect( 0, 0, this.diameter, this.diameter );
-
-		// Solid background color
-		this.context.beginPath();
-		this.context.arc( x, y, radius + 2, 0, Math.PI * 2, false );
-		this.context.fillStyle = 'rgba( 0, 0, 0, 0.4 )';
-		this.context.fill();
-
-		// Draw progress track
-		this.context.beginPath();
-		this.context.arc( x, y, radius, 0, Math.PI * 2, false );
-		this.context.lineWidth = this.thickness;
-		this.context.strokeStyle = '#666';
-		this.context.stroke();
-
-		if( this.playing ) {
-			// Draw progress on top of track
-			this.context.beginPath();
-			this.context.arc( x, y, radius, startAngle, endAngle, false );
-			this.context.lineWidth = this.thickness;
-			this.context.strokeStyle = '#fff';
-			this.context.stroke();
-		}
-
-		this.context.translate( x - ( iconSize / 2 ), y - ( iconSize / 2 ) );
-
-		// Draw play/pause icons
-		if( this.playing ) {
-			this.context.fillStyle = '#fff';
-			this.context.fillRect( 0, 0, iconSize / 2 - 2, iconSize );
-			this.context.fillRect( iconSize / 2 + 2, 0, iconSize / 2 - 2, iconSize );
-		}
-		else {
-			this.context.beginPath();
-			this.context.translate( 2, 0 );
-			this.context.moveTo( 0, 0 );
-			this.context.lineTo( iconSize - 2, iconSize / 2 );
-			this.context.lineTo( 0, iconSize );
-			this.context.fillStyle = '#fff';
-			this.context.fill();
-		}
-
-		this.context.restore();
-
-	};
-
-	Playback.prototype.on = function( type, listener ) {
-		this.canvas.addEventListener( type, listener, false );
-	};
-
-	Playback.prototype.off = function( type, listener ) {
-		this.canvas.removeEventListener( type, listener, false );
-	};
-
-	Playback.prototype.destroy = function() {
-
-		this.playing = false;
-
-		if( this.canvas.parentNode ) {
-			this.container.removeChild( this.canvas );
-		}
-
-	};
-
-
-	// --------------------------------------------------------------------//
-	// ------------------------------- API --------------------------------//
-	// --------------------------------------------------------------------//
-
-
-	return {
-		initialize: initialize,
-		configure: configure,
-		sync: sync,
-
-		// Navigation methods
-		slide: slide,
-		left: navigateLeft,
-		right: navigateRight,
-		up: navigateUp,
-		down: navigateDown,
-		prev: navigatePrev,
-		next: navigateNext,
-
-		// Fragment methods
-		navigateFragment: navigateFragment,
-		prevFragment: previousFragment,
-		nextFragment: nextFragment,
-
-		// Deprecated aliases
-		navigateTo: slide,
-		navigateLeft: navigateLeft,
-		navigateRight: navigateRight,
-		navigateUp: navigateUp,
-		navigateDown: navigateDown,
-		navigatePrev: navigatePrev,
-		navigateNext: navigateNext,
-
-		// Forces an update in slide layout
-		layout: layout,
-
-		// Returns an object with the available routes as booleans (left/right/top/bottom)
-		availableRoutes: availableRoutes,
-
-		// Returns an object with the available fragments as booleans (prev/next)
-		availableFragments: availableFragments,
-
-		// Toggles the overview mode on/off
-		toggleOverview: toggleOverview,
-
-		// Toggles the "black screen" mode on/off
-		togglePause: togglePause,
-
-		// State checks
-		isOverview: isOverview,
-		isPaused: isPaused,
-
-		// Adds or removes all internal event listeners (such as keyboard)
-		addEventListeners: addEventListeners,
-		removeEventListeners: removeEventListeners,
-
-		// Returns the indices of the current, or specified, slide
-		getIndices: getIndices,
-
-		// Returns the slide at the specified index, y is optional
-		getSlide: function( x, y ) {
-			var horizontalSlide = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ];
-			var verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' );
-
-			if( typeof y !== 'undefined' ) {
-				return verticalSlides ? verticalSlides[ y ] : undefined;
-			}
-
-			return horizontalSlide;
-		},
-
-		// Returns the previous slide element, may be null
-		getPreviousSlide: function() {
-			return previousSlide;
-		},
-
-		// Returns the current slide element
-		getCurrentSlide: function() {
-			return currentSlide;
-		},
-
-		// Returns the current scale of the presentation content
-		getScale: function() {
-			return scale;
-		},
-
-		// Returns the current configuration object
-		getConfig: function() {
-			return config;
-		},
-
-		// Helper method, retrieves query string as a key/value hash
-		getQueryHash: function() {
-			var query = {};
-
-			location.search.replace( /[A-Z0-9]+?=([\w\.%-]*)/gi, function(a) {
-				query[ a.split( '=' ).shift() ] = a.split( '=' ).pop();
-			} );
-
-			// Basic deserialization
-			for( var i in query ) {
-				var value = query[ i ];
-
-				query[ i ] = unescape( value );
-
-				if( value === 'null' ) query[ i ] = null;
-				else if( value === 'true' ) query[ i ] = true;
-				else if( value === 'false' ) query[ i ] = false;
-				else if( value.match( /^\d+$/ ) ) query[ i ] = parseFloat( value );
-			}
-
-			return query;
-		},
-
-		// Returns true if we're currently on the first slide
-		isFirstSlide: function() {
-			return document.querySelector( SLIDES_SELECTOR + '.past' ) == null ? true : false;
-		},
-
-		// Returns true if we're currently on the last slide
-		isLastSlide: function() {
-			if( currentSlide ) {
-				// Does this slide has next a sibling?
-				if( currentSlide.nextElementSibling ) return false;
-
-				// If it's vertical, does its parent have a next sibling?
-				if( isVerticalSlide( currentSlide ) && currentSlide.parentNode.nextElementSibling ) return false;
-
-				return true;
-			}
-
-			return false;
-		},
-
-		// Checks if reveal.js has been loaded and is ready for use
-		isReady: function() {
-			return loaded;
-		},
-
-		// Forward event binding to the reveal DOM element
-		addEventListener: function( type, listener, useCapture ) {
-			if( 'addEventListener' in window ) {
-				( dom.wrapper || document.querySelector( '.reveal' ) ).addEventListener( type, listener, useCapture );
-			}
-		},
-		removeEventListener: function( type, listener, useCapture ) {
-			if( 'addEventListener' in window ) {
-				( dom.wrapper || document.querySelector( '.reveal' ) ).removeEventListener( type, listener, useCapture );
-			}
-		}
-	};
-
-})();
diff --git a/docs/slides/BOS14/_support/reveal.js/js/reveal.min.js b/docs/slides/BOS14/_support/reveal.js/js/reveal.min.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/js/reveal.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * reveal.js 2.6.1 (2014-03-13, 09:22)
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
- */
-var Reveal=function(){"use strict";function a(a){if(b(),!ec.transforms2d&&!ec.transforms3d)return document.body.setAttribute("class","no-transforms"),void 0;window.addEventListener("load",A,!1);var d=Reveal.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,k(_b,a),k(_b,d),r(),c()}function b(){ec.transforms3d="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,ec.transforms2d="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,ec.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,ec.requestAnimationFrame="function"==typeof ec.requestAnimationFrameMethod,ec.canvas=!!document.createElement("canvas").getContext,Vb=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function c(){function a(){e.length&&head.js.apply(null,e),d()}function b(b){head.ready(b.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],function(){"function"==typeof b.callback&&b.callback.apply(this),0===--f&&a()})}for(var c=[],e=[],f=0,g=0,h=_b.dependencies.length;h>g;g++){var i=_b.dependencies[g];(!i.condition||i.condition())&&(i.async?e.push(i.src):c.push(i.src),b(i))}c.length?(f=c.length,head.js.apply(null,c)):a()}function d(){e(),Q(),h(),cb(),X(!0),setTimeout(function(){dc.slides.classList.remove("no-transition"),ac=!0,t("ready",{indexh:Qb,indexv:Rb,currentSlide:Tb})},1)}function e(){dc.theme=document.querySelector("#theme"),dc.wrapper=document.querySelector(".reveal"),dc.slides=document.querySelector(".reveal .slides"),dc.slides.classList.add("no-transition"),dc.background=f(dc.wrapper,"div","backgrounds",null),dc.progress=f(dc.wrapper,"div","progress","<span></span>"),dc.progressbar=dc.progress.querySelector("span"),f(dc.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),dc.slideNumber=f(dc.wrapper,"div","slide-number",""),f(dc.wrapper,"div","state-background",null),f(dc.wrapper,"div","pause-overlay",null),dc.controls=document.querySelector(".reveal .controls"),dc.controlsLeft=l(document.querySelectorAll(".navigate-left")),dc.controlsRight=l(document.querySelectorAll(".navigate-right")),dc.controlsUp=l(document.querySelectorAll(".navigate-up")),dc.controlsDown=l(document.querySelectorAll(".navigate-down")),dc.controlsPrev=l(document.querySelectorAll(".navigate-prev")),dc.controlsNext=l(document.querySelectorAll(".navigate-next"))}function f(a,b,c,d){var e=a.querySelector("."+c);return e||(e=document.createElement(b),e.classList.add(c),null!==d&&(e.innerHTML=d),a.appendChild(e)),e}function g(){function a(a,b){var c={background:a.getAttribute("data-background"),backgroundSize:a.getAttribute("data-background-size"),backgroundImage:a.getAttribute("data-background-image"),backgroundColor:a.getAttribute("data-background-color"),backgroundRepeat:a.getAttribute("data-background-repeat"),backgroundPosition:a.getAttribute("data-background-position"),backgroundTransition:a.getAttribute("data-background-transition")},d=document.createElement("div");return d.className="slide-background",c.background&&(/^(http|file|\/\/)/gi.test(c.background)||/\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test(c.background)?d.style.backgroundImage="url("+c.background+")":d.style.background=c.background),(c.background||c.backgroundColor||c.backgroundImage)&&d.setAttribute("data-background-hash",c.background+c.backgroundSize+c.backgroundImage+c.backgroundColor+c.backgroundRepeat+c.backgroundPosition+c.backgroundTransition),c.backgroundSize&&(d.style.backgroundSize=c.backgroundSize),c.backgroundImage&&(d.style.backgroundImage='url("'+c.backgroundImage+'")'),c.backgroundColor&&(d.style.backgroundColor=c.backgroundColor),c.backgroundRepeat&&(d.style.backgroundRepeat=c.backgroundRepeat),c.backgroundPosition&&(d.style.backgroundPosition=c.backgroundPosition),c.backgroundTransition&&d.setAttribute("data-background-transition",c.backgroundTransition),b.appendChild(d),d}q()&&document.body.classList.add("print-pdf"),dc.background.innerHTML="",dc.background.classList.add("no-transition"),l(document.querySelectorAll(Yb)).forEach(function(b){var c;c=q()?a(b,b):a(b,dc.background),l(b.querySelectorAll("section")).forEach(function(b){q()?a(b,b):a(b,c)})}),_b.parallaxBackgroundImage?(dc.background.style.backgroundImage='url("'+_b.parallaxBackgroundImage+'")',dc.background.style.backgroundSize=_b.parallaxBackgroundSize,setTimeout(function(){dc.wrapper.classList.add("has-parallax-background")},1)):(dc.background.style.backgroundImage="",dc.wrapper.classList.remove("has-parallax-background"))}function h(a){var b=document.querySelectorAll(Xb).length;if(dc.wrapper.classList.remove(_b.transition),"object"==typeof a&&k(_b,a),ec.transforms3d===!1&&(_b.transition="linear"),dc.wrapper.classList.add(_b.transition),dc.wrapper.setAttribute("data-transition-speed",_b.transitionSpeed),dc.wrapper.setAttribute("data-background-transition",_b.backgroundTransition),dc.controls.style.display=_b.controls?"block":"none",dc.progress.style.display=_b.progress?"block":"none",_b.rtl?dc.wrapper.classList.add("rtl"):dc.wrapper.classList.remove("rtl"),_b.center?dc.wrapper.classList.add("center"):dc.wrapper.classList.remove("center"),_b.mouseWheel?(document.addEventListener("DOMMouseScroll",Bb,!1),document.addEventListener("mousewheel",Bb,!1)):(document.removeEventListener("DOMMouseScroll",Bb,!1),document.removeEventListener("mousewheel",Bb,!1)),_b.rollingLinks?u():v(),_b.previewLinks?w():(x(),w("[data-preview-link]")),b>1&&_b.autoSlide&&_b.autoSlideStoppable&&ec.canvas&&ec.requestAnimationFrame?(Wb=new Pb(dc.wrapper,function(){return Math.min(Math.max((Date.now()-mc)/kc,0),1)}),Wb.on("click",Ob),nc=!1):Wb&&(Wb.destroy(),Wb=null),_b.theme&&dc.theme){var c=dc.theme.getAttribute("href"),d=/[^\/]*?(?=\.css)/,e=c.match(d)[0];_b.theme!==e&&(c=c.replace(d,_b.theme),dc.theme.setAttribute("href",c))}P()}function i(){if(jc=!0,window.addEventListener("hashchange",Jb,!1),window.addEventListener("resize",Kb,!1),_b.touch&&(dc.wrapper.addEventListener("touchstart",vb,!1),dc.wrapper.addEventListener("touchmove",wb,!1),dc.wrapper.addEventListener("touchend",xb,!1),window.navigator.msPointerEnabled&&(dc.wrapper.addEventListener("MSPointerDown",yb,!1),dc.wrapper.addEventListener("MSPointerMove",zb,!1),dc.wrapper.addEventListener("MSPointerUp",Ab,!1))),_b.keyboard&&document.addEventListener("keydown",ub,!1),_b.progress&&dc.progress&&dc.progress.addEventListener("click",Cb,!1),_b.focusBodyOnPageVisiblityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,Lb,!1)}["touchstart","click"].forEach(function(a){dc.controlsLeft.forEach(function(b){b.addEventListener(a,Db,!1)}),dc.controlsRight.forEach(function(b){b.addEventListener(a,Eb,!1)}),dc.controlsUp.forEach(function(b){b.addEventListener(a,Fb,!1)}),dc.controlsDown.forEach(function(b){b.addEventListener(a,Gb,!1)}),dc.controlsPrev.forEach(function(b){b.addEventListener(a,Hb,!1)}),dc.controlsNext.forEach(function(b){b.addEventListener(a,Ib,!1)})})}function j(){jc=!1,document.removeEventListener("keydown",ub,!1),window.removeEventListener("hashchange",Jb,!1),window.removeEventListener("resize",Kb,!1),dc.wrapper.removeEventListener("touchstart",vb,!1),dc.wrapper.removeEventListener("touchmove",wb,!1),dc.wrapper.removeEventListener("touchend",xb,!1),window.navigator.msPointerEnabled&&(dc.wrapper.removeEventListener("MSPointerDown",yb,!1),dc.wrapper.removeEventListener("MSPointerMove",zb,!1),dc.wrapper.removeEventListener("MSPointerUp",Ab,!1)),_b.progress&&dc.progress&&dc.progress.removeEventListener("click",Cb,!1),["touchstart","click"].forEach(function(a){dc.controlsLeft.forEach(function(b){b.removeEventListener(a,Db,!1)}),dc.controlsRight.forEach(function(b){b.removeEventListener(a,Eb,!1)}),dc.controlsUp.forEach(function(b){b.removeEventListener(a,Fb,!1)}),dc.controlsDown.forEach(function(b){b.removeEventListener(a,Gb,!1)}),dc.controlsPrev.forEach(function(b){b.removeEventListener(a,Hb,!1)}),dc.controlsNext.forEach(function(b){b.removeEventListener(a,Ib,!1)})})}function k(a,b){for(var c in b)a[c]=b[c]}function l(a){return Array.prototype.slice.call(a)}function m(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function n(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function o(a){var b=0;if(a){var c=0;l(a.childNodes).forEach(function(a){"number"==typeof a.offsetTop&&a.style&&("absolute"===a.style.position&&(c+=1),b=Math.max(b,a.offsetTop+a.offsetHeight))}),0===c&&(b=a.offsetHeight)}return b}function p(a,b){if(b=b||0,a){var c=a.parentNode,d=c.childNodes;l(d).forEach(function(c){if("number"==typeof c.offsetHeight&&c!==a){var d=window.getComputedStyle(c),e=parseInt(d.marginTop,10),f=parseInt(d.marginBottom,10);b-=c.offsetHeight+e+f}});var e=window.getComputedStyle(a);b-=parseInt(e.marginTop,10)+parseInt(e.marginBottom,10)}return b}function q(){return/print-pdf/gi.test(window.location.search)}function r(){_b.hideAddressBar&&Vb&&(window.addEventListener("load",s,!1),window.addEventListener("orientationchange",s,!1))}function s(){setTimeout(function(){window.scrollTo(0,1)},10)}function t(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),k(c,b),dc.wrapper.dispatchEvent(c)}function u(){if(ec.transforms3d&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(Xb+" a:not(.image)"),b=0,c=a.length;c>b;b++){var d=a[b];if(!(!d.textContent||d.querySelector("*")||d.className&&d.classList.contains(d,"roll"))){var e=document.createElement("span");e.setAttribute("data-title",d.text),e.innerHTML=d.innerHTML,d.classList.add("roll"),d.innerHTML="",d.appendChild(e)}}}function v(){for(var a=document.querySelectorAll(Xb+" a.roll"),b=0,c=a.length;c>b;b++){var d=a[b],e=d.querySelector("span");e&&(d.classList.remove("roll"),d.innerHTML=e.innerHTML)}}function w(a){var b=l(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Nb,!1)})}function x(){var a=l(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Nb,!1)})}function y(a){z(),dc.preview=document.createElement("div"),dc.preview.classList.add("preview-link-overlay"),dc.wrapper.appendChild(dc.preview),dc.preview.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>','<a class="external" href="'+a+'" target="_blank"><span class="icon"></span></a>',"</header>",'<div class="spinner"></div>','<div class="viewport">','<iframe src="'+a+'"></iframe>',"</div>"].join(""),dc.preview.querySelector("iframe").addEventListener("load",function(){dc.preview.classList.add("loaded")},!1),dc.preview.querySelector(".close").addEventListener("click",function(a){z(),a.preventDefault()},!1),dc.preview.querySelector(".external").addEventListener("click",function(){z()},!1),setTimeout(function(){dc.preview.classList.add("visible")},1)}function z(){dc.preview&&(dc.preview.setAttribute("src",""),dc.preview.parentNode.removeChild(dc.preview),dc.preview=null)}function A(){if(dc.wrapper&&!q()){var a=dc.wrapper.offsetWidth,b=dc.wrapper.offsetHeight;a-=b*_b.margin,b-=b*_b.margin;var c=_b.width,d=_b.height,e=20;B(_b.width,_b.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),dc.slides.style.width=c+"px",dc.slides.style.height=d+"px",cc=Math.min(a/c,b/d),cc=Math.max(cc,_b.minScale),cc=Math.min(cc,_b.maxScale),"undefined"==typeof dc.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?n(dc.slides,"translate(-50%, -50%) scale("+cc+") translate(50%, 50%)"):dc.slides.style.zoom=cc;for(var f=l(document.querySelectorAll(Xb)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=_b.center||i.classList.contains("center")?i.classList.contains("stack")?0:Math.max(-(o(i)/2)-e,-d/2)+"px":"")}U(),Y()}}function B(a,b,c){l(dc.slides.querySelectorAll("section > .stretch")).forEach(function(d){var e=p(d,b-2*c);if(/(img|video)/gi.test(d.nodeName)){var f=d.naturalWidth||d.videoWidth,g=d.naturalHeight||d.videoHeight,h=Math.min(a/f,e/g);d.style.width=f*h+"px",d.style.height=g*h+"px"}else d.style.width=a+"px",d.style.height=e+"px"})}function C(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function D(a){if("object"==typeof a&&"function"==typeof a.setAttribute&&a.classList.contains("stack")){var b=a.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(a.getAttribute(b)||0,10)}return 0}function E(){if(_b.overview){kb();var a=dc.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;dc.wrapper.classList.add("overview"),dc.wrapper.classList.remove("overview-deactivating"),clearTimeout(hc),clearTimeout(ic),hc=setTimeout(function(){for(var c=document.querySelectorAll(Yb),d=0,e=c.length;e>d;d++){var f=c[d],g=_b.rtl?-105:105;if(f.setAttribute("data-index-h",d),n(f,"translateZ(-"+b+"px) translate("+(d-Qb)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Qb?Rb:D(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),n(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Mb,!0)}else f.addEventListener("click",Mb,!0)}T(),A(),a||t("overviewshown",{indexh:Qb,indexv:Rb,currentSlide:Tb})},10)}}function F(){_b.overview&&(clearTimeout(hc),clearTimeout(ic),dc.wrapper.classList.remove("overview"),dc.wrapper.classList.add("overview-deactivating"),ic=setTimeout(function(){dc.wrapper.classList.remove("overview-deactivating")},1),l(document.querySelectorAll(Xb)).forEach(function(a){n(a,""),a.removeEventListener("click",Mb,!0)}),O(Qb,Rb),jb(),t("overviewhidden",{indexh:Qb,indexv:Rb,currentSlide:Tb}))}function G(a){"boolean"==typeof a?a?E():F():H()?F():E()}function H(){return dc.wrapper.classList.contains("overview")}function I(a){return a=a?a:Tb,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function J(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function K(){var a=dc.wrapper.classList.contains("paused");kb(),dc.wrapper.classList.add("paused"),a===!1&&t("paused")}function L(){var a=dc.wrapper.classList.contains("paused");dc.wrapper.classList.remove("paused"),jb(),a&&t("resumed")}function M(){N()?L():K()}function N(){return dc.wrapper.classList.contains("paused")}function O(a,b,c,d){Sb=Tb;var e=document.querySelectorAll(Yb);void 0===b&&(b=D(e[a])),Sb&&Sb.parentNode&&Sb.parentNode.classList.contains("stack")&&C(Sb.parentNode,Rb);var f=bc.concat();bc.length=0;var g=Qb||0,h=Rb||0;Qb=S(Yb,void 0===a?Qb:a),Rb=S(Zb,void 0===b?Rb:b),T(),A();a:for(var i=0,j=bc.length;j>i;i++){for(var k=0;k<f.length;k++)if(f[k]===bc[i]){f.splice(k,1);continue a}document.documentElement.classList.add(bc[i]),t(bc[i])}for(;f.length;)document.documentElement.classList.remove(f.pop());H()&&E();var m=e[Qb],n=m.querySelectorAll("section");Tb=n[Rb]||m,"undefined"!=typeof c&&gb(c);var o=Qb!==g||Rb!==h;o?t("slidechanged",{indexh:Qb,indexv:Rb,previousSlide:Sb,currentSlide:Tb,origin:d}):Sb=null,Sb&&(Sb.classList.remove("present"),document.querySelector($b).classList.contains("present")&&setTimeout(function(){var a,b=l(document.querySelectorAll(Yb+".stack"));for(a in b)b[a]&&C(b[a],0)},0)),o&&(ab(Sb),_(Tb)),W(),U(),X(),Y(),V(),db(),jb()}function P(){j(),i(),A(),kc=_b.autoSlide,jb(),g(),R(),W(),U(),X(!0),V()}function Q(){var a=l(document.querySelectorAll(Yb));a.forEach(function(a){var b=l(a.querySelectorAll("section"));b.forEach(function(a,b){b>0&&(a.classList.remove("present"),a.classList.remove("past"),a.classList.add("future"))})})}function R(){var a=l(document.querySelectorAll(Yb));a.forEach(function(a){var b=l(a.querySelectorAll("section"));b.forEach(function(a){fb(a.querySelectorAll(".fragment"))}),0===b.length&&fb(a.querySelectorAll(".fragment"))})}function S(a,b){var c=l(document.querySelectorAll(a)),d=c.length;if(d){_b.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var e=0;d>e;e++){var f=c[e],g=_b.rtl&&!I(f);if(f.classList.remove("past"),f.classList.remove("present"),f.classList.remove("future"),f.setAttribute("hidden",""),b>e){f.classList.add(g?"future":"past");for(var h=l(f.querySelectorAll(".fragment"));h.length;){var i=h.pop();i.classList.add("visible"),i.classList.remove("current-fragment")}}else if(e>b){f.classList.add(g?"past":"future");for(var j=l(f.querySelectorAll(".fragment.visible"));j.length;){var k=j.pop();k.classList.remove("visible"),k.classList.remove("current-fragment")}}f.querySelector("section")&&f.classList.add("stack")}c[b].classList.add("present"),c[b].removeAttribute("hidden");var m=c[b].getAttribute("data-state");m&&(bc=bc.concat(m.split(" ")))}else b=0;return b}function T(){var a,b,c=l(document.querySelectorAll(Yb)),d=c.length;if(d){var e=H()?10:_b.viewDistance;Vb&&(e=H()?6:1);for(var f=0;d>f;f++){var g=c[f],h=l(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Qb-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=D(g),k=0;i>k;k++){var m=h[k];b=f===Qb?Math.abs(Rb-k):Math.abs(k-j),m.style.display=a+b>e?"none":"block"}}}}function U(){if(_b.progress&&dc.progress){var a=l(document.querySelectorAll(Yb)),b=document.querySelectorAll(Xb+":not(.stack)").length,c=0;a:for(var d=0;d<a.length;d++){for(var e=a[d],f=l(e.querySelectorAll("section")),g=0;g<f.length;g++){if(f[g].classList.contains("present"))break a;c++}if(e.classList.contains("present"))break;e.classList.contains("stack")===!1&&c++}dc.progressbar.style.width=c/(b-1)*window.innerWidth+"px"}}function V(){if(_b.slideNumber&&dc.slideNumber){var a=Qb;Rb>0&&(a+=" - "+Rb),dc.slideNumber.innerHTML=a}}function W(){var a=Z(),b=$();dc.controlsLeft.concat(dc.controlsRight).concat(dc.controlsUp).concat(dc.controlsDown).concat(dc.controlsPrev).concat(dc.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&dc.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&dc.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&dc.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&dc.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&dc.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&dc.controlsNext.forEach(function(a){a.classList.add("enabled")}),Tb&&(b.prev&&dc.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),I(Tb)?(b.prev&&dc.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&dc.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function X(a){var b=null,c=_b.rtl?"future":"past",d=_b.rtl?"past":"future";if(l(dc.background.childNodes).forEach(function(e,f){Qb>f?e.className="slide-background "+c:f>Qb?e.className="slide-background "+d:(e.className="slide-background present",b=e),(a||f===Qb)&&l(e.childNodes).forEach(function(a,c){Rb>c?a.className="slide-background past":c>Rb?a.className="slide-background future":(a.className="slide-background present",f===Qb&&(b=a))})}),b){var e=Ub?Ub.getAttribute("data-background-hash"):null,f=b.getAttribute("data-background-hash");f&&f===e&&b!==Ub&&dc.background.classList.add("no-transition"),Ub=b}setTimeout(function(){dc.background.classList.remove("no-transition")},1)}function Y(){if(_b.parallaxBackgroundImage){var a,b,c=document.querySelectorAll(Yb),d=document.querySelectorAll(Zb),e=dc.background.style.backgroundSize.split(" ");1===e.length?a=b=parseInt(e[0],10):(a=parseInt(e[0],10),b=parseInt(e[1],10));var f=dc.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*Qb,i=dc.background.offsetHeight,j=d.length,k=j>0?-(b-i)/(j-1)*Rb:0;dc.background.style.backgroundPosition=h+"px "+k+"px"}}function Z(){var a=document.querySelectorAll(Yb),b=document.querySelectorAll(Zb),c={left:Qb>0||_b.loop,right:Qb<a.length-1||_b.loop,up:Rb>0,down:Rb<b.length-1};if(_b.rtl){var d=c.left;c.left=c.right,c.right=d}return c}function $(){if(Tb&&_b.fragments){var a=Tb.querySelectorAll(".fragment"),b=Tb.querySelectorAll(".fragment:not(.visible)");return{prev:a.length-b.length>0,next:!!b.length}}return{prev:!1,next:!1}}function _(a){a&&!bb()&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function ab(a){a&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function bb(){return!!window.location.search.match(/receiver/gi)}function cb(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d=document.querySelector("#"+c);if(d){var e=Reveal.getIndices(d);O(e.h,e.v)}else O(Qb||0,Rb||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==Qb||g!==Rb)&&O(f,g)}}function db(a){if(_b.history)if(clearTimeout(gc),"number"==typeof a)gc=setTimeout(db,a);else{var b="/";Tb&&"string"==typeof Tb.getAttribute("id")?b="/"+Tb.getAttribute("id"):((Qb>0||Rb>0)&&(b+=Qb),Rb>0&&(b+="/"+Rb)),window.location.hash=b}}function eb(a){var b,c=Qb,d=Rb;if(a){var e=I(a),f=e?a.parentNode:a,g=l(document.querySelectorAll(Yb));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(l(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&Tb){var h=Tb.querySelectorAll(".fragment").length>0;if(h){var i=Tb.querySelectorAll(".fragment.visible");b=i.length-1}}return{h:c,v:d,f:b}}function fb(a){a=l(a);var b=[],c=[],d=[];a.forEach(function(a){if(a.hasAttribute("data-fragment-index")){var d=parseInt(a.getAttribute("data-fragment-index"),10);b[d]||(b[d]=[]),b[d].push(a)}else c.push([a])}),b=b.concat(c);var e=0;return b.forEach(function(a){a.forEach(function(a){d.push(a),a.setAttribute("data-fragment-index",e)}),e++}),d}function gb(a,b){if(Tb&&_b.fragments){var c=fb(Tb.querySelectorAll(".fragment"));if(c.length){if("number"!=typeof a){var d=fb(Tb.querySelectorAll(".fragment.visible")).pop();a=d?parseInt(d.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof b&&(a+=b);var e=[],f=[];return l(c).forEach(function(b,c){b.hasAttribute("data-fragment-index")&&(c=parseInt(b.getAttribute("data-fragment-index"),10)),a>=c?(b.classList.contains("visible")||e.push(b),b.classList.add("visible"),b.classList.remove("current-fragment"),c===a&&b.classList.add("current-fragment")):(b.classList.contains("visible")&&f.push(b),b.classList.remove("visible"),b.classList.remove("current-fragment"))}),f.length&&t("fragmenthidden",{fragment:f[0],fragments:f}),e.length&&t("fragmentshown",{fragment:e[0],fragments:e}),W(),!(!e.length&&!f.length)}}return!1}function hb(){return gb(null,1)}function ib(){return gb(null,-1)}function jb(){if(kb(),Tb){var a=Tb.parentNode?Tb.parentNode.getAttribute("data-autoslide"):null,b=Tb.getAttribute("data-autoslide");kc=b?parseInt(b,10):a?parseInt(a,10):_b.autoSlide,l(Tb.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&kc&&1e3*a.duration>kc&&(kc=1e3*a.duration+1e3)}),!kc||nc||N()||H()||Reveal.isLastSlide()&&_b.loop!==!0||(lc=setTimeout(sb,kc),mc=Date.now()),Wb&&Wb.setPlaying(-1!==lc)}}function kb(){clearTimeout(lc),lc=-1}function lb(){nc=!0,clearTimeout(lc),Wb&&Wb.setPlaying(!1)}function mb(){nc=!1,jb()}function nb(){_b.rtl?(H()||hb()===!1)&&Z().left&&O(Qb+1):(H()||ib()===!1)&&Z().left&&O(Qb-1)}function ob(){_b.rtl?(H()||ib()===!1)&&Z().right&&O(Qb-1):(H()||hb()===!1)&&Z().right&&O(Qb+1)}function pb(){(H()||ib()===!1)&&Z().up&&O(Qb,Rb-1)}function qb(){(H()||hb()===!1)&&Z().down&&O(Qb,Rb+1)}function rb(){if(ib()===!1)if(Z().up)pb();else{var a=document.querySelector(Yb+".past:nth-child("+Qb+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Qb-1;O(c,b)}}}function sb(){hb()===!1&&(Z().down?qb():ob()),jb()}function tb(){_b.autoSlideStoppable&&lb()}function ub(a){tb(a),document.activeElement;var b=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(b||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(N()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var c=!1;if("object"==typeof _b.keyboard)for(var d in _b.keyboard)if(parseInt(d,10)===a.keyCode){var e=_b.keyboard[d];"function"==typeof e?e.apply(null,[a]):"string"==typeof e&&"function"==typeof Reveal[e]&&Reveal[e].call(),c=!0}if(c===!1)switch(c=!0,a.keyCode){case 80:case 33:rb();break;case 78:case 34:sb();break;case 72:case 37:nb();break;case 76:case 39:ob();break;case 75:case 38:pb();break;case 74:case 40:qb();break;case 36:O(0);break;case 35:O(Number.MAX_VALUE);break;case 32:H()?F():a.shiftKey?rb():sb();break;case 13:H()?F():c=!1;break;case 66:case 190:case 191:M();break;case 70:J();break;default:c=!1}c?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!ec.transforms3d||(dc.preview?z():G(),a.preventDefault()),jb()}}function vb(a){oc.startX=a.touches[0].clientX,oc.startY=a.touches[0].clientY,oc.startCount=a.touches.length,2===a.touches.length&&_b.overview&&(oc.startSpan=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:oc.startX,y:oc.startY}))}function wb(a){if(oc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{tb(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===oc.startCount&&_b.overview){var d=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:oc.startX,y:oc.startY});Math.abs(oc.startSpan-d)>oc.threshold&&(oc.captured=!0,d<oc.startSpan?E():F()),a.preventDefault()}else if(1===a.touches.length&&2!==oc.startCount){var e=b-oc.startX,f=c-oc.startY;e>oc.threshold&&Math.abs(e)>Math.abs(f)?(oc.captured=!0,nb()):e<-oc.threshold&&Math.abs(e)>Math.abs(f)?(oc.captured=!0,ob()):f>oc.threshold?(oc.captured=!0,pb()):f<-oc.threshold&&(oc.captured=!0,qb()),_b.embedded?(oc.captured||I(Tb))&&a.preventDefault():a.preventDefault()}}}function xb(){oc.captured=!1}function yb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],vb(a))}function zb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],wb(a))}function Ab(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],xb(a))}function Bb(a){if(Date.now()-fc>600){fc=Date.now();var b=a.detail||-a.wheelDelta;b>0?sb():rb()}}function Cb(a){tb(a),a.preventDefault();var b=l(document.querySelectorAll(Yb)).length,c=Math.floor(a.clientX/dc.wrapper.offsetWidth*b);O(c)}function Db(a){a.preventDefault(),tb(),nb()}function Eb(a){a.preventDefault(),tb(),ob()}function Fb(a){a.preventDefault(),tb(),pb()}function Gb(a){a.preventDefault(),tb(),qb()}function Hb(a){a.preventDefault(),tb(),rb()}function Ib(a){a.preventDefault(),tb(),sb()}function Jb(){cb()}function Kb(){A()}function Lb(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function Mb(a){if(jc&&H()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(F(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);O(c,d)}}}function Nb(a){var b=a.target.getAttribute("href");b&&(y(b),a.preventDefault())}function Ob(){Reveal.isLastSlide()&&_b.loop===!1?(O(0,0),mb()):nc?mb():lb()}function Pb(a,b){this.diameter=50,this.thickness=3,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=a,this.progressCheck=b,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}var Qb,Rb,Sb,Tb,Ub,Vb,Wb,Xb=".reveal .slides section",Yb=".reveal .slides>section",Zb=".reveal .slides>section.present>section",$b=".reveal .slides>section:first-of-type",_b={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,autoSlide:0,autoSlideStoppable:!0,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,focusBodyOnPageVisiblityChange:!0,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",parallaxBackgroundImage:"",parallaxBackgroundSize:"",viewDistance:3,dependencies:[]},ac=!1,bc=[],cc=1,dc={},ec={},fc=0,gc=0,hc=0,ic=0,jc=!1,kc=0,lc=0,mc=-1,nc=!1,oc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return Pb.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},Pb.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&ec.requestAnimationFrameMethod.call(window,this.animate.bind(this))},Pb.prototype.render=function(){var a=this.playing?this.progress:0,b=this.diameter/2-this.thickness,c=this.diameter/2,d=this.diameter/2,e=14;this.progressOffset+=.1*(1-this.progressOffset);var f=-Math.PI/2+a*2*Math.PI,g=-Math.PI/2+this.progressOffset*2*Math.PI;this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(c,d,b+2,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(c,d,b,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(c,d,b,g,f,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(c-e/2,d-e/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,e/2-2,e),this.context.fillRect(e/2+2,0,e/2-2,e)):(this.context.beginPath(),this.context.translate(2,0),this.context.moveTo(0,0),this.context.lineTo(e-2,e/2),this.context.lineTo(0,e),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()},Pb.prototype.on=function(a,b){this.canvas.addEventListener(a,b,!1)},Pb.prototype.off=function(a,b){this.canvas.removeEventListener(a,b,!1)},Pb.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},{initialize:a,configure:h,sync:P,slide:O,left:nb,right:ob,up:pb,down:qb,prev:rb,next:sb,navigateFragment:gb,prevFragment:ib,nextFragment:hb,navigateTo:O,navigateLeft:nb,navigateRight:ob,navigateUp:pb,navigateDown:qb,navigatePrev:rb,navigateNext:sb,layout:A,availableRoutes:Z,availableFragments:$,toggleOverview:G,togglePause:M,isOverview:H,isPaused:N,addEventListeners:i,removeEventListeners:j,getIndices:eb,getSlide:function(a,b){var c=document.querySelectorAll(Yb)[a],d=c&&c.querySelectorAll("section");
-return"undefined"!=typeof b?d?d[b]:void 0:c},getPreviousSlide:function(){return Sb},getCurrentSlide:function(){return Tb},getScale:function(){return cc},getConfig:function(){return _b},getQueryHash:function(){var a={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()});for(var b in a){var c=a[b];a[b]=unescape(c),"null"===c?a[b]=null:"true"===c?a[b]=!0:"false"===c?a[b]=!1:c.match(/^\d+$/)&&(a[b]=parseFloat(c))}return a},isFirstSlide:function(){return null==document.querySelector(Xb+".past")?!0:!1},isLastSlide:function(){return Tb?Tb.nextElementSibling?!1:I(Tb)&&Tb.parentNode.nextElementSibling?!1:!0:!1},isReady:function(){return ac},addEventListener:function(a,b,c){"addEventListener"in window&&(dc.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(dc.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}();
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/css/zenburn.css b/docs/slides/BOS14/_support/reveal.js/lib/css/zenburn.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/lib/css/zenburn.css
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-
-Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
-based on dark.css by Ivan Sagalaev
-
-*/
-
-pre code {
-  display: block; padding: 0.5em;
-  background: #3F3F3F;
-  color: #DCDCDC;
-}
-
-pre .keyword,
-pre .tag,
-pre .css .class,
-pre .css .id,
-pre .lisp .title,
-pre .nginx .title,
-pre .request,
-pre .status,
-pre .clojure .attribute {
-  color: #E3CEAB;
-}
-
-pre .django .template_tag,
-pre .django .variable,
-pre .django .filter .argument {
-  color: #DCDCDC;
-}
-
-pre .number,
-pre .date {
-  color: #8CD0D3;
-}
-
-pre .dos .envvar,
-pre .dos .stream,
-pre .variable,
-pre .apache .sqbracket {
-  color: #EFDCBC;
-}
-
-pre .dos .flow,
-pre .diff .change,
-pre .python .exception,
-pre .python .built_in,
-pre .literal,
-pre .tex .special {
-  color: #EFEFAF;
-}
-
-pre .diff .chunk,
-pre .subst {
-  color: #8F8F8F;
-}
-
-pre .dos .keyword,
-pre .python .decorator,
-pre .title,
-pre .haskell .type,
-pre .diff .header,
-pre .ruby .class .parent,
-pre .apache .tag,
-pre .nginx .built_in,
-pre .tex .command,
-pre .prompt {
-    color: #efef8f;
-}
-
-pre .dos .winutils,
-pre .ruby .symbol,
-pre .ruby .symbol .string,
-pre .ruby .string {
-  color: #DCA3A3;
-}
-
-pre .diff .deletion,
-pre .string,
-pre .tag .value,
-pre .preprocessor,
-pre .built_in,
-pre .sql .aggregate,
-pre .javadoc,
-pre .smalltalk .class,
-pre .smalltalk .localvars,
-pre .smalltalk .array,
-pre .css .rules .value,
-pre .attr_selector,
-pre .pseudo,
-pre .apache .cbracket,
-pre .tex .formula {
-  color: #CC9393;
-}
-
-pre .shebang,
-pre .diff .addition,
-pre .comment,
-pre .java .annotation,
-pre .template_comment,
-pre .pi,
-pre .doctype {
-  color: #7F9F7F;
-}
-
-pre .coffeescript .javascript,
-pre .javascript .xml,
-pre .tex .formula,
-pre .xml .javascript,
-pre .xml .vbscript,
-pre .xml .css,
-pre .xml .cdata {
-  opacity: 0.5;
-}
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.eot b/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.eot
deleted file mode 100644
Binary files a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.eot and /dev/null differ
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.svg b/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.svg
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.svg
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="LeagueGothicRegular" horiz-adv-x="724" >
-<font-face units-per-em="2048" ascent="1505" descent="-543" />
-<missing-glyph horiz-adv-x="315" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="2048" />
-<glyph unicode="&#xd;" horiz-adv-x="682" />
-<glyph unicode=" "  horiz-adv-x="315" />
-<glyph unicode="&#x09;" horiz-adv-x="315" />
-<glyph unicode="&#xa0;" horiz-adv-x="315" />
-<glyph unicode="!" horiz-adv-x="387" d="M74 1505h239l-55 -1099h-129zM86 0v227h215v-227h-215z" />
-<glyph unicode="&#x22;" horiz-adv-x="329" d="M57 1505h215l-30 -551h-154z" />
-<glyph unicode="#" horiz-adv-x="1232" d="M49 438l27 195h198l37 258h-196l26 194h197l57 420h197l-57 -420h260l57 420h197l-58 -420h193l-27 -194h-192l-37 -258h190l-26 -195h-191l-59 -438h-197l60 438h-261l-59 -438h-197l60 438h-199zM471 633h260l37 258h-260z" />
-<glyph unicode="$" horiz-adv-x="692" d="M37 358l192 13q12 -186 129 -187q88 0 93 185q0 74 -61 175q-21 36 -34 53l-40 55q-28 38 -65.5 90t-70.5 101.5t-70.5 141.5t-37.5 170q4 293 215 342v131h123v-125q201 -23 235 -282l-192 -25q-14 129 -93 125q-80 -2 -84 -162q0 -102 94 -227l41 -59q30 -42 37 -52 t33 -48l37 -52q41 -57 68 -109l26 -55q43 -94 43 -186q-4 -338 -245 -369v-217h-123v221q-236 41 -250 352z" />
-<glyph unicode="%" horiz-adv-x="1001" d="M55 911v437q0 110 82 156q33 18 90.5 18t97.5 -44t44 -87l4 -43v-437q0 -107 -81 -157q-32 -19 -77 -19q-129 0 -156 135zM158 0l553 1505h131l-547 -1505h-137zM178 911q-4 -55 37 -55q16 0 25.5 14.5t9.5 26.5v451q2 55 -35 55q-18 0 -27.5 -13.5t-9.5 -27.5v-451z M631 158v436q0 108 81 156q33 20 79 20q125 0 153 -135l4 -41v-436q0 -110 -80 -156q-32 -18 -90.5 -18t-98.5 43t-44 88zM754 158q-4 -57 37 -58q37 0 34 58v436q2 55 -34 55q-18 0 -27.5 -13t-9.5 -28v-450z" />
-<glyph unicode="&#x26;" horiz-adv-x="854" d="M49 304q0 126 44 225.5t126 222.5q-106 225 -106 442v18q0 94 47 180q70 130 223 130q203 0 252 -215q14 -61 12 -113q0 -162 -205 -434q76 -174 148 -285q33 96 47 211l176 -33q-16 -213 -92 -358q55 -63 92 -76v-235q-23 0 -86 37.5t-123 101.5q-123 -139 -252 -139 t-216 97t-87 223zM263 325.5q1 -65.5 28.5 -107.5t78.5 -42t117 86q-88 139 -174 295q-18 -30 -34.5 -98t-15.5 -133.5zM305 1194q0 -111 55 -246q101 156 101 252q-2 2 0 15.5t-2 36t-11 42.5q-19 52 -61.5 52t-62 -38t-19.5 -75v-39z" />
-<glyph unicode="'" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="(" horiz-adv-x="561" d="M66 645q0 143 29.5 292.5t73.5 261.5q92 235 159 343l30 47l162 -84q-38 -53 -86.5 -148t-82.5 -189.5t-61.5 -238t-27.5 -284.5t26.5 -282.5t64.5 -240.5q80 -207 141 -296l26 -39l-162 -84q-41 61 -96 173t-94 217.5t-70.5 257t-31.5 294.5z" />
-<glyph unicode=")" horiz-adv-x="561" d="M41 -213q36 50 85.5 147t83.5 190t61.5 236.5t27.5 284.5t-26.5 282.5t-64.5 240.5q-78 205 -140 298l-27 39l162 84q41 -61 96 -173.5t94 -217t71 -257.5t32 -296t-30 -292.5t-74 -260.5q-92 -233 -159 -342l-30 -47z" />
-<glyph unicode="*" horiz-adv-x="677" d="M74 1251l43 148l164 -70l-19 176h154l-19 -176l164 70l43 -148l-172 -34l115 -138l-131 -80l-78 152l-76 -152l-131 80l115 138z" />
-<glyph unicode="+" horiz-adv-x="1060" d="M74 649v172h370v346h172v-346h371v-172h-371v-346h-172v346h-370z" />
-<glyph unicode="," horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="-" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="." horiz-adv-x="321" d="M53 0v227h215v-227h-215z" />
-<glyph unicode="/" horiz-adv-x="720" d="M8 -147l543 1652h162l-537 -1652h-168z" />
-<glyph unicode="0" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="1" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="2" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="3" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="4" horiz-adv-x="684" d="M25 328v194l323 983h221v-983h103v-194h-103v-328h-202v328h-342zM213 522h154v516h-13z" />
-<glyph unicode="5" horiz-adv-x="704" d="M74 438h221v-59q0 -115 14.5 -159t52 -44t53 45t15.5 156v336q0 111 -70 110q-33 0 -59.5 -40t-26.5 -70h-186v792h535v-219h-344v-313q74 55 127 51q78 0 133 -40t77 -100q35 -98 35 -171v-336q0 -393 -289 -393q-78 0 -133 29.5t-84.5 71.5t-46.5 109q-24 98 -24 244z " />
-<glyph unicode="6" horiz-adv-x="700" d="M66 309v856q0 356 288.5 356.5t288.5 -356.5v-94h-221q0 162 -11.5 210t-53.5 48t-56 -37t-14 -127v-268q59 37 124.5 37t119 -36t75.5 -93q37 -92 37 -189v-307q0 -90 -42 -187q-26 -61 -89 -99.5t-157.5 -38.5t-158 38.5t-88.5 99.5q-42 98 -42 187zM287 244 q0 -20 17.5 -44t49 -24t50 24.5t18.5 43.5v450q0 18 -18.5 43t-49 25t-48 -20.5t-19.5 -41.5v-456z" />
-<glyph unicode="7" horiz-adv-x="589" d="M8 1286v219h557v-221l-221 -1284h-229l225 1286h-332z" />
-<glyph unicode="8" horiz-adv-x="696" d="M53 322v176q0 188 115 297q-102 102 -102 276v127q0 213 147 293q57 31 135 31t135.5 -31t84 -71t42.5 -93q21 -66 21 -129v-127q0 -174 -103 -276q115 -109 115 -297v-176q0 -222 -153 -306q-60 -32 -142 -32t-141.5 32.5t-88 73.5t-44.5 96q-21 69 -21 136zM269 422 q1 -139 16.5 -187.5t57.5 -48.5t59.5 30t21.5 71t4 158t-13.5 174t-66.5 57t-66.5 -57.5t-12.5 -196.5zM284 1116q-1 -123 11 -173t53 -50t53.5 50t12.5 170t-12.5 167t-51.5 47t-52 -44t-14 -167z" />
-<glyph unicode="9" horiz-adv-x="700" d="M57 340v94h222q0 -162 11 -210t53 -48t56.5 37t14.5 127v283q-59 -37 -125 -37t-119 35.5t-76 92.5q-37 96 -37 189v293q0 87 43 188q25 60 88.5 99t157.5 39t157.5 -39t88.5 -99q43 -101 43 -188v-856q0 -356 -289 -356t-289 356zM279 825q0 -18 18 -42.5t49 -24.5 t48.5 20.5t19.5 40.5v443q0 20 -17.5 43.5t-49.5 23.5t-50 -24.5t-18 -42.5v-437z" />
-<glyph unicode=":" horiz-adv-x="362" d="M74 0v227h215v-227h-215zM74 893v227h215v-227h-215z" />
-<glyph unicode=";" horiz-adv-x="362" d="M74 0v227h215v-227l-113 -266h-102l71 266h-71zM74 893v227h215v-227h-215z" />
-<glyph unicode="&#x3c;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="=" horiz-adv-x="1058" d="M74 477v172h911v-172h-911zM74 864v172h911v-172h-911z" />
-<glyph unicode="&#x3e;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="?" horiz-adv-x="645" d="M25 1260q24 67 78 131q105 128 235 122q82 -2 138 -33.5t82 -81.5q46 -88 46 -170.5t-80 -219.5l-57 -96q-18 -32 -42 -106.5t-24 -143.5v-256h-190v256q0 102 24.5 195t48 140t65.5 118t50 105t-9 67.5t-60 34.5t-78 -48t-49 -98zM199 0h215v227h-215v-227z" />
-<glyph unicode="@" horiz-adv-x="872" d="M66 303v889q0 97 73 200q39 56 117 93t184.5 37t184 -37t116.5 -93q74 -105 74 -200v-793h-164l-20 56q-14 -28 -46 -48t-67 -20q-145 0 -145 172v485q0 170 145 170q71 0 113 -67v45q0 51 -45 104.5t-145.5 53.5t-145.5 -53.5t-45 -104.5v-889q0 -53 44 -103t153.5 -50 t160.5 63l152 -86q-109 -143 -320 -143q-106 0 -184 35.5t-117 90.5q-73 102 -73 193zM535 573q0 -53 48 -53t48 53v455q0 53 -48 53t-48 -53v-455z" />
-<glyph unicode="A" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="B" horiz-adv-x="745" d="M82 0v1505h194q205 0 304.5 -91t99.5 -308q0 -106 -29.5 -175t-107.5 -136q14 -5 47 -38.5t54 -71.5q52 -97 52 -259q0 -414 -342 -426h-272zM303 219q74 0 109 31q55 56 55 211t-63 195q-42 26 -93 26h-8v-463zM303 885q87 0 119 39q45 55 45 138t-14.5 124t-30.5 60.5 t-45 28.5q-35 11 -74 11v-401z" />
-<glyph unicode="C" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175z" />
-<glyph unicode="D" horiz-adv-x="761" d="M82 0v1505h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174zM303 221q117 0 140.5 78t23.5 399v111q0 322 -23.5 398.5t-140.5 76.5v-1063z" />
-<glyph unicode="E" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506z" />
-<glyph unicode="F" horiz-adv-x="616" d="M82 0v1505h526v-227h-305v-395h205v-228h-205v-655h-221z" />
-<glyph unicode="G" horiz-adv-x="737" d="M67 271.5q0 26.5 1 37.5v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-231h-221v231q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-905q0 -46 19.5 -78.5t54 -32.5t53 28t18.5 54l2 29v272h-88v187h309v-750h-131l-26 72 q-70 -88 -172 -88q-203 0 -250 213q-11 48 -11 74.5z" />
-<glyph unicode="H" horiz-adv-x="778" d="M82 0v1505h221v-622h172v622h221v-1505h-221v655h-172v-655h-221z" />
-<glyph unicode="I" horiz-adv-x="385" d="M82 0v1505h221v-1505h-221z" />
-<glyph unicode="J" horiz-adv-x="423" d="M12 -14v217q4 0 12.5 -1t29 2t35.5 12t28.5 34.5t13.5 62.5v1192h221v-1226q0 -137 -74 -216q-74 -78 -223 -78h-4q-19 0 -39 1z" />
-<glyph unicode="K" horiz-adv-x="768" d="M82 0v1505h221v-526h8l195 526h215l-203 -495l230 -1010h-216l-153 655l-6 31h-6l-64 -154v-532h-221z" />
-<glyph unicode="L" horiz-adv-x="604" d="M82 0v1505h221v-1300h293v-205h-514z" />
-<glyph unicode="M" horiz-adv-x="991" d="M82 0v1505h270l131 -688l11 -80h4l10 80l131 688h270v-1505h-204v1010h-13l-149 -1010h-94l-142 946l-8 64h-12v-1010h-205z" />
-<glyph unicode="N" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203z" />
-<glyph unicode="O" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="P" horiz-adv-x="720" d="M82 0v1505h221q166 0 277.5 -105.5t111.5 -345t-111.5 -346t-277.5 -106.5v-602h-221zM303 827q102 0 134 45.5t32 175.5t-33 181t-133 51v-453z" />
-<glyph unicode="Q" horiz-adv-x="729" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -94 -45 -182q33 -43 88 -53v-189q-160 0 -227 117q-55 -18 -125 -18t-130 33.5t-88 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887 q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="R" horiz-adv-x="739" d="M82 0v1505h221q377 0 377 -434q0 -258 -123 -342l141 -729h-221l-115 635h-59v-635h-221zM303 840q117 0 149 98q15 49 15 125t-15.5 125t-45.5 68q-44 30 -103 30v-446z" />
-<glyph unicode="S" horiz-adv-x="702" d="M37 422l217 20q0 -256 104 -256q90 0 91 166q0 59 -32 117.5t-45 79.5l-54 79q-40 58 -77 113t-73.5 117t-68 148.5t-31.5 162.5q0 139 71.5 245t216.5 108h10q88 0 152 -36t94 -100q54 -120 54 -264l-217 -20q0 217 -89 217q-75 -2 -75 -146q0 -59 23 -105 q32 -66 58 -104l197 -296q31 -49 67 -139.5t36 -166.5q0 -378 -306 -378h-2q-229 0 -290 188q-31 99 -31 250z" />
-<glyph unicode="T" horiz-adv-x="647" d="M4 1278v227h639v-227h-209v-1278h-221v1278h-209z" />
-<glyph unicode="U" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175z" />
-<glyph unicode="V" horiz-adv-x="716" d="M18 1505h215l111 -827l8 -64h13l118 891h215l-229 -1505h-221z" />
-<glyph unicode="W" horiz-adv-x="1036" d="M25 1505h204l88 -782l5 -49h16l100 831h160l100 -831h17l92 831h205l-203 -1505h-172l-115 801h-8l-115 -801h-172z" />
-<glyph unicode="X" horiz-adv-x="737" d="M16 0l244 791l-240 714h218l120 -381l7 -18h8l127 399h217l-240 -714l244 -791h-217l-127 449l-4 18h-8l-132 -467h-217z" />
-<glyph unicode="Y" horiz-adv-x="700" d="M14 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641z" />
-<glyph unicode="Z" horiz-adv-x="626" d="M20 0v238l347 1048h-297v219h536v-219l-352 -1067h352v-219h-586z" />
-<glyph unicode="[" horiz-adv-x="538" d="M82 -213v1718h399v-196h-202v-1325h202v-197h-399z" />
-<glyph unicode="\" horiz-adv-x="792" d="M8 1692h162l614 -1872h-168z" />
-<glyph unicode="]" horiz-adv-x="538" d="M57 -16h203v1325h-203v196h400v-1718h-400v197z" />
-<glyph unicode="^" horiz-adv-x="1101" d="M53 809l381 696h234l381 -696h-199l-299 543l-299 -543h-199z" />
-<glyph unicode="_" horiz-adv-x="1210" d="M74 -154h1063v-172h-1063v172z" />
-<glyph unicode="`" horiz-adv-x="1024" d="M293 1489h215l106 -184h-159z" />
-<glyph unicode="a" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="b" horiz-adv-x="686" d="M82 0v1505h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-74h-207zM289 246q0 -29 19.5 -48.5t42 -19.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -21.5t-19.5 -46.5v-628z" />
-<glyph unicode="c" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331z" />
-<glyph unicode="d" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v458h207v-1505h-207v74q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 19.5t19.5 48.5v628q0 25 -19.5 46.5t-42 21.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="e" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="f" horiz-adv-x="475" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-65 0 -65 -175v-5v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="g" horiz-adv-x="700" d="M12 -184q0 94 162 170q-125 35 -125 149q0 45 40 93t89 75q-51 35 -80.5 95.5t-34.5 105.5l-4 43v305q0 35 16.5 91t41 94t79 69t126.5 31q135 0 206 -103q102 102 170 103v-185q-72 0 -120 -24l10 -70v-317q0 -37 -17.5 -90.5t-42 -90t-79 -66.5t-104.5 -30t-62 2 q-29 -25 -29 -46t11 -33.5t42 -20.5t45.5 -10t65.5 -10.5t95 -21.5t89 -41q96 -60 96 -205t-103 -212q-100 -65 -250 -65h-9q-156 2 -240 50t-84 165zM213 -150q0 -77 132 -77h3q59 0 108.5 19t49.5 54t-20.5 52.5t-90.5 29.5l-106 21q-76 -43 -76 -99zM262 509 q0 -17 15.5 -45t44.5 -28q63 6 63 101v307q-2 0 0 10q1 3 1 7q0 8 -3 19q-4 15 -9 30q-11 36 -46 36t-50.5 -25.5t-15.5 -52.5v-359z" />
-<glyph unicode="h" horiz-adv-x="690" d="M82 0v1505h207v-479l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="i" horiz-adv-x="370" d="M82 0v1120h207v-1120h-207zM82 1298v207h207v-207h-207z" />
-<glyph unicode="j" horiz-adv-x="364" d="M-45 -182q29 -8 57 -8q64 0 64 142v1168h207v-1149q0 -186 -51 -266q-23 -35 -71 -62.5t-115 -27.5t-91 12v191zM76 1298v207h207v-207h-207z" />
-<glyph unicode="k" horiz-adv-x="641" d="M82 0v1505h207v-714h10l113 329h186l-149 -364l188 -756h-199l-102 453l-4 16h-10l-33 -82v-387h-207z" />
-<glyph unicode="l" horiz-adv-x="370" d="M82 0v1505h207v-1505h-207z" />
-<glyph unicode="m" horiz-adv-x="1021" d="M82 0v1120h207v-94q2 0 33 30q80 81 139 81q100 0 139 -125q125 125 194.5 125t109.5 -69t40 -150v-918h-194v887q-1 49 -56 49q-41 0 -78 -53v-883h-194v887q0 49 -55 49q-41 0 -78 -53v-883h-207z" />
-<glyph unicode="n" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="o" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="p" horiz-adv-x="686" d="M82 -385v1505h207v-73q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="q" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v73h207v-1505h-207v459q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 21.5t19.5 46.5v628q0 29 -19.5 48.5t-42 19.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="r" horiz-adv-x="503" d="M82 0v1120h207v-125q8 41 58.5 91.5t148.5 50.5v-230q-34 11 -77 11t-86.5 -39t-43.5 -101v-778h-207z" />
-<glyph unicode="s" horiz-adv-x="630" d="M37 326h192q0 -170 97 -170q71 0 71 131q0 78 -129 202q-68 66 -98.5 99t-64 101.5t-33.5 134t12 114.5t39 95q59 100 201 104h11q161 0 211 -105q42 -86 42 -198h-193q0 131 -67 131q-63 -2 -64 -131q0 -33 23.5 -73t45 -62.5t66.5 -65.5q190 -182 191 -342 q0 -123 -64.5 -215t-199.5 -92q-197 0 -260 170q-29 76 -29 172z" />
-<glyph unicode="t" horiz-adv-x="501" d="M20 934v186h105v277h207v-277h141v-186h-141v-557q0 -184 65 -184l76 8v-203q-45 -14 -112 -14t-114.5 28.5t-70 64.5t-34.5 96q-17 79 -17 187v574h-105z" />
-<glyph unicode="u" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5z" />
-<glyph unicode="v" horiz-adv-x="602" d="M16 1120h201l68 -649l8 -72h16l76 721h201l-183 -1120h-204z" />
-<glyph unicode="w" horiz-adv-x="905" d="M20 1120h189l65 -585l9 -64h12l96 649h123l86 -585l10 -64h13l73 649h189l-166 -1120h-172l-80 535l-10 63h-8l-91 -598h-172z" />
-<glyph unicode="x" horiz-adv-x="618" d="M16 0l193 578l-176 542h194l74 -262l6 -31h4l6 31l74 262h195l-176 -542l192 -578h-201l-84 283l-6 30h-4l-6 -30l-84 -283h-201z" />
-<glyph unicode="y" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5z" />
-<glyph unicode="z" horiz-adv-x="532" d="M12 0v168l285 764h-240v188h459v-168l-285 -764h285v-188h-504z" />
-<glyph unicode="{" horiz-adv-x="688" d="M61 453v163q72 0 102 49.5t30 90.5v397q0 223 96 298t342 71v-172q-135 2 -188.5 -38t-53.5 -159v-397q0 -143 -127 -221q127 -82 127 -222v-397q0 -119 53.5 -159t188.5 -38v-172q-246 -4 -342 71t-96 298v397q0 57 -41 97.5t-91 42.5z" />
-<glyph unicode="|" horiz-adv-x="356" d="M82 -512v2204h192v-2204h-192z" />
-<glyph unicode="}" horiz-adv-x="688" d="M57 -281q135 -2 188.5 38t53.5 159v397q0 139 127 222q-127 78 -127 221v397q0 119 -53 159t-189 38v172q246 4 342.5 -71t96.5 -298v-397q0 -63 41 -101.5t90 -38.5v-163q-72 -4 -101.5 -52.5t-29.5 -87.5v-397q0 -223 -96.5 -298t-342.5 -71v172z" />
-<glyph unicode="~" horiz-adv-x="1280" d="M113 1352q35 106 115 200q34 41 94.5 74t121 33t116.5 -18.5t82 -33t83 -51.5q106 -72 174 -71q109 0 178 153l13 29l135 -57q-63 -189 -206 -276q-56 -34 -120 -34q-121 0 -272 101q-115 74 -178.5 74t-113.5 -45.5t-69 -90.5l-18 -45z" />
-<glyph unicode="&#xa1;" horiz-adv-x="387" d="M74 -385l55 1100h129l55 -1100h-239zM86 893v227h215v-227h-215z" />
-<glyph unicode="&#xa2;" horiz-adv-x="636" d="M66 508v489q0 297 208 328v242h123v-244q98 -16 144.5 -88t46.5 -227v-88h-189v135q0 90 -72.5 90t-72.5 -90v-604q0 -90 72 -91q74 0 73 91v155h189v-108q0 -156 -46 -228.5t-145 -89.5v-303h-123v301q-209 31 -208 330z" />
-<glyph unicode="&#xa3;" horiz-adv-x="817" d="M4 63q8 20 23.5 53.5t70 91.5t117.5 68q37 111 37 189t-31 184h-188v137h147l-6 21q-78 254 -78 333t15.5 140t48.5 116q72 122 231 126q190 4 267 -126q65 -108 65 -276h-213q0 201 -115 197q-47 -2 -68.5 -51t-21.5 -139.5t70 -315.5l6 -25h211v-137h-174 q25 -100 24.5 -189t-57.5 -204q16 -8 44 -24q59 -35 89 -35q74 4 82 190l188 -22q-12 -182 -81.5 -281.5t-169.5 -99.5q-51 0 -143.5 51t-127.5 51t-63.5 -25.5t-40.5 -52.5l-12 -24z" />
-<glyph unicode="&#xa5;" horiz-adv-x="720" d="M25 1505h217l110 -481l6 -14h4l7 14l110 481h217l-196 -753h147v-138h-176v-137h176v-137h-176v-340h-221v340h-176v137h176v137h-176v138h147z" />
-<glyph unicode="&#xa8;" horiz-adv-x="1024" d="M272 1305v200h191v-200h-191zM561 1305v200h191v-200h-191z" />
-<glyph unicode="&#xa9;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM627 487v531q0 122 97 174q40 22 95 22 q147 0 182 -147l7 -49v-125h-138v142q0 11 -12 28.5t-37 17.5q-47 -2 -49 -63v-531q0 -63 49 -63q53 2 49 63v125h138v-125q0 -68 -40 -127q-18 -26 -57 -47.5t-108.5 -21.5t-117.5 49t-54 98z" />
-<glyph unicode="&#xaa;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xad;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#xae;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM625 313v879h196q231 0 232 -258 q0 -76 -16.5 -125t-71.5 -96l106 -400h-151l-95 365h-55v-365h-145zM770 805h45q43 0 65.5 21.5t27.5 45t5 61.5t-5 62.5t-27.5 46t-65.5 21.5h-45v-258z" />
-<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M313 1315v162h398v-162h-398z" />
-<glyph unicode="&#xb2;" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="&#xb3;" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="&#xb4;" horiz-adv-x="1024" d="M410 1305l106 184h215l-162 -184h-159z" />
-<glyph unicode="&#xb7;" horiz-adv-x="215" d="M0 649v228h215v-228h-215z" />
-<glyph unicode="&#xb8;" horiz-adv-x="1024" d="M426 -111h172v-141l-45 -133h-104l40 133h-63v141z" />
-<glyph unicode="&#xb9;" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="&#xba;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="&#xbf;" horiz-adv-x="645" d="M41 -106q0 82 80 219l57 95q18 32 42 106.5t24 144.5v256h190v-256q0 -102 -24.5 -195.5t-48 -140.5t-65.5 -118t-50 -104.5t9 -67.5t60 -35t78 48.5t49 98.5l179 -84q-24 -66 -78 -132q-104 -126 -236 -122q-163 4 -220 115q-46 90 -46 172zM231 893v227h215v-227h-215z " />
-<glyph unicode="&#xc0;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM141 1823h215l107 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc1;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM293 1638l106 185h215l-161 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc2;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM133 1638l141 185h220l141 -185h-189l-63 72l-61 -72h-189zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc3;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM184 1632v152q49 39 95.5 39t104.5 -18.5t100.5 -19.5t97.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-98 19.5t-102 -33zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc4;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM143 1638v201h191v-201h-191zM307 541h152l-64 475l-6 39h-12zM432 1638v201h191v-201h-191z" />
-<glyph unicode="&#xc5;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM231 1761.5q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM307 541h152l-64 475l-6 39h-12zM309 1761.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50 t-23.5 50t-52.5 21.5t-52.5 -21.5t-23.5 -50z" />
-<glyph unicode="&#xc6;" horiz-adv-x="1099" d="M16 0l420 1505h623v-227h-285v-395h205v-242h-205v-414h285v-227h-506v307h-227l-90 -307h-220zM393 541h160v514h-10z" />
-<glyph unicode="&#xc7;" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM268 -111v-141h64l-41 -133h104l45 133v141h-172z" />
-<glyph unicode="&#xc8;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM111 1823h215l106 -185h-160z" />
-<glyph unicode="&#xc9;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM236 1638l106 185h215l-162 -185h-159z" />
-<glyph unicode="&#xca;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM84 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xcb;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM94 1638v201h191v-201h-191zM383 1638v201h190v-201h-190z" />
-<glyph unicode="&#xcc;" horiz-adv-x="401" d="M-6 1823h215l106 -185h-159zM98 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcd;" horiz-adv-x="401" d="M82 0v1505h221v-1505h-221zM86 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xce;" horiz-adv-x="370" d="M-66 1638l142 185h219l141 -185h-188l-64 72l-61 -72h-189zM74 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcf;" horiz-adv-x="372" d="M-53 1638v201h190v-201h-190zM76 0v1505h221v-1505h-221zM236 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd0;" horiz-adv-x="761" d="M20 655v228h62v622h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174v655h-62zM303 221q117 0 141.5 81t22.5 452q2 371 -22.5 450.5t-141.5 79.5v-401h84v-228h-84v-434z " />
-<glyph unicode="&#xd1;" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203zM207 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39t-102.5 19.5t-100 19.5t-99.5 -33z" />
-<glyph unicode="&#xd2;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM121 1823h215l106 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd3;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM285 1638l106 185h215l-162 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5 t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd4;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM113 1638l141 185h219l141 -185h-188l-64 72l-61 -72h-188zM289 309q0 -46 19.5 -78 t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd5;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM164 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39 t-102.5 19.5t-100 19.5t-99.5 -33zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd6;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM123 1638v201h190v-201h-190zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887zM412 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd8;" d="M59 -20l47 157q-36 74 -36 148l-2 24v887q0 42 17 106t45 107t88.5 78t148 35t153.5 -43l15 47h122l-45 -150q43 -84 43 -155l2 -25v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-150.5 -34.5t-153 43l-15 -47h-129zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v488zM289 727l147 479q-8 100 -74 101q-35 0 -53 -28t-18 -54l-2 -29v-469z" />
-<glyph unicode="&#xd9;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM145 1823h215l107 -185h-160z" />
-<glyph unicode="&#xda;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM307 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xdb;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM125 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xdc;" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175zM135 1638v201h191v-201h-191zM424 1638v201h190v-201h-190z" />
-<glyph unicode="&#xdd;" horiz-adv-x="704" d="M16 1505l226 -864v-641h221v641l225 864h-217l-111 -481l-6 -14h-4l-6 14l-111 481h-217zM254 1638l106 185h215l-161 -185h-160z" />
-<glyph unicode="&#xde;" d="M82 0v1505h219v-241h2q166 0 277.5 -105.5t111.5 -345.5t-111.5 -346.5t-277.5 -106.5v-360h-221zM303 586q102 0 134 45t32 175t-33 181t-133 51v-452z" />
-<glyph unicode="&#xdf;" horiz-adv-x="733" d="M66 0v1235q0 123 70.5 205t206.5 82t204.5 -81t68.5 -197t-88 -181q152 -88 152 -488q0 -362 -87 -475q-46 -59 -102.5 -79.5t-144.5 -20.5v193q45 0 70 25q57 57 57 357q0 316 -57 377q-25 27 -70 27v141q35 0 60.5 33t25.5 84q0 100 -86 100q-74 0 -74 -102v-1235h-206 z" />
-<glyph unicode="&#xe0;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1489h215 l107 -184h-160zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe1;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xe2;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM90 1305 l141 184h220l141 -184h-189l-63 71l-61 -71h-189zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe3;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM143 1305v151 q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe4;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1305v200 h191v-200h-191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM391 1305v200h191v-200h-191z" />
-<glyph unicode="&#xe5;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM188 1421.5 q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM266 1421.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50t-23.5 50t-52.5 21.5t-52.5 -21.5 t-23.5 -50z" />
-<glyph unicode="&#xe6;" horiz-adv-x="989" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t197.5 88q84 0 152 -52q66 51 162 52q199 0 251 -197q14 -51 15 -92v-326h-342v-256q0 -60 38 -88q17 -12 38 -12q70 10 73 113v122h193v-129 q0 -37 -16.5 -93t-41 -95t-80 -69.5t-130.5 -30.5q-158 0 -226 131q-102 -131 -221 -131q-59 0 -112.5 60t-53.5 191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM588 684h149v158q0 48 -19.5 81t-53 33t-53 -28.5t-21.5 -57.5l-2 -28v-158z " />
-<glyph unicode="&#xe7;" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331zM238 -111v-141h63l-41 -133h105l45 133v141h-172z " />
-<glyph unicode="&#xe8;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM102 1489h215l107 -184 h-160zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xe9;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xea;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM80 1305l141 184h219 l142 -184h-189l-63 71l-62 -71h-188zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xeb;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM90 1305v200h191v-200 h-191zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xec;" horiz-adv-x="370" d="M-33 1489h215l107 -184h-160zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xed;" horiz-adv-x="370" d="M82 0h207v1120h-207v-1120zM82 1305l106 184h215l-161 -184h-160z" />
-<glyph unicode="&#xee;" horiz-adv-x="370" d="M-66 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xef;" horiz-adv-x="372" d="M-53 1305v200h190v-200h-190zM82 0v1120h207v-1120h-207zM236 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf0;" horiz-adv-x="673" d="M76 279v579q0 279 172 279q63 0 155 -78q-12 109 -51 203l-82 -72l-55 63l100 88l-45 66l109 100q25 -27 53 -61l94 82l56 -66l-101 -88q125 -201 125 -446v-656q0 -102 -56 -188q-26 -39 -80 -69.5t-129 -30.5t-130 30.5t-80 73.5q-53 91 -53 160zM270 267.5 q-2 -11.5 2 -29t10 -34.5q16 -38 58 -38q70 10 72 113v563q-2 0 0 11t-2 28.5t-10 34.5q-16 40 -60 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf1;" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207zM147 1305v151q49 39 95.5 39t105 -18.5t97 -19.5t100.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#xf2;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM98 1489h215l107 -184h-160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf3;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5 t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM260 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xf4;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM78 1305l141 184h219l142 -184h-189l-63 71l-62 -71h-188zM258 267.5q-2 -11.5 2 -29 t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf5;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM131 1305v151q49 39 95.5 39t104.5 -18.5t98.5 -19.5t98.5 32v-152q-51 -39 -95 -39 t-102 19.5t-101 19.5t-99 -32zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf6;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM90 1305v200h191v-200h-191zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf8;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t118 32t117.5 -19l21 80h75l-30 -121q88 -84 94 -229v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-120.5 -30.5t-112 16l-20 -78h-80l31 121q-41 39 -64.5 97.5t-25.5 97.5zM258 436l125 486q-18 35 -55 34q-68 -10 -70 -114 v-406zM274 197q17 -31 54 -31q70 10 71 113v403z" />
-<glyph unicode="&#xf9;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM113 1489h215l106 -184h-160z" />
-<glyph unicode="&#xfa;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM274 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfb;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM94 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189z" />
-<glyph unicode="&#xfc;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM106 1305v200h191v-200h-191zM395 1305v200h191v-200h-191z" />
-<glyph unicode="&#xfd;" horiz-adv-x="634" d="M25 1120l190 -1153q0 -68 -36 -123t-97 -61l-49 4v-184q70 -4 92 -4q115 0 192.5 95t94.5 222l198 1204h-202l-82 -688l-4 -57h-9l-4 57l-82 688h-202zM231 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfe;" horiz-adv-x="686" d="M82 -385v1890h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="&#xff;" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5zM78 1305v200h190v-200h-190zM367 1305v200h190v-200h-190z" />
-<glyph unicode="&#x152;" horiz-adv-x="983" d="M68 309v887q0 41 17 101.5t45 100.5t88.5 73.5t143.5 33.5h580v-227h-285v-395h205v-242h-205v-414h285v-227h-580q-84 0 -144 31.5t-88 78.5q-55 91 -60 169zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v901q-6 96 -74 97q-35 0 -53 -28t-18 -54l-2 -29 v-887z" />
-<glyph unicode="&#x153;" horiz-adv-x="995" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t145.5 32t156 -60q66 59 170 60q199 0 252 -197q14 -51 14 -92v-326h-342v-250q0 -46 22.5 -76t53.5 -30q70 10 73 113v122h193v-129q0 -37 -16.5 -93t-41 -95t-80 -69.5t-146 -30.5t-154.5 57q-68 -57 -156 -57t-143.5 30.5 t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM594 684h149v158q0 48 -19 81t-58 33t-55.5 -37.5t-16.5 -70.5v-164z" />
-<glyph unicode="&#x178;" horiz-adv-x="704" d="M16 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641zM113 1638v201h190v-201h-190zM401 1638v201h191v-201h-191z" />
-<glyph unicode="&#x2c6;" horiz-adv-x="1021" d="M260 1305l141 184h220l141 -184h-189l-63 71l-61 -71h-189z" />
-<glyph unicode="&#x2dc;" horiz-adv-x="1024" d="M313 1305v151q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#x2000;" horiz-adv-x="952" />
-<glyph unicode="&#x2001;" horiz-adv-x="1905" />
-<glyph unicode="&#x2002;" horiz-adv-x="952" />
-<glyph unicode="&#x2003;" horiz-adv-x="1905" />
-<glyph unicode="&#x2004;" horiz-adv-x="635" />
-<glyph unicode="&#x2005;" horiz-adv-x="476" />
-<glyph unicode="&#x2006;" horiz-adv-x="317" />
-<glyph unicode="&#x2007;" horiz-adv-x="317" />
-<glyph unicode="&#x2008;" horiz-adv-x="238" />
-<glyph unicode="&#x2009;" horiz-adv-x="381" />
-<glyph unicode="&#x200a;" horiz-adv-x="105" />
-<glyph unicode="&#x2010;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2011;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2012;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2013;" horiz-adv-x="806" d="M74 649v195h659v-195h-659z" />
-<glyph unicode="&#x2014;" horiz-adv-x="972" d="M74 649v195h825v-195h-825z" />
-<glyph unicode="&#x2018;" horiz-adv-x="309" d="M49 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x2019;" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="&#x201a;" horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="&#x201c;" horiz-adv-x="624" d="M53 1012v227l113 266h102l-71 -266h71v-227h-215zM356 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x201d;" horiz-adv-x="624" d="M53 1012l72 266h-72v227h215v-227l-112 -266h-103zM356 1012l72 266h-72v227h215v-227l-112 -266h-103z" />
-<glyph unicode="&#x201e;" horiz-adv-x="624" d="M53 0v227h215v-227l-112 -266h-103l72 266h-72zM356 0v227h215v-227l-112 -266h-103l72 266h-72z" />
-<glyph unicode="&#x2022;" horiz-adv-x="663" d="M82 815q0 104 72.5 177t177 73t177.5 -72.5t73 -177t-73 -177.5t-177 -73t-177 73t-73 177z" />
-<glyph unicode="&#x2026;" horiz-adv-x="964" d="M53 0v227h215v-227h-215zM375 0v227h215v-227h-215zM696 0v227h215v-227h-215z" />
-<glyph unicode="&#x202f;" horiz-adv-x="381" />
-<glyph unicode="&#x2039;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="&#x203a;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="&#x205f;" horiz-adv-x="476" />
-<glyph unicode="&#x20ac;" horiz-adv-x="813" d="M53 547v137h107v137h-107v137h107v238q0 42 17.5 106t45 107t88 78t144.5 35t144 -34t88 -81q53 -90 61 -178l2 -33v-84h-207v84q-2 0 0 11.5t-3 27.5t-12 33q-18 39 -69 39q-70 -10 -78 -111v-238h233v-137h-233v-137h233v-137h-233v-238q0 -43 21.5 -76.5t59.5 -33.5 t58.5 27.5t20.5 56.5l2 26v84h207v-84q0 -38 -17.5 -104t-45.5 -109t-88 -77.5t-144 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175l-2 35v238h-107z" />
-<glyph unicode="&#x2122;" horiz-adv-x="937" d="M74 1401v104h321v-104h-104v-580h-113v580h-104zM440 821v684h138l67 -319h6l68 319h137v-684h-104v449l-78 -449h-51l-80 449v-449h-103z" />
-<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 0v1120h1120v-1120h-1120z" />
-<glyph unicode="&#xfb01;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2v-184q-41 12 -91 12t-69.5 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h358v-1120h-207v934h-151v-934h-207v934h-105z" />
-<glyph unicode="&#xfb02;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2h164v-1505h-207v1329q-37 4 -67.5 4t-50 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="&#xfb03;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1120h207v-1120h-207zM1032 1298v207h207v-207h-207z" />
-<glyph unicode="&#xfb04;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1505h207v-1505h-207z" />
-</font>
-</defs></svg> 
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.ttf b/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.ttf
deleted file mode 100644
Binary files a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.ttf and /dev/null differ
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.woff b/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.woff
deleted file mode 100644
Binary files a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic-webfont.woff and /dev/null differ
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic_license b/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic_license
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/lib/font/league_gothic_license
+++ /dev/null
@@ -1,2 +0,0 @@
-SIL Open Font License (OFL)
-http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/js/classList.js b/docs/slides/BOS14/_support/reveal.js/lib/js/classList.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/lib/js/classList.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
-if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p<o;p++){if(p in this&&this[p]===q){return p}}return -1},n=function(o,p){this.name=o;this.code=DOMException[o];this.message=p},g=function(p,o){if(o===""){throw new n("SYNTAX_ERR","An invalid or illegal string was specified")}if(/\s/.test(o)){throw new n("INVALID_CHARACTER_ERR","String contains an invalid character")}return c.call(p,o)},d=function(s){var r=k.call(s.className),q=r?r.split(/\s+/):[],p=0,o=q.length;for(;p<o;p++){this.push(q[p])}this._updateClassName=function(){s.className=this.toString()}},e=d[f]=[],i=function(){return new d(this)};n[f]=Error[f];e.item=function(o){return this[o]||null};e.contains=function(o){o+="";return g(this,o)!==-1};e.add=function(o){o+="";if(g(this,o)===-1){this.push(o);this._updateClassName()}};e.remove=function(p){p+="";var o=g(this,p);if(o!==-1){this.splice(o,1);this._updateClassName()}};e.toggle=function(o){o+="";if(g(this,o)===-1){this.add(o)}else{this.remove(o)}};e.toString=function(){return this.join(" ")};if(b.defineProperty){var l={get:i,enumerable:true,configurable:true};try{b.defineProperty(m,a,l)}catch(h){if(h.number===-2146823252){l.enumerable=false;b.defineProperty(m,a,l)}}}else{if(b[f].__defineGetter__){m.__defineGetter__(a,i)}}}(self))};
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/js/head.min.js b/docs/slides/BOS14/_support/reveal.js/lib/js/head.min.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/lib/js/head.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
-    Head JS     The only script in your <HEAD>
-    Copyright   Tero Piirainen (tipiirai)
-    License     MIT / http://bit.ly/mit-license
-    Version     0.96
-
-    http://headjs.com
-*/(function(a){function z(){d||(d=!0,s(e,function(a){p(a)}))}function y(c,d){var e=a.createElement("script");e.type="text/"+(c.type||"javascript"),e.src=c.src||c,e.async=!1,e.onreadystatechange=e.onload=function(){var a=e.readyState;!d.done&&(!a||/loaded|complete/.test(a))&&(d.done=!0,d())},(a.body||b).appendChild(e)}function x(a,b){if(a.state==o)return b&&b();if(a.state==n)return k.ready(a.name,b);if(a.state==m)return a.onpreload.push(function(){x(a,b)});a.state=n,y(a.url,function(){a.state=o,b&&b(),s(g[a.name],function(a){p(a)}),u()&&d&&s(g.ALL,function(a){p(a)})})}function w(a,b){a.state===undefined&&(a.state=m,a.onpreload=[],y({src:a.url,type:"cache"},function(){v(a)}))}function v(a){a.state=l,s(a.onpreload,function(a){a.call()})}function u(a){a=a||h;var b;for(var c in a){if(a.hasOwnProperty(c)&&a[c].state!=o)return!1;b=!0}return b}function t(a){return Object.prototype.toString.call(a)=="[object Function]"}function s(a,b){if(!!a){typeof a=="object"&&(a=[].slice.call(a));for(var c=0;c<a.length;c++)b.call(a,a[c],c)}}function r(a){var b;if(typeof a=="object")for(var c in a)a[c]&&(b={name:c,url:a[c]});else b={name:q(a),url:a};var d=h[b.name];if(d&&d.url===b.url)return d;h[b.name]=b;return b}function q(a){var b=a.split("/"),c=b[b.length-1],d=c.indexOf("?");return d!=-1?c.substring(0,d):c}function p(a){a._done||(a(),a._done=1)}var b=a.documentElement,c,d,e=[],f=[],g={},h={},i=a.createElement("script").async===!0||"MozAppearance"in a.documentElement.style||window.opera,j=window.head_conf&&head_conf.head||"head",k=window[j]=window[j]||function(){k.ready.apply(null,arguments)},l=1,m=2,n=3,o=4;i?k.js=function(){var a=arguments,b=a[a.length-1],c={};t(b)||(b=null),s(a,function(d,e){d!=b&&(d=r(d),c[d.name]=d,x(d,b&&e==a.length-2?function(){u(c)&&p(b)}:null))});return k}:k.js=function(){var a=arguments,b=[].slice.call(a,1),d=b[0];if(!c){f.push(function(){k.js.apply(null,a)});return k}d?(s(b,function(a){t(a)||w(r(a))}),x(r(a[0]),t(d)?d:function(){k.js.apply(null,b)})):x(r(a[0]));return k},k.ready=function(b,c){if(b==a){d?p(c):e.push(c);return k}t(b)&&(c=b,b="ALL");if(typeof b!="string"||!t(c))return k;var f=h[b];if(f&&f.state==o||b=="ALL"&&u()&&d){p(c);return k}var i=g[b];i?i.push(c):i=g[b]=[c];return k},k.ready(a,function(){u()&&s(g.ALL,function(a){p(a)}),k.feature&&k.feature("domloaded",!0)});if(window.addEventListener)a.addEventListener("DOMContentLoaded",z,!1),window.addEventListener("load",z,!1);else if(window.attachEvent){a.attachEvent("onreadystatechange",function(){a.readyState==="complete"&&z()});var A=1;try{A=window.frameElement}catch(B){}!A&&b.doScroll&&function(){try{b.doScroll("left"),z()}catch(a){setTimeout(arguments.callee,1);return}}(),window.attachEvent("onload",z)}!a.readyState&&a.addEventListener&&(a.readyState="loading",a.addEventListener("DOMContentLoaded",handler=function(){a.removeEventListener("DOMContentLoaded",handler,!1),a.readyState="complete"},!1)),setTimeout(function(){c=!0,s(f,function(a){a()})},300)})(document)
diff --git a/docs/slides/BOS14/_support/reveal.js/lib/js/html5shiv.js b/docs/slides/BOS14/_support/reveal.js/lib/js/html5shiv.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/lib/js/html5shiv.js
+++ /dev/null
@@ -1,7 +0,0 @@
-document.createElement('header');
-document.createElement('nav');
-document.createElement('section');
-document.createElement('article');
-document.createElement('aside');
-document.createElement('footer');
-document.createElement('hgroup');
diff --git a/docs/slides/BOS14/_support/reveal.js/package.json b/docs/slides/BOS14/_support/reveal.js/package.json
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "name": "reveal.js",
-  "version": "2.6.2",
-  "description": "The HTML Presentation Framework",
-  "homepage": "http://lab.hakim.se/reveal-js",
-  "subdomain": "revealjs",
-  "scripts": {
-    "test": "grunt test",
-    "start": ""
-  },
-  "author": {
-    "name": "Hakim El Hattab",
-    "email": "hakim.elhattab@gmail.com",
-    "web": "http://hakim.se"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hakimel/reveal.js.git"
-  },
-  "engines": {
-    "node": "~0.8.0"
-  },
-  "dependencies": {
-    "underscore": "~1.5.1",
-    "express": "~2.5.9",
-    "mustache": "~0.7.2",
-    "socket.io": "~0.9.13"
-  },
-  "devDependencies": {
-    "grunt-contrib-qunit": "~0.2.2",
-    "grunt-contrib-jshint": "~0.6.4",
-    "grunt-contrib-cssmin": "~0.4.1",
-    "grunt-contrib-uglify": "~0.2.4",
-    "grunt-contrib-watch": "~0.5.3",
-    "grunt-contrib-sass": "~0.5.0",
-    "grunt-contrib-connect": "~0.4.1",
-    "grunt-zip": "~0.7.0",
-    "grunt": "~0.4.0"
-  },
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "https://github.com/hakimel/reveal.js/blob/master/LICENSE"
-    }
-  ]
-}
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/highlight/highlight.js b/docs/slides/BOS14/_support/reveal.js/plugin/highlight/highlight.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/highlight/highlight.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// START CUSTOM REVEAL.JS INTEGRATION
-(function() {
-	if( typeof window.addEventListener === 'function' ) {
-		var hljs_nodes = document.querySelectorAll( 'pre code' );
-
-		for( var i = 0, len = hljs_nodes.length; i < len; i++ ) {
-			var element = hljs_nodes[i];
-
-			// trim whitespace if data-trim attribute is present
-			if( element.hasAttribute( 'data-trim' ) && typeof element.innerHTML.trim === 'function' ) {
-				element.innerHTML = element.innerHTML.trim();
-			}
-
-			// Now escape html unless prevented by author
-			if( ! element.hasAttribute( 'data-noescape' )) {
-				element.innerHTML = element.innerHTML.replace(/</g,"&lt;").replace(/>/g,"&gt;");
-			}
-
-			// re-highlight when focus is lost (for edited code)
-			element.addEventListener( 'focusout', function( event ) {
-				hljs.highlightBlock( event.currentTarget );
-			}, false );
-		}
-	}
-})();
-// END CUSTOM REVEAL.JS INTEGRATION
-
-// highlight.js build includes support for:
-// All languages in master + fsharp
-
-
-var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+(q.parentNode?q.parentNode.className:"")).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(r){function o(s){return(s&&s.source)||s}function p(t,s){return RegExp(o(t),"m"+(r.cI?"i":"")+(s?"g":""))}function q(z,x){if(z.compiled){return}z.compiled=true;var u=[];if(z.k){var s={};function A(B,t){t.split(" ").forEach(function(C){var D=C.split("|");s[D[0]]=[B,D[1]?Number(D[1]):1];u.push(D[0])})}z.lR=p(z.l||hljs.IR+"(?!\\.)",true);if(typeof z.k=="string"){A("keyword",z.k)}else{for(var y in z.k){if(!z.k.hasOwnProperty(y)){continue}A(y,z.k[y])}}z.k=s}if(x){if(z.bWK){z.b="\\b("+u.join("|")+")\\b(?!\\.)\\s*"}z.bR=p(z.b?z.b:"\\B|\\b");if(!z.e&&!z.eW){z.e="\\B|\\b"}if(z.e){z.eR=p(z.e)}z.tE=o(z.e)||"";if(z.eW&&x.tE){z.tE+=(z.e?"|":"")+x.tE}}if(z.i){z.iR=p(z.i)}if(z.r===undefined){z.r=1}if(!z.c){z.c=[]}for(var w=0;w<z.c.length;w++){if(z.c[w]=="self"){z.c[w]=z}q(z.c[w],z)}if(z.starts){q(z.starts,x)}var v=[];for(var w=0;w<z.c.length;w++){v.push(o(z.c[w].b))}if(z.tE){v.push(o(z.tE))}if(z.i){v.push(o(z.i))}z.t=v.length?p(v.join("|"),true):{exec:function(t){return null}}}q(r)}function d(E,F,C){function o(r,N){for(var M=0;M<N.c.length;M++){var L=N.c[M].bR.exec(r);if(L&&L.index==0){return N.c[M]}}}function s(L,r){if(L.e&&L.eR.test(r)){return L}if(L.eW){return s(L.parent,r)}}function t(r,L){return !C&&L.i&&L.iR.test(r)}function y(M,r){var L=G.cI?r[0].toLowerCase():r[0];return M.k.hasOwnProperty(L)&&M.k[L]}function H(){var L=l(w);if(!A.k){return L}var r="";var O=0;A.lR.lastIndex=0;var M=A.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=y(A,M);if(N){v+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=A.lR.lastIndex;M=A.lR.exec(L)}return r+L.substr(O)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function K(){return A.sL!==undefined?z():H()}function J(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){x+=L;w=""}else{if(M.eB){x+=l(r)+L;w=""}else{x+=L;w=r}}A=Object.create(M,{parent:{value:A}})}function D(L,r){w+=L;if(r===undefined){x+=K();return 0}var N=o(r,A);if(N){x+=K();J(N,r);return N.rB?0:r.length}var O=s(A,r);if(O){var M=A;if(!(M.rE||M.eE)){w+=r}x+=K();do{if(A.cN){x+="</span>"}B+=A.r;A=A.parent}while(A!=O.parent);if(M.eE){x+=l(r)}w="";if(O.starts){J(O.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw new Error('Illegal lexem "'+r+'" for mode "'+(A.cN||"<unnamed>")+'"')}w+=r;return r.length||1}var G=e[E];f(G);var A=G;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(F);if(!u){break}q=D(F.substr(p,u.index-p),u[0]);p=u.index+q}D(F.substr(p));return{r:B,keyword_count:v,value:x,language:E}}catch(I){if(I.message.indexOf("Illegal")!=-1){return{r:0,keyword_count:0,value:l(F)}}else{throw I}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s,false);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v,true):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES["1c"]=function(b){var f="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";var c="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";var e="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a],r:0};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функция)",e:"$",l:f,k:"процедура функция",c:[{cN:"title",b:f},{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"экспорт",eW:true,l:f,k:"экспорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}}(hljs);hljs.LANGUAGES.actionscript=function(a){var d="[a-zA-Z_$][a-zA-Z0-9_$]*";var c="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var e={cN:"rest_arg",b:"[.]{3}",e:d,r:10};var b={cN:"title",b:d};return{k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:"package",bWK:true,e:"{",k:"package",c:[b]},{cN:"class",bWK:true,e:"{",k:"class interface",c:[{bWK:true,k:"extends implements"},b]},{cN:"preprocessor",bWK:true,e:";",k:"import include"},{cN:"function",bWK:true,e:"[{;]",k:"function",i:"\\S",c:[b,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,e]},{cN:"type",b:":",e:c,r:10}]}]}}(hljs);hljs.LANGUAGES.apache=function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,k:{keyword:"acceptfilter acceptmutex acceptpathinfo accessfilename action addalt addaltbyencoding addaltbytype addcharset adddefaultcharset adddescription addencoding addhandler addicon addiconbyencoding addiconbytype addinputfilter addlanguage addmoduleinfo addoutputfilter addoutputfilterbytype addtype alias aliasmatch allow allowconnect allowencodedslashes allowoverride anonymous anonymous_logemail anonymous_mustgiveemail anonymous_nouserid anonymous_verifyemail authbasicauthoritative authbasicprovider authdbduserpwquery authdbduserrealmquery authdbmgroupfile authdbmtype authdbmuserfile authdefaultauthoritative authdigestalgorithm authdigestdomain authdigestnccheck authdigestnonceformat authdigestnoncelifetime authdigestprovider authdigestqop authdigestshmemsize authgroupfile authldapbinddn authldapbindpassword authldapcharsetconfig authldapcomparednonserver authldapdereferencealiases authldapgroupattribute authldapgroupattributeisdn authldapremoteuserattribute authldapremoteuserisdn authldapurl authname authnprovideralias authtype authuserfile authzdbmauthoritative authzdbmtype authzdefaultauthoritative authzgroupfileauthoritative authzldapauthoritative authzownerauthoritative authzuserauthoritative balancermember browsermatch browsermatchnocase bufferedlogs cachedefaultexpire cachedirlength cachedirlevels cachedisable cacheenable cachefile cacheignorecachecontrol cacheignoreheaders cacheignorenolastmod cacheignorequerystring cachelastmodifiedfactor cachemaxexpire cachemaxfilesize cacheminfilesize cachenegotiateddocs cacheroot cachestorenostore cachestoreprivate cgimapextension charsetdefault charsetoptions charsetsourceenc checkcaseonly checkspelling chrootdir contentdigest cookiedomain cookieexpires cookielog cookiename cookiestyle cookietracking coredumpdirectory customlog dav davdepthinfinity davgenericlockdb davlockdb davmintimeout dbdexptime dbdkeep dbdmax dbdmin dbdparams dbdpersist dbdpreparesql dbdriver defaulticon defaultlanguage defaulttype deflatebuffersize deflatecompressionlevel deflatefilternote deflatememlevel deflatewindowsize deny directoryindex directorymatch directoryslash documentroot dumpioinput dumpiologlevel dumpiooutput enableexceptionhook enablemmap enablesendfile errordocument errorlog example expiresactive expiresbytype expiresdefault extendedstatus extfilterdefine extfilteroptions fileetag filterchain filterdeclare filterprotocol filterprovider filtertrace forcelanguagepriority forcetype forensiclog gracefulshutdowntimeout group header headername hostnamelookups identitycheck identitychecktimeout imapbase imapdefault imapmenu include indexheadinsert indexignore indexoptions indexorderdefault indexstylesheet isapiappendlogtoerrors isapiappendlogtoquery isapicachefile isapifakeasync isapilognotsupported isapireadaheadbuffer keepalive keepalivetimeout languagepriority ldapcacheentries ldapcachettl ldapconnectiontimeout ldapopcacheentries ldapopcachettl ldapsharedcachefile ldapsharedcachesize ldaptrustedclientcert ldaptrustedglobalcert ldaptrustedmode ldapverifyservercert limitinternalrecursion limitrequestbody limitrequestfields limitrequestfieldsize limitrequestline limitxmlrequestbody listen listenbacklog loadfile loadmodule lockfile logformat loglevel maxclients maxkeepaliverequests maxmemfree maxrequestsperchild maxrequestsperthread maxspareservers maxsparethreads maxthreads mcachemaxobjectcount mcachemaxobjectsize mcachemaxstreamingbuffer mcacheminobjectsize mcacheremovalalgorithm mcachesize metadir metafiles metasuffix mimemagicfile minspareservers minsparethreads mmapfile mod_gzip_on mod_gzip_add_header_count mod_gzip_keep_workfiles mod_gzip_dechunk mod_gzip_min_http mod_gzip_minimum_file_size mod_gzip_maximum_file_size mod_gzip_maximum_inmem_size mod_gzip_temp_dir mod_gzip_item_include mod_gzip_item_exclude mod_gzip_command_version mod_gzip_can_negotiate mod_gzip_handle_methods mod_gzip_static_suffix mod_gzip_send_vary mod_gzip_update_static modmimeusepathinfo multiviewsmatch namevirtualhost noproxy nwssltrustedcerts nwsslupgradeable options order passenv pidfile protocolecho proxybadheader proxyblock proxydomain proxyerroroverride proxyftpdircharset proxyiobuffersize proxymaxforwards proxypass proxypassinterpolateenv proxypassmatch proxypassreverse proxypassreversecookiedomain proxypassreversecookiepath proxypreservehost proxyreceivebuffersize proxyremote proxyremotematch proxyrequests proxyset proxystatus proxytimeout proxyvia readmename receivebuffersize redirect redirectmatch redirectpermanent redirecttemp removecharset removeencoding removehandler removeinputfilter removelanguage removeoutputfilter removetype requestheader require rewritebase rewritecond rewriteengine rewritelock rewritelog rewriteloglevel rewritemap rewriteoptions rewriterule rlimitcpu rlimitmem rlimitnproc satisfy scoreboardfile script scriptalias scriptaliasmatch scriptinterpretersource scriptlog scriptlogbuffer scriptloglength scriptsock securelisten seerequesttail sendbuffersize serveradmin serveralias serverlimit servername serverpath serverroot serversignature servertokens setenv setenvif setenvifnocase sethandler setinputfilter setoutputfilter ssienableaccess ssiendtag ssierrormsg ssistarttag ssitimeformat ssiundefinedecho sslcacertificatefile sslcacertificatepath sslcadnrequestfile sslcadnrequestpath sslcarevocationfile sslcarevocationpath sslcertificatechainfile sslcertificatefile sslcertificatekeyfile sslciphersuite sslcryptodevice sslengine sslhonorciperorder sslmutex ssloptions sslpassphrasedialog sslprotocol sslproxycacertificatefile sslproxycacertificatepath sslproxycarevocationfile sslproxycarevocationpath sslproxyciphersuite sslproxyengine sslproxymachinecertificatefile sslproxymachinecertificatepath sslproxyprotocol sslproxyverify sslproxyverifydepth sslrandomseed sslrequire sslrequiressl sslsessioncache sslsessioncachetimeout sslusername sslverifyclient sslverifydepth startservers startthreads substitute suexecusergroup threadlimit threadsperchild threadstacksize timeout traceenable transferlog typesconfig unsetenv usecanonicalname usecanonicalphysicalport user userdir virtualdocumentroot virtualdocumentrootip virtualscriptalias virtualscriptaliasip win32disableacceptex xbithack",literal:"on off"},c:[a.HCM,{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,{cN:"tag",b:"</?",e:">"},a.QSM]}}(hljs);hljs.LANGUAGES.applescript=function(a){var b=a.inherit(a.QSM,{i:""});var e={cN:"title",b:a.UIR};var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bWK:true,k:"on",i:"[${=;\\n]",c:[e,d]}].concat(c),i:"//"}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);hljs.LANGUAGES.asciidoc=function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{4,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}}(hljs);hljs.LANGUAGES.avrasm=function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$"},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}}(hljs);hljs.LANGUAGES.axapta=function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"{",i:":",k:"class interface",c:[{cN:"inheritance",bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]}]}}(hljs);hljs.LANGUAGES.bash=function(a){var c={cN:"variable",b:/\$[\w\d#@][\w\d_]*/};var b={cN:"variable",b:/\$\{(.*?)\}/};var e={cN:"string",b:/"/,e:/"/,c:[a.BE,c,b,{cN:"variable",b:/\$\(/,e:/\)/,c:a.BE}],r:0};var d={cN:"string",b:/'/,e:/'/,r:0};return{l:/-?[a-z]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[{cN:"title",b:/\w[\w\d_]*/}],r:0},a.HCM,a.NM,e,d,c,b]}}(hljs);hljs.LANGUAGES.brainfuck=function(a){return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",eE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]"},{cN:"literal",b:"[\\+\\-]"}]}}(hljs);hljs.LANGUAGES.clojure=function(l){var e={built_in:"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for doseq dosync dotimes and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import intern refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! import use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if throw printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time ns assert re-find re-groups rand-int rand mod locking assert-valid-fdecl alias namespace resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! memfn to-array future future-call into-array aset gen-class reduce merge map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j={cN:"string",b:'"',e:'"',c:[l.BE],r:0};var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:"\\S",c:[o,m]}}(hljs);hljs.LANGUAGES.cmake=function(a){return{cI:true,k:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file",c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}}(hljs);hljs.LANGUAGES.coffeescript=function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f={cN:"title",b:a};var e={cN:"subst",b:"#\\{",e:"}",k:b,};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",b:"'''",e:"'''",c:[c.BE]},{cN:"string",b:"'",e:"'",c:[c.BE],r:0},{cN:"string",b:'"""',e:'"""',c:[c.BE,e]},{cN:"string",b:'"',e:'"',c:[c.BE,e],r:0},{cN:"regexp",b:"///",e:"///",c:[c.HCM]},{cN:"regexp",b:"//[gim]*",r:0},{cN:"regexp",b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bWK:true,k:"class",e:"$",i:"[:\\[\\]]",c:[{bWK:true,k:"extends",eW:true,i:":",c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true}])}}(hljs);hljs.LANGUAGES.cpp=function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.css=function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.d=function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?',r:0};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}}(hljs);hljs.LANGUAGES.delphi=function(b){var f="and safecall cdecl then string exports library not pascal set virtual file in array label packed end. index while const raise for to implementation with except overload destructor downto finally program exit unit inherited override if type until function do begin repeat goto nil far initialization object else var uses external resourcestring interface end finalization class asm mod case on shr shl of register xorwrite threadvar try record near stored constructor stdcall inline div out or procedure";var e="safecall stdcall pascal stored const implementation finalization except to finally program inherited override then exports string read not mod shr try div shl set library message packed index for near overload label downto exit public goto interface asm on of constructor or private array unit raise destructor var type until function else external with case default record while protected property procedure published and cdecl do threadvar file in if end virtual write far out begin repeat nil initialization object uses resourcestring class register xorwrite inline static";var a={cN:"comment",b:"{",e:"}",r:0};var g={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}],r:0};var d={cN:"string",b:"(#\\d+)+"};var h={cN:"function",bWK:true,e:"[:;]",k:"function constructor|10 destructor|10 procedure|10",c:[{cN:"title",b:b.IR},{cN:"params",b:"\\(",e:"\\)",k:f,c:[c,d]},a,g]};return{cI:true,k:f,i:'("|\\$[G-Zg-z]|\\/\\*|</)',c:[a,g,b.CLCM,c,d,b.NM,h,{cN:"class",b:"=\\bclass\\b",e:"end;",k:e,c:[c,d,a,g,b.CLCM,h]}]}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.django=function(c){function e(h,g){return(g==undefined||(!h.cN&&g.cN=="tag")||h.cN=="value")}function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}if(e(l,k)){m=b.concat(m)}if(m.length){g.c=m}}return g}var d={cN:"filter",b:"\\|[A-Za-z]+\\:?",k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:'"',e:'"'}]};var b=[{cN:"template_comment",b:"{%\\s*comment\\s*%}",e:"{%\\s*endcomment\\s*%}"},{cN:"template_comment",b:"{#",e:"#}"},{cN:"template_tag",b:"{%",e:"%}",k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[d]},{cN:"variable",b:"{{",e:"}}",c:[d]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.dos=function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}}(hljs);hljs.LANGUAGES["erlang-repl"]=function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}}(hljs);hljs.LANGUAGES.erlang=function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#",e:"}",i:".",r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",eW:true,r:0}]};var k={k:f,b:"(fun|receive|if|try|case)",e:"end"};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(</|\\*=|\\+=|-=|/=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+c+"\\s*\\(",e:"->",rB:true,i:"\\(|#|//|/\\*|\\\\|:",c:[d,{cN:"title",b:c}],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}}(hljs);hljs.LANGUAGES.fsharp=function(a){var b="'[a-zA-Z0-9_]+";return{k:"yield! return! let! do!abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun|10 function global if in inherit inline interface internal lazy let match member module mutable|10 namespace new null of open or override private public rec|10 return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"//",e:"$",rB:true},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bWK:true,e:"\\(|=|$",k:"type",c:[{cN:"title",b:a.UIR}]},{cN:"annotation",b:"\\[<",e:">\\]",r:10},{cN:"typeparam",b:"<",e:">",c:[{cN:"title",b:b}]},a.CLCM,a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}}(hljs);hljs.LANGUAGES.glsl=function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}}(hljs);hljs.LANGUAGES.go=function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"string",b:"`",e:"`"},{cN:"number",b:"[^a-zA-Z_0-9](\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?",r:0},a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.haml=function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(-#|/).*$",r:0},{b:"^\\s*-(?!#)",starts:{e:"\\n",sL:"ruby"},r:0},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+",r:0},{cN:"value",b:"[#\\.]\\w+",r:0},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,r:0,c:[{cN:"symbol",b:":\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,r:0,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0}],r:10},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"},r:0}]}}(hljs);hljs.LANGUAGES.handlebars=function(c){function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}m=d.concat(m);if(m.length){g.c=m}}return g}var b="each in with if else unless bindattr action collection debugger log outlet template unbound view yield";var e={cN:"variable",b:"[a-zA-Z.]+",k:b};var d=[{cN:"expression",b:"{{",e:"}}",c:[{cN:"begin-block",b:"#[a-zA-Z .]+",k:b},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z .]+",k:b},{cN:"variable",b:"[a-zA-Z.]+",k:b}]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.haskell=function(a){var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},{cN:"title",b:"[_a-z][\\w']*"}]};var b={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance not as foreign ccall safe unsafe",c:[{cN:"comment",b:"--",e:"$"},{cN:"preprocessor",b:"{-#",e:"#-}"},{cN:"comment",c:["self"],b:"{-",e:"-}"},{cN:"string",b:"\\s+'",e:"'",c:[a.BE],r:0},a.QSM,{cN:"import",b:"\\bimport",e:"$",k:"import qualified as hiding",c:[c],i:"\\W\\.|;"},{cN:"module",b:"\\bmodule",e:"where",k:"module where",c:[c],i:"\\W\\.|;"},{cN:"class",b:"\\b(class|instance)",e:"where",k:"class where instance",c:[d]},{cN:"typedef",b:"\\b(data|(new)?type)",e:"$",k:"data type newtype deriving",c:[d,c,b]},a.CNM,{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},d,{cN:"title",b:"^[_a-z][\\w']*"},{b:"->|<-"}]}}(hljs);hljs.LANGUAGES.http=function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}}(hljs);hljs.LANGUAGES.ini=function(a){return{cI:true,i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}}(hljs);hljs.LANGUAGES.java=function(a){return{k:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,{cN:"class",bWK:true,e:"{",k:"class interface",eE:true,i:":",c:[{bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,sL:"xml"}],r:0},{cN:"function",bWK:true,e:/{/,k:"function",c:[{cN:"title",b:/[A-Za-z$_][0-9A-Za-z$_]*/},{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);hljs.LANGUAGES.lasso=function(b){var a="[a-zA-Z_][a-zA-Z0-9_.]*|&[lg]t;";var c="<\\?(lasso(script)?|=)";return{cI:true,l:a,k:{literal:"true false none minimal full all infinity nan and or not bw ew cn lt lte gt gte eq neq ft rx nrx",built_in:"array date decimal duration integer map pair string tag xml null list queue set stack staticarray local var variable data global self inherited void",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require skip split_thread sum take thread to trait type where with yield"},c:[{cN:"preprocessor",b:"\\]|\\?>",r:0,starts:{cN:"markup",e:"\\[|"+c,rE:true}},{cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true}},{cN:"preprocessor",b:"\\[no_square_brackets|\\[/noprocess|"+c},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10},b.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},b.CBLCLM,b.CNM,b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",b:"#\\d+|[#$]"+a},{cN:"tag",b:"::",e:a},{cN:"attribute",b:"\\.\\.\\.|-"+b.UIR},{cN:"class",bWK:true,k:"define",eE:true,e:"\\(|=>",c:[{cN:"title",b:b.UIR+"=?"}]}]}}(hljs);hljs.LANGUAGES.lisp=function(i){var l="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var m="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var k={cN:"shebang",b:"^#!",e:"$"};var a={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d=[{cN:"number",b:m},{cN:"number",b:"#b[0-1]+(/[0-1]+)?"},{cN:"number",b:"#o[0-7]+(/[0-7]+)?"},{cN:"number",b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{cN:"number",b:"#c\\("+m+" +"+m,e:"\\)"}];var h={cN:"string",b:'"',e:'"',c:[i.BE],r:0};var n={cN:"comment",b:";",e:"$"};var g={cN:"variable",b:"\\*",e:"\\*"};var o={cN:"keyword",b:"[:&]"+l};var b={b:"\\(",e:"\\)",c:["self",a,h].concat(d)};var e={cN:"quoted",b:"['`]\\(",e:"\\)",c:d.concat([h,g,o,b])};var c={cN:"quoted",b:"\\(quote ",e:"\\)",k:{title:"quote"},c:d.concat([h,g,o,b])};var j={cN:"list",b:"\\(",e:"\\)"};var f={eW:true,r:0};j.c=[{cN:"title",b:l},f];f.c=[e,c,j,a].concat(d).concat([h,n,g,o]);return{i:"[^\\s]",c:d.concat([k,a,h,n,e,c,j])}}(hljs);hljs.LANGUAGES.lua=function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bWK:true,e:"\\)",k:"function",c:[{cN:"title",b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"},{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}}(hljs);hljs.LANGUAGES.markdown=function(a){return{c:[{cN:"header",b:"^#{1,3}",e:"$"},{cN:"header",b:"^.+?\\n[=-]{2,}$"},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",b:"\\*.+?\\*"},{cN:"emphasis",b:"_.+?_",r:0},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",b:"`.+?`"},{cN:"code",b:"^    ",e:"$",r:0},{cN:"horizontal_rule",b:"^-{3,}",e:"$"},{b:"\\[.+?\\]\\(.+?\\)",rB:true,c:[{cN:"link_label",b:"\\[.+\\]"},{cN:"link_url",b:"\\(",e:"\\)",eB:true,eE:true}]}]}}(hljs);hljs.LANGUAGES.matlab=function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bWK:true,e:"$",k:"function",c:[{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:""},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b},{cN:"comment",b:"\\%",e:"$"}].concat(b)}}(hljs);hljs.LANGUAGES.mel=function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:"</",c:[a.CNM,a.ASM,a.QSM,{cN:"string",b:"`",e:"`",c:[a.BE]},{cN:"variable",b:"\\$\\d",r:5},{cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)"},a.CLCM,a.CBLCLM]}}(hljs);hljs.LANGUAGES.mizar=function(a){return{k:["environ vocabularies notations constructors definitions registrations theorems schemes requirements","begin end definition registration cluster existence pred func defpred deffunc theorem proof","let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from","be being by means equals implies iff redefine define now not or attr is mode suppose per cases set","thesis contradiction scheme reserve struct","correctness compatibility coherence symmetry assymetry reflexivity irreflexivity","connectedness uniqueness commutativity idempotence involutiveness projectivity"].join(" "),c:[{cN:"comment",b:"::",e:"$"}]}}(hljs);hljs.LANGUAGES.nginx=function(b){var c=[{cN:"variable",b:"\\$\\d+"},{cN:"variable",b:"\\${",e:"}"},{cN:"variable",b:"[\\$\\@]"+b.UIR}];var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[b.HCM,{cN:"string",b:'"',e:'"',c:[b.BE].concat(c),r:0},{cN:"string",b:"'",e:"'",c:[b.BE].concat(c),r:0},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",b:"\\s\\^",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"~\\*?\\s+",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"\\*(\\.[a-z\\-]+)+",c:[b.BE].concat(c)},{cN:"regexp",b:"([a-z\\-]+\\.)+\\*",c:[b.BE].concat(c)},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0}].concat(c)};return{c:[b.HCM,{b:b.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:b.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}}(hljs);hljs.LANGUAGES.objectivec=function(a){var b={keyword:"int float while private char catch export sizeof typedef const struct for union unsigned long volatile static protected bool mutable if public do return goto void enum else break extern asm case short default double throw register explicit signed typename try this switch continue wchar_t inline readonly assign property self synchronized end synthesize id optional required nonatomic super unichar finally dynamic IBOutlet IBAction selector strong weak readonly",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"({|$)",k:"interface class protocol implementation",c:[{cN:"id",b:a.UIR}]},{cN:"variable",b:"\\."+a.UIR,r:0}]}}(hljs);hljs.LANGUAGES.parser3=function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}}(hljs);hljs.LANGUAGES.perl=function(e){var a="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var d={cN:"subst",b:"[$@]\\{",e:"\\}",k:a,r:10};var b={cN:"variable",b:"\\$\\d"};var i={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var f=[e.BE,d,b,i];var h={b:"->",c:[{b:e.IR},{b:"{",e:"}"}]};var g={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var c=[b,i,e.HCM,g,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},h,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:f,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:f,r:5},{cN:"string",b:"'",e:"'",c:[e.BE],r:0},{cN:"string",b:'"',e:'"',c:f,r:0},{cN:"string",b:"`",e:"`",c:[e.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"("+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,g,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bWK:true,e:"(\\s*\\(.*?\\))?[;{]",k:"sub",r:5},{cN:"operator",b:"-\\w\\b",r:0}];d.c=c;h.c[1].c=c;return{k:a,c:c}}(hljs);hljs.LANGUAGES.php=function(a){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var b=[a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),{cN:"string",b:'b"',e:'"',c:[a.BE]},{cN:"string",b:"b'",e:"'",c:[a.BE]}];var c=[a.BNM,a.CNM];var d={cN:"title",b:a.UIR};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return implements parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception php_user_filter default die require __FUNCTION__ enddeclare final try this switch continue endfor endif declare unset true false namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ __halt_compiler",c:[a.CLCM,a.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"}]},{cN:"comment",eB:true,b:"__halt_compiler.+?;",eW:true},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[a.BE]},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"},e,{cN:"function",bWK:true,e:"{",k:"function",i:"\\$|\\[|%",c:[d,{cN:"params",b:"\\(",e:"\\)",c:["self",e,a.CBLCLM].concat(b).concat(c)}]},{cN:"class",bWK:true,e:"{",k:"class",i:"[:\\(\\$]",c:[{bWK:true,eW:true,k:"extends",c:[d]},d]},{b:"=>"}].concat(b).concat(c)}}(hljs);hljs.LANGUAGES.profile=function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[{cN:"title",b:a.UIR,r:0}],r:0}]}}(hljs);hljs.LANGUAGES.python=function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var c=[{cN:"string",b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{cN:"string",b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{cN:"string",b:/(u|r|ur)'/,e:/'/,c:[a.BE],r:10},{cN:"string",b:/(u|r|ur)"/,e:/"/,c:[a.BE],r:10},{cN:"string",b:/(b|br)'/,e:/'/,c:[a.BE]},{cN:"string",b:/(b|br)"/,e:/"/,c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:/\(/,e:/\)/,c:["self",a.CNM,f].concat(c)};var b={bWK:true,e:/:/,i:/[${=;\n]/,c:[e,d],r:10};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10",built_in:"None True False Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:c.concat([f,a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}])}}(hljs);hljs.LANGUAGES.r=function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[a.BE],r:0},{cN:"string",b:"'",e:"'",c:[a.BE],r:0}]}}(hljs);hljs.LANGUAGES.rib=function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"</",c:[a.HCM,a.CNM,a.ASM,a.QSM]}}(hljs);hljs.LANGUAGES.rsl=function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"shader",bWK:true,e:"\\(",k:"surface displacement light volume imager"},{cN:"shading",bWK:true,e:"\\(",k:"illuminate illuminance gather"}]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.ruleslanguage=function(a){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEMASK|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN DELETE SAVE SAVE_UPDATE CLEAR DETERMINANT LABEL REPORT REVENUE ABORT CALL DONE LEAVE EACH IN LIST NOVALUE FROM TOTAL CHARGE BLOCK AND OR CSV_FILE BILL_PERIOD RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM ABORT WARN NUMDAYS RATE_CODE READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"array",b:"#[a-zA-Z .]+"}]}}(hljs);hljs.LANGUAGES.rust=function(b){var d={cN:"title",b:b.UIR};var c={cN:"number",b:"\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\.[0-9_]+)?([uif](8|16|32|64)?)?)",r:0};var a="assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while";return{k:a,i:"</",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:"function",bWK:true,e:"(\\(|<)",k:"fn",c:[d]},{cN:"preprocessor",b:"#\\[",e:"\\]"},{bWK:true,e:"(=|<)",k:"type",c:[d],i:"\\S"},{bWK:true,e:"({|<)",k:"trait enum",c:[d],i:"\\S"}]}}(hljs);hljs.LANGUAGES.scala=function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,b,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bWK:true,k:"extends with",r:10},{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}}(hljs);hljs.LANGUAGES.scss=function(a){var c="[a-zA-Z-][a-zA-Z0-9_-]*";var d={cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};var b={cN:"hexcolor",b:"#[0-9A-Fa-f]+"};var e={cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"important",b:"!important"}]}};return{cI:true,i:"[=/|']",c:[a.CLCM,a.CBLCLM,{cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]},{cN:"id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{cN:"pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{cN:"value",b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{cN:"value",b:":",e:";",c:[b,a.NM,a.QSM,a.ASM,{cN:"important",b:"!important"}]},{cN:"at_rule",b:"@",e:"[{;]",k:"mixin include for extend charset import media page font-face namespace",c:[d,a.QSM,a.ASM,b,a.NM,{cN:"preprocessor",b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}}(hljs);hljs.LANGUAGES.smalltalk=function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"',r:0},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":"},a.CNM,c,d,{cN:"localvars",b:"\\|\\s*"+b+"(\\s+"+b+")*\\s*\\|"},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}}(hljs);hljs.LANGUAGES.sql=function(a){return{cI:true,c:[{cN:"operator",b:"(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}],r:0},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}}(hljs);hljs.LANGUAGES.tex=function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}}(hljs);hljs.LANGUAGES.vala=function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bWK:true,e:"{",k:"class interface delegate namespace",i:"[^,:\\n\\s\\.]",c:[{cN:"title",b:a.UIR}]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}}(hljs);hljs.LANGUAGES.vbnet=function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"(//|endif|gosub|variant|wend)",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}}(hljs);hljs.LANGUAGES.vbscript=function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$"},a.CNM]}}(hljs);hljs.LANGUAGES.vhdl=function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/leap/leap.js b/docs/slides/BOS14/_support/reveal.js/plugin/leap/leap.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/leap/leap.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2013, Leap Motion, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Version 0.2.0 - http://js.leapmotion.com/0.2.0/leap.min.js
- * Grab latest versions from http://js.leapmotion.com/
- */
-
-!function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i}({1:[function(require,module,exports){var chooseProtocol=require("./protocol").chooseProtocol,EventEmitter=require("events").EventEmitter,_=require("underscore");var BaseConnection=module.exports=function(opts){this.opts=_.defaults(opts||{},{host:"127.0.0.1",enableGestures:false,port:6437,enableHeartbeat:true,heartbeatInterval:100,requestProtocolVersion:3});this.host=opts.host;this.port=opts.port;this.on("ready",function(){this.enableGestures(this.opts.enableGestures);if(this.opts.enableHeartbeat)this.startHeartbeat()});this.on("disconnect",function(){if(this.opts.enableHeartbeat)this.stopHeartbeat()});this.heartbeatTimer=null};BaseConnection.prototype.getUrl=function(){return"ws://"+this.host+":"+this.port+"/v"+this.opts.requestProtocolVersion+".json"};BaseConnection.prototype.sendHeartbeat=function(){if(this.protocol){this.setHeartbeatState(true);this.protocol.sendHeartbeat(this)}};BaseConnection.prototype.handleOpen=function(){this.emit("connect")};BaseConnection.prototype.enableGestures=function(enabled){this.gesturesEnabled=enabled?true:false;this.send(this.protocol.encode({enableGestures:this.gesturesEnabled}))};BaseConnection.prototype.handleClose=function(){this.disconnect();this.startReconnection()};BaseConnection.prototype.startReconnection=function(){var connection=this;setTimeout(function(){connection.connect()},1e3)};BaseConnection.prototype.disconnect=function(){if(!this.socket)return;this.socket.close();delete this.socket;delete this.protocol;this.emit("disconnect")};BaseConnection.prototype.handleData=function(data){var message=JSON.parse(data);var messageEvent;if(this.protocol===undefined){messageEvent=this.protocol=chooseProtocol(message);this.emit("ready")}else{messageEvent=this.protocol(message)}this.emit(messageEvent.type,messageEvent)};BaseConnection.prototype.connect=function(){if(this.socket)return;this.socket=this.setupSocket();return true};BaseConnection.prototype.send=function(data){this.socket.send(data)};BaseConnection.prototype.stopHeartbeat=function(){if(!this.heartbeatTimer)return;clearInterval(this.heartbeatTimer);delete this.heartbeatTimer;this.setHeartbeatState(false)};BaseConnection.prototype.setHeartbeatState=function(state){if(this.heartbeatState===state)return;this.heartbeatState=state;this.emit(this.heartbeatState?"focus":"blur")};_.extend(BaseConnection.prototype,EventEmitter.prototype)},{"./protocol":12,events:17,underscore:20}],2:[function(require,module,exports){var CircularBuffer=module.exports=function(size){this.pos=0;this._buf=[];this.size=size};CircularBuffer.prototype.get=function(i){if(i==undefined)i=0;if(i>=this.size)return undefined;if(i>=this._buf.length)return undefined;return this._buf[(this.pos-i-1)%this.size]};CircularBuffer.prototype.push=function(o){this._buf[this.pos%this.size]=o;return this.pos++}},{}],3:[function(require,module,exports){var Connection=module.exports=require("./base_connection");Connection.prototype.setupSocket=function(){var connection=this;var socket=new WebSocket(this.getUrl());socket.onopen=function(){connection.handleOpen()};socket.onmessage=function(message){connection.handleData(message.data)};socket.onclose=function(){connection.handleClose()};return socket};Connection.prototype.startHeartbeat=function(){if(!this.protocol.sendHeartbeat||this.heartbeatTimer)return;var connection=this;var propertyName=null;if(typeof document.hidden!=="undefined"){propertyName="hidden"}else if(typeof document.mozHidden!=="undefined"){propertyName="mozHidden"}else if(typeof document.msHidden!=="undefined"){propertyName="msHidden"}else if(typeof document.webkitHidden!=="undefined"){propertyName="webkitHidden"}else{propertyName=undefined}var windowVisible=true;var focusListener=window.addEventListener("focus",function(e){windowVisible=true});var blurListener=window.addEventListener("blur",function(e){windowVisible=false});this.on("disconnect",function(){if(connection.heartbeatTimer){clearTimeout(connection.heartbeatTimer);delete connection.heartbeatTimer}window.removeEventListener(focusListener);window.removeEventListener(blurListener)});this.heartbeatTimer=setInterval(function(){var isVisible=propertyName===undefined?true:document[propertyName]===false;if(isVisible&&windowVisible){connection.sendHeartbeat()}else{connection.setHeartbeatState(false)}},this.opts.heartbeatInterval)}},{"./base_connection":1}],4:[function(require,module,exports){!function(process){var Frame=require("./frame"),CircularBuffer=require("./circular_buffer"),Pipeline=require("./pipeline"),EventEmitter=require("events").EventEmitter,gestureListener=require("./gesture").gestureListener,_=require("underscore");var Controller=module.exports=function(opts){var inNode=typeof process!=="undefined"&&process.title==="node";opts=_.defaults(opts||{},{inNode:inNode});this.inNode=opts.inNode;opts=_.defaults(opts||{},{frameEventName:this.useAnimationLoop()?"animationFrame":"deviceFrame",supressAnimationLoop:false});this.supressAnimationLoop=opts.supressAnimationLoop;this.frameEventName=opts.frameEventName;this.history=new CircularBuffer(200);this.lastFrame=Frame.Invalid;this.lastValidFrame=Frame.Invalid;this.lastConnectionFrame=Frame.Invalid;this.accumulatedGestures=[];if(opts.connectionType===undefined){this.connectionType=this.inBrowser()?require("./connection"):require("./node_connection")}else{this.connectionType=opts.connectionType}this.connection=new this.connectionType(opts);this.setupConnectionEvents()};Controller.prototype.gesture=function(type,cb){var creator=gestureListener(this,type);if(cb!==undefined){creator.stop(cb)}return creator};Controller.prototype.inBrowser=function(){return!this.inNode};Controller.prototype.useAnimationLoop=function(){return this.inBrowser()&&typeof chrome==="undefined"};Controller.prototype.connect=function(){var controller=this;if(this.connection.connect()&&this.inBrowser()&&!controller.supressAnimationLoop){var callback=function(){controller.emit("animationFrame",controller.lastConnectionFrame);window.requestAnimFrame(callback)};window.requestAnimFrame(callback)}};Controller.prototype.disconnect=function(){this.connection.disconnect()};Controller.prototype.frame=function(num){return this.history.get(num)||Frame.Invalid};Controller.prototype.loop=function(callback){switch(callback.length){case 1:this.on(this.frameEventName,callback);break;case 2:var controller=this;var scheduler=null;var immediateRunnerCallback=function(frame){callback(frame,function(){if(controller.lastFrame!=frame){immediateRunnerCallback(controller.lastFrame)}else{controller.once(controller.frameEventName,immediateRunnerCallback)}})};this.once(this.frameEventName,immediateRunnerCallback);break}this.connect()};Controller.prototype.addStep=function(step){if(!this.pipeline)this.pipeline=new Pipeline(this);this.pipeline.addStep(step)};Controller.prototype.processFrame=function(frame){if(frame.gestures){this.accumulatedGestures=this.accumulatedGestures.concat(frame.gestures)}if(this.pipeline){frame=this.pipeline.run(frame);if(!frame)frame=Frame.Invalid}this.lastConnectionFrame=frame;this.emit("deviceFrame",frame)};Controller.prototype.processFinishedFrame=function(frame){this.lastFrame=frame;if(frame.valid){this.lastValidFrame=frame}frame.controller=this;frame.historyIdx=this.history.push(frame);if(frame.gestures){frame.gestures=this.accumulatedGestures;this.accumulatedGestures=[];for(var gestureIdx=0;gestureIdx!=frame.gestures.length;gestureIdx++){this.emit("gesture",frame.gestures[gestureIdx],frame)}}this.emit("frame",frame)};Controller.prototype.setupConnectionEvents=function(){var controller=this;this.connection.on("frame",function(frame){controller.processFrame(frame)});this.on(this.frameEventName,function(frame){controller.processFinishedFrame(frame)});this.connection.on("disconnect",function(){controller.emit("disconnect")});this.connection.on("ready",function(){controller.emit("ready")});this.connection.on("connect",function(){controller.emit("connect")});this.connection.on("focus",function(){controller.emit("focus")});this.connection.on("blur",function(){controller.emit("blur")});this.connection.on("protocol",function(protocol){controller.emit("protocol",protocol)});this.connection.on("deviceConnect",function(evt){controller.emit(evt.state?"deviceConnected":"deviceDisconnected")})};_.extend(Controller.prototype,EventEmitter.prototype)}(require("__browserify_process"))},{"./circular_buffer":2,"./connection":3,"./frame":5,"./gesture":6,"./node_connection":16,"./pipeline":10,__browserify_process:18,events:17,underscore:20}],5:[function(require,module,exports){var Hand=require("./hand"),Pointable=require("./pointable"),createGesture=require("./gesture").createGesture,glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,InteractionBox=require("./interaction_box"),_=require("underscore");var Frame=module.exports=function(data){this.valid=true;this.id=data.id;this.timestamp=data.timestamp;this.hands=[];this.handsMap={};this.pointables=[];this.tools=[];this.fingers=[];if(data.interactionBox){this.interactionBox=new InteractionBox(data.interactionBox)}this.gestures=[];this.pointablesMap={};this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.data=data;this.type="frame";this.currentFrameRate=data.currentFrameRate;var handMap={};for(var handIdx=0,handCount=data.hands.length;handIdx!=handCount;handIdx++){var hand=new Hand(data.hands[handIdx]);hand.frame=this;this.hands.push(hand);this.handsMap[hand.id]=hand;handMap[hand.id]=handIdx}for(var pointableIdx=0,pointableCount=data.pointables.length;pointableIdx!=pointableCount;pointableIdx++){var pointable=new Pointable(data.pointables[pointableIdx]);pointable.frame=this;this.pointables.push(pointable);this.pointablesMap[pointable.id]=pointable;(pointable.tool?this.tools:this.fingers).push(pointable);if(pointable.handId!==undefined&&handMap.hasOwnProperty(pointable.handId)){var hand=this.hands[handMap[pointable.handId]];hand.pointables.push(pointable);(pointable.tool?hand.tools:hand.fingers).push(pointable)}}if(data.gestures){for(var gestureIdx=0,gestureCount=data.gestures.length;gestureIdx!=gestureCount;gestureIdx++){this.gestures.push(createGesture(data.gestures[gestureIdx]))}}};Frame.prototype.tool=function(id){var pointable=this.pointable(id);return pointable.tool?pointable:Pointable.Invalid};Frame.prototype.pointable=function(id){return this.pointablesMap[id]||Pointable.Invalid};Frame.prototype.finger=function(id){var pointable=this.pointable(id);return!pointable.tool?pointable:Pointable.Invalid};Frame.prototype.hand=function(id){return this.handsMap[id]||Hand.Invalid};Frame.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Frame.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceFrame._rotation[5],this._rotation[2]-sinceFrame._rotation[6],this._rotation[3]-sinceFrame._rotation[1]])};Frame.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);return mat3.multiply(mat3.create(),sinceFrame._rotation,transpose)};Frame.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;return Math.exp(this._scaleFactor-sinceFrame._scaleFactor)};Frame.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.subtract(vec3.create(),this._translation,sinceFrame._translation)};Frame.prototype.toString=function(){var str="Frame [ id:"+this.id+" | timestamp:"+this.timestamp+" | Hand count:("+this.hands.length+") | Pointable count:("+this.pointables.length+")";if(this.gestures)str+=" | Gesture count:("+this.gestures.length+")";str+=" ]";return str};Frame.prototype.dump=function(){var out="";out+="Frame Info:<br/>";out+=this.toString();out+="<br/><br/>Hands:<br/>";for(var handIdx=0,handCount=this.hands.length;handIdx!=handCount;handIdx++){out+="  "+this.hands[handIdx].toString()+"<br/>"}out+="<br/><br/>Pointables:<br/>";for(var pointableIdx=0,pointableCount=this.pointables.length;pointableIdx!=pointableCount;pointableIdx++){out+="  "+this.pointables[pointableIdx].toString()+"<br/>"}if(this.gestures){out+="<br/><br/>Gestures:<br/>";for(var gestureIdx=0,gestureCount=this.gestures.length;gestureIdx!=gestureCount;gestureIdx++){out+="  "+this.gestures[gestureIdx].toString()+"<br/>"}}out+="<br/><br/>Raw JSON:<br/>";out+=JSON.stringify(this.data);return out};Frame.Invalid={valid:false,hands:[],fingers:[],tools:[],gestures:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},hand:function(){return Hand.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"gl-matrix":19,underscore:20}],6:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3,EventEmitter=require("events").EventEmitter,_=require("underscore");var createGesture=exports.createGesture=function(data){var gesture;switch(data.type){case"circle":gesture=new CircleGesture(data);break;case"swipe":gesture=new SwipeGesture(data);break;case"screenTap":gesture=new ScreenTapGesture(data);break;case"keyTap":gesture=new KeyTapGesture(data);break;default:throw"unkown gesture type"}gesture.id=data.id;gesture.handIds=data.handIds;gesture.pointableIds=data.pointableIds;gesture.duration=data.duration;gesture.state=data.state;gesture.type=data.type;return gesture};var gestureListener=exports.gestureListener=function(controller,type){var handlers={};var gestureMap={};var gestureCreator=function(){var candidateGesture=gestureMap[gesture.id];if(candidateGesture!==undefined)gesture.update(gesture,frame);if(gesture.state=="start"||gesture.state=="stop"){if(type==gesture.type&&gestureMap[gesture.id]===undefined){gestureMap[gesture.id]=new Gesture(gesture,frame);gesture.update(gesture,frame)}if(gesture.state=="stop"){delete gestureMap[gesture.id]}}};controller.on("gesture",function(gesture,frame){if(gesture.type==type){if(gesture.state=="start"||gesture.state=="stop"){if(gestureMap[gesture.id]===undefined){var gestureTracker=new Gesture(gesture,frame);gestureMap[gesture.id]=gestureTracker;_.each(handlers,function(cb,name){gestureTracker.on(name,cb)})}}gestureMap[gesture.id].update(gesture,frame);if(gesture.state=="stop"){delete gestureMap[gesture.id]}}});var builder={start:function(cb){handlers["start"]=cb;return builder},stop:function(cb){handlers["stop"]=cb;return builder},complete:function(cb){handlers["stop"]=cb;return builder},update:function(cb){handlers["update"]=cb;return builder}};return builder};var Gesture=exports.Gesture=function(gesture,frame){this.gestures=[gesture];this.frames=[frame]};Gesture.prototype.update=function(gesture,frame){this.gestures.push(gesture);this.frames.push(frame);this.emit(gesture.state,this)};_.extend(Gesture.prototype,EventEmitter.prototype);var CircleGesture=function(data){this.center=data.center;this.normal=data.normal;this.progress=data.progress;this.radius=data.radius};CircleGesture.prototype.toString=function(){return"CircleGesture ["+JSON.stringify(this)+"]"};var SwipeGesture=function(data){this.startPosition=data.startPosition;this.position=data.position;this.direction=data.direction;this.speed=data.speed};SwipeGesture.prototype.toString=function(){return"SwipeGesture ["+JSON.stringify(this)+"]"};var ScreenTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};ScreenTapGesture.prototype.toString=function(){return"ScreenTapGesture ["+JSON.stringify(this)+"]"};var KeyTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};KeyTapGesture.prototype.toString=function(){return"KeyTapGesture ["+JSON.stringify(this)+"]"}},{events:17,"gl-matrix":19,underscore:20}],7:[function(require,module,exports){var Pointable=require("./pointable"),glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,_=require("underscore");var Hand=module.exports=function(data){this.id=data.id;this.palmPosition=data.palmPosition;this.direction=data.direction;this.palmVelocity=data.palmVelocity;this.palmNormal=data.palmNormal;this.sphereCenter=data.sphereCenter;this.sphereRadius=data.sphereRadius;this.valid=true;this.pointables=[];this.fingers=[];this.tools=[];this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.timeVisible=data.timeVisible;this.stabilizedPalmPosition=data.stabilizedPalmPosition};Hand.prototype.finger=function(id){var finger=this.frame.finger(id);return finger&&finger.handId==this.id?finger:Pointable.Invalid};Hand.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Hand.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceHand._rotation[5],this._rotation[2]-sinceHand._rotation[6],this._rotation[3]-sinceHand._rotation[1]])};Hand.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);var m=mat3.multiply(mat3.create(),sinceHand._rotation,transpose);return m};Hand.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 1;return Math.exp(this._scaleFactor-sinceHand._scaleFactor)};Hand.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return[this._translation[0]-sinceHand._translation[0],this._translation[1]-sinceHand._translation[1],this._translation[2]-sinceHand._translation[2]]};Hand.prototype.toString=function(){return"Hand [ id: "+this.id+" | palm velocity:"+this.palmVelocity+" | sphere center:"+this.sphereCenter+" ] "};Hand.Invalid={valid:false,fingers:[],tools:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./pointable":11,"gl-matrix":19,underscore:20}],8:[function(require,module,exports){!function(){module.exports={Controller:require("./controller"),Frame:require("./frame"),Gesture:require("./gesture"),Hand:require("./hand"),Pointable:require("./pointable"),InteractionBox:require("./interaction_box"),Connection:require("./connection"),CircularBuffer:require("./circular_buffer"),UI:require("./ui"),glMatrix:require("gl-matrix"),mat3:require("gl-matrix").mat3,vec3:require("gl-matrix").vec3,loopController:undefined,loop:function(opts,callback){if(callback===undefined){callback=opts;opts={}}if(!this.loopController)this.loopController=new this.Controller(opts);this.loopController.loop(callback)}}}()},{"./circular_buffer":2,"./connection":3,"./controller":4,"./frame":5,"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"./ui":13,"gl-matrix":19}],9:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var InteractionBox=module.exports=function(data){this.valid=true;this.center=data.center;this.size=data.size;this.width=data.size[0];this.height=data.size[1];this.depth=data.size[2]};InteractionBox.prototype.denormalizePoint=function(normalizedPosition){return vec3.fromValues((normalizedPosition[0]-.5)*this.size[0]+this.center[0],(normalizedPosition[1]-.5)*this.size[1]+this.center[1],(normalizedPosition[2]-.5)*this.size[2]+this.center[2])};InteractionBox.prototype.normalizePoint=function(position,clamp){var vec=vec3.fromValues((position[0]-this.center[0])/this.size[0]+.5,(position[1]-this.center[1])/this.size[1]+.5,(position[2]-this.center[2])/this.size[2]+.5);if(clamp){vec[0]=Math.min(Math.max(vec[0],0),1);vec[1]=Math.min(Math.max(vec[1],0),1);vec[2]=Math.min(Math.max(vec[2],0),1)}return vec};InteractionBox.prototype.toString=function(){return"InteractionBox [ width:"+this.width+" | height:"+this.height+" | depth:"+this.depth+" ]"};InteractionBox.Invalid={valid:false}},{"gl-matrix":19}],10:[function(require,module,exports){var Pipeline=module.exports=function(){this.steps=[]};Pipeline.prototype.addStep=function(step){this.steps.push(step)};Pipeline.prototype.run=function(frame){var stepsLength=this.steps.length;for(var i=0;i!=stepsLength;i++){if(!frame)break;frame=this.steps[i](frame)}return frame}},{}],11:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var Pointable=module.exports=function(data){this.valid=true;this.id=data.id;this.handId=data.handId;this.length=data.length;this.tool=data.tool;this.width=data.width;this.direction=data.direction;this.stabilizedTipPosition=data.stabilizedTipPosition;this.tipPosition=data.tipPosition;this.tipVelocity=data.tipVelocity;this.touchZone=data.touchZone;this.touchDistance=data.touchDistance;this.timeVisible=data.timeVisible};Pointable.prototype.toString=function(){if(this.tool==true){return"Pointable [ id:"+this.id+" "+this.length+"mmx | with:"+this.width+"mm | direction:"+this.direction+" ]"}else{return"Pointable [ id:"+this.id+" "+this.length+"mmx | direction: "+this.direction+" ]"}};Pointable.Invalid={valid:false}},{"gl-matrix":19}],12:[function(require,module,exports){var Frame=require("./frame");var Event=function(data){this.type=data.type;this.state=data.state};var chooseProtocol=exports.chooseProtocol=function(header){var protocol;switch(header.version){case 1:protocol=JSONProtocol(1,function(data){return new Frame(data)});break;case 2:protocol=JSONProtocol(2,function(data){return new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;case 3:protocol=JSONProtocol(3,function(data){return data.event?new Event(data.event):new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;default:throw"unrecognized version"}return protocol};var JSONProtocol=function(version,cb){var protocol=cb;protocol.encode=function(message){return JSON.stringify(message)};protocol.version=version;protocol.versionLong="Version "+version;protocol.type="protocol";return protocol}},{"./frame":5}],13:[function(require,module,exports){exports.UI={Region:require("./ui/region"),Cursor:require("./ui/cursor")}},{"./ui/cursor":14,"./ui/region":15}],14:[function(require,module,exports){var Cursor=module.exports=function(){return function(frame){var pointable=frame.pointables.sort(function(a,b){return a.z-b.z})[0];if(pointable&&pointable.valid){frame.cursorPosition=pointable.tipPosition}return frame}}},{}],15:[function(require,module,exports){var EventEmitter=require("events").EventEmitter,_=require("underscore");var Region=module.exports=function(start,end){this.start=new Vector(start);this.end=new Vector(end);this.enteredFrame=null};Region.prototype.hasPointables=function(frame){for(var i=0;i!=frame.pointables.length;i++){var position=frame.pointables[i].tipPosition;if(position.x>=this.start.x&&position.x<=this.end.x&&position.y>=this.start.y&&position.y<=this.end.y&&position.z>=this.start.z&&position.z<=this.end.z){return true}}return false};Region.prototype.listener=function(opts){var region=this;if(opts&&opts.nearThreshold)this.setupNearRegion(opts.nearThreshold);return function(frame){return region.updatePosition(frame)}};Region.prototype.clipper=function(){var region=this;return function(frame){region.updatePosition(frame);return region.enteredFrame?frame:null}};Region.prototype.setupNearRegion=function(distance){var nearRegion=this.nearRegion=new Region([this.start.x-distance,this.start.y-distance,this.start.z-distance],[this.end.x+distance,this.end.y+distance,this.end.z+distance]);var region=this;nearRegion.on("enter",function(frame){region.emit("near",frame)});nearRegion.on("exit",function(frame){region.emit("far",frame)});region.on("exit",function(frame){region.emit("near",frame)})};Region.prototype.updatePosition=function(frame){if(this.nearRegion)this.nearRegion.updatePosition(frame);if(this.hasPointables(frame)&&this.enteredFrame==null){this.enteredFrame=frame;this.emit("enter",this.enteredFrame)}else if(!this.hasPointables(frame)&&this.enteredFrame!=null){this.enteredFrame=null;this.emit("exit",this.enteredFrame)}return frame};Region.prototype.normalize=function(position){return new Vector([(position.x-this.start.x)/(this.end.x-this.start.x),(position.y-this.start.y)/(this.end.y-this.start.y),(position.z-this.start.z)/(this.end.z-this.start.z)])};Region.prototype.mapToXY=function(position,width,height){var normalized=this.normalize(position);var x=normalized.x,y=normalized.y;if(x>1)x=1;else if(x<-1)x=-1;if(y>1)y=1;else if(y<-1)y=-1;return[(x+1)/2*width,(1-y)/2*height,normalized.z]};_.extend(Region.prototype,EventEmitter.prototype)},{events:17,underscore:20}],16:[function(require,module,exports){},{}],17:[function(require,module,exports){!function(process){if(!process.EventEmitter)process.EventEmitter=function(){};var EventEmitter=exports.EventEmitter=process.EventEmitter;var isArray=typeof Array.isArray==="function"?Array.isArray:function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function indexOf(xs,x){if(xs.indexOf)return xs.indexOf(x);for(var i=0;i<xs.length;i++){if(x===xs[i])return i}return-1}var defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!this._events)this._events={};this._events.maxListeners=n};EventEmitter.prototype.emit=function(type){if(type==="error"){if(!this._events||!this._events.error||isArray(this._events.error)&&!this._events.error.length){if(arguments[1]instanceof Error){throw arguments[1]}else{throw new Error("Uncaught, unspecified 'error' event.")}return false}}if(!this._events)return false;var handler=this._events[type];if(!handler)return false;if(typeof handler=="function"){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:var args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}return true}else if(isArray(handler)){var args=Array.prototype.slice.call(arguments,1);var listeners=handler.slice();for(var i=0,l=listeners.length;i<l;i++){listeners[i].apply(this,args)}return true}else{return false}};EventEmitter.prototype.addListener=function(type,listener){if("function"!==typeof listener){throw new Error("addListener only takes instances of Function")}if(!this._events)this._events={};this.emit("newListener",type,listener);if(!this._events[type]){this._events[type]=listener}else if(isArray(this._events[type])){if(!this._events[type].warned){var m;if(this._events.maxListeners!==undefined){m=this._events.maxListeners}else{m=defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);console.trace()}}this._events[type].push(listener)}else{this._events[type]=[this._events[type],listener]}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){var self=this;self.on(type,function g(){self.removeListener(type,g);listener.apply(this,arguments)});return this};EventEmitter.prototype.removeListener=function(type,listener){if("function"!==typeof listener){throw new Error("removeListener only takes instances of Function")}if(!this._events||!this._events[type])return this;var list=this._events[type];if(isArray(list)){var i=indexOf(list,listener);if(i<0)return this;list.splice(i,1);if(list.length==0)delete this._events[type]}else if(this._events[type]===listener){delete this._events[type]}return this};EventEmitter.prototype.removeAllListeners=function(type){if(arguments.length===0){this._events={};return this}if(type&&this._events&&this._events[type])this._events[type]=null;return this};EventEmitter.prototype.listeners=function(type){if(!this._events)this._events={};if(!this._events[type])this._events[type]=[];if(!isArray(this._events[type])){this._events[type]=[this._events[type]]}return this._events[type]}}(require("__browserify_process"))},{__browserify_process:18}],18:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){if(ev.source===window&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],19:[function(require,module,exports){!function(){!function(){"use strict";var shim={};if(typeof exports==="undefined"){if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){shim.exports={};define(function(){return shim.exports})}else{shim.exports=window}}else{shim.exports=exports}!function(exports){var vec2={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec2.create=function(){return new Float32Array(2)};vec2.clone=function(a){var out=new Float32Array(2);out[0]=a[0];out[1]=a[1];return out};vec2.fromValues=function(x,y){var out=new Float32Array(2);out[0]=x;out[1]=y;return out};vec2.copy=function(out,a){out[0]=a[0];out[1]=a[1];return out};vec2.set=function(out,x,y){out[0]=x;out[1]=y;return out};vec2.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];return out};vec2.sub=vec2.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];return out};vec2.mul=vec2.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];return out};vec2.div=vec2.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];return out};vec2.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);
-out[1]=Math.min(a[1],b[1]);return out};vec2.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);return out};vec2.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;return out};vec2.dist=vec2.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return Math.sqrt(x*x+y*y)};vec2.sqrDist=vec2.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return x*x+y*y};vec2.len=vec2.length=function(a){var x=a[0],y=a[1];return Math.sqrt(x*x+y*y)};vec2.sqrLen=vec2.squaredLength=function(a){var x=a[0],y=a[1];return x*x+y*y};vec2.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];return out};vec2.normalize=function(out,a){var x=a[0],y=a[1];var len=x*x+y*y;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len}return out};vec2.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]};vec2.cross=function(out,a,b){var z=a[0]*b[1]-a[1]*b[0];out[0]=out[1]=0;out[2]=z;return out};vec2.lerp=function(out,a,b,t){var ax=a[0],ay=a[1];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);return out};vec2.transformMat2=function(out,a,m){var x=a[0],y=a[1];out[0]=x*m[0]+y*m[1];out[1]=x*m[2]+y*m[3];return out};vec2.forEach=function(){var vec=new Float32Array(2);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=2}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1]}return a}}();vec2.str=function(a){return"vec2("+a[0]+", "+a[1]+")"};if(typeof exports!=="undefined"){exports.vec2=vec2}var vec3={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec3.create=function(){return new Float32Array(3)};vec3.clone=function(a){var out=new Float32Array(3);out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.fromValues=function(x,y,z){var out=new Float32Array(3);out[0]=x;out[1]=y;out[2]=z;return out};vec3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.set=function(out,x,y,z){out[0]=x;out[1]=y;out[2]=z;return out};vec3.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];return out};vec3.sub=vec3.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];return out};vec3.mul=vec3.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];return out};vec3.div=vec3.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];return out};vec3.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);return out};vec3.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);return out};vec3.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;return out};vec3.dist=vec3.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrDist=vec3.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return x*x+y*y+z*z};vec3.len=vec3.length=function(a){var x=a[0],y=a[1],z=a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrLen=vec3.squaredLength=function(a){var x=a[0],y=a[1],z=a[2];return x*x+y*y+z*z};vec3.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];return out};vec3.normalize=function(out,a){var x=a[0],y=a[1],z=a[2];var len=x*x+y*y+z*z;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len}return out};vec3.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]};vec3.cross=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2];out[0]=ay*bz-az*by;out[1]=az*bx-ax*bz;out[2]=ax*by-ay*bx;return out};vec3.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);return out};vec3.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12];out[1]=m[1]*x+m[5]*y+m[9]*z+m[13];out[2]=m[2]*x+m[6]*y+m[10]*z+m[14];return out};vec3.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec3.forEach=function(){var vec=new Float32Array(3);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=3}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2]}return a}}();vec3.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};if(typeof exports!=="undefined"){exports.vec3=vec3}var vec4={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec4.create=function(){return new Float32Array(4)};vec4.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.fromValues=function(x,y,z,w){var out=new Float32Array(4);out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.set=function(out,x,y,z,w){out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];out[3]=a[3]+b[3];return out};vec4.sub=vec4.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];out[3]=a[3]-b[3];return out};vec4.mul=vec4.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];out[3]=a[3]*b[3];return out};vec4.div=vec4.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];out[3]=a[3]/b[3];return out};vec4.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);out[3]=Math.min(a[3],b[3]);return out};vec4.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);out[3]=Math.max(a[3],b[3]);return out};vec4.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;out[3]=a[3]*b;return out};vec4.dist=vec4.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrDist=vec4.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return x*x+y*y+z*z+w*w};vec4.len=vec4.length=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrLen=vec4.squaredLength=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return x*x+y*y+z*z+w*w};vec4.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=-a[3];return out};vec4.normalize=function(out,a){var x=a[0],y=a[1],z=a[2],w=a[3];var len=x*x+y*y+z*z+w*w;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;out[3]=a[3]*len}return out};vec4.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]};vec4.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);out[3]=aw+t*(b[3]-aw);return out};vec4.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2],w=a[3];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12]*w;out[1]=m[1]*x+m[5]*y+m[9]*z+m[13]*w;out[2]=m[2]*x+m[6]*y+m[10]*z+m[14]*w;out[3]=m[3]*x+m[7]*y+m[11]*z+m[15]*w;return out};vec4.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec4.forEach=function(){var vec=new Float32Array(4);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=4}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];vec[3]=a[i+3];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2];a[i+3]=vec[3]}return a}}();vec4.str=function(a){return"vec4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.vec4=vec4}var mat2={};var mat2Identity=new Float32Array([1,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat2.create=function(){return new Float32Array(mat2Identity)};mat2.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=1;return out};mat2.transpose=function(out,a){if(out===a){var a1=a[1];out[1]=a[2];out[2]=a1}else{out[0]=a[0];out[1]=a[2];out[2]=a[1];out[3]=a[3]}return out};mat2.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],det=a0*a3-a2*a1;if(!det){return null}det=1/det;out[0]=a3*det;out[1]=-a1*det;out[2]=-a2*det;out[3]=a0*det;return out};mat2.adjoint=function(out,a){var a0=a[0];out[0]=a[3];out[1]=-a[1];out[2]=-a[2];out[3]=a0;return out};mat2.determinant=function(a){return a[0]*a[3]-a[2]*a[1]};mat2.mul=mat2.multiply=function(out,a,b){var a0=a[0],a1=a[1],a2=a[2],a3=a[3];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=a0*b0+a1*b2;out[1]=a0*b1+a1*b3;out[2]=a2*b0+a3*b2;out[3]=a2*b1+a3*b3;return out};mat2.rotate=function(out,a,rad){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],s=Math.sin(rad),c=Math.cos(rad);out[0]=a0*c+a1*s;out[1]=a0*-s+a1*c;out[2]=a2*c+a3*s;out[3]=a2*-s+a3*c;return out};mat2.scale=function(out,a,v){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],v0=v[0],v1=v[1];out[0]=a0*v0;out[1]=a1*v1;out[2]=a2*v0;out[3]=a3*v1;return out};mat2.str=function(a){return"mat2("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.mat2=mat2}var mat3={};var mat3Identity=new Float32Array([1,0,0,0,1,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat3.create=function(){return new Float32Array(mat3Identity)};mat3.clone=function(a){var out=new Float32Array(9);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=1;out[5]=0;out[6]=0;out[7]=0;out[8]=1;return out};mat3.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a12=a[5];out[1]=a[3];out[2]=a[6];out[3]=a01;out[5]=a[7];out[6]=a02;out[7]=a12}else{out[0]=a[0];out[1]=a[3];out[2]=a[6];out[3]=a[1];out[4]=a[4];out[5]=a[7];out[6]=a[2];out[7]=a[5];out[8]=a[8]}return out};mat3.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b01=a22*a11-a12*a21,b11=-a22*a10+a12*a20,b21=a21*a10-a11*a20,det=a00*b01+a01*b11+a02*b21;if(!det){return null}det=1/det;out[0]=b01*det;out[1]=(-a22*a01+a02*a21)*det;out[2]=(a12*a01-a02*a11)*det;out[3]=b11*det;out[4]=(a22*a00-a02*a20)*det;out[5]=(-a12*a00+a02*a10)*det;out[6]=b21*det;out[7]=(-a21*a00+a01*a20)*det;out[8]=(a11*a00-a01*a10)*det;return out};mat3.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];out[0]=a11*a22-a12*a21;out[1]=a02*a21-a01*a22;out[2]=a01*a12-a02*a11;out[3]=a12*a20-a10*a22;out[4]=a00*a22-a02*a20;out[5]=a02*a10-a00*a12;out[6]=a10*a21-a11*a20;out[7]=a01*a20-a00*a21;out[8]=a00*a11-a01*a10;return out};mat3.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];return a00*(a22*a11-a12*a21)+a01*(-a22*a10+a12*a20)+a02*(a21*a10-a11*a20)};mat3.mul=mat3.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b00=b[0],b01=b[1],b02=b[2],b10=b[3],b11=b[4],b12=b[5],b20=b[6],b21=b[7],b22=b[8];out[0]=b00*a00+b01*a10+b02*a20;out[1]=b00*a01+b01*a11+b02*a21;out[2]=b00*a02+b01*a12+b02*a22;out[3]=b10*a00+b11*a10+b12*a20;out[4]=b10*a01+b11*a11+b12*a21;out[5]=b10*a02+b11*a12+b12*a22;out[6]=b20*a00+b21*a10+b22*a20;out[7]=b20*a01+b21*a11+b22*a21;out[8]=b20*a02+b21*a12+b22*a22;return out};mat3.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"};if(typeof exports!=="undefined"){exports.mat3=mat3}var mat4={};var mat4Identity=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat4.create=function(){return new Float32Array(mat4Identity)};mat4.clone=function(a){var out=new Float32Array(16);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=1;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=1;out[11]=0;out[12]=0;out[13]=0;out[14]=0;out[15]=1;return out};mat4.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a03=a[3],a12=a[6],a13=a[7],a23=a[11];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a01;out[6]=a[9];out[7]=a[13];out[8]=a02;out[9]=a12;out[11]=a[14];out[12]=a03;out[13]=a13;out[14]=a23}else{out[0]=a[0];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a[1];out[5]=a[5];out[6]=a[9];out[7]=a[13];out[8]=a[2];out[9]=a[6];out[10]=a[10];out[11]=a[14];out[12]=a[3];out[13]=a[7];out[14]=a[11];out[15]=a[15]}return out};mat4.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32,det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(!det){return null}det=1/det;out[0]=(a11*b11-a12*b10+a13*b09)*det;out[1]=(a02*b10-a01*b11-a03*b09)*det;out[2]=(a31*b05-a32*b04+a33*b03)*det;out[3]=(a22*b04-a21*b05-a23*b03)*det;out[4]=(a12*b08-a10*b11-a13*b07)*det;out[5]=(a00*b11-a02*b08+a03*b07)*det;out[6]=(a32*b02-a30*b05-a33*b01)*det;out[7]=(a20*b05-a22*b02+a23*b01)*det;out[8]=(a10*b10-a11*b08+a13*b06)*det;out[9]=(a01*b08-a00*b10-a03*b06)*det;out[10]=(a30*b04-a31*b02+a33*b00)*det;out[11]=(a21*b02-a20*b04-a23*b00)*det;out[12]=(a11*b07-a10*b09-a12*b06)*det;out[13]=(a00*b09-a01*b07+a02*b06)*det;out[14]=(a31*b01-a30*b03-a32*b00)*det;out[15]=(a20*b03-a21*b01+a22*b00)*det;return out};mat4.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];out[0]=a11*(a22*a33-a23*a32)-a21*(a12*a33-a13*a32)+a31*(a12*a23-a13*a22);out[1]=-(a01*(a22*a33-a23*a32)-a21*(a02*a33-a03*a32)+a31*(a02*a23-a03*a22));out[2]=a01*(a12*a33-a13*a32)-a11*(a02*a33-a03*a32)+a31*(a02*a13-a03*a12);out[3]=-(a01*(a12*a23-a13*a22)-a11*(a02*a23-a03*a22)+a21*(a02*a13-a03*a12));out[4]=-(a10*(a22*a33-a23*a32)-a20*(a12*a33-a13*a32)+a30*(a12*a23-a13*a22));out[5]=a00*(a22*a33-a23*a32)-a20*(a02*a33-a03*a32)+a30*(a02*a23-a03*a22);out[6]=-(a00*(a12*a33-a13*a32)-a10*(a02*a33-a03*a32)+a30*(a02*a13-a03*a12));out[7]=a00*(a12*a23-a13*a22)-a10*(a02*a23-a03*a22)+a20*(a02*a13-a03*a12);out[8]=a10*(a21*a33-a23*a31)-a20*(a11*a33-a13*a31)+a30*(a11*a23-a13*a21);out[9]=-(a00*(a21*a33-a23*a31)-a20*(a01*a33-a03*a31)+a30*(a01*a23-a03*a21));out[10]=a00*(a11*a33-a13*a31)-a10*(a01*a33-a03*a31)+a30*(a01*a13-a03*a11);out[11]=-(a00*(a11*a23-a13*a21)-a10*(a01*a23-a03*a21)+a20*(a01*a13-a03*a11));out[12]=-(a10*(a21*a32-a22*a31)-a20*(a11*a32-a12*a31)+a30*(a11*a22-a12*a21));out[13]=a00*(a21*a32-a22*a31)-a20*(a01*a32-a02*a31)+a30*(a01*a22-a02*a21);out[14]=-(a00*(a11*a32-a12*a31)-a10*(a01*a32-a02*a31)+a30*(a01*a12-a02*a11));out[15]=a00*(a11*a22-a12*a21)-a10*(a01*a22-a02*a21)+a20*(a01*a12-a02*a11);return out};mat4.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32;return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06};mat4.mul=mat4.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=b0*a00+b1*a10+b2*a20+b3*a30;out[1]=b0*a01+b1*a11+b2*a21+b3*a31;out[2]=b0*a02+b1*a12+b2*a22+b3*a32;out[3]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[4];b1=b[5];b2=b[6];b3=b[7];out[4]=b0*a00+b1*a10+b2*a20+b3*a30;out[5]=b0*a01+b1*a11+b2*a21+b3*a31;out[6]=b0*a02+b1*a12+b2*a22+b3*a32;out[7]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[8];b1=b[9];b2=b[10];b3=b[11];out[8]=b0*a00+b1*a10+b2*a20+b3*a30;out[9]=b0*a01+b1*a11+b2*a21+b3*a31;out[10]=b0*a02+b1*a12+b2*a22+b3*a32;out[11]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[12];b1=b[13];b2=b[14];b3=b[15];out[12]=b0*a00+b1*a10+b2*a20+b3*a30;out[13]=b0*a01+b1*a11+b2*a21+b3*a31;out[14]=b0*a02+b1*a12+b2*a22+b3*a32;out[15]=b0*a03+b1*a13+b2*a23+b3*a33;return out};mat4.translate=function(out,a,v){var x=v[0],y=v[1],z=v[2],a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;if(a===out){out[12]=a[0]*x+a[4]*y+a[8]*z+a[12];out[13]=a[1]*x+a[5]*y+a[9]*z+a[13];out[14]=a[2]*x+a[6]*y+a[10]*z+a[14];out[15]=a[3]*x+a[7]*y+a[11]*z+a[15]}else{a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a03;out[4]=a10;out[5]=a11;out[6]=a12;out[7]=a13;out[8]=a20;out[9]=a21;out[10]=a22;out[11]=a23;out[12]=a00*x+a10*y+a20*z+a[12];out[13]=a01*x+a11*y+a21*z+a[13];out[14]=a02*x+a12*y+a22*z+a[14];out[15]=a03*x+a13*y+a23*z+a[15]}return out};mat4.scale=function(out,a,v){var x=v[0],y=v[1],z=v[2];out[0]=a[0]*x;out[1]=a[1]*x;out[2]=a[2]*x;out[3]=a[3]*x;out[4]=a[4]*y;out[5]=a[5]*y;out[6]=a[6]*y;out[7]=a[7]*y;out[8]=a[8]*z;out[9]=a[9]*z;out[10]=a[10]*z;out[11]=a[11]*z;out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.rotate=function(out,a,rad,axis){var x=axis[0],y=axis[1],z=axis[2],len=Math.sqrt(x*x+y*y+z*z),s,c,t,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,b00,b01,b02,b10,b11,b12,b20,b21,b22;if(Math.abs(len)<GLMAT_EPSILON){return null}len=1/len;x*=len;y*=len;z*=len;s=Math.sin(rad);c=Math.cos(rad);t=1-c;a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];b00=x*x*t+c;b01=y*x*t+z*s;b02=z*x*t-y*s;b10=x*y*t-z*s;b11=y*y*t+c;b12=z*y*t+x*s;b20=x*z*t+y*s;b21=y*z*t-x*s;b22=z*z*t+c;out[0]=a00*b00+a10*b01+a20*b02;out[1]=a01*b00+a11*b01+a21*b02;out[2]=a02*b00+a12*b01+a22*b02;out[3]=a03*b00+a13*b01+a23*b02;out[4]=a00*b10+a10*b11+a20*b12;out[5]=a01*b10+a11*b11+a21*b12;out[6]=a02*b10+a12*b11+a22*b12;out[7]=a03*b10+a13*b11+a23*b12;out[8]=a00*b20+a10*b21+a20*b22;out[9]=a01*b20+a11*b21+a21*b22;out[10]=a02*b20+a12*b21+a22*b22;out[11]=a03*b20+a13*b21+a23*b22;if(a!==out){out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}return out};mat4.rotateX=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[4]=a10*c+a20*s;out[5]=a11*c+a21*s;out[6]=a12*c+a22*s;out[7]=a13*c+a23*s;out[8]=a20*c-a10*s;out[9]=a21*c-a11*s;out[10]=a22*c-a12*s;out[11]=a23*c-a13*s;return out};mat4.rotateY=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c-a20*s;out[1]=a01*c-a21*s;out[2]=a02*c-a22*s;out[3]=a03*c-a23*s;out[8]=a00*s+a20*c;out[9]=a01*s+a21*c;out[10]=a02*s+a22*c;out[11]=a03*s+a23*c;return out};mat4.rotateZ=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7];if(a!==out){out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c+a10*s;out[1]=a01*c+a11*s;out[2]=a02*c+a12*s;out[3]=a03*c+a13*s;out[4]=a10*c-a00*s;out[5]=a11*c-a01*s;out[6]=a12*c-a02*s;out[7]=a13*c-a03*s;return out};mat4.fromRotationTranslation=function(out,q,v){var x=q[0],y=q[1],z=q[2],w=q[3],x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;out[0]=1-(yy+zz);out[1]=xy+wz;out[2]=xz-wy;out[3]=0;out[4]=xy-wz;out[5]=1-(xx+zz);out[6]=yz+wx;out[7]=0;out[8]=xz+wy;out[9]=yz-wx;out[10]=1-(xx+yy);out[11]=0;out[12]=v[0];out[13]=v[1];out[14]=v[2];out[15]=1;return out};mat4.frustum=function(out,left,right,bottom,top,near,far){var rl=1/(right-left),tb=1/(top-bottom),nf=1/(near-far);out[0]=near*2*rl;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=near*2*tb;out[6]=0;out[7]=0;out[8]=(right+left)*rl;out[9]=(top+bottom)*tb;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=far*near*2*nf;out[15]=0;return out};mat4.perspective=function(out,fovy,aspect,near,far){var f=1/Math.tan(fovy/2),nf=1/(near-far);out[0]=f/aspect;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=f;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=2*far*near*nf;out[15]=0;return out};mat4.ortho=function(out,left,right,bottom,top,near,far){var lr=1/(left-right),bt=1/(bottom-top),nf=1/(near-far);out[0]=-2*lr;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=-2*bt;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=2*nf;out[11]=0;out[12]=(left+right)*lr;out[13]=(top+bottom)*bt;out[14]=(far+near)*nf;out[15]=1;return out};mat4.lookAt=function(out,eye,center,up){var x0,x1,x2,y0,y1,y2,z0,z1,z2,len,eyex=eye[0],eyey=eye[1],eyez=eye[2],upx=up[0],upy=up[1],upz=up[2],centerx=center[0],centery=center[1],centerz=center[2];if(Math.abs(eyex-centerx)<GLMAT_EPSILON&&Math.abs(eyey-centery)<GLMAT_EPSILON&&Math.abs(eyez-centerz)<GLMAT_EPSILON){return mat4.identity(out)}z0=eyex-centerx;z1=eyey-centery;z2=eyez-centerz;len=1/Math.sqrt(z0*z0+z1*z1+z2*z2);z0*=len;z1*=len;z2*=len;x0=upy*z2-upz*z1;x1=upz*z0-upx*z2;x2=upx*z1-upy*z0;len=Math.sqrt(x0*x0+x1*x1+x2*x2);if(!len){x0=0;x1=0;x2=0}else{len=1/len;x0*=len;x1*=len;x2*=len}y0=z1*x2-z2*x1;y1=z2*x0-z0*x2;y2=z0*x1-z1*x0;len=Math.sqrt(y0*y0+y1*y1+y2*y2);if(!len){y0=0;y1=0;y2=0}else{len=1/len;y0*=len;y1*=len;y2*=len}out[0]=x0;out[1]=y0;out[2]=z0;out[3]=0;out[4]=x1;out[5]=y1;out[6]=z1;out[7]=0;out[8]=x2;out[9]=y2;out[10]=z2;out[11]=0;out[12]=-(x0*eyex+x1*eyey+x2*eyez);out[13]=-(y0*eyex+y1*eyey+y2*eyez);out[14]=-(z0*eyex+z1*eyey+z2*eyez);out[15]=1;return out};mat4.str=function(a){return"mat4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+")"};if(typeof exports!=="undefined"){exports.mat4=mat4}var quat={};var quatIdentity=new Float32Array([0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}quat.create=function(){return new Float32Array(quatIdentity)};quat.clone=vec4.clone;quat.fromValues=vec4.fromValues;quat.copy=vec4.copy;quat.set=vec4.set;quat.identity=function(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out};quat.setAxisAngle=function(out,axis,rad){rad=rad*.5;var s=Math.sin(rad);out[0]=s*axis[0];out[1]=s*axis[1];out[2]=s*axis[2];out[3]=Math.cos(rad);return out};quat.add=vec4.add;quat.mul=quat.multiply=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=b[3];out[0]=ax*bw+aw*bx+ay*bz-az*by;out[1]=ay*bw+aw*by+az*bx-ax*bz;out[2]=az*bw+aw*bz+ax*by-ay*bx;out[3]=aw*bw-ax*bx-ay*by-az*bz;return out};quat.scale=vec4.scale;quat.rotateX=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+aw*bx;out[1]=ay*bw+az*bx;out[2]=az*bw-ay*bx;out[3]=aw*bw-ax*bx;return out};quat.rotateY=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],by=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw-az*by;out[1]=ay*bw+aw*by;out[2]=az*bw+ax*by;out[3]=aw*bw-ay*by;return out};quat.rotateZ=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bz=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+ay*bz;out[1]=ay*bw-ax*bz;out[2]=az*bw+aw*bz;out[3]=aw*bw-az*bz;return out};quat.calculateW=function(out,a){var x=a[0],y=a[1],z=a[2];out[0]=x;out[1]=y;out[2]=z;out[3]=-Math.sqrt(Math.abs(1-x*x-y*y-z*z));return out};quat.dot=vec4.dot;quat.lerp=vec4.lerp;quat.slerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=a[3];var cosHalfTheta=ax*bx+ay*by+az*bz+aw*bw,halfTheta,sinHalfTheta,ratioA,ratioB;if(Math.abs(cosHalfTheta)>=1){if(out!==a){out[0]=ax;out[1]=ay;out[2]=az;out[3]=aw}return out}halfTheta=Math.acos(cosHalfTheta);sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001){out[0]=ax*.5+bx*.5;out[1]=ay*.5+by*.5;out[2]=az*.5+bz*.5;out[3]=aw*.5+bw*.5;return out}ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta;ratioB=Math.sin(t*halfTheta)/sinHalfTheta;out[0]=ax*ratioA+bx*ratioB;out[1]=ay*ratioA+by*ratioB;out[2]=az*ratioA+bz*ratioB;out[3]=aw*ratioA+bw*ratioB;return out};quat.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],dot=a0*a0+a1*a1+a2*a2+a3*a3,invDot=dot?1/dot:0;out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out};quat.conjugate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out};quat.len=quat.length=vec4.length;quat.sqrLen=quat.squaredLength=vec4.squaredLength;quat.normalize=vec4.normalize;quat.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.quat=quat}}(shim.exports)}()}()},{}],20:[function(require,module,exports){!function(){!function(){var root=this;var previousUnderscore=root._;var breaker={};var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var push=ArrayProto.push,slice=ArrayProto.slice,concat=ArrayProto.concat,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeForEach=ArrayProto.forEach,nativeMap=ArrayProto.map,nativeReduce=ArrayProto.reduce,nativeReduceRight=ArrayProto.reduceRight,nativeFilter=ArrayProto.filter,nativeEvery=ArrayProto.every,nativeSome=ArrayProto.some,nativeIndexOf=ArrayProto.indexOf,nativeLastIndexOf=ArrayProto.lastIndexOf,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){if(obj instanceof _)return obj;if(!(this instanceof _))return new _(obj);this._wrapped=obj};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=_}exports._=_}else{root._=_}_.VERSION="1.4.4";var each=_.each=_.forEach=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i<l;i++){if(iterator.call(context,obj[i],i,obj)===breaker)return}}else{for(var key in obj){if(_.has(obj,key)){if(iterator.call(context,obj[key],key,obj)===breaker)return}}}};_.map=_.collect=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeMap&&obj.map===nativeMap)return obj.map(iterator,context);each(obj,function(value,index,list){results[results.length]=iterator.call(context,value,index,list)});return results};var reduceError="Reduce of empty array with no initial value";_.reduce=_.foldl=_.inject=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduce&&obj.reduce===nativeReduce){if(context)iterator=_.bind(iterator,context);return initial?obj.reduce(iterator,memo):obj.reduce(iterator)}each(obj,function(value,index,list){if(!initial){memo=value;initial=true}else{memo=iterator.call(context,memo,value,index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.reduceRight=_.foldr=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduceRight&&obj.reduceRight===nativeReduceRight){if(context)iterator=_.bind(iterator,context);return initial?obj.reduceRight(iterator,memo):obj.reduceRight(iterator)}var length=obj.length;if(length!==+length){var keys=_.keys(obj);length=keys.length}each(obj,function(value,index,list){index=keys?keys[--length]:--length;if(!initial){memo=obj[index];initial=true}else{memo=iterator.call(context,memo,obj[index],index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.find=_.detect=function(obj,iterator,context){var result;any(obj,function(value,index,list){if(iterator.call(context,value,index,list)){result=value;return true}});return result};_.filter=_.select=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeFilter&&obj.filter===nativeFilter)return obj.filter(iterator,context);each(obj,function(value,index,list){if(iterator.call(context,value,index,list))results[results.length]=value});return results};_.reject=function(obj,iterator,context){return _.filter(obj,function(value,index,list){return!iterator.call(context,value,index,list)},context)};_.every=_.all=function(obj,iterator,context){iterator||(iterator=_.identity);var result=true;if(obj==null)return result;if(nativeEvery&&obj.every===nativeEvery)return obj.every(iterator,context);each(obj,function(value,index,list){if(!(result=result&&iterator.call(context,value,index,list)))return breaker});return!!result};var any=_.some=_.any=function(obj,iterator,context){iterator||(iterator=_.identity);var result=false;if(obj==null)return result;if(nativeSome&&obj.some===nativeSome)return obj.some(iterator,context);each(obj,function(value,index,list){if(result||(result=iterator.call(context,value,index,list)))return breaker});return!!result};_.contains=_.include=function(obj,target){if(obj==null)return false;if(nativeIndexOf&&obj.indexOf===nativeIndexOf)return obj.indexOf(target)!=-1;return any(obj,function(value){return value===target})};_.invoke=function(obj,method){var args=slice.call(arguments,2);var isFunc=_.isFunction(method);return _.map(obj,function(value){return(isFunc?method:value[method]).apply(value,args)})};_.pluck=function(obj,key){return _.map(obj,function(value){return value[key]})};_.where=function(obj,attrs,first){if(_.isEmpty(attrs))return first?null:[];return _[first?"find":"filter"](obj,function(value){for(var key in attrs){if(attrs[key]!==value[key])return false}return true})};_.findWhere=function(obj,attrs){return _.where(obj,attrs,true)};_.max=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.max.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return-Infinity;var result={computed:-Infinity,value:-Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed>=result.computed&&(result={value:value,computed:computed})});return result.value};_.min=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.min.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return Infinity;var result={computed:Infinity,value:Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed<result.computed&&(result={value:value,computed:computed})});return result.value};_.shuffle=function(obj){var rand;var index=0;var shuffled=[];each(obj,function(value){rand=_.random(index++);shuffled[index-1]=shuffled[rand];shuffled[rand]=value});return shuffled};var lookupIterator=function(value){return _.isFunction(value)?value:function(obj){return obj[value]}};_.sortBy=function(obj,value,context){var iterator=lookupIterator(value);return _.pluck(_.map(obj,function(value,index,list){return{value:value,index:index,criteria:iterator.call(context,value,index,list)}}).sort(function(left,right){var a=left.criteria;
-var b=right.criteria;if(a!==b){if(a>b||a===void 0)return 1;if(a<b||b===void 0)return-1}return left.index<right.index?-1:1}),"value")};var group=function(obj,value,context,behavior){var result={};var iterator=lookupIterator(value||_.identity);each(obj,function(value,index){var key=iterator.call(context,value,index,obj);behavior(result,key,value)});return result};_.groupBy=function(obj,value,context){return group(obj,value,context,function(result,key,value){(_.has(result,key)?result[key]:result[key]=[]).push(value)})};_.countBy=function(obj,value,context){return group(obj,value,context,function(result,key){if(!_.has(result,key))result[key]=0;result[key]++})};_.sortedIndex=function(array,obj,iterator,context){iterator=iterator==null?_.identity:lookupIterator(iterator);var value=iterator.call(context,obj);var low=0,high=array.length;while(low<high){var mid=low+high>>>1;iterator.call(context,array[mid])<value?low=mid+1:high=mid}return low};_.toArray=function(obj){if(!obj)return[];if(_.isArray(obj))return slice.call(obj);if(obj.length===+obj.length)return _.map(obj,_.identity);return _.values(obj)};_.size=function(obj){if(obj==null)return 0;return obj.length===+obj.length?obj.length:_.keys(obj).length};_.first=_.head=_.take=function(array,n,guard){if(array==null)return void 0;return n!=null&&!guard?slice.call(array,0,n):array[0]};_.initial=function(array,n,guard){return slice.call(array,0,array.length-(n==null||guard?1:n))};_.last=function(array,n,guard){if(array==null)return void 0;if(n!=null&&!guard){return slice.call(array,Math.max(array.length-n,0))}else{return array[array.length-1]}};_.rest=_.tail=_.drop=function(array,n,guard){return slice.call(array,n==null||guard?1:n)};_.compact=function(array){return _.filter(array,_.identity)};var flatten=function(input,shallow,output){each(input,function(value){if(_.isArray(value)){shallow?push.apply(output,value):flatten(value,shallow,output)}else{output.push(value)}});return output};_.flatten=function(array,shallow){return flatten(array,shallow,[])};_.without=function(array){return _.difference(array,slice.call(arguments,1))};_.uniq=_.unique=function(array,isSorted,iterator,context){if(_.isFunction(isSorted)){context=iterator;iterator=isSorted;isSorted=false}var initial=iterator?_.map(array,iterator,context):array;var results=[];var seen=[];each(initial,function(value,index){if(isSorted?!index||seen[seen.length-1]!==value:!_.contains(seen,value)){seen.push(value);results.push(array[index])}});return results};_.union=function(){return _.uniq(concat.apply(ArrayProto,arguments))};_.intersection=function(array){var rest=slice.call(arguments,1);return _.filter(_.uniq(array),function(item){return _.every(rest,function(other){return _.indexOf(other,item)>=0})})};_.difference=function(array){var rest=concat.apply(ArrayProto,slice.call(arguments,1));return _.filter(array,function(value){return!_.contains(rest,value)})};_.zip=function(){var args=slice.call(arguments);var length=_.max(_.pluck(args,"length"));var results=new Array(length);for(var i=0;i<length;i++){results[i]=_.pluck(args,""+i)}return results};_.object=function(list,values){if(list==null)return{};var result={};for(var i=0,l=list.length;i<l;i++){if(values){result[list[i]]=values[i]}else{result[list[i][0]]=list[i][1]}}return result};_.indexOf=function(array,item,isSorted){if(array==null)return-1;var i=0,l=array.length;if(isSorted){if(typeof isSorted=="number"){i=isSorted<0?Math.max(0,l+isSorted):isSorted}else{i=_.sortedIndex(array,item);return array[i]===item?i:-1}}if(nativeIndexOf&&array.indexOf===nativeIndexOf)return array.indexOf(item,isSorted);for(;i<l;i++)if(array[i]===item)return i;return-1};_.lastIndexOf=function(array,item,from){if(array==null)return-1;var hasIndex=from!=null;if(nativeLastIndexOf&&array.lastIndexOf===nativeLastIndexOf){return hasIndex?array.lastIndexOf(item,from):array.lastIndexOf(item)}var i=hasIndex?from:array.length;while(i--)if(array[i]===item)return i;return-1};_.range=function(start,stop,step){if(arguments.length<=1){stop=start||0;start=0}step=arguments[2]||1;var len=Math.max(Math.ceil((stop-start)/step),0);var idx=0;var range=new Array(len);while(idx<len){range[idx++]=start;start+=step}return range};_.bind=function(func,context){if(func.bind===nativeBind&&nativeBind)return nativeBind.apply(func,slice.call(arguments,1));var args=slice.call(arguments,2);return function(){return func.apply(context,args.concat(slice.call(arguments)))}};_.partial=function(func){var args=slice.call(arguments,1);return function(){return func.apply(this,args.concat(slice.call(arguments)))}};_.bindAll=function(obj){var funcs=slice.call(arguments,1);if(funcs.length===0)funcs=_.functions(obj);each(funcs,function(f){obj[f]=_.bind(obj[f],obj)});return obj};_.memoize=function(func,hasher){var memo={};hasher||(hasher=_.identity);return function(){var key=hasher.apply(this,arguments);return _.has(memo,key)?memo[key]:memo[key]=func.apply(this,arguments)}};_.delay=function(func,wait){var args=slice.call(arguments,2);return setTimeout(function(){return func.apply(null,args)},wait)};_.defer=function(func){return _.delay.apply(_,[func,1].concat(slice.call(arguments,1)))};_.throttle=function(func,wait){var context,args,timeout,result;var previous=0;var later=function(){previous=new Date;timeout=null;result=func.apply(context,args)};return function(){var now=new Date;var remaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0){clearTimeout(timeout);timeout=null;previous=now;result=func.apply(context,args)}else if(!timeout){timeout=setTimeout(later,remaining)}return result}};_.debounce=function(func,wait,immediate){var timeout,result;return function(){var context=this,args=arguments;var later=function(){timeout=null;if(!immediate)result=func.apply(context,args)};var callNow=immediate&&!timeout;clearTimeout(timeout);timeout=setTimeout(later,wait);if(callNow)result=func.apply(context,args);return result}};_.once=function(func){var ran=false,memo;return function(){if(ran)return memo;ran=true;memo=func.apply(this,arguments);func=null;return memo}};_.wrap=function(func,wrapper){return function(){var args=[func];push.apply(args,arguments);return wrapper.apply(this,args)}};_.compose=function(){var funcs=arguments;return function(){var args=arguments;for(var i=funcs.length-1;i>=0;i--){args=[funcs[i].apply(this,args)]}return args[0]}};_.after=function(times,func){if(times<=0)return func();return function(){if(--times<1){return func.apply(this,arguments)}}};_.keys=nativeKeys||function(obj){if(obj!==Object(obj))throw new TypeError("Invalid object");var keys=[];for(var key in obj)if(_.has(obj,key))keys[keys.length]=key;return keys};_.values=function(obj){var values=[];for(var key in obj)if(_.has(obj,key))values.push(obj[key]);return values};_.pairs=function(obj){var pairs=[];for(var key in obj)if(_.has(obj,key))pairs.push([key,obj[key]]);return pairs};_.invert=function(obj){var result={};for(var key in obj)if(_.has(obj,key))result[obj[key]]=key;return result};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key)}return names.sort()};_.extend=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){obj[prop]=source[prop]}}});return obj};_.pick=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));each(keys,function(key){if(key in obj)copy[key]=obj[key]});return copy};_.omit=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));for(var key in obj){if(!_.contains(keys,key))copy[key]=obj[key]}return copy};_.defaults=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){if(obj[prop]==null)obj[prop]=source[prop]}}});return obj};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj)};_.tap=function(obj,interceptor){interceptor(obj);return obj};var eq=function(a,b,aStack,bStack){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a instanceof _)a=a._wrapped;if(b instanceof _)b=b._wrapped;var className=toString.call(a);if(className!=toString.call(b))return false;switch(className){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return false;var length=aStack.length;while(length--){if(aStack[length]==a)return bStack[length]==b}aStack.push(a);bStack.push(b);var size=0,result=true;if(className=="[object Array]"){size=a.length;result=size==b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack)))break}}}else{var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(_.isFunction(aCtor)&&aCtor instanceof aCtor&&_.isFunction(bCtor)&&bCtor instanceof bCtor)){return false}for(var key in a){if(_.has(a,key)){size++;if(!(result=_.has(b,key)&&eq(a[key],b[key],aStack,bStack)))break}}if(result){for(key in b){if(_.has(b,key)&&!size--)break}result=!size}}aStack.pop();bStack.pop();return result};_.isEqual=function(a,b){return eq(a,b,[],[])};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true};_.isElement=function(obj){return!!(obj&&obj.nodeType===1)};_.isArray=nativeIsArray||function(obj){return toString.call(obj)=="[object Array]"};_.isObject=function(obj){return obj===Object(obj)};each(["Arguments","Function","String","Number","Date","RegExp"],function(name){_["is"+name]=function(obj){return toString.call(obj)=="[object "+name+"]"}});if(!_.isArguments(arguments)){_.isArguments=function(obj){return!!(obj&&_.has(obj,"callee"))}}if(typeof/./!=="function"){_.isFunction=function(obj){return typeof obj==="function"}}_.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj))};_.isNaN=function(obj){return _.isNumber(obj)&&obj!=+obj};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)=="[object Boolean]"};_.isNull=function(obj){return obj===null};_.isUndefined=function(obj){return obj===void 0};_.has=function(obj,key){return hasOwnProperty.call(obj,key)};_.noConflict=function(){root._=previousUnderscore;return this};_.identity=function(value){return value};_.times=function(n,iterator,context){var accum=Array(n);for(var i=0;i<n;i++)accum[i]=iterator.call(context,i);return accum};_.random=function(min,max){if(max==null){max=min;min=0}return min+Math.floor(Math.random()*(max-min+1))};var entityMap={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};entityMap.unescape=_.invert(entityMap.escape);var entityRegexes={escape:new RegExp("["+_.keys(entityMap.escape).join("")+"]","g"),unescape:new RegExp("("+_.keys(entityMap.unescape).join("|")+")","g")};_.each(["escape","unescape"],function(method){_[method]=function(string){if(string==null)return"";return(""+string).replace(entityRegexes[method],function(match){return entityMap[method][match]})}});_.result=function(object,property){if(object==null)return null;var value=object[property];return _.isFunction(value)?value.call(object):value};_.mixin=function(obj){each(_.functions(obj),function(name){var func=_[name]=obj[name];_.prototype[name]=function(){var args=[this._wrapped];push.apply(args,arguments);return result.call(this,func.apply(_,args))}})};var idCounter=0;_.uniqueId=function(prefix){var id=++idCounter+"";return prefix?prefix+id:id};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/(.)^/;var escapes={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"};var escaper=/\\|'|\r|\n|\t|\u2028|\u2029/g;_.template=function(text,data,settings){var render;settings=_.defaults({},settings,_.templateSettings);var matcher=new RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join("|")+"|$","g");var index=0;var source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,function(match){return"\\"+escapes[match]});if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'"}if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'"}if(evaluate){source+="';\n"+evaluate+"\n__p+='"}index=offset+match.length;return match});source+="';\n";if(!settings.variable)source="with(obj||{}){\n"+source+"}\n";source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+"return __p;\n";try{render=new Function(settings.variable||"obj","_",source)}catch(e){e.source=source;throw e}if(data)return render(data,_);var template=function(data){return render.call(this,data,_)};template.source="function("+(settings.variable||"obj")+"){\n"+source+"}";return template};_.chain=function(obj){return _(obj).chain()};var result=function(obj){return this._chain?_(obj).chain():obj};_.mixin(_);each(["pop","push","reverse","shift","sort","splice","unshift"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){var obj=this._wrapped;method.apply(obj,arguments);if((name=="shift"||name=="splice")&&obj.length===0)delete obj[0];return result.call(this,obj)}});each(["concat","join","slice"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){return result.call(this,method.apply(this._wrapped,arguments))}});_.extend(_.prototype,{chain:function(){this._chain=true;return this},value:function(){return this._wrapped}})}.call(this)}()},{}],21:[function(require,module,exports){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}();Leap=require("../lib/index")},{"../lib/index":8}]},{},[21]);
-
-/*
- * Leap Motion integration for Reveal.js.
- * James Sun  [sun16]
- * Rory Hardy [gneatgeek]
- */
-
-(function () {
-  var body        = document.body,
-      controller  = new Leap.Controller({ enableGestures: true }),
-      lastGesture = 0,
-      leapConfig  = Reveal.getConfig().leap,
-      pointer     = document.createElement( 'div' ),
-      config      = {
-        autoCenter       : true,      // Center pointer around detected position.
-        gestureDelay     : 500,       // How long to delay between gestures.
-        naturalSwipe     : true,      // Swipe as if it were a touch screen.
-        pointerColor     : '#00aaff', // Default color of the pointer.
-        pointerOpacity   : 0.7,       // Default opacity of the pointer.
-        pointerSize      : 15,        // Default minimum height/width of the pointer.
-        pointerTolerance : 120        // Bigger = slower pointer.
-      },
-      entered, enteredPosition, now, size, tipPosition; // Other vars we need later, but don't need to redeclare.
-
-      // Merge user defined settings with defaults
-      if( leapConfig ) {
-        for( key in leapConfig ) {
-          config[key] = leapConfig[key];
-        }
-      }
-
-      pointer.id = 'leap';
-
-      pointer.style.position        = 'absolute';
-      pointer.style.visibility      = 'hidden';
-      pointer.style.zIndex          = 50;
-      pointer.style.opacity         = config.pointerOpacity;
-      pointer.style.backgroundColor = config.pointerColor;
-
-      body.appendChild( pointer );
-
-  // Leap's loop
-  controller.on( 'frame', function ( frame ) {
-    // Timing code to rate limit gesture execution
-    now = new Date().getTime();
-
-    // Pointer: 1 to 2 fingers. Strictly one finger works but may cause innaccuracies.
-    // The innaccuracies were observed on a development model and may not be an issue with consumer models.
-    if( frame.fingers.length > 0 && frame.fingers.length < 3 ) {
-      // Invert direction and multiply by 3 for greater effect.
-      size = -3 * frame.fingers[0].tipPosition[2];
-
-      if( size < config.pointerSize ) {
-        size = config.pointerSize;
-      }
-
-      pointer.style.width        = size     + 'px';
-      pointer.style.height       = size     + 'px';
-      pointer.style.borderRadius = size - 5 + 'px';
-      pointer.style.visibility   = 'visible';
-
-      if( config.autoCenter ) {
-        tipPosition = frame.fingers[0].tipPosition;
-
-        // Check whether the finger has entered the z range of the Leap Motion. Used for the autoCenter option.
-        if( !entered ) {
-          entered         = true;
-          enteredPosition = frame.fingers[0].tipPosition;
-        }
-
-        pointer.style.top =
-          (-1 * (( tipPosition[1] - enteredPosition[1] ) * body.offsetHeight / config.pointerTolerance )) +
-            ( body.offsetHeight / 2 ) + 'px';
-
-        pointer.style.left =
-          (( tipPosition[0] - enteredPosition[0] ) * body.offsetWidth / config.pointerTolerance ) +
-            ( body.offsetWidth / 2 ) + 'px';
-      }
-      else {
-        pointer.style.top  = ( 1 - (( tipPosition[1] - 50) / config.pointerTolerance )) *
-          body.offsetHeight + 'px';
-
-        pointer.style.left = ( tipPosition[0] * body.offsetWidth / config.pointerTolerance ) +
-          ( body.offsetWidth / 2 ) + 'px';
-      }
-    }
-    else {
-      // Hide pointer on exit
-      entered                  = false;
-      pointer.style.visibility = 'hidden';
-    }
-
-    // Gestures
-    if( frame.gestures.length > 0 && (now - lastGesture) > config.gestureDelay ) {
-      var gesture = frame.gestures[0];
-
-      // One hand gestures
-      if( frame.hands.length === 1 ) {
-        // Swipe gestures. 3+ fingers.
-        if( frame.fingers.length > 2 && gesture.type === 'swipe' ) {
-          // Define here since some gestures will throw undefined for these.
-          var x = gesture.direction[0],
-              y = gesture.direction[1];
-
-          // Left/right swipe gestures
-          if( Math.abs( x ) > Math.abs( y )) {
-            if( x > 0 ) {
-              config.naturalSwipe ? Reveal.left() : Reveal.right();
-            }
-            else {
-              config.naturalSwipe ? Reveal.right() : Reveal.left();
-            }
-          }
-          // Up/down swipe gestures
-          else {
-            if( y > 0 ) {
-              config.naturalSwipe ? Reveal.down() : Reveal.up();
-            }
-            else {
-              config.naturalSwipe ? Reveal.up() : Reveal.down();
-            }
-          }
-
-          lastGesture = now;
-        }
-      }
-      // Two hand gestures
-      else if( frame.hands.length === 2 ) {
-        // Upward two hand swipe gesture
-        if( gesture.direction[1] > 0 && gesture.type === 'swipe' ) {
-          Reveal.toggleOverview();
-        }
-
-        lastGesture = now;
-      }
-    }
-  });
-
-  controller.connect();
-})();
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/markdown/example.html b/docs/slides/BOS14/_support/reveal.js/plugin/markdown/example.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/markdown/example.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Markdown Demo</title>
-
-		<link rel="stylesheet" href="../../css/reveal.css">
-		<link rel="stylesheet" href="../../css/theme/default.css" id="theme">
-
-        <link rel="stylesheet" href="../../lib/css/zenburn.css">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-                <!-- Use external markdown resource, separate slides by three newlines; vertical slides by two newlines -->
-                <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section>
-
-                <!-- Slides are separated by three dashes (quick 'n dirty regular expression) -->
-                <section data-markdown data-separator="---">
-                    <script type="text/template">
-                        ## Demo 1
-                        Slide 1
-                        ---
-                        ## Demo 1
-                        Slide 2
-                        ---
-                        ## Demo 1
-                        Slide 3
-                    </script>
-                </section>
-
-                <!-- Slides are separated by newline + three dashes + newline, vertical slides identical but two dashes -->
-                <section data-markdown data-separator="^\n---\n$" data-vertical="^\n--\n$">
-                    <script type="text/template">
-                        ## Demo 2
-                        Slide 1.1
-
-                        --
-
-                        ## Demo 2
-                        Slide 1.2
-
-                        ---
-
-                        ## Demo 2
-                        Slide 2
-                    </script>
-                </section>
-
-                <!-- No "extra" slides, since there are no separators defined (so they'll become horizontal rulers) -->
-                <section data-markdown>
-                    <script type="text/template">
-                        A
-
-                        ---
-
-                        B
-
-                        ---
-
-                        C
-                    </script>
-                </section>
-
-                <!-- Slide attributes -->
-                <section data-markdown>
-                    <script type="text/template">
-                        <!-- .slide: data-background="#000000" -->
-                        ## Slide attributes
-                    </script>
-                </section>
-
-                <!-- Element attributes -->
-                <section data-markdown>
-                    <script type="text/template">
-                        ## Element attributes
-                        - Item 1 <!-- .element: class="fragment" data-fragment-index="2" -->
-                        - Item 2 <!-- .element: class="fragment" data-fragment-index="1" -->
-                    </script>
-                </section>
-
-                <!-- Code -->
-                <section data-markdown>
-                    <script type="text/template">
-                        ```php
-                        public function foo()
-                        {
-                            $foo = array(
-                                'bar' => 'bar'
-                            )
-                        }
-                        ```
-                    </script>
-                </section>
-
-            </div>
-		</div>
-
-		<script src="../../lib/js/head.min.js"></script>
-		<script src="../../js/reveal.js"></script>
-
-		<script>
-
-			Reveal.initialize({
-				controls: true,
-				progress: true,
-				history: true,
-				center: true,
-
-				// Optional libraries used to extend on reveal.js
-				dependencies: [
-					{ src: '../../lib/js/classList.js', condition: function() { return !document.body.classList; } },
-					{ src: 'marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-                    { src: 'markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-                    { src: '../highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
-					{ src: '../notes/notes.js' }
-				]
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/markdown/example.md b/docs/slides/BOS14/_support/reveal.js/plugin/markdown/example.md
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/markdown/example.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Markdown Demo
-
-
-
-## External 1.1
-
-Content 1.1
-
-Note: This will only appear in the speaker notes window.
-
-
-## External 1.2
-
-Content 1.2
-
-
-
-## External 2
-
-Content 2.1
-
-
-
-## External 3.1
-
-Content 3.1
-
-
-## External 3.2
-
-Content 3.2
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/markdown/markdown.js b/docs/slides/BOS14/_support/reveal.js/plugin/markdown/markdown.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/markdown/markdown.js
+++ /dev/null
@@ -1,392 +0,0 @@
-/**
- * The reveal.js markdown plugin. Handles parsing of
- * markdown inside of presentations as well as loading
- * of external markdown documents.
- */
-(function( root, factory ) {
-	if( typeof exports === 'object' ) {
-		module.exports = factory( require( './marked' ) );
-	}
-	else {
-		// Browser globals (root is window)
-		root.RevealMarkdown = factory( root.marked );
-		root.RevealMarkdown.initialize();
-	}
-}( this, function( marked ) {
-
-	if( typeof marked === 'undefined' ) {
-		throw 'The reveal.js Markdown plugin requires marked to be loaded';
-	}
-
-	if( typeof hljs !== 'undefined' ) {
-		marked.setOptions({
-			highlight: function( lang, code ) {
-				return hljs.highlightAuto( lang, code ).value;
-			}
-		});
-	}
-
-	var DEFAULT_SLIDE_SEPARATOR = '^\n---\n$',
-		DEFAULT_NOTES_SEPARATOR = 'note:',
-		DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
-		DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
-
-
-	/**
-	 * Retrieves the markdown contents of a slide section
-	 * element. Normalizes leading tabs/whitespace.
-	 */
-	function getMarkdownFromSlide( section ) {
-
-		var template = section.querySelector( 'script' );
-
-		// strip leading whitespace so it isn't evaluated as code
-		var text = ( template || section ).textContent;
-
-		var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
-			leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
-
-		if( leadingTabs > 0 ) {
-			text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
-		}
-		else if( leadingWs > 1 ) {
-			text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' );
-		}
-
-		return text;
-
-	}
-
-	/**
-	 * Given a markdown slide section element, this will
-	 * return all arguments that aren't related to markdown
-	 * parsing. Used to forward any other user-defined arguments
-	 * to the output markdown slide.
-	 */
-	function getForwardedAttributes( section ) {
-
-		var attributes = section.attributes;
-		var result = [];
-
-		for( var i = 0, len = attributes.length; i < len; i++ ) {
-			var name = attributes[i].name,
-				value = attributes[i].value;
-
-			// disregard attributes that are used for markdown loading/parsing
-			if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
-
-			if( value ) {
-				result.push( name + '=' + value );
-			}
-			else {
-				result.push( name );
-			}
-		}
-
-		return result.join( ' ' );
-
-	}
-
-	/**
-	 * Inspects the given options and fills out default
-	 * values for what's not defined.
-	 */
-	function getSlidifyOptions( options ) {
-
-		options = options || {};
-		options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
-		options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
-		options.attributes = options.attributes || '';
-
-		return options;
-
-	}
-
-	/**
-	 * Helper function for constructing a markdown slide.
-	 */
-	function createMarkdownSlide( content, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
-
-		if( notesMatch.length === 2 ) {
-			content = notesMatch[0] + '<aside class="notes" data-markdown>' + notesMatch[1].trim() + '</aside>';
-		}
-
-		return '<script type="text/template">' + content + '</script>';
-
-	}
-
-	/**
-	 * Parses a data string into multiple slides based
-	 * on the passed in separator arguments.
-	 */
-	function slidify( markdown, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
-			horizontalSeparatorRegex = new RegExp( options.separator );
-
-		var matches,
-			lastIndex = 0,
-			isHorizontal,
-			wasHorizontal = true,
-			content,
-			sectionStack = [];
-
-		// iterate until all blocks between separators are stacked up
-		while( matches = separatorRegex.exec( markdown ) ) {
-			notes = null;
-
-			// determine direction (horizontal by default)
-			isHorizontal = horizontalSeparatorRegex.test( matches[0] );
-
-			if( !isHorizontal && wasHorizontal ) {
-				// create vertical stack
-				sectionStack.push( [] );
-			}
-
-			// pluck slide content from markdown input
-			content = markdown.substring( lastIndex, matches.index );
-
-			if( isHorizontal && wasHorizontal ) {
-				// add to horizontal stack
-				sectionStack.push( content );
-			}
-			else {
-				// add to vertical stack
-				sectionStack[sectionStack.length-1].push( content );
-			}
-
-			lastIndex = separatorRegex.lastIndex;
-			wasHorizontal = isHorizontal;
-		}
-
-		// add the remaining slide
-		( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
-
-		var markdownSections = '';
-
-		// flatten the hierarchical stack, and insert <section data-markdown> tags
-		for( var i = 0, len = sectionStack.length; i < len; i++ ) {
-			// vertical
-			if( sectionStack[i] instanceof Array ) {
-				markdownSections += '<section '+ options.attributes +'>';
-
-				sectionStack[i].forEach( function( child ) {
-					markdownSections += '<section data-markdown>' +  createMarkdownSlide( child, options ) + '</section>';
-				} );
-
-				markdownSections += '</section>';
-			}
-			else {
-				markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
-			}
-		}
-
-		return markdownSections;
-
-	}
-
-	/**
-	 * Parses any current data-markdown slides, splits
-	 * multi-slide markdown into separate sections and
-	 * handles loading of external markdown.
-	 */
-	function processSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]'),
-			section;
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			section = sections[i];
-
-			if( section.getAttribute( 'data-markdown' ).length ) {
-
-				var xhr = new XMLHttpRequest(),
-					url = section.getAttribute( 'data-markdown' );
-
-				datacharset = section.getAttribute( 'data-charset' );
-
-				// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
-				if( datacharset != null && datacharset != '' ) {
-					xhr.overrideMimeType( 'text/html; charset=' + datacharset );
-				}
-
-				xhr.onreadystatechange = function() {
-					if( xhr.readyState === 4 ) {
-						if ( xhr.status >= 200 && xhr.status < 300 ) {
-
-							section.outerHTML = slidify( xhr.responseText, {
-								separator: section.getAttribute( 'data-separator' ),
-								verticalSeparator: section.getAttribute( 'data-vertical' ),
-								notesSeparator: section.getAttribute( 'data-notes' ),
-								attributes: getForwardedAttributes( section )
-							});
-
-						}
-						else {
-
-							section.outerHTML = '<section data-state="alert">' +
-								'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
-								'Check your browser\'s JavaScript console for more details.' +
-								'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
-								'</section>';
-
-						}
-					}
-				};
-
-				xhr.open( 'GET', url, false );
-
-				try {
-					xhr.send();
-				}
-				catch ( e ) {
-					alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
-				}
-
-			}
-			else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-vertical' ) || section.getAttribute( 'data-notes' ) ) {
-
-				section.outerHTML = slidify( getMarkdownFromSlide( section ), {
-					separator: section.getAttribute( 'data-separator' ),
-					verticalSeparator: section.getAttribute( 'data-vertical' ),
-					notesSeparator: section.getAttribute( 'data-notes' ),
-					attributes: getForwardedAttributes( section )
-				});
-
-			}
-			else {
-				section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
-			}
-		}
-
-	}
-
-	/**
-	 * Check if a node value has the attributes pattern.
-	 * If yes, extract it and add that value as one or several attributes
-	 * the the terget element.
-	 *
-	 * You need Cache Killer on Chrome to see the effect on any FOM transformation
-	 * directly on refresh (F5)
-	 * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
-	 */
-	function addAttributeInElement( node, elementTarget, separator ) {
-
-		var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
-		var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' );
-		var nodeValue = node.nodeValue;
-		if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
-
-			var classes = matches[1];
-			nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
-			node.nodeValue = nodeValue;
-			while( matchesClass = mardownClassRegex.exec( classes ) ) {
-				elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Add attributes to the parent element of a text node,
-	 * or the element of an attribute node.
-	 */
-	function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
-
-		if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
-			previousParentElement = element;
-			for( var i = 0; i < element.childNodes.length; i++ ) {
-				childElement = element.childNodes[i];
-				if ( i > 0 ) {
-					j = i - 1;
-					while ( j >= 0 ) {
-						aPreviousChildElement = element.childNodes[j];
-						if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
-							previousParentElement = aPreviousChildElement;
-							break;
-						}
-						j = j - 1;
-					}
-				}
-				parentSection = section;
-				if( childElement.nodeName ==  "section" ) {
-					parentSection = childElement ;
-					previousParentElement = childElement ;
-				}
-				if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
-					addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
-				}
-			}
-		}
-
-		if ( element.nodeType == Node.COMMENT_NODE ) {
-			if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
-				addAttributeInElement( element, section, separatorSectionAttributes );
-			}
-		}
-	}
-
-	/**
-	 * Converts any current data-markdown slides in the
-	 * DOM to HTML.
-	 */
-	function convertSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]');
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			var section = sections[i];
-
-			// Only parse the same slide once
-			if( !section.getAttribute( 'data-markdown-parsed' ) ) {
-
-				section.setAttribute( 'data-markdown-parsed', true )
-
-				var notes = section.querySelector( 'aside.notes' );
-				var markdown = getMarkdownFromSlide( section );
-
-				section.innerHTML = marked( markdown );
-				addAttributes( 	section, section, null, section.getAttribute( 'data-element-attributes' ) ||
-								section.parentNode.getAttribute( 'data-element-attributes' ) ||
-								DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
-								section.getAttribute( 'data-attributes' ) ||
-								section.parentNode.getAttribute( 'data-attributes' ) ||
-								DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
-
-				// If there were notes, we need to re-add them after
-				// having overwritten the section's HTML
-				if( notes ) {
-					section.appendChild( notes );
-				}
-
-			}
-
-		}
-
-	}
-
-	// API
-	return {
-
-		initialize: function() {
-			processSlides();
-			convertSlides();
-		},
-
-		// TODO: Do these belong in the API?
-		processSlides: processSlides,
-		convertSlides: convertSlides,
-		slidify: slidify
-
-	};
-
-}));
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/markdown/marked.js b/docs/slides/BOS14/_support/reveal.js/plugin/markdown/marked.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/markdown/marked.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
- */
-
-(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
-text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";block.html=replace(block.html)("comment",/\x3c!--[\s\S]*?--\x3e/)("closed",
-/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1",
-"\\2")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm)if(this.options.tables)this.rules=block.tables;else this.rules=block.gfm}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};
-Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1)this.tokens.push({type:"space"})}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,
-"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,
-"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]="center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].split(/ *\| */);this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=
-src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);
-bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+
-1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item[item.length-1]==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script",text:cap[0]});continue}if(top&&
-(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]=
-"center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */);this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1][cap[1].length-1]==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",
-text:cap[0]});continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^\x3c!--[\s\S]*?--\x3e|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
-code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([^\s]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
-em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;
-if(!this.links)throw new Error("Tokens array requires a `links` property.");if(this.options.gfm)if(this.options.breaks)this.rules=inline.breaks;else this.rules=inline.gfm;else if(this.options.pedantic)this.rules=inline.pedantic}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);
-out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1][6]===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.url.exec(src)){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.tag.exec(src)){src=src.substring(cap[0].length);
-out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);out+=this.outputLink(cap,{href:cap[2],title:cap[3]});continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0][0];src=cap[0].substring(1)+src;continue}out+=this.outputLink(cap,link);continue}if(cap=this.rules.strong.exec(src)){src=
-src.substring(cap[0].length);out+="<strong>"+this.output(cap[2]||cap[1])+"</strong>";continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+="<em>"+this.output(cap[2]||cap[1])+"</em>";continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+="<code>"+escape(cap[2],true)+"</code>";continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+="<br>";continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+="<del>"+
-this.output(cap[1])+"</del>";continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(cap[0]);continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return out};InlineLexer.prototype.outputLink=function(cap,link){if(cap[0][0]!=="!")return'<a href="'+escape(link.href)+'"'+(link.title?' title="'+escape(link.title)+'"':"")+">"+this.output(cap[1])+"</a>";else return'<img src="'+escape(link.href)+'" alt="'+escape(cap[1])+'"'+(link.title?' title="'+
-escape(link.title)+'"':"")+">"};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,"\u2014").replace(/'([^']*)'/g,"\u2018$1\u2019").replace(/"([^"]*)"/g,"\u201c$1\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>0.5)ch="x"+ch.toString(16);out+="&#"+ch+";"}return out};function Parser(options){this.tokens=[];this.token=null;
-this.options=options||marked.defaults}Parser.parse=function(src,options){var parser=new Parser(options);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options);this.tokens=src.reverse();var out="";while(this.next())out+=this.tok();return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;
-while(this.peek().type==="text")body+="\n"+this.next().text;return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case "space":return"";case "hr":return"<hr>\n";case "heading":return"<h"+this.token.depth+">"+this.inline.output(this.token.text)+"</h"+this.token.depth+">\n";case "code":if(this.options.highlight){var code=this.options.highlight(this.token.text,this.token.lang);if(code!=null&&code!==this.token.text){this.token.escaped=true;this.token.text=code}}if(!this.token.escaped)this.token.text=
-escape(this.token.text,true);return"<pre><code"+(this.token.lang?' class="'+this.options.langPrefix+this.token.lang+'"':"")+">"+this.token.text+"</code></pre>\n";case "table":var body="",heading,i,row,cell,j;body+="<thead>\n<tr>\n";for(i=0;i<this.token.header.length;i++){heading=this.inline.output(this.token.header[i]);body+=this.token.align[i]?'<th align="'+this.token.align[i]+'">'+heading+"</th>\n":"<th>"+heading+"</th>\n"}body+="</tr>\n</thead>\n";body+="<tbody>\n";for(i=0;i<this.token.cells.length;i++){row=
-this.token.cells[i];body+="<tr>\n";for(j=0;j<row.length;j++){cell=this.inline.output(row[j]);body+=this.token.align[j]?'<td align="'+this.token.align[j]+'">'+cell+"</td>\n":"<td>"+cell+"</td>\n"}body+="</tr>\n"}body+="</tbody>\n";return"<table>\n"+body+"</table>\n";case "blockquote_start":var body="";while(this.next().type!=="blockquote_end")body+=this.tok();return"<blockquote>\n"+body+"</blockquote>\n";case "list_start":var type=this.token.ordered?"ol":"ul",body="";while(this.next().type!=="list_end")body+=
-this.tok();return"<"+type+">\n"+body+"</"+type+">\n";case "list_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.token.type==="text"?this.parseText():this.tok();return"<li>"+body+"</li>\n";case "loose_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.tok();return"<li>"+body+"</li>\n";case "html":return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;case "paragraph":return"<p>"+this.inline.output(this.token.text)+
-"</p>\n";case "text":return"<p>"+this.parseText()+"</p>\n"}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=
-1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target)if(Object.prototype.hasOwnProperty.call(target,key))obj[key]=target[key]}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}if(opt)opt=merge({},marked.defaults,opt);var tokens=Lexer.lex(tokens,opt),highlight=opt.highlight,pending=0,l=tokens.length,i=0;if(!highlight||highlight.length<3)return callback(null,Parser.parse(tokens,opt));var done=function(){delete opt.highlight;
-var out=Parser.parse(tokens,opt);opt.highlight=highlight;return callback(null,out)};for(;i<l;i++)(function(token){if(token.type!=="code")return;pending++;return highlight(token.text,token.lang,function(err,code){if(code==null||code===token.text)return--pending||done();token.text=code;token.escaped=true;--pending||done()})})(tokens[i]);return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";
-if((opt||marked.defaults).silent)return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>";throw e;}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:""};marked.Parser=Parser;marked.parser=Parser.parse;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;
-marked.parse=marked;if(typeof exports==="object")module.exports=marked;else if(typeof define==="function"&&define.amd)define(function(){return marked});else this.marked=marked}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/math/math.js b/docs/slides/BOS14/_support/reveal.js/plugin/math/math.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/math/math.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * A plugin which enables rendering of math equations inside
- * of reveal.js slides. Essentially a thin wrapper for MathJax.
- *
- * @author Hakim El Hattab
- */
-var RevealMath = window.RevealMath || (function(){
-
-	var options = Reveal.getConfig().math || {};
-	options.mathjax = options.mathjax || 'http://cdn.mathjax.org/mathjax/latest/MathJax.js';
-	options.config = options.config || 'TeX-AMS_HTML-full';
-
-	loadScript( options.mathjax + '?config=' + options.config, function() {
-
-		MathJax.Hub.Config({
-			messageStyle: 'none',
-			tex2jax: { inlineMath: [['$','$'],['\\(','\\)']] },
-			skipStartupTypeset: true
-		});
-
-		// Typeset followed by an immediate reveal.js layout since
-		// the typesetting process could affect slide height
-		MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] );
-		MathJax.Hub.Queue( Reveal.layout );
-
-		// Reprocess equations in slides when they turn visible
-		Reveal.addEventListener( 'slidechanged', function( event ) {
-
-			MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] );
-
-		} );
-
-	} );
-
-	function loadScript( url, callback ) {
-
-		var head = document.querySelector( 'head' );
-		var script = document.createElement( 'script' );
-		script.type = 'text/javascript';
-		script.src = url;
-
-		// Wrapper for callback to make sure it only fires once
-		var finish = function() {
-			if( typeof callback === 'function' ) {
-				callback.call();
-				callback = null;
-			}
-		}
-
-		script.onload = finish;
-
-		// IE
-		script.onreadystatechange = function() {
-			if ( this.readyState === 'loaded' ) {
-				finish();
-			}
-		}
-
-		// Normal browsers
-		head.appendChild( script );
-
-	}
-
-})();
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/client.js b/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/client.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/client.js
+++ /dev/null
@@ -1,13 +0,0 @@
-(function() {
-	var multiplex = Reveal.getConfig().multiplex;
-	var socketId = multiplex.id;
-	var socket = io.connect(multiplex.url);
-
-	socket.on(multiplex.id, function(data) {
-		// ignore data from sockets that aren't ours
-		if (data.socketId !== socketId) { return; }
-		if( window.location.host === 'localhost:1947' ) return;
-
-		Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote');
-	});
-}());
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/index.js b/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/index.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var express		= require('express');
-var fs			= require('fs');
-var io			= require('socket.io');
-var crypto		= require('crypto');
-
-var app			= express.createServer();
-var staticDir	= express.static;
-
-io				= io.listen(app);
-
-var opts = {
-	port: 1948,
-	baseDir : __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		if (typeof slideData.secret == 'undefined' || slideData.secret == null || slideData.secret === '') return;
-		if (createHash(slideData.secret) === slideData.socketId) {
-			slideData.secret = null;
-			socket.broadcast.emit(slideData.socketId, slideData);
-		};
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/token", function(req,res) {
-	var ts = new Date().getTime();
-	var rand = Math.floor(Math.random()*9999999);
-	var secret = ts.toString() + rand.toString();
-	res.send({secret: secret, socketId: createHash(secret)});
-});
-
-var createHash = function(secret) {
-	var cipher = crypto.createCipher('blowfish', secret);
-	return(cipher.final('hex'));
-};
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset );
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/master.js b/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/master.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/multiplex/master.js
+++ /dev/null
@@ -1,51 +0,0 @@
-(function() {
-	// Don't emit events from inside of notes windows
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var multiplex = Reveal.getConfig().multiplex;
-
-	var socket = io.connect(multiplex.url);
-
-	var notify = function( slideElement, indexh, indexv, origin ) {
-		if( typeof origin === 'undefined' && origin !== 'remote' ) {
-			var nextindexh;
-			var nextindexv;
-
-			var fragmentindex = Reveal.getIndices().f;
-			if (typeof fragmentindex == 'undefined') {
-				fragmentindex = 0;
-			}
-
-			if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-				nextindexh = indexh;
-				nextindexv = indexv + 1;
-			} else {
-				nextindexh = indexh + 1;
-				nextindexv = 0;
-			}
-
-			var slideData = {
-				indexh : indexh,
-				indexv : indexv,
-				indexf : fragmentindex,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				secret: multiplex.secret,
-				socketId : multiplex.id
-			};
-
-			socket.emit('slidechanged', slideData);
-		}
-	}
-
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		notify( event.currentSlide, event.indexh, event.indexv, event.origin );
-	} );
-
-	var fragmentNotify = function( event ) {
-		notify( Reveal.getCurrentSlide(), Reveal.getIndices().h, Reveal.getIndices().v, event.origin );
-	};
-
-	Reveal.addEventListener( 'fragmentshown', fragmentNotify );
-	Reveal.addEventListener( 'fragmenthidden', fragmentNotify );
-}());
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/client.js b/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/client.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/client.js
+++ /dev/null
@@ -1,57 +0,0 @@
-(function() {
-	// don't emit events from inside the previews themselves
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var socket = io.connect(window.location.origin);
-	var socketId = Math.random().toString().slice(2);
-	
-	console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
-	window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);
-
-	// Fires when a fragment is shown
-	Reveal.addEventListener( 'fragmentshown', function( event ) {
-		var fragmentData = {
-			fragment : 'next',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when a fragment is hidden
-	Reveal.addEventListener( 'fragmenthidden', function( event ) {
-		var fragmentData = {
-			fragment : 'previous',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when slide is changed
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		var nextindexh;
-		var nextindexv;
-		var slideElement = event.currentSlide;
-
-		if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-			nextindexh = event.indexh;
-			nextindexv = event.indexv + 1;
-		} else {
-			nextindexh = event.indexh + 1;
-			nextindexv = 0;
-		}
-
-		var notes = slideElement.querySelector('aside.notes');
-		var slideData = {
-			notes : notes ? notes.innerHTML : '',
-			indexh : event.indexh,
-			indexv : event.indexv,
-			nextindexh : nextindexh,
-			nextindexv : nextindexv,
-			socketId : socketId,
-			markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false
-
-		};
-
-		socket.emit('slidechanged', slideData);
-	} );
-}());
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/index.js b/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/index.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/index.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var express   = require('express');
-var fs        = require('fs');
-var io        = require('socket.io');
-var _         = require('underscore');
-var Mustache  = require('mustache');
-
-var app       = express.createServer();
-var staticDir = express.static;
-
-io            = io.listen(app);
-
-var opts = {
-	port :      1947,
-	baseDir :   __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		socket.broadcast.emit('slidedata', slideData);
-	});
-	socket.on('fragmentchanged', function(fragmentData) {
-		socket.broadcast.emit('fragmentdata', fragmentData);
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/notes/:socketId", function(req, res) {
-
-	fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
-		res.send(Mustache.to_html(data.toString(), {
-			socketId : req.params.socketId
-		}));
-	});
-	// fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
-});
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
-
-console.log( brown + "reveal.js - Speaker Notes" + reset );
-console.log( "1. Open the slides at " + green + slidesLocation + reset );
-console.log( "2. Click on the link your JS console to go to the notes page" );
-console.log( "3. Advance through your slides and your notes will advance automatically" );
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/notes.html b/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/notes.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/notes-server/notes.html
+++ /dev/null
@@ -1,142 +0,0 @@
-<!doctype html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8">
-
-		<meta name="viewport" content="width=1150">
-
-		<title>reveal.js - Slide Notes</title>
-
-		<style>
-			body {
-				font-family: Helvetica;
-			}
-
-			#notes {
-				font-size: 24px;
-				width: 640px;
-				margin-top: 5px;
-				clear: left;
-			}
-
-			#wrap-current-slide {
-				width: 640px;
-				height: 512px;
-				float: left;
-				overflow: hidden;
-			}
-
-			#current-slide {
-				width: 1280px;
-				height: 1024px;
-				border: none;
-
-				-webkit-transform-origin: 0 0;
-				   -moz-transform-origin: 0 0;
-				    -ms-transform-origin: 0 0;
-				     -o-transform-origin: 0 0;
-				        transform-origin: 0 0;
-
-				-webkit-transform: scale(0.5);
-				   -moz-transform: scale(0.5);
-				    -ms-transform: scale(0.5);
-				     -o-transform: scale(0.5);
-				        transform: scale(0.5);
-			}
-
-			#wrap-next-slide {
-				width: 448px;
-				height: 358px;
-				float: left;
-				margin: 0 0 0 10px;
-				overflow: hidden;
-			}
-
-			#next-slide {
-				width: 1280px;
-				height: 1024px;
-				border: none;
-
-				-webkit-transform-origin: 0 0;
-				   -moz-transform-origin: 0 0;
-				    -ms-transform-origin: 0 0;
-				     -o-transform-origin: 0 0;
-				        transform-origin: 0 0;
-
-				-webkit-transform: scale(0.35);
-				   -moz-transform: scale(0.35);
-				    -ms-transform: scale(0.35);
-				     -o-transform: scale(0.35);
-				        transform: scale(0.35);
-			}
-
-			.slides {
-				position: relative;
-				margin-bottom: 10px;
-				border: 1px solid black;
-				border-radius: 2px;
-				background: rgb(28, 30, 32);
-			}
-
-			.slides span {
-				position: absolute;
-				top: 3px;
-				left: 3px;
-				font-weight: bold;
-				font-size: 14px;
-				color: rgba( 255, 255, 255, 0.9 );
-			}
-		</style>
-	</head>
-
-	<body>
-
-		<div id="wrap-current-slide" class="slides">
-			<iframe src="/?receiver" width="1280" height="1024" id="current-slide"></iframe>
-		</div>
-
-		<div id="wrap-next-slide" class="slides">
-			<iframe src="/?receiver" width="640" height="512" id="next-slide"></iframe>
-			<span>UPCOMING:</span>
-		</div>
-		<div id="notes"></div>
-
-		<script src="/socket.io/socket.io.js"></script>
-		<script src="/plugin/markdown/marked.js"></script>
-
-		<script>
-		var socketId = '{{socketId}}';
-		var socket = io.connect(window.location.origin);
-		var notes = document.getElementById('notes');
-		var currentSlide = document.getElementById('current-slide');
-		var nextSlide = document.getElementById('next-slide');
-
-		socket.on('slidedata', function(data) {
-			// ignore data from sockets that aren't ours
-			if (data.socketId !== socketId) { return; }
-
-			if (data.markdown) {
-				notes.innerHTML = marked(data.notes);
-			}
-			else {
-				notes.innerHTML = data.notes;
-			}
-
-			currentSlide.contentWindow.Reveal.slide(data.indexh, data.indexv);
-			nextSlide.contentWindow.Reveal.slide(data.nextindexh, data.nextindexv);
-		});
-		socket.on('fragmentdata', function(data) {
-			// ignore data from sockets that aren't ours
-			if (data.socketId !== socketId) { return; }
-
-			if (data.fragment === 'next') {
-				currentSlide.contentWindow.Reveal.nextFragment();
-			}
-			else if (data.fragment === 'previous') {
-				currentSlide.contentWindow.Reveal.prevFragment();
-			}
-		});
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/notes/notes.html b/docs/slides/BOS14/_support/reveal.js/plugin/notes/notes.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/notes/notes.html
+++ /dev/null
@@ -1,267 +0,0 @@
-<!doctype html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Slide Notes</title>
-
-		<style>
-			body {
-				font-family: Helvetica;
-			}
-
-			#notes {
-				font-size: 24px;
-				width: 640px;
-				margin-top: 5px;
-				clear: left;
-			}
-
-			#wrap-current-slide {
-				width: 640px;
-				height: 512px;
-				float: left;
-				overflow: hidden;
-			}
-
-			#current-slide {
-				width: 1280px;
-				height: 1024px;
-				border: none;
-
-				-webkit-transform-origin: 0 0;
-				   -moz-transform-origin: 0 0;
-					-ms-transform-origin: 0 0;
-					 -o-transform-origin: 0 0;
-						transform-origin: 0 0;
-
-				-webkit-transform: scale(0.5);
-				   -moz-transform: scale(0.5);
-					-ms-transform: scale(0.5);
-					 -o-transform: scale(0.5);
-						transform: scale(0.5);
-			}
-
-			#wrap-next-slide {
-				width: 448px;
-				height: 358px;
-				float: left;
-				margin: 0 0 0 10px;
-				overflow: hidden;
-			}
-
-			#next-slide {
-				width: 1280px;
-				height: 1024px;
-				border: none;
-
-				-webkit-transform-origin: 0 0;
-				   -moz-transform-origin: 0 0;
-					-ms-transform-origin: 0 0;
-					 -o-transform-origin: 0 0;
-						transform-origin: 0 0;
-
-				-webkit-transform: scale(0.35);
-				   -moz-transform: scale(0.35);
-					-ms-transform: scale(0.35);
-					 -o-transform: scale(0.35);
-						transform: scale(0.35);
-			}
-
-			.slides {
-				position: relative;
-				margin-bottom: 10px;
-				border: 1px solid black;
-				border-radius: 2px;
-				background: rgb(28, 30, 32);
-			}
-
-			.slides span {
-				position: absolute;
-				top: 3px;
-				left: 3px;
-				font-weight: bold;
-				font-size: 14px;
-				color: rgba( 255, 255, 255, 0.9 );
-			}
-
-			.error {
-				font-weight: bold;
-				color: red;
-				font-size: 1.5em;
-				text-align: center;
-				margin-top: 10%;
-			}
-
-			.error code {
-				font-family: monospace;
-			}
-
-			.time {
-				width: 448px;
-				margin: 30px 0 0 10px;
-				float: left;
-				text-align: center;
-				opacity: 0;
-
-				-webkit-transition: opacity 0.4s;
-				   -moz-transition: opacity 0.4s;
-				     -o-transition: opacity 0.4s;
-				        transition: opacity 0.4s;
-			}
-
-			.elapsed,
-			.clock {
-				color: #333;
-				font-size: 2em;
-				text-align: center;
-				display: inline-block;
-				padding: 0.5em;
-				background-color: #eee;
-				border-radius: 10px;
-			}
-
-			.elapsed h2,
-			.clock h2 {
-				font-size: 0.8em;
-				line-height: 100%;
-				margin: 0;
-				color: #aaa;
-			}
-
-			.elapsed .mute {
-				color: #ddd;
-			}
-
-		</style>
-	</head>
-
-	<body>
-
-		<script>
-			function getNotesURL( controls ) {
-				return window.opener.location.protocol + '//' + window.opener.location.host + window.opener.location.pathname + '?receiver&controls='+ ( controls || 'false' ) +'&progress=false&overview=false' + window.opener.location.hash;
-			}
-			var notesCurrentSlideURL = getNotesURL( true );
-			var notesNextSlideURL = getNotesURL( false );
-		</script>
-
-		<div id="wrap-current-slide" class="slides">
-			<script>document.write( '<iframe width="1280" height="1024" id="current-slide" src="'+ notesCurrentSlideURL +'"></iframe>' );</script>
-		</div>
-
-		<div id="wrap-next-slide" class="slides">
-			<script>document.write( '<iframe width="640" height="512" id="next-slide" src="'+ notesNextSlideURL +'"></iframe>' );</script>
-			<span>UPCOMING:</span>
-		</div>
-
-		<div class="time">
-			<div class="clock">
-				<h2>Time</h2>
-				<span id="clock">0:00:00 AM</span>
-			</div>
-			<div class="elapsed">
-				<h2>Elapsed</h2>
-				<span id="hours">00</span><span id="minutes">:00</span><span id="seconds">:00</span>
-			</div>
-		</div>
-
-		<div id="notes"></div>
-
-		<script src="../../plugin/markdown/marked.js"></script>
-		<script>
-
-			window.addEventListener( 'load', function() {
-
-				if( window.opener && window.opener.location && window.opener.location.href ) {
-
-					var notes = document.getElementById( 'notes' ),
-						currentSlide = document.getElementById( 'current-slide' ),
-						nextSlide = document.getElementById( 'next-slide' ),
-						silenced = false;
-
-					window.addEventListener( 'message', function( event ) {
-						var data = JSON.parse( event.data );
-
-						// No need for updating the notes in case of fragment changes
-						if ( data.notes !== undefined) {
-							if( data.markdown ) {
-								notes.innerHTML = marked( data.notes );
-							}
-							else {
-								notes.innerHTML = data.notes;
-							}
-						}
-
-						silenced = true;
-
-						// Update the note slides
-						currentSlide.contentWindow.Reveal.slide( data.indexh, data.indexv, data.indexf );
-						nextSlide.contentWindow.Reveal.slide( data.nextindexh, data.nextindexv );
-
-						silenced = false;
-
-					}, false );
-
-					var start = new Date(),
-						timeEl = document.querySelector( '.time' ),
-						clockEl = document.getElementById( 'clock' ),
-						hoursEl = document.getElementById( 'hours' ),
-						minutesEl = document.getElementById( 'minutes' ),
-						secondsEl = document.getElementById( 'seconds' );
-
-					setInterval( function() {
-
-						timeEl.style.opacity = 1;
-
-						var diff, hours, minutes, seconds,
-							now = new Date();
-
-						diff = now.getTime() - start.getTime();
-						hours = Math.floor( diff / ( 1000 * 60 * 60 ) );
-						minutes = Math.floor( ( diff / ( 1000 * 60 ) ) % 60 );
-						seconds = Math.floor( ( diff / 1000 ) % 60 );
-
-						clockEl.innerHTML = now.toLocaleTimeString();
-						hoursEl.innerHTML = zeroPadInteger( hours );
-						hoursEl.className = hours > 0 ? "" : "mute";
-						minutesEl.innerHTML = ":" + zeroPadInteger( minutes );
-						minutesEl.className = minutes > 0 ? "" : "mute";
-						secondsEl.innerHTML = ":" + zeroPadInteger( seconds );
-
-					}, 1000 );
-
-					// Broadcasts the state of the notes window to synchronize
-					// the main window
-					function synchronizeMainWindow() {
-
-						if( !silenced ) {
-							var indices = currentSlide.contentWindow.Reveal.getIndices();
-							window.opener.Reveal.slide( indices.h, indices.v, indices.f );
-						}
-
-					}
-
-					// Navigate the main window when the notes slide changes
-					currentSlide.contentWindow.Reveal.addEventListener( 'slidechanged', synchronizeMainWindow );
-					currentSlide.contentWindow.Reveal.addEventListener( 'fragmentshown', synchronizeMainWindow );
-					currentSlide.contentWindow.Reveal.addEventListener( 'fragmenthidden', synchronizeMainWindow );
-
-				}
-				else {
-
-					document.body.innerHTML =  '<p class="error">Unable to access <code>window.opener.location</code>.<br>Make sure the presentation is running on a web server.</p>';
-
-				}
-
-
-			}, false );
-
-			function zeroPadInteger( num ) {
-				var str = "00" + parseInt( num );
-				return str.substring( str.length - 2 );
-			}
-
-		</script>
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/notes/notes.js b/docs/slides/BOS14/_support/reveal.js/plugin/notes/notes.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/notes/notes.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Handles opening of and synchronization with the reveal.js
- * notes window.
- */
-var RevealNotes = (function() {
-
-	function openNotes() {
-		var jsFileLocation = document.querySelector('script[src$="notes.js"]').src;  // this js file path
-		jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, '');   // the js folder path
-		var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
-
-		// Fires when slide is changed
-		Reveal.addEventListener( 'slidechanged', post );
-
-		// Fires when a fragment is shown
-		Reveal.addEventListener( 'fragmentshown', post );
-
-		// Fires when a fragment is hidden
-		Reveal.addEventListener( 'fragmenthidden', post );
-
-		/**
-		 * Posts the current slide data to the notes window
-		 */
-		function post() {
-			var slideElement = Reveal.getCurrentSlide(),
-				slideIndices = Reveal.getIndices(),
-				messageData;
-
-			var notes = slideElement.querySelector( 'aside.notes' ),
-				nextindexh,
-				nextindexv;
-
-			if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
-				nextindexh = slideIndices.h;
-				nextindexv = slideIndices.v + 1;
-			} else {
-				nextindexh = slideIndices.h + 1;
-				nextindexv = 0;
-			}
-
-			messageData = {
-				notes : notes ? notes.innerHTML : '',
-				indexh : slideIndices.h,
-				indexv : slideIndices.v,
-				indexf : slideIndices.f,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
-			};
-
-			notesPopup.postMessage( JSON.stringify( messageData ), '*' );
-		}
-
-		// Navigate to the current slide when the notes are loaded
-		notesPopup.addEventListener( 'load', function( event ) {
-			post();
-		}, false );
-	}
-
-	// If the there's a 'notes' query set, open directly
-	if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
-		openNotes();
-	}
-
-	// Open the notes when the 's' key is hit
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openNotes();
-		}
-	}, false );
-
-	return { open: openNotes };
-})();
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/postmessage/example.html b/docs/slides/BOS14/_support/reveal.js/plugin/postmessage/example.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/postmessage/example.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<html>
-	<body>
-
-		<iframe id="reveal" src="../../index.html" style="border: 0;" width="500" height="500"></iframe>
-
-		<div>
-			<input id="back" type="button" value="go back"/>
-			<input id="ahead" type="button" value="go ahead"/>
-			<input id="slideto" type="button" value="slideto 2-2"/>
-		</div>
-
-		<script>
-
-			(function (){
-
-				var back = document.getElementById( 'back' ),
-						ahead = document.getElementById( 'ahead' ),
-						slideto = document.getElementById( 'slideto' ),
-						reveal =  window.frames[0];
-
-					back.addEventListener( 'click', function () {
-						
-					reveal.postMessage( JSON.stringify({method: 'prev', args: []}), '*' );
-				}, false );
-
-				ahead.addEventListener( 'click', function (){
-					reveal.postMessage( JSON.stringify({method: 'next', args: []}), '*' );
-				}, false );
-
-				slideto.addEventListener( 'click', function (){
-					reveal.postMessage( JSON.stringify({method: 'slide', args: [2,2]}), '*' );
-				}, false );
-
-			}());
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/postmessage/postmessage.js b/docs/slides/BOS14/_support/reveal.js/plugin/postmessage/postmessage.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/postmessage/postmessage.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-
-	simple postmessage plugin
-
-	Useful when a reveal slideshow is inside an iframe.
-	It allows to call reveal methods from outside.
-
-	Example:
-		 var reveal =  window.frames[0];
-
-		 // Reveal.prev(); 
-		 reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
-		 // Reveal.next(); 
-		 reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
-		 // Reveal.slide(2, 2); 
-		 reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
-
-	Add to the slideshow:
-
-		dependencies: [
-			...
-			{ src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
-		]
-
-*/
-
-(function (){
-
-	window.addEventListener( "message", function ( event ) {
-		var data = JSON.parse( event.data ),
-				method = data.method,
-				args = data.args;
-
-		if( typeof Reveal[method] === 'function' ) {
-			Reveal[method].apply( Reveal, data.args );
-		}
-	}, false);
-
-}());
-
-
-
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/print-pdf/print-pdf.js b/docs/slides/BOS14/_support/reveal.js/plugin/print-pdf/print-pdf.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/print-pdf/print-pdf.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * phantomjs script for printing presentations to PDF.
- *
- * Example:
- * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
- *
- * By Manuel Bieh (https://github.com/manuelbieh)
- */
-
-// html2pdf.js
-var page = new WebPage();
-var system = require( 'system' );
-
-page.viewportSize  = {
-	width: 1024,
-	height: 768
-};
-
-page.paperSize = {
-	format: 'letter',
-	orientation: 'landscape',
-	margin: {
-		left: '0',
-		right: '0',
-		top: '0',
-		bottom: '0'
-	}
-};
-
-var revealFile = system.args[1] || 'index.html?print-pdf';
-var slideFile = system.args[2] || 'slides.pdf';
-
-if( slideFile.match( /\.pdf$/gi ) === null ) {
-	slideFile += '.pdf';
-}
-
-console.log( 'Printing PDF...' );
-
-page.open( revealFile, function( status ) {
-	console.log( 'Printed succesfully' );
-	page.render( slideFile );
-	phantom.exit();
-} );
-
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/remotes/remotes.js b/docs/slides/BOS14/_support/reveal.js/plugin/remotes/remotes.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/remotes/remotes.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Touch-based remote controller for your presentation courtesy 
- * of the folks at http://remotes.io
- */
-
-(function(window){
-
-    /**
-     * Detects if we are dealing with a touch enabled device (with some false positives)
-     * Borrowed from modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touch.js   
-     */
-    var hasTouch  = (function(){
-        return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
-    })();
-
-    /**
-     * Detects if notes are enable and the current page is opened inside an /iframe
-     * this prevents loading Remotes.io several times
-     */
-    var isNotesAndIframe = (function(){
-        return window.RevealNotes && !(self == top);
-    })();
-
-    if(!hasTouch && !isNotesAndIframe){
-        head.ready( 'remotes.ne.min.js', function() {
-            new Remotes("preview")
-                .on("swipe-left", function(e){ Reveal.right(); })
-                .on("swipe-right", function(e){ Reveal.left(); })
-                .on("swipe-up", function(e){ Reveal.down(); })
-                .on("swipe-down", function(e){ Reveal.up(); })
-                .on("tap", function(e){ Reveal.next(); })
-                .on("zoom-out", function(e){ Reveal.toggleOverview(true); })
-                .on("zoom-in", function(e){ Reveal.toggleOverview(false); })
-            ;
-        } );
-
-        head.js('https://hakim-static.s3.amazonaws.com/reveal-js/remotes.ne.min.js');
-    }
-})(window);
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/search/search.js b/docs/slides/BOS14/_support/reveal.js/plugin/search/search.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/search/search.js
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
- * by navigatating to that slide and highlighting it.
- *
- * By Jon Snyder <snyder.jon@gmail.com>, February 2013
- */
-
-var RevealSearch = (function() {
-
-	var matchedSlides;
-	var currentMatchedIndex;
-	var searchboxDirty;
-	var myHilitor;
-
-// Original JavaScript code by Chirp Internet: www.chirp.com.au
-// Please acknowledge use of this code by including this header.
-// 2/2013 jon: modified regex to display any match, not restricted to word boundaries.
-
-function Hilitor(id, tag)
-{
-
-  var targetNode = document.getElementById(id) || document.body;
-  var hiliteTag = tag || "EM";
-  var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM|SPAN)$");
-  var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"];
-  var wordColor = [];
-  var colorIdx = 0;
-  var matchRegex = "";
-  var matchingSlides = [];
-
-  this.setRegex = function(input)
-  {
-    input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|");
-    matchRegex = new RegExp("(" + input + ")","i");
-  }
-
-  this.getRegex = function()
-  {
-    return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " ");
-  }
-
-  // recursively apply word highlighting
-  this.hiliteWords = function(node)
-  {
-    if(node == undefined || !node) return;
-    if(!matchRegex) return;
-    if(skipTags.test(node.nodeName)) return;
-
-    if(node.hasChildNodes()) {
-      for(var i=0; i < node.childNodes.length; i++)
-        this.hiliteWords(node.childNodes[i]);
-    }
-    if(node.nodeType == 3) { // NODE_TEXT
-      if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) {
-      	//find the slide's section element and save it in our list of matching slides
-      	var secnode = node.parentNode;
-      	while (secnode.nodeName != 'SECTION') {
-      		secnode = secnode.parentNode;
-      	}
-      	
-      	var slideIndex = Reveal.getIndices(secnode);
-      	var slidelen = matchingSlides.length;
-      	var alreadyAdded = false;
-      	for (var i=0; i < slidelen; i++) {
-      		if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) {
-      			alreadyAdded = true;
-      		}
-      	}
-      	if (! alreadyAdded) {
-      		matchingSlides.push(slideIndex);
-      	}
-      	
-        if(!wordColor[regs[0].toLowerCase()]) {
-          wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
-        }
-
-        var match = document.createElement(hiliteTag);
-        match.appendChild(document.createTextNode(regs[0]));
-        match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
-        match.style.fontStyle = "inherit";
-        match.style.color = "#000";
-
-        var after = node.splitText(regs.index);
-        after.nodeValue = after.nodeValue.substring(regs[0].length);
-        node.parentNode.insertBefore(match, after);
-      }
-    }
-  };
-
-  // remove highlighting
-  this.remove = function()
-  {
-    var arr = document.getElementsByTagName(hiliteTag);
-    while(arr.length && (el = arr[0])) {
-      el.parentNode.replaceChild(el.firstChild, el);
-    }
-  };
-
-  // start highlighting at target node
-  this.apply = function(input)
-  {
-    if(input == undefined || !input) return;
-    this.remove();
-    this.setRegex(input);
-    this.hiliteWords(targetNode);
-    return matchingSlides;
-  };
-
-}
-
-	function openSearch() {
-		//ensure the search term input dialog is visible and has focus:
-		var inputbox = document.getElementById("searchinput");
-		inputbox.style.display = "inline";
-		inputbox.focus();
-		inputbox.select();
-	}
-
-	function toggleSearch() {
-		var inputbox = document.getElementById("searchinput");
-		if (inputbox.style.display !== "inline") {
-			openSearch();
-		}
-		else {
-			inputbox.style.display = "none";
-			myHilitor.remove();
-		}
-	}
-
-	function doSearch() {
-		//if there's been a change in the search term, perform a new search:
-		if (searchboxDirty) {
-			var searchstring = document.getElementById("searchinput").value;
-
-			//find the keyword amongst the slides
-			myHilitor = new Hilitor("slidecontent");
-			matchedSlides = myHilitor.apply(searchstring);
-			currentMatchedIndex = 0;
-		}
-
-		//navigate to the next slide that has the keyword, wrapping to the first if necessary
-		if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) {
-			currentMatchedIndex = 0;
-		}
-		if (matchedSlides.length > currentMatchedIndex) {
-			Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v);
-			currentMatchedIndex++;
-		}
-	}
-
-	var dom = {};
-	dom.wrapper = document.querySelector( '.reveal' );
-
-	if( !dom.wrapper.querySelector( '.searchbox' ) ) {
-			var searchElement = document.createElement( 'div' );
-			searchElement.id = "searchinputdiv";
-			searchElement.classList.add( 'searchdiv' );
-      searchElement.style.position = 'absolute';
-      searchElement.style.top = '10px';
-      searchElement.style.left = '10px';
-      //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/:
-			searchElement.innerHTML = '<span><input type="search" id="searchinput" class="searchinput" style="vertical-align: top;"/><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJiSURBVHjatFZNaxNBGH5md+Mmu92NVdKDRipSAyqCghgQD4L4cRe86UUtAQ+eFCxoa4/25EXBFi8eBE+eRPoDhB6KgiiixdAPCEkx2pjvTXadd9yNsflwuyUDD/O+u8PzzDPvzOwyx3EwyCZhwG3gAkp7MnpjgbopjsltcD4gjuXZZKeAR348MYLYTm3LzOs/y3j3JTfZxgXWXmTuwPHIc4VmoOmv5IrI53+AO2DdHLjkDWQ3GoEEVFXtXQOvkSnPWcyUceviLhwbDYv8/XIVj97kse7TodLvZXxYxrPUHkQ1ufXs3FEdybEIxucySOesoNvUgWU1cP3MkCBfTFdw9fGaAMVmRELq7LBw2Q3/FaAxxWIRpw+ZIr/7IouPqzUBiqmdHAv7EuhRAwf1er2Vy4x1jW3b2d5Jfvu5IPp7l2LYbcgCFFNb+FoJ7oBqEAqFMPNqFcmEgVMJDfMT+1tvN0pNjERlMS6QA5pFOKxiKVPFhakPeL3It+WGJUDxt2wFR+JhzI7v5ctkd8DXOZAkCYYxhO+lKm4+Xfqz/rIixBuNBl7eOYzkQQNzqX249mRl6zUgEcYkaJrGhUwBinVdh6IouPzwE6/DL5w4oLkH8y981aDf+uq6hlKpJESiUdNfDZi7/ehG9K6KfiA3pml0PLcsq+cSMTj2NL9ukc4UOmz7AZ3+crkC4mHujFvXNaMFB3bEr8xPS6p5O+jXxq4VZtaen7/PwzrntjcLUE0iHPS1Ud1cdiEJl/8WivZk0wXd7zWOMkeF8s0CcAmkNrC2nvXZDbbbN73ccYnZoH9bfgswAFzAe9/h3dbKAAAAAElFTkSuQmCC" id="searchbutton" class="searchicon" style="vertical-align: top; margin-top: -1px;"/></span>';
-			dom.wrapper.appendChild( searchElement );
-	}
-
-	document.getElementById("searchbutton").addEventListener( 'click', function(event) {
-		doSearch();
-	}, false );
-
-	document.getElementById("searchinput").addEventListener( 'keyup', function( event ) {
-		switch (event.keyCode) {
-			case 13:
-				event.preventDefault();
-				doSearch();
-				searchboxDirty = false;
-				break;
-			default:
-				searchboxDirty = true;
-		}
-	}, false );
-
-	// Open the search when the 's' key is hit (yes, this conflicts with the notes plugin, disabling for now)
-	/*
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openSearch();
-		}
-	}, false );
-*/
-	return { open: openSearch };
-})();
diff --git a/docs/slides/BOS14/_support/reveal.js/plugin/zoom-js/zoom.js b/docs/slides/BOS14/_support/reveal.js/plugin/zoom-js/zoom.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/plugin/zoom-js/zoom.js
+++ /dev/null
@@ -1,258 +0,0 @@
-// Custom reveal.js integration
-(function(){
-	var isEnabled = true;
-
-	document.querySelector( '.reveal' ).addEventListener( 'mousedown', function( event ) {
-		var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : 'alt' ) + 'Key';
-
-		if( event[ modifier ] && isEnabled ) {
-			event.preventDefault();
-			zoom.to({ element: event.target, pan: false });
-		}
-	} );
-
-	Reveal.addEventListener( 'overviewshown', function() { isEnabled = false; } );
-	Reveal.addEventListener( 'overviewhidden', function() { isEnabled = true; } );
-})();
-
-/*!
- * zoom.js 0.2 (modified version for use with reveal.js)
- * http://lab.hakim.se/zoom-js
- * MIT licensed
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var zoom = (function(){
-
-	// The current zoom level (scale)
-	var level = 1;
-
-	// The current mouse position, used for panning
-	var mouseX = 0,
-		mouseY = 0;
-
-	// Timeout before pan is activated
-	var panEngageTimeout = -1,
-		panUpdateInterval = -1;
-
-	var currentOptions = null;
-
-	// Check for transform support so that we can fallback otherwise
-	var supportsTransforms = 	'WebkitTransform' in document.body.style ||
-								'MozTransform' in document.body.style ||
-								'msTransform' in document.body.style ||
-								'OTransform' in document.body.style ||
-								'transform' in document.body.style;
-
-	if( supportsTransforms ) {
-		// The easing that will be applied when we zoom in/out
-		document.body.style.transition = 'transform 0.8s ease';
-		document.body.style.OTransition = '-o-transform 0.8s ease';
-		document.body.style.msTransition = '-ms-transform 0.8s ease';
-		document.body.style.MozTransition = '-moz-transform 0.8s ease';
-		document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';
-	}
-
-	// Zoom out if the user hits escape
-	document.addEventListener( 'keyup', function( event ) {
-		if( level !== 1 && event.keyCode === 27 ) {
-			zoom.out();
-		}
-	}, false );
-
-	// Monitor mouse movement for panning
-	document.addEventListener( 'mousemove', function( event ) {
-		if( level !== 1 ) {
-			mouseX = event.clientX;
-			mouseY = event.clientY;
-		}
-	}, false );
-
-	/**
-	 * Applies the CSS required to zoom in, prioritizes use of CSS3
-	 * transforms but falls back on zoom for IE.
-	 *
-	 * @param {Number} pageOffsetX
-	 * @param {Number} pageOffsetY
-	 * @param {Number} elementOffsetX
-	 * @param {Number} elementOffsetY
-	 * @param {Number} scale
-	 */
-	function magnify( pageOffsetX, pageOffsetY, elementOffsetX, elementOffsetY, scale ) {
-
-		if( supportsTransforms ) {
-			var origin = pageOffsetX +'px '+ pageOffsetY +'px',
-				transform = 'translate('+ -elementOffsetX +'px,'+ -elementOffsetY +'px) scale('+ scale +')';
-
-			document.body.style.transformOrigin = origin;
-			document.body.style.OTransformOrigin = origin;
-			document.body.style.msTransformOrigin = origin;
-			document.body.style.MozTransformOrigin = origin;
-			document.body.style.WebkitTransformOrigin = origin;
-
-			document.body.style.transform = transform;
-			document.body.style.OTransform = transform;
-			document.body.style.msTransform = transform;
-			document.body.style.MozTransform = transform;
-			document.body.style.WebkitTransform = transform;
-		}
-		else {
-			// Reset all values
-			if( scale === 1 ) {
-				document.body.style.position = '';
-				document.body.style.left = '';
-				document.body.style.top = '';
-				document.body.style.width = '';
-				document.body.style.height = '';
-				document.body.style.zoom = '';
-			}
-			// Apply scale
-			else {
-				document.body.style.position = 'relative';
-				document.body.style.left = ( - ( pageOffsetX + elementOffsetX ) / scale ) + 'px';
-				document.body.style.top = ( - ( pageOffsetY + elementOffsetY ) / scale ) + 'px';
-				document.body.style.width = ( scale * 100 ) + '%';
-				document.body.style.height = ( scale * 100 ) + '%';
-				document.body.style.zoom = scale;
-			}
-		}
-
-		level = scale;
-
-		if( level !== 1 && document.documentElement.classList ) {
-			document.documentElement.classList.add( 'zoomed' );
-		}
-		else {
-			document.documentElement.classList.remove( 'zoomed' );
-		}
-	}
-
-	/**
-	 * Pan the document when the mosue cursor approaches the edges
-	 * of the window.
-	 */
-	function pan() {
-		var range = 0.12,
-			rangeX = window.innerWidth * range,
-			rangeY = window.innerHeight * range,
-			scrollOffset = getScrollOffset();
-
-		// Up
-		if( mouseY < rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
-		}
-		// Down
-		else if( mouseY > window.innerHeight - rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
-		}
-
-		// Left
-		if( mouseX < rangeX ) {
-			window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
-		}
-		// Right
-		else if( mouseX > window.innerWidth - rangeX ) {
-			window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
-		}
-	}
-
-	function getScrollOffset() {
-		return {
-			x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
-			y: window.scrollY !== undefined ? window.scrollY : window.pageXYffset
-		}
-	}
-
-	return {
-		/**
-		 * Zooms in on either a rectangle or HTML element.
-		 *
-		 * @param {Object} options
-		 *   - element: HTML element to zoom in on
-		 *   OR
-		 *   - x/y: coordinates in non-transformed space to zoom in on
-		 *   - width/height: the portion of the screen to zoom in on
-		 *   - scale: can be used instead of width/height to explicitly set scale
-		 */
-		to: function( options ) {
-			// Due to an implementation limitation we can't zoom in
-			// to another element without zooming out first
-			if( level !== 1 ) {
-				zoom.out();
-			}
-			else {
-				options.x = options.x || 0;
-				options.y = options.y || 0;
-
-				// If an element is set, that takes precedence
-				if( !!options.element ) {
-					// Space around the zoomed in element to leave on screen
-					var padding = 20;
-
-					options.width = options.element.getBoundingClientRect().width + ( padding * 2 );
-					options.height = options.element.getBoundingClientRect().height + ( padding * 2 );
-					options.x = options.element.getBoundingClientRect().left - padding;
-					options.y = options.element.getBoundingClientRect().top - padding;
-				}
-
-				// If width/height values are set, calculate scale from those values
-				if( options.width !== undefined && options.height !== undefined ) {
-					options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
-				}
-
-				if( options.scale > 1 ) {
-					options.x *= options.scale;
-					options.y *= options.scale;
-
-					var scrollOffset = getScrollOffset();
-
-					if( options.element ) {
-						scrollOffset.x -= ( window.innerWidth - ( options.width * options.scale ) ) / 2;
-					}
-
-					magnify( scrollOffset.x, scrollOffset.y, options.x, options.y, options.scale );
-
-					if( options.pan !== false ) {
-
-						// Wait with engaging panning as it may conflict with the
-						// zoom transition
-						panEngageTimeout = setTimeout( function() {
-							panUpdateInterval = setInterval( pan, 1000 / 60 );
-						}, 800 );
-
-					}
-				}
-
-				currentOptions = options;
-			}
-		},
-
-		/**
-		 * Resets the document zoom state to its default.
-		 */
-		out: function() {
-			clearTimeout( panEngageTimeout );
-			clearInterval( panUpdateInterval );
-
-			var scrollOffset = getScrollOffset();
-
-			if( currentOptions && currentOptions.element ) {
-				scrollOffset.x -= ( window.innerWidth - ( currentOptions.width * currentOptions.scale ) ) / 2;
-			}
-
-			magnify( scrollOffset.x, scrollOffset.y, 0, 0, 1 );
-
-			level = 1;
-		},
-
-		// Alias
-		magnify: function( options ) { this.to( options ) },
-		reset: function() { this.out() },
-
-		zoomLevel: function() {
-			return level;
-		}
-	}
-
-})();
-
diff --git a/docs/slides/BOS14/_support/reveal.js/test/examples/assets/image1.png b/docs/slides/BOS14/_support/reveal.js/test/examples/assets/image1.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/_support/reveal.js/test/examples/assets/image1.png and /dev/null differ
diff --git a/docs/slides/BOS14/_support/reveal.js/test/examples/assets/image2.png b/docs/slides/BOS14/_support/reveal.js/test/examples/assets/image2.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/_support/reveal.js/test/examples/assets/image2.png and /dev/null differ
diff --git a/docs/slides/BOS14/_support/reveal.js/test/examples/barebones.html b/docs/slides/BOS14/_support/reveal.js/test/examples/barebones.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/examples/barebones.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Barebones</title>
-
-		<link rel="stylesheet" href="../../css/reveal.min.css">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-				<section>
-					<h2>Barebones Presentation</h2>
-					<p>This example contains the bare minimum includes and markup required to run a reveal.js presentation.</p>
-				</section>
-
-				<section>
-					<h2>No Theme</h2>
-					<p>There's no theme included, so it will fall back on browser defaults.</p>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../../js/reveal.min.js"></script>
-
-		<script>
-
-			Reveal.initialize();
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/test/examples/embedded-media.html b/docs/slides/BOS14/_support/reveal.js/test/examples/embedded-media.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/examples/embedded-media.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Embedded Media</title>
-
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-		<link rel="stylesheet" href="../../css/reveal.min.css">
-		<link rel="stylesheet" href="../../css/theme/default.css" id="theme">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-				<section>
-					<h2>Embedded Media Test</h2>
-				</section>
-
-				<section>
-					<iframe data-autoplay width="420" height="345" src="http://www.youtube.com/embed/l3RQZ4mcr1c"></iframe>
-				</section>
-
-				<section>
-					<h2>Empty Slide</h2>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../../lib/js/head.min.js"></script>
-		<script src="../../js/reveal.min.js"></script>
-
-		<script>
-
-			Reveal.initialize({
-				transition: 'linear'
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/test/examples/math.html b/docs/slides/BOS14/_support/reveal.js/test/examples/math.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/examples/math.html
+++ /dev/null
@@ -1,185 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Math Plugin</title>
-
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-		<link rel="stylesheet" href="../../css/reveal.min.css">
-		<link rel="stylesheet" href="../../css/theme/night.css" id="theme">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-				<section>
-					<h2>reveal.js Math Plugin</h2>
-					<p>A thin wrapper for MathJax</p>
-				</section>
-
-				<section>
-					<h3>The Lorenz Equations</h3>
-
-					\[\begin{aligned}
-					\dot{x} &amp; = \sigma(y-x) \\
-					\dot{y} &amp; = \rho x - y - xz \\
-					\dot{z} &amp; = -\beta z + xy
-					\end{aligned} \]
-				</section>
-
-				<section>
-					<h3>The Cauchy-Schwarz Inequality</h3>
-
-					<script type="math/tex; mode=display">
-						\left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
-					</script>
-				</section>
-
-				<section>
-					<h3>A Cross Product Formula</h3>
-
-					\[\mathbf{V}_1 \times \mathbf{V}_2 =  \begin{vmatrix}
-					\mathbf{i} &amp; \mathbf{j} &amp; \mathbf{k} \\
-					\frac{\partial X}{\partial u} &amp;  \frac{\partial Y}{\partial u} &amp; 0 \\
-					\frac{\partial X}{\partial v} &amp;  \frac{\partial Y}{\partial v} &amp; 0
-					\end{vmatrix}  \]
-				</section>
-
-				<section>
-					<h3>The probability of getting \(k\) heads when flipping \(n\) coins is</h3>
-
-					\[P(E)   = {n \choose k} p^k (1-p)^{ n-k} \]
-				</section>
-
-				<section>
-					<h3>An Identity of Ramanujan</h3>
-
-					\[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} =
-					1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}}
-					{1+\frac{e^{-8\pi}} {1+\ldots} } } } \]
-				</section>
-
-				<section>
-					<h3>A Rogers-Ramanujan Identity</h3>
-
-					\[  1 +  \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots =
-					\prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\]
-				</section>
-
-				<section>
-					<h3>Maxwell&#8217;s Equations</h3>
-
-					\[  \begin{aligned}
-					\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &amp; = \frac{4\pi}{c}\vec{\mathbf{j}} \\   \nabla \cdot \vec{\mathbf{E}} &amp; = 4 \pi \rho \\
-					\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} &amp; = \vec{\mathbf{0}} \\
-					\nabla \cdot \vec{\mathbf{B}} &amp; = 0 \end{aligned}
-					\]
-				</section>
-
-				<section>
-					<section>
-						<h3>The Lorenz Equations</h3>
-
-						<div class="fragment">
-							\[\begin{aligned}
-							\dot{x} &amp; = \sigma(y-x) \\
-							\dot{y} &amp; = \rho x - y - xz \\
-							\dot{z} &amp; = -\beta z + xy
-							\end{aligned} \]
-						</div>
-					</section>
-
-					<section>
-						<h3>The Cauchy-Schwarz Inequality</h3>
-
-						<div class="fragment">
-							\[ \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \]
-						</div>
-					</section>
-
-					<section>
-						<h3>A Cross Product Formula</h3>
-
-						<div class="fragment">
-							\[\mathbf{V}_1 \times \mathbf{V}_2 =  \begin{vmatrix}
-							\mathbf{i} &amp; \mathbf{j} &amp; \mathbf{k} \\
-							\frac{\partial X}{\partial u} &amp;  \frac{\partial Y}{\partial u} &amp; 0 \\
-							\frac{\partial X}{\partial v} &amp;  \frac{\partial Y}{\partial v} &amp; 0
-							\end{vmatrix}  \]
-						</div>
-					</section>
-
-					<section>
-						<h3>The probability of getting \(k\) heads when flipping \(n\) coins is</h3>
-
-						<div class="fragment">
-							\[P(E)   = {n \choose k} p^k (1-p)^{ n-k} \]
-						</div>
-					</section>
-
-					<section>
-						<h3>An Identity of Ramanujan</h3>
-
-						<div class="fragment">
-							\[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} =
-							1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}}
-							{1+\frac{e^{-8\pi}} {1+\ldots} } } } \]
-						</div>
-					</section>
-
-					<section>
-						<h3>A Rogers-Ramanujan Identity</h3>
-
-						<div class="fragment">
-							\[  1 +  \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots =
-							\prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\]
-						</div>
-					</section>
-
-					<section>
-						<h3>Maxwell&#8217;s Equations</h3>
-
-						<div class="fragment">
-							\[  \begin{aligned}
-							\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &amp; = \frac{4\pi}{c}\vec{\mathbf{j}} \\   \nabla \cdot \vec{\mathbf{E}} &amp; = 4 \pi \rho \\
-							\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} &amp; = \vec{\mathbf{0}} \\
-							\nabla \cdot \vec{\mathbf{B}} &amp; = 0 \end{aligned}
-							\]
-						</div>
-					</section>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../../lib/js/head.min.js"></script>
-		<script src="../../js/reveal.min.js"></script>
-
-		<script>
-
-			Reveal.initialize({
-				history: true,
-				transition: 'linear',
-
-				math: {
-					// mathjax: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js',
-					config: 'TeX-AMS_HTML-full'
-				},
-
-				dependencies: [
-					{ src: '../../lib/js/classList.js' },
-					{ src: '../../plugin/math/math.js', async: true }
-				]
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/test/examples/slide-backgrounds.html b/docs/slides/BOS14/_support/reveal.js/test/examples/slide-backgrounds.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/examples/slide-backgrounds.html
+++ /dev/null
@@ -1,122 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Slide Backgrounds</title>
-
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-		<link rel="stylesheet" href="../../css/reveal.min.css">
-		<link rel="stylesheet" href="../../css/theme/serif.css" id="theme">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-				<section data-background="#00ffff">
-					<h2>data-background: #00ffff</h2>
-				</section>
-
-				<section data-background="#bb00bb">
-					<h2>data-background: #bb00bb</h2>
-				</section>
-
-				<section>
-					<section data-background="#ff0000">
-						<h2>data-background: #ff0000</h2>
-					</section>
-					<section data-background="rgba(0, 0, 0, 0.2)">
-						<h2>data-background: rgba(0, 0, 0, 0.2)</h2>
-					</section>
-					<section data-background="salmon">
-						<h2>data-background: salmon</h2>
-					</section>
-				</section>
-
-				<section data-background="rgba(0, 100, 100, 0.2)">
-					<section>
-						<h2>Background applied to stack</h2>
-					</section>
-					<section>
-						<h2>Background applied to stack</h2>
-					</section>
-					<section data-background="rgba(100, 0, 0, 0.2)">
-						<h2>Background applied to slide inside of stack</h2>
-					</section>
-				</section>
-
-				<section data-background-transition="slide" data-background="assets/image1.png" style="background: rgba(255,255,255,0.9)">
-					<h2>Background image</h2>
-				</section>
-
-				<section>
-					<section data-background-transition="slide" data-background="assets/image1.png" style="background: rgba(255,255,255,0.9)">
-						<h2>Background image</h2>
-					</section>
-					<section data-background-transition="slide" data-background="assets/image1.png" style="background: rgba(255,255,255,0.9)">
-						<h2>Background image</h2>
-					</section>
-				</section>
-
-				<section data-background="assets/image2.png" data-background-size="100px" data-background-repeat="repeat" data-background-color="#111" style="background: rgba(255,255,255,0.9)">
-					<h2>Background image</h2>
-					<pre>data-background-size="100px" data-background-repeat="repeat" data-background-color="#111"</pre>
-				</section>
-
-				<section data-background="#888888">
-					<h2>Same background twice (1/2)</h2>
-				</section>
-				<section data-background="#888888">
-					<h2>Same background twice (2/2)</h2>
-				</section>
-
-				<section>
-					<section data-background="#417203">
-						<h2>Same background twice vertical (1/2)</h2>
-					</section>
-					<section data-background="#417203">
-						<h2>Same background twice vertical (2/2)</h2>
-					</section>
-				</section>
-
-				<section data-background="#934f4d">
-					<h2>Same background from horizontal to vertical (1/3)</h2>
-				</section>
-				<section>
-					<section data-background="#934f4d">
-						<h2>Same background from horizontal to vertical (2/3)</h2>
-					</section>
-					<section data-background="#934f4d">
-						<h2>Same background from horizontal to vertical (3/3)</h2>
-					</section>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../../lib/js/head.min.js"></script>
-		<script src="../../js/reveal.min.js"></script>
-
-		<script>
-
-			// Full list of configuration options available here:
-			// https://github.com/hakimel/reveal.js#configuration
-			Reveal.initialize({
-				center: true,
-				// rtl: true,
-
-				transition: 'linear',
-				// transitionSpeed: 'slow',
-				// backgroundTransition: 'slide'
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/test/qunit-1.12.0.css b/docs/slides/BOS14/_support/reveal.js/test/qunit-1.12.0.css
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/qunit-1.12.0.css
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-	margin: 0;
-	padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-	padding: 0.5em 0 0.5em 1em;
-
-	color: #8699a4;
-	background-color: #0d3349;
-
-	font-size: 1.5em;
-	line-height: 1em;
-	font-weight: normal;
-
-	border-radius: 5px 5px 0 0;
-	-moz-border-radius: 5px 5px 0 0;
-	-webkit-border-top-right-radius: 5px;
-	-webkit-border-top-left-radius: 5px;
-}
-
-#qunit-header a {
-	text-decoration: none;
-	color: #c2ccd1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-	color: #fff;
-}
-
-#qunit-testrunner-toolbar label {
-	display: inline-block;
-	padding: 0 .5em 0 .1em;
-}
-
-#qunit-banner {
-	height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-	padding: 0.5em 0 0.5em 2em;
-	color: #5E740B;
-	background-color: #eee;
-	overflow: hidden;
-}
-
-#qunit-userAgent {
-	padding: 0.5em 0 0.5em 2.5em;
-	background-color: #2b81af;
-	color: #fff;
-	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
-	float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-	list-style-position: inside;
-}
-
-#qunit-tests li {
-	padding: 0.4em 0.5em 0.4em 2.5em;
-	border-bottom: 1px solid #fff;
-	list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
-	display: none;
-}
-
-#qunit-tests li strong {
-	cursor: pointer;
-}
-
-#qunit-tests li a {
-	padding: 0.5em;
-	color: #c2ccd1;
-	text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-	color: #000;
-}
-
-#qunit-tests li .runtime {
-	float: right;
-	font-size: smaller;
-}
-
-.qunit-assert-list {
-	margin-top: 0.5em;
-	padding: 0.5em;
-
-	background-color: #fff;
-
-	border-radius: 5px;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-}
-
-.qunit-collapsed {
-	display: none;
-}
-
-#qunit-tests table {
-	border-collapse: collapse;
-	margin-top: .2em;
-}
-
-#qunit-tests th {
-	text-align: right;
-	vertical-align: top;
-	padding: 0 .5em 0 0;
-}
-
-#qunit-tests td {
-	vertical-align: top;
-}
-
-#qunit-tests pre {
-	margin: 0;
-	white-space: pre-wrap;
-	word-wrap: break-word;
-}
-
-#qunit-tests del {
-	background-color: #e0f2be;
-	color: #374e0c;
-	text-decoration: none;
-}
-
-#qunit-tests ins {
-	background-color: #ffcaca;
-	color: #500;
-	text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: black; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-	padding: 5px;
-	background-color: #fff;
-	border-bottom: none;
-	list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-	color: #3c510c;
-	background-color: #fff;
-	border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-	color: #710909;
-	background-color: #fff;
-	border-left: 10px solid #EE5757;
-	white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-	border-radius: 0 0 5px 5px;
-	-moz-border-radius: 0 0 5px 5px;
-	-webkit-border-bottom-right-radius: 5px;
-	-webkit-border-bottom-left-radius: 5px;
-}
-
-#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: green;   }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
-	padding: 0.5em 0.5em 0.5em 2.5em;
-
-	color: #2b81af;
-	background-color: #D2E0E6;
-
-	border-bottom: 1px solid white;
-}
-#qunit-testresult .module-name {
-	font-weight: bold;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-	position: absolute;
-	top: -10000px;
-	left: -10000px;
-	width: 1000px;
-	height: 1000px;
-}
diff --git a/docs/slides/BOS14/_support/reveal.js/test/qunit-1.12.0.js b/docs/slides/BOS14/_support/reveal.js/test/qunit-1.12.0.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/qunit-1.12.0.js
+++ /dev/null
@@ -1,2212 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * https://jquery.org/license/
- */
-
-(function( window ) {
-
-var QUnit,
-	assert,
-	config,
-	onErrorFnPrev,
-	testId = 0,
-	fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
-	toString = Object.prototype.toString,
-	hasOwn = Object.prototype.hasOwnProperty,
-	// Keep a local reference to Date (GH-283)
-	Date = window.Date,
-	setTimeout = window.setTimeout,
-	defined = {
-		setTimeout: typeof window.setTimeout !== "undefined",
-		sessionStorage: (function() {
-			var x = "qunit-test-string";
-			try {
-				sessionStorage.setItem( x, x );
-				sessionStorage.removeItem( x );
-				return true;
-			} catch( e ) {
-				return false;
-			}
-		}())
-	},
-	/**
-	 * Provides a normalized error string, correcting an issue
-	 * with IE 7 (and prior) where Error.prototype.toString is
-	 * not properly implemented
-	 *
-	 * Based on http://es5.github.com/#x15.11.4.4
-	 *
-	 * @param {String|Error} error
-	 * @return {String} error message
-	 */
-	errorString = function( error ) {
-		var name, message,
-			errorString = error.toString();
-		if ( errorString.substring( 0, 7 ) === "[object" ) {
-			name = error.name ? error.name.toString() : "Error";
-			message = error.message ? error.message.toString() : "";
-			if ( name && message ) {
-				return name + ": " + message;
-			} else if ( name ) {
-				return name;
-			} else if ( message ) {
-				return message;
-			} else {
-				return "Error";
-			}
-		} else {
-			return errorString;
-		}
-	},
-	/**
-	 * Makes a clone of an object using only Array or Object as base,
-	 * and copies over the own enumerable properties.
-	 *
-	 * @param {Object} obj
-	 * @return {Object} New object with only the own properties (recursively).
-	 */
-	objectValues = function( obj ) {
-		// Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
-		/*jshint newcap: false */
-		var key, val,
-			vals = QUnit.is( "array", obj ) ? [] : {};
-		for ( key in obj ) {
-			if ( hasOwn.call( obj, key ) ) {
-				val = obj[key];
-				vals[key] = val === Object(val) ? objectValues(val) : val;
-			}
-		}
-		return vals;
-	};
-
-function Test( settings ) {
-	extend( this, settings );
-	this.assertions = [];
-	this.testNumber = ++Test.count;
-}
-
-Test.count = 0;
-
-Test.prototype = {
-	init: function() {
-		var a, b, li,
-			tests = id( "qunit-tests" );
-
-		if ( tests ) {
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml;
-
-			// `a` initialized at top of scope
-			a = document.createElement( "a" );
-			a.innerHTML = "Rerun";
-			a.href = QUnit.url({ testNumber: this.testNumber });
-
-			li = document.createElement( "li" );
-			li.appendChild( b );
-			li.appendChild( a );
-			li.className = "running";
-			li.id = this.id = "qunit-test-output" + testId++;
-
-			tests.appendChild( li );
-		}
-	},
-	setup: function() {
-		if (
-			// Emit moduleStart when we're switching from one module to another
-			this.module !== config.previousModule ||
-				// They could be equal (both undefined) but if the previousModule property doesn't
-				// yet exist it means this is the first test in a suite that isn't wrapped in a
-				// module, in which case we'll just emit a moduleStart event for 'undefined'.
-				// Without this, reporters can get testStart before moduleStart  which is a problem.
-				!hasOwn.call( config, "previousModule" )
-		) {
-			if ( hasOwn.call( config, "previousModule" ) ) {
-				runLoggingCallbacks( "moduleDone", QUnit, {
-					name: config.previousModule,
-					failed: config.moduleStats.bad,
-					passed: config.moduleStats.all - config.moduleStats.bad,
-					total: config.moduleStats.all
-				});
-			}
-			config.previousModule = this.module;
-			config.moduleStats = { all: 0, bad: 0 };
-			runLoggingCallbacks( "moduleStart", QUnit, {
-				name: this.module
-			});
-		}
-
-		config.current = this;
-
-		this.testEnvironment = extend({
-			setup: function() {},
-			teardown: function() {}
-		}, this.moduleTestEnvironment );
-
-		this.started = +new Date();
-		runLoggingCallbacks( "testStart", QUnit, {
-			name: this.testName,
-			module: this.module
-		});
-
-		/*jshint camelcase:false */
-
-
-		/**
-		 * Expose the current test environment.
-		 *
-		 * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
-		 */
-		QUnit.current_testEnvironment = this.testEnvironment;
-
-		/*jshint camelcase:true */
-
-		if ( !config.pollution ) {
-			saveGlobal();
-		}
-		if ( config.notrycatch ) {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-			return;
-		}
-		try {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-		} catch( e ) {
-			QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-		}
-	},
-	run: function() {
-		config.current = this;
-
-		var running = id( "qunit-testresult" );
-
-		if ( running ) {
-			running.innerHTML = "Running: <br/>" + this.nameHtml;
-		}
-
-		if ( this.async ) {
-			QUnit.stop();
-		}
-
-		this.callbackStarted = +new Date();
-
-		if ( config.notrycatch ) {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-			return;
-		}
-
-		try {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-		} catch( e ) {
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-
-			QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
-			// else next test will carry the responsibility
-			saveGlobal();
-
-			// Restart the tests if they're blocking
-			if ( config.blocking ) {
-				QUnit.start();
-			}
-		}
-	},
-	teardown: function() {
-		config.current = this;
-		if ( config.notrycatch ) {
-			if ( typeof this.callbackRuntime === "undefined" ) {
-				this.callbackRuntime = +new Date() - this.callbackStarted;
-			}
-			this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			return;
-		} else {
-			try {
-				this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			} catch( e ) {
-				QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-			}
-		}
-		checkPollution();
-	},
-	finish: function() {
-		config.current = this;
-		if ( config.requireExpects && this.expected === null ) {
-			QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
-		} else if ( this.expected !== null && this.expected !== this.assertions.length ) {
-			QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
-		} else if ( this.expected === null && !this.assertions.length ) {
-			QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
-		}
-
-		var i, assertion, a, b, time, li, ol,
-			test = this,
-			good = 0,
-			bad = 0,
-			tests = id( "qunit-tests" );
-
-		this.runtime = +new Date() - this.started;
-		config.stats.all += this.assertions.length;
-		config.moduleStats.all += this.assertions.length;
-
-		if ( tests ) {
-			ol = document.createElement( "ol" );
-			ol.className = "qunit-assert-list";
-
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				assertion = this.assertions[i];
-
-				li = document.createElement( "li" );
-				li.className = assertion.result ? "pass" : "fail";
-				li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
-				ol.appendChild( li );
-
-				if ( assertion.result ) {
-					good++;
-				} else {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-
-			// store result when possible
-			if ( QUnit.config.reorder && defined.sessionStorage ) {
-				if ( bad ) {
-					sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
-				} else {
-					sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
-				}
-			}
-
-			if ( bad === 0 ) {
-				addClass( ol, "qunit-collapsed" );
-			}
-
-			// `b` initialized at top of scope
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-			addEvent(b, "click", function() {
-				var next = b.parentNode.lastChild,
-					collapsed = hasClass( next, "qunit-collapsed" );
-				( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
-			});
-
-			addEvent(b, "dblclick", function( e ) {
-				var target = e && e.target ? e.target : window.event.srcElement;
-				if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
-					target = target.parentNode;
-				}
-				if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-					window.location = QUnit.url({ testNumber: test.testNumber });
-				}
-			});
-
-			// `time` initialized at top of scope
-			time = document.createElement( "span" );
-			time.className = "runtime";
-			time.innerHTML = this.runtime + " ms";
-
-			// `li` initialized at top of scope
-			li = id( this.id );
-			li.className = bad ? "fail" : "pass";
-			li.removeChild( li.firstChild );
-			a = li.firstChild;
-			li.appendChild( b );
-			li.appendChild( a );
-			li.appendChild( time );
-			li.appendChild( ol );
-
-		} else {
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				if ( !this.assertions[i].result ) {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-		}
-
-		runLoggingCallbacks( "testDone", QUnit, {
-			name: this.testName,
-			module: this.module,
-			failed: bad,
-			passed: this.assertions.length - bad,
-			total: this.assertions.length,
-			duration: this.runtime
-		});
-
-		QUnit.reset();
-
-		config.current = undefined;
-	},
-
-	queue: function() {
-		var bad,
-			test = this;
-
-		synchronize(function() {
-			test.init();
-		});
-		function run() {
-			// each of these can by async
-			synchronize(function() {
-				test.setup();
-			});
-			synchronize(function() {
-				test.run();
-			});
-			synchronize(function() {
-				test.teardown();
-			});
-			synchronize(function() {
-				test.finish();
-			});
-		}
-
-		// `bad` initialized at top of scope
-		// defer when previous test run passed, if storage is available
-		bad = QUnit.config.reorder && defined.sessionStorage &&
-						+sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
-
-		if ( bad ) {
-			run();
-		} else {
-			synchronize( run, true );
-		}
-	}
-};
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
-	// call on start of module test to prepend name to all tests
-	module: function( name, testEnvironment ) {
-		config.currentModule = name;
-		config.currentModuleTestEnvironment = testEnvironment;
-		config.modules[name] = true;
-	},
-
-	asyncTest: function( testName, expected, callback ) {
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		QUnit.test( testName, expected, callback, true );
-	},
-
-	test: function( testName, expected, callback, async ) {
-		var test,
-			nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
-
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		if ( config.currentModule ) {
-			nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
-		}
-
-		test = new Test({
-			nameHtml: nameHtml,
-			testName: testName,
-			expected: expected,
-			async: async,
-			callback: callback,
-			module: config.currentModule,
-			moduleTestEnvironment: config.currentModuleTestEnvironment,
-			stack: sourceFromStacktrace( 2 )
-		});
-
-		if ( !validTest( test ) ) {
-			return;
-		}
-
-		test.queue();
-	},
-
-	// Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
-	expect: function( asserts ) {
-		if (arguments.length === 1) {
-			config.current.expected = asserts;
-		} else {
-			return config.current.expected;
-		}
-	},
-
-	start: function( count ) {
-		// QUnit hasn't been initialized yet.
-		// Note: RequireJS (et al) may delay onLoad
-		if ( config.semaphore === undefined ) {
-			QUnit.begin(function() {
-				// This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
-				setTimeout(function() {
-					QUnit.start( count );
-				});
-			});
-			return;
-		}
-
-		config.semaphore -= count || 1;
-		// don't start until equal number of stop-calls
-		if ( config.semaphore > 0 ) {
-			return;
-		}
-		// ignore if start is called more often then stop
-		if ( config.semaphore < 0 ) {
-			config.semaphore = 0;
-			QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
-			return;
-		}
-		// A slight delay, to avoid any current callbacks
-		if ( defined.setTimeout ) {
-			setTimeout(function() {
-				if ( config.semaphore > 0 ) {
-					return;
-				}
-				if ( config.timeout ) {
-					clearTimeout( config.timeout );
-				}
-
-				config.blocking = false;
-				process( true );
-			}, 13);
-		} else {
-			config.blocking = false;
-			process( true );
-		}
-	},
-
-	stop: function( count ) {
-		config.semaphore += count || 1;
-		config.blocking = true;
-
-		if ( config.testTimeout && defined.setTimeout ) {
-			clearTimeout( config.timeout );
-			config.timeout = setTimeout(function() {
-				QUnit.ok( false, "Test timed out" );
-				config.semaphore = 1;
-				QUnit.start();
-			}, config.testTimeout );
-		}
-	}
-};
-
-// `assert` initialized at top of scope
-// Assert helpers
-// All of these must either call QUnit.push() or manually do:
-// - runLoggingCallbacks( "log", .. );
-// - config.current.assertions.push({ .. });
-// We attach it to the QUnit object *after* we expose the public API,
-// otherwise `assert` will become a global variable in browsers (#341).
-assert = {
-	/**
-	 * Asserts rough true-ish result.
-	 * @name ok
-	 * @function
-	 * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-	 */
-	ok: function( result, msg ) {
-		if ( !config.current ) {
-			throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-		result = !!result;
-		msg = msg || (result ? "okay" : "failed" );
-
-		var source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: msg
-			};
-
-		msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
-
-		if ( !result ) {
-			source = sourceFromStacktrace( 2 );
-			if ( source ) {
-				details.source = source;
-				msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
-			}
-		}
-		runLoggingCallbacks( "log", QUnit, details );
-		config.current.assertions.push({
-			result: result,
-			message: msg
-		});
-	},
-
-	/**
-	 * Assert that the first two arguments are equal, with an optional message.
-	 * Prints out both actual and expected values.
-	 * @name equal
-	 * @function
-	 * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
-	 */
-	equal: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected == actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notEqual
-	 * @function
-	 */
-	notEqual: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected != actual, actual, expected, message );
-	},
-
-	/**
-	 * @name propEqual
-	 * @function
-	 */
-	propEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notPropEqual
-	 * @function
-	 */
-	notPropEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name deepEqual
-	 * @function
-	 */
-	deepEqual: function( actual, expected, message ) {
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notDeepEqual
-	 * @function
-	 */
-	notDeepEqual: function( actual, expected, message ) {
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name strictEqual
-	 * @function
-	 */
-	strictEqual: function( actual, expected, message ) {
-		QUnit.push( expected === actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notStrictEqual
-	 * @function
-	 */
-	notStrictEqual: function( actual, expected, message ) {
-		QUnit.push( expected !== actual, actual, expected, message );
-	},
-
-	"throws": function( block, expected, message ) {
-		var actual,
-			expectedOutput = expected,
-			ok = false;
-
-		// 'expected' is optional
-		if ( typeof expected === "string" ) {
-			message = expected;
-			expected = null;
-		}
-
-		config.current.ignoreGlobalErrors = true;
-		try {
-			block.call( config.current.testEnvironment );
-		} catch (e) {
-			actual = e;
-		}
-		config.current.ignoreGlobalErrors = false;
-
-		if ( actual ) {
-			// we don't want to validate thrown error
-			if ( !expected ) {
-				ok = true;
-				expectedOutput = null;
-			// expected is a regexp
-			} else if ( QUnit.objectType( expected ) === "regexp" ) {
-				ok = expected.test( errorString( actual ) );
-			// expected is a constructor
-			} else if ( actual instanceof expected ) {
-				ok = true;
-			// expected is a validation function which returns true is validation passed
-			} else if ( expected.call( {}, actual ) === true ) {
-				expectedOutput = null;
-				ok = true;
-			}
-
-			QUnit.push( ok, actual, expectedOutput, message );
-		} else {
-			QUnit.pushFailure( message, null, "No exception was thrown." );
-		}
-	}
-};
-
-/**
- * @deprecated since 1.8.0
- * Kept assertion helpers in root for backwards compatibility.
- */
-extend( QUnit, assert );
-
-/**
- * @deprecated since 1.9.0
- * Kept root "raises()" for backwards compatibility.
- * (Note that we don't introduce assert.raises).
- */
-QUnit.raises = assert[ "throws" ];
-
-/**
- * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.equals = function() {
-	QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
-};
-QUnit.same = function() {
-	QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
-};
-
-// We want access to the constructor's prototype
-(function() {
-	function F() {}
-	F.prototype = QUnit;
-	QUnit = new F();
-	// Make F QUnit's constructor so that we can add to the prototype later
-	QUnit.constructor = F;
-}());
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
-	// The queue of tests to run
-	queue: [],
-
-	// block until document ready
-	blocking: true,
-
-	// when enabled, show only failing tests
-	// gets persisted through sessionStorage and can be changed in UI via checkbox
-	hidepassed: false,
-
-	// by default, run previously failed tests first
-	// very useful in combination with "Hide passed tests" checked
-	reorder: true,
-
-	// by default, modify document.title when suite is done
-	altertitle: true,
-
-	// when enabled, all tests must call expect()
-	requireExpects: false,
-
-	// add checkboxes that are persisted in the query-string
-	// when enabled, the id is set to `true` as a `QUnit.config` property
-	urlConfig: [
-		{
-			id: "noglobals",
-			label: "Check for Globals",
-			tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
-		},
-		{
-			id: "notrycatch",
-			label: "No try-catch",
-			tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
-		}
-	],
-
-	// Set of all modules.
-	modules: {},
-
-	// logging callback queues
-	begin: [],
-	done: [],
-	log: [],
-	testStart: [],
-	testDone: [],
-	moduleStart: [],
-	moduleDone: []
-};
-
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
-	extend( window, QUnit.constructor.prototype );
-
-	// Expose QUnit object
-	window.QUnit = QUnit;
-}
-
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
-	var i,
-		location = window.location || { search: "", protocol: "file:" },
-		params = location.search.slice( 1 ).split( "&" ),
-		length = params.length,
-		urlParams = {},
-		current;
-
-	if ( params[ 0 ] ) {
-		for ( i = 0; i < length; i++ ) {
-			current = params[ i ].split( "=" );
-			current[ 0 ] = decodeURIComponent( current[ 0 ] );
-			// allow just a key to turn on a flag, e.g., test.html?noglobals
-			current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-			urlParams[ current[ 0 ] ] = current[ 1 ];
-		}
-	}
-
-	QUnit.urlParams = urlParams;
-
-	// String search anywhere in moduleName+testName
-	config.filter = urlParams.filter;
-
-	// Exact match of the module name
-	config.module = urlParams.module;
-
-	config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
-
-	// Figure out if we're running the tests from a server or not
-	QUnit.isLocal = location.protocol === "file:";
-}());
-
-// Extend QUnit object,
-// these after set here because they should not be exposed as global functions
-extend( QUnit, {
-	assert: assert,
-
-	config: config,
-
-	// Initialize the configuration options
-	init: function() {
-		extend( config, {
-			stats: { all: 0, bad: 0 },
-			moduleStats: { all: 0, bad: 0 },
-			started: +new Date(),
-			updateRate: 1000,
-			blocking: false,
-			autostart: true,
-			autorun: false,
-			filter: "",
-			queue: [],
-			semaphore: 1
-		});
-
-		var tests, banner, result,
-			qunit = id( "qunit" );
-
-		if ( qunit ) {
-			qunit.innerHTML =
-				"<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-				"<h2 id='qunit-banner'></h2>" +
-				"<div id='qunit-testrunner-toolbar'></div>" +
-				"<h2 id='qunit-userAgent'></h2>" +
-				"<ol id='qunit-tests'></ol>";
-		}
-
-		tests = id( "qunit-tests" );
-		banner = id( "qunit-banner" );
-		result = id( "qunit-testresult" );
-
-		if ( tests ) {
-			tests.innerHTML = "";
-		}
-
-		if ( banner ) {
-			banner.className = "";
-		}
-
-		if ( result ) {
-			result.parentNode.removeChild( result );
-		}
-
-		if ( tests ) {
-			result = document.createElement( "p" );
-			result.id = "qunit-testresult";
-			result.className = "result";
-			tests.parentNode.insertBefore( result, tests );
-			result.innerHTML = "Running...<br/>&nbsp;";
-		}
-	},
-
-	// Resets the test setup. Useful for tests that modify the DOM.
-	/*
-	DEPRECATED: Use multiple tests instead of resetting inside a test.
-	Use testStart or testDone for custom cleanup.
-	This method will throw an error in 2.0, and will be removed in 2.1
-	*/
-	reset: function() {
-		var fixture = id( "qunit-fixture" );
-		if ( fixture ) {
-			fixture.innerHTML = config.fixture;
-		}
-	},
-
-	// Trigger an event on an element.
-	// @example triggerEvent( document.body, "click" );
-	triggerEvent: function( elem, type, event ) {
-		if ( document.createEvent ) {
-			event = document.createEvent( "MouseEvents" );
-			event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
-				0, 0, 0, 0, 0, false, false, false, false, 0, null);
-
-			elem.dispatchEvent( event );
-		} else if ( elem.fireEvent ) {
-			elem.fireEvent( "on" + type );
-		}
-	},
-
-	// Safe object type checking
-	is: function( type, obj ) {
-		return QUnit.objectType( obj ) === type;
-	},
-
-	objectType: function( obj ) {
-		if ( typeof obj === "undefined" ) {
-				return "undefined";
-		// consider: typeof null === object
-		}
-		if ( obj === null ) {
-				return "null";
-		}
-
-		var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
-			type = match && match[1] || "";
-
-		switch ( type ) {
-			case "Number":
-				if ( isNaN(obj) ) {
-					return "nan";
-				}
-				return "number";
-			case "String":
-			case "Boolean":
-			case "Array":
-			case "Date":
-			case "RegExp":
-			case "Function":
-				return type.toLowerCase();
-		}
-		if ( typeof obj === "object" ) {
-			return "object";
-		}
-		return undefined;
-	},
-
-	push: function( result, actual, expected, message ) {
-		if ( !config.current ) {
-			throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
-		}
-
-		var output, source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: message,
-				actual: actual,
-				expected: expected
-			};
-
-		message = escapeText( message ) || ( result ? "okay" : "failed" );
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		if ( !result ) {
-			expected = escapeText( QUnit.jsDump.parse(expected) );
-			actual = escapeText( QUnit.jsDump.parse(actual) );
-			output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
-
-			if ( actual !== expected ) {
-				output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
-				output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
-			}
-
-			source = sourceFromStacktrace();
-
-			if ( source ) {
-				details.source = source;
-				output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-			}
-
-			output += "</table>";
-		}
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: !!result,
-			message: output
-		});
-	},
-
-	pushFailure: function( message, source, actual ) {
-		if ( !config.current ) {
-			throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-
-		var output,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: false,
-				message: message
-			};
-
-		message = escapeText( message ) || "error";
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		output += "<table>";
-
-		if ( actual ) {
-			output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
-		}
-
-		if ( source ) {
-			details.source = source;
-			output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-		}
-
-		output += "</table>";
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: false,
-			message: output
-		});
-	},
-
-	url: function( params ) {
-		params = extend( extend( {}, QUnit.urlParams ), params );
-		var key,
-			querystring = "?";
-
-		for ( key in params ) {
-			if ( hasOwn.call( params, key ) ) {
-				querystring += encodeURIComponent( key ) + "=" +
-					encodeURIComponent( params[ key ] ) + "&";
-			}
-		}
-		return window.location.protocol + "//" + window.location.host +
-			window.location.pathname + querystring.slice( 0, -1 );
-	},
-
-	extend: extend,
-	id: id,
-	addEvent: addEvent,
-	addClass: addClass,
-	hasClass: hasClass,
-	removeClass: removeClass
-	// load, equiv, jsDump, diff: Attached later
-});
-
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
-
-	// Logging callbacks; all receive a single argument with the listed properties
-	// run test/logs.html for any related changes
-	begin: registerLoggingCallback( "begin" ),
-
-	// done: { failed, passed, total, runtime }
-	done: registerLoggingCallback( "done" ),
-
-	// log: { result, actual, expected, message }
-	log: registerLoggingCallback( "log" ),
-
-	// testStart: { name }
-	testStart: registerLoggingCallback( "testStart" ),
-
-	// testDone: { name, failed, passed, total, duration }
-	testDone: registerLoggingCallback( "testDone" ),
-
-	// moduleStart: { name }
-	moduleStart: registerLoggingCallback( "moduleStart" ),
-
-	// moduleDone: { name, failed, passed, total }
-	moduleDone: registerLoggingCallback( "moduleDone" )
-});
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
-	config.autorun = true;
-}
-
-QUnit.load = function() {
-	runLoggingCallbacks( "begin", QUnit, {} );
-
-	// Initialize the config, saving the execution queue
-	var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
-		urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
-		numModules = 0,
-		moduleNames = [],
-		moduleFilterHtml = "",
-		urlConfigHtml = "",
-		oldconfig = extend( {}, config );
-
-	QUnit.init();
-	extend(config, oldconfig);
-
-	config.blocking = false;
-
-	len = config.urlConfig.length;
-
-	for ( i = 0; i < len; i++ ) {
-		val = config.urlConfig[i];
-		if ( typeof val === "string" ) {
-			val = {
-				id: val,
-				label: val,
-				tooltip: "[no tooltip available]"
-			};
-		}
-		config[ val.id ] = QUnit.urlParams[ val.id ];
-		urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
-			"' name='" + escapeText( val.id ) +
-			"' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
-			" title='" + escapeText( val.tooltip ) +
-			"'><label for='qunit-urlconfig-" + escapeText( val.id ) +
-			"' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
-	}
-	for ( i in config.modules ) {
-		if ( config.modules.hasOwnProperty( i ) ) {
-			moduleNames.push(i);
-		}
-	}
-	numModules = moduleNames.length;
-	moduleNames.sort( function( a, b ) {
-		return a.localeCompare( b );
-	});
-	moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-		( config.module === undefined  ? "selected='selected'" : "" ) +
-		">< All Modules ></option>";
-
-
-	for ( i = 0; i < numModules; i++) {
-			moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
-				( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
-				">" + escapeText(moduleNames[i]) + "</option>";
-	}
-	moduleFilterHtml += "</select>";
-
-	// `userAgent` initialized at top of scope
-	userAgent = id( "qunit-userAgent" );
-	if ( userAgent ) {
-		userAgent.innerHTML = navigator.userAgent;
-	}
-
-	// `banner` initialized at top of scope
-	banner = id( "qunit-header" );
-	if ( banner ) {
-		banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
-	}
-
-	// `toolbar` initialized at top of scope
-	toolbar = id( "qunit-testrunner-toolbar" );
-	if ( toolbar ) {
-		// `filter` initialized at top of scope
-		filter = document.createElement( "input" );
-		filter.type = "checkbox";
-		filter.id = "qunit-filter-pass";
-
-		addEvent( filter, "click", function() {
-			var tmp,
-				ol = document.getElementById( "qunit-tests" );
-
-			if ( filter.checked ) {
-				ol.className = ol.className + " hidepass";
-			} else {
-				tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-				ol.className = tmp.replace( / hidepass /, " " );
-			}
-			if ( defined.sessionStorage ) {
-				if (filter.checked) {
-					sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
-				} else {
-					sessionStorage.removeItem( "qunit-filter-passed-tests" );
-				}
-			}
-		});
-
-		if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
-			filter.checked = true;
-			// `ol` initialized at top of scope
-			ol = document.getElementById( "qunit-tests" );
-			ol.className = ol.className + " hidepass";
-		}
-		toolbar.appendChild( filter );
-
-		// `label` initialized at top of scope
-		label = document.createElement( "label" );
-		label.setAttribute( "for", "qunit-filter-pass" );
-		label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
-		label.innerHTML = "Hide passed tests";
-		toolbar.appendChild( label );
-
-		urlConfigCheckboxesContainer = document.createElement("span");
-		urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
-		urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
-		// For oldIE support:
-		// * Add handlers to the individual elements instead of the container
-		// * Use "click" instead of "change"
-		// * Fallback from event.target to event.srcElement
-		addEvents( urlConfigCheckboxes, "click", function( event ) {
-			var params = {},
-				target = event.target || event.srcElement;
-			params[ target.name ] = target.checked ? true : undefined;
-			window.location = QUnit.url( params );
-		});
-		toolbar.appendChild( urlConfigCheckboxesContainer );
-
-		if (numModules > 1) {
-			moduleFilter = document.createElement( "span" );
-			moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-			moduleFilter.innerHTML = moduleFilterHtml;
-			addEvent( moduleFilter.lastChild, "change", function() {
-				var selectBox = moduleFilter.getElementsByTagName("select")[0],
-					selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
-
-				window.location = QUnit.url({
-					module: ( selectedModule === "" ) ? undefined : selectedModule,
-					// Remove any existing filters
-					filter: undefined,
-					testNumber: undefined
-				});
-			});
-			toolbar.appendChild(moduleFilter);
-		}
-	}
-
-	// `main` initialized at top of scope
-	main = id( "qunit-fixture" );
-	if ( main ) {
-		config.fixture = main.innerHTML;
-	}
-
-	if ( config.autostart ) {
-		QUnit.start();
-	}
-};
-
-addEvent( window, "load", QUnit.load );
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function ( error, filePath, linerNr ) {
-	var ret = false;
-	if ( onErrorFnPrev ) {
-		ret = onErrorFnPrev( error, filePath, linerNr );
-	}
-
-	// Treat return value as window.onerror itself does,
-	// Only do our handling if not suppressed.
-	if ( ret !== true ) {
-		if ( QUnit.config.current ) {
-			if ( QUnit.config.current.ignoreGlobalErrors ) {
-				return true;
-			}
-			QUnit.pushFailure( error, filePath + ":" + linerNr );
-		} else {
-			QUnit.test( "global failure", extend( function() {
-				QUnit.pushFailure( error, filePath + ":" + linerNr );
-			}, { validTest: validTest } ) );
-		}
-		return false;
-	}
-
-	return ret;
-};
-
-function done() {
-	config.autorun = true;
-
-	// Log the last module results
-	if ( config.currentModule ) {
-		runLoggingCallbacks( "moduleDone", QUnit, {
-			name: config.currentModule,
-			failed: config.moduleStats.bad,
-			passed: config.moduleStats.all - config.moduleStats.bad,
-			total: config.moduleStats.all
-		});
-	}
-	delete config.previousModule;
-
-	var i, key,
-		banner = id( "qunit-banner" ),
-		tests = id( "qunit-tests" ),
-		runtime = +new Date() - config.started,
-		passed = config.stats.all - config.stats.bad,
-		html = [
-			"Tests completed in ",
-			runtime,
-			" milliseconds.<br/>",
-			"<span class='passed'>",
-			passed,
-			"</span> assertions of <span class='total'>",
-			config.stats.all,
-			"</span> passed, <span class='failed'>",
-			config.stats.bad,
-			"</span> failed."
-		].join( "" );
-
-	if ( banner ) {
-		banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
-	}
-
-	if ( tests ) {
-		id( "qunit-testresult" ).innerHTML = html;
-	}
-
-	if ( config.altertitle && typeof document !== "undefined" && document.title ) {
-		// show ✖ for good, ✔ for bad suite result in title
-		// use escape sequences in case file gets loaded with non-utf-8-charset
-		document.title = [
-			( config.stats.bad ? "\u2716" : "\u2714" ),
-			document.title.replace( /^[\u2714\u2716] /i, "" )
-		].join( " " );
-	}
-
-	// clear own sessionStorage items if all tests passed
-	if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-		// `key` & `i` initialized at top of scope
-		for ( i = 0; i < sessionStorage.length; i++ ) {
-			key = sessionStorage.key( i++ );
-			if ( key.indexOf( "qunit-test-" ) === 0 ) {
-				sessionStorage.removeItem( key );
-			}
-		}
-	}
-
-	// scroll back to top to show results
-	if ( window.scrollTo ) {
-		window.scrollTo(0, 0);
-	}
-
-	runLoggingCallbacks( "done", QUnit, {
-		failed: config.stats.bad,
-		passed: passed,
-		total: config.stats.all,
-		runtime: runtime
-	});
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
-	var include,
-		filter = config.filter && config.filter.toLowerCase(),
-		module = config.module && config.module.toLowerCase(),
-		fullName = (test.module + ": " + test.testName).toLowerCase();
-
-	// Internally-generated tests are always valid
-	if ( test.callback && test.callback.validTest === validTest ) {
-		delete test.callback.validTest;
-		return true;
-	}
-
-	if ( config.testNumber ) {
-		return test.testNumber === config.testNumber;
-	}
-
-	if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
-		return false;
-	}
-
-	if ( !filter ) {
-		return true;
-	}
-
-	include = filter.charAt( 0 ) !== "!";
-	if ( !include ) {
-		filter = filter.slice( 1 );
-	}
-
-	// If the filter matches, we need to honour include
-	if ( fullName.indexOf( filter ) !== -1 ) {
-		return include;
-	}
-
-	// Otherwise, do the opposite
-	return !include;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
-// Later Safari and IE10 are supposed to support error.stack as well
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-	offset = offset === undefined ? 3 : offset;
-
-	var stack, include, i;
-
-	if ( e.stacktrace ) {
-		// Opera
-		return e.stacktrace.split( "\n" )[ offset + 3 ];
-	} else if ( e.stack ) {
-		// Firefox, Chrome
-		stack = e.stack.split( "\n" );
-		if (/^error$/i.test( stack[0] ) ) {
-			stack.shift();
-		}
-		if ( fileName ) {
-			include = [];
-			for ( i = offset; i < stack.length; i++ ) {
-				if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-					break;
-				}
-				include.push( stack[ i ] );
-			}
-			if ( include.length ) {
-				return include.join( "\n" );
-			}
-		}
-		return stack[ offset ];
-	} else if ( e.sourceURL ) {
-		// Safari, PhantomJS
-		// hopefully one day Safari provides actual stacktraces
-		// exclude useless self-reference for generated Error objects
-		if ( /qunit.js$/.test( e.sourceURL ) ) {
-			return;
-		}
-		// for actual exceptions, this is useful
-		return e.sourceURL + ":" + e.line;
-	}
-}
-function sourceFromStacktrace( offset ) {
-	try {
-		throw new Error();
-	} catch ( e ) {
-		return extractStacktrace( e, offset );
-	}
-}
-
-/**
- * Escape text for attribute or text content.
- */
-function escapeText( s ) {
-	if ( !s ) {
-		return "";
-	}
-	s = s + "";
-	// Both single quotes and double quotes (for attributes)
-	return s.replace( /['"<>&]/g, function( s ) {
-		switch( s ) {
-			case "'":
-				return "&#039;";
-			case "\"":
-				return "&quot;";
-			case "<":
-				return "&lt;";
-			case ">":
-				return "&gt;";
-			case "&":
-				return "&amp;";
-		}
-	});
-}
-
-function synchronize( callback, last ) {
-	config.queue.push( callback );
-
-	if ( config.autorun && !config.blocking ) {
-		process( last );
-	}
-}
-
-function process( last ) {
-	function next() {
-		process( last );
-	}
-	var start = new Date().getTime();
-	config.depth = config.depth ? config.depth + 1 : 1;
-
-	while ( config.queue.length && !config.blocking ) {
-		if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
-			config.queue.shift()();
-		} else {
-			setTimeout( next, 13 );
-			break;
-		}
-	}
-	config.depth--;
-	if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-		done();
-	}
-}
-
-function saveGlobal() {
-	config.pollution = [];
-
-	if ( config.noglobals ) {
-		for ( var key in window ) {
-			if ( hasOwn.call( window, key ) ) {
-				// in Opera sometimes DOM element ids show up here, ignore them
-				if ( /^qunit-test-output/.test( key ) ) {
-					continue;
-				}
-				config.pollution.push( key );
-			}
-		}
-	}
-}
-
-function checkPollution() {
-	var newGlobals,
-		deletedGlobals,
-		old = config.pollution;
-
-	saveGlobal();
-
-	newGlobals = diff( config.pollution, old );
-	if ( newGlobals.length > 0 ) {
-		QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
-	}
-
-	deletedGlobals = diff( old, config.pollution );
-	if ( deletedGlobals.length > 0 ) {
-		QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
-	}
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-	var i, j,
-		result = a.slice();
-
-	for ( i = 0; i < result.length; i++ ) {
-		for ( j = 0; j < b.length; j++ ) {
-			if ( result[i] === b[j] ) {
-				result.splice( i, 1 );
-				i--;
-				break;
-			}
-		}
-	}
-	return result;
-}
-
-function extend( a, b ) {
-	for ( var prop in b ) {
-		if ( hasOwn.call( b, prop ) ) {
-			// Avoid "Member not found" error in IE8 caused by messing with window.constructor
-			if ( !( prop === "constructor" && a === window ) ) {
-				if ( b[ prop ] === undefined ) {
-					delete a[ prop ];
-				} else {
-					a[ prop ] = b[ prop ];
-				}
-			}
-		}
-	}
-
-	return a;
-}
-
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-	// Standards-based browsers
-	if ( elem.addEventListener ) {
-		elem.addEventListener( type, fn, false );
-	// IE
-	} else {
-		elem.attachEvent( "on" + type, fn );
-	}
-}
-
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-	var i = elems.length;
-	while ( i-- ) {
-		addEvent( elems[i], type, fn );
-	}
-}
-
-function hasClass( elem, name ) {
-	return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
-}
-
-function addClass( elem, name ) {
-	if ( !hasClass( elem, name ) ) {
-		elem.className += (elem.className ? " " : "") + name;
-	}
-}
-
-function removeClass( elem, name ) {
-	var set = " " + elem.className + " ";
-	// Class name may appear multiple times
-	while ( set.indexOf(" " + name + " ") > -1 ) {
-		set = set.replace(" " + name + " " , " ");
-	}
-	// If possible, trim it for prettiness, but not necessarily
-	elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
-}
-
-function id( name ) {
-	return !!( typeof document !== "undefined" && document && document.getElementById ) &&
-		document.getElementById( name );
-}
-
-function registerLoggingCallback( key ) {
-	return function( callback ) {
-		config[key].push( callback );
-	};
-}
-
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks( key, scope, args ) {
-	var i, callbacks;
-	if ( QUnit.hasOwnProperty( key ) ) {
-		QUnit[ key ].call(scope, args );
-	} else {
-		callbacks = config[ key ];
-		for ( i = 0; i < callbacks.length; i++ ) {
-			callbacks[ i ].call( scope, args );
-		}
-	}
-}
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
-
-	// Call the o related callback with the given arguments.
-	function bindCallbacks( o, callbacks, args ) {
-		var prop = QUnit.objectType( o );
-		if ( prop ) {
-			if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-				return callbacks[ prop ].apply( callbacks, args );
-			} else {
-				return callbacks[ prop ]; // or undefined
-			}
-		}
-	}
-
-	// the real equiv function
-	var innerEquiv,
-		// stack to decide between skip/abort functions
-		callers = [],
-		// stack to avoiding loops from circular referencing
-		parents = [],
-		parentsB = [],
-
-		getProto = Object.getPrototypeOf || function ( obj ) {
-			/*jshint camelcase:false */
-			return obj.__proto__;
-		},
-		callbacks = (function () {
-
-			// for string, boolean, number and null
-			function useStrictEquality( b, a ) {
-				/*jshint eqeqeq:false */
-				if ( b instanceof a.constructor || a instanceof b.constructor ) {
-					// to catch short annotation VS 'new' annotation of a
-					// declaration
-					// e.g. var i = 1;
-					// var j = new Number(1);
-					return a == b;
-				} else {
-					return a === b;
-				}
-			}
-
-			return {
-				"string": useStrictEquality,
-				"boolean": useStrictEquality,
-				"number": useStrictEquality,
-				"null": useStrictEquality,
-				"undefined": useStrictEquality,
-
-				"nan": function( b ) {
-					return isNaN( b );
-				},
-
-				"date": function( b, a ) {
-					return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-				},
-
-				"regexp": function( b, a ) {
-					return QUnit.objectType( b ) === "regexp" &&
-						// the regex itself
-						a.source === b.source &&
-						// and its modifiers
-						a.global === b.global &&
-						// (gmi) ...
-						a.ignoreCase === b.ignoreCase &&
-						a.multiline === b.multiline &&
-						a.sticky === b.sticky;
-				},
-
-				// - skip when the property is a method of an instance (OOP)
-				// - abort otherwise,
-				// initial === would have catch identical references anyway
-				"function": function() {
-					var caller = callers[callers.length - 1];
-					return caller !== Object && typeof caller !== "undefined";
-				},
-
-				"array": function( b, a ) {
-					var i, j, len, loop, aCircular, bCircular;
-
-					// b could be an object literal here
-					if ( QUnit.objectType( b ) !== "array" ) {
-						return false;
-					}
-
-					len = a.length;
-					if ( len !== b.length ) {
-						// safe and faster
-						return false;
-					}
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-					for ( i = 0; i < len; i++ ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									parents.pop();
-									parentsB.pop();
-									return false;
-								}
-							}
-						}
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							parents.pop();
-							parentsB.pop();
-							return false;
-						}
-					}
-					parents.pop();
-					parentsB.pop();
-					return true;
-				},
-
-				"object": function( b, a ) {
-					/*jshint forin:false */
-					var i, j, loop, aCircular, bCircular,
-						// Default to true
-						eq = true,
-						aProperties = [],
-						bProperties = [];
-
-					// comparing constructors is more strict than using
-					// instanceof
-					if ( a.constructor !== b.constructor ) {
-						// Allow objects with no prototype to be equivalent to
-						// objects with Object as their constructor.
-						if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
-							( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
-								return false;
-						}
-					}
-
-					// stack constructor before traversing properties
-					callers.push( a.constructor );
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-
-					// be strict: don't ensure hasOwnProperty and go deep
-					for ( i in a ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									eq = false;
-									break;
-								}
-							}
-						}
-						aProperties.push(i);
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							eq = false;
-							break;
-						}
-					}
-
-					parents.pop();
-					parentsB.pop();
-					callers.pop(); // unstack, we are done
-
-					for ( i in b ) {
-						bProperties.push( i ); // collect b's properties
-					}
-
-					// Ensures identical properties name
-					return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-				}
-			};
-		}());
-
-	innerEquiv = function() { // can take multiple arguments
-		var args = [].slice.apply( arguments );
-		if ( args.length < 2 ) {
-			return true; // end transition
-		}
-
-		return (function( a, b ) {
-			if ( a === b ) {
-				return true; // catch the most you can
-			} else if ( a === null || b === null || typeof a === "undefined" ||
-					typeof b === "undefined" ||
-					QUnit.objectType(a) !== QUnit.objectType(b) ) {
-				return false; // don't lose time with error prone cases
-			} else {
-				return bindCallbacks(a, callbacks, [ b, a ]);
-			}
-
-			// apply transition with (1..n) arguments
-		}( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
-	};
-
-	return innerEquiv;
-}());
-
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
-	function quote( str ) {
-		return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
-	}
-	function literal( o ) {
-		return o + "";
-	}
-	function join( pre, arr, post ) {
-		var s = jsDump.separator(),
-			base = jsDump.indent(),
-			inner = jsDump.indent(1);
-		if ( arr.join ) {
-			arr = arr.join( "," + s + inner );
-		}
-		if ( !arr ) {
-			return pre + post;
-		}
-		return [ pre, inner + arr, base + post ].join(s);
-	}
-	function array( arr, stack ) {
-		var i = arr.length, ret = new Array(i);
-		this.up();
-		while ( i-- ) {
-			ret[i] = this.parse( arr[i] , undefined , stack);
-		}
-		this.down();
-		return join( "[", ret, "]" );
-	}
-
-	var reName = /^function (\w+)/,
-		jsDump = {
-			// type is used mostly internally, you can fix a (custom)type in advance
-			parse: function( obj, type, stack ) {
-				stack = stack || [ ];
-				var inStack, res,
-					parser = this.parsers[ type || this.typeOf(obj) ];
-
-				type = typeof parser;
-				inStack = inArray( obj, stack );
-
-				if ( inStack !== -1 ) {
-					return "recursion(" + (inStack - stack.length) + ")";
-				}
-				if ( type === "function" )  {
-					stack.push( obj );
-					res = parser.call( this, obj, stack );
-					stack.pop();
-					return res;
-				}
-				return ( type === "string" ) ? parser : this.parsers.error;
-			},
-			typeOf: function( obj ) {
-				var type;
-				if ( obj === null ) {
-					type = "null";
-				} else if ( typeof obj === "undefined" ) {
-					type = "undefined";
-				} else if ( QUnit.is( "regexp", obj) ) {
-					type = "regexp";
-				} else if ( QUnit.is( "date", obj) ) {
-					type = "date";
-				} else if ( QUnit.is( "function", obj) ) {
-					type = "function";
-				} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
-					type = "window";
-				} else if ( obj.nodeType === 9 ) {
-					type = "document";
-				} else if ( obj.nodeType ) {
-					type = "node";
-				} else if (
-					// native arrays
-					toString.call( obj ) === "[object Array]" ||
-					// NodeList objects
-					( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-				) {
-					type = "array";
-				} else if ( obj.constructor === Error.prototype.constructor ) {
-					type = "error";
-				} else {
-					type = typeof obj;
-				}
-				return type;
-			},
-			separator: function() {
-				return this.multiline ?	this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
-			},
-			// extra can be a number, shortcut for increasing-calling-decreasing
-			indent: function( extra ) {
-				if ( !this.multiline ) {
-					return "";
-				}
-				var chr = this.indentChar;
-				if ( this.HTML ) {
-					chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
-				}
-				return new Array( this.depth + ( extra || 0 ) ).join(chr);
-			},
-			up: function( a ) {
-				this.depth += a || 1;
-			},
-			down: function( a ) {
-				this.depth -= a || 1;
-			},
-			setParser: function( name, parser ) {
-				this.parsers[name] = parser;
-			},
-			// The next 3 are exposed so you can use them
-			quote: quote,
-			literal: literal,
-			join: join,
-			//
-			depth: 1,
-			// This is the list of parsers, to modify them, use jsDump.setParser
-			parsers: {
-				window: "[Window]",
-				document: "[Document]",
-				error: function(error) {
-					return "Error(\"" + error.message + "\")";
-				},
-				unknown: "[Unknown]",
-				"null": "null",
-				"undefined": "undefined",
-				"function": function( fn ) {
-					var ret = "function",
-						// functions never have name in IE
-						name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
-
-					if ( name ) {
-						ret += " " + name;
-					}
-					ret += "( ";
-
-					ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
-					return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
-				},
-				array: array,
-				nodelist: array,
-				"arguments": array,
-				object: function( map, stack ) {
-					/*jshint forin:false */
-					var ret = [ ], keys, key, val, i;
-					QUnit.jsDump.up();
-					keys = [];
-					for ( key in map ) {
-						keys.push( key );
-					}
-					keys.sort();
-					for ( i = 0; i < keys.length; i++ ) {
-						key = keys[ i ];
-						val = map[ key ];
-						ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
-					}
-					QUnit.jsDump.down();
-					return join( "{", ret, "}" );
-				},
-				node: function( node ) {
-					var len, i, val,
-						open = QUnit.jsDump.HTML ? "&lt;" : "<",
-						close = QUnit.jsDump.HTML ? "&gt;" : ">",
-						tag = node.nodeName.toLowerCase(),
-						ret = open + tag,
-						attrs = node.attributes;
-
-					if ( attrs ) {
-						for ( i = 0, len = attrs.length; i < len; i++ ) {
-							val = attrs[i].nodeValue;
-							// IE6 includes all attributes in .attributes, even ones not explicitly set.
-							// Those have values like undefined, null, 0, false, "" or "inherit".
-							if ( val && val !== "inherit" ) {
-								ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
-							}
-						}
-					}
-					ret += close;
-
-					// Show content of TextNode or CDATASection
-					if ( node.nodeType === 3 || node.nodeType === 4 ) {
-						ret += node.nodeValue;
-					}
-
-					return ret + open + "/" + tag + close;
-				},
-				// function calls it internally, it's the arguments part of the function
-				functionArgs: function( fn ) {
-					var args,
-						l = fn.length;
-
-					if ( !l ) {
-						return "";
-					}
-
-					args = new Array(l);
-					while ( l-- ) {
-						// 97 is 'a'
-						args[l] = String.fromCharCode(97+l);
-					}
-					return " " + args.join( ", " ) + " ";
-				},
-				// object calls it internally, the key part of an item in a map
-				key: quote,
-				// function calls it internally, it's the content of the function
-				functionCode: "[code]",
-				// node calls it internally, it's an html attribute value
-				attribute: quote,
-				string: quote,
-				date: quote,
-				regexp: literal,
-				number: literal,
-				"boolean": literal
-			},
-			// if true, entities are escaped ( <, >, \t, space and \n )
-			HTML: false,
-			// indentation unit
-			indentChar: "  ",
-			// if true, items in a collection, are separated by a \n, else just a space.
-			multiline: true
-		};
-
-	return jsDump;
-}());
-
-// from jquery.js
-function inArray( elem, array ) {
-	if ( array.indexOf ) {
-		return array.indexOf( elem );
-	}
-
-	for ( var i = 0, length = array.length; i < length; i++ ) {
-		if ( array[ i ] === elem ) {
-			return i;
-		}
-	}
-
-	return -1;
-}
-
-/*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
-	/*jshint eqeqeq:false, eqnull:true */
-	function diff( o, n ) {
-		var i,
-			ns = {},
-			os = {};
-
-		for ( i = 0; i < n.length; i++ ) {
-			if ( !hasOwn.call( ns, n[i] ) ) {
-				ns[ n[i] ] = {
-					rows: [],
-					o: null
-				};
-			}
-			ns[ n[i] ].rows.push( i );
-		}
-
-		for ( i = 0; i < o.length; i++ ) {
-			if ( !hasOwn.call( os, o[i] ) ) {
-				os[ o[i] ] = {
-					rows: [],
-					n: null
-				};
-			}
-			os[ o[i] ].rows.push( i );
-		}
-
-		for ( i in ns ) {
-			if ( hasOwn.call( ns, i ) ) {
-				if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
-					n[ ns[i].rows[0] ] = {
-						text: n[ ns[i].rows[0] ],
-						row: os[i].rows[0]
-					};
-					o[ os[i].rows[0] ] = {
-						text: o[ os[i].rows[0] ],
-						row: ns[i].rows[0]
-					};
-				}
-			}
-		}
-
-		for ( i = 0; i < n.length - 1; i++ ) {
-			if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
-						n[ i + 1 ] == o[ n[i].row + 1 ] ) {
-
-				n[ i + 1 ] = {
-					text: n[ i + 1 ],
-					row: n[i].row + 1
-				};
-				o[ n[i].row + 1 ] = {
-					text: o[ n[i].row + 1 ],
-					row: i + 1
-				};
-			}
-		}
-
-		for ( i = n.length - 1; i > 0; i-- ) {
-			if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
-						n[ i - 1 ] == o[ n[i].row - 1 ]) {
-
-				n[ i - 1 ] = {
-					text: n[ i - 1 ],
-					row: n[i].row - 1
-				};
-				o[ n[i].row - 1 ] = {
-					text: o[ n[i].row - 1 ],
-					row: i - 1
-				};
-			}
-		}
-
-		return {
-			o: o,
-			n: n
-		};
-	}
-
-	return function( o, n ) {
-		o = o.replace( /\s+$/, "" );
-		n = n.replace( /\s+$/, "" );
-
-		var i, pre,
-			str = "",
-			out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
-			oSpace = o.match(/\s+/g),
-			nSpace = n.match(/\s+/g);
-
-		if ( oSpace == null ) {
-			oSpace = [ " " ];
-		}
-		else {
-			oSpace.push( " " );
-		}
-
-		if ( nSpace == null ) {
-			nSpace = [ " " ];
-		}
-		else {
-			nSpace.push( " " );
-		}
-
-		if ( out.n.length === 0 ) {
-			for ( i = 0; i < out.o.length; i++ ) {
-				str += "<del>" + out.o[i] + oSpace[i] + "</del>";
-			}
-		}
-		else {
-			if ( out.n[0].text == null ) {
-				for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
-					str += "<del>" + out.o[n] + oSpace[n] + "</del>";
-				}
-			}
-
-			for ( i = 0; i < out.n.length; i++ ) {
-				if (out.n[i].text == null) {
-					str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
-				}
-				else {
-					// `pre` initialized at top of scope
-					pre = "";
-
-					for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
-						pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
-					}
-					str += " " + out.n[i].text + nSpace[i] + pre;
-				}
-			}
-		}
-
-		return str;
-	};
-}());
-
-// for CommonJS environments, export everything
-if ( typeof exports !== "undefined" ) {
-	extend( exports, QUnit.constructor.prototype );
-}
-
-// get at whatever the global object is, like window in browsers
-}( (function() {return this;}.call()) ));
diff --git a/docs/slides/BOS14/_support/reveal.js/test/test-markdown-element-attributes.html b/docs/slides/BOS14/_support/reveal.js/test/test-markdown-element-attributes.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/test-markdown-element-attributes.html
+++ /dev/null
@@ -1,134 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Test Markdown Element Attributes</title>
-
-		<link rel="stylesheet" href="../css/reveal.min.css">
-		<link rel="stylesheet" href="qunit-1.12.0.css">
-	</head>
-
-	<body style="overflow: auto;">
-
-		<div id="qunit"></div>
-		<div id="qunit-fixture"></div>
-
-		<div class="reveal" style="display: none;">
-
-			<div class="slides">
-
-				<!-- <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section> -->
-
-				<!-- Slides are separated by newline + three dashes + newline, vertical slides identical but two dashes -->
-				<section data-markdown data-separator="^\n---\n$" data-vertical="^\n--\n$" data-element-attributes="{_\s*?([^}]+?)}">>
-					<script type="text/template">
-						## Slide 1.1
-						<!-- {_class="fragment fade-out" data-fragment-index="1"} -->
-
-						--
-
-						## Slide 1.2
-						<!-- {_class="fragment shrink"} -->
-
-						Paragraph 1
-						<!-- {_class="fragment grow"} -->
-
-						Paragraph 2
-						<!-- {_class="fragment grow"} -->
-
-						- list item 1 <!-- {_class="fragment roll-in"} -->
-						- list item 2 <!-- {_class="fragment roll-in"} -->
-						- list item 3 <!-- {_class="fragment roll-in"} -->
-
-
-						---
-
-						## Slide 2
-
-
-						Paragraph 1.2  
-						multi-line <!-- {_class="fragment highlight-red"} -->
-
-						Paragraph 2.2 <!-- {_class="fragment highlight-red"} -->
-
-						Paragraph 2.3 <!-- {_class="fragment highlight-red"} -->
-
-						Paragraph 2.4 <!-- {_class="fragment highlight-red"} -->
-
-						- list item 1 <!-- {_class="fragment highlight-green"} -->
-						- list item 2<!-- {_class="fragment highlight-green"} -->
-						- list item 3<!-- {_class="fragment highlight-green"} -->
-						- list item 4
-						<!-- {_class="fragment highlight-green"} -->
-						- list item 5<!-- {_class="fragment highlight-green"} -->
-
-						Test
-
-						![Example Picture](examples/assets/image2.png)
-						<!-- {_class="reveal stretch"} -->
-
-					</script>
-				</section>
-
-
-
-				<section 	data-markdown data-separator="^\n\n\n"
-									data-vertical="^\n\n"
-									data-notes="^Note:"
-									data-charset="utf-8">
-					<script type="text/template">
-						# Test attributes in Markdown with default separator
-						## Slide 1 Def <!-- .element: class="fragment highlight-red" data-fragment-index="1" -->
-
-
-						## Slide 2 Def
-						<!-- .element: class="fragment highlight-red" -->
-
-					</script>
-				</section>
-
-				<section data-markdown>
-				  <script type="text/template">
-					## Hello world
-					A paragraph
-					<!-- .element: class="fragment highlight-blue" -->
-				  </script>
-				</section>
-
-				<section data-markdown>
-				  <script type="text/template">
-					## Hello world
-
-					Multiple  
-					Line
-					<!-- .element: class="fragment highlight-blue" -->
-				  </script>
-				</section>
-
-				<section data-markdown>
-				  <script type="text/template">
-					## Hello world
-
-					Test<!-- .element: class="fragment highlight-blue" -->
-
-					More Test
-				  </script>
-				</section>
-
-
-			</div>
-
-		</div>
-
-		<script src="../lib/js/head.min.js"></script>
-		<script src="../js/reveal.min.js"></script>
-		<script src="../plugin/markdown/marked.js"></script>
-		<script src="../plugin/markdown/markdown.js"></script>
-		<script src="qunit-1.12.0.js"></script>
-
-		<script src="test-markdown-element-attributes.js"></script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/test/test-markdown-element-attributes.js b/docs/slides/BOS14/_support/reveal.js/test/test-markdown-element-attributes.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/test-markdown-element-attributes.js
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 4, 'found four slides' );
-	});
-
-
-	test( 'Attributes on element header in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.fade-out' ).length, 1, 'found one vertical slide with class fragment.fade-out on header' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.shrink' ).length, 1, 'found one vertical slide with class fragment.shrink on header' );
-	});
-
-	test( 'Attributes on element paragraphs in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section p.fragment.grow' ).length, 2, 'found a vertical slide with two paragraphs with class fragment.grow' );
-	});
-
-	test( 'Attributes on element list items in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section li.fragment.roll-in' ).length, 3, 'found a vertical slide with three list items with class fragment.roll-in' );
-	});
-
-	test( 'Attributes on element paragraphs in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-red' ).length, 4, 'found a horizontal slide with four paragraphs with class fragment.grow' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section li.fragment.highlight-green' ).length, 5, 'found a horizontal slide with five list items with class fragment.roll-in' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section img.reveal.stretch' ).length, 1, 'found a horizontal slide with stretched image, class img.reveal.stretch' );
-	});
-
-	test( 'Attributes on elements in vertical slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section h2.fragment.highlight-red' ).length, 2, 'found two h2 titles with fragment highlight-red in vertical slides with default element attribute separator' );
-	});
-
-	test( 'Attributes on elements in single slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-blue' ).length, 3, 'found three elements with fragment highlight-blue in single slide with default element attribute separator' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/BOS14/_support/reveal.js/test/test-markdown-slide-attributes.html b/docs/slides/BOS14/_support/reveal.js/test/test-markdown-slide-attributes.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/test-markdown-slide-attributes.html
+++ /dev/null
@@ -1,128 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Test Markdown Attributes</title>
-
-		<link rel="stylesheet" href="../css/reveal.min.css">
-		<link rel="stylesheet" href="qunit-1.12.0.css">
-	</head>
-
-	<body style="overflow: auto;">
-
-		<div id="qunit"></div>
-		<div id="qunit-fixture"></div>
-
-		<div class="reveal" style="display: none;">
-
-			<div class="slides">
-
-				<!-- <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section> -->
-
-				<!-- Slides are separated by three lines, vertical slides by two lines, attributes are one any line starting with (spaces and) two dashes -->
-				<section 	data-markdown data-separator="^\n\n\n"
-									data-vertical="^\n\n"
-									data-notes="^Note:"
-									data-attributes="--\s(.*?)$"
-									data-charset="utf-8">
-					<script type="text/template">
-						# Test attributes in Markdown
-						## Slide 1
-
-
-
-						## Slide 2
-						<!-- -- id="slide2" data-transition="zoom" data-background="#A0C66B" -->
-
-
-						## Slide 2.1
-						<!-- -- data-background="#ff0000" data-transition="fade" -->
-
-
-						## Slide 2.2
-						[Link to Slide2](#/slide2)
-
-
-
-						## Slide 3
-						<!-- -- data-transition="zoom" data-background="#C6916B" -->
-
-
-
-						## Slide 4
-					</script>
-				</section>
-
-				<section 	data-markdown data-separator="^\n\n\n"
-									data-vertical="^\n\n"
-									data-notes="^Note:"
-									data-charset="utf-8">
-					<script type="text/template">
-						# Test attributes in Markdown with default separator
-						## Slide 1 Def
-
-
-
-						## Slide 2 Def
-						<!-- .slide: id="slide2def" data-transition="concave" data-background="#A7C66B" -->
-
-
-						## Slide 2.1 Def
-						<!-- .slide: data-background="#f70000" data-transition="page" -->
-
-
-						## Slide 2.2 Def
-						[Link to Slide2](#/slide2def)
-
-
-
-						## Slide 3 Def
-						<!-- .slide: data-transition="concave" data-background="#C7916B" -->
-
-
-
-						## Slide 4
-					</script>
-				</section>
-
-				<section data-markdown>
-					<script type="text/template">
-						<!-- .slide: data-background="#ff0000" -->
-						## Hello world
-					</script>
-				</section>
-
-				<section data-markdown>
-					<script type="text/template">
-						## Hello world
-						<!-- .slide: data-background="#ff0000" -->
-					</script>
-				</section>
-
-				<section data-markdown>
-					<script type="text/template">
-						## Hello world
-
-						Test
-						<!-- .slide: data-background="#ff0000" -->
-
-						More Test
-					</script>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../lib/js/head.min.js"></script>
-		<script src="../js/reveal.min.js"></script>
-		<script src="../plugin/markdown/marked.js"></script>
-		<script src="../plugin/markdown/markdown.js"></script>
-		<script src="qunit-1.12.0.js"></script>
-
-		<script src="test-markdown-slide-attributes.js"></script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/test/test-markdown-slide-attributes.js b/docs/slides/BOS14/_support/reveal.js/test/test-markdown-slide-attributes.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/test-markdown-slide-attributes.js
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 6, 'found six vertical slides' );
-	});
-
-	test( 'Id on slide', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section#slide2' ).length, 1, 'found one slide with id slide2' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, 'found one slide with a link to slide2' );
-	});
-
-	test( 'data-background attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-background attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-transition attributes with inline content', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/BOS14/_support/reveal.js/test/test-markdown.html b/docs/slides/BOS14/_support/reveal.js/test/test-markdown.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/test-markdown.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Test Markdown</title>
-
-		<link rel="stylesheet" href="../css/reveal.min.css">
-		<link rel="stylesheet" href="qunit-1.12.0.css">
-	</head>
-
-	<body style="overflow: auto;">
-
-		<div id="qunit"></div>
-  		<div id="qunit-fixture"></div>
-
-		<div class="reveal" style="display: none;">
-
-			<div class="slides">
-
-				<!-- <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section> -->
-
-				<!-- Slides are separated by newline + three dashes + newline, vertical slides identical but two dashes -->
-				<section data-markdown data-separator="^\n---\n$" data-vertical="^\n--\n$">
-					<script type="text/template">
-						## Slide 1.1
-
-						--
-
-						## Slide 1.2
-
-						---
-
-						## Slide 2
-					</script>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../lib/js/head.min.js"></script>
-		<script src="../js/reveal.min.js"></script>
-		<script src="../plugin/markdown/marked.js"></script>
-		<script src="../plugin/markdown/markdown.js"></script>
-		<script src="qunit-1.12.0.js"></script>
-
-		<script src="test-markdown.js"></script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/test/test-markdown.js b/docs/slides/BOS14/_support/reveal.js/test/test-markdown.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/test-markdown.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/BOS14/_support/reveal.js/test/test.html b/docs/slides/BOS14/_support/reveal.js/test/test.html
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/test.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Tests</title>
-
-		<link rel="stylesheet" href="../css/reveal.min.css">
-		<link rel="stylesheet" href="qunit-1.12.0.css">
-	</head>
-
-	<body style="overflow: auto;">
-
-		<div id="qunit"></div>
-  		<div id="qunit-fixture"></div>
-
-		<div class="reveal" style="display: none;">
-
-			<div class="slides">
-
-				<section>
-					<h1>1</h1>
-				</section>
-
-				<section>
-					<section>
-						<h1>2.1</h1>
-					</section>
-					<section>
-						<h1>2.2</h1>
-					</section>
-					<section>
-						<h1>2.3</h1>
-					</section>
-				</section>
-
-				<section id="fragment-slides">
-					<section>
-						<h1>3.1</h1>
-						<ul>
-							<li class="fragment">4.1</li>
-							<li class="fragment">4.2</li>
-							<li class="fragment">4.3</li>
-						</ul>
-					</section>
-
-					<section>
-						<h1>3.2</h1>
-						<ul>
-							<li class="fragment" data-fragment-index="0">4.1</li>
-							<li class="fragment" data-fragment-index="0">4.2</li>
-						</ul>
-					</section>
-
-					<section>
-						<h1>3.3</h1>
-						<ul>
-							<li class="fragment" data-fragment-index="1">3.3.1</li>
-							<li class="fragment" data-fragment-index="4">3.3.2</li>
-							<li class="fragment" data-fragment-index="4">3.3.3</li>
-						</ul>
-					</section>
-				</section>
-
-				<section>
-					<h1>4</h1>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../lib/js/head.min.js"></script>
-		<script src="../js/reveal.min.js"></script>
-		<script src="qunit-1.12.0.js"></script>
-
-		<script src="test.js"></script>
-
-	</body>
-</html>
diff --git a/docs/slides/BOS14/_support/reveal.js/test/test.js b/docs/slides/BOS14/_support/reveal.js/test/test.js
deleted file mode 100644
--- a/docs/slides/BOS14/_support/reveal.js/test/test.js
+++ /dev/null
@@ -1,438 +0,0 @@
-
-// These tests expect the DOM to contain a presentation
-// with the following slide structure:
-//
-// 1
-// 2 - Three sub-slides
-// 3 - Three fragment elements
-// 3 - Two fragments with same data-fragment-index
-// 4
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	// ---------------------------------------------------------------
-	// DOM TESTS
-
-	QUnit.module( 'DOM' );
-
-	test( 'Initial slides classes', function() {
-		var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' )
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' );
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' );
-
-		ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' );
-	});
-
-	// ---------------------------------------------------------------
-	// API TESTS
-
-	QUnit.module( 'API' );
-
-	test( 'Reveal.isReady', function() {
-		strictEqual( Reveal.isReady(), true, 'returns true' );
-	});
-
-	test( 'Reveal.isOverview', function() {
-		strictEqual( Reveal.isOverview(), false, 'false by default' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), true, 'true after toggling on' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), false, 'false after toggling off' );
-	});
-
-	test( 'Reveal.isPaused', function() {
-		strictEqual( Reveal.isPaused(), false, 'false by default' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), true, 'true after pausing' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), false, 'false after resuming' );
-	});
-
-	test( 'Reveal.isFirstSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-
-		Reveal.slide( 1, 0 );
-		strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.isLastSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-
-		var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1;
-
-		Reveal.slide( lastSlideIndex, 0 );
-		strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( ', 0+ lastSlideIndex +' )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.getIndices', function() {
-		var indices = Reveal.getIndices();
-
-		ok( typeof indices.hasOwnProperty( 'h' ), 'h exists' );
-		ok( typeof indices.hasOwnProperty( 'v' ), 'v exists' );
-		ok( typeof indices.hasOwnProperty( 'f' ), 'f exists' );
-
-		Reveal.slide( 1, 0 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 0, 'h 1, v 0' );
-
-		Reveal.slide( 1, 2 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 2, 'h 1, v 2' );
-
-		Reveal.slide( 0, 0 );
-	});
-
-	test( 'Reveal.getSlide', function() {
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-
-		equal( Reveal.getSlide( 0 ), firstSlide, 'gets correct first slide' );
-
-		strictEqual( Reveal.getSlide( 100 ), undefined, 'returns undefined when slide can\'t be found' );
-	});
-
-	test( 'Reveal.getPreviousSlide/getCurrentSlide', function() {
-		Reveal.slide( 0, 0 );
-		Reveal.slide( 1, 0 );
-
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-		var secondSlide = document.querySelector( '.reveal .slides>section:nth-child(2)>section' );
-
-		equal( Reveal.getPreviousSlide(), firstSlide, 'previous is slide #0' );
-		equal( Reveal.getCurrentSlide(), secondSlide, 'current is slide #1' );
-	});
-
-	test( 'Reveal.getScale', function() {
-		ok( typeof Reveal.getScale() === 'number', 'has scale' );
-	});
-
-	test( 'Reveal.getConfig', function() {
-		ok( typeof Reveal.getConfig() === 'object', 'has config' );
-	});
-
-	test( 'Reveal.configure', function() {
-		strictEqual( Reveal.getConfig().loop, false, '"loop" is false to start with' );
-
-		Reveal.configure({ loop: true });
-		strictEqual( Reveal.getConfig().loop, true, '"loop" has changed to true' );
-
-		Reveal.configure({ loop: false, customTestValue: 1 });
-		strictEqual( Reveal.getConfig().customTestValue, 1, 'supports custom values' );
-	});
-
-	test( 'Reveal.availableRoutes', function() {
-		Reveal.slide( 0, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: false, up: false, down: false, right: true }, 'correct for first slide' );
-
-		Reveal.slide( 1, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: true, up: false, down: true, right: true }, 'correct for vertical slide' );
-	});
-
-	test( 'Reveal.next', function() {
-		Reveal.slide( 0, 0 );
-
-		// Step through vertical child slides
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 1, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined } );
-
-		// Step through fragments
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 } );
-	});
-
-	test( 'Reveal.next at end', function() {
-		Reveal.slide( 3 );
-
-		// We're at the end, this should have no effect
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-	});
-
-
-	// ---------------------------------------------------------------
-	// FRAGMENT TESTS
-
-	QUnit.module( 'Fragments' );
-
-	test( 'Sliding to fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 }, 'Reveal.slide( 2, 0, -1 )' );
-
-		Reveal.slide( 2, 0, 0 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'Reveal.slide( 2, 0, 0 )' );
-
-		Reveal.slide( 2, 0, 2 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'Reveal.slide( 2, 0, 2 )' );
-
-		Reveal.slide( 2, 0, 1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'Reveal.slide( 2, 0, 1 )' );
-	});
-
-	test( 'Hiding all fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 1, 'one fragment visible when index is 0' );
-
-		Reveal.slide( 2, 0, -1 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when index is -1' );
-	});
-
-	test( 'Current fragment', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment at index -1' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 1, 'one current fragment at index 0' );
-
-		Reveal.slide( 1, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to next slide' );
-	});
-
-	test( 'Stepping through fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-
-		// forwards:
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'next() goes to next fragment' );
-
-		Reveal.right();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'right() goes to next fragment' );
-
-		Reveal.down();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'down() goes to next fragment' );
-
-		Reveal.down(); // moves to f #3
-
-		// backwards:
-
-		Reveal.prev();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'prev() goes to prev fragment' );
-
-		Reveal.left();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'left() goes to prev fragment' );
-
-		Reveal.up();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'up() goes to prev fragment' );
-	});
-
-	test( 'Stepping past fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 0, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when on previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 3, 'all fragments visible when on future slide' );
-	});
-
-	test( 'Fragment indices', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(2)' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 2, 'both fragments of same index are shown' );
-	});
-
-	test( 'Index generation', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		// These have no indices defined to start with
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '2' );
-	});
-
-	test( 'Index normalization', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(3)' );
-
-		// These start out as 1-4-4 and should normalize to 0-1-1
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '1' );
-	});
-
-	asyncTest( 'fragmentshown event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmentshown', _onEvent );
-
-		Reveal.slide( 2, 0 );
-		Reveal.slide( 2, 0 ); // should do nothing
-		Reveal.slide( 2, 0, 0 ); // should do nothing
-		Reveal.next();
-		Reveal.next();
-		Reveal.prev(); // shouldn't fire fragmentshown
-
-		start();
-
-		Reveal.removeEventListener( 'fragmentshown', _onEvent );
-	});
-
-	asyncTest( 'fragmenthidden event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmenthidden', _onEvent );
-
-		Reveal.slide( 2, 0, 2 );
-		Reveal.slide( 2, 0, 2 ); // should do nothing
-		Reveal.prev();
-		Reveal.prev();
-		Reveal.next(); // shouldn't fire fragmenthidden
-
-		start();
-
-		Reveal.removeEventListener( 'fragmenthidden', _onEvent );
-	});
-
-
-	// ---------------------------------------------------------------
-	// CONFIGURATION VALUES
-
-	QUnit.module( 'Configuration' );
-
-	test( 'Controls', function() {
-		var controlsElement = document.querySelector( '.reveal>.controls' );
-
-		Reveal.configure({ controls: false });
-		equal( controlsElement.style.display, 'none', 'controls are hidden' );
-
-		Reveal.configure({ controls: true });
-		equal( controlsElement.style.display, 'block', 'controls are visible' );
-	});
-
-	test( 'Progress', function() {
-		var progressElement = document.querySelector( '.reveal>.progress' );
-
-		Reveal.configure({ progress: false });
-		equal( progressElement.style.display, 'none', 'progress are hidden' );
-
-		Reveal.configure({ progress: true });
-		equal( progressElement.style.display, 'block', 'progress are visible' );
-	});
-
-	test( 'Loop', function() {
-		Reveal.configure({ loop: true });
-
-		Reveal.slide( 0, 0 );
-
-		Reveal.left();
-		notEqual( Reveal.getIndices().h, 0, 'looped from start to end' );
-
-		Reveal.right();
-		equal( Reveal.getIndices().h, 0, 'looped from end to start' );
-
-		Reveal.configure({ loop: false });
-	});
-
-
-	// ---------------------------------------------------------------
-	// EVENT TESTS
-
-	QUnit.module( 'Events' );
-
-	asyncTest( 'slidechanged', function() {
-		expect( 3 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'slidechanged', _onEvent );
-
-		Reveal.slide( 1, 0 ); // should trigger
-		Reveal.slide( 1, 0 ); // should do nothing
-		Reveal.next(); // should trigger
-		Reveal.slide( 3, 0 ); // should trigger
-		Reveal.next(); // should do nothing
-
-		start();
-
-		Reveal.removeEventListener( 'slidechanged', _onEvent );
-
-	});
-
-	asyncTest( 'paused', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'paused', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'paused', _onEvent );
-	});
-
-	asyncTest( 'resumed', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'resumed', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'resumed', _onEvent );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/BOS14/_support/template.reveal b/docs/slides/BOS14/_support/template.reveal
deleted file mode 100644
--- a/docs/slides/BOS14/_support/template.reveal
+++ /dev/null
@@ -1,128 +0,0 @@
-<!doctype html>  
-<html lang="en">
-	
-<head>
-<meta charset="utf-8">
-
-<title>Liquid Types</title>
-
-<meta name="description" content="Liquid Types IHP 2014">
-<meta name="author" content="Ranjit Jhala">
-
-<meta name="apple-mobile-web-app-capable" content="yes" />
-
-<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
-
-<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
-
-<link rel="stylesheet" href="$reveal$/css/reveal.css">
-<link rel="stylesheet" href="$reveal$/css/theme/seminar.css" id="theme">
-<!-- <link rel="stylesheet" href="$reveal$/css/print/pdf.css"> -->
-<link rel="stylesheet" href="../_support/liquidhaskell.css">
-
-<!-- For syntax highlighting -->
-<link rel="stylesheet" href="$reveal$/lib/css/zenburn.css">
-
-<script>
-	// If the query includes 'print-pdf' we'll use the PDF print sheet
-	document.write( '<link rel="stylesheet" href="$reveal$/css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
-</script>
-
-<!--[if lt IE 9]>
-<script src="lib/js/html5shiv.js"></script>
-<![endif]-->
-</head>
-<body>
-
-\(
-\require{color}
-\definecolor{kvcol}{RGB}{203,23,206}
-\definecolor{tycol}{RGB}{5,177,93}
-\definecolor{refcol}{RGB}{18,110,213}
-
-\newcommand{\quals}{\mathbb{Q}}
-\newcommand{\defeq}{\ \doteq\ }
-\newcommand{\subty}{\preceq}
-\newcommand{\True}{\mathit{True}}
-\newcommand{\Int}{\mathtt{Int}}
-\newcommand{\Nat}{\mathtt{Nat}}
-\newcommand{\Zero}{\mathtt{Zero}}
-\newcommand{\foo}[4]{{#1}^{#4} + {#2}^{#4} = {#3}^{#4}}
-\newcommand{\reft}[3]{\{\bindx{#1}{#2} \mid {#3}\}}
-\newcommand{\ereft}[3]{\bindx{#1}{\{#2 \mid #3\}}}
-\newcommand{\bindx}[2]{{#1}\!:\!{#2}}
-\newcommand{\reftx}[2]{\{{#1}\mid{#2}\}}
-\newcommand{\inferrule}[3][]{\frac{#2}{#3}\;{#1}}
-\newcommand{\kvar}[1]{\color{kvcol}{\mathbf{\kappa_{#1}}}}
-\newcommand{\llen}[1]{\mathtt{llen}(#1)}
-\)
-
-<div class="reveal">
-<!-- 
-Used to fade in a background when a specific slide state is reached
--->
-<div class="state-background"></div>
-
-<!-- Slides
-Any section element inside of this "slides" container is displayed as a slide
--->
-<div class="slides">
-<!-- Pandoc -->
-$if(title)$
-<section class="titlepage">
-<h1 class="title">$title$</h1>
-$for(author)$
-<h2 class="author">$author$</h2>
-$endfor$
-<h3 class="date">$date$</h3>
-</section>
-$endif$
-$body$
-<!-- End Pandoc -->
-
-</div>
-<!-- End Slides -->
-
-<!-- Presentation progress bar -->
-<div class="progress"><span></span></div>
-</div>
-
-<!-- Initialize reveal.js :: make settings changes here -->
-<script src="$reveal$/lib/js/head.min.js"></script>
-<script src="$reveal$/js/reveal.js"></script>
-
-<!-- ORIGINAL <script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-     -->
-
-<!-- LOCAL 
-<script type="text/javascript" src="file:///Users/rjhala/research/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
--->
-
-<script type="text/javascript" src="$mathjax$/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-
-<script>		
-	// Full list of configuration options available here:
-	// https://github.com/hakimel/reveal.js#configuration
-	Reveal.initialize({
-		controls: true,
-		progress: true,
-		history: true,
-		center: false,
-        rollingLinks: false,
-        theme: Reveal.getQueryHash().theme || 'seminar', // available themes are in /css/theme
-		transition: Reveal.getQueryHash().transition || 'fade', // default/cube/page/concave/linear(2d)
-
-		// Optional libraries used to extend on reveal.js
-		dependencies: [
-			//{ src: '$reveal$/lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
-			{ src: '$reveal$/lib/js/classList.js', condition: function() { return !document.body.classList; } },
-			{ src: '$reveal$/lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-			{ src: '$reveal$/plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-		]
-	});
-</script>
-
-</body>
-</html>
diff --git a/docs/slides/BOS14/hs/end/000_Refinements.hs b/docs/slides/BOS14/hs/end/000_Refinements.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/end/000_Refinements.hs
+++ /dev/null
@@ -1,57 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module Refinements where
-
-import Prelude hiding (map, foldr, foldr1)
-
-divide    :: Int -> Int -> Int
-
-
------------------------------------------------------------------------
--- | 1. Simple Refinement Types
------------------------------------------------------------------------
-
-{-@ type Nat     = {v:Int | v >= 0} @-}
-{-@ type Pos     = {v:Int | v >  0} @-}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-
-
-{-@ six :: NonZero @-}
-six = 10 :: Int
-
------------------------------------------------------------------------
--- | 2. Function Contracts: Preconditions & Dead Code 
------------------------------------------------------------------------
-
-{-@ dead :: {v:_ | false} -> a @-}
-dead msg = error msg
-
------------------------------------------------------------------------
--- | 3. Function Contracts: Safe Division 
------------------------------------------------------------------------
-
-abs :: Int -> Int
-abs x | x > 0     = x
-      | otherwise = 0 - x
-
-{-@ divide :: Int -> NonZero -> Int @-}
-divide x 0 = dead "divide-by-zero"
-divide x n = x `div` n
-
-
-
-
-avg2 x y   = divide (x + y)     2
-avg3 x y z = divide (x + y + z) 3
-
-
------------------------------------------------------------------------
--- | But whats the problem here?
------------------------------------------------------------------------
-
-avg xs     = divide total n
-  where
-    total  = sum xs
-    n      = length xs
diff --git a/docs/slides/BOS14/hs/end/001_Refinements.hs b/docs/slides/BOS14/hs/end/001_Refinements.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/end/001_Refinements.hs
+++ /dev/null
@@ -1,101 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module Refinements where
-
-import Prelude hiding (map, foldr, foldr1)
-
-divide    :: Int -> Int -> Int
-wtAverage :: List (Int, Int) -> Int
-
------------------------------------------------------------------------
--- | Our first Data Type
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
------------------------------------------------------------------------
--- | A few Higher-Order Functions
------------------------------------------------------------------------
-
-{-@ map :: _ -> xs:_ -> {v:_ | size v = size xs} @-}
-map f (N)      = N
-map f (C x xs) = C (f x) (map f xs) 
-
-
-foldr                :: (a -> b -> b) -> b -> List a -> b 
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
-
-
--- Uh oh. How shall we fix the error? Lets move on for now...
-
-{-@ foldr1           :: (a -> a -> a) -> {v:List a | size v > 0} -> a @-}   
-foldr1 f (C x xs)    = foldr f x xs
-foldr1 f N           = dead "foldr1"
-
-
------------------------------------------------------------------------
--- | 6. Weighted-Averages 
------------------------------------------------------------------------
-
--- Yikes, a divide-by-zero. How shall we fix it?
-{-@ wtAverage :: {v : List (Pos, Pos) | size v > 0} -> Int @-}
-wtAverage wxs = total `divide` weights
-  where
-    total     = sum $ map (\(w, x) -> w * x) wxs
-    weights   = sum $ map (\(w, _) -> w    ) wxs
-    sum       = foldr1 (+)
-
-
--- | Exercise: How would you modify the types to get output `Pos` above? 
-
-
-
-
-
- 
------------------------------------------------------------------------
--- | Measuring the Size of Data
------------------------------------------------------------------------
-
-{-@ measure size @-}
-size          :: List a -> Int
-size (C x xs) = 1 + size xs 
-size N        = 0
-
-
-{-@ append :: xs:_ -> ys:_ -> {v: _ | size v = size ys + size xs} @-}
-append N        ys = ys
-append (C x xs) ys = C x (append xs ys)
-
-
------------------------------------------------------------------------
--- | But there are limitations: why does this not work? ...
------------------------------------------------------------------------
-
-{-@ append' :: xs:_ -> ys:_ -> {v: _ | size v = size xs + size ys} @-}
-append' xs ys =  foldr C ys xs
-
-
-
-
------------------------------------------------------------------------
--- | Definitions from 000_Refinements.hs
------------------------------------------------------------------------
-
-{-@ type Nat     = {v:Int | v >= 0} @-}
-{-@ type Pos     = {v:Int | v >  0} @-}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-
-{-@ dead :: {v:_ | false} -> a @-}
-dead msg = error msg
-
-{-@ divide :: Int -> NonZero -> Int @-}
-divide x 0 = dead "divide-by-zero"
-divide x n = x `div` n
-
-
diff --git a/docs/slides/BOS14/hs/end/01_Elements.hs b/docs/slides/BOS14/hs/end/01_Elements.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/end/01_Elements.hs
+++ /dev/null
@@ -1,104 +0,0 @@
-module Elems where
-
-import Prelude hiding (elem)
-
-import Data.Set (Set (..))
-
-
------------------------------------------------------------------------------
--- | 1. Reasoning about the Set of Elements in a List ----------------------- 
------------------------------------------------------------------------------
-
--- | The set of `elems` of a list
-
-
-
-
-
-{-@ measure elems :: [a] -> (Set a)
-    elems ([])    = (Set_empty 0)
-    elems (x:xs)  = (Set_cup (Set_sng x) (elems xs))
-  @-}
-
-
-
-
--- | A few handy aliases
-
-{-@ predicate EqElts Xs Ys    = elems Xs = elems Ys                      @-}
-{-@ predicate UnElts Xs Ys Zs = elems Xs = Set_cup (elems Ys) (elems Zs) @-}
-
--- | Reasoning about `append` and `reverse`
-
-{-@ append  :: xs:_ -> ys:_ -> {v:_ | UnElts v xs ys} @-}  
-append [] ys     = ys
-append (x:xs) ys = x : append xs ys 
-
-
-{-@ reverse :: xs:_ -> {v:_ | EqElts v xs} @-}
-reverse xs           = revAcc xs []
-  where 
-   revAcc []     acc = acc
-   revAcc (x:xs) acc = revAcc xs (x:acc)
-
-
-
--- But, there are limitations...
-   
-{-@ append'  :: xs:_ -> ys:_ -> {v:_ | UnElts v xs ys} @-}  
-append' xs ys = foldr (:) ys xs
-
-
------------------------------------------------------------------------------
--- | 2. Checking for duplicates (xmonad) ------------------------------------ 
------------------------------------------------------------------------------
-
--- | Is a list free of duplicates?
-   
-{-@ measure nodups :: [a] -> Prop
-    nodups ([])   = true
-    nodups (x:xs) = (not (Set_mem x (elems xs)) && nodups xs)
-  @-}
-
--- | Weeding out duplicates.
-   
-{-@ nub :: xs:_ -> {v:_ | nodups v && EqElts v xs} @-}
-nub xs             = go xs []
-  where
-    go (x:xs) l
-      | x `elem` l = go xs l     
-      | otherwise  = go xs (x:l) 
-    go [] l        = l
-
-
-{-@ elem :: x:_ -> ys:_ -> {v:Bool | Prop v <=> Set_mem x (elems ys)} @-}
-elem x []     = False
-elem x (y:ys) = x == y || elem x ys
-
------------------------------------------------------------------------------
--- | 3. Associative Lookups ------------------------------------------------- 
------------------------------------------------------------------------------
-
--- The dread "key-not-found". How can we fix it?
-{-@ find :: k:_ -> {m:_ | ValidKey k m} -> _ @-}
-find key ((k,v) : kvs)
-  | key == k  = v
-  | otherwise = find key kvs
-find _ []     = die "Key not found! Lookup failed!"
-
-
-{-@ die :: {v:String | false} -> b @-}
-die x = error x
-
-
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-
-{-@ predicate ValidKey K M    = Set_mem K (keys M)                       @-}
-
-{-@ measure keys  :: [(a, b)] -> (Set a)
-    keys ([])     = (Set_empty 0)
-    keys (kv:kvs) = (Set_cup (Set_sng (fst kv)) (keys kvs))
-  @-}
- 
diff --git a/docs/slides/BOS14/hs/end/02_AbstractRefinements.hs b/docs/slides/BOS14/hs/end/02_AbstractRefinements.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/end/02_AbstractRefinements.hs
+++ /dev/null
@@ -1,252 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module AbstractRefinements (
-    listMax
-  , insertSort
-  , insertSort'
-  , insertSort''
-  ) where
-
-import Data.Set hiding (insert, foldr,size,filter, append) 
-import Prelude hiding (map, foldr, filter, append)
-
-listMax     :: [Int] -> Int
-
-
-
------------------------------------------------------------------------
--- | #1. Abstract Refinements 
------------------------------------------------------------------------
-
-{-@ listMax :: forall <p :: Int -> Prop>. {v:[Int<p>] | len v > 0} -> Int<p> @-} 
-listMax xs  = foldr1 max xs 
-
-
--- Lets define a few different subsets of Int
-
-{-@ type Even = {v:Int | v mod 2 == 0}      @-}
-{-@ type Odd  = {v:Int | v mod 2 /= 0}      @-}
-{-@ type RGB  = {v:Int | 0 <= v && v < 256} @-}
-
-
-{-@ xE :: Even @-}
-xE = listMax [0, 200, 4000, 60] 
-
-
-{-@ xO :: Odd @-}
-xO = listMax [1, 21, 4001, 961] 
-
-
-{-@ xR :: RGB @-}
-xR = listMax [1, 21, 41, 61] 
-
-
-
-
-
-
-
--- > RJ: Return to slides for 06_Inductive
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | #2. Induction, as an Abstract Refinement 
------------------------------------------------------------------------
-
-
-{-@ ifoldr :: forall a b <p :: List a -> b -> Prop>. 
-                 (xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)>) 
-               -> b<p N> 
-               -> ys:List a
-               -> b<p ys>                            @-}
-ifoldr :: (List a -> a -> b -> b) -> b -> List a -> b
-ifoldr f b N        = b
-ifoldr f b (C x xs) = f xs x (ifoldr f b xs)
-
-
-
-
-
-
-
-
-{-@ append :: xs:List a -> ys:List a -> {v:List a | UnElems v xs ys} @-} 
-append xs ys = ifoldr (\_ -> C) ys xs 
-
-
-
-
-
-
-
-{-@ filter :: (a -> Bool) -> xs:List a -> {v:List a | SubElems v xs } @-} 
-filter f xs = ifoldr (id (\_ x ys -> if f x then C x ys else ys)) N xs
-
-
-
-
-
-
--- > RJ: Return to slides for 08_Recursive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | #3. Abstract Refinement from List's Type 
------------------------------------------------------------------------
-
-
-{-@ data List a <p :: a -> a -> Prop> 
-     = N | C {hd :: a, tl :: List<p> (a<p hd>) } @-}
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | #4. Instantiating Abstract Refinements on Lists 
------------------------------------------------------------------------
-
-
-{-@ type IncrList a = List <{\x y -> x <= y}> a @-} 
-{-@ type DecrList a = List <{\x y -> x >= y}> a @-} 
-{-@ type DiffList a = List <{\x y -> x /= y}> a @-} 
-
-{-@ ups   :: IncrList Integer @-}
-ups       = 1 `C` 2 `C` 4 `C` N
-
-{-@ downs :: DecrList Integer @-}
-downs     = 100 `C` 20 `C` 4 `C` N
-
-{-@ diffs :: DiffList Integer @-}
-diffs     = 100 `C` 1000 `C` 10 `C` 1 `C`  N
-
------------------------------------------------------------------------
--- | 5. Insertion Sort
------------------------------------------------------------------------
-
-{-@ insert         :: x:a -> xs:IncrList a -> {v:IncrList a | AddElt v x xs && size v = 1 + size xs} @-}
-insert x N         = x `C` N
-insert x (C y ys)
-  | x < y          = x `C` y `C` ys
-  | otherwise      = y `C` insert x ys 
-
-{-@ insertSort      :: xs:List a -> IncrList a @-}
-insertSort N        = N
-insertSort (C x xs) = insert x (insertSort xs)
-
------------------------------------------------------------------------
--- | 6. Insertion Sort: using a `foldr` 
------------------------------------------------------------------------
-
-{-@ insertSort' :: xs:List a -> IncrList a @-}
-insertSort' xs = foldr insert N xs
-
-
-
-
-
-
-
--- Or even better... we can use `ifoldr`
-
-{-@ insertSort'' :: xs:List a -> {v:IncrList a | EqSize v xs && EqElem v xs} @-}
-insertSort'' xs = ifoldr (\_ -> insert) N xs
-
-
-
-
-
-
-
-
--- > RJ: Return to slides for "07_Array"
-
-
-
-
-
-
-              
------------------------------------------------------------------------
--- | Boilerplate definitions from 00_Refinements.hs
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
-{-@ measure size @-}
-size          :: List a -> Int
-size (C x xs) = 1 + size xs 
-size N        = 0
-
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
-
-{-@ predicate EqSize X Y    = size X  = size Y                         @-}
-{-@ predicate EqElem X Y    = elems X = elems Y                        @-}
-{-@ predicate UnElems X Y Z = elems X = Set_cup (elems Y) (elems Z)    @-}
-{-@ predicate SubElems X Y  = Set_sub (elems X) (elems Y)              @-}
-{-@ predicate AddElt V X Xs = elems V = Set_cup (Set_sng X) (elems Xs) @-}
-
-{-@ measure elems ::List a -> (Set a)
-    elems (N)      = (Set_empty 0)
-    elems (C x xs) = (Set_cup (Set_sng x) (elems xs))
-  @-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{-@ predicate SubConsElems X Y Ys = Set_sub (elems X) (Set_cup (Set_sng Y) (elems Ys)) @-}
-
-{-@ qual1  :: y:_ -> ys:_ -> {v:_ | SubConsElems v y ys} @-}
-qual1 :: a -> List a -> List a 
-qual1 y ys = undefined 
-
-{-@ qual2  :: y:_ -> ys:_ -> {v:_ | size v <= 1 + size ys} @-}
-qual2 :: a -> List a -> List a 
-qual2 y ys = undefined 
-
-
-
diff --git a/docs/slides/BOS14/hs/end/03_Termination.hs b/docs/slides/BOS14/hs/end/03_Termination.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/end/03_Termination.hs
+++ /dev/null
@@ -1,142 +0,0 @@
-module Termination where
-
-import Prelude hiding (gcd, mod, map, repeat, take)
-import Language.Haskell.Liquid.Prelude
-
-fac   :: Int -> Int
-tfac  :: Int -> Int -> Int
-map   :: (a -> b) -> List a -> List b
-merge :: (Ord a) => List a -> List a -> List a
-
-
--------------------------------------------------------------------------
--- | Simple Termination
--------------------------------------------------------------------------
-
-{-@ fac :: Nat -> Nat @-}
-fac 0 = 1
-fac 1 = 1
-fac n = n * fac (n-1)
-
-
-
-
--------------------------------------------------------------------------
--- | Semantic Termination
--------------------------------------------------------------------------
-
-{-@ gcd :: a:Nat -> b:{v:Nat | v < a} -> Int @-}
-gcd :: Int -> Int -> Int
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-
-
-{-@ mod :: a:Nat -> b:{v:Nat| 0 < v && v < a} -> {v:Nat | v < b} @-}
-mod :: Int -> Int -> Int
-mod a b | a - b >  b = mod (a - b) b
-        | a - b <  b = a - b
-        | a - b == b = 0
-
--------------------------------------------------------------------------
--- | Explicit Metrics #1 
--------------------------------------------------------------------------
-
-tfac acc 0 = acc
-tfac acc n = tfac (n * acc) (n-1)
-
-
-
-
--------------------------------------------------------------------------
--- Explicit Metrics #2 
--------------------------------------------------------------------------
-
-range :: Int -> Int -> [Int]
-range lo hi
-  | lo < hi   = lo : range (lo + 1) hi
-  | otherwise = []
-
-
-
--------------------------------------------------------------------------
--- | Structural Recursion 
--------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-{-@ measure size @-}
-size :: List a -> Int 
-size (C x xs) = 1 + size xs
-size (N)      = 0
-
-{-@ map :: (a -> b) -> xs:List a -> (List b) / [size xs] @-}
-map _ N        = N
-map f (C x xs) = f x `C` map f xs
-
-
-
--------------------------------------------------------------------------
--- | Default Metrics
--------------------------------------------------------------------------
-
-{-@ data List a = N | C {x :: a, xs :: List a } @-}
-
-map' _ N        = N
-map' f (C x xs) = f x `C` map' f xs
-
-
-
--------------------------------------------------------------------------
--- | Termination Expressions Metrics
--------------------------------------------------------------------------
-
-merge (C x xs) (C y ys)
-  | x < y      = x `C` merge xs (y `C` ys)
-  | otherwise  = y `C` merge (x `C` xs) ys
-merge _   ys   = ys
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------
-take            :: Int -> List a -> List a
-{-@ invariant {v : List a | 0 <= size v} @-}
-
-
-
-
-
-
-
-
--- CHEAT CODES, in case I forget :)
-
-{- tfac :: Nat -> n:Nat -> Nat / [n] @-}
-{- range :: lo:Nat -> hi:Nat -> [Nat] / [hi-lo] @-}
-{- merge :: xs:_ -> ys:_ -> _ / [size xs + size ys] @-}
diff --git a/docs/slides/BOS14/hs/end/04_Streams.hs b/docs/slides/BOS14/hs/end/04_Streams.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/end/04_Streams.hs
+++ /dev/null
@@ -1,106 +0,0 @@
-module Streams where
-
-import Prelude hiding (take, repeat)
-
-import Language.Haskell.Liquid.Prelude
-
--------------------------------------------------------------------------
--- | Lists 
--------------------------------------------------------------------------
- 
-data List a = N | C { x :: a, xs :: List a }
-
--- | Associate an abstract refinement with the _tail_ xs
-
-{-@ data List a <p :: List a -> Prop>
-      = N | C { x  :: a
-              , xs :: List <p> a <<p>>
-              }
-  @-}
-
--------------------------------------------------------------------------
--- | Infinite Streams
--------------------------------------------------------------------------
-
--- | Infinite List = List where _each_ tail is a `cons` ...
-
-{-@ type Stream a = {xs: List <{\v -> cons v}> a | cons xs} @-}
-
--- | A simple measure for when a `List` is a `Cons`
-
-{-@ measure cons  :: (List a) -> Prop
-    cons (C x xs) = true 
-    cons (N)      = false 
-  @-}
-
--------------------------------------------------------------------------
--- | Creating an Infinite Stream
--------------------------------------------------------------------------
-
-{-@ Lazy repeat @-}
-                 
-{-@ repeat :: a -> Stream a @-}
-repeat   :: a -> List a
-repeat x = x `C` repeat x
-
-
--------------------------------------------------------------------------
--- | Using an Infinite Stream
--------------------------------------------------------------------------
-
-{-@ take        :: n:Nat -> Stream a -> {v:List a | size v = n} @-}
-take 0 _        = N
-take n (C x xs) = x `C` take (n-1) xs
-take _ N        = liquidError "never happens"
-
--------------------------------------------------------------------------
-
-
-
-
-
-
-
-
-
-
-
--- | Other specs from before ...
-
-{-@ measure size :: List a -> Int 
-    size (N)      = 0
-    size (C x xs) = (1 + size xs)
-  @-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------
-take            :: Int -> List a -> List a
-
-
-
-
-
-
-
-
-
diff --git a/docs/slides/BOS14/hs/end/05_Memory.hs b/docs/slides/BOS14/hs/end/05_Memory.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/end/05_Memory.hs
+++ /dev/null
@@ -1,387 +0,0 @@
-{-# LANGUAGE ForeignFunctionInterface #-}
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--diffcheck"     @-}
-
-module Memory where
-
-import Prelude hiding (null)
-import Data.Char
-import Data.Word
-import Foreign.C.Types
-import Foreign.ForeignPtr
-import Foreign.Ptr
-import Foreign.Storable
-import System.IO.Unsafe
-import Data.ByteString.Internal (c2w, w2c)
-import Language.Haskell.Liquid.Prelude
-
-
-------------------------------------------------------------------------
--- | 1. Low-level Pointer API  -----------------------------------------
-------------------------------------------------------------------------
-
--- | Create a buffer of size 4 and initialize it with zeros
-
-zero4  = do fp <- mallocForeignPtrBytes 4
-            withForeignPtr fp $ \p -> do
-              poke (p `plusPtr` 0) zero 
-              poke (p `plusPtr` 1) zero 
-              poke (p `plusPtr` 2) zero 
-              poke (p `plusPtr` 3) zero 
-            return fp
-        where
-            zero = 0 :: Word8
-
--- But whats to prevent an overflow, e.g. writing to offset 5 or 50?
-            
-
-
--- | Types for Pointers
-
--- data Ptr a         
--- data ForeignPtr a 
-
--- | Size of Ptr and ForeignPtr
-
--- measure plen  :: Ptr a -> Int 
--- measure fplen :: ForeignPtr a -> Int 
-
-
-{-@ type PtrN a N        = {v:Ptr a        |  plen v  = N}  @-}
-{-@ type ForeignPtrN a N = {v:ForeignPtr a |  fplen v = N}  @-}
-
--- | Allocating Memory
-
-{-@ assume mallocForeignPtrBytes :: n:Nat -> IO (ForeignPtrN a n) @-}
-
--- | Using a pointer
-
-{- withForeignPtr :: fp:ForeignPtr a 
-                  -> (PtrN a (fplen fp) -> IO b)  
-                  -> IO b             
--}
-
--- | Pointer Arithmetic
-
-{- plusPtr :: p:Ptr a
-           -> o:{Nat|o <= plen p}   -- in bounds
-           -> PtrN b (plen b - o)   -- remainder
--}
-
--- | Read and Write
-
-{- peek :: {v:Ptr a | 0 < plen v} -> IO a  
-   poke :: {v:Ptr a | 0 < plen v} -> a -> IO ()  
- -}
-
--- | Example: Preventing Overflows e.g. writing 5 or 50 zeros?
-
-zero4' = do fp <- mallocForeignPtrBytes 4
-            withForeignPtr fp $ \p -> do
-              poke (p `plusPtr` 0) zero 
-              poke (p `plusPtr` 1) zero 
-              poke (p `plusPtr` 2) zero 
-              poke (p `plusPtr` 5) zero 
-            return fp
-        where
-            zero = 0 :: Word8
-
-
-
-------------------------------------------------------------------------
--- | 2. ByteString API -------------------------------------------------
-------------------------------------------------------------------------
-
-data ByteString = PS {
-    bPtr :: ForeignPtr Word8
-  , bOff :: !Int
-  , bLen :: !Int
-  }
-
-
--- | Refined Type, with invariants
-
-{-@ data ByteString = PS {
-      bPtr :: ForeignPtr Word8
-    , bOff :: {v:Nat| v        <= fplen bPtr}
-    , bLen :: {v:Nat| v + bOff <= fplen bPtr}
-    }
-
-  @-}
-
--- | Some useful abbreviations
-
-{-@ type ByteStringN N = {v:ByteString | bLen v = N} @-}
-{-@ type StringN N     = {v:String     | len v  = N} @-}
-
--- | Legal Bytestrings 
-
-{-@ good1 :: IO (ByteStringN 5) @-}
-good1 = do fp <- mallocForeignPtrBytes 5
-           return $ PS fp 0 5
-
-{-@ good2 :: IO (ByteStringN 3) @-}
-good2 = do fp <- mallocForeignPtrBytes 5
-           return $ PS fp 2 3
-
--- | Illegal Bytestrings 
-
-bad1 = do fp <- mallocForeignPtrBytes 3 
-          return $ PS fp 0 10 
-
-bad2 = do fp <- mallocForeignPtrBytes 3
-          return $ PS fp 2 2
-
-
-
--- | ByteString API: `create`
-
-create :: Int -> (Ptr Word8 -> IO ()) -> ByteString
-
-create n fill = unsafePerformIO $ do
-  fp  <- mallocForeignPtrBytes n
-  withForeignPtr fp fill 
-  return $! PS fp 0 n
-
-
--- Yikes, there is an error! How to fix?
-
--- | ByteStringN API: `unsafeTake`
-
-unsafeTake n (PS x s l) = PS x s n
-
--- Wow, thats super fast. O(1)! But how to fix the error?
-
--- | ByteString API: `pack`
-
-pack          :: String -> ByteString
-pack str      = create n $ \p -> go p xs
-  where
-  n           = length str
-  xs          = map c2w str
-  go p (x:xs) = poke p x >> go (plusPtr p 1) xs
-  go _ []     = return  ()
-
--- Hmm. How to fix the error?
-
-
-
--- | ByteString API: `unpack` 
-
-
-
-{-@ qualif Unpack(v:a, acc:b, n:int) : len v = 1 + n + len acc @-}
-
-unpack :: ByteString -> String 
-unpack (PS _  _ 0)  = []
-unpack (PS ps s l)  = unsafePerformIO $ withForeignPtr ps $ \p ->
-   go (p `plusPtr` s) (l - 1)  []
-  where
-   go p 0 acc = peek p >>= \e -> return (w2c e : acc)
-   go p n acc = peek (p `plusPtr` n) >>= \e -> go p (n-1) (w2c e : acc)
-
-
-
-------------------------------------------------------------------------
--- | 3. Application API (Heartbleed no more!) --------------------------
-------------------------------------------------------------------------
-
-chop     :: String -> Int -> String 
-chop s n =  s'
-  where 
-    b    = pack s          -- down to low-level
-    b'   = unsafeTake n b  -- grab n chars
-    s'   = unpack b'       -- up to high-level
-
--- Whats the problem?
-
-
-
-
-
--- | "HeartBleed" no more
-
-demo     = [ex6, ex30]
-  where
-    ex   = ['R','a','n','j','i','t']
-    ex6  = chop ex 6  -- ok
-    ex30 = chop ex 30 -- out of bounds
-
-
--- "Bleeding" `chop ex 30` *rejected* by compiler
-
-
-
-------------------------------------------------------------------------
--- | 3. Bonus Material -------------------------------------------------
-------------------------------------------------------------------------
-
--- | `group` ing ByteStrings 
-
-{- How shall we type `group` where
-
-     group "foobaaar"
-
-   returns
-
-     ["f","oo", "b", "aaa", "r"]
-
--}
-
--- | An alias for NON-EMPTY ByteStrings
-    
-{-@ type ByteStringNE = {v:ByteString | bLen v > 0} @-}
-
--- | A measure for the sum of sizes of a LIST of ByteStrings
-    
-{-@ measure bLens  :: [ByteString] -> Int
-    bLens ([])   = 0
-    bLens (x:xs) = (bLen x + bLens xs)
-  @-}
-
--- | @group@
-    
-{-@ group :: b:ByteString -> {v: [ByteStringNE] | bLens v = bLen b} @-}
-group xs
-    | null xs   = []
-    | otherwise = let y = unsafeHead xs
-                      (ys, zs) = spanByte (unsafeHead xs) (unsafeTail xs)
-                  in (y `cons` ys) : group zs
-
-
--- | @spanByte@ does the heavy lifting
-
-{-@ spanByte :: Word8 -> b:ByteString -> (ByteStringPair b) @-}
-spanByte :: Word8 -> ByteString -> (ByteString, ByteString)
-spanByte c ps@(PS x s l) = unsafePerformIO $ withForeignPtr x $ \p ->
-    go (p `plusPtr` s) 0
-  where
-    go p i | i >= l    = return (ps, empty)
-           | otherwise = do c' <- peekByteOff p i
-                            if c /= c'
-                                then return (unsafeTake i ps, unsafeDrop i ps)
-                                else go p (i+1)
-
--- | Using the alias
-                            
-{-@ type ByteStringPair B = (ByteString, ByteString)<{\x1 x2 ->
-       bLen x1 + bLen x2 = bLen B}> @-}
-
-
-
-
-
-
-
-
-
-
-----------------------------------------------------------------------------
--- | CHEAT AREA
-----------------------------------------------------------------------------
-
-{- create     :: n:Nat -> (PtrN Word8 n -> IO ()) -> ByteStringN n      @-}
-{- unsafeTake :: n:Nat -> b:{ByteString | n <= bLen b} -> ByteStringN n @-}
-{- pack       :: s:String -> ByteStringN (len s)                        @-}
-{- unpack     :: b:ByteString -> {v:String | len v = bLen b}            @-}
-{- chop       :: s:String -> n:{Nat | n <= len s} -> StringN n          @-} 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | Helper Code (Stuff from BS benchmark, to make demo self-contained)
------------------------------------------------------------------------
-
-{-@ unsafeCreate :: l:Nat -> ((PtrN Word8 l) -> IO ()) -> (ByteStringN l) @-}
-unsafeCreate n f = create n f -- unsafePerformIO $ create n f
-
-{-@ invariant {v:ByteString   | bLen  v >= 0} @-}
-{-@ invariant {v:[ByteString] | bLens v >= 0} @-}
-
-{-@ qualif PLLen(v:a, p:b) : (len v) <= (plen p) @-}
-{-@ qualif ForeignPtrN(v:ForeignPtr a, n:int): fplen v = n @-}
-{-@ qualif FPLenPLen(v:Ptr a, fp:ForeignPtr a): fplen fp = plen v @-}
-{-@ qualif PtrLen(v:Ptr a, xs:List b): plen v = len xs @-}
-{-@ qualif PlenEq(v: Ptr a, x: int): x <= (plen v) @-}
-
-{-@ unsafeHead :: {v:ByteString | (bLen v) > 0} -> Word8 @-}
-
-unsafeHead :: ByteString -> Word8
-unsafeHead (PS x s l) = liquidAssert (l > 0) $
-  unsafePerformIO  $  withForeignPtr x $ \p -> peekByteOff p s
-
-{-@ unsafeTail :: b:{v:ByteString | (bLen v) > 0}
-               -> {v:ByteString | (bLen v) = (bLen b) - 1} @-}
-unsafeTail :: ByteString -> ByteString
-unsafeTail (PS ps s l) = liquidAssert (l > 0) $ PS ps (s+1) (l-1)
-
-{-@ null :: b:ByteString -> {v:Bool | ((Prop v) <=> ((bLen b) = 0))} @-}
-null :: ByteString -> Bool
-null (PS _ _ l) = liquidAssert (l >= 0) $ l <= 0
-
-{-@ unsafeDrop :: n:Nat
-               -> b:{v: ByteString | n <= (bLen v)} 
-               -> {v:ByteString | (bLen v) = (bLen b) - n} @-}
-unsafeDrop  :: Int -> ByteString -> ByteString
-unsafeDrop n (PS x s l) = liquidAssert (0 <= n && n <= l) $ PS x (s+n) (l-n)
-
-{-@ cons :: Word8 -> b:ByteString -> {v:ByteString | (bLen v) = 1 + (bLen b)} @-}
-cons :: Word8 -> ByteString -> ByteString
-cons c (PS x s l) = unsafeCreate (l+1) $ \p -> withForeignPtr x $ \f -> do
-        poke p c
-        memcpy (p `plusPtr` 1) (f `plusPtr` s) (fromIntegral l)
-
-{-@ empty :: {v:ByteString | (bLen v) = 0} @-} 
-empty :: ByteString
-empty = PS nullForeignPtr 0 0
-
-{-@ assume
-    c_memcpy :: dst:(PtrV Word8)
-             -> src:(PtrV Word8) 
-             -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))} 
-             -> IO (Ptr Word8)
-  @-}
-foreign import ccall unsafe "string.h memcpy" c_memcpy
-    :: Ptr Word8 -> Ptr Word8 -> CSize -> IO (Ptr Word8)
-
-{-@ memcpy :: dst:(PtrV Word8)
-           -> src:(PtrV Word8) 
-           -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))} 
-           -> IO () 
-  @-}
-memcpy :: Ptr Word8 -> Ptr Word8 -> CSize -> IO ()
-memcpy p q s = c_memcpy p q s >> return ()
-
-{-@ assume nullForeignPtr :: {v: ForeignPtr Word8 | (fplen v) = 0} @-}
-nullForeignPtr :: ForeignPtr Word8
-nullForeignPtr = unsafePerformIO $ newForeignPtr_ nullPtr
-{-# NOINLINE nullForeignPtr #-}
-
-
-
diff --git a/docs/slides/BOS14/hs/end/06_Eval.hs b/docs/slides/BOS14/hs/end/06_Eval.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/end/06_Eval.hs
+++ /dev/null
@@ -1,71 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-
-module Eval (eval) where
-
-import Language.Haskell.Liquid.Prelude (liquidError)
-import Prelude hiding (lookup)
-import Data.Set (Set (..))
-
-lookup :: Bndr -> Env Expr -> Expr 
-
--------------------------------------------------------------------
--- | Binders, Expressions, Environments
--------------------------------------------------------------------
-
-type Bndr = String 
-
-data Expr = Const Int
-          | Var   Bndr
-          | Plus  Expr Expr
-          | Let   Bndr Expr Expr
-
-type Env a = [(Bndr, a)]
-
--------------------------------------------------------------------
--- | Values
--------------------------------------------------------------------
-
-{-@ type Val = {v:Expr | val v} @-}
-
-{-@ measure val       :: Expr -> Prop
-    val (Const i)     = true
-    val (Var x)       = false
-    val (Plus e1 e2)  = false
-    val (Let x e1 e2) = false
-  @-}
-
--------------------------------------------------------------------
-{-@ lookup :: x:Bndr -> {v:Env Val | Set_mem x (vars v)} -> Val @-}
--------------------------------------------------------------------
-lookup x ((y,v):env)   
-  | x == y             = v
-  | otherwise          = lookup x env
-lookup x []            = liquidError "Unbound Variable"
-
--------------------------------------------------------------------
-{-@ eval :: g:Env Val -> ClosedExpr g -> Val @-}
--------------------------------------------------------------------
-eval env i@(Const _)   = i
-eval env (Var x)       = lookup x env 
-eval env (Plus e1 e2)  = plus (eval env e1) (eval env e2) 
-eval env (Let x e1 e2) = eval env' e2 
-  where 
-    env'               = (x, eval env e1) : env
-
-plus (Const i) (Const j) = Const (i+j)
-plus _         _         = liquidError "Bad call to plus"
-
-
-{-@ type ClosedExpr G  = {v:Expr | Set_sub (free v) (vars G)} @-}
-
-{-@ measure vars :: Env a -> (Set Bndr)
-    vars ([])    = (Set_empty 0)
-    vars (b:env) = (Set_cup (Set_sng (fst b)) (vars env))
-  @-}
-
-{-@ measure free       :: Expr -> (Set Bndr) 
-    free (Const i)     = (Set_empty 0)
-    free (Var x)       = (Set_sng x) 
-    free (Plus e1 e2)  = (Set_cup (free e1) (free e2))
-    free (Let x e1 e2) = (Set_cup (free e1) (Set_dif (free e2) (Set_sng x)))
-  @-}
diff --git a/docs/slides/BOS14/hs/long/AlphaConvert.hs b/docs/slides/BOS14/hs/long/AlphaConvert.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/long/AlphaConvert.hs
+++ /dev/null
@@ -1,145 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--fullcheck"      @-}
-{-@ LIQUID "--maxparams=3"    @-}
-
--- | An example from "A Relational Framework for Higher-Order Shape Analysis",
---   by Gowtham Kaki Suresh Jagannathan, ICFP 2014.
-
-module AlphaConvert (subst, alpha) where
-
-import Prelude hiding ((++), elem)
-import Data.Set (Set (..))
-import Language.Haskell.Liquid.Prelude   
-
-alpha  :: [Bndr] -> Expr -> Expr 
-subst  :: Expr -> Bndr -> Expr -> Expr
-maxs   :: [Int] -> Int 
-lemma1 :: Int -> [Int] -> Bool
-fresh  :: [Bndr] -> Bndr
-free   :: Expr -> [Bndr]
-
----------------------------------------------------------------------
--- | Datatype Definition --------------------------------------------
----------------------------------------------------------------------
-
-type Bndr 
-  = Int
-
-data Expr 
-  = Var Bndr  
-  | Abs Bndr Expr
-  | App Expr Expr
-
-{-@ measure fv       :: Expr -> (Set Bndr)
-    fv (Var x)       = (Set_sng x)
-    fv (Abs x e)     = (Set_dif (fv e) (Set_sng x))
-    fv (App e a)     = (Set_cup (fv e) (fv a)) 
-  @-}
-
-{-@ measure isAbs    :: Expr -> Prop
-    isAbs (Var v)    = false
-    isAbs (Abs v e)  = true
-    isAbs (App e a)  = false             
-  @-}
-
-{-@ predicate AddV E E2 X E1   = fv E = Set_cup (Set_dif (fv E2) (Set_sng X)) (fv E1) @-}
-{-@ predicate EqV E1 E2        = fv E1 = fv E2                                        @-}
-{-@ predicate Occ X E          = Set_mem X (fv E)                                     @-}
-{-@ predicate Subst E E1 X E2  = if (Occ X E2) then (AddV E E2 X E1) else (EqV E E2)  @-}
-
-----------------------------------------------------------------------------
--- | Part 5: Capture Avoiding Substitution ---------------------------------
-----------------------------------------------------------------------------
-{-@ subst :: e1:Expr -> x:Bndr -> e2:Expr -> {e:Expr | Subst e e1 x e2} @-} 
-----------------------------------------------------------------------------
-
-subst e1 x e2@(Var y)
-  | x == y                = e1
-  | otherwise             = e2
-
-subst e1 x (App ea eb)    = App ea' eb'
-  where
-    ea'                   = subst e1 x ea
-    eb'                   = subst e1 x eb
-
-subst e1 x e2@(Abs y e)  
-  | x == y                = e2
-  | y `elem` xs           = subst e1 x (alpha xs e2) 
-  | otherwise             = Abs y      (subst e1 x e)
-     where
-      xs                  = free e1 
-
-----------------------------------------------------------------------------
--- | Part 4: Alpha Conversion ----------------------------------------------
-----------------------------------------------------------------------------
-{-@ alpha :: ys:[Bndr] -> e:{Expr | isAbs e} -> {v:Expr | EqV v e} @-}
-----------------------------------------------------------------------------
-alpha ys (Abs x e) = Abs x' (subst (Var x') x e)
-  where 
-    xs             = free e
-    x'             = fresh (x : ys ++ xs)
-
-alpha _  _         = liquidError "never"
-
-
-----------------------------------------------------------------------------
--- | Part 3: Fresh Variables -----------------------------------------------
-----------------------------------------------------------------------------
-{-@ fresh :: xs:[Bndr] -> {v:Bndr | NotElem v xs} @-}
-----------------------------------------------------------------------------
-fresh bs = liquidAssert (lemma1 n bs) n
-  where 
-    n    = 1 + maxs bs
-
-{-@ maxs :: xs:_ -> {v:_ | v = maxs xs} @-}
-maxs ([])   = 0
-maxs (x:xs) = if (x > maxs xs) then x else (maxs xs) 
- 
- 
-{-@ measure maxs :: [Int] -> Int 
-    maxs ([])   = 0
-    maxs (x:xs) = if (x > maxs xs) then x else (maxs xs) 
-  @-}
-
-{-@ lemma1 :: x:Int -> xs:{[Int] | x > maxs xs} -> {v:Bool | Prop v && NotElem x xs} @-}
-lemma1 _ []     = True 
-lemma1 x (_:ys) = lemma1 x ys 
-
-
-----------------------------------------------------------------------------
--- | Part 2: Free Variables ------------------------------------------------
-----------------------------------------------------------------------------
-
-----------------------------------------------------------------------------
-{-@ free         :: e:Expr -> {v:[Bndr] | elts v = fv e} @-}
-----------------------------------------------------------------------------
-free (Var x)     = [x]
-free (App e e')  = free e ++ free e'
-free (Abs x e)   = free e \\ x
-
-
-----------------------------------------------------------------------------
--- | Part I: Sets with Lists -----------------------------------------------
-----------------------------------------------------------------------------
-
-{-@ predicate IsCup X Y Z  = elts X = Set_cup (elts Y) (elts Z)    @-}
-{-@ predicate IsDel X Y Z  = elts X = Set_dif (elts Y) (Set_sng Z) @-}
-{-@ predicate Elem  X Ys   = Set_mem X (elts Ys)                   @-}
-{-@ predicate NotElem X Ys = not (Elem X Ys)                       @-}
-
-{-@ (++)      :: xs:[a] -> ys:[a] -> {v:[a] | IsCup v xs ys}  @-}
-[]     ++ ys  = ys
-(x:xs) ++ ys  = x : (xs ++ ys)
-
-{-@ (\\)      :: (Eq a) => xs:[a] -> y:a -> {v:[a] | IsDel v xs y} @-}
-xs   \\ y     = [x | x <- xs, x /= y]
-
-{-@ elem      :: (Eq a) => x:a -> ys:[a] -> {v:Bool | Prop v <=> Elem x ys} @-}
-elem x []     = False
-elem x (y:ys) = x == y || elem x ys
- 
-{-@ measure elts :: [a] -> (Set a) 
-    elts ([])    = {v | Set_emp v}
-    elts (x:xs)  = {v | v = Set_cup (Set_sng x) (elts xs) }
-  @-}
diff --git a/docs/slides/BOS14/hs/long/GhcListSort.hs b/docs/slides/BOS14/hs/long/GhcListSort.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/long/GhcListSort.hs
+++ /dev/null
@@ -1,128 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-
-module GhcSort () where
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ type OList a =  [a]<{\fld v -> (v >= fld)}>  @-}
-
----------------------------------------------------------------------------
----------------------------  Official GHC Sort ----------------------------
----------------------------------------------------------------------------
-
-{-@ assert sort1 :: (Ord a) => [a] -> OList a  @-}
-sort1 :: (Ord a) => [a] -> [a]
-sort1 = mergeAll . sequences
-  where
-    sequences (a:b:xs)
-      | a `compare` b == GT = descending b [a]  xs
-      | otherwise           = ascending  b (a:) xs
-    sequences [x] = [[x]]
-    sequences []  = [[]]
-
-    descending a as (b:bs)
-      | a `compare` b == GT = descending b (a:as) bs
-    descending a as bs      = (a:as): sequences bs
-
-    ascending a as (b:bs)
-      | a `compare` b /= GT = ascending b (\ys -> as (a:ys)) bs
-    ascending a as bs       = as [a]: sequences bs
-
-    mergeAll [x] = x
-    mergeAll xs  = mergeAll (mergePairs xs)
-
-    mergePairs (a:b:xs) = merge1 a b: mergePairs xs
-    mergePairs [x]      = [x]
-    mergePairs []       = []
-
--- merge1 needs to be toplevel,
--- to get applied transformRec tx
-merge1 (a:as') (b:bs')
-  | a `compare` b == GT = b:merge1 (a:as')  bs'
-  | otherwise           = a:merge1 as' (b:bs')
-merge1 [] bs            = bs
-merge1 as []            = as
-
----------------------------------------------------------------------------
-------------------- Mergesort ---------------------------------------------
----------------------------------------------------------------------------
-
-{-@ assert sort2 :: (Ord a) => [a] -> OList a  @-}
-sort2 :: (Ord a) => [a] -> [a]
-sort2 = mergesort
-
-mergesort :: (Ord a) => [a] -> [a]
-mergesort = mergesort' . map wrap
-
-mergesort' :: (Ord a) => [[a]] -> [a]
-mergesort' [] = []
-mergesort' [xs] = xs
-mergesort' xss = mergesort' (merge_pairs xss)
-
-merge_pairs :: (Ord a) => [[a]] -> [[a]]
-merge_pairs [] = []
-merge_pairs [xs] = [xs]
-merge_pairs (xs:ys:xss) = merge xs ys : merge_pairs xss
-
-merge :: (Ord a) => [a] -> [a] -> [a]
-merge [] ys = ys
-merge xs [] = xs
-merge (x:xs) (y:ys)
- = case x `compare` y of
-        GT -> y : merge (x:xs)   ys
-        _  -> x : merge    xs (y:ys)
-
-wrap :: a -> [a]
-wrap x = [x]
-
-----------------------------------------------------------------------
--------------------- QuickSort ---------------------------------------
-----------------------------------------------------------------------
-
-{-@ assert sort3 :: (Ord a) => w:a -> [{v:a|v<=w}] -> OList a @-}
-sort3 :: (Ord a) => a -> [a] -> [a]
-sort3 w ls = qsort w ls []
-
--- qsort is stable and does not concatenate.
-qsort :: (Ord a) =>  a -> [a] -> [a] -> [a]
-qsort _ []     r = r
-qsort _ [x]    r = x:r
-qsort w (x:xs) r = qpart w x xs [] [] r
-
--- qpart partitions and sorts the sublists
-qpart :: (Ord a) => a -> a -> [a] -> [a] -> [a] -> [a] -> [a]
-qpart w x [] rlt rge r =
-    -- rlt and rge are in reverse order and must be sorted with an
-    -- anti-stable sorting
-    rqsort x rlt (x:rqsort w rge r)
-qpart w x (y:ys) rlt rge r =
-    case compare x y of
-        GT -> qpart w x ys (y:rlt) rge r
-        _  -> qpart w x ys rlt (y:rge) r
-
--- rqsort is as qsort but anti-stable, i.e. reverses equal elements
-rqsort :: (Ord a) => a -> [a] -> [a] -> [a]
-rqsort _ []     r = r
-rqsort _ [x]    r = x:r
-rqsort w (x:xs) r = rqpart w x xs [] [] r
-
-rqpart :: (Ord a) => a -> a -> [a] -> [a] -> [a] -> [a] -> [a]
-rqpart w x [] rle rgt r =
-    qsort x rle (x:qsort w rgt r)
-rqpart w x (y:ys) rle rgt r =
-    case compare y x of
-        GT -> rqpart w x ys rle (y:rgt) r
-        _  -> rqpart w x ys (y:rle) rgt r
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/slides/BOS14/hs/long/KMP.hs b/docs/slides/BOS14/hs/long/KMP.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/long/KMP.hs
+++ /dev/null
@@ -1,90 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-
-module KMP (search) where
-
-import Language.Haskell.Liquid.Prelude (liquidError)
-import qualified Data.Map as M
-
-search pat str = kmpSearch (ofList pat) (ofList str) 
-
--------------------------------------------------------------
--- | Do the Search ------------------------------------------
--------------------------------------------------------------
-
-{-@ type Upto N = {v:Nat | v < N} @-} 
-
-{-@ kmpSearch :: (Eq a) => p:Arr a -> s:Arr a -> Maybe (Upto (alen s)) @-}
-kmpSearch p@(A m _) s@(A n _) = go 0 0 
-  where
-    t              = kmpTable p
-    go i j
-      | i >= n     = Nothing 
-      | j >= m     = Just (i - m)
-      | s!i == p!j = go (i+1) (j+1)
-      | j == 0     = go (i+1) j
-      | otherwise  = go i     (t!j) 
-
-
--------------------------------------------------------------
--- | Make Table ---------------------------------------------
--------------------------------------------------------------
-
-kmpTable p@(A m _) = go t 1 0 
-  where
-    t              = new m (\_ -> 0)
-    go t i j
-      | i >= m - 1 = t
-
-      | p!i == p!j = let i' = i + 1
-                         j' = j + 1
-                         t' = set t i' j'
-                     in go t' i' j'           
-    
-      | (j == 0)   = let i' = i + 1
-                         t' = set t i' 0
-                     in go t' i' j
-                             
-      | otherwise  = let j' = t ! j
-                     in go t i j' 
-
-
--------------------------------------------------------------
--- | A Pure Array -------------------------------------------
--------------------------------------------------------------
-
-data Arr a   = A { alen :: Int
-                 , aval :: Int -> a
-                 }
-
-{-@ data Arr a <p :: Int -> a -> Prop>
-             = A { alen :: Nat 
-                 , aval :: i:Upto alen -> a<p i>
-                 }
-  @-}
-
-
-{-@ new :: forall <p :: Int -> a -> Prop>.
-             n:Nat -> (i:Upto n -> a<p i>) -> {v: Arr<p> a | alen v = n}
-  @-}
-new n v = A n v
-
-{-@ (!) :: forall <p :: Int -> a -> Prop>.
-             a:Arr<p> a -> i:Upto (alen a) -> a<p i>
-  @-}
-(A _ f) ! i = f i
-  
-{-@ set :: forall <p :: Int -> a -> Prop>.
-             a:Arr<p> a -> i:Upto (alen a) -> a<p i> -> {v:Arr<p> a | alen v = alen a}
-  @-}
-set a@(A _ f) i v = a { aval = \j -> if (i == j) then v else f j }
-
-{-@ ofList :: xs:[a] -> {v:Arr a | alen v = len xs} @-} 
-ofList xs = new n f
-  where
-    n     = length xs
-    m     = M.fromList $ zip [0..] xs
-    f i   = (M.!) m i 
-
-{-@ map :: (a -> b) -> a:Arr a -> {v:Arr b | alen v = alen a} @-}
-map f a@(A n z) = A n (f . z) 
diff --git a/docs/slides/BOS14/hs/long/RBTree-ord.hs b/docs/slides/BOS14/hs/long/RBTree-ord.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/long/RBTree-ord.hs
+++ /dev/null
@@ -1,143 +0,0 @@
-
-{-@ LIQUID "--no-termination"   @-}
-
-module Foo (add, remove, deleteMin, deleteMin') where
-
-import Language.Haskell.Liquid.Prelude
-
-data RBTree a = Leaf 
-              | Node Color a !(RBTree a) !(RBTree a)
-              deriving (Show)
-
-data Color = B -- ^ Black
-           | R -- ^ Red
-           deriving (Eq,Show)
-
----------------------------------------------------------------------------
--- | Add an element -------------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ add :: (Ord a) => a -> ORBT a -> ORBT a @-}
-add x s = makeBlack (ins x s)
-
-{-@ ins :: (Ord a) => a -> ORBT a -> ORBT a @-}
-ins kx Leaf             = Node R kx Leaf Leaf
-ins kx s@(Node B x l r) = case compare kx x of
-                            LT -> let t = lbal x (ins kx l) r in t 
-                            GT -> let t = rbal x l (ins kx r) in t 
-                            EQ -> s
-ins kx s@(Node R x l r) = case compare kx x of
-                            LT -> Node R x (ins kx l) r
-                            GT -> Node R x l (ins kx r)
-                            EQ -> s
-
----------------------------------------------------------------------------
--- | Delete an element ----------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ remove :: (Ord a) => a -> ORBT a -> ORBT a @-}
-remove x t = makeBlack (del x t)
-
-{-@ del              :: (Ord a) => a -> ORBT a -> ORBT a @-}
-del x Leaf           = Leaf
-del x (Node _ y a b) = case compare x y of
-   EQ -> append y a b 
-   LT -> case a of
-           Leaf         -> Node R y Leaf b
-           Node B _ _ _ -> lbalS y (del x a) b
-           _            -> let t = Node R y (del x a) b in t 
-   GT -> case b of
-           Leaf         -> Node R y a Leaf 
-           Node B _ _ _ -> rbalS y a (del x b)
-           _            -> Node R y a (del x b)
-
-{-@ append  :: y:a -> ORBT {v:a | v < y} -> ORBT {v:a | y < v} -> ORBT a @-}
-append :: a -> RBTree a -> RBTree a -> RBTree a
-
-append _ Leaf r                               
-  = r
-
-append _ l Leaf                               
-  = l
-
-append piv (Node R lx ll lr) (Node R rx rl rr)  
-  = case append piv lr rl of 
-      Node R x lr' rl' -> Node R x (Node R lx ll lr') (Node R rx rl' rr)
-      lrl              -> Node R lx ll (Node R rx lrl rr)
-
-append piv (Node B lx ll lr) (Node B rx rl rr)  
-  = case append piv lr rl of 
-      Node R x lr' rl' -> Node R x (Node B lx ll lr') (Node B rx rl' rr)
-      lrl              -> lbalS lx ll (Node B rx lrl rr)
-
-append piv l@(Node B _ _ _) (Node R rx rl rr)   
-  = Node R rx (append piv l rl) rr
-
-append piv l@(Node R lx ll lr) r@(Node B _ _ _) 
-  = Node R lx ll (append piv lr r)
-
----------------------------------------------------------------------------
--- | Delete Minimum Element -----------------------------------------------
----------------------------------------------------------------------------
-
-{-@ deleteMin  :: ORBT a -> ORBT a @-}
-deleteMin (Leaf)         = Leaf
-deleteMin (Node _ x l r) = makeBlack t
-  where 
-    (_, t)               = deleteMin' x l r
-
-
-{-@ deleteMin' :: k:a -> ORBT {v:a | v < k} -> ORBT {v:a | k < v} -> (a, ORBT a) @-}
-deleteMin' k Leaf r              = (k, r)
-deleteMin' x (Node R lx ll lr) r = (k, Node R x l' r)   where (k, l') = deleteMin' lx ll lr 
-deleteMin' x (Node B lx ll lr) r = (k, lbalS x l' r )   where (k, l') = deleteMin' lx ll lr 
-
----------------------------------------------------------------------------
--- | Rotations ------------------------------------------------------------
----------------------------------------------------------------------------
-
-lbalS k (Node R x a b) r              = Node R k (Node B x a b) r
-lbalS k l (Node B y a b)              = let t = rbal k l (Node R y a b) in t 
-lbalS k l (Node R z (Node B y a b) c) = Node R y (Node B k l a) (rbal z b (makeRed c))
-lbalS k l r                           = error "nein" 
-
-rbalS k l (Node R y b c)              = Node R k l (Node B y b c)
-rbalS k (Node B x a b) r              = let t = lbal k (Node R x a b) r in t 
-rbalS k (Node R x a (Node B y b c)) r = Node R y (lbal x (makeRed a) b) (Node B k c r)
-rbalS k l r                           = error "nein"
-
-lbal k (Node R y (Node R x a b) c) r  = Node R y (Node B x a b) (Node B k c r)
-lbal k (Node R x a (Node R y b c)) r  = Node R y (Node B x a b) (Node B k c r)
-lbal k l r                            = Node B k l r
-
-rbal x a (Node R y b (Node R z c d))  = Node R y (Node B x a b) (Node B z c d)
-rbal x a (Node R z (Node R y b c) d)  = Node R y (Node B x a b) (Node B z c d)
-rbal x l r                            = Node B x l r
-
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-
-makeRed (Node _ x l r) = Node R x l r
-makeRed Leaf           = error "nein" 
-
-makeBlack Leaf           = Leaf
-makeBlack (Node _ x l r) = Node B x l r
-
----------------------------------------------------------------------------
--- | Specifications -------------------------------------------------------
----------------------------------------------------------------------------
-
--- | Ordered Red-Black Trees
-
-{-@ type ORBT a = RBTree <{\root v -> v < root }, {\root v -> v > root}> a @-}
-
--- | Binary Search Ordering
-
-{-@ data RBTree a <l :: a -> a -> Prop, r :: a -> a -> Prop>
-            = Leaf
-            | Node (c    :: Color)
-                   (key  :: a)
-                   (left :: RBTree <l, r> (a <l key>))
-                   (left :: RBTree <l, r> (a <r key>))
-  @-}
diff --git a/docs/slides/BOS14/hs/long/RBTree.hs b/docs/slides/BOS14/hs/long/RBTree.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/long/RBTree.hs
+++ /dev/null
@@ -1,209 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--diff"           @-}
-
-module Foo where
-
-import Language.Haskell.Liquid.Prelude
-
-data RBTree a = Leaf 
-              | Node Color a !(RBTree a) !(RBTree a)
-              deriving (Show)
-
-data Color = B -- ^ Black
-           | R -- ^ Red
-           deriving (Eq,Show)
-
----------------------------------------------------------------------------
--- | Add an element -------------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ add :: (Ord a) => a -> RBT a -> RBT a @-}
-add x s = makeBlack (ins x s)
-
-{-@ ins :: (Ord a) => a -> t:RBT a -> {v: ARBTN a {bh t} | IsB t => isRB v} @-}
-ins kx Leaf             = Node R kx Leaf Leaf
-ins kx s@(Node B x l r) = case compare kx x of
-                            LT -> let t = lbal x (ins kx l) r in t 
-                            GT -> let t = rbal x l (ins kx r) in t 
-                            EQ -> s
-ins kx s@(Node R x l r) = case compare kx x of
-                            LT -> Node R x (ins kx l) r
-                            GT -> Node R x l (ins kx r)
-                            EQ -> s
-
----------------------------------------------------------------------------
--- | Delete an element ----------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ remove :: (Ord a) => a -> RBT a -> RBT a @-}
-remove x t = makeBlack (del x t)
-
-{-@ predicate HDel T V = bh V = if (isB T) then (bh T) - 1 else bh T @-}
-
-{-@ del              :: (Ord a) => a -> t:RBT a -> {v:ARBT a | HDel t v && (isB t || isRB v)} @-}
-del x Leaf           = Leaf
-del x (Node _ y a b) = case compare x y of
-   EQ -> append y a b 
-   LT -> case a of
-           Leaf         -> Node R y Leaf b
-           Node B _ _ _ -> lbalS y (del x a) b
-           _            -> let t = Node R y (del x a) b in t 
-   GT -> case b of
-           Leaf         -> Node R y a Leaf 
-           Node B _ _ _ -> rbalS y a (del x b)
-           _            -> Node R y a (del x b)
-
-{-@ append :: y:a -> l:RBT {v:a | v < y} -> r:RBTN {v:a | y < v} {bh l} -> ARBT2 a l r @-}
-append :: a -> RBTree a -> RBTree a -> RBTree a
-append _ Leaf r                               = r
-append _ l Leaf                               = l
-append piv (Node R lx ll lr) (Node R rx rl rr)  = case append piv lr rl of 
-                                                    Node R x lr' rl' -> Node R x (Node R lx ll lr') (Node R rx rl' rr)
-                                                    lrl              -> Node R lx ll (Node R rx lrl rr)
-append piv (Node B lx ll lr) (Node B rx rl rr)  = case append piv lr rl of 
-                                                    Node R x lr' rl' -> Node R x (Node B lx ll lr') (Node B rx rl' rr)
-                                                    lrl              -> lbalS lx ll (Node B rx lrl rr)
-append piv l@(Node B _ _ _) (Node R rx rl rr)   = Node R rx (append piv l rl) rr
-append piv l@(Node R lx ll lr) r@(Node B _ _ _) = Node R lx ll (append piv lr r)
-
----------------------------------------------------------------------------
--- | Delete Minimum Element -----------------------------------------------
----------------------------------------------------------------------------
-
-{-@ deleteMin            :: RBT a -> RBT a @-}
-deleteMin (Leaf)         = Leaf
-deleteMin (Node _ x l r) = makeBlack t
-  where 
-    (_, t)               = deleteMin' x l r
-
-
-{-@ deleteMin'                   :: k:a -> l:RBT {v:a | v < k} -> r:RBTN {v:a | k < v} {bh l} -> (a, ARBT2 a l r) @-}
-deleteMin' k Leaf r              = (k, r)
-deleteMin' x (Node R lx ll lr) r = (k, Node R x l' r)   where (k, l') = deleteMin' lx ll lr 
-deleteMin' x (Node B lx ll lr) r = (k, lbalS x l' r )   where (k, l') = deleteMin' lx ll lr 
-
----------------------------------------------------------------------------
--- | Rotations ------------------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ lbalS                             :: k:a -> l:ARBT {v:a | v < k} -> r:RBTN {v:a | k < v} {1 + bh l} -> {v: ARBTN a {1 + bh l} | IsB r => isRB v} @-}
-lbalS k (Node R x a b) r              = Node R k (Node B x a b) r
-lbalS k l (Node B y a b)              = let t = rbal k l (Node R y a b) in t 
-lbalS k l (Node R z (Node B y a b) c) = Node R y (Node B k l a) (rbal z b (makeRed c))
-lbalS k l r                           = liquidError "nein"
-
-{-@ rbalS                             :: k:a -> l:RBT {v:a | v < k} -> r:ARBTN {v:a | k < v} {bh l - 1} -> {v: ARBTN a {bh l} | IsB l => isRB v} @-}
-rbalS k l (Node R y b c)              = Node R k l (Node B y b c)
-rbalS k (Node B x a b) r              = let t = lbal k (Node R x a b) r  in t 
-rbalS k (Node R x a (Node B y b c)) r = Node R y (lbal x (makeRed a) b) (Node B k c r)
-rbalS k l r                           = liquidError "nein"
-
-{-@ lbal                              :: k:a -> l:ARBT {v:a | v < k} -> RBTN {v:a | k < v} {bh l} -> RBTN a {1 + bh l} @-}
-lbal k (Node R y (Node R x a b) c) r  = Node R y (Node B x a b) (Node B k c r)
-lbal k (Node R x a (Node R y b c)) r  = Node R y (Node B x a b) (Node B k c r)
-lbal k l r                            = Node B k l r
-
-{-@ rbal                              :: k:a -> l:RBT {v:a | v < k} -> ARBTN {v:a | k < v} {bh l} -> RBTN a {1 + bh l} @-}
-rbal x a (Node R y b (Node R z c d))  = Node R y (Node B x a b) (Node B z c d)
-rbal x a (Node R z (Node R y b c) d)  = Node R y (Node B x a b) (Node B z c d)
-rbal x l r                            = Node B x l r
-
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ type BlackRBT a = {v: RBT a | IsB v && bh v > 0} @-}
-
-{-@ makeRed :: l:BlackRBT a -> ARBTN a {bh l - 1} @-}
-makeRed (Node B x l r) = Node R x l r
-makeRed _              = liquidError "nein"
-
-{-@ makeBlack :: ARBT a -> RBT a @-}
-makeBlack Leaf           = Leaf
-makeBlack (Node _ x l r) = Node B x l r
-
----------------------------------------------------------------------------
--- | Specifications -------------------------------------------------------
----------------------------------------------------------------------------
-
--- | Red-Black Trees
-
-{-@ type RBT a    = {v: ORBT a | isRB v && isBH v } @-}
-{-@ type RBTN a N = {v: RBT a  | bh v = N }         @-}
-
--- | Invariant 1: Binary Search Ordering 
-
-{-@ data RBTree a <l :: a -> a -> Prop, r :: a -> a -> Prop>
-            = Leaf
-            | Node (c    :: Color)
-                   (key  :: a)
-                   (left :: RBTree <l, r> (a <l key>))
-                   (left :: RBTree <l, r> (a <r key>))
-  @-}
-
-{-@ type ORBT a = RBTree <{\root v -> v < root }, {\root v -> v > root}> a @-}
-
--- | Invariant 2: Black Height Same on All Paths 
-
-{-@ measure isBH        :: RBTree a -> Prop
-    isBH (Leaf)         = true
-    isBH (Node c x l r) = (isBH l && isBH r && bh l = bh r)
-  @-}
-
-{-@ measure bh        :: RBTree a -> Int
-    bh (Leaf)         = 0
-    bh (Node c x l r) = bh l + if (c == R) then 0 else 1 
-  @-}
-
--- | Invariant 3: Red Nodes have Black Children
-
-{-@ measure isRB        :: RBTree a -> Prop
-    isRB (Leaf)         = true
-    isRB (Node c x l r) = isRB l && isRB r && (c == R => (IsB l && IsB r))
-  @-}
-
-{-@ measure col         :: RBTree a -> Color
-    col (Node c x l r)  = c
-    col (Leaf)          = B
-  @-}
-
-{-@ measure isB        :: RBTree a -> Prop
-    isB (Leaf)         = false
-    isB (Node c x l r) = c == B 
-  @-}
-
-{-@ predicate IsB T = not (col T == R) @-}
-
---------------------------------------------------------------------------
--- | Auxiliary Specifications --------------------------------------------
---------------------------------------------------------------------------
-
--- | Almost Red-Black Trees
-
-{-@ measure isARB        :: (RBTree a) -> Prop
-    isARB (Leaf)         = true 
-    isARB (Node c x l r) = (isRB l && isRB r)
-  @-}
-
-
--- | Conditionally Red-Black Tree
-
-{-@ type ARBT2 a L R = {v:ARBTN a {bh L} | (IsB L && IsB R) => isRB v} @-}
-{-@ type ARBT a      = {v: ORBT a | isARB v && isBH v} @-}
-{-@ type ARBTN a N   = {v: ARBT a | bh v = N }         @-}
-
-
--------------------------------------------------------------------------------
--- Auxiliary Invariants -------------------------------------------------------
--------------------------------------------------------------------------------
-
-{-@ predicate Invs V = Inv1 V && Inv2 V && Inv3 V   @-}
-{-@ predicate Inv1 V = (isARB V && IsB V) => isRB V @-}
-{-@ predicate Inv2 V = isRB v => isARB v            @-}
-{-@ predicate Inv3 V = 0 <= bh v                    @-}
-{-@ invariant {v: Color | v = R || v = B}           @-}
-{-@ invariant {v: RBTree a | Invs v}                @-}
-
-{-@ inv :: RBTree a -> {v:RBTree a | Invs v}        @-}
-inv Leaf           = Leaf
-inv (Node c x l r) = Node c x (inv l) (inv r)
diff --git a/docs/slides/BOS14/hs/long/SoCalledHeartBleed.hs b/docs/slides/BOS14/hs/long/SoCalledHeartBleed.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/long/SoCalledHeartBleed.hs
+++ /dev/null
@@ -1,24 +0,0 @@
-module HeartBleed where
-
-import Data.ByteString.Char8  (pack, unpack) 
-import Data.ByteString.Unsafe (unsafeTake)
-
-heartBleed s n = s'
-  where 
-    b          = pack s         
-    b'         = unsafeTake n b
-    s'         = unpack b'
-
--- > let ex = "Ranjit Loves Burritos"
-    
--- > heartBleed ex 1
---   "R"
-    
--- > heartBleed ex 6
--- > "Ranjit"
-
--- > heartBleed ex 10
--- > "Ranjit Lov"
-    
--- > heartBleed ex 30
--- > "Ranjit Loves Burritos\NUL\NUL\NUL\201\&1j\DC3\SOH\NUL"
diff --git a/docs/slides/BOS14/hs/start/000_Refinements.hs b/docs/slides/BOS14/hs/start/000_Refinements.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/000_Refinements.hs
+++ /dev/null
@@ -1,109 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module Refinements where
-
-import Prelude hiding (abs)
-
-divide    :: Int -> Int -> Int
-
-
------------------------------------------------------------------------
--- | 1. Simple Refinement Types
------------------------------------------------------------------------
-
-{-@ type Nat     = {v:Int | v >= 0} @-}
-{-@ type Pos     = {v:Int | v >  0} @-}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-
-
-{-@ six :: NonZero @-}
-six = 10 :: Int
-
-
-
------------------------------------------------------------------------
--- | 2. Function Contracts: Preconditions & Dead Code 
------------------------------------------------------------------------
-
-{-@ die :: {v:_ | false} -> a @-}
-die msg = error msg
-
--- Precondition says, there are **NO** valid inputs for @die@.
--- If program type-checks, means @die@ is **NEVER** called at run-time.
-
-
-
-
-
------------------------------------------------------------------------
--- | 3. Function Contracts: Safe Division 
------------------------------------------------------------------------
-
-divide x 0 = undefined -- die "divide-by-zero"
-divide x n = x `div` n
-
-
-
--- | What's the problem above? Nothing to *prevent*
---   us from calling `divide` with 0. Oops.
---   How shall we fix it?
-
-
-
-
-
-
-
-avg2 x y   = divide (x + y)     2
-avg3 x y z = divide (x + y + z) 3
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | But whats the problem here?
------------------------------------------------------------------------
-
-avg xs     = divide total n 
-  where
-    total  = sum xs
-    n      = length xs
-
-
-
--- | Try to fix the above using `abs`olute values?
-
-abs :: Int -> Int
-abs x | x > 0     = x
-      | otherwise = 0 - x
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------
--- | CHEAT AREA ----------------------------------------------
---------------------------------------------------------------
-
--- # START Errors 0
--- # END   Errors 1 (avg)
-
-{- abs    :: x:Int -> {v:Nat | x <= v} @-}
-{- divide :: Int -> NonZero -> Int     @-}
diff --git a/docs/slides/BOS14/hs/start/001_Refinements.hs b/docs/slides/BOS14/hs/start/001_Refinements.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/001_Refinements.hs
+++ /dev/null
@@ -1,107 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module Refinements where
-
-import Prelude hiding (map, foldr, foldr1)
-
-divide    :: Int -> Int -> Int
-wtAverage :: List (Int, Int) -> Int
-
------------------------------------------------------------------------
--- | Our first Data Type
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
------------------------------------------------------------------------
--- | A few Higher-Order Functions
------------------------------------------------------------------------
-
-map                  :: (a -> b) -> List a -> List b
-map f N              = N
-map f (C x xs)       = C (f x) (map f xs) 
-
-
-foldr                :: (a -> b -> b) -> b -> List a -> b 
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
-
-
--- Uh oh. How shall we fix the error? Lets move on for now...
-
-foldr1           :: (a -> a -> a) -> List a -> a   
-foldr1 f (C x xs)    = foldr f x xs
-foldr1 f N           = die "foldr1"
-
-
------------------------------------------------------------------------
--- | 6. Weighted-Averages 
------------------------------------------------------------------------
-
--- Yikes, a divide-by-zero. How shall we fix it?
-
-wtAverage wxs = total `divide` weights
-  where
-    total     = sum $ map (\(w, x) -> w * x) wxs
-    weights   = sum $ map (\(w, _) -> w    ) wxs
-    sum       = foldr1 (+)
-
-
--- | Exercise: How would you modify the types to get output `Pos` above? 
-
-
- 
------------------------------------------------------------------------
--- | Measuring the Size of Data
------------------------------------------------------------------------
-
-{-@ measure size @-}
-size          :: List a -> Int
-size (C x xs) = 1 + size xs 
-size N        = 0
-
-
-append N        ys = ys
-append (C x xs) ys = C x (append xs ys)
-
-
------------------------------------------------------------------------
--- | But there are limitations: why does this not work? ...
------------------------------------------------------------------------
-
-{-@ append' :: xs:_ -> ys:_ -> {v: _ | size v = size xs + size ys} @-}
-append' xs ys =  foldr C ys  xs
-
-
-
-
------------------------------------------------------------------------
--- | Definitions from 000_Refinements.hs
------------------------------------------------------------------------
-
-{-@ type Nat     = {v:Int | v >= 0} @-}
-{-@ type Pos     = {v:Int | v >  0} @-}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-
-{-@ die :: {v:_ | false} -> a @-}
-die msg = error msg
-
-{-@ divide :: Int -> NonZero -> Int @-}
-divide x 0 = die "divide-by-zero"
-divide x n = x `div` n
-
------------------------------------------------------------------------
--- | CHEAT AREA 
------------------------------------------------------------------------
-
--- # START-ERRORS 3 (foldr1, wtAverage, append')
--- # END-ERRORS   1 (append')
-
-{- map    :: _ -> xs:_ -> {v:_ | size v = size xs}               @-}
-{- append :: xs:_ -> ys:_ -> {v: _ | size v = size ys + size xs} @-}
-{- foldr1 :: (a -> a -> a) -> {v:List a | size v > 0} -> a       @-}   
-{- wtAverage :: {v : List (Pos, Pos) | size v > 0} -> Int        @-}
diff --git a/docs/slides/BOS14/hs/start/01_Elements.hs b/docs/slides/BOS14/hs/start/01_Elements.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/01_Elements.hs
+++ /dev/null
@@ -1,108 +0,0 @@
-module Elems where
-
-import Prelude hiding (elem)
-
-import Data.Set (Set (..))
-
-
------------------------------------------------------------------------------
--- | 1. Reasoning about the Set of Elements in a List ----------------------- 
------------------------------------------------------------------------------
-
--- | The set of `elems` of a list
-
-
-
-
-
-{-@ measure elems :: [a] -> (Set a)
-    elems ([])    = (Set_empty 0)
-    elems (x:xs)  = (Set_cup (Set_sng x) (elems xs))
-  @-}
-
-
-
-
--- | A few handy aliases
-
-{-@ predicate EqElts Xs Ys    = elems Xs = elems Ys                      @-}
-{-@ predicate UnElts Xs Ys Zs = elems Xs = Set_cup (elems Ys) (elems Zs) @-}
-
--- | Reasoning about `append` and `reverse`
-
-{-@ append  :: xs:_ -> ys:_ -> {v:_ | UnElts v xs ys} @-}  
-append [] ys     = ys
-append (x:xs) ys = x : append xs ys 
-
-
-{-@ reverse :: xs:_ -> {v:_ | EqElts v xs} @-}
-reverse xs           = revAcc xs []
-  where 
-   revAcc []     acc = acc
-   revAcc (x:xs) acc = revAcc xs (x:acc)
-
-
-
--- But, there are limitations...
-   
-{-@ append'  :: xs:_ -> ys:_ -> {v:_ | UnElts v xs ys} @-}  
-append' xs ys = foldr (:) ys xs
-
-
------------------------------------------------------------------------------
--- | 2. Checking for duplicates (xmonad) ------------------------------------ 
------------------------------------------------------------------------------
-
--- | Is a list free of duplicates?
-   
-{-@ measure nodups :: [a] -> Prop
-    nodups ([])   = true
-    nodups (x:xs) = (not (Set_mem x (elems xs)) && nodups xs)
-  @-}
-
--- | Weeding out duplicates.
-   
-{-@ nub :: xs:_ -> {v:_ | nodups v && EqElts v xs} @-}
-nub xs             = go xs []
-  where
-    go (x:xs) l
-      | x `elem` l = go xs l     
-      | otherwise  = go xs (x:l) 
-    go [] l        = l
-
-
-{-@ elem :: x:_ -> ys:_ -> {v:Bool | Prop v <=> Set_mem x (elems ys)} @-}
-elem x []     = False
-elem x (y:ys) = x == y || elem x ys
-
------------------------------------------------------------------------------
--- | 3. Associative Lookups ------------------------------------------------- 
------------------------------------------------------------------------------
-
--- The dread "key-not-found". How can we fix it?
-find key ((k,v) : kvs)
-  | key == k  = v
-  | otherwise = find key kvs
-find _ []     = die "Key not found! Lookup failed!"
-
-
-{-@ die :: {v:_ | false} -> b @-}
-die x = error x
-
-
-----------------------------------------------------------------------------
--- | CHEAT AREA ------------------------------------------------------------
-----------------------------------------------------------------------------
-
-{-@ predicate ValidKey K M    = Set_mem K (keys M)  @-}
-
-{-@ measure keys  :: [(a, b)] -> (Set a)
-    keys ([])     = (Set_empty 0)
-    keys (kv:kvs) = (Set_cup (Set_sng (fst kv)) (keys kvs))
-  @-}
-
--- # START ERRORS 2 (find, append')
--- # END   ERRORS 1 (append')
-
-{-@ find :: k:_ -> {m:_ | ValidKey k m} -> _ @-}
-
diff --git a/docs/slides/BOS14/hs/start/02_AbstractRefinements.hs b/docs/slides/BOS14/hs/start/02_AbstractRefinements.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/02_AbstractRefinements.hs
+++ /dev/null
@@ -1,252 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module AbstractRefinements (
-    listMax
-  , insertSort
-  , insertSort'
-  , insertSort''
-  ) where
-
-import Data.Set hiding (insert, foldr,size,filter, append) 
-import Prelude hiding (map, foldr, filter, append)
-
-listMax     :: [Int] -> Int
-
-
-
------------------------------------------------------------------------
--- | #1. Abstract Refinements 
------------------------------------------------------------------------
-
-{-@ listMax :: forall <p :: Int -> Prop>. {v:[Int<p>] | len v > 0} -> Int<p> @-} 
-listMax xs  = foldr1 max xs 
-
-
--- Lets define a few different subsets of Int
-
-{-@ type Even = {v:Int | v mod 2 == 0}      @-}
-{-@ type Odd  = {v:Int | v mod 2 /= 0}      @-}
-{-@ type RGB  = {v:Int | 0 <= v && v < 256} @-}
-
-
-{-@ xE :: Even @-}
-xE = listMax [0, 200, 4000, 60] 
-
-
-{-@ xO :: Odd @-}
-xO = listMax [1, 21, 4001, 961] 
-
-
-{-@ xR :: RGB @-}
-xR = listMax [1, 21, 41, 61] 
-
-
-
-
-
-
-
--- > RJ: Return to slides for 06_Inductive
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | #2. Induction, as an Abstract Refinement 
------------------------------------------------------------------------
-
-
-{-@ ifoldr :: forall a b <p :: List a -> b -> Prop>. 
-                 (xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)>) 
-               -> b<p N> 
-               -> ys:List a
-               -> b<p ys>                            @-}
-ifoldr :: (List a -> a -> b -> b) -> b -> List a -> b
-ifoldr f b N        = b
-ifoldr f b (C x xs) = f xs x (ifoldr f b xs)
-
-
-
-
-
-
-
-
-{-@ append :: xs:List a -> ys:List a -> {v:List a | UnElems v xs ys} @-} 
-append xs ys = ifoldr (\_ -> C) ys xs 
-
-
-
-
-
-
-
-{-@ filter :: (a -> Bool) -> xs:List a -> {v:List a | SubElems v xs } @-} 
-filter f xs = ifoldr (id (\_ x ys -> if f x then C x ys else ys)) N xs
-
-
-
-
-
-
--- > RJ: Return to slides for 08_Recursive
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | #3. Abstract Refinement from List's Type 
------------------------------------------------------------------------
-
-
-{-@ data List a <p :: a -> a -> Prop> 
-     = N | C {hd :: a, tl :: List<p> (a<p hd>) } @-}
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | #4. Instantiating Abstract Refinements on Lists 
------------------------------------------------------------------------
-
-
-{-@ type IncrList a = List <{\x y -> x <= y}> a @-} 
-{-@ type DecrList a = List <{\x y -> x >= y}> a @-} 
-{-@ type DiffList a = List <{\x y -> x /= y}> a @-} 
-
-{-@ ups   :: IncrList Integer @-}
-ups       = 1 `C` 2 `C` 4 `C` N
-
-{-@ downs :: DecrList Integer @-}
-downs     = 100 `C` 20 `C` 4 `C` N
-
-{-@ diffs :: DiffList Integer @-}
-diffs     = 100 `C` 1000 `C` 10 `C` 1 `C`  N
-
------------------------------------------------------------------------
--- | 5. Insertion Sort
------------------------------------------------------------------------
-
-{-@ insert         :: x:a -> xs:IncrList a -> {v:IncrList a | AddElt v x xs && size v = 1 + size xs} @-}
-insert x N         = x `C` N
-insert x (C y ys)
-  | x < y          = x `C` y `C` ys
-  | otherwise      = y `C` insert x ys 
-
-{-@ insertSort      :: xs:List a -> IncrList a @-}
-insertSort N        = N
-insertSort (C x xs) = insert x (insertSort xs)
-
------------------------------------------------------------------------
--- | 6. Insertion Sort: using a `foldr` 
------------------------------------------------------------------------
-
-{-@ insertSort' :: xs:List a -> IncrList a @-}
-insertSort' xs = foldr insert N xs
-
-
-
-
-
-
-
--- Or even better... we can use `ifoldr`
-
-{-@ insertSort'' :: xs:List a -> {v:IncrList a | EqSize v xs && EqElem v xs} @-}
-insertSort'' xs = ifoldr (\_ -> insert) N xs
-
-
-
-
-
-
-
-
--- > RJ: Return to slides for "07_Array"
-
-
-
-
-
-
-              
------------------------------------------------------------------------
--- | Boilerplate definitions from 00_Refinements.hs
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
-{-@ measure size @-}
-size          :: List a -> Int
-size (C x xs) = 1 + size xs 
-size N        = 0
-
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
-
-{-@ predicate EqSize X Y    = size X  = size Y                         @-}
-{-@ predicate EqElem X Y    = elems X = elems Y                        @-}
-{-@ predicate UnElems X Y Z = elems X = Set_cup (elems Y) (elems Z)    @-}
-{-@ predicate SubElems X Y  = Set_sub (elems X) (elems Y)              @-}
-{-@ predicate AddElt V X Xs = elems V = Set_cup (Set_sng X) (elems Xs) @-}
-
-{-@ measure elems ::List a -> (Set a)
-    elems (N)      = (Set_empty 0)
-    elems (C x xs) = (Set_cup (Set_sng x) (elems xs))
-  @-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{-@ predicate SubConsElems X Y Ys = Set_sub (elems X) (Set_cup (Set_sng Y) (elems Ys)) @-}
-
-{-@ qual1  :: y:_ -> ys:_ -> {v:_ | SubConsElems v y ys} @-}
-qual1 :: a -> List a -> List a 
-qual1 y ys = undefined 
-
-{-@ qual2  :: y:_ -> ys:_ -> {v:_ | size v <= 1 + size ys} @-}
-qual2 :: a -> List a -> List a 
-qual2 y ys = undefined 
-
-
-
diff --git a/docs/slides/BOS14/hs/start/03_Termination.hs b/docs/slides/BOS14/hs/start/03_Termination.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/03_Termination.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-module Termination where
-
-import Prelude hiding (gcd, mod, map, repeat, take)
-import Language.Haskell.Liquid.Prelude
-
-fac   :: Int -> Int
-
--------------------------------------------------------------------------
--- | Simple Termination
--------------------------------------------------------------------------
-
-{-@ fac :: Nat -> Nat @-}
-fac 0 = 1
-fac 1 = 1
-fac n = n * fac (n-1)
-
-
-
-
--------------------------------------------------------------------------
--- | Semantic Termination
--------------------------------------------------------------------------
-
-gcd :: Int -> Int -> Int
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-
-
-mod :: Int -> Int -> Int
-mod a b | a - b >  b = mod (a - b) b
-        | a - b <  b = a - b
-        | a - b == b = 0
-
--------------------------------------------------------------------------
--- | Explicit Metrics #1 
--------------------------------------------------------------------------
-
-tfac       :: Int -> Int -> Int
-tfac acc 0 = acc
-tfac acc n = tfac (n * acc) (n-1)
-
-
-
-
--------------------------------------------------------------------------
--- Explicit Metrics #2 
--------------------------------------------------------------------------
-
-range :: Int -> Int -> [Int]
-range lo hi
-  | lo < hi   = lo : range (lo + 1) hi
-  | otherwise = []
-
-
-
--------------------------------------------------------------------------
--- | Structural Recursion 
--------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-{-@ measure size @-}
-size          :: List a -> Int 
-size (C x xs) = 1 + size xs
-size (N)      = 0
-
-
-map            :: (a -> b) -> List a -> List b
-map _ N        = N
-map f (C x xs) = f x `C` map f xs
-
-
-
--------------------------------------------------------------------------
--- | Default Metrics
--------------------------------------------------------------------------
-
-map'            :: (a -> b) -> List a -> List b
-map' _ N        = N
-map' f (C x xs) = f x `C` map' f xs
-
-
-
-
-
-
--------------------------------------------------------------------------
--- | Termination Expressions Metrics
--------------------------------------------------------------------------
-
-merge          :: (Ord a) => List a -> List a -> List a
-
-merge (C x xs) (C y ys)
-  | x < y      = x `C` merge xs (y `C` ys)
-  | otherwise  = y `C` merge (x `C` xs) ys
-merge _   ys   = ys
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------------
--- | CHEAT AREA ----------------------------------------------------------------
---------------------------------------------------------------------------------
-
--- # START ERRORS 8
--- # END ERRORS   0
-
-{- gcd   :: a:Nat -> b:{v:Nat | v < a} -> Int @-}
-{- mod   :: a:Nat -> b:{v:Nat| 0 < v && v < a} -> {v:Nat | v < b} @-}
-{- tfac  :: Nat -> n:Nat -> Nat / [n] @-}
-{- range :: lo:Nat -> hi:Nat -> [Nat] / [hi-lo] @-}
-{- map   :: (a -> b) -> xs:List a -> (List b) / [size xs] @-}
-{- merge :: xs:_ -> ys:_ -> _ / [size xs + size ys] @-}
-{- data List [size] a = N | C {x :: a, xs :: List a } @-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------------
--- | BOILERPLATE ---------------------------------------------------------------
---------------------------------------------------------------------------------
-                 
-{-@ invariant {v : List a | 0 <= size v} @-}
-
diff --git a/docs/slides/BOS14/hs/start/04_Streams.hs b/docs/slides/BOS14/hs/start/04_Streams.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/04_Streams.hs
+++ /dev/null
@@ -1,108 +0,0 @@
-module Streams where
-
-import Prelude hiding (take, repeat)
-
-import Language.Haskell.Liquid.Prelude
-
--------------------------------------------------------------------------
--- | Lists 
--------------------------------------------------------------------------
- 
-data List a = N | C { x :: a, xs :: List a }
-
--- | Associate an abstract refinement with the _tail_ xs
-
-{-@ data List a <p :: List a -> Prop>
-      = N | C { x  :: a
-              , xs :: List <p> a <<p>>
-              }
-  @-}
-
--------------------------------------------------------------------------
--- | Infinite Streams
--------------------------------------------------------------------------
-
--- | Infinite List = List where _each_ tail is a `cons` ...
-
-{-@ type Stream a = {xs: List <{\v -> cons v}> a | cons xs} @-}
-
--- | A simple measure for when a `List` is a `Cons`
-
-{-@ measure cons  :: (List a) -> Prop
-    cons (C x xs) = true 
-    cons (N)      = false 
-  @-}
-
--------------------------------------------------------------------------
--- | Creating an Infinite Stream
--------------------------------------------------------------------------
-
-{-@ Lazy repeat @-}
-                 
-{-@ repeat :: a -> Stream a @-}
-repeat   :: a -> List a
-repeat x = x `C` repeat x
-
-
--------------------------------------------------------------------------
--- | Using an Infinite Stream
--------------------------------------------------------------------------
-
-{-@ take        :: n:Nat -> Stream a -> {v:List a | size v = n} @-}
-take 0 _        = N
-take n (C x xs) = x `C` take (n-1) xs
-take _ N        = liquidError "never happens"
-
--------------------------------------------------------------------------
-
-
-
-
-
-
-
-
-
-
-
--------------------------------------------------------------------------
--- | BOILERPLATE from before ...
--------------------------------------------------------------------------
-
-{-@ measure size :: List a -> Int 
-    size (N)      = 0
-    size (C x xs) = (1 + size xs)
-  @-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------
-take            :: Int -> List a -> List a
-
-
-
-
-
-
-
-
-
diff --git a/docs/slides/BOS14/hs/start/05_Memory.hs b/docs/slides/BOS14/hs/start/05_Memory.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/05_Memory.hs
+++ /dev/null
@@ -1,391 +0,0 @@
-{-# LANGUAGE ForeignFunctionInterface #-}
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--diffcheck"     @-}
-
-module Memory where
-
-import Prelude hiding (null)
-import Data.Char
-import Data.Word
-import Foreign.C.Types
-import Foreign.ForeignPtr
-import Foreign.Ptr
-import Foreign.Storable
-import System.IO.Unsafe
-import Data.ByteString.Internal (c2w, w2c)
-import Language.Haskell.Liquid.Prelude
-
-
-------------------------------------------------------------------------
--- | 1. Low-level Pointer API  -----------------------------------------
-------------------------------------------------------------------------
-
--- | Create a buffer of size 4 and initialize it with zeros
-
-zero4  = do fp <- mallocForeignPtrBytes 4
-            withForeignPtr fp $ \p -> do
-              poke (p `plusPtr` 0) zero 
-              poke (p `plusPtr` 1) zero 
-              poke (p `plusPtr` 2) zero 
-              poke (p `plusPtr` 3) zero 
-            return fp
-        where
-            zero = 0 :: Word8
-
--- But whats to prevent an overflow, e.g. writing to offset 5 or 50?
-            
-
-
--- | Types for Pointers
-
--- data Ptr a         
--- data ForeignPtr a 
-
--- | Size of Ptr and ForeignPtr
-
--- measure plen  :: Ptr a -> Int 
--- measure fplen :: ForeignPtr a -> Int 
-
-
-{-@ type PtrN a N        = {v:Ptr a        |  plen v  = N}  @-}
-{-@ type ForeignPtrN a N = {v:ForeignPtr a |  fplen v = N}  @-}
-
--- | Allocating Memory
-
-{-@ assume mallocForeignPtrBytes :: n:Nat -> IO (ForeignPtrN a n) @-}
-
--- | Using a pointer
-
-{- withForeignPtr :: fp:ForeignPtr a 
-                  -> (PtrN a (fplen fp) -> IO b)  
-                  -> IO b             
--}
-
--- | Pointer Arithmetic
-
-{- plusPtr :: p:Ptr a
-           -> o:{Nat|o <= plen p}   -- in bounds
-           -> PtrN b (plen b - o)   -- remainder
--}
-
--- | Read and Write
-
-{- peek :: {v:Ptr a | 0 < plen v} -> IO a  
-   poke :: {v:Ptr a | 0 < plen v} -> a -> IO ()  
- -}
-
--- | Example: Preventing Overflows e.g. writing 5 or 50 zeros?
-
-zero4' = do fp <- mallocForeignPtrBytes 4
-            withForeignPtr fp $ \p -> do
-              poke (p `plusPtr` 0) zero 
-              poke (p `plusPtr` 1) zero 
-              poke (p `plusPtr` 2) zero 
-              poke (p `plusPtr` 5) zero 
-            return fp
-        where
-            zero = 0 :: Word8
-
-
-
-------------------------------------------------------------------------
--- | 2. ByteString API -------------------------------------------------
-------------------------------------------------------------------------
-
-data ByteString = PS {
-    bPtr :: ForeignPtr Word8
-  , bOff :: !Int
-  , bLen :: !Int
-  }
-
-
--- | Refined Type, with invariants
-
-{-@ data ByteString = PS {
-      bPtr :: ForeignPtr Word8
-    , bOff :: {v:Nat| v        <= fplen bPtr}
-    , bLen :: {v:Nat| v + bOff <= fplen bPtr}
-    }
-
-  @-}
-
--- | Some useful abbreviations
-
-{-@ type ByteStringN N = {v:ByteString | bLen v = N} @-}
-{-@ type StringN N     = {v:String     | len v  = N} @-}
-
--- | Legal Bytestrings 
-
-{-@ good1 :: IO (ByteStringN 5) @-}
-good1 = do fp <- mallocForeignPtrBytes 5
-           return $ PS fp 0 5
-
-{-@ good2 :: IO (ByteStringN 3) @-}
-good2 = do fp <- mallocForeignPtrBytes 5
-           return $ PS fp 2 3
-
--- | Illegal Bytestrings 
-
-bad1 = do fp <- mallocForeignPtrBytes 3 
-          return $ PS fp 0 10 
-
-bad2 = do fp <- mallocForeignPtrBytes 3
-          return $ PS fp 2 2
-
-
-
--- | ByteString API: `create`
-
-create :: Int -> (Ptr Word8 -> IO ()) -> ByteString
-
-create n fill = unsafePerformIO $ do
-  fp  <- mallocForeignPtrBytes n
-  withForeignPtr fp fill 
-  return $! PS fp 0 n
-
-
--- Yikes, there is an error! How to fix?
-
--- | ByteStringN API: `unsafeTake`
-
-unsafeTake n (PS x s l) = PS x s n
-
--- Wow, thats super fast. O(1)! But how to fix the error?
-
--- | ByteString API: `pack`
-
-pack          :: String -> ByteString
-pack str      = create n $ \p -> go p xs
-  where
-  n           = length str
-  xs          = map c2w str
-  go p (x:xs) = poke p x >> go (plusPtr p 1) xs
-  go _ []     = return  ()
-
--- Hmm. How to fix the error?
-
-
-
--- | ByteString API: `unpack` 
-
-
-
-{-@ qualif Unpack(v:a, acc:b, n:int) : len v = 1 + n + len acc @-}
-
-unpack :: ByteString -> String 
-unpack (PS _  _ 0)  = []
-unpack (PS ps s l)  = unsafePerformIO $ withForeignPtr ps $ \p ->
-   go (p `plusPtr` s) (l - 1)  []
-  where
-   go p 0 acc = peek p >>= \e -> return (w2c e : acc)
-   go p n acc = peek (p `plusPtr` n) >>= \e -> go p (n-1) (w2c e : acc)
-
-
-
-------------------------------------------------------------------------
--- | 3. Application API (Heartbleed no more!) --------------------------
-------------------------------------------------------------------------
-
-chop     :: String -> Int -> String 
-chop s n =  s'
-  where 
-    b    = pack s          -- down to low-level
-    b'   = unsafeTake n b  -- grab n chars
-    s'   = unpack b'       -- up to high-level
-
--- Whats the problem?
-
-
-
-
-
--- | "HeartBleed" no more
-
-demo     = [ex6, ex30]
-  where
-    ex   = ['R','a','n','j','i','t']
-    ex6  = chop ex 6  -- ok
-    ex30 = chop ex 30 -- out of bounds
-
-
--- "Bleeding" `chop ex 30` *rejected* by compiler
-
-
-
-------------------------------------------------------------------------
--- | 3. Bonus Material -------------------------------------------------
-------------------------------------------------------------------------
-
--- | `group` ing ByteStrings 
-
-{- How shall we type `group` where
-
-     group "foobaaar"
-
-   returns
-
-     ["f","oo", "b", "aaa", "r"]
-
--}
-
--- | An alias for NON-EMPTY ByteStrings
-    
-{-@ type ByteStringNE = {v:ByteString | bLen v > 0} @-}
-
--- | A measure for the sum of sizes of a LIST of ByteStrings
-    
-{-@ measure bLens  :: [ByteString] -> Int
-    bLens ([])   = 0
-    bLens (x:xs) = (bLen x + bLens xs)
-  @-}
-
--- | @group@
-    
-{-@ group :: b:ByteString -> {v: [ByteStringNE] | bLens v = bLen b} @-}
-group xs
-    | null xs   = []
-    | otherwise = let y = unsafeHead xs
-                      (ys, zs) = spanByte (unsafeHead xs) (unsafeTail xs)
-                  in (y `cons` ys) : group zs
-
-
--- | @spanByte@ does the heavy lifting
-
-{-@ spanByte :: Word8 -> b:ByteString -> (ByteStringPair b) @-}
-spanByte :: Word8 -> ByteString -> (ByteString, ByteString)
-spanByte c ps@(PS x s l) = unsafePerformIO $ withForeignPtr x $ \p ->
-    go (p `plusPtr` s) 0
-  where
-    go p i | i >= l    = return (ps, empty)
-           | otherwise = do c' <- peekByteOff p i
-                            if c /= c'
-                                then return (unsafeTake i ps, unsafeDrop i ps)
-                                else go p (i+1)
-
--- | Using the alias
-                            
-{-@ type ByteStringPair B = (ByteString, ByteString)<{\x1 x2 ->
-       bLen x1 + bLen x2 = bLen B}> @-}
-
-
-
-
-
-
-
-
-
-
-
-----------------------------------------------------------------------------
--- | CHEAT AREA
-----------------------------------------------------------------------------
-
--- #START ERRORS 13
--- #END   ERRORS 4 (zero4', bad1, bad2, ex30) 
-                            
-{- create     :: n:Nat -> (PtrN Word8 n -> IO ()) -> ByteStringN n      @-}
-{- unsafeTake :: n:Nat -> b:{ByteString | n <= bLen b} -> ByteStringN n @-}
-{- pack       :: s:String -> ByteStringN (len s)                        @-}
-{- unpack     :: b:ByteString -> {v:String | len v = bLen b}            @-}
-{- chop       :: s:String -> n:{Nat | n <= len s} -> StringN n          @-} 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | Helper Code (Stuff from BS benchmark, to make demo self-contained)
------------------------------------------------------------------------
-
-{-@ unsafeCreate :: l:Nat -> ((PtrN Word8 l) -> IO ()) -> (ByteStringN l) @-}
-unsafeCreate n f = create n f -- unsafePerformIO $ create n f
-
-{-@ invariant {v:ByteString   | bLen  v >= 0} @-}
-{-@ invariant {v:[ByteString] | bLens v >= 0} @-}
-
-{-@ qualif PLLen(v:a, p:b) : (len v) <= (plen p) @-}
-{-@ qualif ForeignPtrN(v:ForeignPtr a, n:int): fplen v = n @-}
-{-@ qualif FPLenPLen(v:Ptr a, fp:ForeignPtr a): fplen fp = plen v @-}
-{-@ qualif PtrLen(v:Ptr a, xs:List b): plen v = len xs @-}
-{-@ qualif PlenEq(v: Ptr a, x: int): x <= (plen v) @-}
-
-{-@ unsafeHead :: {v:ByteString | (bLen v) > 0} -> Word8 @-}
-
-unsafeHead :: ByteString -> Word8
-unsafeHead (PS x s l) = liquidAssert (l > 0) $
-  unsafePerformIO  $  withForeignPtr x $ \p -> peekByteOff p s
-
-{-@ unsafeTail :: b:{v:ByteString | (bLen v) > 0}
-               -> {v:ByteString | (bLen v) = (bLen b) - 1} @-}
-unsafeTail :: ByteString -> ByteString
-unsafeTail (PS ps s l) = liquidAssert (l > 0) $ PS ps (s+1) (l-1)
-
-{-@ null :: b:ByteString -> {v:Bool | ((Prop v) <=> ((bLen b) = 0))} @-}
-null :: ByteString -> Bool
-null (PS _ _ l) = liquidAssert (l >= 0) $ l <= 0
-
-{-@ unsafeDrop :: n:Nat
-               -> b:{v: ByteString | n <= (bLen v)} 
-               -> {v:ByteString | (bLen v) = (bLen b) - n} @-}
-unsafeDrop  :: Int -> ByteString -> ByteString
-unsafeDrop n (PS x s l) = liquidAssert (0 <= n && n <= l) $ PS x (s+n) (l-n)
-
-{-@ cons :: Word8 -> b:ByteString -> {v:ByteString | (bLen v) = 1 + (bLen b)} @-}
-cons :: Word8 -> ByteString -> ByteString
-cons c (PS x s l) = unsafeCreate (l+1) $ \p -> withForeignPtr x $ \f -> do
-        poke p c
-        memcpy (p `plusPtr` 1) (f `plusPtr` s) (fromIntegral l)
-
-{-@ empty :: {v:ByteString | (bLen v) = 0} @-} 
-empty :: ByteString
-empty = PS nullForeignPtr 0 0
-
-{-@ assume
-    c_memcpy :: dst:(PtrV Word8)
-             -> src:(PtrV Word8) 
-             -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))} 
-             -> IO (Ptr Word8)
-  @-}
-foreign import ccall unsafe "string.h memcpy" c_memcpy
-    :: Ptr Word8 -> Ptr Word8 -> CSize -> IO (Ptr Word8)
-
-{-@ memcpy :: dst:(PtrV Word8)
-           -> src:(PtrV Word8) 
-           -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))} 
-           -> IO () 
-  @-}
-memcpy :: Ptr Word8 -> Ptr Word8 -> CSize -> IO ()
-memcpy p q s = c_memcpy p q s >> return ()
-
-{-@ assume nullForeignPtr :: {v: ForeignPtr Word8 | (fplen v) = 0} @-}
-nullForeignPtr :: ForeignPtr Word8
-nullForeignPtr = unsafePerformIO $ newForeignPtr_ nullPtr
-{-# NOINLINE nullForeignPtr #-}
-
-
-
diff --git a/docs/slides/BOS14/hs/start/06_Eval-done.hs b/docs/slides/BOS14/hs/start/06_Eval-done.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/06_Eval-done.hs
+++ /dev/null
@@ -1,83 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-
-module Eval (eval) where
-
-import Language.Haskell.Liquid.Prelude (liquidError)
-import Prelude hiding (lookup)
-import Data.Set (Set (..))
-
-lookup :: Bndr -> Env Expr -> Expr 
-
--------------------------------------------------------------------
--- | Binders, Expressions, Environments
--------------------------------------------------------------------
-
-type Bndr = String 
-
-data Expr = Const Int
-          | Var   Bndr
-          | Plus  Expr Expr
-          | Let   Bndr Expr Expr
-
-type Env a = [(Bndr, a)]
-
--------------------------------------------------------------------
--- | Values
--------------------------------------------------------------------
-
--------------------------------------------------------------------
-{-@ lookup :: x:Bndr -> {v:Env Val | Set_mem x (vars v)} -> Val @-}
--------------------------------------------------------------------
-lookup x ((y,v):env)   
-  | x == y             = v
-  | otherwise          = lookup x env
-lookup x []            = die "Unbound Variable"
-
--------------------------------------------------------------------
-{-@ eval :: g:Env Val -> ClosedExpr g -> Val @-}
--------------------------------------------------------------------
-eval env i@(Const _)   = i
-eval env (Var x)       = lookup x env 
-eval env (Plus e1 e2)  = plus (eval env e1) (eval env e2) 
-eval env (Let x e1 e2) = eval env' e2 
-  where 
-    env'               = (x, eval env e1) : env
-
-plus (Const i) (Const j) = Const (i+j)
-plus _         _         = die "Bad call to plus"
-
-
-{-@ die :: {v:_ | false} -> a @-}
-die x   = error x
-
-
-
-
-
-
-
-
-
-{-@ type Val           = {v:Expr | val v} @-}
-
-{-@ type ClosedExpr G  = {v:Expr | Set_sub (free v) (vars G)} @-}
-
-{-@ measure vars :: Env a -> (Set Bndr)
-    vars ([])    = (Set_empty 0)
-    vars (b:env) = (Set_cup (Set_sng (fst b)) (vars env))
-  @-}
-
-{-@ measure free       :: Expr -> (Set Bndr) 
-    free (Const i)     = (Set_empty 0)
-    free (Var x)       = (Set_sng x) 
-    free (Plus e1 e2)  = (Set_cup (free e1) (free e2))
-    free (Let x e1 e2) = (Set_cup (free e1) (Set_dif (free e2) (Set_sng x)))
-  @-}
-
-{-@ measure val       :: Expr -> Prop
-    val (Const i)     = true
-    val (Var x)       = false
-    val (Plus e1 e2)  = false
-    val (Let x e1 e2) = false
-  @-}
-
diff --git a/docs/slides/BOS14/hs/start/06_Eval.hs b/docs/slides/BOS14/hs/start/06_Eval.hs
deleted file mode 100644
--- a/docs/slides/BOS14/hs/start/06_Eval.hs
+++ /dev/null
@@ -1,113 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-
-module Eval (eval) where
-
-import Language.Haskell.Liquid.Prelude (liquidError)
-import Prelude hiding (lookup)
-import Data.Set (Set (..))
-
-
--------------------------------------------------------------------
--- | Binders, Expressions, Environments
--------------------------------------------------------------------
-
-type Bndr = String 
-
-data Expr = Const Int
-          | Var   Bndr
-          | Plus  Expr Expr
-          | Let   Bndr Expr Expr
-
-type Env a = [(Bndr, a)]
-
--------------------------------------------------------------------
-eval :: Env Expr -> Expr -> Expr
--------------------------------------------------------------------
-eval env i@(Const _)     = i
-eval env (Var x)         = lookup x env 
-eval env (Plus e1 e2)    = plus (eval env e1) (eval env e2) 
-eval env (Let x e1 e2)   = eval env' e2 
-  where 
-    env'                 = (x, eval env e1) : env
-
--------------------------------------------------------------------
-plus :: Expr -> Expr -> Expr
--------------------------------------------------------------------
-plus (Const i) (Const j) = Const (i+j)
-plus _         _         = die "Bad call to plus"
-
-
--------------------------------------------------------------------
-lookup :: Bndr -> Env Expr -> Expr 
--------------------------------------------------------------------
-lookup x ((y,v):env)   
-  | x == y             = v
-  | otherwise          = lookup x env
-lookup x []            = die "Unbound Variable"
-
-
-
-
--------------------------------------------------------------------
--- | Values
--------------------------------------------------------------------
-
--- Lets define `Value` as a refinement of `Expr`...
-
-
-
--------------------------------------------------------------------
--- | Closed Expressions
--------------------------------------------------------------------
-
--- Lets define `ClosedExpr` as a refinement of `Expr` ...
-
-
-
--------------------------------------------------------------------
--- | BOILERPLATE 
--------------------------------------------------------------------
-
-{-@ die :: {v:_ | false} -> a @-}
-die x   = error x
-
-
-
-
-
--------------------------------------------------------------------
--- | CHEAT AREA ---------------------------------------------------
--------------------------------------------------------------------
-
-{- lookup :: x:Bndr -> {v:Env Val | Set_mem x (vars v)} -> Val @-}
-
-{- eval :: g:Env Val -> ClosedExpr g -> Val @-}
-
-
--- | Values
-
-{- type Val           = {v:Expr | val v} @-}
-
-{- measure val       :: Expr -> Prop
-    val (Const i)     = true
-    val (Var x)       = false
-    val (Plus e1 e2)  = false
-    val (Let x e1 e2) = false
-  @-}
-
--- | Closed Expressions
-
-{- type ClosedExpr G  = {v:Expr | Set_sub (free v) (vars G)} @-}
-
-{- measure vars :: Env a -> (Set Bndr)
-    vars ([])    = (Set_empty 0)
-    vars (b:env) = (Set_cup (Set_sng (fst b)) (vars env))
-  @-}
-
-{- measure free       :: Expr -> (Set Bndr) 
-    free (Const i)     = (Set_empty 0)
-    free (Var x)       = (Set_sng x) 
-    free (Plus e1 e2)  = (Set_cup (free e1) (free e2))
-    free (Let x e1 e2) = (Set_cup (free e1) (Set_dif (free e2) (Set_sng x)))
-  @-}
diff --git a/docs/slides/BOS14/img/RedBlack.png b/docs/slides/BOS14/img/RedBlack.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/RedBlack.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/RobertMorris.png b/docs/slides/BOS14/img/RobertMorris.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/RobertMorris.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/bytestring.png b/docs/slides/BOS14/img/bytestring.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/bytestring.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/code-spec-indiv.png b/docs/slides/BOS14/img/code-spec-indiv.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/code-spec-indiv.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/code-spec-total.png b/docs/slides/BOS14/img/code-spec-total.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/code-spec-total.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/firstbug-crop.jpg b/docs/slides/BOS14/img/firstbug-crop.jpg
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/firstbug-crop.jpg and /dev/null differ
diff --git a/docs/slides/BOS14/img/firstbug-crop2.jpg b/docs/slides/BOS14/img/firstbug-crop2.jpg
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/firstbug-crop2.jpg and /dev/null differ
diff --git a/docs/slides/BOS14/img/firstbug.jpg b/docs/slides/BOS14/img/firstbug.jpg
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/firstbug.jpg and /dev/null differ
diff --git a/docs/slides/BOS14/img/george-orwell.jpg b/docs/slides/BOS14/img/george-orwell.jpg
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/george-orwell.jpg and /dev/null differ
diff --git a/docs/slides/BOS14/img/gotofail.png b/docs/slides/BOS14/img/gotofail.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/gotofail.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/heartbleed.png b/docs/slides/BOS14/img/heartbleed.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/heartbleed.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/minindex-classic.png b/docs/slides/BOS14/img/minindex-classic.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/minindex-classic.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/minindex-invariant.png b/docs/slides/BOS14/img/minindex-invariant.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/minindex-invariant.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/minindex-modern.png b/docs/slides/BOS14/img/minindex-modern.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/minindex-modern.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/minindex-reduce.png b/docs/slides/BOS14/img/minindex-reduce.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/minindex-reduce.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/overflow.png b/docs/slides/BOS14/img/overflow.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/overflow.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/rbtree-bad1.png b/docs/slides/BOS14/img/rbtree-bad1.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/rbtree-bad1.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/rbtree-bad2.png b/docs/slides/BOS14/img/rbtree-bad2.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/rbtree-bad2.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/rbtree-ok.png b/docs/slides/BOS14/img/rbtree-ok.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/rbtree-ok.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/tension0.png b/docs/slides/BOS14/img/tension0.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/tension0.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/tension1.png b/docs/slides/BOS14/img/tension1.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/tension1.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/tension2.png b/docs/slides/BOS14/img/tension2.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/tension2.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/tension3.png b/docs/slides/BOS14/img/tension3.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/tension3.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/termination-results.png b/docs/slides/BOS14/img/termination-results.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/termination-results.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/thoughtcrime.png b/docs/slides/BOS14/img/thoughtcrime.png
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/thoughtcrime.png and /dev/null differ
diff --git a/docs/slides/BOS14/img/ungood-small.jpg b/docs/slides/BOS14/img/ungood-small.jpg
deleted file mode 100644
Binary files a/docs/slides/BOS14/img/ungood-small.jpg and /dev/null differ
diff --git a/docs/slides/BOS14/lhs/00_Motivation.lhs b/docs/slides/BOS14/lhs/00_Motivation.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/00_Motivation.lhs
+++ /dev/null
@@ -1,233 +0,0 @@
-Well-Typed Programs Can Go Wrong
-================================
-
- {#asd}
--------
-
-
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-Division By Zero
-----------------
-
-
-
-
-<div class="fragment"> 
-\begin{spec}
-λ> let average xs = sum xs `div` length xs
-
-λ> average [1,2,3]
-2
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment"> 
-\begin{spec}  
-λ> average []
-*** Exception: divide by zero
-\end{spec}
-
-</div>
-
-Missing Keys
-------------
-
-<div class="fragment"> 
-\begin{spec}  
-λ> :m +Data.Map 
-λ> let m = fromList [ ("haskell", "lazy")
-                    , ("pyret"  , "eager")]
-
-λ> m ! "haskell"
-"lazy"
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment"> 
-\begin{spec}
-λ> m ! "racket"
-"*** Exception: key is not in the map
-\end{spec}
-</div>
-
-Segmentation Faults
--------------------
-
-<div class="fragment"> 
-\begin{spec}
-λ> :m +Data.Vector 
-λ> let v = fromList ["haskell", "pyret"]
-λ> unsafeIndex v 0
-"haskell"
-\end{spec}
-</div>
-
-<div class="fragment"> 
-<br>
-\begin{spec} 
-λ> V.unsafeIndex v 3
-
-
-'ghci' terminated by signal SIGSEGV ...
-\end{spec}
-</div>
-
-
-"HeartBleeds"
--------------
-
-\begin{spec}
-λ> :m + Data.Text Data.Text.Unsafe 
-λ> let t = pack "Shriram"
-λ> takeWord16 5 t
-"Shrir"
-\end{spec}
-
-<br>
-
-<div class="fragment"> 
-Memory overflows **leaking secrets**...
-
-<br>
-
-\begin{spec}
-λ> takeWord16 20 t
-"Shriram\1912\3148\SOH\NUL\15928\2486\SOH\NUL"
-\end{spec}
-</div>
-
-Goal
-----
-
-Extend Type System
-
-<br>
-
-+ To prevent *wider class* of errors
-
-+ To enforce *program specific* properties 
-
-
-Algorithmic Verification
-========================
-
-
-Tension
--------
-
-<img src="../img/tension0.png" height=300px>
-
-Automation vs. Expressiveness
-
-Tension
--------
-
-<img src="../img/tension1.png" height=300px>
-
-Extremes: Hindley-Milner vs. CoC
-
-Tension
--------
-
-<img src="../img/tension2.png" height=300px>
-
-Trading off Automation for Expressiveness
-
-Tension
--------
-
-<img src="../img/tension3.png" height=300px>
-
-**Goal:** Find a sweet spot?
-
-<!-- BEGIN CUT
-
-Program Logics
---------------
-
-<br>
-
-**Floyd-Hoare** (ESC, Dafny, SLAM/BLAST,...)
-
-<br>
-
-+ **Properties:**   Assertions & Pre- and Post-conditions
-
-+ **Proofs:**       Verification Conditions proved by SMT
-
-+ **Inference:**    Abstract Interpretation
-
-<br>
-
-<div class="fragment"> Automatic but **not** Expressive </div>
-
-
-Program Logics
---------------
-
-<br>
-
-**Floyd-Hoare** (ESC, Dafny, SLAM/BLAST,...)
-
-
-<br>
-
-Automatic but **not** Expressive
-
-<br>
-
-+ Rich Data Types ?
-
-+ Higher-order functions ?
-
-+ Polymorphism ?
-
-
-Refinement Types
-----------------
-
-<br>
-
-Generalize *Program Logics* with *Types*
-
-<div class="fragment"> 
-<br>
-
-+ **Properties:**  Types + Predicates
-
-+ **Proofs:**      Subtyping + Verification Conditions
-
-+ **Inference:**   Hindley-Milner + Abstract Interpretation
-
-</div>
-
-<div class="fragment"> 
-  <br>
-  Towards reconciling Automation and Expressiveness
-</div>
-
-END CUT -->
-
-Refinement Types
-----------------
-
-<br>
-<br>
-
-[[continue]](01_SimpleRefinements.lhs.slides.html)
-
-
-
diff --git a/docs/slides/BOS14/lhs/00_Motivation_Long.lhs b/docs/slides/BOS14/lhs/00_Motivation_Long.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/00_Motivation_Long.lhs
+++ /dev/null
@@ -1,377 +0,0 @@
-
- {#intro}
-=========
-
- {#firstbug0}
--------------
-
-<img src="../img/firstbug-crop.jpg" height=400px>
-
-The First *Bug* 
----------------
-
-<img src="../img/firstbug-crop2.jpg" height=300px>
-
-**Page from Harvard Mark II log**
-
-A dead moth removed from the device
-
-<!-- BEGIN CUT
-
-Morris Worm (1988)
-------------------
-
-<img src="../img/RobertMorris.png" height=300px>
-
-+ **Buffer overflow** in `fingerd`
-
-+ "Breaks internet" for several days
-
-+ Harmless internet probe gone berserk
-
-END CUT -->
-
-Slammer Worm (2003)
--------------------
-
-<img src="../img/sapphire.gif" height=300px>
-
-**Buffer Overflow**
-
-Affected 90% of vulnerable machines in 10 mins
-
-Northeast Blackout (2003)
--------------------------
-
-<img src="../img/blackout.gif" height=300px>
-
-**Race Condition**
-
-Cut power for 55 million, trigger: lines hitting foliage
-
-HeartBleed (2014)
------------------
-
-<img src="../img/heartbleed.png" height=300px>
-
-**Buffer Overflow**
-
-Compromises secret keys, passwords ...
-
-
-Goto Fail (2014)
-----------------
-
-<img src="../img/gotofail.png" height=300px>
-
-**Typo (?!)**
-
-Bypass critical check, compromise cryptography
-
-A Possible Solution
-===================
-
- Modern Languages
------------------
-
-<div class="fragment">
-
-<img src="../img/george-orwell.jpg" height=250px>
-
-</div>
-
-<div class="fragment">
-
-<img src="../img/thoughtcrime.png" height=100px>
-
-</div>
-
-Modern Languages
-----------------
-
-<br>
-
-F#
-
-Rust
-
-Scala
-
-OCaml
-
-**Haskell**
-
-
-Modern Languages
-----------------
-
-<br>
-
-Static Typing
-
-<br>
-
-First-class Functions
-
-<br>
-
-Immutability by Default
-
-
-<br>
-
-<div class="fragment">
-
-Make **good** designs **easy** and **bad** designs **hard**
-
-</div>
-
-
-Modern Languages? 
--------------------
-
-<br>
-
-Not so fast ...
-
-<br>
-
-<div class="fragment">
-
-Well-typed programs **can go wrong!**
-
-</div>
-
-
-Well-Typed Programs Can Go Wrong
-================================
-
- {#asd}
--------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-Division By Zero
-----------------
-
-
-
-
-<div class="fragment"> 
-\begin{spec}
-λ> let average xs = sum xs `div` length xs
-
-λ> average [1,2,3]
-2
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment"> 
-\begin{spec}  
-λ> average []
-*** Exception: divide by zero
-\end{spec}
-
-</div>
-
-Missing Keys
-------------
-
-<div class="fragment"> 
-\begin{spec}  
-λ> :m +Data.Map 
-λ> let m = fromList [ ("haskell", "lazy")
-                    , ("racket" , "eager")]
-
-λ> m ! "haskell"
-"lazy"
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment"> 
-\begin{spec}
-λ> m ! "javascript"
-"*** Exception: key is not in the map
-\end{spec}
-</div>
-
-Segmentation Faults
--------------------
-
-<div class="fragment"> 
-\begin{spec}
-λ> :m +Data.Vector 
-λ> let v = fromList ["haskell", "racket"]
-λ> unsafeIndex v 0
-"haskell"
-\end{spec}
-</div>
-
-<div class="fragment"> 
-<br>
-\begin{spec} 
-λ> V.unsafeIndex v 3
-
-
-'ghci' terminated by signal SIGSEGV ...
-\end{spec}
-</div>
-
-
-"HeartBleeds"
--------------
-
-\begin{spec}
-λ> :m + Data.Text Data.Text.Unsafe 
-λ> let t = pack "Norman"
-λ> takeWord16 4 t
-"Norm"
-\end{spec}
-
-<br>
-
-<div class="fragment"> 
-Memory overflows **leaking secrets**...
-
-<br>
-
-\begin{spec}
-λ> takeWord16 20 t
-"Norman\1912\3148\SOH\NUL\15928\2486\SOH\NUL"
-\end{spec}
-</div>
-
-Goal
-----
-
-<br>
-
-Extend Type System
-
-<br>
-
-+ To prevent *wider class* of errors
-
-+ To enforce *program specific* properties 
-
-<br>
-
-<div class="fragment">
-
-**Without sacrificing automation** 
-
-</div>
-
-Algorithmic Verification
-========================
-
-Tension
--------
-
-<img src="../img/tension0.png" height=300px>
-
-Automation vs. Expressiveness
-
-Tension
--------
-
-<img src="../img/tension1.png" height=300px>
-
-Extremes: Hindley-Milner vs. CoC
-
-Tension
--------
-
-<img src="../img/tension2.png" height=300px>
-
-Trading off Automation for Expressiveness
-
-Tension
--------
-
-<img src="../img/tension3.png" height=300px>
-
-**Goal:** Find a sweet spot?
-
-<!-- BEGIN CUT
-
-Program Logics
---------------
-
-<br>
-
-**Floyd-Hoare** (ESC, Dafny, SLAM/BLAST,...)
-
-<br>
-
-+ **Properties:**   Assertions & Pre- and Post-conditions
-
-+ **Proofs:**       Verification Conditions proved by SMT
-
-+ **Inference:**    Abstract Interpretation
-
-<br>
-
-<div class="fragment"> Automatic but **not** Expressive </div>
-
-END CUT -->
-
-Program Logics
---------------
-
-<br>
-
-**Floyd-Hoare** (ESC, Dafny, SLAM/BLAST,...)
-
-
-<br>
-
-Automatic but **not** Expressive
-
-<br>
-
-+ Rich Data Types ?
-
-+ Higher-order functions ?
-
-+ Polymorphism ?
-
-Refinement Types
-----------------
-
-<br>
-
-Generalize *Program Logics* with *Types*
-
-<br>
-
-+ **Properties:**  Types + Predicates
-
-+ **Proofs:**      Subtyping + SMT Solvers
-
-<!-- BEGIN CUT
-+ **Inference:**   Hindley-Milner + Abstract Interpretation
-  -->
-
-<div class="fragment"> 
-  <br>
-  Towards reconciling Automation and Expressiveness
-</div>
-
-<br>
-
-<div class="fragment"> 
-[[continue]](01_SimpleRefinements.lhs.slides.html)
-</div>
-
diff --git a/docs/slides/BOS14/lhs/01_SimpleRefinements.lhs b/docs/slides/BOS14/lhs/01_SimpleRefinements.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/01_SimpleRefinements.lhs
+++ /dev/null
@@ -1,457 +0,0 @@
- {#simplerefinements}
-=======================
-
-Simple Refinement Types
------------------------
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-module SimpleRefinements where
-import Language.Haskell.Liquid.Prelude
-import Prelude hiding (abs, max)
-
--- boring haskell type sigs
-zero    :: Int
-zero'   :: Int
-safeDiv :: Int -> Int -> Int
-abs     :: Int -> Int
-\end{code}
-
-</div>
-
-
-Simple Refinement Types
-=======================
-
-
-Types + Predicates 
-------------------
-
-
-Example: Integers equal to `0`
-------------------------------
-
-<br>
-
-\begin{code}
-{-@ type Zero = {v:Int | v = 0} @-}
-
-{-@ zero :: Zero @-}
-zero     =  0
-\end{code}
-
-<br>
-
-<div class="fragment">
-Refinement types via special comments `{-@ ... @-}` 
-
-<br>
-
-<div class="fragment">
-[DEMO](../hs/000_Refinements.hs)
-
-
-<!-- BEGIN CUT
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo</a> 
--->
-
-</div>
-
-Refinements Are Predicates
-==========================
-
-From A Decidable Logic
-----------------------
-
-<br> 
-
-1. Expressions
-
-2. Predicates
-
-<br>
-
-<div class="fragment">
-
-**Refinement Logic: QF-UFLIA**
-
-Quant.-Free. Uninterpreted Functions and Linear Arithmetic 
-
-</div>
-
-
-Expressions
------------
-
-<br>
-
-\begin{spec} <div/> 
-e := x, y, z,...    -- variable
-   | 0, 1, 2,...    -- constant
-   | (e + e)        -- addition
-   | (e - e)        -- subtraction
-   | (c * e)        -- linear multiplication
-   | (f e1 ... en)  -- uninterpreted function
-\end{spec}
-
-Predicates
-----------
-
-<br>
-
-\begin{spec} <div/>
-p := e           -- atom 
-   | e1 == e2    -- equality
-   | e1 <  e2    -- ordering 
-   | (p && p)    -- and
-   | (p || p)    -- or
-   | (not p)     -- negation
-\end{spec}
-
-<br>
-
-
-Refinement Types
-----------------
-
-
-<br>
-
-\begin{spec}<div/>
-b := Int 
-   | Bool 
-   | ...         -- base types
-   | a, b, c     -- type variables
-
-t := {x:b | p}   -- refined base 
-   | x:t -> t    -- refined function  
-\end{spec}
-
-
-Subtyping Judgment 
-------------------
-
-<br>
-
-$$\boxed{\Gamma \vdash t_1 \preceq t_2}$$
-
-<div class="fragment">
-
-<br>
-
-Where **environment** $\Gamma$ is a sequence of binders
-
-<br>
-
-$$\Gamma \defeq \overline{\bindx{x_i}{t_i}}$$
-
-</div>
-
-Subtyping is Implication
-------------------------
-
-<br>
-
-$$\boxed{\Gamma \vdash t_1 \preceq t_2}$$
-
-
-<br>
-
-[PVS' Predicate Subtyping](http://pvs.csl.sri.com/papers/subtypes98/tse98.pdf)
-
-<br>
-
-(For **Base** Types ...)
-
-
-
-
-Subtyping is Implication
-------------------------
-
-<br>
-
-$$\boxed{\Gamma \vdash t_1 \preceq t_2}$$
-
-
-<br>
-
-$$
-\begin{array}{rl}
-{\mathbf{If\ VC\ is\ Valid}}   & \bigwedge_i P_i \Rightarrow  Q  \Rightarrow R \\
-                & \\
-{\mathbf{Then}} & \overline{\bindx{x_i}{P_i}} \vdash \reft{v}{b}{Q} \subty \reft{v}{b}{R} \\
-\end{array}
-$$ 
-
-
-Example: Natural Numbers
-------------------------
-
-<br>
-
-\begin{spec} <div/>  
-        type Nat = {v:Int | 0 <= v}
-\end{spec}
-
-<br>
-
-<div class="fragment">
-
-$$
-\begin{array}{rcrccll}
-\mathbf{VC\ is\ Valid:} & \True     & \Rightarrow &  v = 0   & \Rightarrow &  0 \leq v & \mbox{(by SMT)} \\
-%                &           &             &          &             &           \\
-\mathbf{So:}      & \emptyset & \vdash      & \Zero  & \subty      & \Nat   &   \\
-\end{array}
-$$
-</div>
-
-<br>
-
-<div class="fragment">
-
-Hence, we can type:
-
-\begin{code}
-{-@ zero' :: Nat @-}
-zero'     =  zero   -- zero :: Zero <: Nat
-\end{code}
-</div>
-
-Contracts: Function Types
-=========================
-
- {#as}
-------
-
-Pre-Conditions
---------------
-
-
-<br>
-
-\begin{code}
-safeDiv n d = n `div` d   -- crashes if d==0
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Requires** non-zero input divisor `d`
-
-\begin{code}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-\end{code}
-</div>
-
-<br>
-
-
-<div class="fragment">
-Specify pre-condition as **input type** 
-
-\begin{code}
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{code}
-
-</div>
-
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code}
-{-@ bad :: Nat -> Int @-}
-bad n   = 10 `safeDiv` n
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Rejected As** 
-
-$$\bindx{n}{\Nat} \vdash \reftx{v}{v = n} \not \subty \reftx{v}{v \not = 0}$$
-
-</div>
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code}
-{-@ ok  :: Nat -> Int @-}
-ok n    = 10 `safeDiv` (n+1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Verifies As** 
-
-$\bindx{n}{\Nat} \vdash \reftx{v}{v = n+1} \subty \reftx{v}{v \not = 0}$
-</div>
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{spec} <div/>
-{-@ ok  :: Nat -> Int @-}
-ok n    = 10 `safeDiv` (n+1)
-\end{spec}
-
-<br>
-
-**Verifies As**
-
-$$(0 \leq n) \Rightarrow (v = n+1) \Rightarrow (v \not = 0)$$
-
-
-
-Post-Conditions
----------------
-
-**Ensures** output is a `Nat` greater than input `x`.
-
-\begin{code}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{code}
-
-<br>
-
-<div class="fragment">
-Specify post-condition as **output type**
-
-\begin{code}
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-**Dependent Function Types**
-
-Outputs *refer to* inputs
-</div>
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-Postcondition is checked at **return-site**
-
-<br>
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-**Verified As**
-
-<br>
-
-$$\begin{array}{rll}
-\bindx{x}{\Int},\bindx{\_}{0 \leq x}      & \vdash \reftx{v}{v = x}     & \subty \reftx{v}{0 \leq v \wedge x \leq v} \\
-\bindx{x}{\Int},\bindx{\_}{0 \not \leq x} & \vdash \reftx{v}{v = 0 - x} & \subty \reftx{v}{0 \leq v \wedge x \leq v} \\
-\end{array}$$
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-**Verified As**
-
-<br>
-
-$$\begin{array}{rll}
-(0 \leq x)      & \Rightarrow (v = x)     & \Rightarrow (0 \leq v \wedge x \leq v) \\
-(0 \not \leq x) & \Rightarrow (v = 0 - x) & \Rightarrow (0 \leq v \wedge x \leq v) \\
-\end{array}$$
-
-
-Recipe Scales Up
-----------------
-
-<br>
-
-<div class="fragment">
-Define type *checker* and get *inference* for free [[PLDI 08]](http://goto.ucsd.edu/~rjhala/papers/liquid_types.pdf)
-</div>
-
-<br>
-
-<div class="fragment">
-Scales to Collections, HOFs, Polymorphism ...
-</div>
-
-<br>
-
-<div class="fragment">
-[DEMO](../hs/001_Refinements.hs)
-
-<br>
-
-[[continue...]](02_Measures.lhs.slides.html)
-
-</div>
diff --git a/docs/slides/BOS14/lhs/02_Measures.lhs b/docs/slides/BOS14/lhs/02_Measures.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/02_Measures.lhs
+++ /dev/null
@@ -1,299 +0,0 @@
- {#measures}
-============
-
-Recap
------
-
-<br>
-<br>
-
-1. <div class="fragment">**Refinements:** Types + Predicates</div>
-2. <div class="fragment">**Subtyping:** SMT Implication</div>
-
-<br>
-<br>
-
-<div class="fragment">
-So far: only specify properties of **base values** (e.g. `Int`) ...
-</div>
-
-<br>
-
-<div class="fragment">
-How to specify properties of **structures**?
-</div>
-
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--full"           @-}
-
-module Measures where
-import Prelude hiding ((!!), length)
-import Language.Haskell.Liquid.Prelude
-
--- length      :: L a -> Int
--- (!)         :: L a -> Int -> a
-
-infixr `C`
-\end{code}
-
-</div>
-
-
- {#meas}
-====================
-
-Measuring Data Types
---------------------
-
-Measuring Data Types
-====================
-
-
-Example: Length of a List
--------------------------
-
-Given a type for lists:
-
-<br>
-
-\begin{code}
-data L a = N | C a (L a)
-\end{code}
-
-<div class="fragment">
-<br>
-
-We can define the **length** as:
-
-<br>
-
-\begin{code}
-{-@ measure size  :: (L a) -> Int
-    size (N)      = 0
-    size (C x xs) = (1 + size xs)  @-}
-\end{code}
-
-<div class="hidden">
-
-\begin{code}
-{-@ data L [size] a = N | C {hd :: a, tl :: L a } @-}
-{-@ invariant {v: L a | 0 <= size v}              @-}
-\end{code}
-
-</div>
-
-Example: Length of a List
--------------------------
-
-\begin{spec}
-{-@ measure size  :: (L a) -> Int
-    size (N)      = 0
-    size (C x xs) = 1 + size xs  @-}
-\end{spec}
-
-<br>
-
-We **strengthen** data constructor types
-
-<br>
-
-\begin{spec} <div/>
-data L a where
-  N :: {v: L a | size v = 0}
-  C :: a -> t:_ -> {v:_| size v = 1 + size t}
-\end{spec}
-
-Measures Are Uninterpreted
---------------------------
-
-\begin{spec} <br>
-data L a where
-  N :: {v: L a | size v = 0}
-  C :: a -> t:_ -> {v:_| size v = 1 + size t}
-\end{spec}
-
-<br>
-
-`size` is an **uninterpreted function** in SMT logic
-
-Measures Are Uninterpreted
---------------------------
-
-<br>
-
-In SMT, [uninterpreted function](http://fm.csl.sri.com/SSFT12/smt-euf-arithmetic.pdf) $f$ obeys **congruence** axiom:
-
-<br>
-
-$$\forall \overline{x}, \overline{y}. \overline{x} = \overline{y} \Rightarrow
-f(\overline{x}) = f(\overline{y})$$
-
-<br>
-
-<div class="fragment">
-Other properties of `size` asserted when typing **fold** & **unfold**
-</div>
-
-<br>
-
-<div class="fragment">
-Crucial for *efficient*, *decidable* and *predictable* verification.
-</div>
-
-Measures Are Uninterpreted
---------------------------
-
-Other properties of `size` asserted when typing **fold** & **unfold**
-
-<br>
-
-<div class="fragment">
-\begin{spec}**Fold**<br>
-z = C x y     -- z :: {v | size v = 1 + size y}
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{spec}**Unfold**<br>
-case z of
-  N     -> e1 -- z :: {v | size v = 0}
-  C x y -> e2 -- z :: {v | size v = 1 + size y}
-\end{spec}
-</div>
-
-Example: Using Measures
------------------------
-
-<br>
-<br>
-
-[DEMO: 001_Refinements.hs](../hs/001_Refinements.hs)
-
-
-
-Multiple Measures
-=================
-
- {#adasd}
----------
-
-Can support *many* measures for a type
-
-
-Ex: List Emptiness
-------------------
-
-Measure describing whether a `List` is empty
-
-\begin{code}
-{-@ measure isNull :: (L a) -> Prop
-    isNull (N)      = true
-    isNull (C x xs) = false           @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-LiquidHaskell **strengthens** data constructors
-
-\begin{spec}
-data L a where
-  N :: {v : L a | isNull v}
-  C :: a -> L a -> {v:(L a) | not (isNull v)}
-\end{spec}
-
-</div>
-
-Conjoining Refinements
-----------------------
-
-Data constructor refinements are **conjoined**
-
-\begin{spec}
-data L a where
-  N :: {v:L a |  size v = 0
-              && isNull v }
-  C :: a
-    -> xs:L a
-    -> {v:L a |  size v = 1 + size xs
-              && not (isNull v)      }
-\end{spec}
-
-Multiple Measures: Red Black Trees
-==================================
-
- {#elements}
-------------
-
-<br>
-<br>
-<br>
-
-<a href="13_RedBlack.lhs.slides.html" target="_blank">[continue]</a>
-
-
-
-<!-- BEGIN CUT
-
-Multiple Measures: Sets and Duplicates
-======================================
-
- {#elements}
-------------
-
-[DEMO: 01_Elements.hs](../hs/01_Elements.hs)
-
-Measures vs. Index Types
-========================
-
-Decouple Property & Type
-------------------------
-
-Unlike [indexed types](http://dl.acm.org/citation.cfm?id=270793) ...
-
-<br>
-
-<div class="fragment">
-
-+ Measures **decouple** properties from structures
-
-+ Support **multiple** properties over structures
-
-+ Enable  **reuse** of structures in different contexts
-
-</div>
-
-<br>
-
-<div class="fragment">Invaluable in practice!</div>
-
-END CUT -->
-
-
-Recap
------
-
-<br>
-<br>
-
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. **Measures:** Strengthened Constructors
-
-<br>
-
-<div class="fragment">Automatic Verification of Data Structures</div>
-
-<br>
-<br>
-
-<!-- BEGIN CUT
-<div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target="_blank">[continue]</a></div>
-     END CUT -->
diff --git a/docs/slides/BOS14/lhs/03_HigherOrderFunctions.lhs b/docs/slides/BOS14/lhs/03_HigherOrderFunctions.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/03_HigherOrderFunctions.lhs
+++ /dev/null
@@ -1,276 +0,0 @@
-  {#hofs}
-=========
-
-<div class="hidden">
-\begin{code}
-module Loop (
-    listSum
-  , sumNats
-  ) where
-
-import Prelude
-
-{-@ LIQUID "--no-termination"@-}
-sumNats  :: [Int] -> Int
-add         :: Int -> Int -> Int
-\end{code}
-</div>
-
-Higher-Order Functions 
-----------------------
-
-Types scale to *Higher-Order Functions*  
-
-<br>
-
-<div class="fragment">
-
-+ map
-+ fold
-+ visitors
-+ callbacks
-+ ...
-
-</div>
-
-<br>
-
-<div class="fragment">Difficult with *first-order program logics*</div>
-
-
-Higher Order Specifications 
-===========================
-
-Example: Higher Order Loop
---------------------------
-
-<br>
-
-\begin{code}
-loop :: Int -> Int -> α -> (Int -> α -> α) -> α
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-By subtyping, we infer `f` called with values `(Btwn lo hi)`
-
-
-Example: Summing Lists
-----------------------
-
-\begin{code}
-listSum xs     = loop 0 n 0 body 
-  where 
-    body i acc = acc + (xs !! i)
-    n          = length xs
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Function Subtyping** 
-
-\begin{spec}
-loop :: l -> h -> α -> (Btwn l h -> α -> α) -> α
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-At callsite, since `l := 0` and `h := llen xs` 
-
-\begin{spec}
-body :: Btwn 0 (llen xs) -> Int -> Int
-\end{spec}
-</div>
-
-Example: Summing Lists
-----------------------
-
-\begin{spec}
-listSum xs     = loop 0 n 0 body 
-  where 
-    body i acc = acc + (xs !! i)
-    n          = length xs
-\end{spec}
-
-<br>
-
-**Function Subtyping** 
-
-\begin{spec}
-body :: Btwn 0 (llen xs) -> Int -> Int
-\end{spec}
-
-<br>
-
-So `i` is `Btwn 0 (llen xs)`; indexing `!!` is verified safe.
-
-
- {#polyinst}
-============
-
-Polymorphic Instantiation
--------------------------
-
-<br>
-<br>
-<br>
-
-<div class="fragment">
-"Plugging in" summaries at call-sites
-</div>
-
-Polymorphic Instantiation
-=========================
-
- {#poly}
---------
-
-Example: Summing `Nat`s
------------------------
-
-\begin{code}
-{-@ sumNats :: [Nat] -> Nat @-}
-sumNats xs  = foldl (+) 0 xs 
-\end{code}
-
-<br>
-
-<div class="fragment">
-\begin{spec} Recall 
-foldl :: (α -> β -> α) -> α -> [β] -> α
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-How to **instantiate** `α` and `β` ?
-</div>
-
-Function Subtyping
-------------------
-
-\begin{spec}<div/>
-(+) ::  x:Int -> y:Int -> {v:Int|v=x+y} 
-    <:  Nat   -> Nat   -> Nat
-\end{spec}
-
-<br>
-
-<div class="fragment">
-Because,
-
-\begin{spec}<div/>
-             |- Nat       <: Int  -- Contra (in)
-x:Nat, y:Nat |- {v = x+y} <: Nat  -- Co    (out)
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-Because,
-
-\begin{spec}<div/>
-  0<=x && 0<=y && v = x+y   => 0 <= v
-\end{spec}
-</div>
-
-
-
-
-Example: Summing `Nat`s
------------------------
-
-\begin{spec} <div/> 
-{-@ sumNats :: [Nat] -> Nat @-}
-sumNats xs  = foldl (+) 0 xs 
-\end{spec}
-
-<br>
-
-\begin{spec} Where:
-foldl :: (α -> β -> α) -> α -> [β] -> α
-(+)   :: Nat -> Nat -> Nat
-\end{spec}
-
-<br>
-
-<div class="fragment">
-Hence, `sumNats` verified by **instantiating** `α,β := Nat`
-</div>
-
-<br>
-
-<div class="fragment">
-`α` is **loop invariant**, instantiation is invariant **inference**
-</div>
-
-Instantiation And Inference
----------------------------
-
-Polymorphism ubiquitous, so inference is critical!
-
-<br>
-
-<div class="fragment">
-**Step 1. Templates** 
-Instantiate with unknown refinements
-
-$$
-\begin{array}{rcl}
-\alpha & \defeq & \reft{v}{\Int}{\kvar{\alpha}}\\
-\beta  & \defeq & \reft{v}{\Int}{\kvar{\beta}}\\
-\end{array}
-$$
-</div>
-
-<br>
-<div class="fragment">
-**Step 2. Horn-Constraints** 
-By type checking the templates
-</div>
-
-<br>
-<div class="fragment">
-**Step 3. Fixpoint** 
-Abstract interpretation to get solution for $\kvar{}$
-</div>
-
-
-Iteration Dependence
---------------------
-
-**Problem:** Cannot use parametric polymorphism to verify
-
-<br>
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-As property only holds after **last iteration** ...
-
-<br>
-
-... cannot instantiate $\alpha \defeq \reft{v}{\Int}{v = n + m}$
-</div>
-
-<br>
-
-<div class="fragment">
-**Problem:** *Iteration-dependent* invariants...? &nbsp; &nbsp; [[Continue]](04_AbstractRefinements.lhs.slides.html)
-</div>
-
diff --git a/docs/slides/BOS14/lhs/04_AbstractRefinements.lhs b/docs/slides/BOS14/lhs/04_AbstractRefinements.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/04_AbstractRefinements.lhs
+++ /dev/null
@@ -1,281 +0,0 @@
-  {#abstractrefinements}
-========================
-
-<div class="hidden">
-
-\begin{code}
-module AbstractRefinements where
-
-import Prelude 
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
--- o,no        :: Int
-maxInt       :: Int -> Int -> Int
-\end{code}
-</div>
-
-
-Abstract Refinements
---------------------
-
-Abstract Refinements
-====================
-
-A Pervasive Problem
---------------------
-
-<br>
-
-<div class="fragment">
-
-Cannot use *context-independent* specifications.
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-Lets distill it to a simple example...
-
-</div>
-
-
-A Pervasive Problem
---------------------
-
-
-<br>
-
-(First, a few aliases)
-
-<br>
-
-\begin{code}
-{-@ type Odd  = {v:Int | (v mod 2) = 1} @-}
-{-@ type Even = {v:Int | (v mod 2) = 0} @-}
-\end{code}
-
-
-
-Example: `maxInt` 
------------------
-
-Compute the larger of two `Int`s:
-
-\begin{spec} <br> 
-maxInt     :: Int -> Int -> Int 
-maxInt x y = if y <= x then x else y
-\end{spec}
-
-
-
-Example: `maxInt` 
------------------
-
-Has **many incomparable** refinement types/summaries
-
-\begin{spec}<br>
-maxInt :: Nat  -> Nat  -> Nat
-maxInt :: Even -> Even -> Even
-maxInt :: Odd  -> Odd  -> Odd 
-\end{spec}
-
-<br>
-
-<div class="fragment">*Which* should we use?</div>
-
-
-Refinement Polymorphism 
------------------------
-
-`maxInt` returns **one of** its two inputs `x` and `y` 
-
-<div class="fragment">
-
-<div align="center">
-
-<br>
-
----------   ---   -------------------------------------------
-   **If**    :    the *inputs* satisfy a property  
-
- **Then**    :    the *output* satisfies that property
----------   ---   -------------------------------------------
-
-<br>
-
-</div>
-</div>
-
-<div class="fragment">Above holds **for all properties**!</div>
-
-<br>
-
-<div class="fragment"> 
-
-**Need to abstract properties over types**
-
-</div>
-
-Parametric Refinements 
-----------------------
-
-Enable *quantification over refinements* ...
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">Type says: **for any** `p` that is a property of `Int`, </div>
-
-- <div class="fragment">`max` **takes** two `Int`s that satisfy `p`,</div>
-
-- <div class="fragment">`max` **returns** an `Int` that satisfies `p`.</div>
-
-Parametric Refinements 
-----------------------
-
-Enable *quantification over refinements* ...
-
-<br>
-
-\begin{spec}<div/>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{spec}
-
-<br>
-
-[Key idea: ](http://goto.ucsd.edu/~rjhala/papers/abstract_refinement_types.html)
-&nbsp; `Int<p>` &nbsp; is just  &nbsp; $\reft{v}{\Int}{p(v)}$ 
-
-<br>
-
-Abstract Refinement is **uninterpreted function** in SMT logic
-
-Parametric Refinements 
-----------------------
-
-\begin{spec}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{spec}
-
-<br>
-
-**Check Implementation via SMT**
-
-Parametric Refinements 
-----------------------
-
-\begin{spec}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{spec}
-
-<br>
-
-**Check Implementation via SMT**
-
-<br>
-
-$$\begin{array}{rll}
-\ereft{x}{\Int}{p(x)},\ereft{y}{\Int}{p(y)} & \vdash \reftx{v}{v = y} & \subty \reftx{v}{p(v)} \\
-\ereft{x}{\Int}{p(x)},\ereft{y}{\Int}{p(y)} & \vdash \reftx{v}{v = x} & \subty \reftx{v}{p(v)} \\
-\end{array}$$
-
-Parametric Refinements 
-----------------------
-
-\begin{spec}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{spec}
-
-<br>
-
-**Check Implementation via SMT**
-
-<br>
-
-$$\begin{array}{rll}
-{p(x)} \wedge {p(y)} & \Rightarrow {v = y} & \Rightarrow {p(v)} \\
-{p(x)} \wedge {p(y)} & \Rightarrow {v = x} & \Rightarrow {p(v)} \\
-\end{array}$$
-
-
-Using Abstract Refinements
---------------------------
-
-- <div class="fragment">**If** we call `maxInt` with args satisfying *common property*,</div>
-- <div class="fragment">**Then** `p` instantiated property, *result* gets same property.</div>
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ xo :: Odd  @-}
-xo = maxInt 3 7     -- p := \v -> Odd v 
-
-{-@ xe :: Even @-}
-xe = maxInt 2 8     -- p := \v -> Even v 
-\end{code}
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Automatically Infer Instantiation by Liquid Typing**
-<!-- CUT At call-site, instantiate `p` with unknown $\kvar{p}$ and solve! -->
-
-</div>
-
-Using Abstract Refinements
---------------------------
-
-<br>
-<br>
-<br>
-
-[DEMO 02_AbstractRefinements.hs](../hs/02_AbstractRefinements.hs)
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. **Abstract Refinements** over functions 
-
-<br>
-<br>
-
-<div class="fragment">
-  Abstract Refinements decouple invariants from **code** ...
-<br>
-
-<a href="06_Inductive.lhs.slides.html" target="_blank">[continue]</a>
-</div>
-
diff --git a/docs/slides/BOS14/lhs/05_Composition.lhs b/docs/slides/BOS14/lhs/05_Composition.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/05_Composition.lhs
+++ /dev/null
@@ -1,161 +0,0 @@
-Abstract Refinements {#composition}
-===================================
-
-Very General Mechanism 
-----------------------
-
-**Next:** Lets add parameters...
-
-<div class="hidden">
-\begin{code}
-module Composition where
-
-import Prelude hiding ((.))
-
-plus     :: Int -> Int -> Int
-plus3'   :: Int -> Int
-\end{code}
-</div>
-
-
-Example: `plus`
----------------
-
-\begin{code}
-{-@ plus :: x:_ -> y:_ -> {v:_ | v=x+y} @-}
-plus x y = x + y
-\end{code}
-
-
-Example: `plus 3` 
------------------
-
-<br>
-
-\begin{code}
-{-@ plus3' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3'     = plus 3
-\end{code}
-
-<br>
-
-Easily verified by LiquidHaskell
-
-A Composed Variant
-------------------
-
-Lets define `plus3` by *composition*
-
-A Composition Operator 
-----------------------
-
-\begin{code}
-(#) :: (b -> c) -> (a -> b) -> a -> c
-(#) f g x = f (g x)
-\end{code}
-
-
-`plus3` By Composition
------------------------
-
-\begin{code}
-{-@ plus3'' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3''     = plus 1 # plus 2
-\end{code}
-
-<br>
-
-Yikes! Verification *fails*. But why?
-
-<br>
-
-<div class="fragment">(Hover mouse over `#` for a clue)</div>
-
-How to type compose (#) ? 
--------------------------
-
-This specification is *too weak* <br>
-
-\begin{spec} <br>
-(#) :: (b -> c) -> (a -> b) -> (a -> c)
-\end{spec}
-
-<br>
-
-Output type does not *relate* `c` with `a`!
-
-How to type compose (.) ?
--------------------------
-
-Write specification with abstract refinement type:
-
-<br>
-
-\begin{code}
-{-@ (.) :: forall <p :: b->c->Prop, 
-                   q :: a->b->Prop>.
-             f:(x:b -> c<p x>) 
-          -> g:(x:a -> b<q x>) 
-          -> y:a -> exists[z:b<q y>].c<p z>
- @-}
-(.) f g y = f (g y)
-\end{code}
-
-Using (.) Operator 
-------------------
-
-<br>
-
-\begin{code}
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br>
-
-<div class="fragment">*Verifies!*</div>
-
-
-Using (.) Operator 
-------------------
-
-\begin{spec} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{spec}
-
-<br>
-
-LiquidHaskell *instantiates*
-
-- `p` with `\x -> v = x + 1`
-- `q` with `\x -> v = x + 2`
-
-Using (.) Operator 
-------------------
-
-\begin{spec} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{spec}
-
-<br> To *infer* that output of `plus3` has type: 
-
-`exists [z:{v = y + 2}].{v = z + 1}`
-
-<div class="fragment">
-
-`<:`
-
-`{v:Int|v=3}`
-</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract:** Refinements over Type Signatures
-    + <div class="fragment">*Dependencies* using refinement parameters</div>
diff --git a/docs/slides/BOS14/lhs/06_Inductive.lhs b/docs/slides/BOS14/lhs/06_Inductive.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/06_Inductive.lhs
+++ /dev/null
@@ -1,535 +0,0 @@
-Abstract Refinements {#induction}
-=================================
-
-Decoupling Invariants & Code
-----------------------------
-
-<br>
-
-Abstract refinements decouple invariants from code
-
-<br>
-
-<div class="fragment">
-
-**Next:** Precise Specifications for HOFs
-
-<div class="hidden">
-
-\begin{code}
-module Loop where
-import Prelude hiding ((!!), foldr, length, (++))
-import Data.Set hiding (insert, foldr,size,filter, append) 
-
--- import Measures
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names" @-}
-
-{-@ measure size  :: (L a) -> Int
-    size (N)      = 0
-    size (C x xs) = 1 + (size xs)  @-}
-
-{-@ measure elems :: L a -> (Set a)
-    elems (N)      = (Set_empty 0)
-    elems (C x xs) = (Set_cup (Set_sng x) (elems xs))
-  @-}
-
-{-@ type UnElems Xs Ys = {v:_ | elems v = Set_cup (elems Xs) (elems Ys)} @-}
-
-size  :: L a -> Int
-add    :: Int -> Int -> Int
-loop   :: Int -> Int -> α -> (Int -> α -> α) -> α
-ifoldr :: (L a -> a -> b -> b) -> b -> L a -> b
-
-\end{code}
-</div>
-
-<!-- BEGIN CUT
-
-Induction
-=========
-
-Example: A Higher Order `loop` 
--------------------------------
-
-
-<br>
-<br>
-
-\begin{code}
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-
-Iteration Dependence
---------------------
-
-We can use `loop` to write 
-
-<br>
-
-\begin{spec} 
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop' 0 m n (\_ i -> i + 1)
-\end{spec}
-
-<br>
-
-<div class="fragment">
-
-**Problem** But cannot prove `add n m :: {v:_ | v = n + m}`
-
-- As property only holds after *last* loop iteration...
-
-- ... cannot instantiate `α` with `{v:Int | v = n + m}`
-
-</div>
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-<br>
-
-\begin{spec} 
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{spec}
-
-<br>
-
-**Problem** 
-
-Need invariant relating *iteration* `i` with *accumulator* `acc`
-
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{spec} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{spec}
-
-<br>
-
-**Solution** 
-
-- Abstract Refinement `p :: Int -> a -> Prop`
-
-- `(p i acc)` relates *iteration* `i` with *accumulator* `acc`
-
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-<div class="fragment">
-<div align="center">
-
-------------  ---   ----------------------------
-  **Assume**   :    `out = loop lo hi base f` 
-
-   **Prove**   :    `(p hi out)`
-------------  ---   ----------------------------
-
-</div>
-</div>
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{spec} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{spec}
-
-<br>
-
-**Base Case:** &nbsp; Initial accumulator `base` satisfies invariant
-
-
-`(p lo base)`   
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{spec} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{spec}
-
-<br>
-
-**Inductive Step:** &nbsp; `f` *preserves* invariant at `i`
-
-
-`(p i acc) => (p (i+1) (f i acc))`
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{spec} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{spec}
-
-<br>
-
-**"By Induction"** &nbsp; `out` satisfies invariant at `hi` 
-
-`(p hi out)`
-
-
-Induction in `loop` (by type)
------------------------------
-
-Induction is an **abstract refinement type** for `loop` 
-
-<br>
-
-\begin{code}
-{-@ loop :: forall a <p :: Int -> a -> Prop>.
-        lo:Int
-     -> hi:{Int | lo <= hi}
-     -> base:a<p lo>                      
-     -> f:(i:Int -> a<p i> -> a<p (i+1)>) 
-     -> a<p hi>                           @-}
-\end{code}
-
-<br>
-
-Induction in `loop` (by type)
------------------------------
-
-`p` is the *index dependent* invariant!
-
-
-\begin{spec}<br> 
-p    :: Int -> a -> Prop             -- invt 
-base :: a<p lo>                      -- base 
-f    :: i:Int -> a<p i> -> a<p(i+1)> -- step
-out  :: a<p hi>                      -- goal
-\end{spec}
-
-
-
-Using Induction
----------------
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br>
-
-**Verified** by *instantiating* the abstract refinement of `loop`
-
-`p := \i acc -> acc = i + n`
-
-
-Generalizes To Structures 
--------------------------
-
-Same idea applies for induction over *structures* ...
-
-<br>
-<br>
-
-[DEMO 02_AbstractRefinements.hs #2](../hs/02_AbstractRefinements.hs) 
-
-
-END CUT -->
-
-
-Structural Induction
-====================
-
-Example: Lists
---------------
-
-<br>
-
-\begin{code}
-data L a = N 
-         | C a (L a)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets write a generic loop over lists ...
-</div>
-
-
-Example: `foldr`
-----------------
-
-<br>
-<br>
-
-\begin{code}
-foldr :: (α -> β -> β) -> β -> L α -> β
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
-\end{code}
-
-
-Problem
--------
-
-Recall our *failed attempt* to write `append` with `foldr`
-
-<br>
-
-\begin{spec} 
-{-@ app :: xs:_ -> ys:_ -> UnElems xs ys @-}
-app xs ys = foldr C ys xs
-\end{spec}
-
-<br>
-
-<div class="fragment">
-- Property holds after *last* iteration
-- Cannot instantiate `α` with `UnElems xs ys`
-</div>
-
-Problem
--------
-
-Recall our *failed attempt* to write `append` with `foldr`
-
-<br>
-
-\begin{spec} 
-{-@ app :: xs:_ -> ys:_ -> UnElems xs ys @-}
-app xs ys = foldr C ys xs
-\end{spec}
-
-
-<br>
-
-Need to **relate** each *iteration* with *accumulator* `acc` 
-
-
-
-
-Solution: Inductive `foldr`
----------------------------
-
-<br>
-<br>
-
-<div class="fragment">
-Lets brace ourselves for the type...
-</div>
-
-Solution: Inductive `foldr`
----------------------------
-
-\begin{code}
-{-@ ifoldr :: 
-     forall a b <p :: L a -> b -> Prop>. 
-      (xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)>) 
-    -> b<p N> 
-    -> ys:L a
-    -> b<p ys>                            @-}
-ifoldr f b N        = b
-ifoldr f b (C x xs) = f xs x (ifoldr f b xs)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets step through the type...
-</div>
-
-
-`ifoldr`: Abstract Refinement
------------------------------
-
-\begin{spec} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  ::  b<p ys>                            
-\end{spec}
-
-<br>
-
-`(p xs b)` relates `b` with **folded** `xs`
-
-`p :: L a -> b -> Prop`
-
-
-`ifoldr`: Base Case
--------------------
-
-\begin{spec} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{spec}
-
-<br>
-
-`base` is related to **empty** list `N`
-
-`base :: b<p N>` 
-
-
-
-`ifoldr`: Ind. Step 
--------------------
-
-\begin{spec} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{spec}
-
-<br>
-
-`step` **extends** relation from `xs` to `C x xs`
-
-`step :: xs:_ -> x:_ -> b<p xs> -> b<p (C x xs)>`
-
-
-`ifoldr`: Output
-----------------
-
-\begin{spec} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{spec}
-
-<br>
-
-Hence, relation holds between `out` and **entire input** list `ys`
-
-`out :: b<p ys>`
-
-Using `ifoldr`: Size
--------------------
-
-We can now verify
-
-<br>
-
-\begin{code}
-{-@ size :: xs:_ -> {v:Int| v = size xs} @-}
-size     = ifoldr (\_ _ n -> n + 1) 0
-\end{code}
-
-<br>
-
-<div class="fragment">
-by *automatically instantiating* `p` with
-
-`\xs acc -> acc = size xs`
-</div>
-
-Using `foldr`: Append
----------------------
-
-We can now verify
-
-<br>
-
-\begin{code}
-{-@ (++) :: xs:_ -> ys:_ -> UnElems xs ys @-} 
-xs ++ ys = ifoldr (\_ -> C) ys xs 
-\end{code}
-
-<br>
-
-<br>
-
-<div class="fragment">
-By *automatically* instantiating `p` with
-
-`\xs acc -> elems acc = Set_cup (elems xs) (elems ys)`
-
-</div>
-
-More Examples
--------------
-
-Induction over *structures* from `GHC.List`
-
-<br>
-
-+ `length`
-+ `append`
-+ `filter`
-+ ...
-
-<br>
-
-[DEMO 02_AbstractRefinements.hs #2](../hs/02_AbstractRefinements.hs) 
-
-
-
-Recap
------
-
-<br>
-
-Abstract refinements *decouple* **invariant** from **iteration**
-
-<br>
-
-<div class="fragment">**Precise** specs for higher-order functions.</div>
-
-<br>
-
-<div class="fragment">**Automatic** checking and instantiation by SMT.</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over Type Signatures
-    + <div class="fragment">**Functions**</div>
-    + <div class="fragment">**Recursive Data** <a href="08_Recursive.lhs.slides.html" target="_blank">[continue]</a></div>
-5. <div class="fragment">[Evaluation](11_Evaluation.lhs.slides.html)</div>
diff --git a/docs/slides/BOS14/lhs/07_Array.lhs b/docs/slides/BOS14/lhs/07_Array.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/07_Array.lhs
+++ /dev/null
@@ -1,305 +0,0 @@
-Abstract Refinements {#data}
-============================
-
-Recap
------
-
-<br>
-
-**So far**
-
-Abstract Refinements decouple invariants from *functions*
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-Decouple invariants from *indexed data structures*
-
-</div>
-
-
-
-Decouple Invariants From Data {#vector} 
-=======================================
-
-Example: Vectors 
-----------------
-
-<div class="hidden">
-\begin{code}
-module LiquidArray where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume, liquidError)
-
-{-@ LIQUID "--no-termination" @-}
-initialize :: Int -> Vec Int
-\end{code}
-</div>
-
-<div class="fragment">
-
-For simplicity, implemented as maps from `Int` to `a` 
-
-<br>
-
-\begin{code}
-data Vec a = V (Int -> a)
-\end{code}
-
-</div>
-
-
-Abstract *Domain* and *Range*
------------------------------
-
-Parameterize type with *two* abstract refinements:
-
-<br>
-
-\begin{code}
-{-@ data Vec a < dom :: Int -> Prop,
-                 rng :: Int -> a -> Prop >
-      = V {a :: i:Int<dom> -> a <rng i>}  @-}
-\end{code}
-
-<br>
-
-- `dom`: *domain* on which `Vec` is *defined* 
-
-- `rng`: *range*  and relationship with *index*
-
-Abstract *Domain* and *Range*
------------------------------
-
-Diverse `Vec`tors by *instantiating* `dom` and `rng`
-
-<br>
-
-<div class="fragment">
-
-An alias for *segments* between `I` and `J`
-
-<br>
-
-\begin{code}
-{-@ predicate Btwn I V J = I <= V && V < J @-}
-\end{code}
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type IdVec N = Vec <{\v -> Btwn 0 v N}, 
-                        {\k v -> v = k}> 
-                       Int                  @-}
-\end{code}
-
-</div>
-
-
-Ex: Zero-Terminated Vectors
----------------------------
-
-Defined between `[0..N)`, with *last* element equal to `0`:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type ZeroTerm N = 
-     Vec <{\v -> Btwn 0 v N}, 
-          {\k v -> k = N-1 => v = 0}> 
-          Int                         @-}
-\end{code}
-
-</div>
-
-Ex: Fibonacci Table 
--------------------
-
-A vector whose value at index `k` is either 
-
-- `0` (undefined), or, 
-
-- `k`th fibonacci number 
-
-\begin{code}
-{-@ type FibV =  
-     Vec <{\v -> true}, 
-          {\k v -> v = 0 || v = fib k}> 
-          Int                          @-}
-\end{code}
-
-
-An API for Vectors
-------------------
-
-
-<br>
-<br>
-
-- `empty`
-
-- `set`
-
-- `get`
-
-
-API: Empty Vectors
------------------
-
-`empty` a Vector whose domain is `false` (defined at *no* key)
-
-<br>
-
-\begin{code}
-{-@ empty :: forall <p :: Int -> a -> Prop>. 
-               Vec <{v:Int|false}, p> a     @-}
-
-empty     = V $ \_ -> error "empty vector!"
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-What would happen if we changed `false` to `true`?
-</div>
-
-API: `get` Key's Value 
-----------------------
-
-- *Input* `key` in *domain*
-
-- *Output* value in *range* related with `k`
-
-<br>
-
-\begin{code}
-{-@ get :: forall a <d :: Int -> Prop,  
-                     r :: Int -> a -> Prop>.
-           key:Int <d>
-        -> vec:Vec <d, r> a
-        -> a<r key>                        @-}
-
-get k (V f) = f k
-\end{code}
-
-
-API: `set` Key's Value 
-----------------------
-
-- <div class="fragment">Input `key` in *domain*</div>
-
-- <div class="fragment">Input `val` in *range* related with `key`</div>
-
-- <div class="fragment">Input `vec` defined at *domain except at* `key`</div>
-
-- <div class="fragment">Output domain *includes* `key`</div>
-
-API: `set` Key's Value 
-----------------------
-
-\begin{code}
-{-@ set :: forall a <d :: Int -> Prop,
-                     r :: Int -> a -> Prop>.
-           key: Int<d> -> val: a<r key>
-        -> vec: Vec<{v:Int<d>| v /= key},r> a
-        -> Vec <d, r> a                     @-}
-
-set key val (V f) = V $ \k -> if k == key 
-                                then val 
-                                else f k
-\end{code}
-
-<br>
-
-<div class="hidden">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-Help! Can you spot and fix the errors? 
-</div>
-
-Using the Vector API
---------------------
-
-Loop over vector, setting each key `i` equal to `i`:
-
-<br>
-
-\begin{code}
-{-@ initialize :: n:Nat -> IdVec n @-}
-initialize n      = loop 0 empty
-  where
-    loop i a 
-      | i < n     = let a' = set i i a
-                    in
-                        loop (i+1) a'
-      | otherwise = a 
-\end{code}
-
-Example: Knuth-Morris-Pratt
----------------------------
-
-<br>
-<br>
-<br>
-
-[DEMO KMP.hs](../hs/KMP.hs)
-
-
-Recap
------
-
-<br>
-
-+ Created a `Vec` (Array) container 
-
-+ Decoupled *domain* and *range* invariants from *data*
-
-+ Enabled analysis of *array segments*
-
-<br>
-
-Recap
------
-
-<br>
-
-Custom *array segment* program analyses: 
-
-<br>
-
-- Gopan-Reps-Sagiv, POPL 05
-- J.-McMillan, CAV 07
-- Logozzo-Cousot-Cousot, POPL 11
-- Dillig-Dillig, POPL 12 
-
-<br>
-
-Encoded in (abstract) refinement typed API.
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over Type Signatures
-    + Functions
-    + Recursive Data
-    + <div class="fragment">**Indexed Data**</div>
-
-<div class="fragment">[[continue...]](11_Evaluation.lhs.slides.html)</div>
diff --git a/docs/slides/BOS14/lhs/08_Recursive.lhs b/docs/slides/BOS14/lhs/08_Recursive.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/08_Recursive.lhs
+++ /dev/null
@@ -1,495 +0,0 @@
-Abstract Refinements {#data}
-============================
-
-Recap
------
-
-**So far**
-
-Abstract Invariants from Functions
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-Decouple invariants from **recursive** data structures
-</div>
-
-
-
-Decouple Invariants From Data {#recursive} 
-==========================================
-
- {#asd}
--------
-
-Recursive Structures 
---------------------
-
-Lets see another example of decoupling...
-
-<div class="hidden">
-\begin{code}
-{-# LANGUAGE NoMonomorphismRestriction #-}
-
-module List (insertSort) where
-
-{-@ LIQUID "--no-termination" @-}
-
-mergeSort     :: Ord a => [a] -> [a]
-insertSort :: (Ord a) => [a] -> L a 
-slist :: L Int
-slist' :: L Int
-iGoUp, iGoDn, iDiff :: [Int]
-infixr `C`
-\end{code}
-</div>
-
-Decouple Invariants From Recursive Data
-=======================================
-
-Recall: Lists
--------------
-
-\begin{code}
-data L a = N 
-         | C { hd :: a, tl :: L a }
-\end{code}
-
-
-Recall: Refined Constructors 
-----------------------------
-
-Define **increasing** Lists with *strengthened constructors*:
-
-\begin{spec} <br>
-data L a where
-  N :: L a
-  C :: hd:a -> tl: L {v:a | hd <= v} -> L a
-\end{spec}
-
-Problem: Decreasing Lists?
---------------------------
-
-What if we need *both* [increasing *and* decreasing lists?](http://hackage.haskell.org/package/base-4.7.0.0/docs/src/Data-List.html#sort)
-
-<br>
-
-<div class="hidden">
-[Separate (indexed) types](http://web.cecs.pdx.edu/~sheard/Code/QSort.html) get quite complicated ...
-</div>
-
-Abstract That Refinement!
--------------------------
-
-\begin{code}
-{-@ data L a <p :: a -> a -> Prop>
-      = N 
-      | C { hd :: a, tl :: L <p> a<p hd> } @-}
-\end{code}
-
-<br>
-
-<div class="fragment"> `p` is a **binary relation** between two `a` values</div>
-
-<br>
-
-<div class="fragment"> Definition relates `hd` with **all** the elements of `tl`</div>
-
-<br>
-
-<div class="fragment"> Recursive: `p` holds for **every pair** of elements!</div>
-
-Example
--------
-
-Consider a list with *three* or more elements 
-
-\begin{spec} <br>
-x1 `C` x2 `C` x3 `C` rest :: L <p> a 
-\end{spec}
-
-Example: Unfold Once
---------------------
-
-\begin{spec} <br> 
-x1                 :: a
-x2 `C` x3 `C` rest :: L <p> a<p x1> 
-\end{spec}
-
-Example: Unfold Twice
----------------------
-
-\begin{spec} <br> 
-x1          :: a
-x2          :: a<p x1>  
-x3 `C` rest :: L <p> a<p x1 && p x2> 
-\end{spec}
-
-Example: Unfold Thrice
-----------------------
-
-\begin{spec} <br> 
-x1   :: a
-x2   :: a<p x1>  
-x3   :: a<p x1 && p x2>  
-rest :: L <p> a<p x1 && p x2 && p x3> 
-\end{spec}
-
-<br>
-
-<div class="fragment">
-Note how `p` holds between **every pair** of elements in the list. 
-</div>
-
-A Concrete Example
-------------------
-
-That was a rather *abstract*!
-
-<br>
-
-How can we *use* fact that `p` holds between *every pair*?
-
-<br>
-
-<div class="fragment">**Instantiate** `p` with a *concrete* refinement</div>
-
-
-
-Example: Increasing Lists
--------------------------
-
-**Instantiate** `p` with a *concrete* refinement
-
-<br>
-
-\begin{code}
-{-@ type IncL a = L <{\hd v -> hd <= v}> a @-}
-\end{code}
-
-<br>
-
-<div class="fragment"> Refinement says: &nbsp; `hd` less than **every** `v` in tail,</div>
-
-<br>
-
-<div class="fragment"> i.e., `IncL` denotes **increasing** lists. </div>
-
-<br>
-
-<div class="fragment"> [DEMO 02_AbstractRefinements.hs #3](02_AbstractRefinements.hs) </div>
-
-<!-- BEGIN CUT 
-
-Example: Increasing Lists
--------------------------
-
-LiquidHaskell *verifies* that `slist` is indeed increasing...
-
-\begin{code}
-{-@ slist :: IncL Int @-}
-slist     = 1 `C` 6 `C` 12 `C` N
-\end{code}
-
-<br> 
-
-<div class="fragment">
-
-... and *protests* that `slist'` is not: 
-
-\begin{code}
-{-@ slist' :: IncL Int @-}
-slist' = 6 `C` 1 `C` 12 `C` N
-\end{code}
-</div>
-
-Insertion Sort
---------------
-
-\begin{code}
-{-@ insertSort :: (Ord a) => [a] -> IncL a @-}
-insertSort     = foldr insert N
-
-insert y N          = y `C` N
-insert y (x `C` xs) 
-  | y < x           = y `C` (x `C` xs)
-  | otherwise       = x `C` insert y xs
-\end{code}
-
-<br>
-
-(Mouseover `insert` to see inferred type.)
-
-Checking GHC Lists
-------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target= "_blank">Demo:</a> 
-Above applies to GHC's List definition:
-
-\begin{spec} <br> 
-data [a] <p :: a -> a -> Prop>
-  = [] 
-  | (:) { h :: a, tl :: [a<p h>]<p> }
-\end{spec}
-
-Checking GHC Lists
-------------------
-
-Increasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Incs a = [a]<{\h v -> h <= v}> @-}
-
-{-@ iGoUp :: Incs Int @-}
-iGoUp     = [1,2,3]
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Decreasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Decs a = [a]<{\h v -> h >= v}> @-}
-
-{-@ iGoDn :: Decs Int @-}
-iGoDn     = [3,2,1]
-\end{code}
-
-
-Checking GHC Lists
-------------------
-
-Duplicate-free Lists
-
-<br>
-
-\begin{code}
-{-@ type Difs a = [a]<{\h v -> h /= v}> @-}
-
-{-@ iDiff :: Difs Int @-}
-iDiff     = [1,3,2]
-\end{code}
-
-END CUT -->
-
-Example: Sorting Lists
-----------------------
-
-Now we can check all the usual list sorting algorithms 
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target="_blank">Demo:</a> List Sorting
-
-<br>
-<br>
-
-[DEMO GhcListSort.hs](../hs/GhcListSort.hs)
-
-<!-- BEGIN CUT 
-
-Example: `mergeSort` [1/2]
---------------------------
-
-\begin{code}
-{-@ mergeSort  :: (Ord a) => [a] -> Incs a @-}
-mergeSort []   = []
-mergeSort [x]  = [x]
-mergeSort xs   = merge xs1' xs2' 
-  where 
-   (xs1, xs2)  = split xs
-   xs1'        = mergeSort xs1
-   xs2'        = mergeSort xs2
-\end{code}
-
-Example: `mergeSort` [2/2]
---------------------------
-
-\begin{code}
-split (x:y:zs) = (x:xs, y:ys) 
-  where 
-    (xs, ys)   = split zs
-split xs       = (xs, [])
-
-merge xs []    = xs
-merge [] ys    = ys
-merge (x:xs) (y:ys) 
-  | x <= y     = x : merge xs (y:ys)
-  | otherwise  = y : merge (x:xs) ys
-\end{code}
-
-END CUT -->
-
-Example: Binary Trees
----------------------
-
-`Map` from keys of type `k` to values of type `a` 
-
-<br>
-
-<div class="fragment">
-
-Implemented, as a binary tree:
-
-<br>
-
-\begin{code}
-data Map k a = Tip
-             | Bin Int k a (Map k a) (Map k a)
-\end{code}
-</div>
-
-Two Abstract Refinements
-------------------------
-
-- `l` : relates root `key` with `left`-subtree keys
-- `r` : relates root `key` with `right`-subtree keys
-
-<br>
-
-\begin{code}
-{-@ data Map k a < l :: k -> k -> Prop
-                 , r :: k -> k -> Prop >
-    = Tip
-    | Bin { sz    :: Int
-          , key   :: k
-          , val   :: a
-          , left  :: Map <l,r> k<l key> a
-          , right :: Map <l,r> k<r key> a} @-}
-\end{code}
-
-
-Ex: Binary Search Trees
------------------------
-
-Keys are *Binary-Search* Ordered
-
-<br>
-
-\begin{code}
-{-@ type BST k a = 
-      Map <{\r v -> v < r }, 
-           {\r v -> v > r }> 
-          k a                   @-}
-\end{code}
-
-Ex: Minimum Heaps 
------------------
-
-Root contains *minimum* value
-
-<br>
-
-\begin{code}
-{-@ type MinHeap k a = 
-      Map <{\r v -> r <= v}, 
-           {\r v -> r <= v}> 
-           k a               @-}
-\end{code}
-
-Ex: Maximum Heaps 
------------------
-
-Root contains *maximum* value
-
-<br>
-
-\begin{code}
-{-@ type MaxHeap k a = 
-      Map <{\r v -> r >= v}, 
-           {\r v -> r >= v}> 
-           k a               @-}
-\end{code}
-
-
-Example: Data.Map
------------------
-
-Standard Key-Value container
-
-<br>
-
-- <div class="fragment">1300+ non-comment lines</div>
-
-- <div class="fragment">`insert`, `split`, `merge`,...</div>
-
-- <div class="fragment">Rotation, Rebalance,...</div>
-
-<br>
-
-<div class="fragment">
-SMT & inference crucial for [verification](https://github.com/ucsd-progsys/liquidhaskell/blob/master/benchmarks/esop2013-submission/Base.hs)
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Map.hs" target="_blank">Demo:</a> Binary Search Maps
-</div>
-
-Example: Red-Black Tree 
------------------------
-
-<br>
-
-Binary-Search Ordered Keys
-
-<br>
-
-[DEMO RBTree-Ord.hs](../hs/RBTree-ord.hs)
-Example: Infinite Streams 
--------------------------
-
-<br>
-
-How to distinguish between **finite** and **infinite** lists?
-
-<br>
-
-[DEMO Streams.hs](../hs/Streams.hs)
-
-
-Recap: Abstract Refinements
----------------------------
-
-<div class="fragment">
-
-Decouple invariants from **functions**
-
-+ `max`
-+ `foldr`
-
-</div>
-
-<br>
-
-<div class="fragment">
-Decouple invariants from **data**
-
-+ `List`
-+ `Tree`
-
-</div>
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract Refinements over Functions
-5. **Abstract** Refinements over Recursive Data
-6. <div class="fragment">[Evaluation](11_Evaluation.lhs.slides.html)</div>
-<br>
-<br>
-
-<div class="fragment">[[continue...]](11_Evaluation.lhs.slides.html)</div>
diff --git a/docs/slides/BOS14/lhs/09_Laziness.lhs b/docs/slides/BOS14/lhs/09_Laziness.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/09_Laziness.lhs
+++ /dev/null
@@ -1,241 +0,0 @@
- {#laziness}
-============
-
-<div class="hidden">
-\begin{code}
-module Laziness where
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ LIQUID "--no-termination" @-}
-
-safeDiv :: Int -> Int -> Int
-foo     :: Int -> Int
--- zero    :: Int 
--- diverge :: a -> b
-\end{code}
-</div>
-
-
-Lazy Evaluation?
-----------------
-
-
-Lazy Evaluation
-===============
-
-SMT based Verification
-----------------------
-
-Techniques developed for **strict** languages
-
-<br>
-
-<div class="fragment">
-
------------------------   ---   ------------------------------------------
-        **Floyd-Hoare**    :    `ESCJava`, `SpecSharp` ...
-     **Model Checkers**    :    `Slam`, `Blast` ...
-   **Refinement Types**    :    `DML`, `Stardust`, `Sage`, `F7`, `F*`, ...
------------------------   ---   ------------------------------------------
-
-</div>
-
-<br>
-
-<div class="fragment">
-Surely soundness carries over to Haskell, right?
-</div>
-
-
-Back To the Beginning
----------------------
-
-\begin{code}
-{-@ safeDiv :: _ -> {v:_ |v /= 0} -> Int @-}
-safeDiv n 0 = liquidError "div-by-zero!"
-safeDiv n d = n `div` d
-\end{code}
-
-<br>
-
-<div class="fragment">
-Should only call `safeDiv` with **non-zero** values
-</div>
-
-An Innocent Function
---------------------
-
-`foo` returns a value **strictly less than** input.
-
-<br>
-
-\begin{spec}
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-\end{spec}
-
-LiquidHaskell Lies! 
--------------------
-
-\begin{code}
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0    
-              a = foo z
-          in  
-              (\x -> 2014 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-<div class="fragment">
-Why is this program **deemed safe**?! 
-</div>
-
-
-*Is Safe* With Eager Eval
--------------------------
-
-\begin{spec}
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2014 `safeDiv` z) a 
-\end{spec}
-
-<br>
-
-**Safe** in Java, ML: program **never hits** divide-by-zero 
-
-*Unsafe* With Lazy Eval
------------------------
-
-\begin{spec} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2014 `safeDiv` z) a 
-\end{spec}
-
-<br>
-
-**Unsafe** in Haskell: skips `foo z` **hits** divide-by-zero!
-
-Problem: Divergence
--------------------
-
-What is denoted by:
-
-$$ e :: \reft{v}{\Int}{p}$$
-
-<br>
-
-<div class="fragment">
-$e$ evaluates to $\Int$ that satisfies $p$  
-</div>
-
-<div class="fragment">
-or
-
-**diverges**! 
-</div>
-
-<div class="fragment">
-<br>
-
-Classical Floyd-Hoare notion of [partial correctness](http://en.wikipedia.org/wiki/Hoare_logic#Partial_and_total_correctness)
-
-</div>
-
-
-
-Problem: Divergence
--------------------
-
-\begin{spec} **Consider** <div/> 
-        {-@ e :: {v : Int | P} @-}
-
-        let x = e in body 
-\end{spec}
-
-<br>
-
-<div class="fragment">
-**Eager Evaluation** 
-
-*Can* assume `P(x)` when checking `body`
-</div>
-
-<br>
-
-<div class="fragment">
-**Lazy Evaluation** 
-
-*Cannot* assume `P(x)` when checking `body`
-</div>
-
-Eager vs. Lazy Binders 
-----------------------
-
-\begin{spec} 
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2014 `safeDiv` z) a 
-\end{spec}
-
-<br>
-
-Inconsistent `a` is sound for **eager**, unsound for **lazy**
-
-
-Panic! Now what?
----------------
-
-<div class="fragment">
-**Solution** 
-
-Assign *non-trivial* refinements to *non-diverging* terms!
-</div>
-
-<br>
-
-<div class="fragment">
-**Harder Problem?**
-
-Yikes, doesn't non-divergence mean tracking *permination?*
-</div>
-
-<br>
-
-<div class="fragment">
-**Relax**
-
-Its *easy* ... since we have *refinements*! [[continue...]](10_Termination.lhs.slides.html)
-</div>
-
-<br>
-
-
-
diff --git a/docs/slides/BOS14/lhs/10_Termination.lhs b/docs/slides/BOS14/lhs/10_Termination.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/10_Termination.lhs
+++ /dev/null
@@ -1,336 +0,0 @@
-Termination {#termination}
-==========================
-
-
-<div class="hidden">
-\begin{code}
-module Termination where
-
-import Prelude hiding (gcd, mod, map)
-fib :: Int -> Int
-gcd :: Int -> Int -> Int
-infixr `C`
-
-data L a = N | C a (L a)
-
-{-@ invariant {v: L a | 0 <= llen v} @-}
-
-mod :: Int -> Int -> Int
-mod a b
-  | a - b >  b = mod (a - b) b
-  | a - b <  b = a - b
-  | a - b == b = 0
-
-merge :: Ord a => L a -> L a -> L a
-\end{code}
-</div>
-
-<!-- BEGIN CUT
-
-Dependent != Refinement
------------------------
-
-<div class="fragment">**Dependent Types**</div>
-
-+ <div class="fragment">*Arbitrary terms* appear inside types</div> 
-+ <div class="fragment">Termination ensures well-defined</div>
-
-<br>
-
-<div class="fragment">**Refinement Types**</div>
-
-+ <div class="fragment">*Restricted refinements* appear in types</div>
-+ <div class="fragment">Termination *not* required ...</div> 
-+ <div class="fragment">... except, alas, with *lazy* evaluation!</div>
-
-END CUT -->
-
-Refinements & Termination
--------------------------
-
-<div class="fragment">
-Fortunately, we can ensure termination **using refinements**
-</div>
-
-
-Main Idea
----------
-
-Recursive calls must be on **smaller** inputs
-
-<br>
-
-+ [Turing](http://classes.soe.ucsc.edu/cmps210/Winter11/Papers/turing-1936.pdf)
-+ [Sized Types](http://dl.acm.org/citation.cfm?id=240882)
-+ [DML](http://dl.acm.org/citation.cfm?id=609232)
-+ [Size Change Principle](http://dl.acm.org/citation.cfm?id=360210)
-
-Recur On *Smaller* `Nat` 
-------------------------
-
-<div class="fragment">
-
-**To ensure termination of**
-
-\begin{spec} <div/>
-foo   :: Nat -> T
-foo x =  body
-\end{spec}
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:Nat | v < x} -> T`
-
-<br>
-
-*i.e.* require recursive calls have `Nat` inputs *smaller than* `x`
-</div>
-
-
-
-Ex: Recur On *Smaller* `Nat` 
-----------------------------
-
-\begin{code}
-{-@ fib  :: Nat -> Nat @-}
-fib 0    = 1
-fib 1    = 1
-fib n    = fib (n-1) + fib (n-2)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Terminates, as both `n-1` and `n-2` are `< n`
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=GCD.hs" target="_blank">Demo:</a> &nbsp; What if we drop the `fib 1` equation? 
-</div>
-
-Refinements Are Essential!
---------------------------
-
-\begin{code}
-{-@ gcd :: a:Nat -> {b:Nat | b < a} -> Int @-}
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Need refinements to prove `(a mod b) < b` at *recursive* call!
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ mod :: a:Nat 
-        -> b:{v:Nat|0 < v && v < a} 
-        -> {v:Nat| v < b}           @-}
-\end{code}
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-<br>
-
-What of input types other than `Nat` ?
-
-<br>
-
-[DEMO](../hs/03_Termination.hs)
-
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{spec}<div/>
-foo   :: S -> T
-foo x = body
-\end{spec}
-
-<br>
-
-<div class="fragment">
-**Reduce** to `Nat` case...
-</div>
-
-<br>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{spec}<div/>
-foo   :: S -> T
-foo x = body
-\end{spec}
-
-<br>
-
-Specify a **default measure** `mS :: S -> Int`
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:s | 0 <= mS v < mS x} -> T`
-</div>
-
-
-Ex: Recur on *smaller* `List`
------------------------------
-
-\begin{code} 
-map f N        = N
-map f (C x xs) = (f x) `C` (map f xs) 
-\end{code}
-
-<br>
-
-Terminates using **default** measure `llen` 
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ data L [llen] a = N 
-                    | C { x::a, xs :: L a} @-}
-
-{-@ measure llen :: L a -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)   @-}
-\end{code}
-</div>
-
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of smallness spread across **multiple inputs**?
-
-<br>
-
-\begin{code}
-merge xs@(x `C` xs') ys@(y `C` ys')
-  | x < y     = x `C` merge xs' ys
-  | otherwise = y `C` merge xs ys'
-\end{code}
-
-<br>
-
-<div class="fragment">
-Neither input decreases, but their **sum** does.
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-Neither input decreases, but their **sum** does.
-
-<br>
-
-\begin{code}
-{-@ merge :: Ord a => xs:_ -> ys:_ -> _ 
-          /  [llen xs + llen ys]     @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-Synthesize **ghost** parameter equal to `[...]`
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-... thereby reducing to decreasing **single parameter** case. 
-
-</div>
-
-Important Extensions 
---------------------
-
-<br>
-
-<div class="fragment">**Mutual** recursion</div>
-
-<br>
-
-<div class="fragment">**Lexicographic** ordering</div>
-
-<br>
-
-<div class="fragment">Fit easily into our framework ...</div>
-
-Recap
------
-
-Main idea: Recursive calls on **smaller** inputs
-
-<br>
-
-<div class="fragment">Use refinements to **check** smaller</div>
-
-<br>
-
-<div class="fragment">Use refinements to **establish** smaller</div>
-
-
-A Curious Circularity
----------------------
-
-<div class="fragment">Refinements require termination ...</div> 
-
-<br>
-
-<div class="fragment">... Termination requires refinements!</div>
-
-<br>
-
-<div class="fragment"> Meta-theory is tricky, but all ends well.</div>
-
-Termination in Practice
------------------------
-
-<img src="../img/tension1.png" height=300px>
-
-96% proved *terminating*
-
-61% proved *automatically*
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. Lazy Evaluation: Requires Termination
-6. **Termination:** via Refinements!
-7. <div class="fragment">**Evaluation:** How good is this in practice?</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](11_Evaluation.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/BOS14/lhs/11_Evaluation.lhs b/docs/slides/BOS14/lhs/11_Evaluation.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/11_Evaluation.lhs
+++ /dev/null
@@ -1,322 +0,0 @@
- {#ASda}
-========
-
-Evaluation
-----------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-Evaluation
-==========
-
-LiquidHaskell 
--------------
-
-<br>
-
-**Diverse Code Bases**
-
-<br>
-
-10KLoc
-
-<br>
-
-56 Modules
-
-LiquidHaskell 
--------------
-
-<br>
-
-**Complex Properties**
-
-<br>
-
-Memory Safety
-
-
-Functional Correctness*
-
-
-Termination
-
-<br>
-
-<div class="fragment">
-**Inference is Crucial**
-</div>
-
-Benchmarks
-----------
-
-<div align="center">
-
-**Library**                     
----------------------------   ---------
-`XMonad.StackSet`                      
-`Data.List`                         
-`Data.Set.Splay`                    
-`Data.Vector.Algorithms`           
-`HsColour`                        
-`Data.Map.Base`                
-`Data.Text`                        
-`Data.Bytestring`                  
----------------------------   ---------
-
-</div>
-
-
-Benchmarks 
-----------
-
-<div align="center">
-
-**Library**                     **LOC**
----------------------------   ---------
-`XMonad.StackSet`                   256 
-`Data.List`                         814
-`Data.Set.Splay`                    149
-`Data.Vector.Algorithms`           1219
-`HsColour`                         1047
-`Data.Map.Base`                    1396
-`Data.Text`                        3128
-`Data.Bytestring`                  3505
-**Total**                     **11512**
----------------------------   ---------
-
-</div>
-
-Benchmarks
-----------
-
-<div align="center">
-
-**Library**                     **LOC**     **Specs**    
----------------------------   ---------   -----------    
-`XMonad.StackSet`                   256            74    
-`Data.List`                         814            46    
-`Data.Set.Splay`                    149            27    
-`Data.Vector.Algorithms`           1219            76    
-`HsColour`                         1047            19    
-`Data.Map.Base`                    1396           125    
-`Data.Text`                        3128           305    
-`Data.Bytestring`                  3505           307    
-**Total**                     **11512**       **977**    
----------------------------   ---------   -----------    
-
-</div>
-
-
-Code v. Specs 
--------------
-
-<img src="../img/code-spec-indiv.png" height=400px>
-
-
-Code v. Specs 
--------------
-
-<br>
-
-<img src="../img/code-spec-total.png" height=100px>
- 
-**About 8.5%**
-
-*Very* coarse measure...
-
-Running Time
-------------
-
-<div align="center">
-
-**Library**                     **LOC**     **Specs**      **Time**
----------------------------   ---------   -----------    ----------
-`XMonad.StackSet`                   256            74          27s
-`Data.List`                         814            46          26s
-`Data.Set.Splay`                    149            27          27s
-`Data.Vector.Algorithms`           1219            76          89s 
-`HsColour`                         1047            19         196s
-`Data.Map.Base`                    1396           125         174s
-`Data.Text`                        3128           305         499s
-`Data.Bytestring`                  3505           307         294s
-**Total**                     **11512**       **977**    **1336s**
----------------------------   ---------   -----------    ----------
-
-</div>
-
-
-
- {#comments}
-============
-
-Types as Comments
------------------
-
-<br>
-
-**Types are Machine Checked Comments**
-
-<br>
-
-+ Express same *requirements*
-
-+ But *connected to* code
-
-<br>
-
-<div class="fragment">
-**Always in sync as code changes**
-</div>
-
-Liquid Types as Machine Checked Comments
-========================================
-
-Example: Data.Map
------------------
-
-<br>
-
-**Requirement**
-
-<br>
-
-`Map a b` is a *binary search* ordered tree
-
-Example: Data.Map
------------------
-
-**Comment**
-
-\begin{spec}
--- @join@ assumes that all values in [l] < [k]
--- and all values in [r] > [k], and
--- that [l] and [r] are valid trees.
-\end{spec}
-
-<br>
-
-<div class="fragment">
-
-**Type**
-
-\begin{spec}
-join :: k:a -> b
-     -> l:Map {v:a | v < k} b
-     -> r:Map {v:a | v > k} b
-     -> Map a b 
-\end{spec}
-
-</div>
-
-Example: Data.ByteString
-------------------------
-
-<br>
-
-**Requirement**
-
-<br>
-
-Fast, low-level indices into a `ByteString` must be in bounds.
-
-
-Example: Data.ByteString
-------------------------
-
-**Comment**
-
-\begin{spec}
--- Unsafe 'ByteString' index (subscript) ...
--- omits the bounds check, which means there
--- is an obligation to ensure the bounds are
--- checked in some other way.
-\end{spec}
-
-<br>
-
-<div class="fragment">
-
-**Type**
-
-\begin{spec}
-unsafeIndex :: b:ByteString
-            -> {v:Nat | v < bLength b}
-            -> Word8 
-\end{spec}
-
-</div>
-
-Example: Data.ByteString
-------------------------
-
-<br>
-
-**Requirement**
-
-<br>
-
-Fast *truncation* requires valid size.
-
-
-Example: Data.ByteString
-------------------------
-
-**Comment**
-
-\begin{spec}
--- omits the checks on @n@ so there is
--- an obligation to provide a proof
--- that @0 <= n <= 'length' xs@             
-\end{spec}
-
-<br>
-
-<div class="fragment">
-**Type**
-
-\begin{spec}
-unsafeTake :: n:Nat
-           -> {v:ByteString | n <= bLength v}
-           -> {v:ByteString | n = bLength v} 
-\end{spec}
-
-</div>
-
- {#cont}
-=========
-
-
-Continue
---------
-
-<br>
-<br>
-<br>
-
-[[continue...]](12_Conclusion.lhs.slides.html)
-
- {#recap}
-=========
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. **Evaluation**
-6. <div class="fragment"><a href="12_Conclusion.lhs.slides.html" target="_blank">Conclusion</a></div>
-
-<br>
-<br>
-
diff --git a/docs/slides/BOS14/lhs/12_Conclusion.lhs b/docs/slides/BOS14/lhs/12_Conclusion.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/12_Conclusion.lhs
+++ /dev/null
@@ -1,82 +0,0 @@
- {#ASda}
-========
-
-Conclusion
-----------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-Conclusion
-==========
-
-Liquid Types
-------------
-
-<br>
-
-**Types** lift **Program Logic + Analysis** to Modern Programs
-
-<br>
-
-<div class="fragment">
-
--------------------       ------------------------------------------------
-**Properties:**           Predicates  *+ Types*
-**Proofs:**               SMT Solvers *+ Subtyping*
-**Inference:**            Abstract Interpretation *+ Hindley-Milner*
--------------------       ------------------------------------------------
-
-</div>
-
-Current & Future Work
----------------------
-
-<br>
-
-**Technology**
-
-<br>
-
-+ GHC
-+ Speed
-+ Effects
-+ *Error Messages*
-
-Current & Future Work
----------------------
-
-<br>
-
-**Applications**
-
-<br>
-
-+ Testing
-+ Web frameworks
-+ Concurrency
-+ Code Completion
-
- {#asd}
-=======
-
-Thank You!
-----------
-
-<br>
-<br>
-
-`cabal install liquidhaskell`
-
-Thank You!
-----------
-
-<br>
-<br>
-
-[`http://goto.ucsd.edu/liquid`](http://goto.ucsd.edu/liquid)
diff --git a/docs/slides/BOS14/lhs/13_RedBlack.lhs b/docs/slides/BOS14/lhs/13_RedBlack.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/13_RedBlack.lhs
+++ /dev/null
@@ -1,268 +0,0 @@
-
-
-Red-Black Trees
-===============
-
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--diff"           @-}
-
-module RBTree (ok, bad1, bad2) where
-
-import Language.Haskell.Liquid.Prelude
-
-ok, bad1, bad2 :: RBTree Int
-
----------------------------------------------------------------------------
--- | Specifications -------------------------------------------------------
----------------------------------------------------------------------------
-
--- | Red-Black Trees
-{-@ type RBT a    = {v: RBTree a | isRB v && isBH v } @-}
-
-{-@ measure isRB        :: RBTree a -> Prop
-    isRB (Leaf)         = true
-    isRB (Node c x l r) = isRB l && isRB r && (c == R => (IsB l && IsB r))
-  @-}
-
--- | Almost Red-Black Trees
-{-@ type ARBT a    = {v: RBTree a | isARB v && isBH v} @-}
-
-{-@ measure isARB        :: (RBTree a) -> Prop
-    isARB (Leaf)         = true 
-    isARB (Node c x l r) = (isRB l && isRB r)
-  @-}
-
--- | Color of a tree
-{-@ measure col         :: RBTree a -> Color
-    col (Node c x l r)  = c
-    col (Leaf)          = B
-  @-}
-
-{-@ measure isB        :: RBTree a -> Prop
-    isB (Leaf)         = false
-    isB (Node c x l r) = c == B 
-  @-}
-
-{-@ predicate IsB T = not (col T == R) @-}
-
--- | Black Height
-{-@ measure isBH        :: RBTree a -> Prop
-    isBH (Leaf)         = true
-    isBH (Node c x l r) = (isBH l && isBH r && bh l = bh r)
-  @-}
-
-{-@ measure bh        :: RBTree a -> Int
-    bh (Leaf)         = 0
-    bh (Node c x l r) = bh l + if (c == R) then 0 else 1 
-  @-}
-
-
--- | Binary Search Ordering
-{-@ data RBTree a = Leaf
-      | Node { c     :: Color
-             , key   :: a
-             , left  :: RBTree ({v:a | v < key})
-             , right :: RBTree ({v:a | key < v}) } @-}
-\end{code}
-
-</div>
-
-
-
- {#asdad}
----------
-
-<img src="../img/RedBlack.png" height=300px>
-
-+ <div class="fragment">**Color Invariant:** `Red` nodes have `Black` children</div>
-+ <div class="fragment">**Height Invariant:** Number of `Black` nodes equal on *all paths*</div>
-+ <div class="fragment">**Order Invariant:** Left keys < root < Right keys </div>
-
-
-Basic Type 
-----------
-
-\begin{code}
-data Color = R | B
-
-data RBTree a = Leaf
-              | Node { c     :: Color
-                     , key   :: a
-                     , left  :: RBTree a 
-                     , right :: RBTree a }
-\end{code}
-
-
-1. Color Invariant 
-------------------
-
-`Red` nodes have `Black` children
-
-<div class="fragment">
-\begin{spec}
-measure isRB        :: Tree a -> Prop
-isRB (Leaf)         = true
-isRB (Node c x l r) = c == R => (isB l && isB r)
-                      && isRB l && isRB r
-\end{spec}
-</div>
-
-<div class="fragment">
-where 
-\begin{spec}
-measure isB         :: Tree a -> Prop 
-isB (Leaf)          = true
-isB (Node c x l r)  = c == B
-\end{spec}
-</div>
-
-
-1. *Almost* Color Invariant 
----------------------------
-
-<br>
-
-Color Invariant **except** at root. 
-
-<br>
-
-<div class="fragment">
-\begin{spec}
-measure isAlmost        :: RBTree a -> Prop
-isAlmost (Leaf)         = true
-isAlmost (Node c x l r) = isRB l && isRB r
-\end{spec}
-</div>
-
-<!-- BEGIN CUT END CUT -->
-
-2. Height Invariant
--------------------
-
-Number of `Black` nodes equal on **all paths**
-
-<div class="fragment">
-\begin{spec} 
-measure isBH        :: RBTree a -> Prop
-isBH (Leaf)         =  true
-isBH (Node c x l r) =  bh l == bh r 
-                    && isBH l && isBH r 
-\end{spec}
-</div>
-
-<div class="fragment">
-
-where
-
-\begin{spec}
-measure bh        :: RBTree a -> Int
-bh (Leaf)         = 0
-bh (Node c x l r) = bh l 
-                  + if c == R then 0 else 1
-\end{spec}
-</div>
-
-3. Order Invariant
-------------------
-
-**Binary Search Ordering**
-
-\begin{spec}
-data RBTree a
-  = Leaf
-  | Node { c     :: Color
-         , key   :: a
-         , left  :: RBTree {v:a | v < key}
-         , right :: RBTree {v:a | key < v}
-         }
-\end{spec}
-
-
-Valid Red-Black Trees
----------------------
-
-<br>
-
-**Conjoining Specifications**
-
-<br>
-
-\begin{spec}
--- | Red-Black Trees
-type RBT a  = {v:RBTree a|isRB v && isBH v}
-
--- | Almost Red-Black Trees
-type ARBT a = {v:RBTree a|isAlmost v && isBH v}
-\end{spec}
-
-<br>
-
-[Details](https://github.com/ucsd-progsys/liquidhaskell/blob/master/tests/pos/RBTree.hs)
-
-Ex: Satisfies Invariants
--------------------------
-
-<img src="../img/rbtree-ok.png" height=200px>
-
-<br>
-
-\begin{code}
-{-@ ok   :: RBT Int @-}
-ok = Node R 2 
-          (Node B 1 Leaf Leaf)
-          (Node B 3 Leaf Leaf)
-\end{code}
-
-
-Ex: Violates Order Invariant
-----------------------------
-
-<img src="../img/rbtree-bad1.png" height=200px>
-
-<br>
-
-\begin{code}
-{-@ bad1 :: RBT Int @-}
-bad1 = Node R 1
-          (Node B 2 Leaf Leaf)
-          (Node B 3 Leaf Leaf)
-\end{code}
-
-Ex: Violates Color Invariant
-----------------------------
-
-<img src="../img/rbtree-bad2.png" height=200px>
-
-<br>
-
-\begin{code}
-{-@ bad2 :: RBT Int @-}
-bad2 = Node  R 2
-         (Node R 1 Leaf Leaf)
-         (Node B 3 Leaf Leaf)
-\end{code}
-
-
-Verified Red-Black Operations 
------------------------------
-
-<br>
-
-**Types Verify Correctness of**
-
-<br>
-
-+ Insertion
-
-+ Deletion
-
-+ Lookup ...
-
-<br>
-
-**In presence of rotation & rebalancing** [[details]](https://github.com/ucsd-progsys/liquidhaskell/blob/master/tests/pos/RBTree.hs)
-
diff --git a/docs/slides/BOS14/lhs/14_Memory.lhs b/docs/slides/BOS14/lhs/14_Memory.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/14_Memory.lhs
+++ /dev/null
@@ -1,914 +0,0 @@
-Case Study: Low Level Memory
-============================
-
- {#mem}
--------
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--diffcheck"     @-}
-{-# LANGUAGE ForeignFunctionInterface #-}
-
-module Memory where
-
-import Prelude hiding (null)
-import Data.Char
-import Data.Word
-import Foreign.C.Types
-import Foreign.ForeignPtr
-import Foreign.Ptr
-import Foreign.Storable
-import System.IO.Unsafe
-import Data.ByteString.Internal (c2w, w2c)
-import Language.Haskell.Liquid.Prelude
-\end{code}
-
-</div>
-
-"HeartBleed" in Haskell
------------------------
-
-<br>
-
-**Modern languages are built on top of C**
-
-<br>
-
-<div class="fragment">
-Implementation errors could open up vulnerabilities
-</div>
-
-
-
-
-"HeartBleed" in Haskell (1/3)
------------------------------
-
-**A String Truncation Function**
-
-<br>
-
-<div class="hidden">
-\begin{spec}
-import Data.ByteString.Char8  (pack, unpack)
-import Data.ByteString.Unsafe (unsafeTake)
-\end{spec}
-</div>
-
-\begin{spec}
-chop     :: String -> Int -> String
-chop s n = s'
-  where
-    b    = pack s         -- down to low-level
-    b'   = unsafeTake n b -- grab n chars
-    s'   = unpack b'      -- up to high-level
-\end{spec}
-
-"HeartBleed" in Haskell (2/3)
------------------------------
-
-<img src="../img/overflow.png" height=100px>
-
-
-Works if you use the **valid prefix** size
-
-<br>
-
-\begin{spec}
-λ> let ex = "Ranjit Loves Burritos"
-
-λ> heartBleed ex 10
-"Ranjit Lov"
-\end{spec}
-
-
-"HeartBleed" in Haskell (3/3)
------------------------------
-
-<img src="../img/overflow.png" height=100px>
-
-Leaks *overflow buffer* if **invalid prefix** size!
-
-<br>
-
-\begin{spec}
-λ> let ex = "Ranjit Loves Burritos"
-
-λ> heartBleed ex 30
-"Ranjit Loves Burritos\NUL\201\&1j\DC3\SOH\NUL"
-\end{spec}
-
-Types Against Overflows
------------------------
-
-<br>
-
-**Strategy: Specify and Verify Types for**
-
-<br>
-
-1. <div class="fragment">Low-level `Pointer` API</div>
-2. <div class="fragment">Lib-level `ByteString` API</div>
-3. <div class="fragment">User-level `Application` API</div>
-
-<br>
-
-<div class="fragment">Errors at *each* level are prevented by types at *lower* levels</div>
-
- {#ptr}
-=======
-
-1. Low-level Pointer API
-------------------------
-
-<br>
-
-Strategy: Specify and Verify Types for
-
-<br>
-
-1. **Low-level `Pointer` API**
-2. Lib-level `ByteString` API
-3. User-level `Application` API
-
-<br>
-
-Errors at *each* level are prevented by types at *lower* levels
-
-
-
-
-1. Low-Level Pointer API
-========================
-
-API: Types
-----------
-
-<br>
-
-**Low-level Pointers**
-
-\begin{spec}
-data Ptr a
-\end{spec}
-
-<br>
-
-<div class="fragment">
-**Foreign Pointers**
-
-\begin{spec}
-data ForeignPtr a
-\end{spec}
-
-<br>
-
-`ForeignPtr` wraps around `Ptr`; can be exported to/from C.
-</div>
-
-
-API: Operations (1/2)
----------------------
-
-<div class="fragment">
-**Read**
-
-\begin{spec}
-peek     :: Ptr a -> IO a
-\end{spec}
-</div>
-
-<br>
-<div class="fragment">
-**Write**
-
-\begin{spec}
-poke     :: Ptr a -> a -> IO ()
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-**Arithmetic**
-\begin{spec}
-plusPtr  :: Ptr a -> Int -> Ptr b
-\end{spec}
-</div>
-
-API: Operations (2/2)
----------------------
-
-<div class="fragment">
-**Create**
-
-\begin{spec}
-malloc  :: Int -> ForeignPtr a
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-**Unwrap and Use**
-
-\begin{spec}
-withForeignPtr :: ForeignPtr a     -- pointer
-               -> (Ptr a -> IO b)  -- action
-               -> IO b             -- result
-\end{spec}
-</div>
-
-Example
--------
-
-**Allocate a block and write 4 zeros into it**
-
-<div class="fragment">
-
-\begin{code}
-zero4 = do fp <- malloc 4
-           withForeignPtr fp $ \p -> do
-             poke (p `plusPtr` 0) zero
-             poke (p `plusPtr` 1) zero
-             poke (p `plusPtr` 2) zero
-             poke (p `plusPtr` 3) zero
-           return fp
-        where
-           zero = 0 :: Word8
-\end{code}
-
-</div>
-
-Example
--------
-
-**Allocate a block and write 4 zeros into it**
-
-How to *prevent overflows* e.g. writing 5 or 50 zeros?
-
-<br>
-
-<div class="fragment">
-**Step 1**
-
-*Refine pointers* with allocated size
-</div>
-
-<br>
-
-<div class="fragment">
-**Step 2**
-
-*Track sizes* in pointer operations
-</div>
-
-Refined API: Types
-------------------
-
-<br>
-
-**1. Refine pointers with allocated size**
-
-\begin{spec}
-measure plen  :: Ptr a -> Int
-measure fplen :: ForeignPtr a -> Int
-\end{spec}
-
-<br>
-
-<div class="fragment">
-Abbreviations for pointers of size `N`
-
-\begin{spec}
-type PtrN a N        = {v:_ |  plen v  = N}
-type ForeignPtrN a N = {v:_ |  fplen v = N}
-\end{spec}
-</div>
-
-
-Refined API: Ops (1/3)
-----------------------
-
-<div class="fragment">
-**Create**
-
-\begin{spec}
-malloc  :: n:Nat -> ForeignPtrN a n
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-**Unwrap and Use**
-
-\begin{spec}
-withForeignPtr :: fp:ForeignPtr a
-               -> (PtrN a (fplen fp) -> IO b)
-               -> IO b
-\end{spec}
-</div>
-
-Refined API: Ops (2/3)
-----------------------
-
-<br>
-
-**Arithmetic**
-
-Refine type to track *remaining* buffer size
-
-<br>
-
-<div class="fragment">
-\begin{spec}
-plusPtr :: p:Ptr a
-        -> o:{Nat|o <= plen p}   -- in bounds
-        -> PtrN b (plen b - o)   -- remainder
-\end{spec}
-
-</div>
-
-
-
-Refined API: Ops (3/3)
-----------------------
-
-**Read & Write require non-empty remaining buffer**
-
-<br>
-
-<div class="fragment">
-**Read**
-
-\begin{spec}
-peek :: {v:Ptr a | 0 < plen v} -> IO a
-\end{spec}
-</div>
-
-<br>
-<div class="fragment">
-**Write**
-
-\begin{spec}
-poke :: {v:Ptr a | 0 < plen v} -> a -> IO ()
-\end{spec}
-</div>
-
-Example: Overflow Prevented
----------------------------
-
-How to *prevent overflows* e.g. writing 5 or 50 zeros?
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-exBad = do fp <- malloc 4
-           withForeignPtr fp $ \p -> do
-             poke (p `plusPtr` 0) zero
-             poke (p `plusPtr` 1) zero
-             poke (p `plusPtr` 2) zero
-             poke (p `plusPtr` 5) zero
-           return fp
-        where
-           zero = 0 :: Word8
-\end{code}
-
-</div>
-
- {#bs}
-======
-
-2. ByteString API
------------------
-
-<br>
-
-Strategy: Specify and Verify Types for
-
-<br>
-
-1. Low-level `Pointer` API
-2. **Lib-level `ByteString` API**
-3. User-level `Application` API
-
-<br>
-
-Errors at *each* level are prevented by types at *lower* levels
-
-
-2. ByteString API
-=================
-
-Type
--------
-
-<img src="../img/bytestring.png" height=150px>
-
-\begin{code}
-data ByteString = PS {
-    bPtr :: ForeignPtr Word8
-  , bOff :: !Int
-  , bLen :: !Int
-  }
-\end{code}
-
-
-Refined Type
-------------
-
-<img src="../img/bytestring.png" height=150px>
-
-\begin{code}
-{-@ data ByteString = PS {
-      bPtr :: ForeignPtr Word8
-    , bOff :: {v:Nat| v        <= fplen bPtr}
-    , bLen :: {v:Nat| v + bOff <= fplen bPtr}
-    }                                       @-}
-\end{code}
-
-Refined Type
-------------
-
-<img src="../img/bytestring.png" height=150px>
-
-<br>
-
-**A Useful Abbreviation**
-
-\begin{spec}
-type ByteStringN N = {v:ByteString| bLen v = N}
-\end{spec}
-
-
-<div class="hidden">
-\begin{code}
-{-@ type ByteStringN N = {v:ByteString | bLen v = N} @-}
-\end{code}
-</div>
-
-
-
-Legal Bytestrings
------------------
-
-
-<br>
-
-\begin{code}
-{-@ good1 :: IO (ByteStringN 5) @-}
-good1 = do fp <- malloc 5
-           return (PS fp 0 5)
-
-{-@ good2 :: IO (ByteStringN 3) @-}
-good2 = do fp <- malloc 5
-           return (PS fp 2 3)
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Note:** *length* of `good2` is `3` which is *less than* allocated size `5`
-</div>
-
-Illegal Bytestrings
------------------
-
-<br>
-
-\begin{code}
-bad1 = do fp <- malloc 3
-          return (PS fp 0 10)
-
-bad2 = do fp <- malloc 3
-          return (PS fp 2 2)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Claimed length *exceeds* allocation ... **rejected** at compile time
-</div>
-
-API: `create`
--------------
-
-<div class="hidden">
-\begin{code}
-create :: Int -> (Ptr Word8 -> IO ()) -> ByteString
-\end{code}
-</div>
-
-*Allocate* and *fill* a `ByteString`
-
-<br>
-
-<div class="fragment">
-**Specification**
-\begin{code}
-{-@ create :: n:Nat -> (PtrN Word8 n -> IO ())
-           -> ByteStringN n                @-}
-\end{code}
-</div>
-
-
-<div class="fragment">
-**Implementation**
-
-\begin{code}
-create n fill = unsafePerformIO $ do
-  fp  <- malloc n
-  withForeignPtr fp fill
-  return (PS fp 0 n)
-\end{code}
-</div>
-
-<!-- CUT
-<div class="fragment">
-Yikes, there is an error! How to fix?
-</div>
--->
-
-API: `pack`
-------------
-
-**Specification**
-
-\begin{code}
-{-@ pack :: s:String -> ByteStringN (len s) @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-**Implementation**
-
-\begin{code}
-pack str      = create n $ \p -> go p xs
-  where
-  n           = length str
-  xs          = map c2w str
-  go p (x:xs) = poke p x >> go (plusPtr p 1) xs
-  go _ []     = return  ()
-\end{code}
-
-</div>
-
-
-
-API: `unsafeTake`
------------------
-
-Extract *prefix* string of size `n`
-
-<br>
-
-<div class="fragment">
-**Specification**
-
-\begin{code}
-{-@ unsafeTake :: n:Nat
-               -> b:{ByteString | n <= bLen b}
-               -> ByteStringN n            @-}
-\end{code}
-</div>
-
-
-<br>
-
-<div class="fragment">
-**Implementation**
-
-\begin{code}
-unsafeTake n (PS x s l) = PS x s n
-\end{code}
-</div>
-
-API: `unpack`
--------------
-
-**Specification**
-
-\begin{spec}
-unpack
- :: b:ByteString -> StringN (bLen b)
-\end{spec}
-
-<br>
-
-<div class="fragment">
-**Implementation**
-
-\begin{spec}
-unpack b = you . get . the . idea -- see source
-\end{spec}
-</div>
-
-<div class="hidden">
-\begin{code}
-{-@ qualif Unpack(v:a, acc:b, n:int) : len v = 1 + n + len acc @-}
-
-{-@ unpack :: b:ByteString -> StringN (bLen b) @-}
-unpack :: ByteString -> String
-unpack (PS _  _ 0)  = []
-unpack (PS ps s l)  = unsafePerformIO $ withForeignPtr ps $ \p ->
-   go (p `plusPtr` s) (l - 1)  []
-  where
-   go p 0 acc = peek p >>= \e -> return (w2c e : acc)
-   go p n acc = peek (p `plusPtr` n) >>=   \e -> go p (n-1) (w2c e : acc)
-\end{code}
-
-</div>
-
- {#heartbleedredux}
-==================
-
-
-3. Application API
--------------------
-
-
-<br>
-
-Strategy: Specify and Verify Types for
-
-<br>
-
-1. Low-level `Pointer` API
-2. Lib-level `ByteString` API
-3. **User-level `Application` API**
-
-<br>
-
-Errors at *each* level are prevented by types at *lower* levels
-
-3. Application API
-==================
-
-Revisit "HeartBleed"
---------------------
-
-Lets revisit our potentially "bleeding" `chop`
-
-<br>
-
-<div class="hidden">
-\begin{code}
-{-@ type StringN N = {v:String | len v = N} @-}
-\end{code}
-</div>
-<div class="fragment">
-
-\begin{code}
-{-@ chop :: s:String
-         -> n:{Nat | n <= len s}
-         -> StringN n
-  @-}
-chop s n =  s'
-  where
-    b    = pack s          -- down to low-level
-    b'   = unsafeTake n b  -- grab n chars
-    s'   = unpack b'       -- up to high-level
-\end{code}
-
-<!-- BEGIN CUT
-<br>
-
-Yikes! How shall we fix it?
-
-     END CUT -->
-</div>
-
-<!-- BEGIN CUT
-
-A Well Typed `chop`
--------------------
-
-\begin{spec}
-{-@ chop :: s:String
-         -> n:{Nat | n <= len s}
-         -> {v:String | len v = n} @-}
-chop s n = s'
-  where
-    b    = pack s          -- down to low-level
-    b'   = unsafeTake n b  -- grab n chars
-    s'   = unpack b'       -- up to high-level
-\end{spec}
-
-END CUT -->
-
-"HeartBleed" no more
---------------------
-
-<br>
-
-\begin{code}
-demo     = [ex6, ex30]
-  where
-    ex   = ['N','o','r','m','a','n']
-    ex6  = chop ex 6  -- ok
-    ex30 = chop ex 30  -- out of bounds
-\end{code}
-
-<br>
-
-"Bleeding" `chop ex 30` *rejected* by compiler
-
-Recap: Types vs Overflows
--------------------------
-
-<br>
-
-**Strategy: Specify and Verify Types for**
-
-<br>
-
-1. Low-level `Pointer` API
-2. Lib-level `ByteString` API
-3. User-level `Application` API
-
-<br>
-
-**Errors at *each* level are prevented by types at *lower* levels**
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div class="hidden">
-Bonus Material
-==============
-
-Nested ByteStrings
-------------------
-
-For a more in depth example, let's take a look at `group`,
-which transforms strings like
-
-   `"foobaaar"`
-
-into *lists* of strings like
-
-   `["f","oo", "b", "aaa", "r"]`.
-
-The specification is that `group` should produce a list of `ByteStrings`
-
-1. that are all *non-empty* (safety)
-2. the sum of whose lengths is equal to the length of the input string (precision)
-
-We use the type alias
-
-\begin{code}
-{-@ type ByteStringNE = {v:ByteString | bLen v > 0} @-}
-\end{code}
-
-to specify (safety) and introduce a new measure
-
-\begin{code}
-{-@ measure bLens  :: [ByteString] -> Int
-    bLens ([])   = 0
-    bLens (x:xs) = (bLen x + bLens xs)
-  @-}
-\end{code}
-
-to specify (precision). The full type-specification looks like this:
-
-\begin{code}
-{-@ group :: b:ByteString -> {v: [ByteStringNE] | bLens v = bLen b} @-}
-group xs
-    | null xs   = []
-    | otherwise = let y = unsafeHead xs
-                      (ys, zs) = spanByte (unsafeHead xs) (unsafeTail xs)
-                  in (y `cons` ys) : group zs
-\end{code}
-
-As you can probably tell, `spanByte` appears to be doing a lot of the work here,
-so let's take a closer look at it to see why the post-condition holds.
-
-\begin{code}
-spanByte :: Word8 -> ByteString -> (ByteString, ByteString)
-spanByte c ps@(PS x s l) = unsafePerformIO $ withForeignPtr x $ \p ->
-    go (p `plusPtr` s) 0
-  where
-    go p i | i >= l    = return (ps, empty)
-           | otherwise = do c' <- peekByteOff p i
-                            if c /= c'
-                                then return (unsafeTake i ps, unsafeDrop i ps)
-                                else go p (i+1)
-\end{code}
-
-LiquidHaskell infers that `0 <= i <= l` and therefore that all of the memory
-accesses are safe. Furthermore, due to the precise specifications given to
-`unsafeTake` and `unsafeDrop`, it is able to prove that `spanByte` has the type
-
-\begin{code}
-{-@ spanByte :: Word8 -> b:ByteString -> (ByteStringPair b) @-}
-\end{code}
-
-where `ByteStringPair b` describes a pair of `ByteString`s whose
-lengths sum to the length of `b`.
-
-\begin{code}
-{-@ type ByteStringPair B = (ByteString, ByteString)<{\x1 x2 ->
-       bLen x1 + bLen x2 = bLen B}> @-}
-\end{code}
-
-
-
-
-
-
-
-
-\begin{code}
------------------------------------------------------------------------
--- Helper Code
------------------------------------------------------------------------
-
-{-@ unsafeCreate :: l:Nat -> ((PtrN Word8 l) -> IO ()) -> (ByteStringN l) @-}
-unsafeCreate n f = create n f -- unsafePerformIO $ create n f
-
-{-@ invariant {v:ByteString   | bLen  v >= 0} @-}
-{-@ invariant {v:[ByteString] | bLens v >= 0} @-}
-
-{-@ qualif PLLen(v:a, p:b) : (len v) <= (plen p) @-}
-{-@ qualif ForeignPtrN(v:ForeignPtr a, n:int): fplen v = n @-}
-{-@ qualif FPLenPLen(v:Ptr a, fp:ForeignPtr a): fplen fp = plen v @-}
-{-@ qualif PtrLen(v:Ptr a, xs:List b): plen v = len xs @-}
-{-@ qualif PlenEq(v: Ptr a, x: int): x <= (plen v) @-}
-
-{-@ unsafeHead :: {v:ByteString | (bLen v) > 0} -> Word8 @-}
-
-unsafeHead :: ByteString -> Word8
-unsafeHead (PS x s l) = liquidAssert (l > 0) $
-  unsafePerformIO  $  withForeignPtr x $ \p -> peekByteOff p s
-
-{-@ unsafeTail :: b:{v:ByteString | (bLen v) > 0}
-               -> {v:ByteString | (bLen v) = (bLen b) - 1} @-}
-unsafeTail :: ByteString -> ByteString
-unsafeTail (PS ps s l) = liquidAssert (l > 0) $ PS ps (s+1) (l-1)
-
-{-@ null :: b:ByteString -> {v:Bool | ((Prop v) <=> ((bLen b) = 0))} @-}
-null :: ByteString -> Bool
-null (PS _ _ l) = liquidAssert (l >= 0) $ l <= 0
-
-{-@ unsafeDrop :: n:Nat
-               -> b:{v: ByteString | n <= (bLen v)}
-               -> {v:ByteString | (bLen v) = (bLen b) - n} @-}
-unsafeDrop  :: Int -> ByteString -> ByteString
-unsafeDrop n (PS x s l) = liquidAssert (0 <= n && n <= l) $ PS x (s+n) (l-n)
-
-{-@ cons :: Word8 -> b:ByteString -> {v:ByteString | (bLen v) = 1 + (bLen b)} @-}
-cons :: Word8 -> ByteString -> ByteString
-cons c (PS x s l) = unsafeCreate (l+1) $ \p -> withForeignPtr x $ \f -> do
-        poke p c
-        memcpy (p `plusPtr` 1) (f `plusPtr` s) (fromIntegral l)
-
-{-@ empty :: {v:ByteString | (bLen v) = 0} @-}
-empty :: ByteString
-empty = PS nullForeignPtr 0 0
-
-{-@ assume mallocForeignPtrBytes :: n:Nat -> IO (ForeignPtrN a n) @-}
-{-@ type ForeignPtrN a N = {v:ForeignPtr a | fplen v = N} @-}
-{-@ malloc :: n:Nat -> IO (ForeignPtrN a n) @-}
-malloc = mallocForeignPtrBytes
-
-{-@ assume
-    c_memcpy :: dst:(PtrV Word8)
-             -> src:(PtrV Word8)
-             -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))}
-             -> IO (Ptr Word8)
-  @-}
-foreign import ccall unsafe "string.h memcpy" c_memcpy
-    :: Ptr Word8 -> Ptr Word8 -> CSize -> IO (Ptr Word8)
-
-{-@ memcpy :: dst:(PtrV Word8)
-           -> src:(PtrV Word8)
-           -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))}
-           -> IO ()
-  @-}
-memcpy :: Ptr Word8 -> Ptr Word8 -> CSize -> IO ()
-memcpy p q s = c_memcpy p q s >> return ()
-
-{-@ assume nullForeignPtr :: {v: ForeignPtr Word8 | (fplen v) = 0} @-}
-nullForeignPtr :: ForeignPtr Word8
-nullForeignPtr = unsafePerformIO $ newForeignPtr_ nullPtr
-{-# NOINLINE nullForeignPtr #-}
-\end{code}
-
-</div>
diff --git a/docs/slides/BOS14/lhs/Index-Boston-Haskell.lhs b/docs/slides/BOS14/lhs/Index-Boston-Haskell.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/Index-Boston-Haskell.lhs
+++ /dev/null
@@ -1,160 +0,0 @@
-<div class="hidden">
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-</div>
-
-LiquidHaskell 
-==============
-
-Refinement Types for Haskell
-------------------------------
-
-
-<br>
-<br>
-
-<div class="fragment">
-**Ranjit Jhala**
-
-University of California, San Diego
-
-<br>
-<br>
-
-Joint work with: 
-
-N. Vazou, E. Seidel, P. Rondon, M. Kawaguchi
-
-D. Vytiniotis, S. Peyton-Jones
-
-</div>
-
-
- {#plan}
--------
-
-**Part I**
-
-Refinement Types
-
-<br>
-
-<div class="fragment">
-**Part II**
-
-Case Studies
-</div>
-
-<br>
-
-
-<div class="fragment">
-**Part III**
-
-Haskell (Lazy Evaluation)
-</div>
-
- {#plan}
---------
-
-
-<br>
-
-(And *if* we have time...)
-
-
-<br>
-
-**Part IV**
-
-Abstract Refinements
-
-I: Refinement Types
--------------------
-
-<br>
-
-<a href="00_Motivation.lhs.slides.html" target="_blank">**Motivation**</a>
-
-<br>
-
-<div class="fragment">
-<a href="01_SimpleRefinements.lhs.slides.html" target="_blank">**Refinements**</a>
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="02_Measures.lhs.slides.html" target= "_blank">**Measures**</a>
-</div>
-
-II: Case Studies 
-----------------
-
-<br>
-
-<a href="13_RedBlack.lhs.slides.html" target="_blank">**Red-Black Trees**</a>
-
-<br>
-
-<a href="14_Memory.lhs.slides.html" target="_blank">**Low-level Memory Safety**</a>
-
-
-III: Haskell
-------------
-
-<br>
-
-<a href="09_Laziness.lhs.slides.html" target="_blank">**Lazy Evaluation**</a>
-
-<br>
-
-<div class="fragment">
-<a href="10_Termination.lhs.slides.html" target="_blank">**Termination**</a>
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="11_Evaluation.lhs.slides.html" target="_blank">**Evaluation**</a>
-</div>
-
-
-IV: Abstract Refinements
-------------------------
-
-
-<br>
-
-<a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">**Abstracting Refinements over Types**</a>
-
-<br>
-
-<div class="fragment">
-
-**Demos**
-
-<br>
-
-+ [Basic](../hs/02_AbstractRefinements.hs)
-+ [Induction](../hs/02_AbstractRefinements.hs)
-+ [Recursion](../hs/02_AbstractRefinements.hs)
-+ [Key-Value](../hs/02_AbstractRefinements.hs)
-
-</div>
-
-
-Conclusion
-----------
-
-<br>
-<br>
-<br>
-
-<div class="fragment">
-
-<a href="12_Conclusion.lhs.slides.html" target="_blank">[Continue]</a>
-
-</div>
-
diff --git a/docs/slides/BOS14/lhs/Index-Tufts.lhs b/docs/slides/BOS14/lhs/Index-Tufts.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/Index-Tufts.lhs
+++ /dev/null
@@ -1,73 +0,0 @@
-<div class="hidden">
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-</div>
-
-LiquidHaskell 
-==============
-
-Refinement Types for Haskell
-------------------------------
-
-
-<br>
-<br>
-
-<div class="fragment">
-**Ranjit Jhala**
-
-University of California, San Diego
-
-<br>
-<br>
-
-Joint work with: 
-
-N. Vazou, E. Seidel, P. Rondon, M. Kawaguchi
-
-D. Vytiniotis, S. Peyton-Jones
-
-</div>
-
- {#motivation}
---------------
-
-
-<br>
-<br>
-
-<a href="00_Motivation_Long.lhs.slides.html" target="_blank">[Continue...]</a>
-
-
-Plan
-----
-
-<div class="fragment">
-<a href="01_SimpleRefinements.lhs.slides.html" target="_blank">**Refinement Types**</a>
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="02_Measures.lhs.slides.html" target= "_blank">**Data Structures**</a>
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="14_Memory.lhs.slides.html" target="_blank">**Low-level Memory Safety**</a>
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="11_Evaluation.lhs.slides.html" target="_blank">**Evaluation**</a>
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="12_Conclusion.lhs.slides.html" target="_blank">**Conclusion**</a>
-</div>
-
diff --git a/docs/slides/BOS14/lhs/Index.lhs b/docs/slides/BOS14/lhs/Index.lhs
deleted file mode 100644
--- a/docs/slides/BOS14/lhs/Index.lhs
+++ /dev/null
@@ -1,49 +0,0 @@
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-
- {#ASD}
-=======
-
-
-Abstract Refinement Types
--------------------------
-
-
-<br>
-<br>
-
-**Ranjit Jhala**
-
-University of California, San Diego
-
-<br>
-<br>
-
-Joint work with: 
-
-N. Vazou, E. Seidel, P. Rondon, D. Vytiniotis, S. Peyton-Jones
-
-<br>
-
-<div class="fragment">
-[[continue]](00_Motivation.lhs.slides.html)
-</div>
-
-
-Plan 
-----
-
-+ <a href="00_Motivation.lhs.slides.html" target="_blank">Motivation</a>
-+ <div class="fragment"><a href="01_SimpleRefinements.lhs.slides.html" target="_blank">Refinements</a></div>
-+ <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-+ <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements:</a> <a href="06_Inductive.lhs.slides.html" target="_blank">Functions</a>,<a href="08_Inductive.lhs.slides.html" target="_blank">Trees</a>,<a href="07_Array.lhs.slides.html" target= "_blank">Arrays</a></div>
-+ <div class="fragment"><a href="11_Evaluation.lhs.slides.html" target="_blank">Evaluation</a></div>
-+ <div class="fragment"><a href="12_Conclusion.lhs.slides.html" target="_blank">Conclusion</a></div>
-
diff --git a/docs/slides/ETH14/Makefile b/docs/slides/ETH14/Makefile
deleted file mode 100644
--- a/docs/slides/ETH14/Makefile
+++ /dev/null
@@ -1,92 +0,0 @@
-####################################################################
-SERVERHOME=nvazou@goto.ucsd.edu:~/public_html/liquidtutorial/
-RJSERVER=rjhala@goto.ucsd.edu:~/public_html/liquid/haskell/plpv/lhs/
-## LOCAL
-## MATHJAX=file:///Users/rjhala/research/MathJax
-## REMOTE 
-MATHJAX=https://c328740.ssl.cf1.rackcdn.com/mathjax/latest
-####################################################################
-
-STRIPCODE=./MkCode.hs
-
-REVEAL=pandoc \
-	   --from=markdown\
-	   --to=html5                           \
-	   --standalone                         \
-	   --mathjax \
-	   --section-divs                       \
-	   --template=_support/template.reveal  \
-	   --variable reveal=../_support/reveal.js \
-	   --variable mathjax=$(MATHJAX)
-
-FREVEAL=pandoc \
- 	   --from=markdown+lhs\
-	   --to=html5                           \
-	   --standalone                         \
-	   --mathjax \
-	   --section-divs                       \
-	   --template=_support/template.reveal  \
-	   --variable reveal=../_support/reveal.js
-
-PANDOC=pandoc --columns=80  -s --mathjax --slide-level=2
-SLIDY=$(PANDOC) -t slidy
-DZSLIDES=$(PANDOC) --highlight-style tango --css=slides.css -w dzslides
-HANDOUT=$(PANDOC) --highlight-style tango --css=text.css -w html5
-WEBTEX=$(PANDOC) -s --webtex -i -t slidy
-BEAMER=pandoc -t beamer
-LIQUID=liquid --short-names 
-
-mdObjects   := $(patsubst %.lhs,%.lhs.markdown,$(wildcard lhs/*.lhs))
-htmlObjects := $(patsubst %.lhs,%.lhs.slides.html,$(wildcard lhs/*.lhs))
-pdfObjects  := $(patsubst %.lhs,%.lhs.slides.pdf,$(wildcard lhs/*.lhs))
-fhtmlObjects := $(patsubst %.lhs,%.fast.html,$(wildcard lhs/*.lhs))
-
-####################################################################
-
-
-all: slides 
-
-fast: $(fhtmlObjects)
-
-one: $(mdObjects)
-	$(REVEAL) lhs/.liquid/00_Index.lhs.markdown > lhs/index.html
-
-tut: $(mdObjects)
-	$(REVEAL) lhs/.liquid/*.markdown > lhs/tutorial.html 
-
-slides: $(htmlObjects)
-
-pdfslides: $(pdfObjects)
-
-lhs/.liquid/%.lhs.markdown: lhs/%.lhs
-	-$(LIQUID) $?
-
-
-lhs/%.fast: lhs/%.lhs
-	$(STRIPCODE) $? > $@ 
-
-lhs/%.fast.html: lhs/%.fast
-	$(FREVEAL) $? -o $@ 
-
-lhs/%.lhs.slides.html: lhs/.liquid/%.lhs.markdown
-	$(REVEAL) $? -o $@ 
-
-lhs/%.lhs.slides.pdf: lhs/.liquid/%.lhs.markdown
-	$(BEAMER) $? -o $@
-
-
-copy:
-	cp lhs/*lhs.html html/
-	cp lhs/*lhs.slides.html html/
-	cp css/*.css html/
-	cp -r fonts html/
-	cp index.html html/
-	cp Benchmarks.html html/
-
-clean:
-	cd lhs/ && ../cleanup && cd ../
-#	cd html/ && rm -rf * && cd ../
-#	cp index.html html/
-
-upload: 
-	scp -r html/* $(SERVERHOME)
diff --git a/docs/slides/ETH14/MkCode.hs b/docs/slides/ETH14/MkCode.hs
deleted file mode 100644
--- a/docs/slides/ETH14/MkCode.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env runhaskell
-
-import System.Environment   (getArgs)
-import System.FilePath      (replaceExtension)
-import Data.Char            (isSpace)
-import Data.List            (isPrefixOf)
-
-main     = getArgs >>= mapM txFile 
-
-txFile f = (putStrLn . unlines . map txLine . lines) =<< readFile f
-
-txLine l 
-  | pfx `isPrefixOf` l = pfx
-  | otherwise          = l
-  where
-    pfx                = "\\begin{code}"
-
diff --git a/docs/slides/ETH14/_support/liquid.css b/docs/slides/ETH14/_support/liquid.css
deleted file mode 100644
--- a/docs/slides/ETH14/_support/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/ETH14/_support/liquidhaskell.css b/docs/slides/ETH14/_support/liquidhaskell.css
deleted file mode 100644
--- a/docs/slides/ETH14/_support/liquidhaskell.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/ETH14/_support/reveal.js/.travis.yml b/docs/slides/ETH14/_support/reveal.js/.travis.yml
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - 0.8
-before_script:
-  - npm install -g grunt-cli
diff --git a/docs/slides/ETH14/_support/reveal.js/Gruntfile.js b/docs/slides/ETH14/_support/reveal.js/Gruntfile.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/Gruntfile.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/* global module:false */
-module.exports = function(grunt) {
-	var port = grunt.option('port') || 8000;
-	// Project configuration
-	grunt.initConfig({
-		pkg: grunt.file.readJSON('package.json'),
-		meta: {
-			banner:
-				'/*!\n' +
-				' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
-				' * http://lab.hakim.se/reveal-js\n' +
-				' * MIT licensed\n' +
-				' *\n' +
-				' * Copyright (C) 2014 Hakim El Hattab, http://hakim.se\n' +
-				' */'
-		},
-
-		qunit: {
-			files: [ 'test/*.html' ]
-		},
-
-		uglify: {
-			options: {
-				banner: '<%= meta.banner %>\n'
-			},
-			build: {
-				src: 'js/reveal.js',
-				dest: 'js/reveal.min.js'
-			}
-		},
-
-		cssmin: {
-			compress: {
-				files: {
-					'css/reveal.min.css': [ 'css/reveal.css' ]
-				}
-			}
-		},
-
-		sass: {
-			main: {
-				files: {
-					'css/theme/default.css': 'css/theme/source/default.scss',
-					'css/theme/beige.css': 'css/theme/source/beige.scss',
-					'css/theme/night.css': 'css/theme/source/night.scss',
-					'css/theme/serif.css': 'css/theme/source/serif.scss',
-					'css/theme/simple.css': 'css/theme/source/simple.scss',
-					'css/theme/sky.css': 'css/theme/source/sky.scss',
-					'css/theme/moon.css': 'css/theme/source/moon.scss',
-					'css/theme/solarized.css': 'css/theme/source/solarized.scss',
-					'css/theme/blood.css': 'css/theme/source/blood.scss'
-				}
-			}
-		},
-
-		jshint: {
-			options: {
-				curly: false,
-				eqeqeq: true,
-				immed: true,
-				latedef: true,
-				newcap: true,
-				noarg: true,
-				sub: true,
-				undef: true,
-				eqnull: true,
-				browser: true,
-				expr: true,
-				globals: {
-					head: false,
-					module: false,
-					console: false,
-					unescape: false
-				}
-			},
-			files: [ 'Gruntfile.js', 'js/reveal.js' ]
-		},
-
-		connect: {
-			server: {
-				options: {
-					port: port,
-					base: '.'
-				}
-			}
-		},
-
-		zip: {
-			'reveal-js-presentation.zip': [
-				'index.html',
-				'css/**',
-				'js/**',
-				'lib/**',
-				'images/**',
-				'plugin/**'
-			]
-		},
-
-		watch: {
-			main: {
-				files: [ 'Gruntfile.js', 'js/reveal.js', 'css/reveal.css' ],
-				tasks: 'default'
-			},
-			theme: {
-				files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ],
-				tasks: 'themes'
-			}
-		}
-
-	});
-
-	// Dependencies
-	grunt.loadNpmTasks( 'grunt-contrib-qunit' );
-	grunt.loadNpmTasks( 'grunt-contrib-jshint' );
-	grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
-	grunt.loadNpmTasks( 'grunt-contrib-uglify' );
-	grunt.loadNpmTasks( 'grunt-contrib-watch' );
-	grunt.loadNpmTasks( 'grunt-contrib-sass' );
-	grunt.loadNpmTasks( 'grunt-contrib-connect' );
-	grunt.loadNpmTasks( 'grunt-zip' );
-
-	// Default task
-	grunt.registerTask( 'default', [ 'jshint', 'cssmin', 'uglify', 'qunit' ] );
-
-	// Theme task
-	grunt.registerTask( 'themes', [ 'sass' ] );
-
-	// Package presentation to archive
-	grunt.registerTask( 'package', [ 'default', 'zip' ] );
-
-	// Serve presentation locally
-	grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
-
-	// Run tests
-	grunt.registerTask( 'test', [ 'jshint', 'qunit' ] );
-
-};
diff --git a/docs/slides/ETH14/_support/reveal.js/LICENSE b/docs/slides/ETH14/_support/reveal.js/LICENSE
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2014 Hakim El Hattab, http://hakim.se
-
-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.
diff --git a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.eot b/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.eot
deleted file mode 100644
Binary files a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.eot and /dev/null differ
diff --git a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.svg b/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.svg
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.svg
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="LeagueGothicRegular" horiz-adv-x="724" >
-<font-face units-per-em="2048" ascent="1505" descent="-543" />
-<missing-glyph horiz-adv-x="315" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="2048" />
-<glyph unicode="&#xd;" horiz-adv-x="682" />
-<glyph unicode=" "  horiz-adv-x="315" />
-<glyph unicode="&#x09;" horiz-adv-x="315" />
-<glyph unicode="&#xa0;" horiz-adv-x="315" />
-<glyph unicode="!" horiz-adv-x="387" d="M74 1505h239l-55 -1099h-129zM86 0v227h215v-227h-215z" />
-<glyph unicode="&#x22;" horiz-adv-x="329" d="M57 1505h215l-30 -551h-154z" />
-<glyph unicode="#" horiz-adv-x="1232" d="M49 438l27 195h198l37 258h-196l26 194h197l57 420h197l-57 -420h260l57 420h197l-58 -420h193l-27 -194h-192l-37 -258h190l-26 -195h-191l-59 -438h-197l60 438h-261l-59 -438h-197l60 438h-199zM471 633h260l37 258h-260z" />
-<glyph unicode="$" horiz-adv-x="692" d="M37 358l192 13q12 -186 129 -187q88 0 93 185q0 74 -61 175q-21 36 -34 53l-40 55q-28 38 -65.5 90t-70.5 101.5t-70.5 141.5t-37.5 170q4 293 215 342v131h123v-125q201 -23 235 -282l-192 -25q-14 129 -93 125q-80 -2 -84 -162q0 -102 94 -227l41 -59q30 -42 37 -52 t33 -48l37 -52q41 -57 68 -109l26 -55q43 -94 43 -186q-4 -338 -245 -369v-217h-123v221q-236 41 -250 352z" />
-<glyph unicode="%" horiz-adv-x="1001" d="M55 911v437q0 110 82 156q33 18 90.5 18t97.5 -44t44 -87l4 -43v-437q0 -107 -81 -157q-32 -19 -77 -19q-129 0 -156 135zM158 0l553 1505h131l-547 -1505h-137zM178 911q-4 -55 37 -55q16 0 25.5 14.5t9.5 26.5v451q2 55 -35 55q-18 0 -27.5 -13.5t-9.5 -27.5v-451z M631 158v436q0 108 81 156q33 20 79 20q125 0 153 -135l4 -41v-436q0 -110 -80 -156q-32 -18 -90.5 -18t-98.5 43t-44 88zM754 158q-4 -57 37 -58q37 0 34 58v436q2 55 -34 55q-18 0 -27.5 -13t-9.5 -28v-450z" />
-<glyph unicode="&#x26;" horiz-adv-x="854" d="M49 304q0 126 44 225.5t126 222.5q-106 225 -106 442v18q0 94 47 180q70 130 223 130q203 0 252 -215q14 -61 12 -113q0 -162 -205 -434q76 -174 148 -285q33 96 47 211l176 -33q-16 -213 -92 -358q55 -63 92 -76v-235q-23 0 -86 37.5t-123 101.5q-123 -139 -252 -139 t-216 97t-87 223zM263 325.5q1 -65.5 28.5 -107.5t78.5 -42t117 86q-88 139 -174 295q-18 -30 -34.5 -98t-15.5 -133.5zM305 1194q0 -111 55 -246q101 156 101 252q-2 2 0 15.5t-2 36t-11 42.5q-19 52 -61.5 52t-62 -38t-19.5 -75v-39z" />
-<glyph unicode="'" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="(" horiz-adv-x="561" d="M66 645q0 143 29.5 292.5t73.5 261.5q92 235 159 343l30 47l162 -84q-38 -53 -86.5 -148t-82.5 -189.5t-61.5 -238t-27.5 -284.5t26.5 -282.5t64.5 -240.5q80 -207 141 -296l26 -39l-162 -84q-41 61 -96 173t-94 217.5t-70.5 257t-31.5 294.5z" />
-<glyph unicode=")" horiz-adv-x="561" d="M41 -213q36 50 85.5 147t83.5 190t61.5 236.5t27.5 284.5t-26.5 282.5t-64.5 240.5q-78 205 -140 298l-27 39l162 84q41 -61 96 -173.5t94 -217t71 -257.5t32 -296t-30 -292.5t-74 -260.5q-92 -233 -159 -342l-30 -47z" />
-<glyph unicode="*" horiz-adv-x="677" d="M74 1251l43 148l164 -70l-19 176h154l-19 -176l164 70l43 -148l-172 -34l115 -138l-131 -80l-78 152l-76 -152l-131 80l115 138z" />
-<glyph unicode="+" horiz-adv-x="1060" d="M74 649v172h370v346h172v-346h371v-172h-371v-346h-172v346h-370z" />
-<glyph unicode="," horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="-" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="." horiz-adv-x="321" d="M53 0v227h215v-227h-215z" />
-<glyph unicode="/" horiz-adv-x="720" d="M8 -147l543 1652h162l-537 -1652h-168z" />
-<glyph unicode="0" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="1" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="2" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="3" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="4" horiz-adv-x="684" d="M25 328v194l323 983h221v-983h103v-194h-103v-328h-202v328h-342zM213 522h154v516h-13z" />
-<glyph unicode="5" horiz-adv-x="704" d="M74 438h221v-59q0 -115 14.5 -159t52 -44t53 45t15.5 156v336q0 111 -70 110q-33 0 -59.5 -40t-26.5 -70h-186v792h535v-219h-344v-313q74 55 127 51q78 0 133 -40t77 -100q35 -98 35 -171v-336q0 -393 -289 -393q-78 0 -133 29.5t-84.5 71.5t-46.5 109q-24 98 -24 244z " />
-<glyph unicode="6" horiz-adv-x="700" d="M66 309v856q0 356 288.5 356.5t288.5 -356.5v-94h-221q0 162 -11.5 210t-53.5 48t-56 -37t-14 -127v-268q59 37 124.5 37t119 -36t75.5 -93q37 -92 37 -189v-307q0 -90 -42 -187q-26 -61 -89 -99.5t-157.5 -38.5t-158 38.5t-88.5 99.5q-42 98 -42 187zM287 244 q0 -20 17.5 -44t49 -24t50 24.5t18.5 43.5v450q0 18 -18.5 43t-49 25t-48 -20.5t-19.5 -41.5v-456z" />
-<glyph unicode="7" horiz-adv-x="589" d="M8 1286v219h557v-221l-221 -1284h-229l225 1286h-332z" />
-<glyph unicode="8" horiz-adv-x="696" d="M53 322v176q0 188 115 297q-102 102 -102 276v127q0 213 147 293q57 31 135 31t135.5 -31t84 -71t42.5 -93q21 -66 21 -129v-127q0 -174 -103 -276q115 -109 115 -297v-176q0 -222 -153 -306q-60 -32 -142 -32t-141.5 32.5t-88 73.5t-44.5 96q-21 69 -21 136zM269 422 q1 -139 16.5 -187.5t57.5 -48.5t59.5 30t21.5 71t4 158t-13.5 174t-66.5 57t-66.5 -57.5t-12.5 -196.5zM284 1116q-1 -123 11 -173t53 -50t53.5 50t12.5 170t-12.5 167t-51.5 47t-52 -44t-14 -167z" />
-<glyph unicode="9" horiz-adv-x="700" d="M57 340v94h222q0 -162 11 -210t53 -48t56.5 37t14.5 127v283q-59 -37 -125 -37t-119 35.5t-76 92.5q-37 96 -37 189v293q0 87 43 188q25 60 88.5 99t157.5 39t157.5 -39t88.5 -99q43 -101 43 -188v-856q0 -356 -289 -356t-289 356zM279 825q0 -18 18 -42.5t49 -24.5 t48.5 20.5t19.5 40.5v443q0 20 -17.5 43.5t-49.5 23.5t-50 -24.5t-18 -42.5v-437z" />
-<glyph unicode=":" horiz-adv-x="362" d="M74 0v227h215v-227h-215zM74 893v227h215v-227h-215z" />
-<glyph unicode=";" horiz-adv-x="362" d="M74 0v227h215v-227l-113 -266h-102l71 266h-71zM74 893v227h215v-227h-215z" />
-<glyph unicode="&#x3c;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="=" horiz-adv-x="1058" d="M74 477v172h911v-172h-911zM74 864v172h911v-172h-911z" />
-<glyph unicode="&#x3e;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="?" horiz-adv-x="645" d="M25 1260q24 67 78 131q105 128 235 122q82 -2 138 -33.5t82 -81.5q46 -88 46 -170.5t-80 -219.5l-57 -96q-18 -32 -42 -106.5t-24 -143.5v-256h-190v256q0 102 24.5 195t48 140t65.5 118t50 105t-9 67.5t-60 34.5t-78 -48t-49 -98zM199 0h215v227h-215v-227z" />
-<glyph unicode="@" horiz-adv-x="872" d="M66 303v889q0 97 73 200q39 56 117 93t184.5 37t184 -37t116.5 -93q74 -105 74 -200v-793h-164l-20 56q-14 -28 -46 -48t-67 -20q-145 0 -145 172v485q0 170 145 170q71 0 113 -67v45q0 51 -45 104.5t-145.5 53.5t-145.5 -53.5t-45 -104.5v-889q0 -53 44 -103t153.5 -50 t160.5 63l152 -86q-109 -143 -320 -143q-106 0 -184 35.5t-117 90.5q-73 102 -73 193zM535 573q0 -53 48 -53t48 53v455q0 53 -48 53t-48 -53v-455z" />
-<glyph unicode="A" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="B" horiz-adv-x="745" d="M82 0v1505h194q205 0 304.5 -91t99.5 -308q0 -106 -29.5 -175t-107.5 -136q14 -5 47 -38.5t54 -71.5q52 -97 52 -259q0 -414 -342 -426h-272zM303 219q74 0 109 31q55 56 55 211t-63 195q-42 26 -93 26h-8v-463zM303 885q87 0 119 39q45 55 45 138t-14.5 124t-30.5 60.5 t-45 28.5q-35 11 -74 11v-401z" />
-<glyph unicode="C" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175z" />
-<glyph unicode="D" horiz-adv-x="761" d="M82 0v1505h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174zM303 221q117 0 140.5 78t23.5 399v111q0 322 -23.5 398.5t-140.5 76.5v-1063z" />
-<glyph unicode="E" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506z" />
-<glyph unicode="F" horiz-adv-x="616" d="M82 0v1505h526v-227h-305v-395h205v-228h-205v-655h-221z" />
-<glyph unicode="G" horiz-adv-x="737" d="M67 271.5q0 26.5 1 37.5v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-231h-221v231q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-905q0 -46 19.5 -78.5t54 -32.5t53 28t18.5 54l2 29v272h-88v187h309v-750h-131l-26 72 q-70 -88 -172 -88q-203 0 -250 213q-11 48 -11 74.5z" />
-<glyph unicode="H" horiz-adv-x="778" d="M82 0v1505h221v-622h172v622h221v-1505h-221v655h-172v-655h-221z" />
-<glyph unicode="I" horiz-adv-x="385" d="M82 0v1505h221v-1505h-221z" />
-<glyph unicode="J" horiz-adv-x="423" d="M12 -14v217q4 0 12.5 -1t29 2t35.5 12t28.5 34.5t13.5 62.5v1192h221v-1226q0 -137 -74 -216q-74 -78 -223 -78h-4q-19 0 -39 1z" />
-<glyph unicode="K" horiz-adv-x="768" d="M82 0v1505h221v-526h8l195 526h215l-203 -495l230 -1010h-216l-153 655l-6 31h-6l-64 -154v-532h-221z" />
-<glyph unicode="L" horiz-adv-x="604" d="M82 0v1505h221v-1300h293v-205h-514z" />
-<glyph unicode="M" horiz-adv-x="991" d="M82 0v1505h270l131 -688l11 -80h4l10 80l131 688h270v-1505h-204v1010h-13l-149 -1010h-94l-142 946l-8 64h-12v-1010h-205z" />
-<glyph unicode="N" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203z" />
-<glyph unicode="O" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="P" horiz-adv-x="720" d="M82 0v1505h221q166 0 277.5 -105.5t111.5 -345t-111.5 -346t-277.5 -106.5v-602h-221zM303 827q102 0 134 45.5t32 175.5t-33 181t-133 51v-453z" />
-<glyph unicode="Q" horiz-adv-x="729" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -94 -45 -182q33 -43 88 -53v-189q-160 0 -227 117q-55 -18 -125 -18t-130 33.5t-88 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887 q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="R" horiz-adv-x="739" d="M82 0v1505h221q377 0 377 -434q0 -258 -123 -342l141 -729h-221l-115 635h-59v-635h-221zM303 840q117 0 149 98q15 49 15 125t-15.5 125t-45.5 68q-44 30 -103 30v-446z" />
-<glyph unicode="S" horiz-adv-x="702" d="M37 422l217 20q0 -256 104 -256q90 0 91 166q0 59 -32 117.5t-45 79.5l-54 79q-40 58 -77 113t-73.5 117t-68 148.5t-31.5 162.5q0 139 71.5 245t216.5 108h10q88 0 152 -36t94 -100q54 -120 54 -264l-217 -20q0 217 -89 217q-75 -2 -75 -146q0 -59 23 -105 q32 -66 58 -104l197 -296q31 -49 67 -139.5t36 -166.5q0 -378 -306 -378h-2q-229 0 -290 188q-31 99 -31 250z" />
-<glyph unicode="T" horiz-adv-x="647" d="M4 1278v227h639v-227h-209v-1278h-221v1278h-209z" />
-<glyph unicode="U" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175z" />
-<glyph unicode="V" horiz-adv-x="716" d="M18 1505h215l111 -827l8 -64h13l118 891h215l-229 -1505h-221z" />
-<glyph unicode="W" horiz-adv-x="1036" d="M25 1505h204l88 -782l5 -49h16l100 831h160l100 -831h17l92 831h205l-203 -1505h-172l-115 801h-8l-115 -801h-172z" />
-<glyph unicode="X" horiz-adv-x="737" d="M16 0l244 791l-240 714h218l120 -381l7 -18h8l127 399h217l-240 -714l244 -791h-217l-127 449l-4 18h-8l-132 -467h-217z" />
-<glyph unicode="Y" horiz-adv-x="700" d="M14 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641z" />
-<glyph unicode="Z" horiz-adv-x="626" d="M20 0v238l347 1048h-297v219h536v-219l-352 -1067h352v-219h-586z" />
-<glyph unicode="[" horiz-adv-x="538" d="M82 -213v1718h399v-196h-202v-1325h202v-197h-399z" />
-<glyph unicode="\" horiz-adv-x="792" d="M8 1692h162l614 -1872h-168z" />
-<glyph unicode="]" horiz-adv-x="538" d="M57 -16h203v1325h-203v196h400v-1718h-400v197z" />
-<glyph unicode="^" horiz-adv-x="1101" d="M53 809l381 696h234l381 -696h-199l-299 543l-299 -543h-199z" />
-<glyph unicode="_" horiz-adv-x="1210" d="M74 -154h1063v-172h-1063v172z" />
-<glyph unicode="`" horiz-adv-x="1024" d="M293 1489h215l106 -184h-159z" />
-<glyph unicode="a" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="b" horiz-adv-x="686" d="M82 0v1505h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-74h-207zM289 246q0 -29 19.5 -48.5t42 -19.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -21.5t-19.5 -46.5v-628z" />
-<glyph unicode="c" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331z" />
-<glyph unicode="d" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v458h207v-1505h-207v74q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 19.5t19.5 48.5v628q0 25 -19.5 46.5t-42 21.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="e" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="f" horiz-adv-x="475" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-65 0 -65 -175v-5v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="g" horiz-adv-x="700" d="M12 -184q0 94 162 170q-125 35 -125 149q0 45 40 93t89 75q-51 35 -80.5 95.5t-34.5 105.5l-4 43v305q0 35 16.5 91t41 94t79 69t126.5 31q135 0 206 -103q102 102 170 103v-185q-72 0 -120 -24l10 -70v-317q0 -37 -17.5 -90.5t-42 -90t-79 -66.5t-104.5 -30t-62 2 q-29 -25 -29 -46t11 -33.5t42 -20.5t45.5 -10t65.5 -10.5t95 -21.5t89 -41q96 -60 96 -205t-103 -212q-100 -65 -250 -65h-9q-156 2 -240 50t-84 165zM213 -150q0 -77 132 -77h3q59 0 108.5 19t49.5 54t-20.5 52.5t-90.5 29.5l-106 21q-76 -43 -76 -99zM262 509 q0 -17 15.5 -45t44.5 -28q63 6 63 101v307q-2 0 0 10q1 3 1 7q0 8 -3 19q-4 15 -9 30q-11 36 -46 36t-50.5 -25.5t-15.5 -52.5v-359z" />
-<glyph unicode="h" horiz-adv-x="690" d="M82 0v1505h207v-479l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="i" horiz-adv-x="370" d="M82 0v1120h207v-1120h-207zM82 1298v207h207v-207h-207z" />
-<glyph unicode="j" horiz-adv-x="364" d="M-45 -182q29 -8 57 -8q64 0 64 142v1168h207v-1149q0 -186 -51 -266q-23 -35 -71 -62.5t-115 -27.5t-91 12v191zM76 1298v207h207v-207h-207z" />
-<glyph unicode="k" horiz-adv-x="641" d="M82 0v1505h207v-714h10l113 329h186l-149 -364l188 -756h-199l-102 453l-4 16h-10l-33 -82v-387h-207z" />
-<glyph unicode="l" horiz-adv-x="370" d="M82 0v1505h207v-1505h-207z" />
-<glyph unicode="m" horiz-adv-x="1021" d="M82 0v1120h207v-94q2 0 33 30q80 81 139 81q100 0 139 -125q125 125 194.5 125t109.5 -69t40 -150v-918h-194v887q-1 49 -56 49q-41 0 -78 -53v-883h-194v887q0 49 -55 49q-41 0 -78 -53v-883h-207z" />
-<glyph unicode="n" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="o" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="p" horiz-adv-x="686" d="M82 -385v1505h207v-73q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="q" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v73h207v-1505h-207v459q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 21.5t19.5 46.5v628q0 29 -19.5 48.5t-42 19.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="r" horiz-adv-x="503" d="M82 0v1120h207v-125q8 41 58.5 91.5t148.5 50.5v-230q-34 11 -77 11t-86.5 -39t-43.5 -101v-778h-207z" />
-<glyph unicode="s" horiz-adv-x="630" d="M37 326h192q0 -170 97 -170q71 0 71 131q0 78 -129 202q-68 66 -98.5 99t-64 101.5t-33.5 134t12 114.5t39 95q59 100 201 104h11q161 0 211 -105q42 -86 42 -198h-193q0 131 -67 131q-63 -2 -64 -131q0 -33 23.5 -73t45 -62.5t66.5 -65.5q190 -182 191 -342 q0 -123 -64.5 -215t-199.5 -92q-197 0 -260 170q-29 76 -29 172z" />
-<glyph unicode="t" horiz-adv-x="501" d="M20 934v186h105v277h207v-277h141v-186h-141v-557q0 -184 65 -184l76 8v-203q-45 -14 -112 -14t-114.5 28.5t-70 64.5t-34.5 96q-17 79 -17 187v574h-105z" />
-<glyph unicode="u" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5z" />
-<glyph unicode="v" horiz-adv-x="602" d="M16 1120h201l68 -649l8 -72h16l76 721h201l-183 -1120h-204z" />
-<glyph unicode="w" horiz-adv-x="905" d="M20 1120h189l65 -585l9 -64h12l96 649h123l86 -585l10 -64h13l73 649h189l-166 -1120h-172l-80 535l-10 63h-8l-91 -598h-172z" />
-<glyph unicode="x" horiz-adv-x="618" d="M16 0l193 578l-176 542h194l74 -262l6 -31h4l6 31l74 262h195l-176 -542l192 -578h-201l-84 283l-6 30h-4l-6 -30l-84 -283h-201z" />
-<glyph unicode="y" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5z" />
-<glyph unicode="z" horiz-adv-x="532" d="M12 0v168l285 764h-240v188h459v-168l-285 -764h285v-188h-504z" />
-<glyph unicode="{" horiz-adv-x="688" d="M61 453v163q72 0 102 49.5t30 90.5v397q0 223 96 298t342 71v-172q-135 2 -188.5 -38t-53.5 -159v-397q0 -143 -127 -221q127 -82 127 -222v-397q0 -119 53.5 -159t188.5 -38v-172q-246 -4 -342 71t-96 298v397q0 57 -41 97.5t-91 42.5z" />
-<glyph unicode="|" horiz-adv-x="356" d="M82 -512v2204h192v-2204h-192z" />
-<glyph unicode="}" horiz-adv-x="688" d="M57 -281q135 -2 188.5 38t53.5 159v397q0 139 127 222q-127 78 -127 221v397q0 119 -53 159t-189 38v172q246 4 342.5 -71t96.5 -298v-397q0 -63 41 -101.5t90 -38.5v-163q-72 -4 -101.5 -52.5t-29.5 -87.5v-397q0 -223 -96.5 -298t-342.5 -71v172z" />
-<glyph unicode="~" horiz-adv-x="1280" d="M113 1352q35 106 115 200q34 41 94.5 74t121 33t116.5 -18.5t82 -33t83 -51.5q106 -72 174 -71q109 0 178 153l13 29l135 -57q-63 -189 -206 -276q-56 -34 -120 -34q-121 0 -272 101q-115 74 -178.5 74t-113.5 -45.5t-69 -90.5l-18 -45z" />
-<glyph unicode="&#xa1;" horiz-adv-x="387" d="M74 -385l55 1100h129l55 -1100h-239zM86 893v227h215v-227h-215z" />
-<glyph unicode="&#xa2;" horiz-adv-x="636" d="M66 508v489q0 297 208 328v242h123v-244q98 -16 144.5 -88t46.5 -227v-88h-189v135q0 90 -72.5 90t-72.5 -90v-604q0 -90 72 -91q74 0 73 91v155h189v-108q0 -156 -46 -228.5t-145 -89.5v-303h-123v301q-209 31 -208 330z" />
-<glyph unicode="&#xa3;" horiz-adv-x="817" d="M4 63q8 20 23.5 53.5t70 91.5t117.5 68q37 111 37 189t-31 184h-188v137h147l-6 21q-78 254 -78 333t15.5 140t48.5 116q72 122 231 126q190 4 267 -126q65 -108 65 -276h-213q0 201 -115 197q-47 -2 -68.5 -51t-21.5 -139.5t70 -315.5l6 -25h211v-137h-174 q25 -100 24.5 -189t-57.5 -204q16 -8 44 -24q59 -35 89 -35q74 4 82 190l188 -22q-12 -182 -81.5 -281.5t-169.5 -99.5q-51 0 -143.5 51t-127.5 51t-63.5 -25.5t-40.5 -52.5l-12 -24z" />
-<glyph unicode="&#xa5;" horiz-adv-x="720" d="M25 1505h217l110 -481l6 -14h4l7 14l110 481h217l-196 -753h147v-138h-176v-137h176v-137h-176v-340h-221v340h-176v137h176v137h-176v138h147z" />
-<glyph unicode="&#xa8;" horiz-adv-x="1024" d="M272 1305v200h191v-200h-191zM561 1305v200h191v-200h-191z" />
-<glyph unicode="&#xa9;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM627 487v531q0 122 97 174q40 22 95 22 q147 0 182 -147l7 -49v-125h-138v142q0 11 -12 28.5t-37 17.5q-47 -2 -49 -63v-531q0 -63 49 -63q53 2 49 63v125h138v-125q0 -68 -40 -127q-18 -26 -57 -47.5t-108.5 -21.5t-117.5 49t-54 98z" />
-<glyph unicode="&#xaa;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xad;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#xae;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM625 313v879h196q231 0 232 -258 q0 -76 -16.5 -125t-71.5 -96l106 -400h-151l-95 365h-55v-365h-145zM770 805h45q43 0 65.5 21.5t27.5 45t5 61.5t-5 62.5t-27.5 46t-65.5 21.5h-45v-258z" />
-<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M313 1315v162h398v-162h-398z" />
-<glyph unicode="&#xb2;" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="&#xb3;" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="&#xb4;" horiz-adv-x="1024" d="M410 1305l106 184h215l-162 -184h-159z" />
-<glyph unicode="&#xb7;" horiz-adv-x="215" d="M0 649v228h215v-228h-215z" />
-<glyph unicode="&#xb8;" horiz-adv-x="1024" d="M426 -111h172v-141l-45 -133h-104l40 133h-63v141z" />
-<glyph unicode="&#xb9;" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="&#xba;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="&#xbf;" horiz-adv-x="645" d="M41 -106q0 82 80 219l57 95q18 32 42 106.5t24 144.5v256h190v-256q0 -102 -24.5 -195.5t-48 -140.5t-65.5 -118t-50 -104.5t9 -67.5t60 -35t78 48.5t49 98.5l179 -84q-24 -66 -78 -132q-104 -126 -236 -122q-163 4 -220 115q-46 90 -46 172zM231 893v227h215v-227h-215z " />
-<glyph unicode="&#xc0;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM141 1823h215l107 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc1;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM293 1638l106 185h215l-161 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc2;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM133 1638l141 185h220l141 -185h-189l-63 72l-61 -72h-189zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc3;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM184 1632v152q49 39 95.5 39t104.5 -18.5t100.5 -19.5t97.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-98 19.5t-102 -33zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc4;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM143 1638v201h191v-201h-191zM307 541h152l-64 475l-6 39h-12zM432 1638v201h191v-201h-191z" />
-<glyph unicode="&#xc5;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM231 1761.5q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM307 541h152l-64 475l-6 39h-12zM309 1761.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50 t-23.5 50t-52.5 21.5t-52.5 -21.5t-23.5 -50z" />
-<glyph unicode="&#xc6;" horiz-adv-x="1099" d="M16 0l420 1505h623v-227h-285v-395h205v-242h-205v-414h285v-227h-506v307h-227l-90 -307h-220zM393 541h160v514h-10z" />
-<glyph unicode="&#xc7;" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM268 -111v-141h64l-41 -133h104l45 133v141h-172z" />
-<glyph unicode="&#xc8;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM111 1823h215l106 -185h-160z" />
-<glyph unicode="&#xc9;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM236 1638l106 185h215l-162 -185h-159z" />
-<glyph unicode="&#xca;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM84 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xcb;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM94 1638v201h191v-201h-191zM383 1638v201h190v-201h-190z" />
-<glyph unicode="&#xcc;" horiz-adv-x="401" d="M-6 1823h215l106 -185h-159zM98 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcd;" horiz-adv-x="401" d="M82 0v1505h221v-1505h-221zM86 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xce;" horiz-adv-x="370" d="M-66 1638l142 185h219l141 -185h-188l-64 72l-61 -72h-189zM74 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcf;" horiz-adv-x="372" d="M-53 1638v201h190v-201h-190zM76 0v1505h221v-1505h-221zM236 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd0;" horiz-adv-x="761" d="M20 655v228h62v622h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174v655h-62zM303 221q117 0 141.5 81t22.5 452q2 371 -22.5 450.5t-141.5 79.5v-401h84v-228h-84v-434z " />
-<glyph unicode="&#xd1;" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203zM207 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39t-102.5 19.5t-100 19.5t-99.5 -33z" />
-<glyph unicode="&#xd2;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM121 1823h215l106 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd3;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM285 1638l106 185h215l-162 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5 t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd4;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM113 1638l141 185h219l141 -185h-188l-64 72l-61 -72h-188zM289 309q0 -46 19.5 -78 t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd5;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM164 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39 t-102.5 19.5t-100 19.5t-99.5 -33zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd6;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM123 1638v201h190v-201h-190zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887zM412 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd8;" d="M59 -20l47 157q-36 74 -36 148l-2 24v887q0 42 17 106t45 107t88.5 78t148 35t153.5 -43l15 47h122l-45 -150q43 -84 43 -155l2 -25v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-150.5 -34.5t-153 43l-15 -47h-129zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v488zM289 727l147 479q-8 100 -74 101q-35 0 -53 -28t-18 -54l-2 -29v-469z" />
-<glyph unicode="&#xd9;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM145 1823h215l107 -185h-160z" />
-<glyph unicode="&#xda;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM307 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xdb;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM125 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xdc;" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175zM135 1638v201h191v-201h-191zM424 1638v201h190v-201h-190z" />
-<glyph unicode="&#xdd;" horiz-adv-x="704" d="M16 1505l226 -864v-641h221v641l225 864h-217l-111 -481l-6 -14h-4l-6 14l-111 481h-217zM254 1638l106 185h215l-161 -185h-160z" />
-<glyph unicode="&#xde;" d="M82 0v1505h219v-241h2q166 0 277.5 -105.5t111.5 -345.5t-111.5 -346.5t-277.5 -106.5v-360h-221zM303 586q102 0 134 45t32 175t-33 181t-133 51v-452z" />
-<glyph unicode="&#xdf;" horiz-adv-x="733" d="M66 0v1235q0 123 70.5 205t206.5 82t204.5 -81t68.5 -197t-88 -181q152 -88 152 -488q0 -362 -87 -475q-46 -59 -102.5 -79.5t-144.5 -20.5v193q45 0 70 25q57 57 57 357q0 316 -57 377q-25 27 -70 27v141q35 0 60.5 33t25.5 84q0 100 -86 100q-74 0 -74 -102v-1235h-206 z" />
-<glyph unicode="&#xe0;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1489h215 l107 -184h-160zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe1;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xe2;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM90 1305 l141 184h220l141 -184h-189l-63 71l-61 -71h-189zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe3;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM143 1305v151 q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe4;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1305v200 h191v-200h-191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM391 1305v200h191v-200h-191z" />
-<glyph unicode="&#xe5;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM188 1421.5 q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM266 1421.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50t-23.5 50t-52.5 21.5t-52.5 -21.5 t-23.5 -50z" />
-<glyph unicode="&#xe6;" horiz-adv-x="989" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t197.5 88q84 0 152 -52q66 51 162 52q199 0 251 -197q14 -51 15 -92v-326h-342v-256q0 -60 38 -88q17 -12 38 -12q70 10 73 113v122h193v-129 q0 -37 -16.5 -93t-41 -95t-80 -69.5t-130.5 -30.5q-158 0 -226 131q-102 -131 -221 -131q-59 0 -112.5 60t-53.5 191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM588 684h149v158q0 48 -19.5 81t-53 33t-53 -28.5t-21.5 -57.5l-2 -28v-158z " />
-<glyph unicode="&#xe7;" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331zM238 -111v-141h63l-41 -133h105l45 133v141h-172z " />
-<glyph unicode="&#xe8;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM102 1489h215l107 -184 h-160zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xe9;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xea;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM80 1305l141 184h219 l142 -184h-189l-63 71l-62 -71h-188zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xeb;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM90 1305v200h191v-200 h-191zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xec;" horiz-adv-x="370" d="M-33 1489h215l107 -184h-160zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xed;" horiz-adv-x="370" d="M82 0h207v1120h-207v-1120zM82 1305l106 184h215l-161 -184h-160z" />
-<glyph unicode="&#xee;" horiz-adv-x="370" d="M-66 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xef;" horiz-adv-x="372" d="M-53 1305v200h190v-200h-190zM82 0v1120h207v-1120h-207zM236 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf0;" horiz-adv-x="673" d="M76 279v579q0 279 172 279q63 0 155 -78q-12 109 -51 203l-82 -72l-55 63l100 88l-45 66l109 100q25 -27 53 -61l94 82l56 -66l-101 -88q125 -201 125 -446v-656q0 -102 -56 -188q-26 -39 -80 -69.5t-129 -30.5t-130 30.5t-80 73.5q-53 91 -53 160zM270 267.5 q-2 -11.5 2 -29t10 -34.5q16 -38 58 -38q70 10 72 113v563q-2 0 0 11t-2 28.5t-10 34.5q-16 40 -60 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf1;" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207zM147 1305v151q49 39 95.5 39t105 -18.5t97 -19.5t100.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#xf2;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM98 1489h215l107 -184h-160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf3;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5 t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM260 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xf4;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM78 1305l141 184h219l142 -184h-189l-63 71l-62 -71h-188zM258 267.5q-2 -11.5 2 -29 t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf5;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM131 1305v151q49 39 95.5 39t104.5 -18.5t98.5 -19.5t98.5 32v-152q-51 -39 -95 -39 t-102 19.5t-101 19.5t-99 -32zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf6;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM90 1305v200h191v-200h-191zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf8;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t118 32t117.5 -19l21 80h75l-30 -121q88 -84 94 -229v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-120.5 -30.5t-112 16l-20 -78h-80l31 121q-41 39 -64.5 97.5t-25.5 97.5zM258 436l125 486q-18 35 -55 34q-68 -10 -70 -114 v-406zM274 197q17 -31 54 -31q70 10 71 113v403z" />
-<glyph unicode="&#xf9;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM113 1489h215l106 -184h-160z" />
-<glyph unicode="&#xfa;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM274 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfb;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM94 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189z" />
-<glyph unicode="&#xfc;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM106 1305v200h191v-200h-191zM395 1305v200h191v-200h-191z" />
-<glyph unicode="&#xfd;" horiz-adv-x="634" d="M25 1120l190 -1153q0 -68 -36 -123t-97 -61l-49 4v-184q70 -4 92 -4q115 0 192.5 95t94.5 222l198 1204h-202l-82 -688l-4 -57h-9l-4 57l-82 688h-202zM231 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfe;" horiz-adv-x="686" d="M82 -385v1890h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="&#xff;" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5zM78 1305v200h190v-200h-190zM367 1305v200h190v-200h-190z" />
-<glyph unicode="&#x152;" horiz-adv-x="983" d="M68 309v887q0 41 17 101.5t45 100.5t88.5 73.5t143.5 33.5h580v-227h-285v-395h205v-242h-205v-414h285v-227h-580q-84 0 -144 31.5t-88 78.5q-55 91 -60 169zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v901q-6 96 -74 97q-35 0 -53 -28t-18 -54l-2 -29 v-887z" />
-<glyph unicode="&#x153;" horiz-adv-x="995" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t145.5 32t156 -60q66 59 170 60q199 0 252 -197q14 -51 14 -92v-326h-342v-250q0 -46 22.5 -76t53.5 -30q70 10 73 113v122h193v-129q0 -37 -16.5 -93t-41 -95t-80 -69.5t-146 -30.5t-154.5 57q-68 -57 -156 -57t-143.5 30.5 t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM594 684h149v158q0 48 -19 81t-58 33t-55.5 -37.5t-16.5 -70.5v-164z" />
-<glyph unicode="&#x178;" horiz-adv-x="704" d="M16 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641zM113 1638v201h190v-201h-190zM401 1638v201h191v-201h-191z" />
-<glyph unicode="&#x2c6;" horiz-adv-x="1021" d="M260 1305l141 184h220l141 -184h-189l-63 71l-61 -71h-189z" />
-<glyph unicode="&#x2dc;" horiz-adv-x="1024" d="M313 1305v151q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#x2000;" horiz-adv-x="952" />
-<glyph unicode="&#x2001;" horiz-adv-x="1905" />
-<glyph unicode="&#x2002;" horiz-adv-x="952" />
-<glyph unicode="&#x2003;" horiz-adv-x="1905" />
-<glyph unicode="&#x2004;" horiz-adv-x="635" />
-<glyph unicode="&#x2005;" horiz-adv-x="476" />
-<glyph unicode="&#x2006;" horiz-adv-x="317" />
-<glyph unicode="&#x2007;" horiz-adv-x="317" />
-<glyph unicode="&#x2008;" horiz-adv-x="238" />
-<glyph unicode="&#x2009;" horiz-adv-x="381" />
-<glyph unicode="&#x200a;" horiz-adv-x="105" />
-<glyph unicode="&#x2010;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2011;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2012;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2013;" horiz-adv-x="806" d="M74 649v195h659v-195h-659z" />
-<glyph unicode="&#x2014;" horiz-adv-x="972" d="M74 649v195h825v-195h-825z" />
-<glyph unicode="&#x2018;" horiz-adv-x="309" d="M49 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x2019;" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="&#x201a;" horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="&#x201c;" horiz-adv-x="624" d="M53 1012v227l113 266h102l-71 -266h71v-227h-215zM356 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x201d;" horiz-adv-x="624" d="M53 1012l72 266h-72v227h215v-227l-112 -266h-103zM356 1012l72 266h-72v227h215v-227l-112 -266h-103z" />
-<glyph unicode="&#x201e;" horiz-adv-x="624" d="M53 0v227h215v-227l-112 -266h-103l72 266h-72zM356 0v227h215v-227l-112 -266h-103l72 266h-72z" />
-<glyph unicode="&#x2022;" horiz-adv-x="663" d="M82 815q0 104 72.5 177t177 73t177.5 -72.5t73 -177t-73 -177.5t-177 -73t-177 73t-73 177z" />
-<glyph unicode="&#x2026;" horiz-adv-x="964" d="M53 0v227h215v-227h-215zM375 0v227h215v-227h-215zM696 0v227h215v-227h-215z" />
-<glyph unicode="&#x202f;" horiz-adv-x="381" />
-<glyph unicode="&#x2039;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="&#x203a;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="&#x205f;" horiz-adv-x="476" />
-<glyph unicode="&#x20ac;" horiz-adv-x="813" d="M53 547v137h107v137h-107v137h107v238q0 42 17.5 106t45 107t88 78t144.5 35t144 -34t88 -81q53 -90 61 -178l2 -33v-84h-207v84q-2 0 0 11.5t-3 27.5t-12 33q-18 39 -69 39q-70 -10 -78 -111v-238h233v-137h-233v-137h233v-137h-233v-238q0 -43 21.5 -76.5t59.5 -33.5 t58.5 27.5t20.5 56.5l2 26v84h207v-84q0 -38 -17.5 -104t-45.5 -109t-88 -77.5t-144 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175l-2 35v238h-107z" />
-<glyph unicode="&#x2122;" horiz-adv-x="937" d="M74 1401v104h321v-104h-104v-580h-113v580h-104zM440 821v684h138l67 -319h6l68 319h137v-684h-104v449l-78 -449h-51l-80 449v-449h-103z" />
-<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 0v1120h1120v-1120h-1120z" />
-<glyph unicode="&#xfb01;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2v-184q-41 12 -91 12t-69.5 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h358v-1120h-207v934h-151v-934h-207v934h-105z" />
-<glyph unicode="&#xfb02;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2h164v-1505h-207v1329q-37 4 -67.5 4t-50 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="&#xfb03;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1120h207v-1120h-207zM1032 1298v207h207v-207h-207z" />
-<glyph unicode="&#xfb04;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1505h207v-1505h-207z" />
-</font>
-</defs></svg> 
diff --git a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.ttf b/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.ttf
deleted file mode 100644
Binary files a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.ttf and /dev/null differ
diff --git a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.woff b/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.woff
deleted file mode 100644
Binary files a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic-webfont.woff and /dev/null differ
diff --git a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic_license b/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic_license
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/lib/font/league_gothic_license
+++ /dev/null
@@ -1,2 +0,0 @@
-SIL Open Font License (OFL)
-http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/highlight/highlight.js b/docs/slides/ETH14/_support/reveal.js/plugin/highlight/highlight.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/highlight/highlight.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// START CUSTOM REVEAL.JS INTEGRATION
-(function() {
-	if( typeof window.addEventListener === 'function' ) {
-		var hljs_nodes = document.querySelectorAll( 'pre code' );
-
-		for( var i = 0, len = hljs_nodes.length; i < len; i++ ) {
-			var element = hljs_nodes[i];
-
-			// trim whitespace if data-trim attribute is present
-			if( element.hasAttribute( 'data-trim' ) && typeof element.innerHTML.trim === 'function' ) {
-				element.innerHTML = element.innerHTML.trim();
-			}
-
-			// Now escape html unless prevented by author
-			if( ! element.hasAttribute( 'data-noescape' )) {
-				element.innerHTML = element.innerHTML.replace(/</g,"&lt;").replace(/>/g,"&gt;");
-			}
-
-			// re-highlight when focus is lost (for edited code)
-			element.addEventListener( 'focusout', function( event ) {
-				hljs.highlightBlock( event.currentTarget );
-			}, false );
-		}
-	}
-})();
-// END CUSTOM REVEAL.JS INTEGRATION
-
-// highlight.js build includes support for:
-// All languages in master + fsharp
-
-
-var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+(q.parentNode?q.parentNode.className:"")).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(r){function o(s){return(s&&s.source)||s}function p(t,s){return RegExp(o(t),"m"+(r.cI?"i":"")+(s?"g":""))}function q(z,x){if(z.compiled){return}z.compiled=true;var u=[];if(z.k){var s={};function A(B,t){t.split(" ").forEach(function(C){var D=C.split("|");s[D[0]]=[B,D[1]?Number(D[1]):1];u.push(D[0])})}z.lR=p(z.l||hljs.IR+"(?!\\.)",true);if(typeof z.k=="string"){A("keyword",z.k)}else{for(var y in z.k){if(!z.k.hasOwnProperty(y)){continue}A(y,z.k[y])}}z.k=s}if(x){if(z.bWK){z.b="\\b("+u.join("|")+")\\b(?!\\.)\\s*"}z.bR=p(z.b?z.b:"\\B|\\b");if(!z.e&&!z.eW){z.e="\\B|\\b"}if(z.e){z.eR=p(z.e)}z.tE=o(z.e)||"";if(z.eW&&x.tE){z.tE+=(z.e?"|":"")+x.tE}}if(z.i){z.iR=p(z.i)}if(z.r===undefined){z.r=1}if(!z.c){z.c=[]}for(var w=0;w<z.c.length;w++){if(z.c[w]=="self"){z.c[w]=z}q(z.c[w],z)}if(z.starts){q(z.starts,x)}var v=[];for(var w=0;w<z.c.length;w++){v.push(o(z.c[w].b))}if(z.tE){v.push(o(z.tE))}if(z.i){v.push(o(z.i))}z.t=v.length?p(v.join("|"),true):{exec:function(t){return null}}}q(r)}function d(E,F,C){function o(r,N){for(var M=0;M<N.c.length;M++){var L=N.c[M].bR.exec(r);if(L&&L.index==0){return N.c[M]}}}function s(L,r){if(L.e&&L.eR.test(r)){return L}if(L.eW){return s(L.parent,r)}}function t(r,L){return !C&&L.i&&L.iR.test(r)}function y(M,r){var L=G.cI?r[0].toLowerCase():r[0];return M.k.hasOwnProperty(L)&&M.k[L]}function H(){var L=l(w);if(!A.k){return L}var r="";var O=0;A.lR.lastIndex=0;var M=A.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=y(A,M);if(N){v+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=A.lR.lastIndex;M=A.lR.exec(L)}return r+L.substr(O)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function K(){return A.sL!==undefined?z():H()}function J(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){x+=L;w=""}else{if(M.eB){x+=l(r)+L;w=""}else{x+=L;w=r}}A=Object.create(M,{parent:{value:A}})}function D(L,r){w+=L;if(r===undefined){x+=K();return 0}var N=o(r,A);if(N){x+=K();J(N,r);return N.rB?0:r.length}var O=s(A,r);if(O){var M=A;if(!(M.rE||M.eE)){w+=r}x+=K();do{if(A.cN){x+="</span>"}B+=A.r;A=A.parent}while(A!=O.parent);if(M.eE){x+=l(r)}w="";if(O.starts){J(O.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw new Error('Illegal lexem "'+r+'" for mode "'+(A.cN||"<unnamed>")+'"')}w+=r;return r.length||1}var G=e[E];f(G);var A=G;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(F);if(!u){break}q=D(F.substr(p,u.index-p),u[0]);p=u.index+q}D(F.substr(p));return{r:B,keyword_count:v,value:x,language:E}}catch(I){if(I.message.indexOf("Illegal")!=-1){return{r:0,keyword_count:0,value:l(F)}}else{throw I}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s,false);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v,true):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES["1c"]=function(b){var f="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";var c="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";var e="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a],r:0};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функция)",e:"$",l:f,k:"процедура функция",c:[{cN:"title",b:f},{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"экспорт",eW:true,l:f,k:"экспорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}}(hljs);hljs.LANGUAGES.actionscript=function(a){var d="[a-zA-Z_$][a-zA-Z0-9_$]*";var c="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var e={cN:"rest_arg",b:"[.]{3}",e:d,r:10};var b={cN:"title",b:d};return{k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:"package",bWK:true,e:"{",k:"package",c:[b]},{cN:"class",bWK:true,e:"{",k:"class interface",c:[{bWK:true,k:"extends implements"},b]},{cN:"preprocessor",bWK:true,e:";",k:"import include"},{cN:"function",bWK:true,e:"[{;]",k:"function",i:"\\S",c:[b,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,e]},{cN:"type",b:":",e:c,r:10}]}]}}(hljs);hljs.LANGUAGES.apache=function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,k:{keyword:"acceptfilter acceptmutex acceptpathinfo accessfilename action addalt addaltbyencoding addaltbytype addcharset adddefaultcharset adddescription addencoding addhandler addicon addiconbyencoding addiconbytype addinputfilter addlanguage addmoduleinfo addoutputfilter addoutputfilterbytype addtype alias aliasmatch allow allowconnect allowencodedslashes allowoverride anonymous anonymous_logemail anonymous_mustgiveemail anonymous_nouserid anonymous_verifyemail authbasicauthoritative authbasicprovider authdbduserpwquery authdbduserrealmquery authdbmgroupfile authdbmtype authdbmuserfile authdefaultauthoritative authdigestalgorithm authdigestdomain authdigestnccheck authdigestnonceformat authdigestnoncelifetime authdigestprovider authdigestqop authdigestshmemsize authgroupfile authldapbinddn authldapbindpassword authldapcharsetconfig authldapcomparednonserver authldapdereferencealiases authldapgroupattribute authldapgroupattributeisdn authldapremoteuserattribute authldapremoteuserisdn authldapurl authname authnprovideralias authtype authuserfile authzdbmauthoritative authzdbmtype authzdefaultauthoritative authzgroupfileauthoritative authzldapauthoritative authzownerauthoritative authzuserauthoritative balancermember browsermatch browsermatchnocase bufferedlogs cachedefaultexpire cachedirlength cachedirlevels cachedisable cacheenable cachefile cacheignorecachecontrol cacheignoreheaders cacheignorenolastmod cacheignorequerystring cachelastmodifiedfactor cachemaxexpire cachemaxfilesize cacheminfilesize cachenegotiateddocs cacheroot cachestorenostore cachestoreprivate cgimapextension charsetdefault charsetoptions charsetsourceenc checkcaseonly checkspelling chrootdir contentdigest cookiedomain cookieexpires cookielog cookiename cookiestyle cookietracking coredumpdirectory customlog dav davdepthinfinity davgenericlockdb davlockdb davmintimeout dbdexptime dbdkeep dbdmax dbdmin dbdparams dbdpersist dbdpreparesql dbdriver defaulticon defaultlanguage defaulttype deflatebuffersize deflatecompressionlevel deflatefilternote deflatememlevel deflatewindowsize deny directoryindex directorymatch directoryslash documentroot dumpioinput dumpiologlevel dumpiooutput enableexceptionhook enablemmap enablesendfile errordocument errorlog example expiresactive expiresbytype expiresdefault extendedstatus extfilterdefine extfilteroptions fileetag filterchain filterdeclare filterprotocol filterprovider filtertrace forcelanguagepriority forcetype forensiclog gracefulshutdowntimeout group header headername hostnamelookups identitycheck identitychecktimeout imapbase imapdefault imapmenu include indexheadinsert indexignore indexoptions indexorderdefault indexstylesheet isapiappendlogtoerrors isapiappendlogtoquery isapicachefile isapifakeasync isapilognotsupported isapireadaheadbuffer keepalive keepalivetimeout languagepriority ldapcacheentries ldapcachettl ldapconnectiontimeout ldapopcacheentries ldapopcachettl ldapsharedcachefile ldapsharedcachesize ldaptrustedclientcert ldaptrustedglobalcert ldaptrustedmode ldapverifyservercert limitinternalrecursion limitrequestbody limitrequestfields limitrequestfieldsize limitrequestline limitxmlrequestbody listen listenbacklog loadfile loadmodule lockfile logformat loglevel maxclients maxkeepaliverequests maxmemfree maxrequestsperchild maxrequestsperthread maxspareservers maxsparethreads maxthreads mcachemaxobjectcount mcachemaxobjectsize mcachemaxstreamingbuffer mcacheminobjectsize mcacheremovalalgorithm mcachesize metadir metafiles metasuffix mimemagicfile minspareservers minsparethreads mmapfile mod_gzip_on mod_gzip_add_header_count mod_gzip_keep_workfiles mod_gzip_dechunk mod_gzip_min_http mod_gzip_minimum_file_size mod_gzip_maximum_file_size mod_gzip_maximum_inmem_size mod_gzip_temp_dir mod_gzip_item_include mod_gzip_item_exclude mod_gzip_command_version mod_gzip_can_negotiate mod_gzip_handle_methods mod_gzip_static_suffix mod_gzip_send_vary mod_gzip_update_static modmimeusepathinfo multiviewsmatch namevirtualhost noproxy nwssltrustedcerts nwsslupgradeable options order passenv pidfile protocolecho proxybadheader proxyblock proxydomain proxyerroroverride proxyftpdircharset proxyiobuffersize proxymaxforwards proxypass proxypassinterpolateenv proxypassmatch proxypassreverse proxypassreversecookiedomain proxypassreversecookiepath proxypreservehost proxyreceivebuffersize proxyremote proxyremotematch proxyrequests proxyset proxystatus proxytimeout proxyvia readmename receivebuffersize redirect redirectmatch redirectpermanent redirecttemp removecharset removeencoding removehandler removeinputfilter removelanguage removeoutputfilter removetype requestheader require rewritebase rewritecond rewriteengine rewritelock rewritelog rewriteloglevel rewritemap rewriteoptions rewriterule rlimitcpu rlimitmem rlimitnproc satisfy scoreboardfile script scriptalias scriptaliasmatch scriptinterpretersource scriptlog scriptlogbuffer scriptloglength scriptsock securelisten seerequesttail sendbuffersize serveradmin serveralias serverlimit servername serverpath serverroot serversignature servertokens setenv setenvif setenvifnocase sethandler setinputfilter setoutputfilter ssienableaccess ssiendtag ssierrormsg ssistarttag ssitimeformat ssiundefinedecho sslcacertificatefile sslcacertificatepath sslcadnrequestfile sslcadnrequestpath sslcarevocationfile sslcarevocationpath sslcertificatechainfile sslcertificatefile sslcertificatekeyfile sslciphersuite sslcryptodevice sslengine sslhonorciperorder sslmutex ssloptions sslpassphrasedialog sslprotocol sslproxycacertificatefile sslproxycacertificatepath sslproxycarevocationfile sslproxycarevocationpath sslproxyciphersuite sslproxyengine sslproxymachinecertificatefile sslproxymachinecertificatepath sslproxyprotocol sslproxyverify sslproxyverifydepth sslrandomseed sslrequire sslrequiressl sslsessioncache sslsessioncachetimeout sslusername sslverifyclient sslverifydepth startservers startthreads substitute suexecusergroup threadlimit threadsperchild threadstacksize timeout traceenable transferlog typesconfig unsetenv usecanonicalname usecanonicalphysicalport user userdir virtualdocumentroot virtualdocumentrootip virtualscriptalias virtualscriptaliasip win32disableacceptex xbithack",literal:"on off"},c:[a.HCM,{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,{cN:"tag",b:"</?",e:">"},a.QSM]}}(hljs);hljs.LANGUAGES.applescript=function(a){var b=a.inherit(a.QSM,{i:""});var e={cN:"title",b:a.UIR};var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bWK:true,k:"on",i:"[${=;\\n]",c:[e,d]}].concat(c),i:"//"}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);hljs.LANGUAGES.asciidoc=function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{4,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}}(hljs);hljs.LANGUAGES.avrasm=function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$"},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}}(hljs);hljs.LANGUAGES.axapta=function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"{",i:":",k:"class interface",c:[{cN:"inheritance",bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]}]}}(hljs);hljs.LANGUAGES.bash=function(a){var c={cN:"variable",b:/\$[\w\d#@][\w\d_]*/};var b={cN:"variable",b:/\$\{(.*?)\}/};var e={cN:"string",b:/"/,e:/"/,c:[a.BE,c,b,{cN:"variable",b:/\$\(/,e:/\)/,c:a.BE}],r:0};var d={cN:"string",b:/'/,e:/'/,r:0};return{l:/-?[a-z]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[{cN:"title",b:/\w[\w\d_]*/}],r:0},a.HCM,a.NM,e,d,c,b]}}(hljs);hljs.LANGUAGES.brainfuck=function(a){return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",eE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]"},{cN:"literal",b:"[\\+\\-]"}]}}(hljs);hljs.LANGUAGES.clojure=function(l){var e={built_in:"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for doseq dosync dotimes and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import intern refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! import use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if throw printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time ns assert re-find re-groups rand-int rand mod locking assert-valid-fdecl alias namespace resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! memfn to-array future future-call into-array aset gen-class reduce merge map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j={cN:"string",b:'"',e:'"',c:[l.BE],r:0};var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:"\\S",c:[o,m]}}(hljs);hljs.LANGUAGES.cmake=function(a){return{cI:true,k:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file",c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}}(hljs);hljs.LANGUAGES.coffeescript=function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f={cN:"title",b:a};var e={cN:"subst",b:"#\\{",e:"}",k:b,};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",b:"'''",e:"'''",c:[c.BE]},{cN:"string",b:"'",e:"'",c:[c.BE],r:0},{cN:"string",b:'"""',e:'"""',c:[c.BE,e]},{cN:"string",b:'"',e:'"',c:[c.BE,e],r:0},{cN:"regexp",b:"///",e:"///",c:[c.HCM]},{cN:"regexp",b:"//[gim]*",r:0},{cN:"regexp",b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bWK:true,k:"class",e:"$",i:"[:\\[\\]]",c:[{bWK:true,k:"extends",eW:true,i:":",c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true}])}}(hljs);hljs.LANGUAGES.cpp=function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.css=function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.d=function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?',r:0};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}}(hljs);hljs.LANGUAGES.delphi=function(b){var f="and safecall cdecl then string exports library not pascal set virtual file in array label packed end. index while const raise for to implementation with except overload destructor downto finally program exit unit inherited override if type until function do begin repeat goto nil far initialization object else var uses external resourcestring interface end finalization class asm mod case on shr shl of register xorwrite threadvar try record near stored constructor stdcall inline div out or procedure";var e="safecall stdcall pascal stored const implementation finalization except to finally program inherited override then exports string read not mod shr try div shl set library message packed index for near overload label downto exit public goto interface asm on of constructor or private array unit raise destructor var type until function else external with case default record while protected property procedure published and cdecl do threadvar file in if end virtual write far out begin repeat nil initialization object uses resourcestring class register xorwrite inline static";var a={cN:"comment",b:"{",e:"}",r:0};var g={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}],r:0};var d={cN:"string",b:"(#\\d+)+"};var h={cN:"function",bWK:true,e:"[:;]",k:"function constructor|10 destructor|10 procedure|10",c:[{cN:"title",b:b.IR},{cN:"params",b:"\\(",e:"\\)",k:f,c:[c,d]},a,g]};return{cI:true,k:f,i:'("|\\$[G-Zg-z]|\\/\\*|</)',c:[a,g,b.CLCM,c,d,b.NM,h,{cN:"class",b:"=\\bclass\\b",e:"end;",k:e,c:[c,d,a,g,b.CLCM,h]}]}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.django=function(c){function e(h,g){return(g==undefined||(!h.cN&&g.cN=="tag")||h.cN=="value")}function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}if(e(l,k)){m=b.concat(m)}if(m.length){g.c=m}}return g}var d={cN:"filter",b:"\\|[A-Za-z]+\\:?",k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:'"',e:'"'}]};var b=[{cN:"template_comment",b:"{%\\s*comment\\s*%}",e:"{%\\s*endcomment\\s*%}"},{cN:"template_comment",b:"{#",e:"#}"},{cN:"template_tag",b:"{%",e:"%}",k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[d]},{cN:"variable",b:"{{",e:"}}",c:[d]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.dos=function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}}(hljs);hljs.LANGUAGES["erlang-repl"]=function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}}(hljs);hljs.LANGUAGES.erlang=function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#",e:"}",i:".",r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",eW:true,r:0}]};var k={k:f,b:"(fun|receive|if|try|case)",e:"end"};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(</|\\*=|\\+=|-=|/=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+c+"\\s*\\(",e:"->",rB:true,i:"\\(|#|//|/\\*|\\\\|:",c:[d,{cN:"title",b:c}],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}}(hljs);hljs.LANGUAGES.fsharp=function(a){var b="'[a-zA-Z0-9_]+";return{k:"yield! return! let! do!abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun|10 function global if in inherit inline interface internal lazy let match member module mutable|10 namespace new null of open or override private public rec|10 return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"//",e:"$",rB:true},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bWK:true,e:"\\(|=|$",k:"type",c:[{cN:"title",b:a.UIR}]},{cN:"annotation",b:"\\[<",e:">\\]",r:10},{cN:"typeparam",b:"<",e:">",c:[{cN:"title",b:b}]},a.CLCM,a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}}(hljs);hljs.LANGUAGES.glsl=function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}}(hljs);hljs.LANGUAGES.go=function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"string",b:"`",e:"`"},{cN:"number",b:"[^a-zA-Z_0-9](\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?",r:0},a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.haml=function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(-#|/).*$",r:0},{b:"^\\s*-(?!#)",starts:{e:"\\n",sL:"ruby"},r:0},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+",r:0},{cN:"value",b:"[#\\.]\\w+",r:0},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,r:0,c:[{cN:"symbol",b:":\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,r:0,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0}],r:10},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"},r:0}]}}(hljs);hljs.LANGUAGES.handlebars=function(c){function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}m=d.concat(m);if(m.length){g.c=m}}return g}var b="each in with if else unless bindattr action collection debugger log outlet template unbound view yield";var e={cN:"variable",b:"[a-zA-Z.]+",k:b};var d=[{cN:"expression",b:"{{",e:"}}",c:[{cN:"begin-block",b:"#[a-zA-Z .]+",k:b},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z .]+",k:b},{cN:"variable",b:"[a-zA-Z.]+",k:b}]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.haskell=function(a){var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},{cN:"title",b:"[_a-z][\\w']*"}]};var b={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance not as foreign ccall safe unsafe",c:[{cN:"comment",b:"--",e:"$"},{cN:"preprocessor",b:"{-#",e:"#-}"},{cN:"comment",c:["self"],b:"{-",e:"-}"},{cN:"string",b:"\\s+'",e:"'",c:[a.BE],r:0},a.QSM,{cN:"import",b:"\\bimport",e:"$",k:"import qualified as hiding",c:[c],i:"\\W\\.|;"},{cN:"module",b:"\\bmodule",e:"where",k:"module where",c:[c],i:"\\W\\.|;"},{cN:"class",b:"\\b(class|instance)",e:"where",k:"class where instance",c:[d]},{cN:"typedef",b:"\\b(data|(new)?type)",e:"$",k:"data type newtype deriving",c:[d,c,b]},a.CNM,{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},d,{cN:"title",b:"^[_a-z][\\w']*"},{b:"->|<-"}]}}(hljs);hljs.LANGUAGES.http=function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}}(hljs);hljs.LANGUAGES.ini=function(a){return{cI:true,i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}}(hljs);hljs.LANGUAGES.java=function(a){return{k:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,{cN:"class",bWK:true,e:"{",k:"class interface",eE:true,i:":",c:[{bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,sL:"xml"}],r:0},{cN:"function",bWK:true,e:/{/,k:"function",c:[{cN:"title",b:/[A-Za-z$_][0-9A-Za-z$_]*/},{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);hljs.LANGUAGES.lasso=function(b){var a="[a-zA-Z_][a-zA-Z0-9_.]*|&[lg]t;";var c="<\\?(lasso(script)?|=)";return{cI:true,l:a,k:{literal:"true false none minimal full all infinity nan and or not bw ew cn lt lte gt gte eq neq ft rx nrx",built_in:"array date decimal duration integer map pair string tag xml null list queue set stack staticarray local var variable data global self inherited void",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require skip split_thread sum take thread to trait type where with yield"},c:[{cN:"preprocessor",b:"\\]|\\?>",r:0,starts:{cN:"markup",e:"\\[|"+c,rE:true}},{cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true}},{cN:"preprocessor",b:"\\[no_square_brackets|\\[/noprocess|"+c},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10},b.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},b.CBLCLM,b.CNM,b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",b:"#\\d+|[#$]"+a},{cN:"tag",b:"::",e:a},{cN:"attribute",b:"\\.\\.\\.|-"+b.UIR},{cN:"class",bWK:true,k:"define",eE:true,e:"\\(|=>",c:[{cN:"title",b:b.UIR+"=?"}]}]}}(hljs);hljs.LANGUAGES.lisp=function(i){var l="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var m="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var k={cN:"shebang",b:"^#!",e:"$"};var a={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d=[{cN:"number",b:m},{cN:"number",b:"#b[0-1]+(/[0-1]+)?"},{cN:"number",b:"#o[0-7]+(/[0-7]+)?"},{cN:"number",b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{cN:"number",b:"#c\\("+m+" +"+m,e:"\\)"}];var h={cN:"string",b:'"',e:'"',c:[i.BE],r:0};var n={cN:"comment",b:";",e:"$"};var g={cN:"variable",b:"\\*",e:"\\*"};var o={cN:"keyword",b:"[:&]"+l};var b={b:"\\(",e:"\\)",c:["self",a,h].concat(d)};var e={cN:"quoted",b:"['`]\\(",e:"\\)",c:d.concat([h,g,o,b])};var c={cN:"quoted",b:"\\(quote ",e:"\\)",k:{title:"quote"},c:d.concat([h,g,o,b])};var j={cN:"list",b:"\\(",e:"\\)"};var f={eW:true,r:0};j.c=[{cN:"title",b:l},f];f.c=[e,c,j,a].concat(d).concat([h,n,g,o]);return{i:"[^\\s]",c:d.concat([k,a,h,n,e,c,j])}}(hljs);hljs.LANGUAGES.lua=function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bWK:true,e:"\\)",k:"function",c:[{cN:"title",b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"},{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}}(hljs);hljs.LANGUAGES.markdown=function(a){return{c:[{cN:"header",b:"^#{1,3}",e:"$"},{cN:"header",b:"^.+?\\n[=-]{2,}$"},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",b:"\\*.+?\\*"},{cN:"emphasis",b:"_.+?_",r:0},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",b:"`.+?`"},{cN:"code",b:"^    ",e:"$",r:0},{cN:"horizontal_rule",b:"^-{3,}",e:"$"},{b:"\\[.+?\\]\\(.+?\\)",rB:true,c:[{cN:"link_label",b:"\\[.+\\]"},{cN:"link_url",b:"\\(",e:"\\)",eB:true,eE:true}]}]}}(hljs);hljs.LANGUAGES.matlab=function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bWK:true,e:"$",k:"function",c:[{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:""},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b},{cN:"comment",b:"\\%",e:"$"}].concat(b)}}(hljs);hljs.LANGUAGES.mel=function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:"</",c:[a.CNM,a.ASM,a.QSM,{cN:"string",b:"`",e:"`",c:[a.BE]},{cN:"variable",b:"\\$\\d",r:5},{cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)"},a.CLCM,a.CBLCLM]}}(hljs);hljs.LANGUAGES.mizar=function(a){return{k:["environ vocabularies notations constructors definitions registrations theorems schemes requirements","begin end definition registration cluster existence pred func defpred deffunc theorem proof","let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from","be being by means equals implies iff redefine define now not or attr is mode suppose per cases set","thesis contradiction scheme reserve struct","correctness compatibility coherence symmetry assymetry reflexivity irreflexivity","connectedness uniqueness commutativity idempotence involutiveness projectivity"].join(" "),c:[{cN:"comment",b:"::",e:"$"}]}}(hljs);hljs.LANGUAGES.nginx=function(b){var c=[{cN:"variable",b:"\\$\\d+"},{cN:"variable",b:"\\${",e:"}"},{cN:"variable",b:"[\\$\\@]"+b.UIR}];var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[b.HCM,{cN:"string",b:'"',e:'"',c:[b.BE].concat(c),r:0},{cN:"string",b:"'",e:"'",c:[b.BE].concat(c),r:0},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",b:"\\s\\^",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"~\\*?\\s+",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"\\*(\\.[a-z\\-]+)+",c:[b.BE].concat(c)},{cN:"regexp",b:"([a-z\\-]+\\.)+\\*",c:[b.BE].concat(c)},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0}].concat(c)};return{c:[b.HCM,{b:b.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:b.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}}(hljs);hljs.LANGUAGES.objectivec=function(a){var b={keyword:"int float while private char catch export sizeof typedef const struct for union unsigned long volatile static protected bool mutable if public do return goto void enum else break extern asm case short default double throw register explicit signed typename try this switch continue wchar_t inline readonly assign property self synchronized end synthesize id optional required nonatomic super unichar finally dynamic IBOutlet IBAction selector strong weak readonly",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"({|$)",k:"interface class protocol implementation",c:[{cN:"id",b:a.UIR}]},{cN:"variable",b:"\\."+a.UIR,r:0}]}}(hljs);hljs.LANGUAGES.parser3=function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}}(hljs);hljs.LANGUAGES.perl=function(e){var a="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var d={cN:"subst",b:"[$@]\\{",e:"\\}",k:a,r:10};var b={cN:"variable",b:"\\$\\d"};var i={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var f=[e.BE,d,b,i];var h={b:"->",c:[{b:e.IR},{b:"{",e:"}"}]};var g={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var c=[b,i,e.HCM,g,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},h,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:f,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:f,r:5},{cN:"string",b:"'",e:"'",c:[e.BE],r:0},{cN:"string",b:'"',e:'"',c:f,r:0},{cN:"string",b:"`",e:"`",c:[e.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"("+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,g,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bWK:true,e:"(\\s*\\(.*?\\))?[;{]",k:"sub",r:5},{cN:"operator",b:"-\\w\\b",r:0}];d.c=c;h.c[1].c=c;return{k:a,c:c}}(hljs);hljs.LANGUAGES.php=function(a){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var b=[a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),{cN:"string",b:'b"',e:'"',c:[a.BE]},{cN:"string",b:"b'",e:"'",c:[a.BE]}];var c=[a.BNM,a.CNM];var d={cN:"title",b:a.UIR};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return implements parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception php_user_filter default die require __FUNCTION__ enddeclare final try this switch continue endfor endif declare unset true false namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ __halt_compiler",c:[a.CLCM,a.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"}]},{cN:"comment",eB:true,b:"__halt_compiler.+?;",eW:true},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[a.BE]},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"},e,{cN:"function",bWK:true,e:"{",k:"function",i:"\\$|\\[|%",c:[d,{cN:"params",b:"\\(",e:"\\)",c:["self",e,a.CBLCLM].concat(b).concat(c)}]},{cN:"class",bWK:true,e:"{",k:"class",i:"[:\\(\\$]",c:[{bWK:true,eW:true,k:"extends",c:[d]},d]},{b:"=>"}].concat(b).concat(c)}}(hljs);hljs.LANGUAGES.profile=function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[{cN:"title",b:a.UIR,r:0}],r:0}]}}(hljs);hljs.LANGUAGES.python=function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var c=[{cN:"string",b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{cN:"string",b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{cN:"string",b:/(u|r|ur)'/,e:/'/,c:[a.BE],r:10},{cN:"string",b:/(u|r|ur)"/,e:/"/,c:[a.BE],r:10},{cN:"string",b:/(b|br)'/,e:/'/,c:[a.BE]},{cN:"string",b:/(b|br)"/,e:/"/,c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:/\(/,e:/\)/,c:["self",a.CNM,f].concat(c)};var b={bWK:true,e:/:/,i:/[${=;\n]/,c:[e,d],r:10};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10",built_in:"None True False Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:c.concat([f,a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}])}}(hljs);hljs.LANGUAGES.r=function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[a.BE],r:0},{cN:"string",b:"'",e:"'",c:[a.BE],r:0}]}}(hljs);hljs.LANGUAGES.rib=function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"</",c:[a.HCM,a.CNM,a.ASM,a.QSM]}}(hljs);hljs.LANGUAGES.rsl=function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"shader",bWK:true,e:"\\(",k:"surface displacement light volume imager"},{cN:"shading",bWK:true,e:"\\(",k:"illuminate illuminance gather"}]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.ruleslanguage=function(a){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEMASK|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN DELETE SAVE SAVE_UPDATE CLEAR DETERMINANT LABEL REPORT REVENUE ABORT CALL DONE LEAVE EACH IN LIST NOVALUE FROM TOTAL CHARGE BLOCK AND OR CSV_FILE BILL_PERIOD RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM ABORT WARN NUMDAYS RATE_CODE READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"array",b:"#[a-zA-Z .]+"}]}}(hljs);hljs.LANGUAGES.rust=function(b){var d={cN:"title",b:b.UIR};var c={cN:"number",b:"\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\.[0-9_]+)?([uif](8|16|32|64)?)?)",r:0};var a="assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while";return{k:a,i:"</",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:"function",bWK:true,e:"(\\(|<)",k:"fn",c:[d]},{cN:"preprocessor",b:"#\\[",e:"\\]"},{bWK:true,e:"(=|<)",k:"type",c:[d],i:"\\S"},{bWK:true,e:"({|<)",k:"trait enum",c:[d],i:"\\S"}]}}(hljs);hljs.LANGUAGES.scala=function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,b,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bWK:true,k:"extends with",r:10},{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}}(hljs);hljs.LANGUAGES.scss=function(a){var c="[a-zA-Z-][a-zA-Z0-9_-]*";var d={cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};var b={cN:"hexcolor",b:"#[0-9A-Fa-f]+"};var e={cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"important",b:"!important"}]}};return{cI:true,i:"[=/|']",c:[a.CLCM,a.CBLCLM,{cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]},{cN:"id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{cN:"pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{cN:"value",b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{cN:"value",b:":",e:";",c:[b,a.NM,a.QSM,a.ASM,{cN:"important",b:"!important"}]},{cN:"at_rule",b:"@",e:"[{;]",k:"mixin include for extend charset import media page font-face namespace",c:[d,a.QSM,a.ASM,b,a.NM,{cN:"preprocessor",b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}}(hljs);hljs.LANGUAGES.smalltalk=function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"',r:0},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":"},a.CNM,c,d,{cN:"localvars",b:"\\|\\s*"+b+"(\\s+"+b+")*\\s*\\|"},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}}(hljs);hljs.LANGUAGES.sql=function(a){return{cI:true,c:[{cN:"operator",b:"(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}],r:0},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}}(hljs);hljs.LANGUAGES.tex=function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}}(hljs);hljs.LANGUAGES.vala=function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bWK:true,e:"{",k:"class interface delegate namespace",i:"[^,:\\n\\s\\.]",c:[{cN:"title",b:a.UIR}]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}}(hljs);hljs.LANGUAGES.vbnet=function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"(//|endif|gosub|variant|wend)",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}}(hljs);hljs.LANGUAGES.vbscript=function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$"},a.CNM]}}(hljs);hljs.LANGUAGES.vhdl=function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/leap/leap.js b/docs/slides/ETH14/_support/reveal.js/plugin/leap/leap.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/leap/leap.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2013, Leap Motion, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Version 0.2.0 - http://js.leapmotion.com/0.2.0/leap.min.js
- * Grab latest versions from http://js.leapmotion.com/
- */
-
-!function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i}({1:[function(require,module,exports){var chooseProtocol=require("./protocol").chooseProtocol,EventEmitter=require("events").EventEmitter,_=require("underscore");var BaseConnection=module.exports=function(opts){this.opts=_.defaults(opts||{},{host:"127.0.0.1",enableGestures:false,port:6437,enableHeartbeat:true,heartbeatInterval:100,requestProtocolVersion:3});this.host=opts.host;this.port=opts.port;this.on("ready",function(){this.enableGestures(this.opts.enableGestures);if(this.opts.enableHeartbeat)this.startHeartbeat()});this.on("disconnect",function(){if(this.opts.enableHeartbeat)this.stopHeartbeat()});this.heartbeatTimer=null};BaseConnection.prototype.getUrl=function(){return"ws://"+this.host+":"+this.port+"/v"+this.opts.requestProtocolVersion+".json"};BaseConnection.prototype.sendHeartbeat=function(){if(this.protocol){this.setHeartbeatState(true);this.protocol.sendHeartbeat(this)}};BaseConnection.prototype.handleOpen=function(){this.emit("connect")};BaseConnection.prototype.enableGestures=function(enabled){this.gesturesEnabled=enabled?true:false;this.send(this.protocol.encode({enableGestures:this.gesturesEnabled}))};BaseConnection.prototype.handleClose=function(){this.disconnect();this.startReconnection()};BaseConnection.prototype.startReconnection=function(){var connection=this;setTimeout(function(){connection.connect()},1e3)};BaseConnection.prototype.disconnect=function(){if(!this.socket)return;this.socket.close();delete this.socket;delete this.protocol;this.emit("disconnect")};BaseConnection.prototype.handleData=function(data){var message=JSON.parse(data);var messageEvent;if(this.protocol===undefined){messageEvent=this.protocol=chooseProtocol(message);this.emit("ready")}else{messageEvent=this.protocol(message)}this.emit(messageEvent.type,messageEvent)};BaseConnection.prototype.connect=function(){if(this.socket)return;this.socket=this.setupSocket();return true};BaseConnection.prototype.send=function(data){this.socket.send(data)};BaseConnection.prototype.stopHeartbeat=function(){if(!this.heartbeatTimer)return;clearInterval(this.heartbeatTimer);delete this.heartbeatTimer;this.setHeartbeatState(false)};BaseConnection.prototype.setHeartbeatState=function(state){if(this.heartbeatState===state)return;this.heartbeatState=state;this.emit(this.heartbeatState?"focus":"blur")};_.extend(BaseConnection.prototype,EventEmitter.prototype)},{"./protocol":12,events:17,underscore:20}],2:[function(require,module,exports){var CircularBuffer=module.exports=function(size){this.pos=0;this._buf=[];this.size=size};CircularBuffer.prototype.get=function(i){if(i==undefined)i=0;if(i>=this.size)return undefined;if(i>=this._buf.length)return undefined;return this._buf[(this.pos-i-1)%this.size]};CircularBuffer.prototype.push=function(o){this._buf[this.pos%this.size]=o;return this.pos++}},{}],3:[function(require,module,exports){var Connection=module.exports=require("./base_connection");Connection.prototype.setupSocket=function(){var connection=this;var socket=new WebSocket(this.getUrl());socket.onopen=function(){connection.handleOpen()};socket.onmessage=function(message){connection.handleData(message.data)};socket.onclose=function(){connection.handleClose()};return socket};Connection.prototype.startHeartbeat=function(){if(!this.protocol.sendHeartbeat||this.heartbeatTimer)return;var connection=this;var propertyName=null;if(typeof document.hidden!=="undefined"){propertyName="hidden"}else if(typeof document.mozHidden!=="undefined"){propertyName="mozHidden"}else if(typeof document.msHidden!=="undefined"){propertyName="msHidden"}else if(typeof document.webkitHidden!=="undefined"){propertyName="webkitHidden"}else{propertyName=undefined}var windowVisible=true;var focusListener=window.addEventListener("focus",function(e){windowVisible=true});var blurListener=window.addEventListener("blur",function(e){windowVisible=false});this.on("disconnect",function(){if(connection.heartbeatTimer){clearTimeout(connection.heartbeatTimer);delete connection.heartbeatTimer}window.removeEventListener(focusListener);window.removeEventListener(blurListener)});this.heartbeatTimer=setInterval(function(){var isVisible=propertyName===undefined?true:document[propertyName]===false;if(isVisible&&windowVisible){connection.sendHeartbeat()}else{connection.setHeartbeatState(false)}},this.opts.heartbeatInterval)}},{"./base_connection":1}],4:[function(require,module,exports){!function(process){var Frame=require("./frame"),CircularBuffer=require("./circular_buffer"),Pipeline=require("./pipeline"),EventEmitter=require("events").EventEmitter,gestureListener=require("./gesture").gestureListener,_=require("underscore");var Controller=module.exports=function(opts){var inNode=typeof process!=="undefined"&&process.title==="node";opts=_.defaults(opts||{},{inNode:inNode});this.inNode=opts.inNode;opts=_.defaults(opts||{},{frameEventName:this.useAnimationLoop()?"animationFrame":"deviceFrame",supressAnimationLoop:false});this.supressAnimationLoop=opts.supressAnimationLoop;this.frameEventName=opts.frameEventName;this.history=new CircularBuffer(200);this.lastFrame=Frame.Invalid;this.lastValidFrame=Frame.Invalid;this.lastConnectionFrame=Frame.Invalid;this.accumulatedGestures=[];if(opts.connectionType===undefined){this.connectionType=this.inBrowser()?require("./connection"):require("./node_connection")}else{this.connectionType=opts.connectionType}this.connection=new this.connectionType(opts);this.setupConnectionEvents()};Controller.prototype.gesture=function(type,cb){var creator=gestureListener(this,type);if(cb!==undefined){creator.stop(cb)}return creator};Controller.prototype.inBrowser=function(){return!this.inNode};Controller.prototype.useAnimationLoop=function(){return this.inBrowser()&&typeof chrome==="undefined"};Controller.prototype.connect=function(){var controller=this;if(this.connection.connect()&&this.inBrowser()&&!controller.supressAnimationLoop){var callback=function(){controller.emit("animationFrame",controller.lastConnectionFrame);window.requestAnimFrame(callback)};window.requestAnimFrame(callback)}};Controller.prototype.disconnect=function(){this.connection.disconnect()};Controller.prototype.frame=function(num){return this.history.get(num)||Frame.Invalid};Controller.prototype.loop=function(callback){switch(callback.length){case 1:this.on(this.frameEventName,callback);break;case 2:var controller=this;var scheduler=null;var immediateRunnerCallback=function(frame){callback(frame,function(){if(controller.lastFrame!=frame){immediateRunnerCallback(controller.lastFrame)}else{controller.once(controller.frameEventName,immediateRunnerCallback)}})};this.once(this.frameEventName,immediateRunnerCallback);break}this.connect()};Controller.prototype.addStep=function(step){if(!this.pipeline)this.pipeline=new Pipeline(this);this.pipeline.addStep(step)};Controller.prototype.processFrame=function(frame){if(frame.gestures){this.accumulatedGestures=this.accumulatedGestures.concat(frame.gestures)}if(this.pipeline){frame=this.pipeline.run(frame);if(!frame)frame=Frame.Invalid}this.lastConnectionFrame=frame;this.emit("deviceFrame",frame)};Controller.prototype.processFinishedFrame=function(frame){this.lastFrame=frame;if(frame.valid){this.lastValidFrame=frame}frame.controller=this;frame.historyIdx=this.history.push(frame);if(frame.gestures){frame.gestures=this.accumulatedGestures;this.accumulatedGestures=[];for(var gestureIdx=0;gestureIdx!=frame.gestures.length;gestureIdx++){this.emit("gesture",frame.gestures[gestureIdx],frame)}}this.emit("frame",frame)};Controller.prototype.setupConnectionEvents=function(){var controller=this;this.connection.on("frame",function(frame){controller.processFrame(frame)});this.on(this.frameEventName,function(frame){controller.processFinishedFrame(frame)});this.connection.on("disconnect",function(){controller.emit("disconnect")});this.connection.on("ready",function(){controller.emit("ready")});this.connection.on("connect",function(){controller.emit("connect")});this.connection.on("focus",function(){controller.emit("focus")});this.connection.on("blur",function(){controller.emit("blur")});this.connection.on("protocol",function(protocol){controller.emit("protocol",protocol)});this.connection.on("deviceConnect",function(evt){controller.emit(evt.state?"deviceConnected":"deviceDisconnected")})};_.extend(Controller.prototype,EventEmitter.prototype)}(require("__browserify_process"))},{"./circular_buffer":2,"./connection":3,"./frame":5,"./gesture":6,"./node_connection":16,"./pipeline":10,__browserify_process:18,events:17,underscore:20}],5:[function(require,module,exports){var Hand=require("./hand"),Pointable=require("./pointable"),createGesture=require("./gesture").createGesture,glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,InteractionBox=require("./interaction_box"),_=require("underscore");var Frame=module.exports=function(data){this.valid=true;this.id=data.id;this.timestamp=data.timestamp;this.hands=[];this.handsMap={};this.pointables=[];this.tools=[];this.fingers=[];if(data.interactionBox){this.interactionBox=new InteractionBox(data.interactionBox)}this.gestures=[];this.pointablesMap={};this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.data=data;this.type="frame";this.currentFrameRate=data.currentFrameRate;var handMap={};for(var handIdx=0,handCount=data.hands.length;handIdx!=handCount;handIdx++){var hand=new Hand(data.hands[handIdx]);hand.frame=this;this.hands.push(hand);this.handsMap[hand.id]=hand;handMap[hand.id]=handIdx}for(var pointableIdx=0,pointableCount=data.pointables.length;pointableIdx!=pointableCount;pointableIdx++){var pointable=new Pointable(data.pointables[pointableIdx]);pointable.frame=this;this.pointables.push(pointable);this.pointablesMap[pointable.id]=pointable;(pointable.tool?this.tools:this.fingers).push(pointable);if(pointable.handId!==undefined&&handMap.hasOwnProperty(pointable.handId)){var hand=this.hands[handMap[pointable.handId]];hand.pointables.push(pointable);(pointable.tool?hand.tools:hand.fingers).push(pointable)}}if(data.gestures){for(var gestureIdx=0,gestureCount=data.gestures.length;gestureIdx!=gestureCount;gestureIdx++){this.gestures.push(createGesture(data.gestures[gestureIdx]))}}};Frame.prototype.tool=function(id){var pointable=this.pointable(id);return pointable.tool?pointable:Pointable.Invalid};Frame.prototype.pointable=function(id){return this.pointablesMap[id]||Pointable.Invalid};Frame.prototype.finger=function(id){var pointable=this.pointable(id);return!pointable.tool?pointable:Pointable.Invalid};Frame.prototype.hand=function(id){return this.handsMap[id]||Hand.Invalid};Frame.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Frame.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceFrame._rotation[5],this._rotation[2]-sinceFrame._rotation[6],this._rotation[3]-sinceFrame._rotation[1]])};Frame.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);return mat3.multiply(mat3.create(),sinceFrame._rotation,transpose)};Frame.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;return Math.exp(this._scaleFactor-sinceFrame._scaleFactor)};Frame.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.subtract(vec3.create(),this._translation,sinceFrame._translation)};Frame.prototype.toString=function(){var str="Frame [ id:"+this.id+" | timestamp:"+this.timestamp+" | Hand count:("+this.hands.length+") | Pointable count:("+this.pointables.length+")";if(this.gestures)str+=" | Gesture count:("+this.gestures.length+")";str+=" ]";return str};Frame.prototype.dump=function(){var out="";out+="Frame Info:<br/>";out+=this.toString();out+="<br/><br/>Hands:<br/>";for(var handIdx=0,handCount=this.hands.length;handIdx!=handCount;handIdx++){out+="  "+this.hands[handIdx].toString()+"<br/>"}out+="<br/><br/>Pointables:<br/>";for(var pointableIdx=0,pointableCount=this.pointables.length;pointableIdx!=pointableCount;pointableIdx++){out+="  "+this.pointables[pointableIdx].toString()+"<br/>"}if(this.gestures){out+="<br/><br/>Gestures:<br/>";for(var gestureIdx=0,gestureCount=this.gestures.length;gestureIdx!=gestureCount;gestureIdx++){out+="  "+this.gestures[gestureIdx].toString()+"<br/>"}}out+="<br/><br/>Raw JSON:<br/>";out+=JSON.stringify(this.data);return out};Frame.Invalid={valid:false,hands:[],fingers:[],tools:[],gestures:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},hand:function(){return Hand.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"gl-matrix":19,underscore:20}],6:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3,EventEmitter=require("events").EventEmitter,_=require("underscore");var createGesture=exports.createGesture=function(data){var gesture;switch(data.type){case"circle":gesture=new CircleGesture(data);break;case"swipe":gesture=new SwipeGesture(data);break;case"screenTap":gesture=new ScreenTapGesture(data);break;case"keyTap":gesture=new KeyTapGesture(data);break;default:throw"unkown gesture type"}gesture.id=data.id;gesture.handIds=data.handIds;gesture.pointableIds=data.pointableIds;gesture.duration=data.duration;gesture.state=data.state;gesture.type=data.type;return gesture};var gestureListener=exports.gestureListener=function(controller,type){var handlers={};var gestureMap={};var gestureCreator=function(){var candidateGesture=gestureMap[gesture.id];if(candidateGesture!==undefined)gesture.update(gesture,frame);if(gesture.state=="start"||gesture.state=="stop"){if(type==gesture.type&&gestureMap[gesture.id]===undefined){gestureMap[gesture.id]=new Gesture(gesture,frame);gesture.update(gesture,frame)}if(gesture.state=="stop"){delete gestureMap[gesture.id]}}};controller.on("gesture",function(gesture,frame){if(gesture.type==type){if(gesture.state=="start"||gesture.state=="stop"){if(gestureMap[gesture.id]===undefined){var gestureTracker=new Gesture(gesture,frame);gestureMap[gesture.id]=gestureTracker;_.each(handlers,function(cb,name){gestureTracker.on(name,cb)})}}gestureMap[gesture.id].update(gesture,frame);if(gesture.state=="stop"){delete gestureMap[gesture.id]}}});var builder={start:function(cb){handlers["start"]=cb;return builder},stop:function(cb){handlers["stop"]=cb;return builder},complete:function(cb){handlers["stop"]=cb;return builder},update:function(cb){handlers["update"]=cb;return builder}};return builder};var Gesture=exports.Gesture=function(gesture,frame){this.gestures=[gesture];this.frames=[frame]};Gesture.prototype.update=function(gesture,frame){this.gestures.push(gesture);this.frames.push(frame);this.emit(gesture.state,this)};_.extend(Gesture.prototype,EventEmitter.prototype);var CircleGesture=function(data){this.center=data.center;this.normal=data.normal;this.progress=data.progress;this.radius=data.radius};CircleGesture.prototype.toString=function(){return"CircleGesture ["+JSON.stringify(this)+"]"};var SwipeGesture=function(data){this.startPosition=data.startPosition;this.position=data.position;this.direction=data.direction;this.speed=data.speed};SwipeGesture.prototype.toString=function(){return"SwipeGesture ["+JSON.stringify(this)+"]"};var ScreenTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};ScreenTapGesture.prototype.toString=function(){return"ScreenTapGesture ["+JSON.stringify(this)+"]"};var KeyTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};KeyTapGesture.prototype.toString=function(){return"KeyTapGesture ["+JSON.stringify(this)+"]"}},{events:17,"gl-matrix":19,underscore:20}],7:[function(require,module,exports){var Pointable=require("./pointable"),glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,_=require("underscore");var Hand=module.exports=function(data){this.id=data.id;this.palmPosition=data.palmPosition;this.direction=data.direction;this.palmVelocity=data.palmVelocity;this.palmNormal=data.palmNormal;this.sphereCenter=data.sphereCenter;this.sphereRadius=data.sphereRadius;this.valid=true;this.pointables=[];this.fingers=[];this.tools=[];this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.timeVisible=data.timeVisible;this.stabilizedPalmPosition=data.stabilizedPalmPosition};Hand.prototype.finger=function(id){var finger=this.frame.finger(id);return finger&&finger.handId==this.id?finger:Pointable.Invalid};Hand.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Hand.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceHand._rotation[5],this._rotation[2]-sinceHand._rotation[6],this._rotation[3]-sinceHand._rotation[1]])};Hand.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);var m=mat3.multiply(mat3.create(),sinceHand._rotation,transpose);return m};Hand.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 1;return Math.exp(this._scaleFactor-sinceHand._scaleFactor)};Hand.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return[this._translation[0]-sinceHand._translation[0],this._translation[1]-sinceHand._translation[1],this._translation[2]-sinceHand._translation[2]]};Hand.prototype.toString=function(){return"Hand [ id: "+this.id+" | palm velocity:"+this.palmVelocity+" | sphere center:"+this.sphereCenter+" ] "};Hand.Invalid={valid:false,fingers:[],tools:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./pointable":11,"gl-matrix":19,underscore:20}],8:[function(require,module,exports){!function(){module.exports={Controller:require("./controller"),Frame:require("./frame"),Gesture:require("./gesture"),Hand:require("./hand"),Pointable:require("./pointable"),InteractionBox:require("./interaction_box"),Connection:require("./connection"),CircularBuffer:require("./circular_buffer"),UI:require("./ui"),glMatrix:require("gl-matrix"),mat3:require("gl-matrix").mat3,vec3:require("gl-matrix").vec3,loopController:undefined,loop:function(opts,callback){if(callback===undefined){callback=opts;opts={}}if(!this.loopController)this.loopController=new this.Controller(opts);this.loopController.loop(callback)}}}()},{"./circular_buffer":2,"./connection":3,"./controller":4,"./frame":5,"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"./ui":13,"gl-matrix":19}],9:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var InteractionBox=module.exports=function(data){this.valid=true;this.center=data.center;this.size=data.size;this.width=data.size[0];this.height=data.size[1];this.depth=data.size[2]};InteractionBox.prototype.denormalizePoint=function(normalizedPosition){return vec3.fromValues((normalizedPosition[0]-.5)*this.size[0]+this.center[0],(normalizedPosition[1]-.5)*this.size[1]+this.center[1],(normalizedPosition[2]-.5)*this.size[2]+this.center[2])};InteractionBox.prototype.normalizePoint=function(position,clamp){var vec=vec3.fromValues((position[0]-this.center[0])/this.size[0]+.5,(position[1]-this.center[1])/this.size[1]+.5,(position[2]-this.center[2])/this.size[2]+.5);if(clamp){vec[0]=Math.min(Math.max(vec[0],0),1);vec[1]=Math.min(Math.max(vec[1],0),1);vec[2]=Math.min(Math.max(vec[2],0),1)}return vec};InteractionBox.prototype.toString=function(){return"InteractionBox [ width:"+this.width+" | height:"+this.height+" | depth:"+this.depth+" ]"};InteractionBox.Invalid={valid:false}},{"gl-matrix":19}],10:[function(require,module,exports){var Pipeline=module.exports=function(){this.steps=[]};Pipeline.prototype.addStep=function(step){this.steps.push(step)};Pipeline.prototype.run=function(frame){var stepsLength=this.steps.length;for(var i=0;i!=stepsLength;i++){if(!frame)break;frame=this.steps[i](frame)}return frame}},{}],11:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var Pointable=module.exports=function(data){this.valid=true;this.id=data.id;this.handId=data.handId;this.length=data.length;this.tool=data.tool;this.width=data.width;this.direction=data.direction;this.stabilizedTipPosition=data.stabilizedTipPosition;this.tipPosition=data.tipPosition;this.tipVelocity=data.tipVelocity;this.touchZone=data.touchZone;this.touchDistance=data.touchDistance;this.timeVisible=data.timeVisible};Pointable.prototype.toString=function(){if(this.tool==true){return"Pointable [ id:"+this.id+" "+this.length+"mmx | with:"+this.width+"mm | direction:"+this.direction+" ]"}else{return"Pointable [ id:"+this.id+" "+this.length+"mmx | direction: "+this.direction+" ]"}};Pointable.Invalid={valid:false}},{"gl-matrix":19}],12:[function(require,module,exports){var Frame=require("./frame");var Event=function(data){this.type=data.type;this.state=data.state};var chooseProtocol=exports.chooseProtocol=function(header){var protocol;switch(header.version){case 1:protocol=JSONProtocol(1,function(data){return new Frame(data)});break;case 2:protocol=JSONProtocol(2,function(data){return new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;case 3:protocol=JSONProtocol(3,function(data){return data.event?new Event(data.event):new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;default:throw"unrecognized version"}return protocol};var JSONProtocol=function(version,cb){var protocol=cb;protocol.encode=function(message){return JSON.stringify(message)};protocol.version=version;protocol.versionLong="Version "+version;protocol.type="protocol";return protocol}},{"./frame":5}],13:[function(require,module,exports){exports.UI={Region:require("./ui/region"),Cursor:require("./ui/cursor")}},{"./ui/cursor":14,"./ui/region":15}],14:[function(require,module,exports){var Cursor=module.exports=function(){return function(frame){var pointable=frame.pointables.sort(function(a,b){return a.z-b.z})[0];if(pointable&&pointable.valid){frame.cursorPosition=pointable.tipPosition}return frame}}},{}],15:[function(require,module,exports){var EventEmitter=require("events").EventEmitter,_=require("underscore");var Region=module.exports=function(start,end){this.start=new Vector(start);this.end=new Vector(end);this.enteredFrame=null};Region.prototype.hasPointables=function(frame){for(var i=0;i!=frame.pointables.length;i++){var position=frame.pointables[i].tipPosition;if(position.x>=this.start.x&&position.x<=this.end.x&&position.y>=this.start.y&&position.y<=this.end.y&&position.z>=this.start.z&&position.z<=this.end.z){return true}}return false};Region.prototype.listener=function(opts){var region=this;if(opts&&opts.nearThreshold)this.setupNearRegion(opts.nearThreshold);return function(frame){return region.updatePosition(frame)}};Region.prototype.clipper=function(){var region=this;return function(frame){region.updatePosition(frame);return region.enteredFrame?frame:null}};Region.prototype.setupNearRegion=function(distance){var nearRegion=this.nearRegion=new Region([this.start.x-distance,this.start.y-distance,this.start.z-distance],[this.end.x+distance,this.end.y+distance,this.end.z+distance]);var region=this;nearRegion.on("enter",function(frame){region.emit("near",frame)});nearRegion.on("exit",function(frame){region.emit("far",frame)});region.on("exit",function(frame){region.emit("near",frame)})};Region.prototype.updatePosition=function(frame){if(this.nearRegion)this.nearRegion.updatePosition(frame);if(this.hasPointables(frame)&&this.enteredFrame==null){this.enteredFrame=frame;this.emit("enter",this.enteredFrame)}else if(!this.hasPointables(frame)&&this.enteredFrame!=null){this.enteredFrame=null;this.emit("exit",this.enteredFrame)}return frame};Region.prototype.normalize=function(position){return new Vector([(position.x-this.start.x)/(this.end.x-this.start.x),(position.y-this.start.y)/(this.end.y-this.start.y),(position.z-this.start.z)/(this.end.z-this.start.z)])};Region.prototype.mapToXY=function(position,width,height){var normalized=this.normalize(position);var x=normalized.x,y=normalized.y;if(x>1)x=1;else if(x<-1)x=-1;if(y>1)y=1;else if(y<-1)y=-1;return[(x+1)/2*width,(1-y)/2*height,normalized.z]};_.extend(Region.prototype,EventEmitter.prototype)},{events:17,underscore:20}],16:[function(require,module,exports){},{}],17:[function(require,module,exports){!function(process){if(!process.EventEmitter)process.EventEmitter=function(){};var EventEmitter=exports.EventEmitter=process.EventEmitter;var isArray=typeof Array.isArray==="function"?Array.isArray:function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function indexOf(xs,x){if(xs.indexOf)return xs.indexOf(x);for(var i=0;i<xs.length;i++){if(x===xs[i])return i}return-1}var defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!this._events)this._events={};this._events.maxListeners=n};EventEmitter.prototype.emit=function(type){if(type==="error"){if(!this._events||!this._events.error||isArray(this._events.error)&&!this._events.error.length){if(arguments[1]instanceof Error){throw arguments[1]}else{throw new Error("Uncaught, unspecified 'error' event.")}return false}}if(!this._events)return false;var handler=this._events[type];if(!handler)return false;if(typeof handler=="function"){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:var args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}return true}else if(isArray(handler)){var args=Array.prototype.slice.call(arguments,1);var listeners=handler.slice();for(var i=0,l=listeners.length;i<l;i++){listeners[i].apply(this,args)}return true}else{return false}};EventEmitter.prototype.addListener=function(type,listener){if("function"!==typeof listener){throw new Error("addListener only takes instances of Function")}if(!this._events)this._events={};this.emit("newListener",type,listener);if(!this._events[type]){this._events[type]=listener}else if(isArray(this._events[type])){if(!this._events[type].warned){var m;if(this._events.maxListeners!==undefined){m=this._events.maxListeners}else{m=defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);console.trace()}}this._events[type].push(listener)}else{this._events[type]=[this._events[type],listener]}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){var self=this;self.on(type,function g(){self.removeListener(type,g);listener.apply(this,arguments)});return this};EventEmitter.prototype.removeListener=function(type,listener){if("function"!==typeof listener){throw new Error("removeListener only takes instances of Function")}if(!this._events||!this._events[type])return this;var list=this._events[type];if(isArray(list)){var i=indexOf(list,listener);if(i<0)return this;list.splice(i,1);if(list.length==0)delete this._events[type]}else if(this._events[type]===listener){delete this._events[type]}return this};EventEmitter.prototype.removeAllListeners=function(type){if(arguments.length===0){this._events={};return this}if(type&&this._events&&this._events[type])this._events[type]=null;return this};EventEmitter.prototype.listeners=function(type){if(!this._events)this._events={};if(!this._events[type])this._events[type]=[];if(!isArray(this._events[type])){this._events[type]=[this._events[type]]}return this._events[type]}}(require("__browserify_process"))},{__browserify_process:18}],18:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){if(ev.source===window&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],19:[function(require,module,exports){!function(){!function(){"use strict";var shim={};if(typeof exports==="undefined"){if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){shim.exports={};define(function(){return shim.exports})}else{shim.exports=window}}else{shim.exports=exports}!function(exports){var vec2={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec2.create=function(){return new Float32Array(2)};vec2.clone=function(a){var out=new Float32Array(2);out[0]=a[0];out[1]=a[1];return out};vec2.fromValues=function(x,y){var out=new Float32Array(2);out[0]=x;out[1]=y;return out};vec2.copy=function(out,a){out[0]=a[0];out[1]=a[1];return out};vec2.set=function(out,x,y){out[0]=x;out[1]=y;return out};vec2.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];return out};vec2.sub=vec2.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];return out};vec2.mul=vec2.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];return out};vec2.div=vec2.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];return out};vec2.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);
-out[1]=Math.min(a[1],b[1]);return out};vec2.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);return out};vec2.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;return out};vec2.dist=vec2.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return Math.sqrt(x*x+y*y)};vec2.sqrDist=vec2.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return x*x+y*y};vec2.len=vec2.length=function(a){var x=a[0],y=a[1];return Math.sqrt(x*x+y*y)};vec2.sqrLen=vec2.squaredLength=function(a){var x=a[0],y=a[1];return x*x+y*y};vec2.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];return out};vec2.normalize=function(out,a){var x=a[0],y=a[1];var len=x*x+y*y;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len}return out};vec2.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]};vec2.cross=function(out,a,b){var z=a[0]*b[1]-a[1]*b[0];out[0]=out[1]=0;out[2]=z;return out};vec2.lerp=function(out,a,b,t){var ax=a[0],ay=a[1];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);return out};vec2.transformMat2=function(out,a,m){var x=a[0],y=a[1];out[0]=x*m[0]+y*m[1];out[1]=x*m[2]+y*m[3];return out};vec2.forEach=function(){var vec=new Float32Array(2);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=2}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1]}return a}}();vec2.str=function(a){return"vec2("+a[0]+", "+a[1]+")"};if(typeof exports!=="undefined"){exports.vec2=vec2}var vec3={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec3.create=function(){return new Float32Array(3)};vec3.clone=function(a){var out=new Float32Array(3);out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.fromValues=function(x,y,z){var out=new Float32Array(3);out[0]=x;out[1]=y;out[2]=z;return out};vec3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.set=function(out,x,y,z){out[0]=x;out[1]=y;out[2]=z;return out};vec3.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];return out};vec3.sub=vec3.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];return out};vec3.mul=vec3.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];return out};vec3.div=vec3.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];return out};vec3.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);return out};vec3.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);return out};vec3.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;return out};vec3.dist=vec3.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrDist=vec3.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return x*x+y*y+z*z};vec3.len=vec3.length=function(a){var x=a[0],y=a[1],z=a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrLen=vec3.squaredLength=function(a){var x=a[0],y=a[1],z=a[2];return x*x+y*y+z*z};vec3.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];return out};vec3.normalize=function(out,a){var x=a[0],y=a[1],z=a[2];var len=x*x+y*y+z*z;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len}return out};vec3.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]};vec3.cross=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2];out[0]=ay*bz-az*by;out[1]=az*bx-ax*bz;out[2]=ax*by-ay*bx;return out};vec3.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);return out};vec3.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12];out[1]=m[1]*x+m[5]*y+m[9]*z+m[13];out[2]=m[2]*x+m[6]*y+m[10]*z+m[14];return out};vec3.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec3.forEach=function(){var vec=new Float32Array(3);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=3}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2]}return a}}();vec3.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};if(typeof exports!=="undefined"){exports.vec3=vec3}var vec4={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec4.create=function(){return new Float32Array(4)};vec4.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.fromValues=function(x,y,z,w){var out=new Float32Array(4);out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.set=function(out,x,y,z,w){out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];out[3]=a[3]+b[3];return out};vec4.sub=vec4.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];out[3]=a[3]-b[3];return out};vec4.mul=vec4.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];out[3]=a[3]*b[3];return out};vec4.div=vec4.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];out[3]=a[3]/b[3];return out};vec4.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);out[3]=Math.min(a[3],b[3]);return out};vec4.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);out[3]=Math.max(a[3],b[3]);return out};vec4.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;out[3]=a[3]*b;return out};vec4.dist=vec4.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrDist=vec4.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return x*x+y*y+z*z+w*w};vec4.len=vec4.length=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrLen=vec4.squaredLength=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return x*x+y*y+z*z+w*w};vec4.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=-a[3];return out};vec4.normalize=function(out,a){var x=a[0],y=a[1],z=a[2],w=a[3];var len=x*x+y*y+z*z+w*w;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;out[3]=a[3]*len}return out};vec4.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]};vec4.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);out[3]=aw+t*(b[3]-aw);return out};vec4.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2],w=a[3];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12]*w;out[1]=m[1]*x+m[5]*y+m[9]*z+m[13]*w;out[2]=m[2]*x+m[6]*y+m[10]*z+m[14]*w;out[3]=m[3]*x+m[7]*y+m[11]*z+m[15]*w;return out};vec4.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec4.forEach=function(){var vec=new Float32Array(4);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=4}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];vec[3]=a[i+3];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2];a[i+3]=vec[3]}return a}}();vec4.str=function(a){return"vec4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.vec4=vec4}var mat2={};var mat2Identity=new Float32Array([1,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat2.create=function(){return new Float32Array(mat2Identity)};mat2.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=1;return out};mat2.transpose=function(out,a){if(out===a){var a1=a[1];out[1]=a[2];out[2]=a1}else{out[0]=a[0];out[1]=a[2];out[2]=a[1];out[3]=a[3]}return out};mat2.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],det=a0*a3-a2*a1;if(!det){return null}det=1/det;out[0]=a3*det;out[1]=-a1*det;out[2]=-a2*det;out[3]=a0*det;return out};mat2.adjoint=function(out,a){var a0=a[0];out[0]=a[3];out[1]=-a[1];out[2]=-a[2];out[3]=a0;return out};mat2.determinant=function(a){return a[0]*a[3]-a[2]*a[1]};mat2.mul=mat2.multiply=function(out,a,b){var a0=a[0],a1=a[1],a2=a[2],a3=a[3];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=a0*b0+a1*b2;out[1]=a0*b1+a1*b3;out[2]=a2*b0+a3*b2;out[3]=a2*b1+a3*b3;return out};mat2.rotate=function(out,a,rad){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],s=Math.sin(rad),c=Math.cos(rad);out[0]=a0*c+a1*s;out[1]=a0*-s+a1*c;out[2]=a2*c+a3*s;out[3]=a2*-s+a3*c;return out};mat2.scale=function(out,a,v){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],v0=v[0],v1=v[1];out[0]=a0*v0;out[1]=a1*v1;out[2]=a2*v0;out[3]=a3*v1;return out};mat2.str=function(a){return"mat2("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.mat2=mat2}var mat3={};var mat3Identity=new Float32Array([1,0,0,0,1,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat3.create=function(){return new Float32Array(mat3Identity)};mat3.clone=function(a){var out=new Float32Array(9);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=1;out[5]=0;out[6]=0;out[7]=0;out[8]=1;return out};mat3.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a12=a[5];out[1]=a[3];out[2]=a[6];out[3]=a01;out[5]=a[7];out[6]=a02;out[7]=a12}else{out[0]=a[0];out[1]=a[3];out[2]=a[6];out[3]=a[1];out[4]=a[4];out[5]=a[7];out[6]=a[2];out[7]=a[5];out[8]=a[8]}return out};mat3.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b01=a22*a11-a12*a21,b11=-a22*a10+a12*a20,b21=a21*a10-a11*a20,det=a00*b01+a01*b11+a02*b21;if(!det){return null}det=1/det;out[0]=b01*det;out[1]=(-a22*a01+a02*a21)*det;out[2]=(a12*a01-a02*a11)*det;out[3]=b11*det;out[4]=(a22*a00-a02*a20)*det;out[5]=(-a12*a00+a02*a10)*det;out[6]=b21*det;out[7]=(-a21*a00+a01*a20)*det;out[8]=(a11*a00-a01*a10)*det;return out};mat3.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];out[0]=a11*a22-a12*a21;out[1]=a02*a21-a01*a22;out[2]=a01*a12-a02*a11;out[3]=a12*a20-a10*a22;out[4]=a00*a22-a02*a20;out[5]=a02*a10-a00*a12;out[6]=a10*a21-a11*a20;out[7]=a01*a20-a00*a21;out[8]=a00*a11-a01*a10;return out};mat3.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];return a00*(a22*a11-a12*a21)+a01*(-a22*a10+a12*a20)+a02*(a21*a10-a11*a20)};mat3.mul=mat3.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b00=b[0],b01=b[1],b02=b[2],b10=b[3],b11=b[4],b12=b[5],b20=b[6],b21=b[7],b22=b[8];out[0]=b00*a00+b01*a10+b02*a20;out[1]=b00*a01+b01*a11+b02*a21;out[2]=b00*a02+b01*a12+b02*a22;out[3]=b10*a00+b11*a10+b12*a20;out[4]=b10*a01+b11*a11+b12*a21;out[5]=b10*a02+b11*a12+b12*a22;out[6]=b20*a00+b21*a10+b22*a20;out[7]=b20*a01+b21*a11+b22*a21;out[8]=b20*a02+b21*a12+b22*a22;return out};mat3.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"};if(typeof exports!=="undefined"){exports.mat3=mat3}var mat4={};var mat4Identity=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat4.create=function(){return new Float32Array(mat4Identity)};mat4.clone=function(a){var out=new Float32Array(16);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=1;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=1;out[11]=0;out[12]=0;out[13]=0;out[14]=0;out[15]=1;return out};mat4.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a03=a[3],a12=a[6],a13=a[7],a23=a[11];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a01;out[6]=a[9];out[7]=a[13];out[8]=a02;out[9]=a12;out[11]=a[14];out[12]=a03;out[13]=a13;out[14]=a23}else{out[0]=a[0];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a[1];out[5]=a[5];out[6]=a[9];out[7]=a[13];out[8]=a[2];out[9]=a[6];out[10]=a[10];out[11]=a[14];out[12]=a[3];out[13]=a[7];out[14]=a[11];out[15]=a[15]}return out};mat4.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32,det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(!det){return null}det=1/det;out[0]=(a11*b11-a12*b10+a13*b09)*det;out[1]=(a02*b10-a01*b11-a03*b09)*det;out[2]=(a31*b05-a32*b04+a33*b03)*det;out[3]=(a22*b04-a21*b05-a23*b03)*det;out[4]=(a12*b08-a10*b11-a13*b07)*det;out[5]=(a00*b11-a02*b08+a03*b07)*det;out[6]=(a32*b02-a30*b05-a33*b01)*det;out[7]=(a20*b05-a22*b02+a23*b01)*det;out[8]=(a10*b10-a11*b08+a13*b06)*det;out[9]=(a01*b08-a00*b10-a03*b06)*det;out[10]=(a30*b04-a31*b02+a33*b00)*det;out[11]=(a21*b02-a20*b04-a23*b00)*det;out[12]=(a11*b07-a10*b09-a12*b06)*det;out[13]=(a00*b09-a01*b07+a02*b06)*det;out[14]=(a31*b01-a30*b03-a32*b00)*det;out[15]=(a20*b03-a21*b01+a22*b00)*det;return out};mat4.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];out[0]=a11*(a22*a33-a23*a32)-a21*(a12*a33-a13*a32)+a31*(a12*a23-a13*a22);out[1]=-(a01*(a22*a33-a23*a32)-a21*(a02*a33-a03*a32)+a31*(a02*a23-a03*a22));out[2]=a01*(a12*a33-a13*a32)-a11*(a02*a33-a03*a32)+a31*(a02*a13-a03*a12);out[3]=-(a01*(a12*a23-a13*a22)-a11*(a02*a23-a03*a22)+a21*(a02*a13-a03*a12));out[4]=-(a10*(a22*a33-a23*a32)-a20*(a12*a33-a13*a32)+a30*(a12*a23-a13*a22));out[5]=a00*(a22*a33-a23*a32)-a20*(a02*a33-a03*a32)+a30*(a02*a23-a03*a22);out[6]=-(a00*(a12*a33-a13*a32)-a10*(a02*a33-a03*a32)+a30*(a02*a13-a03*a12));out[7]=a00*(a12*a23-a13*a22)-a10*(a02*a23-a03*a22)+a20*(a02*a13-a03*a12);out[8]=a10*(a21*a33-a23*a31)-a20*(a11*a33-a13*a31)+a30*(a11*a23-a13*a21);out[9]=-(a00*(a21*a33-a23*a31)-a20*(a01*a33-a03*a31)+a30*(a01*a23-a03*a21));out[10]=a00*(a11*a33-a13*a31)-a10*(a01*a33-a03*a31)+a30*(a01*a13-a03*a11);out[11]=-(a00*(a11*a23-a13*a21)-a10*(a01*a23-a03*a21)+a20*(a01*a13-a03*a11));out[12]=-(a10*(a21*a32-a22*a31)-a20*(a11*a32-a12*a31)+a30*(a11*a22-a12*a21));out[13]=a00*(a21*a32-a22*a31)-a20*(a01*a32-a02*a31)+a30*(a01*a22-a02*a21);out[14]=-(a00*(a11*a32-a12*a31)-a10*(a01*a32-a02*a31)+a30*(a01*a12-a02*a11));out[15]=a00*(a11*a22-a12*a21)-a10*(a01*a22-a02*a21)+a20*(a01*a12-a02*a11);return out};mat4.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32;return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06};mat4.mul=mat4.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=b0*a00+b1*a10+b2*a20+b3*a30;out[1]=b0*a01+b1*a11+b2*a21+b3*a31;out[2]=b0*a02+b1*a12+b2*a22+b3*a32;out[3]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[4];b1=b[5];b2=b[6];b3=b[7];out[4]=b0*a00+b1*a10+b2*a20+b3*a30;out[5]=b0*a01+b1*a11+b2*a21+b3*a31;out[6]=b0*a02+b1*a12+b2*a22+b3*a32;out[7]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[8];b1=b[9];b2=b[10];b3=b[11];out[8]=b0*a00+b1*a10+b2*a20+b3*a30;out[9]=b0*a01+b1*a11+b2*a21+b3*a31;out[10]=b0*a02+b1*a12+b2*a22+b3*a32;out[11]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[12];b1=b[13];b2=b[14];b3=b[15];out[12]=b0*a00+b1*a10+b2*a20+b3*a30;out[13]=b0*a01+b1*a11+b2*a21+b3*a31;out[14]=b0*a02+b1*a12+b2*a22+b3*a32;out[15]=b0*a03+b1*a13+b2*a23+b3*a33;return out};mat4.translate=function(out,a,v){var x=v[0],y=v[1],z=v[2],a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;if(a===out){out[12]=a[0]*x+a[4]*y+a[8]*z+a[12];out[13]=a[1]*x+a[5]*y+a[9]*z+a[13];out[14]=a[2]*x+a[6]*y+a[10]*z+a[14];out[15]=a[3]*x+a[7]*y+a[11]*z+a[15]}else{a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a03;out[4]=a10;out[5]=a11;out[6]=a12;out[7]=a13;out[8]=a20;out[9]=a21;out[10]=a22;out[11]=a23;out[12]=a00*x+a10*y+a20*z+a[12];out[13]=a01*x+a11*y+a21*z+a[13];out[14]=a02*x+a12*y+a22*z+a[14];out[15]=a03*x+a13*y+a23*z+a[15]}return out};mat4.scale=function(out,a,v){var x=v[0],y=v[1],z=v[2];out[0]=a[0]*x;out[1]=a[1]*x;out[2]=a[2]*x;out[3]=a[3]*x;out[4]=a[4]*y;out[5]=a[5]*y;out[6]=a[6]*y;out[7]=a[7]*y;out[8]=a[8]*z;out[9]=a[9]*z;out[10]=a[10]*z;out[11]=a[11]*z;out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.rotate=function(out,a,rad,axis){var x=axis[0],y=axis[1],z=axis[2],len=Math.sqrt(x*x+y*y+z*z),s,c,t,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,b00,b01,b02,b10,b11,b12,b20,b21,b22;if(Math.abs(len)<GLMAT_EPSILON){return null}len=1/len;x*=len;y*=len;z*=len;s=Math.sin(rad);c=Math.cos(rad);t=1-c;a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];b00=x*x*t+c;b01=y*x*t+z*s;b02=z*x*t-y*s;b10=x*y*t-z*s;b11=y*y*t+c;b12=z*y*t+x*s;b20=x*z*t+y*s;b21=y*z*t-x*s;b22=z*z*t+c;out[0]=a00*b00+a10*b01+a20*b02;out[1]=a01*b00+a11*b01+a21*b02;out[2]=a02*b00+a12*b01+a22*b02;out[3]=a03*b00+a13*b01+a23*b02;out[4]=a00*b10+a10*b11+a20*b12;out[5]=a01*b10+a11*b11+a21*b12;out[6]=a02*b10+a12*b11+a22*b12;out[7]=a03*b10+a13*b11+a23*b12;out[8]=a00*b20+a10*b21+a20*b22;out[9]=a01*b20+a11*b21+a21*b22;out[10]=a02*b20+a12*b21+a22*b22;out[11]=a03*b20+a13*b21+a23*b22;if(a!==out){out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}return out};mat4.rotateX=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[4]=a10*c+a20*s;out[5]=a11*c+a21*s;out[6]=a12*c+a22*s;out[7]=a13*c+a23*s;out[8]=a20*c-a10*s;out[9]=a21*c-a11*s;out[10]=a22*c-a12*s;out[11]=a23*c-a13*s;return out};mat4.rotateY=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c-a20*s;out[1]=a01*c-a21*s;out[2]=a02*c-a22*s;out[3]=a03*c-a23*s;out[8]=a00*s+a20*c;out[9]=a01*s+a21*c;out[10]=a02*s+a22*c;out[11]=a03*s+a23*c;return out};mat4.rotateZ=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7];if(a!==out){out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c+a10*s;out[1]=a01*c+a11*s;out[2]=a02*c+a12*s;out[3]=a03*c+a13*s;out[4]=a10*c-a00*s;out[5]=a11*c-a01*s;out[6]=a12*c-a02*s;out[7]=a13*c-a03*s;return out};mat4.fromRotationTranslation=function(out,q,v){var x=q[0],y=q[1],z=q[2],w=q[3],x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;out[0]=1-(yy+zz);out[1]=xy+wz;out[2]=xz-wy;out[3]=0;out[4]=xy-wz;out[5]=1-(xx+zz);out[6]=yz+wx;out[7]=0;out[8]=xz+wy;out[9]=yz-wx;out[10]=1-(xx+yy);out[11]=0;out[12]=v[0];out[13]=v[1];out[14]=v[2];out[15]=1;return out};mat4.frustum=function(out,left,right,bottom,top,near,far){var rl=1/(right-left),tb=1/(top-bottom),nf=1/(near-far);out[0]=near*2*rl;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=near*2*tb;out[6]=0;out[7]=0;out[8]=(right+left)*rl;out[9]=(top+bottom)*tb;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=far*near*2*nf;out[15]=0;return out};mat4.perspective=function(out,fovy,aspect,near,far){var f=1/Math.tan(fovy/2),nf=1/(near-far);out[0]=f/aspect;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=f;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=2*far*near*nf;out[15]=0;return out};mat4.ortho=function(out,left,right,bottom,top,near,far){var lr=1/(left-right),bt=1/(bottom-top),nf=1/(near-far);out[0]=-2*lr;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=-2*bt;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=2*nf;out[11]=0;out[12]=(left+right)*lr;out[13]=(top+bottom)*bt;out[14]=(far+near)*nf;out[15]=1;return out};mat4.lookAt=function(out,eye,center,up){var x0,x1,x2,y0,y1,y2,z0,z1,z2,len,eyex=eye[0],eyey=eye[1],eyez=eye[2],upx=up[0],upy=up[1],upz=up[2],centerx=center[0],centery=center[1],centerz=center[2];if(Math.abs(eyex-centerx)<GLMAT_EPSILON&&Math.abs(eyey-centery)<GLMAT_EPSILON&&Math.abs(eyez-centerz)<GLMAT_EPSILON){return mat4.identity(out)}z0=eyex-centerx;z1=eyey-centery;z2=eyez-centerz;len=1/Math.sqrt(z0*z0+z1*z1+z2*z2);z0*=len;z1*=len;z2*=len;x0=upy*z2-upz*z1;x1=upz*z0-upx*z2;x2=upx*z1-upy*z0;len=Math.sqrt(x0*x0+x1*x1+x2*x2);if(!len){x0=0;x1=0;x2=0}else{len=1/len;x0*=len;x1*=len;x2*=len}y0=z1*x2-z2*x1;y1=z2*x0-z0*x2;y2=z0*x1-z1*x0;len=Math.sqrt(y0*y0+y1*y1+y2*y2);if(!len){y0=0;y1=0;y2=0}else{len=1/len;y0*=len;y1*=len;y2*=len}out[0]=x0;out[1]=y0;out[2]=z0;out[3]=0;out[4]=x1;out[5]=y1;out[6]=z1;out[7]=0;out[8]=x2;out[9]=y2;out[10]=z2;out[11]=0;out[12]=-(x0*eyex+x1*eyey+x2*eyez);out[13]=-(y0*eyex+y1*eyey+y2*eyez);out[14]=-(z0*eyex+z1*eyey+z2*eyez);out[15]=1;return out};mat4.str=function(a){return"mat4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+")"};if(typeof exports!=="undefined"){exports.mat4=mat4}var quat={};var quatIdentity=new Float32Array([0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}quat.create=function(){return new Float32Array(quatIdentity)};quat.clone=vec4.clone;quat.fromValues=vec4.fromValues;quat.copy=vec4.copy;quat.set=vec4.set;quat.identity=function(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out};quat.setAxisAngle=function(out,axis,rad){rad=rad*.5;var s=Math.sin(rad);out[0]=s*axis[0];out[1]=s*axis[1];out[2]=s*axis[2];out[3]=Math.cos(rad);return out};quat.add=vec4.add;quat.mul=quat.multiply=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=b[3];out[0]=ax*bw+aw*bx+ay*bz-az*by;out[1]=ay*bw+aw*by+az*bx-ax*bz;out[2]=az*bw+aw*bz+ax*by-ay*bx;out[3]=aw*bw-ax*bx-ay*by-az*bz;return out};quat.scale=vec4.scale;quat.rotateX=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+aw*bx;out[1]=ay*bw+az*bx;out[2]=az*bw-ay*bx;out[3]=aw*bw-ax*bx;return out};quat.rotateY=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],by=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw-az*by;out[1]=ay*bw+aw*by;out[2]=az*bw+ax*by;out[3]=aw*bw-ay*by;return out};quat.rotateZ=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bz=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+ay*bz;out[1]=ay*bw-ax*bz;out[2]=az*bw+aw*bz;out[3]=aw*bw-az*bz;return out};quat.calculateW=function(out,a){var x=a[0],y=a[1],z=a[2];out[0]=x;out[1]=y;out[2]=z;out[3]=-Math.sqrt(Math.abs(1-x*x-y*y-z*z));return out};quat.dot=vec4.dot;quat.lerp=vec4.lerp;quat.slerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=a[3];var cosHalfTheta=ax*bx+ay*by+az*bz+aw*bw,halfTheta,sinHalfTheta,ratioA,ratioB;if(Math.abs(cosHalfTheta)>=1){if(out!==a){out[0]=ax;out[1]=ay;out[2]=az;out[3]=aw}return out}halfTheta=Math.acos(cosHalfTheta);sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001){out[0]=ax*.5+bx*.5;out[1]=ay*.5+by*.5;out[2]=az*.5+bz*.5;out[3]=aw*.5+bw*.5;return out}ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta;ratioB=Math.sin(t*halfTheta)/sinHalfTheta;out[0]=ax*ratioA+bx*ratioB;out[1]=ay*ratioA+by*ratioB;out[2]=az*ratioA+bz*ratioB;out[3]=aw*ratioA+bw*ratioB;return out};quat.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],dot=a0*a0+a1*a1+a2*a2+a3*a3,invDot=dot?1/dot:0;out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out};quat.conjugate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out};quat.len=quat.length=vec4.length;quat.sqrLen=quat.squaredLength=vec4.squaredLength;quat.normalize=vec4.normalize;quat.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.quat=quat}}(shim.exports)}()}()},{}],20:[function(require,module,exports){!function(){!function(){var root=this;var previousUnderscore=root._;var breaker={};var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var push=ArrayProto.push,slice=ArrayProto.slice,concat=ArrayProto.concat,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeForEach=ArrayProto.forEach,nativeMap=ArrayProto.map,nativeReduce=ArrayProto.reduce,nativeReduceRight=ArrayProto.reduceRight,nativeFilter=ArrayProto.filter,nativeEvery=ArrayProto.every,nativeSome=ArrayProto.some,nativeIndexOf=ArrayProto.indexOf,nativeLastIndexOf=ArrayProto.lastIndexOf,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){if(obj instanceof _)return obj;if(!(this instanceof _))return new _(obj);this._wrapped=obj};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=_}exports._=_}else{root._=_}_.VERSION="1.4.4";var each=_.each=_.forEach=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i<l;i++){if(iterator.call(context,obj[i],i,obj)===breaker)return}}else{for(var key in obj){if(_.has(obj,key)){if(iterator.call(context,obj[key],key,obj)===breaker)return}}}};_.map=_.collect=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeMap&&obj.map===nativeMap)return obj.map(iterator,context);each(obj,function(value,index,list){results[results.length]=iterator.call(context,value,index,list)});return results};var reduceError="Reduce of empty array with no initial value";_.reduce=_.foldl=_.inject=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduce&&obj.reduce===nativeReduce){if(context)iterator=_.bind(iterator,context);return initial?obj.reduce(iterator,memo):obj.reduce(iterator)}each(obj,function(value,index,list){if(!initial){memo=value;initial=true}else{memo=iterator.call(context,memo,value,index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.reduceRight=_.foldr=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduceRight&&obj.reduceRight===nativeReduceRight){if(context)iterator=_.bind(iterator,context);return initial?obj.reduceRight(iterator,memo):obj.reduceRight(iterator)}var length=obj.length;if(length!==+length){var keys=_.keys(obj);length=keys.length}each(obj,function(value,index,list){index=keys?keys[--length]:--length;if(!initial){memo=obj[index];initial=true}else{memo=iterator.call(context,memo,obj[index],index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.find=_.detect=function(obj,iterator,context){var result;any(obj,function(value,index,list){if(iterator.call(context,value,index,list)){result=value;return true}});return result};_.filter=_.select=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeFilter&&obj.filter===nativeFilter)return obj.filter(iterator,context);each(obj,function(value,index,list){if(iterator.call(context,value,index,list))results[results.length]=value});return results};_.reject=function(obj,iterator,context){return _.filter(obj,function(value,index,list){return!iterator.call(context,value,index,list)},context)};_.every=_.all=function(obj,iterator,context){iterator||(iterator=_.identity);var result=true;if(obj==null)return result;if(nativeEvery&&obj.every===nativeEvery)return obj.every(iterator,context);each(obj,function(value,index,list){if(!(result=result&&iterator.call(context,value,index,list)))return breaker});return!!result};var any=_.some=_.any=function(obj,iterator,context){iterator||(iterator=_.identity);var result=false;if(obj==null)return result;if(nativeSome&&obj.some===nativeSome)return obj.some(iterator,context);each(obj,function(value,index,list){if(result||(result=iterator.call(context,value,index,list)))return breaker});return!!result};_.contains=_.include=function(obj,target){if(obj==null)return false;if(nativeIndexOf&&obj.indexOf===nativeIndexOf)return obj.indexOf(target)!=-1;return any(obj,function(value){return value===target})};_.invoke=function(obj,method){var args=slice.call(arguments,2);var isFunc=_.isFunction(method);return _.map(obj,function(value){return(isFunc?method:value[method]).apply(value,args)})};_.pluck=function(obj,key){return _.map(obj,function(value){return value[key]})};_.where=function(obj,attrs,first){if(_.isEmpty(attrs))return first?null:[];return _[first?"find":"filter"](obj,function(value){for(var key in attrs){if(attrs[key]!==value[key])return false}return true})};_.findWhere=function(obj,attrs){return _.where(obj,attrs,true)};_.max=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.max.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return-Infinity;var result={computed:-Infinity,value:-Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed>=result.computed&&(result={value:value,computed:computed})});return result.value};_.min=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.min.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return Infinity;var result={computed:Infinity,value:Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed<result.computed&&(result={value:value,computed:computed})});return result.value};_.shuffle=function(obj){var rand;var index=0;var shuffled=[];each(obj,function(value){rand=_.random(index++);shuffled[index-1]=shuffled[rand];shuffled[rand]=value});return shuffled};var lookupIterator=function(value){return _.isFunction(value)?value:function(obj){return obj[value]}};_.sortBy=function(obj,value,context){var iterator=lookupIterator(value);return _.pluck(_.map(obj,function(value,index,list){return{value:value,index:index,criteria:iterator.call(context,value,index,list)}}).sort(function(left,right){var a=left.criteria;
-var b=right.criteria;if(a!==b){if(a>b||a===void 0)return 1;if(a<b||b===void 0)return-1}return left.index<right.index?-1:1}),"value")};var group=function(obj,value,context,behavior){var result={};var iterator=lookupIterator(value||_.identity);each(obj,function(value,index){var key=iterator.call(context,value,index,obj);behavior(result,key,value)});return result};_.groupBy=function(obj,value,context){return group(obj,value,context,function(result,key,value){(_.has(result,key)?result[key]:result[key]=[]).push(value)})};_.countBy=function(obj,value,context){return group(obj,value,context,function(result,key){if(!_.has(result,key))result[key]=0;result[key]++})};_.sortedIndex=function(array,obj,iterator,context){iterator=iterator==null?_.identity:lookupIterator(iterator);var value=iterator.call(context,obj);var low=0,high=array.length;while(low<high){var mid=low+high>>>1;iterator.call(context,array[mid])<value?low=mid+1:high=mid}return low};_.toArray=function(obj){if(!obj)return[];if(_.isArray(obj))return slice.call(obj);if(obj.length===+obj.length)return _.map(obj,_.identity);return _.values(obj)};_.size=function(obj){if(obj==null)return 0;return obj.length===+obj.length?obj.length:_.keys(obj).length};_.first=_.head=_.take=function(array,n,guard){if(array==null)return void 0;return n!=null&&!guard?slice.call(array,0,n):array[0]};_.initial=function(array,n,guard){return slice.call(array,0,array.length-(n==null||guard?1:n))};_.last=function(array,n,guard){if(array==null)return void 0;if(n!=null&&!guard){return slice.call(array,Math.max(array.length-n,0))}else{return array[array.length-1]}};_.rest=_.tail=_.drop=function(array,n,guard){return slice.call(array,n==null||guard?1:n)};_.compact=function(array){return _.filter(array,_.identity)};var flatten=function(input,shallow,output){each(input,function(value){if(_.isArray(value)){shallow?push.apply(output,value):flatten(value,shallow,output)}else{output.push(value)}});return output};_.flatten=function(array,shallow){return flatten(array,shallow,[])};_.without=function(array){return _.difference(array,slice.call(arguments,1))};_.uniq=_.unique=function(array,isSorted,iterator,context){if(_.isFunction(isSorted)){context=iterator;iterator=isSorted;isSorted=false}var initial=iterator?_.map(array,iterator,context):array;var results=[];var seen=[];each(initial,function(value,index){if(isSorted?!index||seen[seen.length-1]!==value:!_.contains(seen,value)){seen.push(value);results.push(array[index])}});return results};_.union=function(){return _.uniq(concat.apply(ArrayProto,arguments))};_.intersection=function(array){var rest=slice.call(arguments,1);return _.filter(_.uniq(array),function(item){return _.every(rest,function(other){return _.indexOf(other,item)>=0})})};_.difference=function(array){var rest=concat.apply(ArrayProto,slice.call(arguments,1));return _.filter(array,function(value){return!_.contains(rest,value)})};_.zip=function(){var args=slice.call(arguments);var length=_.max(_.pluck(args,"length"));var results=new Array(length);for(var i=0;i<length;i++){results[i]=_.pluck(args,""+i)}return results};_.object=function(list,values){if(list==null)return{};var result={};for(var i=0,l=list.length;i<l;i++){if(values){result[list[i]]=values[i]}else{result[list[i][0]]=list[i][1]}}return result};_.indexOf=function(array,item,isSorted){if(array==null)return-1;var i=0,l=array.length;if(isSorted){if(typeof isSorted=="number"){i=isSorted<0?Math.max(0,l+isSorted):isSorted}else{i=_.sortedIndex(array,item);return array[i]===item?i:-1}}if(nativeIndexOf&&array.indexOf===nativeIndexOf)return array.indexOf(item,isSorted);for(;i<l;i++)if(array[i]===item)return i;return-1};_.lastIndexOf=function(array,item,from){if(array==null)return-1;var hasIndex=from!=null;if(nativeLastIndexOf&&array.lastIndexOf===nativeLastIndexOf){return hasIndex?array.lastIndexOf(item,from):array.lastIndexOf(item)}var i=hasIndex?from:array.length;while(i--)if(array[i]===item)return i;return-1};_.range=function(start,stop,step){if(arguments.length<=1){stop=start||0;start=0}step=arguments[2]||1;var len=Math.max(Math.ceil((stop-start)/step),0);var idx=0;var range=new Array(len);while(idx<len){range[idx++]=start;start+=step}return range};_.bind=function(func,context){if(func.bind===nativeBind&&nativeBind)return nativeBind.apply(func,slice.call(arguments,1));var args=slice.call(arguments,2);return function(){return func.apply(context,args.concat(slice.call(arguments)))}};_.partial=function(func){var args=slice.call(arguments,1);return function(){return func.apply(this,args.concat(slice.call(arguments)))}};_.bindAll=function(obj){var funcs=slice.call(arguments,1);if(funcs.length===0)funcs=_.functions(obj);each(funcs,function(f){obj[f]=_.bind(obj[f],obj)});return obj};_.memoize=function(func,hasher){var memo={};hasher||(hasher=_.identity);return function(){var key=hasher.apply(this,arguments);return _.has(memo,key)?memo[key]:memo[key]=func.apply(this,arguments)}};_.delay=function(func,wait){var args=slice.call(arguments,2);return setTimeout(function(){return func.apply(null,args)},wait)};_.defer=function(func){return _.delay.apply(_,[func,1].concat(slice.call(arguments,1)))};_.throttle=function(func,wait){var context,args,timeout,result;var previous=0;var later=function(){previous=new Date;timeout=null;result=func.apply(context,args)};return function(){var now=new Date;var remaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0){clearTimeout(timeout);timeout=null;previous=now;result=func.apply(context,args)}else if(!timeout){timeout=setTimeout(later,remaining)}return result}};_.debounce=function(func,wait,immediate){var timeout,result;return function(){var context=this,args=arguments;var later=function(){timeout=null;if(!immediate)result=func.apply(context,args)};var callNow=immediate&&!timeout;clearTimeout(timeout);timeout=setTimeout(later,wait);if(callNow)result=func.apply(context,args);return result}};_.once=function(func){var ran=false,memo;return function(){if(ran)return memo;ran=true;memo=func.apply(this,arguments);func=null;return memo}};_.wrap=function(func,wrapper){return function(){var args=[func];push.apply(args,arguments);return wrapper.apply(this,args)}};_.compose=function(){var funcs=arguments;return function(){var args=arguments;for(var i=funcs.length-1;i>=0;i--){args=[funcs[i].apply(this,args)]}return args[0]}};_.after=function(times,func){if(times<=0)return func();return function(){if(--times<1){return func.apply(this,arguments)}}};_.keys=nativeKeys||function(obj){if(obj!==Object(obj))throw new TypeError("Invalid object");var keys=[];for(var key in obj)if(_.has(obj,key))keys[keys.length]=key;return keys};_.values=function(obj){var values=[];for(var key in obj)if(_.has(obj,key))values.push(obj[key]);return values};_.pairs=function(obj){var pairs=[];for(var key in obj)if(_.has(obj,key))pairs.push([key,obj[key]]);return pairs};_.invert=function(obj){var result={};for(var key in obj)if(_.has(obj,key))result[obj[key]]=key;return result};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key)}return names.sort()};_.extend=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){obj[prop]=source[prop]}}});return obj};_.pick=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));each(keys,function(key){if(key in obj)copy[key]=obj[key]});return copy};_.omit=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));for(var key in obj){if(!_.contains(keys,key))copy[key]=obj[key]}return copy};_.defaults=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){if(obj[prop]==null)obj[prop]=source[prop]}}});return obj};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj)};_.tap=function(obj,interceptor){interceptor(obj);return obj};var eq=function(a,b,aStack,bStack){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a instanceof _)a=a._wrapped;if(b instanceof _)b=b._wrapped;var className=toString.call(a);if(className!=toString.call(b))return false;switch(className){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return false;var length=aStack.length;while(length--){if(aStack[length]==a)return bStack[length]==b}aStack.push(a);bStack.push(b);var size=0,result=true;if(className=="[object Array]"){size=a.length;result=size==b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack)))break}}}else{var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(_.isFunction(aCtor)&&aCtor instanceof aCtor&&_.isFunction(bCtor)&&bCtor instanceof bCtor)){return false}for(var key in a){if(_.has(a,key)){size++;if(!(result=_.has(b,key)&&eq(a[key],b[key],aStack,bStack)))break}}if(result){for(key in b){if(_.has(b,key)&&!size--)break}result=!size}}aStack.pop();bStack.pop();return result};_.isEqual=function(a,b){return eq(a,b,[],[])};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true};_.isElement=function(obj){return!!(obj&&obj.nodeType===1)};_.isArray=nativeIsArray||function(obj){return toString.call(obj)=="[object Array]"};_.isObject=function(obj){return obj===Object(obj)};each(["Arguments","Function","String","Number","Date","RegExp"],function(name){_["is"+name]=function(obj){return toString.call(obj)=="[object "+name+"]"}});if(!_.isArguments(arguments)){_.isArguments=function(obj){return!!(obj&&_.has(obj,"callee"))}}if(typeof/./!=="function"){_.isFunction=function(obj){return typeof obj==="function"}}_.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj))};_.isNaN=function(obj){return _.isNumber(obj)&&obj!=+obj};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)=="[object Boolean]"};_.isNull=function(obj){return obj===null};_.isUndefined=function(obj){return obj===void 0};_.has=function(obj,key){return hasOwnProperty.call(obj,key)};_.noConflict=function(){root._=previousUnderscore;return this};_.identity=function(value){return value};_.times=function(n,iterator,context){var accum=Array(n);for(var i=0;i<n;i++)accum[i]=iterator.call(context,i);return accum};_.random=function(min,max){if(max==null){max=min;min=0}return min+Math.floor(Math.random()*(max-min+1))};var entityMap={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};entityMap.unescape=_.invert(entityMap.escape);var entityRegexes={escape:new RegExp("["+_.keys(entityMap.escape).join("")+"]","g"),unescape:new RegExp("("+_.keys(entityMap.unescape).join("|")+")","g")};_.each(["escape","unescape"],function(method){_[method]=function(string){if(string==null)return"";return(""+string).replace(entityRegexes[method],function(match){return entityMap[method][match]})}});_.result=function(object,property){if(object==null)return null;var value=object[property];return _.isFunction(value)?value.call(object):value};_.mixin=function(obj){each(_.functions(obj),function(name){var func=_[name]=obj[name];_.prototype[name]=function(){var args=[this._wrapped];push.apply(args,arguments);return result.call(this,func.apply(_,args))}})};var idCounter=0;_.uniqueId=function(prefix){var id=++idCounter+"";return prefix?prefix+id:id};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/(.)^/;var escapes={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"};var escaper=/\\|'|\r|\n|\t|\u2028|\u2029/g;_.template=function(text,data,settings){var render;settings=_.defaults({},settings,_.templateSettings);var matcher=new RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join("|")+"|$","g");var index=0;var source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,function(match){return"\\"+escapes[match]});if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'"}if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'"}if(evaluate){source+="';\n"+evaluate+"\n__p+='"}index=offset+match.length;return match});source+="';\n";if(!settings.variable)source="with(obj||{}){\n"+source+"}\n";source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+"return __p;\n";try{render=new Function(settings.variable||"obj","_",source)}catch(e){e.source=source;throw e}if(data)return render(data,_);var template=function(data){return render.call(this,data,_)};template.source="function("+(settings.variable||"obj")+"){\n"+source+"}";return template};_.chain=function(obj){return _(obj).chain()};var result=function(obj){return this._chain?_(obj).chain():obj};_.mixin(_);each(["pop","push","reverse","shift","sort","splice","unshift"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){var obj=this._wrapped;method.apply(obj,arguments);if((name=="shift"||name=="splice")&&obj.length===0)delete obj[0];return result.call(this,obj)}});each(["concat","join","slice"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){return result.call(this,method.apply(this._wrapped,arguments))}});_.extend(_.prototype,{chain:function(){this._chain=true;return this},value:function(){return this._wrapped}})}.call(this)}()},{}],21:[function(require,module,exports){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}();Leap=require("../lib/index")},{"../lib/index":8}]},{},[21]);
-
-/*
- * Leap Motion integration for Reveal.js.
- * James Sun  [sun16]
- * Rory Hardy [gneatgeek]
- */
-
-(function () {
-  var body        = document.body,
-      controller  = new Leap.Controller({ enableGestures: true }),
-      lastGesture = 0,
-      leapConfig  = Reveal.getConfig().leap,
-      pointer     = document.createElement( 'div' ),
-      config      = {
-        autoCenter       : true,      // Center pointer around detected position.
-        gestureDelay     : 500,       // How long to delay between gestures.
-        naturalSwipe     : true,      // Swipe as if it were a touch screen.
-        pointerColor     : '#00aaff', // Default color of the pointer.
-        pointerOpacity   : 0.7,       // Default opacity of the pointer.
-        pointerSize      : 15,        // Default minimum height/width of the pointer.
-        pointerTolerance : 120        // Bigger = slower pointer.
-      },
-      entered, enteredPosition, now, size, tipPosition; // Other vars we need later, but don't need to redeclare.
-
-      // Merge user defined settings with defaults
-      if( leapConfig ) {
-        for( key in leapConfig ) {
-          config[key] = leapConfig[key];
-        }
-      }
-
-      pointer.id = 'leap';
-
-      pointer.style.position        = 'absolute';
-      pointer.style.visibility      = 'hidden';
-      pointer.style.zIndex          = 50;
-      pointer.style.opacity         = config.pointerOpacity;
-      pointer.style.backgroundColor = config.pointerColor;
-
-      body.appendChild( pointer );
-
-  // Leap's loop
-  controller.on( 'frame', function ( frame ) {
-    // Timing code to rate limit gesture execution
-    now = new Date().getTime();
-
-    // Pointer: 1 to 2 fingers. Strictly one finger works but may cause innaccuracies.
-    // The innaccuracies were observed on a development model and may not be an issue with consumer models.
-    if( frame.fingers.length > 0 && frame.fingers.length < 3 ) {
-      // Invert direction and multiply by 3 for greater effect.
-      size = -3 * frame.fingers[0].tipPosition[2];
-
-      if( size < config.pointerSize ) {
-        size = config.pointerSize;
-      }
-
-      pointer.style.width        = size     + 'px';
-      pointer.style.height       = size     + 'px';
-      pointer.style.borderRadius = size - 5 + 'px';
-      pointer.style.visibility   = 'visible';
-
-      if( config.autoCenter ) {
-        tipPosition = frame.fingers[0].tipPosition;
-
-        // Check whether the finger has entered the z range of the Leap Motion. Used for the autoCenter option.
-        if( !entered ) {
-          entered         = true;
-          enteredPosition = frame.fingers[0].tipPosition;
-        }
-
-        pointer.style.top =
-          (-1 * (( tipPosition[1] - enteredPosition[1] ) * body.offsetHeight / config.pointerTolerance )) +
-            ( body.offsetHeight / 2 ) + 'px';
-
-        pointer.style.left =
-          (( tipPosition[0] - enteredPosition[0] ) * body.offsetWidth / config.pointerTolerance ) +
-            ( body.offsetWidth / 2 ) + 'px';
-      }
-      else {
-        pointer.style.top  = ( 1 - (( tipPosition[1] - 50) / config.pointerTolerance )) *
-          body.offsetHeight + 'px';
-
-        pointer.style.left = ( tipPosition[0] * body.offsetWidth / config.pointerTolerance ) +
-          ( body.offsetWidth / 2 ) + 'px';
-      }
-    }
-    else {
-      // Hide pointer on exit
-      entered                  = false;
-      pointer.style.visibility = 'hidden';
-    }
-
-    // Gestures
-    if( frame.gestures.length > 0 && (now - lastGesture) > config.gestureDelay ) {
-      var gesture = frame.gestures[0];
-
-      // One hand gestures
-      if( frame.hands.length === 1 ) {
-        // Swipe gestures. 3+ fingers.
-        if( frame.fingers.length > 2 && gesture.type === 'swipe' ) {
-          // Define here since some gestures will throw undefined for these.
-          var x = gesture.direction[0],
-              y = gesture.direction[1];
-
-          // Left/right swipe gestures
-          if( Math.abs( x ) > Math.abs( y )) {
-            if( x > 0 ) {
-              config.naturalSwipe ? Reveal.left() : Reveal.right();
-            }
-            else {
-              config.naturalSwipe ? Reveal.right() : Reveal.left();
-            }
-          }
-          // Up/down swipe gestures
-          else {
-            if( y > 0 ) {
-              config.naturalSwipe ? Reveal.down() : Reveal.up();
-            }
-            else {
-              config.naturalSwipe ? Reveal.up() : Reveal.down();
-            }
-          }
-
-          lastGesture = now;
-        }
-      }
-      // Two hand gestures
-      else if( frame.hands.length === 2 ) {
-        // Upward two hand swipe gesture
-        if( gesture.direction[1] > 0 && gesture.type === 'swipe' ) {
-          Reveal.toggleOverview();
-        }
-
-        lastGesture = now;
-      }
-    }
-  });
-
-  controller.connect();
-})();
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/markdown/markdown.js b/docs/slides/ETH14/_support/reveal.js/plugin/markdown/markdown.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/markdown/markdown.js
+++ /dev/null
@@ -1,392 +0,0 @@
-/**
- * The reveal.js markdown plugin. Handles parsing of
- * markdown inside of presentations as well as loading
- * of external markdown documents.
- */
-(function( root, factory ) {
-	if( typeof exports === 'object' ) {
-		module.exports = factory( require( './marked' ) );
-	}
-	else {
-		// Browser globals (root is window)
-		root.RevealMarkdown = factory( root.marked );
-		root.RevealMarkdown.initialize();
-	}
-}( this, function( marked ) {
-
-	if( typeof marked === 'undefined' ) {
-		throw 'The reveal.js Markdown plugin requires marked to be loaded';
-	}
-
-	if( typeof hljs !== 'undefined' ) {
-		marked.setOptions({
-			highlight: function( lang, code ) {
-				return hljs.highlightAuto( lang, code ).value;
-			}
-		});
-	}
-
-	var DEFAULT_SLIDE_SEPARATOR = '^\n---\n$',
-		DEFAULT_NOTES_SEPARATOR = 'note:',
-		DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
-		DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
-
-
-	/**
-	 * Retrieves the markdown contents of a slide section
-	 * element. Normalizes leading tabs/whitespace.
-	 */
-	function getMarkdownFromSlide( section ) {
-
-		var template = section.querySelector( 'script' );
-
-		// strip leading whitespace so it isn't evaluated as code
-		var text = ( template || section ).textContent;
-
-		var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
-			leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
-
-		if( leadingTabs > 0 ) {
-			text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
-		}
-		else if( leadingWs > 1 ) {
-			text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' );
-		}
-
-		return text;
-
-	}
-
-	/**
-	 * Given a markdown slide section element, this will
-	 * return all arguments that aren't related to markdown
-	 * parsing. Used to forward any other user-defined arguments
-	 * to the output markdown slide.
-	 */
-	function getForwardedAttributes( section ) {
-
-		var attributes = section.attributes;
-		var result = [];
-
-		for( var i = 0, len = attributes.length; i < len; i++ ) {
-			var name = attributes[i].name,
-				value = attributes[i].value;
-
-			// disregard attributes that are used for markdown loading/parsing
-			if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
-
-			if( value ) {
-				result.push( name + '=' + value );
-			}
-			else {
-				result.push( name );
-			}
-		}
-
-		return result.join( ' ' );
-
-	}
-
-	/**
-	 * Inspects the given options and fills out default
-	 * values for what's not defined.
-	 */
-	function getSlidifyOptions( options ) {
-
-		options = options || {};
-		options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
-		options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
-		options.attributes = options.attributes || '';
-
-		return options;
-
-	}
-
-	/**
-	 * Helper function for constructing a markdown slide.
-	 */
-	function createMarkdownSlide( content, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
-
-		if( notesMatch.length === 2 ) {
-			content = notesMatch[0] + '<aside class="notes" data-markdown>' + notesMatch[1].trim() + '</aside>';
-		}
-
-		return '<script type="text/template">' + content + '</script>';
-
-	}
-
-	/**
-	 * Parses a data string into multiple slides based
-	 * on the passed in separator arguments.
-	 */
-	function slidify( markdown, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
-			horizontalSeparatorRegex = new RegExp( options.separator );
-
-		var matches,
-			lastIndex = 0,
-			isHorizontal,
-			wasHorizontal = true,
-			content,
-			sectionStack = [];
-
-		// iterate until all blocks between separators are stacked up
-		while( matches = separatorRegex.exec( markdown ) ) {
-			notes = null;
-
-			// determine direction (horizontal by default)
-			isHorizontal = horizontalSeparatorRegex.test( matches[0] );
-
-			if( !isHorizontal && wasHorizontal ) {
-				// create vertical stack
-				sectionStack.push( [] );
-			}
-
-			// pluck slide content from markdown input
-			content = markdown.substring( lastIndex, matches.index );
-
-			if( isHorizontal && wasHorizontal ) {
-				// add to horizontal stack
-				sectionStack.push( content );
-			}
-			else {
-				// add to vertical stack
-				sectionStack[sectionStack.length-1].push( content );
-			}
-
-			lastIndex = separatorRegex.lastIndex;
-			wasHorizontal = isHorizontal;
-		}
-
-		// add the remaining slide
-		( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
-
-		var markdownSections = '';
-
-		// flatten the hierarchical stack, and insert <section data-markdown> tags
-		for( var i = 0, len = sectionStack.length; i < len; i++ ) {
-			// vertical
-			if( sectionStack[i] instanceof Array ) {
-				markdownSections += '<section '+ options.attributes +'>';
-
-				sectionStack[i].forEach( function( child ) {
-					markdownSections += '<section data-markdown>' +  createMarkdownSlide( child, options ) + '</section>';
-				} );
-
-				markdownSections += '</section>';
-			}
-			else {
-				markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
-			}
-		}
-
-		return markdownSections;
-
-	}
-
-	/**
-	 * Parses any current data-markdown slides, splits
-	 * multi-slide markdown into separate sections and
-	 * handles loading of external markdown.
-	 */
-	function processSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]'),
-			section;
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			section = sections[i];
-
-			if( section.getAttribute( 'data-markdown' ).length ) {
-
-				var xhr = new XMLHttpRequest(),
-					url = section.getAttribute( 'data-markdown' );
-
-				datacharset = section.getAttribute( 'data-charset' );
-
-				// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
-				if( datacharset != null && datacharset != '' ) {
-					xhr.overrideMimeType( 'text/html; charset=' + datacharset );
-				}
-
-				xhr.onreadystatechange = function() {
-					if( xhr.readyState === 4 ) {
-						if ( xhr.status >= 200 && xhr.status < 300 ) {
-
-							section.outerHTML = slidify( xhr.responseText, {
-								separator: section.getAttribute( 'data-separator' ),
-								verticalSeparator: section.getAttribute( 'data-vertical' ),
-								notesSeparator: section.getAttribute( 'data-notes' ),
-								attributes: getForwardedAttributes( section )
-							});
-
-						}
-						else {
-
-							section.outerHTML = '<section data-state="alert">' +
-								'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
-								'Check your browser\'s JavaScript console for more details.' +
-								'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
-								'</section>';
-
-						}
-					}
-				};
-
-				xhr.open( 'GET', url, false );
-
-				try {
-					xhr.send();
-				}
-				catch ( e ) {
-					alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
-				}
-
-			}
-			else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-vertical' ) || section.getAttribute( 'data-notes' ) ) {
-
-				section.outerHTML = slidify( getMarkdownFromSlide( section ), {
-					separator: section.getAttribute( 'data-separator' ),
-					verticalSeparator: section.getAttribute( 'data-vertical' ),
-					notesSeparator: section.getAttribute( 'data-notes' ),
-					attributes: getForwardedAttributes( section )
-				});
-
-			}
-			else {
-				section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
-			}
-		}
-
-	}
-
-	/**
-	 * Check if a node value has the attributes pattern.
-	 * If yes, extract it and add that value as one or several attributes
-	 * the the terget element.
-	 *
-	 * You need Cache Killer on Chrome to see the effect on any FOM transformation
-	 * directly on refresh (F5)
-	 * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
-	 */
-	function addAttributeInElement( node, elementTarget, separator ) {
-
-		var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
-		var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' );
-		var nodeValue = node.nodeValue;
-		if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
-
-			var classes = matches[1];
-			nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
-			node.nodeValue = nodeValue;
-			while( matchesClass = mardownClassRegex.exec( classes ) ) {
-				elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Add attributes to the parent element of a text node,
-	 * or the element of an attribute node.
-	 */
-	function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
-
-		if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
-			previousParentElement = element;
-			for( var i = 0; i < element.childNodes.length; i++ ) {
-				childElement = element.childNodes[i];
-				if ( i > 0 ) {
-					j = i - 1;
-					while ( j >= 0 ) {
-						aPreviousChildElement = element.childNodes[j];
-						if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
-							previousParentElement = aPreviousChildElement;
-							break;
-						}
-						j = j - 1;
-					}
-				}
-				parentSection = section;
-				if( childElement.nodeName ==  "section" ) {
-					parentSection = childElement ;
-					previousParentElement = childElement ;
-				}
-				if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
-					addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
-				}
-			}
-		}
-
-		if ( element.nodeType == Node.COMMENT_NODE ) {
-			if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
-				addAttributeInElement( element, section, separatorSectionAttributes );
-			}
-		}
-	}
-
-	/**
-	 * Converts any current data-markdown slides in the
-	 * DOM to HTML.
-	 */
-	function convertSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]');
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			var section = sections[i];
-
-			// Only parse the same slide once
-			if( !section.getAttribute( 'data-markdown-parsed' ) ) {
-
-				section.setAttribute( 'data-markdown-parsed', true )
-
-				var notes = section.querySelector( 'aside.notes' );
-				var markdown = getMarkdownFromSlide( section );
-
-				section.innerHTML = marked( markdown );
-				addAttributes( 	section, section, null, section.getAttribute( 'data-element-attributes' ) ||
-								section.parentNode.getAttribute( 'data-element-attributes' ) ||
-								DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
-								section.getAttribute( 'data-attributes' ) ||
-								section.parentNode.getAttribute( 'data-attributes' ) ||
-								DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
-
-				// If there were notes, we need to re-add them after
-				// having overwritten the section's HTML
-				if( notes ) {
-					section.appendChild( notes );
-				}
-
-			}
-
-		}
-
-	}
-
-	// API
-	return {
-
-		initialize: function() {
-			processSlides();
-			convertSlides();
-		},
-
-		// TODO: Do these belong in the API?
-		processSlides: processSlides,
-		convertSlides: convertSlides,
-		slidify: slidify
-
-	};
-
-}));
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/markdown/marked.js b/docs/slides/ETH14/_support/reveal.js/plugin/markdown/marked.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/markdown/marked.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
- */
-
-(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
-text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";block.html=replace(block.html)("comment",/\x3c!--[\s\S]*?--\x3e/)("closed",
-/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1",
-"\\2")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm)if(this.options.tables)this.rules=block.tables;else this.rules=block.gfm}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};
-Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1)this.tokens.push({type:"space"})}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,
-"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,
-"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]="center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].split(/ *\| */);this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=
-src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);
-bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+
-1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item[item.length-1]==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script",text:cap[0]});continue}if(top&&
-(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]=
-"center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */);this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1][cap[1].length-1]==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",
-text:cap[0]});continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^\x3c!--[\s\S]*?--\x3e|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
-code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([^\s]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
-em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;
-if(!this.links)throw new Error("Tokens array requires a `links` property.");if(this.options.gfm)if(this.options.breaks)this.rules=inline.breaks;else this.rules=inline.gfm;else if(this.options.pedantic)this.rules=inline.pedantic}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);
-out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1][6]===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.url.exec(src)){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.tag.exec(src)){src=src.substring(cap[0].length);
-out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);out+=this.outputLink(cap,{href:cap[2],title:cap[3]});continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0][0];src=cap[0].substring(1)+src;continue}out+=this.outputLink(cap,link);continue}if(cap=this.rules.strong.exec(src)){src=
-src.substring(cap[0].length);out+="<strong>"+this.output(cap[2]||cap[1])+"</strong>";continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+="<em>"+this.output(cap[2]||cap[1])+"</em>";continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+="<code>"+escape(cap[2],true)+"</code>";continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+="<br>";continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+="<del>"+
-this.output(cap[1])+"</del>";continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(cap[0]);continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return out};InlineLexer.prototype.outputLink=function(cap,link){if(cap[0][0]!=="!")return'<a href="'+escape(link.href)+'"'+(link.title?' title="'+escape(link.title)+'"':"")+">"+this.output(cap[1])+"</a>";else return'<img src="'+escape(link.href)+'" alt="'+escape(cap[1])+'"'+(link.title?' title="'+
-escape(link.title)+'"':"")+">"};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,"\u2014").replace(/'([^']*)'/g,"\u2018$1\u2019").replace(/"([^"]*)"/g,"\u201c$1\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>0.5)ch="x"+ch.toString(16);out+="&#"+ch+";"}return out};function Parser(options){this.tokens=[];this.token=null;
-this.options=options||marked.defaults}Parser.parse=function(src,options){var parser=new Parser(options);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options);this.tokens=src.reverse();var out="";while(this.next())out+=this.tok();return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;
-while(this.peek().type==="text")body+="\n"+this.next().text;return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case "space":return"";case "hr":return"<hr>\n";case "heading":return"<h"+this.token.depth+">"+this.inline.output(this.token.text)+"</h"+this.token.depth+">\n";case "code":if(this.options.highlight){var code=this.options.highlight(this.token.text,this.token.lang);if(code!=null&&code!==this.token.text){this.token.escaped=true;this.token.text=code}}if(!this.token.escaped)this.token.text=
-escape(this.token.text,true);return"<pre><code"+(this.token.lang?' class="'+this.options.langPrefix+this.token.lang+'"':"")+">"+this.token.text+"</code></pre>\n";case "table":var body="",heading,i,row,cell,j;body+="<thead>\n<tr>\n";for(i=0;i<this.token.header.length;i++){heading=this.inline.output(this.token.header[i]);body+=this.token.align[i]?'<th align="'+this.token.align[i]+'">'+heading+"</th>\n":"<th>"+heading+"</th>\n"}body+="</tr>\n</thead>\n";body+="<tbody>\n";for(i=0;i<this.token.cells.length;i++){row=
-this.token.cells[i];body+="<tr>\n";for(j=0;j<row.length;j++){cell=this.inline.output(row[j]);body+=this.token.align[j]?'<td align="'+this.token.align[j]+'">'+cell+"</td>\n":"<td>"+cell+"</td>\n"}body+="</tr>\n"}body+="</tbody>\n";return"<table>\n"+body+"</table>\n";case "blockquote_start":var body="";while(this.next().type!=="blockquote_end")body+=this.tok();return"<blockquote>\n"+body+"</blockquote>\n";case "list_start":var type=this.token.ordered?"ol":"ul",body="";while(this.next().type!=="list_end")body+=
-this.tok();return"<"+type+">\n"+body+"</"+type+">\n";case "list_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.token.type==="text"?this.parseText():this.tok();return"<li>"+body+"</li>\n";case "loose_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.tok();return"<li>"+body+"</li>\n";case "html":return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;case "paragraph":return"<p>"+this.inline.output(this.token.text)+
-"</p>\n";case "text":return"<p>"+this.parseText()+"</p>\n"}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=
-1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target)if(Object.prototype.hasOwnProperty.call(target,key))obj[key]=target[key]}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}if(opt)opt=merge({},marked.defaults,opt);var tokens=Lexer.lex(tokens,opt),highlight=opt.highlight,pending=0,l=tokens.length,i=0;if(!highlight||highlight.length<3)return callback(null,Parser.parse(tokens,opt));var done=function(){delete opt.highlight;
-var out=Parser.parse(tokens,opt);opt.highlight=highlight;return callback(null,out)};for(;i<l;i++)(function(token){if(token.type!=="code")return;pending++;return highlight(token.text,token.lang,function(err,code){if(code==null||code===token.text)return--pending||done();token.text=code;token.escaped=true;--pending||done()})})(tokens[i]);return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";
-if((opt||marked.defaults).silent)return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>";throw e;}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:""};marked.Parser=Parser;marked.parser=Parser.parse;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;
-marked.parse=marked;if(typeof exports==="object")module.exports=marked;else if(typeof define==="function"&&define.amd)define(function(){return marked});else this.marked=marked}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/math/math.js b/docs/slides/ETH14/_support/reveal.js/plugin/math/math.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/math/math.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * A plugin which enables rendering of math equations inside
- * of reveal.js slides. Essentially a thin wrapper for MathJax.
- *
- * @author Hakim El Hattab
- */
-var RevealMath = window.RevealMath || (function(){
-
-	var options = Reveal.getConfig().math || {};
-	options.mathjax = options.mathjax || 'http://cdn.mathjax.org/mathjax/latest/MathJax.js';
-	options.config = options.config || 'TeX-AMS_HTML-full';
-
-	loadScript( options.mathjax + '?config=' + options.config, function() {
-
-		MathJax.Hub.Config({
-			messageStyle: 'none',
-			tex2jax: { inlineMath: [['$','$'],['\\(','\\)']] },
-			skipStartupTypeset: true
-		});
-
-		// Typeset followed by an immediate reveal.js layout since
-		// the typesetting process could affect slide height
-		MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] );
-		MathJax.Hub.Queue( Reveal.layout );
-
-		// Reprocess equations in slides when they turn visible
-		Reveal.addEventListener( 'slidechanged', function( event ) {
-
-			MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] );
-
-		} );
-
-	} );
-
-	function loadScript( url, callback ) {
-
-		var head = document.querySelector( 'head' );
-		var script = document.createElement( 'script' );
-		script.type = 'text/javascript';
-		script.src = url;
-
-		// Wrapper for callback to make sure it only fires once
-		var finish = function() {
-			if( typeof callback === 'function' ) {
-				callback.call();
-				callback = null;
-			}
-		}
-
-		script.onload = finish;
-
-		// IE
-		script.onreadystatechange = function() {
-			if ( this.readyState === 'loaded' ) {
-				finish();
-			}
-		}
-
-		// Normal browsers
-		head.appendChild( script );
-
-	}
-
-})();
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/client.js b/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/client.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/client.js
+++ /dev/null
@@ -1,13 +0,0 @@
-(function() {
-	var multiplex = Reveal.getConfig().multiplex;
-	var socketId = multiplex.id;
-	var socket = io.connect(multiplex.url);
-
-	socket.on(multiplex.id, function(data) {
-		// ignore data from sockets that aren't ours
-		if (data.socketId !== socketId) { return; }
-		if( window.location.host === 'localhost:1947' ) return;
-
-		Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote');
-	});
-}());
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/index.js b/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/index.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var express		= require('express');
-var fs			= require('fs');
-var io			= require('socket.io');
-var crypto		= require('crypto');
-
-var app			= express.createServer();
-var staticDir	= express.static;
-
-io				= io.listen(app);
-
-var opts = {
-	port: 1948,
-	baseDir : __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		if (typeof slideData.secret == 'undefined' || slideData.secret == null || slideData.secret === '') return;
-		if (createHash(slideData.secret) === slideData.socketId) {
-			slideData.secret = null;
-			socket.broadcast.emit(slideData.socketId, slideData);
-		};
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/token", function(req,res) {
-	var ts = new Date().getTime();
-	var rand = Math.floor(Math.random()*9999999);
-	var secret = ts.toString() + rand.toString();
-	res.send({secret: secret, socketId: createHash(secret)});
-});
-
-var createHash = function(secret) {
-	var cipher = crypto.createCipher('blowfish', secret);
-	return(cipher.final('hex'));
-};
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset );
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/master.js b/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/master.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/multiplex/master.js
+++ /dev/null
@@ -1,51 +0,0 @@
-(function() {
-	// Don't emit events from inside of notes windows
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var multiplex = Reveal.getConfig().multiplex;
-
-	var socket = io.connect(multiplex.url);
-
-	var notify = function( slideElement, indexh, indexv, origin ) {
-		if( typeof origin === 'undefined' && origin !== 'remote' ) {
-			var nextindexh;
-			var nextindexv;
-
-			var fragmentindex = Reveal.getIndices().f;
-			if (typeof fragmentindex == 'undefined') {
-				fragmentindex = 0;
-			}
-
-			if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-				nextindexh = indexh;
-				nextindexv = indexv + 1;
-			} else {
-				nextindexh = indexh + 1;
-				nextindexv = 0;
-			}
-
-			var slideData = {
-				indexh : indexh,
-				indexv : indexv,
-				indexf : fragmentindex,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				secret: multiplex.secret,
-				socketId : multiplex.id
-			};
-
-			socket.emit('slidechanged', slideData);
-		}
-	}
-
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		notify( event.currentSlide, event.indexh, event.indexv, event.origin );
-	} );
-
-	var fragmentNotify = function( event ) {
-		notify( Reveal.getCurrentSlide(), Reveal.getIndices().h, Reveal.getIndices().v, event.origin );
-	};
-
-	Reveal.addEventListener( 'fragmentshown', fragmentNotify );
-	Reveal.addEventListener( 'fragmenthidden', fragmentNotify );
-}());
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/notes-server/client.js b/docs/slides/ETH14/_support/reveal.js/plugin/notes-server/client.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/notes-server/client.js
+++ /dev/null
@@ -1,57 +0,0 @@
-(function() {
-	// don't emit events from inside the previews themselves
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var socket = io.connect(window.location.origin);
-	var socketId = Math.random().toString().slice(2);
-	
-	console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
-	window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);
-
-	// Fires when a fragment is shown
-	Reveal.addEventListener( 'fragmentshown', function( event ) {
-		var fragmentData = {
-			fragment : 'next',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when a fragment is hidden
-	Reveal.addEventListener( 'fragmenthidden', function( event ) {
-		var fragmentData = {
-			fragment : 'previous',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when slide is changed
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		var nextindexh;
-		var nextindexv;
-		var slideElement = event.currentSlide;
-
-		if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-			nextindexh = event.indexh;
-			nextindexv = event.indexv + 1;
-		} else {
-			nextindexh = event.indexh + 1;
-			nextindexv = 0;
-		}
-
-		var notes = slideElement.querySelector('aside.notes');
-		var slideData = {
-			notes : notes ? notes.innerHTML : '',
-			indexh : event.indexh,
-			indexv : event.indexv,
-			nextindexh : nextindexh,
-			nextindexv : nextindexv,
-			socketId : socketId,
-			markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false
-
-		};
-
-		socket.emit('slidechanged', slideData);
-	} );
-}());
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/notes-server/index.js b/docs/slides/ETH14/_support/reveal.js/plugin/notes-server/index.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/notes-server/index.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var express   = require('express');
-var fs        = require('fs');
-var io        = require('socket.io');
-var _         = require('underscore');
-var Mustache  = require('mustache');
-
-var app       = express.createServer();
-var staticDir = express.static;
-
-io            = io.listen(app);
-
-var opts = {
-	port :      1947,
-	baseDir :   __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		socket.broadcast.emit('slidedata', slideData);
-	});
-	socket.on('fragmentchanged', function(fragmentData) {
-		socket.broadcast.emit('fragmentdata', fragmentData);
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/notes/:socketId", function(req, res) {
-
-	fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
-		res.send(Mustache.to_html(data.toString(), {
-			socketId : req.params.socketId
-		}));
-	});
-	// fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
-});
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
-
-console.log( brown + "reveal.js - Speaker Notes" + reset );
-console.log( "1. Open the slides at " + green + slidesLocation + reset );
-console.log( "2. Click on the link your JS console to go to the notes page" );
-console.log( "3. Advance through your slides and your notes will advance automatically" );
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/notes/notes.js b/docs/slides/ETH14/_support/reveal.js/plugin/notes/notes.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/notes/notes.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Handles opening of and synchronization with the reveal.js
- * notes window.
- */
-var RevealNotes = (function() {
-
-	function openNotes() {
-		var jsFileLocation = document.querySelector('script[src$="notes.js"]').src;  // this js file path
-		jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, '');   // the js folder path
-		var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
-
-		// Fires when slide is changed
-		Reveal.addEventListener( 'slidechanged', post );
-
-		// Fires when a fragment is shown
-		Reveal.addEventListener( 'fragmentshown', post );
-
-		// Fires when a fragment is hidden
-		Reveal.addEventListener( 'fragmenthidden', post );
-
-		/**
-		 * Posts the current slide data to the notes window
-		 */
-		function post() {
-			var slideElement = Reveal.getCurrentSlide(),
-				slideIndices = Reveal.getIndices(),
-				messageData;
-
-			var notes = slideElement.querySelector( 'aside.notes' ),
-				nextindexh,
-				nextindexv;
-
-			if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
-				nextindexh = slideIndices.h;
-				nextindexv = slideIndices.v + 1;
-			} else {
-				nextindexh = slideIndices.h + 1;
-				nextindexv = 0;
-			}
-
-			messageData = {
-				notes : notes ? notes.innerHTML : '',
-				indexh : slideIndices.h,
-				indexv : slideIndices.v,
-				indexf : slideIndices.f,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
-			};
-
-			notesPopup.postMessage( JSON.stringify( messageData ), '*' );
-		}
-
-		// Navigate to the current slide when the notes are loaded
-		notesPopup.addEventListener( 'load', function( event ) {
-			post();
-		}, false );
-	}
-
-	// If the there's a 'notes' query set, open directly
-	if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
-		openNotes();
-	}
-
-	// Open the notes when the 's' key is hit
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openNotes();
-		}
-	}, false );
-
-	return { open: openNotes };
-})();
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/postmessage/postmessage.js b/docs/slides/ETH14/_support/reveal.js/plugin/postmessage/postmessage.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/postmessage/postmessage.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-
-	simple postmessage plugin
-
-	Useful when a reveal slideshow is inside an iframe.
-	It allows to call reveal methods from outside.
-
-	Example:
-		 var reveal =  window.frames[0];
-
-		 // Reveal.prev(); 
-		 reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
-		 // Reveal.next(); 
-		 reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
-		 // Reveal.slide(2, 2); 
-		 reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
-
-	Add to the slideshow:
-
-		dependencies: [
-			...
-			{ src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
-		]
-
-*/
-
-(function (){
-
-	window.addEventListener( "message", function ( event ) {
-		var data = JSON.parse( event.data ),
-				method = data.method,
-				args = data.args;
-
-		if( typeof Reveal[method] === 'function' ) {
-			Reveal[method].apply( Reveal, data.args );
-		}
-	}, false);
-
-}());
-
-
-
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/print-pdf/print-pdf.js b/docs/slides/ETH14/_support/reveal.js/plugin/print-pdf/print-pdf.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/print-pdf/print-pdf.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * phantomjs script for printing presentations to PDF.
- *
- * Example:
- * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
- *
- * By Manuel Bieh (https://github.com/manuelbieh)
- */
-
-// html2pdf.js
-var page = new WebPage();
-var system = require( 'system' );
-
-page.viewportSize  = {
-	width: 1024,
-	height: 768
-};
-
-page.paperSize = {
-	format: 'letter',
-	orientation: 'landscape',
-	margin: {
-		left: '0',
-		right: '0',
-		top: '0',
-		bottom: '0'
-	}
-};
-
-var revealFile = system.args[1] || 'index.html?print-pdf';
-var slideFile = system.args[2] || 'slides.pdf';
-
-if( slideFile.match( /\.pdf$/gi ) === null ) {
-	slideFile += '.pdf';
-}
-
-console.log( 'Printing PDF...' );
-
-page.open( revealFile, function( status ) {
-	console.log( 'Printed succesfully' );
-	page.render( slideFile );
-	phantom.exit();
-} );
-
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/remotes/remotes.js b/docs/slides/ETH14/_support/reveal.js/plugin/remotes/remotes.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/remotes/remotes.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Touch-based remote controller for your presentation courtesy 
- * of the folks at http://remotes.io
- */
-
-(function(window){
-
-    /**
-     * Detects if we are dealing with a touch enabled device (with some false positives)
-     * Borrowed from modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touch.js   
-     */
-    var hasTouch  = (function(){
-        return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
-    })();
-
-    /**
-     * Detects if notes are enable and the current page is opened inside an /iframe
-     * this prevents loading Remotes.io several times
-     */
-    var isNotesAndIframe = (function(){
-        return window.RevealNotes && !(self == top);
-    })();
-
-    if(!hasTouch && !isNotesAndIframe){
-        head.ready( 'remotes.ne.min.js', function() {
-            new Remotes("preview")
-                .on("swipe-left", function(e){ Reveal.right(); })
-                .on("swipe-right", function(e){ Reveal.left(); })
-                .on("swipe-up", function(e){ Reveal.down(); })
-                .on("swipe-down", function(e){ Reveal.up(); })
-                .on("tap", function(e){ Reveal.next(); })
-                .on("zoom-out", function(e){ Reveal.toggleOverview(true); })
-                .on("zoom-in", function(e){ Reveal.toggleOverview(false); })
-            ;
-        } );
-
-        head.js('https://hakim-static.s3.amazonaws.com/reveal-js/remotes.ne.min.js');
-    }
-})(window);
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/search/search.js b/docs/slides/ETH14/_support/reveal.js/plugin/search/search.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/search/search.js
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
- * by navigatating to that slide and highlighting it.
- *
- * By Jon Snyder <snyder.jon@gmail.com>, February 2013
- */
-
-var RevealSearch = (function() {
-
-	var matchedSlides;
-	var currentMatchedIndex;
-	var searchboxDirty;
-	var myHilitor;
-
-// Original JavaScript code by Chirp Internet: www.chirp.com.au
-// Please acknowledge use of this code by including this header.
-// 2/2013 jon: modified regex to display any match, not restricted to word boundaries.
-
-function Hilitor(id, tag)
-{
-
-  var targetNode = document.getElementById(id) || document.body;
-  var hiliteTag = tag || "EM";
-  var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM|SPAN)$");
-  var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"];
-  var wordColor = [];
-  var colorIdx = 0;
-  var matchRegex = "";
-  var matchingSlides = [];
-
-  this.setRegex = function(input)
-  {
-    input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|");
-    matchRegex = new RegExp("(" + input + ")","i");
-  }
-
-  this.getRegex = function()
-  {
-    return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " ");
-  }
-
-  // recursively apply word highlighting
-  this.hiliteWords = function(node)
-  {
-    if(node == undefined || !node) return;
-    if(!matchRegex) return;
-    if(skipTags.test(node.nodeName)) return;
-
-    if(node.hasChildNodes()) {
-      for(var i=0; i < node.childNodes.length; i++)
-        this.hiliteWords(node.childNodes[i]);
-    }
-    if(node.nodeType == 3) { // NODE_TEXT
-      if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) {
-      	//find the slide's section element and save it in our list of matching slides
-      	var secnode = node.parentNode;
-      	while (secnode.nodeName != 'SECTION') {
-      		secnode = secnode.parentNode;
-      	}
-      	
-      	var slideIndex = Reveal.getIndices(secnode);
-      	var slidelen = matchingSlides.length;
-      	var alreadyAdded = false;
-      	for (var i=0; i < slidelen; i++) {
-      		if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) {
-      			alreadyAdded = true;
-      		}
-      	}
-      	if (! alreadyAdded) {
-      		matchingSlides.push(slideIndex);
-      	}
-      	
-        if(!wordColor[regs[0].toLowerCase()]) {
-          wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
-        }
-
-        var match = document.createElement(hiliteTag);
-        match.appendChild(document.createTextNode(regs[0]));
-        match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
-        match.style.fontStyle = "inherit";
-        match.style.color = "#000";
-
-        var after = node.splitText(regs.index);
-        after.nodeValue = after.nodeValue.substring(regs[0].length);
-        node.parentNode.insertBefore(match, after);
-      }
-    }
-  };
-
-  // remove highlighting
-  this.remove = function()
-  {
-    var arr = document.getElementsByTagName(hiliteTag);
-    while(arr.length && (el = arr[0])) {
-      el.parentNode.replaceChild(el.firstChild, el);
-    }
-  };
-
-  // start highlighting at target node
-  this.apply = function(input)
-  {
-    if(input == undefined || !input) return;
-    this.remove();
-    this.setRegex(input);
-    this.hiliteWords(targetNode);
-    return matchingSlides;
-  };
-
-}
-
-	function openSearch() {
-		//ensure the search term input dialog is visible and has focus:
-		var inputbox = document.getElementById("searchinput");
-		inputbox.style.display = "inline";
-		inputbox.focus();
-		inputbox.select();
-	}
-
-	function toggleSearch() {
-		var inputbox = document.getElementById("searchinput");
-		if (inputbox.style.display !== "inline") {
-			openSearch();
-		}
-		else {
-			inputbox.style.display = "none";
-			myHilitor.remove();
-		}
-	}
-
-	function doSearch() {
-		//if there's been a change in the search term, perform a new search:
-		if (searchboxDirty) {
-			var searchstring = document.getElementById("searchinput").value;
-
-			//find the keyword amongst the slides
-			myHilitor = new Hilitor("slidecontent");
-			matchedSlides = myHilitor.apply(searchstring);
-			currentMatchedIndex = 0;
-		}
-
-		//navigate to the next slide that has the keyword, wrapping to the first if necessary
-		if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) {
-			currentMatchedIndex = 0;
-		}
-		if (matchedSlides.length > currentMatchedIndex) {
-			Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v);
-			currentMatchedIndex++;
-		}
-	}
-
-	var dom = {};
-	dom.wrapper = document.querySelector( '.reveal' );
-
-	if( !dom.wrapper.querySelector( '.searchbox' ) ) {
-			var searchElement = document.createElement( 'div' );
-			searchElement.id = "searchinputdiv";
-			searchElement.classList.add( 'searchdiv' );
-      searchElement.style.position = 'absolute';
-      searchElement.style.top = '10px';
-      searchElement.style.left = '10px';
-      //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/:
-			searchElement.innerHTML = '<span><input type="search" id="searchinput" class="searchinput" style="vertical-align: top;"/><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJiSURBVHjatFZNaxNBGH5md+Mmu92NVdKDRipSAyqCghgQD4L4cRe86UUtAQ+eFCxoa4/25EXBFi8eBE+eRPoDhB6KgiiixdAPCEkx2pjvTXadd9yNsflwuyUDD/O+u8PzzDPvzOwyx3EwyCZhwG3gAkp7MnpjgbopjsltcD4gjuXZZKeAR348MYLYTm3LzOs/y3j3JTfZxgXWXmTuwPHIc4VmoOmv5IrI53+AO2DdHLjkDWQ3GoEEVFXtXQOvkSnPWcyUceviLhwbDYv8/XIVj97kse7TodLvZXxYxrPUHkQ1ufXs3FEdybEIxucySOesoNvUgWU1cP3MkCBfTFdw9fGaAMVmRELq7LBw2Q3/FaAxxWIRpw+ZIr/7IouPqzUBiqmdHAv7EuhRAwf1er2Vy4x1jW3b2d5Jfvu5IPp7l2LYbcgCFFNb+FoJ7oBqEAqFMPNqFcmEgVMJDfMT+1tvN0pNjERlMS6QA5pFOKxiKVPFhakPeL3It+WGJUDxt2wFR+JhzI7v5ctkd8DXOZAkCYYxhO+lKm4+Xfqz/rIixBuNBl7eOYzkQQNzqX249mRl6zUgEcYkaJrGhUwBinVdh6IouPzwE6/DL5w4oLkH8y981aDf+uq6hlKpJESiUdNfDZi7/ehG9K6KfiA3pml0PLcsq+cSMTj2NL9ukc4UOmz7AZ3+crkC4mHujFvXNaMFB3bEr8xPS6p5O+jXxq4VZtaen7/PwzrntjcLUE0iHPS1Ud1cdiEJl/8WivZk0wXd7zWOMkeF8s0CcAmkNrC2nvXZDbbbN73ccYnZoH9bfgswAFzAe9/h3dbKAAAAAElFTkSuQmCC" id="searchbutton" class="searchicon" style="vertical-align: top; margin-top: -1px;"/></span>';
-			dom.wrapper.appendChild( searchElement );
-	}
-
-	document.getElementById("searchbutton").addEventListener( 'click', function(event) {
-		doSearch();
-	}, false );
-
-	document.getElementById("searchinput").addEventListener( 'keyup', function( event ) {
-		switch (event.keyCode) {
-			case 13:
-				event.preventDefault();
-				doSearch();
-				searchboxDirty = false;
-				break;
-			default:
-				searchboxDirty = true;
-		}
-	}, false );
-
-	// Open the search when the 's' key is hit (yes, this conflicts with the notes plugin, disabling for now)
-	/*
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openSearch();
-		}
-	}, false );
-*/
-	return { open: openSearch };
-})();
diff --git a/docs/slides/ETH14/_support/reveal.js/plugin/zoom-js/zoom.js b/docs/slides/ETH14/_support/reveal.js/plugin/zoom-js/zoom.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/plugin/zoom-js/zoom.js
+++ /dev/null
@@ -1,258 +0,0 @@
-// Custom reveal.js integration
-(function(){
-	var isEnabled = true;
-
-	document.querySelector( '.reveal' ).addEventListener( 'mousedown', function( event ) {
-		var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : 'alt' ) + 'Key';
-
-		if( event[ modifier ] && isEnabled ) {
-			event.preventDefault();
-			zoom.to({ element: event.target, pan: false });
-		}
-	} );
-
-	Reveal.addEventListener( 'overviewshown', function() { isEnabled = false; } );
-	Reveal.addEventListener( 'overviewhidden', function() { isEnabled = true; } );
-})();
-
-/*!
- * zoom.js 0.2 (modified version for use with reveal.js)
- * http://lab.hakim.se/zoom-js
- * MIT licensed
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var zoom = (function(){
-
-	// The current zoom level (scale)
-	var level = 1;
-
-	// The current mouse position, used for panning
-	var mouseX = 0,
-		mouseY = 0;
-
-	// Timeout before pan is activated
-	var panEngageTimeout = -1,
-		panUpdateInterval = -1;
-
-	var currentOptions = null;
-
-	// Check for transform support so that we can fallback otherwise
-	var supportsTransforms = 	'WebkitTransform' in document.body.style ||
-								'MozTransform' in document.body.style ||
-								'msTransform' in document.body.style ||
-								'OTransform' in document.body.style ||
-								'transform' in document.body.style;
-
-	if( supportsTransforms ) {
-		// The easing that will be applied when we zoom in/out
-		document.body.style.transition = 'transform 0.8s ease';
-		document.body.style.OTransition = '-o-transform 0.8s ease';
-		document.body.style.msTransition = '-ms-transform 0.8s ease';
-		document.body.style.MozTransition = '-moz-transform 0.8s ease';
-		document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';
-	}
-
-	// Zoom out if the user hits escape
-	document.addEventListener( 'keyup', function( event ) {
-		if( level !== 1 && event.keyCode === 27 ) {
-			zoom.out();
-		}
-	}, false );
-
-	// Monitor mouse movement for panning
-	document.addEventListener( 'mousemove', function( event ) {
-		if( level !== 1 ) {
-			mouseX = event.clientX;
-			mouseY = event.clientY;
-		}
-	}, false );
-
-	/**
-	 * Applies the CSS required to zoom in, prioritizes use of CSS3
-	 * transforms but falls back on zoom for IE.
-	 *
-	 * @param {Number} pageOffsetX
-	 * @param {Number} pageOffsetY
-	 * @param {Number} elementOffsetX
-	 * @param {Number} elementOffsetY
-	 * @param {Number} scale
-	 */
-	function magnify( pageOffsetX, pageOffsetY, elementOffsetX, elementOffsetY, scale ) {
-
-		if( supportsTransforms ) {
-			var origin = pageOffsetX +'px '+ pageOffsetY +'px',
-				transform = 'translate('+ -elementOffsetX +'px,'+ -elementOffsetY +'px) scale('+ scale +')';
-
-			document.body.style.transformOrigin = origin;
-			document.body.style.OTransformOrigin = origin;
-			document.body.style.msTransformOrigin = origin;
-			document.body.style.MozTransformOrigin = origin;
-			document.body.style.WebkitTransformOrigin = origin;
-
-			document.body.style.transform = transform;
-			document.body.style.OTransform = transform;
-			document.body.style.msTransform = transform;
-			document.body.style.MozTransform = transform;
-			document.body.style.WebkitTransform = transform;
-		}
-		else {
-			// Reset all values
-			if( scale === 1 ) {
-				document.body.style.position = '';
-				document.body.style.left = '';
-				document.body.style.top = '';
-				document.body.style.width = '';
-				document.body.style.height = '';
-				document.body.style.zoom = '';
-			}
-			// Apply scale
-			else {
-				document.body.style.position = 'relative';
-				document.body.style.left = ( - ( pageOffsetX + elementOffsetX ) / scale ) + 'px';
-				document.body.style.top = ( - ( pageOffsetY + elementOffsetY ) / scale ) + 'px';
-				document.body.style.width = ( scale * 100 ) + '%';
-				document.body.style.height = ( scale * 100 ) + '%';
-				document.body.style.zoom = scale;
-			}
-		}
-
-		level = scale;
-
-		if( level !== 1 && document.documentElement.classList ) {
-			document.documentElement.classList.add( 'zoomed' );
-		}
-		else {
-			document.documentElement.classList.remove( 'zoomed' );
-		}
-	}
-
-	/**
-	 * Pan the document when the mosue cursor approaches the edges
-	 * of the window.
-	 */
-	function pan() {
-		var range = 0.12,
-			rangeX = window.innerWidth * range,
-			rangeY = window.innerHeight * range,
-			scrollOffset = getScrollOffset();
-
-		// Up
-		if( mouseY < rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
-		}
-		// Down
-		else if( mouseY > window.innerHeight - rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
-		}
-
-		// Left
-		if( mouseX < rangeX ) {
-			window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
-		}
-		// Right
-		else if( mouseX > window.innerWidth - rangeX ) {
-			window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
-		}
-	}
-
-	function getScrollOffset() {
-		return {
-			x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
-			y: window.scrollY !== undefined ? window.scrollY : window.pageXYffset
-		}
-	}
-
-	return {
-		/**
-		 * Zooms in on either a rectangle or HTML element.
-		 *
-		 * @param {Object} options
-		 *   - element: HTML element to zoom in on
-		 *   OR
-		 *   - x/y: coordinates in non-transformed space to zoom in on
-		 *   - width/height: the portion of the screen to zoom in on
-		 *   - scale: can be used instead of width/height to explicitly set scale
-		 */
-		to: function( options ) {
-			// Due to an implementation limitation we can't zoom in
-			// to another element without zooming out first
-			if( level !== 1 ) {
-				zoom.out();
-			}
-			else {
-				options.x = options.x || 0;
-				options.y = options.y || 0;
-
-				// If an element is set, that takes precedence
-				if( !!options.element ) {
-					// Space around the zoomed in element to leave on screen
-					var padding = 20;
-
-					options.width = options.element.getBoundingClientRect().width + ( padding * 2 );
-					options.height = options.element.getBoundingClientRect().height + ( padding * 2 );
-					options.x = options.element.getBoundingClientRect().left - padding;
-					options.y = options.element.getBoundingClientRect().top - padding;
-				}
-
-				// If width/height values are set, calculate scale from those values
-				if( options.width !== undefined && options.height !== undefined ) {
-					options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
-				}
-
-				if( options.scale > 1 ) {
-					options.x *= options.scale;
-					options.y *= options.scale;
-
-					var scrollOffset = getScrollOffset();
-
-					if( options.element ) {
-						scrollOffset.x -= ( window.innerWidth - ( options.width * options.scale ) ) / 2;
-					}
-
-					magnify( scrollOffset.x, scrollOffset.y, options.x, options.y, options.scale );
-
-					if( options.pan !== false ) {
-
-						// Wait with engaging panning as it may conflict with the
-						// zoom transition
-						panEngageTimeout = setTimeout( function() {
-							panUpdateInterval = setInterval( pan, 1000 / 60 );
-						}, 800 );
-
-					}
-				}
-
-				currentOptions = options;
-			}
-		},
-
-		/**
-		 * Resets the document zoom state to its default.
-		 */
-		out: function() {
-			clearTimeout( panEngageTimeout );
-			clearInterval( panUpdateInterval );
-
-			var scrollOffset = getScrollOffset();
-
-			if( currentOptions && currentOptions.element ) {
-				scrollOffset.x -= ( window.innerWidth - ( currentOptions.width * currentOptions.scale ) ) / 2;
-			}
-
-			magnify( scrollOffset.x, scrollOffset.y, 0, 0, 1 );
-
-			level = 1;
-		},
-
-		// Alias
-		magnify: function( options ) { this.to( options ) },
-		reset: function() { this.out() },
-
-		zoomLevel: function() {
-			return level;
-		}
-	}
-
-})();
-
diff --git a/docs/slides/ETH14/_support/reveal.js/test/examples/assets/image1.png b/docs/slides/ETH14/_support/reveal.js/test/examples/assets/image1.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/_support/reveal.js/test/examples/assets/image1.png and /dev/null differ
diff --git a/docs/slides/ETH14/_support/reveal.js/test/examples/assets/image2.png b/docs/slides/ETH14/_support/reveal.js/test/examples/assets/image2.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/_support/reveal.js/test/examples/assets/image2.png and /dev/null differ
diff --git a/docs/slides/ETH14/_support/reveal.js/test/qunit-1.12.0.css b/docs/slides/ETH14/_support/reveal.js/test/qunit-1.12.0.css
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/test/qunit-1.12.0.css
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-	margin: 0;
-	padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-	padding: 0.5em 0 0.5em 1em;
-
-	color: #8699a4;
-	background-color: #0d3349;
-
-	font-size: 1.5em;
-	line-height: 1em;
-	font-weight: normal;
-
-	border-radius: 5px 5px 0 0;
-	-moz-border-radius: 5px 5px 0 0;
-	-webkit-border-top-right-radius: 5px;
-	-webkit-border-top-left-radius: 5px;
-}
-
-#qunit-header a {
-	text-decoration: none;
-	color: #c2ccd1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-	color: #fff;
-}
-
-#qunit-testrunner-toolbar label {
-	display: inline-block;
-	padding: 0 .5em 0 .1em;
-}
-
-#qunit-banner {
-	height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-	padding: 0.5em 0 0.5em 2em;
-	color: #5E740B;
-	background-color: #eee;
-	overflow: hidden;
-}
-
-#qunit-userAgent {
-	padding: 0.5em 0 0.5em 2.5em;
-	background-color: #2b81af;
-	color: #fff;
-	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
-	float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-	list-style-position: inside;
-}
-
-#qunit-tests li {
-	padding: 0.4em 0.5em 0.4em 2.5em;
-	border-bottom: 1px solid #fff;
-	list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
-	display: none;
-}
-
-#qunit-tests li strong {
-	cursor: pointer;
-}
-
-#qunit-tests li a {
-	padding: 0.5em;
-	color: #c2ccd1;
-	text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-	color: #000;
-}
-
-#qunit-tests li .runtime {
-	float: right;
-	font-size: smaller;
-}
-
-.qunit-assert-list {
-	margin-top: 0.5em;
-	padding: 0.5em;
-
-	background-color: #fff;
-
-	border-radius: 5px;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-}
-
-.qunit-collapsed {
-	display: none;
-}
-
-#qunit-tests table {
-	border-collapse: collapse;
-	margin-top: .2em;
-}
-
-#qunit-tests th {
-	text-align: right;
-	vertical-align: top;
-	padding: 0 .5em 0 0;
-}
-
-#qunit-tests td {
-	vertical-align: top;
-}
-
-#qunit-tests pre {
-	margin: 0;
-	white-space: pre-wrap;
-	word-wrap: break-word;
-}
-
-#qunit-tests del {
-	background-color: #e0f2be;
-	color: #374e0c;
-	text-decoration: none;
-}
-
-#qunit-tests ins {
-	background-color: #ffcaca;
-	color: #500;
-	text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: black; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-	padding: 5px;
-	background-color: #fff;
-	border-bottom: none;
-	list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-	color: #3c510c;
-	background-color: #fff;
-	border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-	color: #710909;
-	background-color: #fff;
-	border-left: 10px solid #EE5757;
-	white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-	border-radius: 0 0 5px 5px;
-	-moz-border-radius: 0 0 5px 5px;
-	-webkit-border-bottom-right-radius: 5px;
-	-webkit-border-bottom-left-radius: 5px;
-}
-
-#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: green;   }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
-	padding: 0.5em 0.5em 0.5em 2.5em;
-
-	color: #2b81af;
-	background-color: #D2E0E6;
-
-	border-bottom: 1px solid white;
-}
-#qunit-testresult .module-name {
-	font-weight: bold;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-	position: absolute;
-	top: -10000px;
-	left: -10000px;
-	width: 1000px;
-	height: 1000px;
-}
diff --git a/docs/slides/ETH14/_support/reveal.js/test/qunit-1.12.0.js b/docs/slides/ETH14/_support/reveal.js/test/qunit-1.12.0.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/test/qunit-1.12.0.js
+++ /dev/null
@@ -1,2212 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * https://jquery.org/license/
- */
-
-(function( window ) {
-
-var QUnit,
-	assert,
-	config,
-	onErrorFnPrev,
-	testId = 0,
-	fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
-	toString = Object.prototype.toString,
-	hasOwn = Object.prototype.hasOwnProperty,
-	// Keep a local reference to Date (GH-283)
-	Date = window.Date,
-	setTimeout = window.setTimeout,
-	defined = {
-		setTimeout: typeof window.setTimeout !== "undefined",
-		sessionStorage: (function() {
-			var x = "qunit-test-string";
-			try {
-				sessionStorage.setItem( x, x );
-				sessionStorage.removeItem( x );
-				return true;
-			} catch( e ) {
-				return false;
-			}
-		}())
-	},
-	/**
-	 * Provides a normalized error string, correcting an issue
-	 * with IE 7 (and prior) where Error.prototype.toString is
-	 * not properly implemented
-	 *
-	 * Based on http://es5.github.com/#x15.11.4.4
-	 *
-	 * @param {String|Error} error
-	 * @return {String} error message
-	 */
-	errorString = function( error ) {
-		var name, message,
-			errorString = error.toString();
-		if ( errorString.substring( 0, 7 ) === "[object" ) {
-			name = error.name ? error.name.toString() : "Error";
-			message = error.message ? error.message.toString() : "";
-			if ( name && message ) {
-				return name + ": " + message;
-			} else if ( name ) {
-				return name;
-			} else if ( message ) {
-				return message;
-			} else {
-				return "Error";
-			}
-		} else {
-			return errorString;
-		}
-	},
-	/**
-	 * Makes a clone of an object using only Array or Object as base,
-	 * and copies over the own enumerable properties.
-	 *
-	 * @param {Object} obj
-	 * @return {Object} New object with only the own properties (recursively).
-	 */
-	objectValues = function( obj ) {
-		// Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
-		/*jshint newcap: false */
-		var key, val,
-			vals = QUnit.is( "array", obj ) ? [] : {};
-		for ( key in obj ) {
-			if ( hasOwn.call( obj, key ) ) {
-				val = obj[key];
-				vals[key] = val === Object(val) ? objectValues(val) : val;
-			}
-		}
-		return vals;
-	};
-
-function Test( settings ) {
-	extend( this, settings );
-	this.assertions = [];
-	this.testNumber = ++Test.count;
-}
-
-Test.count = 0;
-
-Test.prototype = {
-	init: function() {
-		var a, b, li,
-			tests = id( "qunit-tests" );
-
-		if ( tests ) {
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml;
-
-			// `a` initialized at top of scope
-			a = document.createElement( "a" );
-			a.innerHTML = "Rerun";
-			a.href = QUnit.url({ testNumber: this.testNumber });
-
-			li = document.createElement( "li" );
-			li.appendChild( b );
-			li.appendChild( a );
-			li.className = "running";
-			li.id = this.id = "qunit-test-output" + testId++;
-
-			tests.appendChild( li );
-		}
-	},
-	setup: function() {
-		if (
-			// Emit moduleStart when we're switching from one module to another
-			this.module !== config.previousModule ||
-				// They could be equal (both undefined) but if the previousModule property doesn't
-				// yet exist it means this is the first test in a suite that isn't wrapped in a
-				// module, in which case we'll just emit a moduleStart event for 'undefined'.
-				// Without this, reporters can get testStart before moduleStart  which is a problem.
-				!hasOwn.call( config, "previousModule" )
-		) {
-			if ( hasOwn.call( config, "previousModule" ) ) {
-				runLoggingCallbacks( "moduleDone", QUnit, {
-					name: config.previousModule,
-					failed: config.moduleStats.bad,
-					passed: config.moduleStats.all - config.moduleStats.bad,
-					total: config.moduleStats.all
-				});
-			}
-			config.previousModule = this.module;
-			config.moduleStats = { all: 0, bad: 0 };
-			runLoggingCallbacks( "moduleStart", QUnit, {
-				name: this.module
-			});
-		}
-
-		config.current = this;
-
-		this.testEnvironment = extend({
-			setup: function() {},
-			teardown: function() {}
-		}, this.moduleTestEnvironment );
-
-		this.started = +new Date();
-		runLoggingCallbacks( "testStart", QUnit, {
-			name: this.testName,
-			module: this.module
-		});
-
-		/*jshint camelcase:false */
-
-
-		/**
-		 * Expose the current test environment.
-		 *
-		 * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
-		 */
-		QUnit.current_testEnvironment = this.testEnvironment;
-
-		/*jshint camelcase:true */
-
-		if ( !config.pollution ) {
-			saveGlobal();
-		}
-		if ( config.notrycatch ) {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-			return;
-		}
-		try {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-		} catch( e ) {
-			QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-		}
-	},
-	run: function() {
-		config.current = this;
-
-		var running = id( "qunit-testresult" );
-
-		if ( running ) {
-			running.innerHTML = "Running: <br/>" + this.nameHtml;
-		}
-
-		if ( this.async ) {
-			QUnit.stop();
-		}
-
-		this.callbackStarted = +new Date();
-
-		if ( config.notrycatch ) {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-			return;
-		}
-
-		try {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-		} catch( e ) {
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-
-			QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
-			// else next test will carry the responsibility
-			saveGlobal();
-
-			// Restart the tests if they're blocking
-			if ( config.blocking ) {
-				QUnit.start();
-			}
-		}
-	},
-	teardown: function() {
-		config.current = this;
-		if ( config.notrycatch ) {
-			if ( typeof this.callbackRuntime === "undefined" ) {
-				this.callbackRuntime = +new Date() - this.callbackStarted;
-			}
-			this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			return;
-		} else {
-			try {
-				this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			} catch( e ) {
-				QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-			}
-		}
-		checkPollution();
-	},
-	finish: function() {
-		config.current = this;
-		if ( config.requireExpects && this.expected === null ) {
-			QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
-		} else if ( this.expected !== null && this.expected !== this.assertions.length ) {
-			QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
-		} else if ( this.expected === null && !this.assertions.length ) {
-			QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
-		}
-
-		var i, assertion, a, b, time, li, ol,
-			test = this,
-			good = 0,
-			bad = 0,
-			tests = id( "qunit-tests" );
-
-		this.runtime = +new Date() - this.started;
-		config.stats.all += this.assertions.length;
-		config.moduleStats.all += this.assertions.length;
-
-		if ( tests ) {
-			ol = document.createElement( "ol" );
-			ol.className = "qunit-assert-list";
-
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				assertion = this.assertions[i];
-
-				li = document.createElement( "li" );
-				li.className = assertion.result ? "pass" : "fail";
-				li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
-				ol.appendChild( li );
-
-				if ( assertion.result ) {
-					good++;
-				} else {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-
-			// store result when possible
-			if ( QUnit.config.reorder && defined.sessionStorage ) {
-				if ( bad ) {
-					sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
-				} else {
-					sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
-				}
-			}
-
-			if ( bad === 0 ) {
-				addClass( ol, "qunit-collapsed" );
-			}
-
-			// `b` initialized at top of scope
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-			addEvent(b, "click", function() {
-				var next = b.parentNode.lastChild,
-					collapsed = hasClass( next, "qunit-collapsed" );
-				( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
-			});
-
-			addEvent(b, "dblclick", function( e ) {
-				var target = e && e.target ? e.target : window.event.srcElement;
-				if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
-					target = target.parentNode;
-				}
-				if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-					window.location = QUnit.url({ testNumber: test.testNumber });
-				}
-			});
-
-			// `time` initialized at top of scope
-			time = document.createElement( "span" );
-			time.className = "runtime";
-			time.innerHTML = this.runtime + " ms";
-
-			// `li` initialized at top of scope
-			li = id( this.id );
-			li.className = bad ? "fail" : "pass";
-			li.removeChild( li.firstChild );
-			a = li.firstChild;
-			li.appendChild( b );
-			li.appendChild( a );
-			li.appendChild( time );
-			li.appendChild( ol );
-
-		} else {
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				if ( !this.assertions[i].result ) {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-		}
-
-		runLoggingCallbacks( "testDone", QUnit, {
-			name: this.testName,
-			module: this.module,
-			failed: bad,
-			passed: this.assertions.length - bad,
-			total: this.assertions.length,
-			duration: this.runtime
-		});
-
-		QUnit.reset();
-
-		config.current = undefined;
-	},
-
-	queue: function() {
-		var bad,
-			test = this;
-
-		synchronize(function() {
-			test.init();
-		});
-		function run() {
-			// each of these can by async
-			synchronize(function() {
-				test.setup();
-			});
-			synchronize(function() {
-				test.run();
-			});
-			synchronize(function() {
-				test.teardown();
-			});
-			synchronize(function() {
-				test.finish();
-			});
-		}
-
-		// `bad` initialized at top of scope
-		// defer when previous test run passed, if storage is available
-		bad = QUnit.config.reorder && defined.sessionStorage &&
-						+sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
-
-		if ( bad ) {
-			run();
-		} else {
-			synchronize( run, true );
-		}
-	}
-};
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
-	// call on start of module test to prepend name to all tests
-	module: function( name, testEnvironment ) {
-		config.currentModule = name;
-		config.currentModuleTestEnvironment = testEnvironment;
-		config.modules[name] = true;
-	},
-
-	asyncTest: function( testName, expected, callback ) {
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		QUnit.test( testName, expected, callback, true );
-	},
-
-	test: function( testName, expected, callback, async ) {
-		var test,
-			nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
-
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		if ( config.currentModule ) {
-			nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
-		}
-
-		test = new Test({
-			nameHtml: nameHtml,
-			testName: testName,
-			expected: expected,
-			async: async,
-			callback: callback,
-			module: config.currentModule,
-			moduleTestEnvironment: config.currentModuleTestEnvironment,
-			stack: sourceFromStacktrace( 2 )
-		});
-
-		if ( !validTest( test ) ) {
-			return;
-		}
-
-		test.queue();
-	},
-
-	// Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
-	expect: function( asserts ) {
-		if (arguments.length === 1) {
-			config.current.expected = asserts;
-		} else {
-			return config.current.expected;
-		}
-	},
-
-	start: function( count ) {
-		// QUnit hasn't been initialized yet.
-		// Note: RequireJS (et al) may delay onLoad
-		if ( config.semaphore === undefined ) {
-			QUnit.begin(function() {
-				// This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
-				setTimeout(function() {
-					QUnit.start( count );
-				});
-			});
-			return;
-		}
-
-		config.semaphore -= count || 1;
-		// don't start until equal number of stop-calls
-		if ( config.semaphore > 0 ) {
-			return;
-		}
-		// ignore if start is called more often then stop
-		if ( config.semaphore < 0 ) {
-			config.semaphore = 0;
-			QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
-			return;
-		}
-		// A slight delay, to avoid any current callbacks
-		if ( defined.setTimeout ) {
-			setTimeout(function() {
-				if ( config.semaphore > 0 ) {
-					return;
-				}
-				if ( config.timeout ) {
-					clearTimeout( config.timeout );
-				}
-
-				config.blocking = false;
-				process( true );
-			}, 13);
-		} else {
-			config.blocking = false;
-			process( true );
-		}
-	},
-
-	stop: function( count ) {
-		config.semaphore += count || 1;
-		config.blocking = true;
-
-		if ( config.testTimeout && defined.setTimeout ) {
-			clearTimeout( config.timeout );
-			config.timeout = setTimeout(function() {
-				QUnit.ok( false, "Test timed out" );
-				config.semaphore = 1;
-				QUnit.start();
-			}, config.testTimeout );
-		}
-	}
-};
-
-// `assert` initialized at top of scope
-// Assert helpers
-// All of these must either call QUnit.push() or manually do:
-// - runLoggingCallbacks( "log", .. );
-// - config.current.assertions.push({ .. });
-// We attach it to the QUnit object *after* we expose the public API,
-// otherwise `assert` will become a global variable in browsers (#341).
-assert = {
-	/**
-	 * Asserts rough true-ish result.
-	 * @name ok
-	 * @function
-	 * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-	 */
-	ok: function( result, msg ) {
-		if ( !config.current ) {
-			throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-		result = !!result;
-		msg = msg || (result ? "okay" : "failed" );
-
-		var source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: msg
-			};
-
-		msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
-
-		if ( !result ) {
-			source = sourceFromStacktrace( 2 );
-			if ( source ) {
-				details.source = source;
-				msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
-			}
-		}
-		runLoggingCallbacks( "log", QUnit, details );
-		config.current.assertions.push({
-			result: result,
-			message: msg
-		});
-	},
-
-	/**
-	 * Assert that the first two arguments are equal, with an optional message.
-	 * Prints out both actual and expected values.
-	 * @name equal
-	 * @function
-	 * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
-	 */
-	equal: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected == actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notEqual
-	 * @function
-	 */
-	notEqual: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected != actual, actual, expected, message );
-	},
-
-	/**
-	 * @name propEqual
-	 * @function
-	 */
-	propEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notPropEqual
-	 * @function
-	 */
-	notPropEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name deepEqual
-	 * @function
-	 */
-	deepEqual: function( actual, expected, message ) {
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notDeepEqual
-	 * @function
-	 */
-	notDeepEqual: function( actual, expected, message ) {
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name strictEqual
-	 * @function
-	 */
-	strictEqual: function( actual, expected, message ) {
-		QUnit.push( expected === actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notStrictEqual
-	 * @function
-	 */
-	notStrictEqual: function( actual, expected, message ) {
-		QUnit.push( expected !== actual, actual, expected, message );
-	},
-
-	"throws": function( block, expected, message ) {
-		var actual,
-			expectedOutput = expected,
-			ok = false;
-
-		// 'expected' is optional
-		if ( typeof expected === "string" ) {
-			message = expected;
-			expected = null;
-		}
-
-		config.current.ignoreGlobalErrors = true;
-		try {
-			block.call( config.current.testEnvironment );
-		} catch (e) {
-			actual = e;
-		}
-		config.current.ignoreGlobalErrors = false;
-
-		if ( actual ) {
-			// we don't want to validate thrown error
-			if ( !expected ) {
-				ok = true;
-				expectedOutput = null;
-			// expected is a regexp
-			} else if ( QUnit.objectType( expected ) === "regexp" ) {
-				ok = expected.test( errorString( actual ) );
-			// expected is a constructor
-			} else if ( actual instanceof expected ) {
-				ok = true;
-			// expected is a validation function which returns true is validation passed
-			} else if ( expected.call( {}, actual ) === true ) {
-				expectedOutput = null;
-				ok = true;
-			}
-
-			QUnit.push( ok, actual, expectedOutput, message );
-		} else {
-			QUnit.pushFailure( message, null, "No exception was thrown." );
-		}
-	}
-};
-
-/**
- * @deprecated since 1.8.0
- * Kept assertion helpers in root for backwards compatibility.
- */
-extend( QUnit, assert );
-
-/**
- * @deprecated since 1.9.0
- * Kept root "raises()" for backwards compatibility.
- * (Note that we don't introduce assert.raises).
- */
-QUnit.raises = assert[ "throws" ];
-
-/**
- * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.equals = function() {
-	QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
-};
-QUnit.same = function() {
-	QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
-};
-
-// We want access to the constructor's prototype
-(function() {
-	function F() {}
-	F.prototype = QUnit;
-	QUnit = new F();
-	// Make F QUnit's constructor so that we can add to the prototype later
-	QUnit.constructor = F;
-}());
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
-	// The queue of tests to run
-	queue: [],
-
-	// block until document ready
-	blocking: true,
-
-	// when enabled, show only failing tests
-	// gets persisted through sessionStorage and can be changed in UI via checkbox
-	hidepassed: false,
-
-	// by default, run previously failed tests first
-	// very useful in combination with "Hide passed tests" checked
-	reorder: true,
-
-	// by default, modify document.title when suite is done
-	altertitle: true,
-
-	// when enabled, all tests must call expect()
-	requireExpects: false,
-
-	// add checkboxes that are persisted in the query-string
-	// when enabled, the id is set to `true` as a `QUnit.config` property
-	urlConfig: [
-		{
-			id: "noglobals",
-			label: "Check for Globals",
-			tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
-		},
-		{
-			id: "notrycatch",
-			label: "No try-catch",
-			tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
-		}
-	],
-
-	// Set of all modules.
-	modules: {},
-
-	// logging callback queues
-	begin: [],
-	done: [],
-	log: [],
-	testStart: [],
-	testDone: [],
-	moduleStart: [],
-	moduleDone: []
-};
-
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
-	extend( window, QUnit.constructor.prototype );
-
-	// Expose QUnit object
-	window.QUnit = QUnit;
-}
-
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
-	var i,
-		location = window.location || { search: "", protocol: "file:" },
-		params = location.search.slice( 1 ).split( "&" ),
-		length = params.length,
-		urlParams = {},
-		current;
-
-	if ( params[ 0 ] ) {
-		for ( i = 0; i < length; i++ ) {
-			current = params[ i ].split( "=" );
-			current[ 0 ] = decodeURIComponent( current[ 0 ] );
-			// allow just a key to turn on a flag, e.g., test.html?noglobals
-			current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-			urlParams[ current[ 0 ] ] = current[ 1 ];
-		}
-	}
-
-	QUnit.urlParams = urlParams;
-
-	// String search anywhere in moduleName+testName
-	config.filter = urlParams.filter;
-
-	// Exact match of the module name
-	config.module = urlParams.module;
-
-	config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
-
-	// Figure out if we're running the tests from a server or not
-	QUnit.isLocal = location.protocol === "file:";
-}());
-
-// Extend QUnit object,
-// these after set here because they should not be exposed as global functions
-extend( QUnit, {
-	assert: assert,
-
-	config: config,
-
-	// Initialize the configuration options
-	init: function() {
-		extend( config, {
-			stats: { all: 0, bad: 0 },
-			moduleStats: { all: 0, bad: 0 },
-			started: +new Date(),
-			updateRate: 1000,
-			blocking: false,
-			autostart: true,
-			autorun: false,
-			filter: "",
-			queue: [],
-			semaphore: 1
-		});
-
-		var tests, banner, result,
-			qunit = id( "qunit" );
-
-		if ( qunit ) {
-			qunit.innerHTML =
-				"<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-				"<h2 id='qunit-banner'></h2>" +
-				"<div id='qunit-testrunner-toolbar'></div>" +
-				"<h2 id='qunit-userAgent'></h2>" +
-				"<ol id='qunit-tests'></ol>";
-		}
-
-		tests = id( "qunit-tests" );
-		banner = id( "qunit-banner" );
-		result = id( "qunit-testresult" );
-
-		if ( tests ) {
-			tests.innerHTML = "";
-		}
-
-		if ( banner ) {
-			banner.className = "";
-		}
-
-		if ( result ) {
-			result.parentNode.removeChild( result );
-		}
-
-		if ( tests ) {
-			result = document.createElement( "p" );
-			result.id = "qunit-testresult";
-			result.className = "result";
-			tests.parentNode.insertBefore( result, tests );
-			result.innerHTML = "Running...<br/>&nbsp;";
-		}
-	},
-
-	// Resets the test setup. Useful for tests that modify the DOM.
-	/*
-	DEPRECATED: Use multiple tests instead of resetting inside a test.
-	Use testStart or testDone for custom cleanup.
-	This method will throw an error in 2.0, and will be removed in 2.1
-	*/
-	reset: function() {
-		var fixture = id( "qunit-fixture" );
-		if ( fixture ) {
-			fixture.innerHTML = config.fixture;
-		}
-	},
-
-	// Trigger an event on an element.
-	// @example triggerEvent( document.body, "click" );
-	triggerEvent: function( elem, type, event ) {
-		if ( document.createEvent ) {
-			event = document.createEvent( "MouseEvents" );
-			event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
-				0, 0, 0, 0, 0, false, false, false, false, 0, null);
-
-			elem.dispatchEvent( event );
-		} else if ( elem.fireEvent ) {
-			elem.fireEvent( "on" + type );
-		}
-	},
-
-	// Safe object type checking
-	is: function( type, obj ) {
-		return QUnit.objectType( obj ) === type;
-	},
-
-	objectType: function( obj ) {
-		if ( typeof obj === "undefined" ) {
-				return "undefined";
-		// consider: typeof null === object
-		}
-		if ( obj === null ) {
-				return "null";
-		}
-
-		var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
-			type = match && match[1] || "";
-
-		switch ( type ) {
-			case "Number":
-				if ( isNaN(obj) ) {
-					return "nan";
-				}
-				return "number";
-			case "String":
-			case "Boolean":
-			case "Array":
-			case "Date":
-			case "RegExp":
-			case "Function":
-				return type.toLowerCase();
-		}
-		if ( typeof obj === "object" ) {
-			return "object";
-		}
-		return undefined;
-	},
-
-	push: function( result, actual, expected, message ) {
-		if ( !config.current ) {
-			throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
-		}
-
-		var output, source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: message,
-				actual: actual,
-				expected: expected
-			};
-
-		message = escapeText( message ) || ( result ? "okay" : "failed" );
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		if ( !result ) {
-			expected = escapeText( QUnit.jsDump.parse(expected) );
-			actual = escapeText( QUnit.jsDump.parse(actual) );
-			output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
-
-			if ( actual !== expected ) {
-				output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
-				output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
-			}
-
-			source = sourceFromStacktrace();
-
-			if ( source ) {
-				details.source = source;
-				output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-			}
-
-			output += "</table>";
-		}
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: !!result,
-			message: output
-		});
-	},
-
-	pushFailure: function( message, source, actual ) {
-		if ( !config.current ) {
-			throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-
-		var output,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: false,
-				message: message
-			};
-
-		message = escapeText( message ) || "error";
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		output += "<table>";
-
-		if ( actual ) {
-			output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
-		}
-
-		if ( source ) {
-			details.source = source;
-			output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-		}
-
-		output += "</table>";
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: false,
-			message: output
-		});
-	},
-
-	url: function( params ) {
-		params = extend( extend( {}, QUnit.urlParams ), params );
-		var key,
-			querystring = "?";
-
-		for ( key in params ) {
-			if ( hasOwn.call( params, key ) ) {
-				querystring += encodeURIComponent( key ) + "=" +
-					encodeURIComponent( params[ key ] ) + "&";
-			}
-		}
-		return window.location.protocol + "//" + window.location.host +
-			window.location.pathname + querystring.slice( 0, -1 );
-	},
-
-	extend: extend,
-	id: id,
-	addEvent: addEvent,
-	addClass: addClass,
-	hasClass: hasClass,
-	removeClass: removeClass
-	// load, equiv, jsDump, diff: Attached later
-});
-
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
-
-	// Logging callbacks; all receive a single argument with the listed properties
-	// run test/logs.html for any related changes
-	begin: registerLoggingCallback( "begin" ),
-
-	// done: { failed, passed, total, runtime }
-	done: registerLoggingCallback( "done" ),
-
-	// log: { result, actual, expected, message }
-	log: registerLoggingCallback( "log" ),
-
-	// testStart: { name }
-	testStart: registerLoggingCallback( "testStart" ),
-
-	// testDone: { name, failed, passed, total, duration }
-	testDone: registerLoggingCallback( "testDone" ),
-
-	// moduleStart: { name }
-	moduleStart: registerLoggingCallback( "moduleStart" ),
-
-	// moduleDone: { name, failed, passed, total }
-	moduleDone: registerLoggingCallback( "moduleDone" )
-});
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
-	config.autorun = true;
-}
-
-QUnit.load = function() {
-	runLoggingCallbacks( "begin", QUnit, {} );
-
-	// Initialize the config, saving the execution queue
-	var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
-		urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
-		numModules = 0,
-		moduleNames = [],
-		moduleFilterHtml = "",
-		urlConfigHtml = "",
-		oldconfig = extend( {}, config );
-
-	QUnit.init();
-	extend(config, oldconfig);
-
-	config.blocking = false;
-
-	len = config.urlConfig.length;
-
-	for ( i = 0; i < len; i++ ) {
-		val = config.urlConfig[i];
-		if ( typeof val === "string" ) {
-			val = {
-				id: val,
-				label: val,
-				tooltip: "[no tooltip available]"
-			};
-		}
-		config[ val.id ] = QUnit.urlParams[ val.id ];
-		urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
-			"' name='" + escapeText( val.id ) +
-			"' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
-			" title='" + escapeText( val.tooltip ) +
-			"'><label for='qunit-urlconfig-" + escapeText( val.id ) +
-			"' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
-	}
-	for ( i in config.modules ) {
-		if ( config.modules.hasOwnProperty( i ) ) {
-			moduleNames.push(i);
-		}
-	}
-	numModules = moduleNames.length;
-	moduleNames.sort( function( a, b ) {
-		return a.localeCompare( b );
-	});
-	moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-		( config.module === undefined  ? "selected='selected'" : "" ) +
-		">< All Modules ></option>";
-
-
-	for ( i = 0; i < numModules; i++) {
-			moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
-				( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
-				">" + escapeText(moduleNames[i]) + "</option>";
-	}
-	moduleFilterHtml += "</select>";
-
-	// `userAgent` initialized at top of scope
-	userAgent = id( "qunit-userAgent" );
-	if ( userAgent ) {
-		userAgent.innerHTML = navigator.userAgent;
-	}
-
-	// `banner` initialized at top of scope
-	banner = id( "qunit-header" );
-	if ( banner ) {
-		banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
-	}
-
-	// `toolbar` initialized at top of scope
-	toolbar = id( "qunit-testrunner-toolbar" );
-	if ( toolbar ) {
-		// `filter` initialized at top of scope
-		filter = document.createElement( "input" );
-		filter.type = "checkbox";
-		filter.id = "qunit-filter-pass";
-
-		addEvent( filter, "click", function() {
-			var tmp,
-				ol = document.getElementById( "qunit-tests" );
-
-			if ( filter.checked ) {
-				ol.className = ol.className + " hidepass";
-			} else {
-				tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-				ol.className = tmp.replace( / hidepass /, " " );
-			}
-			if ( defined.sessionStorage ) {
-				if (filter.checked) {
-					sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
-				} else {
-					sessionStorage.removeItem( "qunit-filter-passed-tests" );
-				}
-			}
-		});
-
-		if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
-			filter.checked = true;
-			// `ol` initialized at top of scope
-			ol = document.getElementById( "qunit-tests" );
-			ol.className = ol.className + " hidepass";
-		}
-		toolbar.appendChild( filter );
-
-		// `label` initialized at top of scope
-		label = document.createElement( "label" );
-		label.setAttribute( "for", "qunit-filter-pass" );
-		label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
-		label.innerHTML = "Hide passed tests";
-		toolbar.appendChild( label );
-
-		urlConfigCheckboxesContainer = document.createElement("span");
-		urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
-		urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
-		// For oldIE support:
-		// * Add handlers to the individual elements instead of the container
-		// * Use "click" instead of "change"
-		// * Fallback from event.target to event.srcElement
-		addEvents( urlConfigCheckboxes, "click", function( event ) {
-			var params = {},
-				target = event.target || event.srcElement;
-			params[ target.name ] = target.checked ? true : undefined;
-			window.location = QUnit.url( params );
-		});
-		toolbar.appendChild( urlConfigCheckboxesContainer );
-
-		if (numModules > 1) {
-			moduleFilter = document.createElement( "span" );
-			moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-			moduleFilter.innerHTML = moduleFilterHtml;
-			addEvent( moduleFilter.lastChild, "change", function() {
-				var selectBox = moduleFilter.getElementsByTagName("select")[0],
-					selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
-
-				window.location = QUnit.url({
-					module: ( selectedModule === "" ) ? undefined : selectedModule,
-					// Remove any existing filters
-					filter: undefined,
-					testNumber: undefined
-				});
-			});
-			toolbar.appendChild(moduleFilter);
-		}
-	}
-
-	// `main` initialized at top of scope
-	main = id( "qunit-fixture" );
-	if ( main ) {
-		config.fixture = main.innerHTML;
-	}
-
-	if ( config.autostart ) {
-		QUnit.start();
-	}
-};
-
-addEvent( window, "load", QUnit.load );
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function ( error, filePath, linerNr ) {
-	var ret = false;
-	if ( onErrorFnPrev ) {
-		ret = onErrorFnPrev( error, filePath, linerNr );
-	}
-
-	// Treat return value as window.onerror itself does,
-	// Only do our handling if not suppressed.
-	if ( ret !== true ) {
-		if ( QUnit.config.current ) {
-			if ( QUnit.config.current.ignoreGlobalErrors ) {
-				return true;
-			}
-			QUnit.pushFailure( error, filePath + ":" + linerNr );
-		} else {
-			QUnit.test( "global failure", extend( function() {
-				QUnit.pushFailure( error, filePath + ":" + linerNr );
-			}, { validTest: validTest } ) );
-		}
-		return false;
-	}
-
-	return ret;
-};
-
-function done() {
-	config.autorun = true;
-
-	// Log the last module results
-	if ( config.currentModule ) {
-		runLoggingCallbacks( "moduleDone", QUnit, {
-			name: config.currentModule,
-			failed: config.moduleStats.bad,
-			passed: config.moduleStats.all - config.moduleStats.bad,
-			total: config.moduleStats.all
-		});
-	}
-	delete config.previousModule;
-
-	var i, key,
-		banner = id( "qunit-banner" ),
-		tests = id( "qunit-tests" ),
-		runtime = +new Date() - config.started,
-		passed = config.stats.all - config.stats.bad,
-		html = [
-			"Tests completed in ",
-			runtime,
-			" milliseconds.<br/>",
-			"<span class='passed'>",
-			passed,
-			"</span> assertions of <span class='total'>",
-			config.stats.all,
-			"</span> passed, <span class='failed'>",
-			config.stats.bad,
-			"</span> failed."
-		].join( "" );
-
-	if ( banner ) {
-		banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
-	}
-
-	if ( tests ) {
-		id( "qunit-testresult" ).innerHTML = html;
-	}
-
-	if ( config.altertitle && typeof document !== "undefined" && document.title ) {
-		// show ✖ for good, ✔ for bad suite result in title
-		// use escape sequences in case file gets loaded with non-utf-8-charset
-		document.title = [
-			( config.stats.bad ? "\u2716" : "\u2714" ),
-			document.title.replace( /^[\u2714\u2716] /i, "" )
-		].join( " " );
-	}
-
-	// clear own sessionStorage items if all tests passed
-	if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-		// `key` & `i` initialized at top of scope
-		for ( i = 0; i < sessionStorage.length; i++ ) {
-			key = sessionStorage.key( i++ );
-			if ( key.indexOf( "qunit-test-" ) === 0 ) {
-				sessionStorage.removeItem( key );
-			}
-		}
-	}
-
-	// scroll back to top to show results
-	if ( window.scrollTo ) {
-		window.scrollTo(0, 0);
-	}
-
-	runLoggingCallbacks( "done", QUnit, {
-		failed: config.stats.bad,
-		passed: passed,
-		total: config.stats.all,
-		runtime: runtime
-	});
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
-	var include,
-		filter = config.filter && config.filter.toLowerCase(),
-		module = config.module && config.module.toLowerCase(),
-		fullName = (test.module + ": " + test.testName).toLowerCase();
-
-	// Internally-generated tests are always valid
-	if ( test.callback && test.callback.validTest === validTest ) {
-		delete test.callback.validTest;
-		return true;
-	}
-
-	if ( config.testNumber ) {
-		return test.testNumber === config.testNumber;
-	}
-
-	if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
-		return false;
-	}
-
-	if ( !filter ) {
-		return true;
-	}
-
-	include = filter.charAt( 0 ) !== "!";
-	if ( !include ) {
-		filter = filter.slice( 1 );
-	}
-
-	// If the filter matches, we need to honour include
-	if ( fullName.indexOf( filter ) !== -1 ) {
-		return include;
-	}
-
-	// Otherwise, do the opposite
-	return !include;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
-// Later Safari and IE10 are supposed to support error.stack as well
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-	offset = offset === undefined ? 3 : offset;
-
-	var stack, include, i;
-
-	if ( e.stacktrace ) {
-		// Opera
-		return e.stacktrace.split( "\n" )[ offset + 3 ];
-	} else if ( e.stack ) {
-		// Firefox, Chrome
-		stack = e.stack.split( "\n" );
-		if (/^error$/i.test( stack[0] ) ) {
-			stack.shift();
-		}
-		if ( fileName ) {
-			include = [];
-			for ( i = offset; i < stack.length; i++ ) {
-				if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-					break;
-				}
-				include.push( stack[ i ] );
-			}
-			if ( include.length ) {
-				return include.join( "\n" );
-			}
-		}
-		return stack[ offset ];
-	} else if ( e.sourceURL ) {
-		// Safari, PhantomJS
-		// hopefully one day Safari provides actual stacktraces
-		// exclude useless self-reference for generated Error objects
-		if ( /qunit.js$/.test( e.sourceURL ) ) {
-			return;
-		}
-		// for actual exceptions, this is useful
-		return e.sourceURL + ":" + e.line;
-	}
-}
-function sourceFromStacktrace( offset ) {
-	try {
-		throw new Error();
-	} catch ( e ) {
-		return extractStacktrace( e, offset );
-	}
-}
-
-/**
- * Escape text for attribute or text content.
- */
-function escapeText( s ) {
-	if ( !s ) {
-		return "";
-	}
-	s = s + "";
-	// Both single quotes and double quotes (for attributes)
-	return s.replace( /['"<>&]/g, function( s ) {
-		switch( s ) {
-			case "'":
-				return "&#039;";
-			case "\"":
-				return "&quot;";
-			case "<":
-				return "&lt;";
-			case ">":
-				return "&gt;";
-			case "&":
-				return "&amp;";
-		}
-	});
-}
-
-function synchronize( callback, last ) {
-	config.queue.push( callback );
-
-	if ( config.autorun && !config.blocking ) {
-		process( last );
-	}
-}
-
-function process( last ) {
-	function next() {
-		process( last );
-	}
-	var start = new Date().getTime();
-	config.depth = config.depth ? config.depth + 1 : 1;
-
-	while ( config.queue.length && !config.blocking ) {
-		if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
-			config.queue.shift()();
-		} else {
-			setTimeout( next, 13 );
-			break;
-		}
-	}
-	config.depth--;
-	if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-		done();
-	}
-}
-
-function saveGlobal() {
-	config.pollution = [];
-
-	if ( config.noglobals ) {
-		for ( var key in window ) {
-			if ( hasOwn.call( window, key ) ) {
-				// in Opera sometimes DOM element ids show up here, ignore them
-				if ( /^qunit-test-output/.test( key ) ) {
-					continue;
-				}
-				config.pollution.push( key );
-			}
-		}
-	}
-}
-
-function checkPollution() {
-	var newGlobals,
-		deletedGlobals,
-		old = config.pollution;
-
-	saveGlobal();
-
-	newGlobals = diff( config.pollution, old );
-	if ( newGlobals.length > 0 ) {
-		QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
-	}
-
-	deletedGlobals = diff( old, config.pollution );
-	if ( deletedGlobals.length > 0 ) {
-		QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
-	}
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-	var i, j,
-		result = a.slice();
-
-	for ( i = 0; i < result.length; i++ ) {
-		for ( j = 0; j < b.length; j++ ) {
-			if ( result[i] === b[j] ) {
-				result.splice( i, 1 );
-				i--;
-				break;
-			}
-		}
-	}
-	return result;
-}
-
-function extend( a, b ) {
-	for ( var prop in b ) {
-		if ( hasOwn.call( b, prop ) ) {
-			// Avoid "Member not found" error in IE8 caused by messing with window.constructor
-			if ( !( prop === "constructor" && a === window ) ) {
-				if ( b[ prop ] === undefined ) {
-					delete a[ prop ];
-				} else {
-					a[ prop ] = b[ prop ];
-				}
-			}
-		}
-	}
-
-	return a;
-}
-
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-	// Standards-based browsers
-	if ( elem.addEventListener ) {
-		elem.addEventListener( type, fn, false );
-	// IE
-	} else {
-		elem.attachEvent( "on" + type, fn );
-	}
-}
-
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-	var i = elems.length;
-	while ( i-- ) {
-		addEvent( elems[i], type, fn );
-	}
-}
-
-function hasClass( elem, name ) {
-	return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
-}
-
-function addClass( elem, name ) {
-	if ( !hasClass( elem, name ) ) {
-		elem.className += (elem.className ? " " : "") + name;
-	}
-}
-
-function removeClass( elem, name ) {
-	var set = " " + elem.className + " ";
-	// Class name may appear multiple times
-	while ( set.indexOf(" " + name + " ") > -1 ) {
-		set = set.replace(" " + name + " " , " ");
-	}
-	// If possible, trim it for prettiness, but not necessarily
-	elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
-}
-
-function id( name ) {
-	return !!( typeof document !== "undefined" && document && document.getElementById ) &&
-		document.getElementById( name );
-}
-
-function registerLoggingCallback( key ) {
-	return function( callback ) {
-		config[key].push( callback );
-	};
-}
-
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks( key, scope, args ) {
-	var i, callbacks;
-	if ( QUnit.hasOwnProperty( key ) ) {
-		QUnit[ key ].call(scope, args );
-	} else {
-		callbacks = config[ key ];
-		for ( i = 0; i < callbacks.length; i++ ) {
-			callbacks[ i ].call( scope, args );
-		}
-	}
-}
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
-
-	// Call the o related callback with the given arguments.
-	function bindCallbacks( o, callbacks, args ) {
-		var prop = QUnit.objectType( o );
-		if ( prop ) {
-			if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-				return callbacks[ prop ].apply( callbacks, args );
-			} else {
-				return callbacks[ prop ]; // or undefined
-			}
-		}
-	}
-
-	// the real equiv function
-	var innerEquiv,
-		// stack to decide between skip/abort functions
-		callers = [],
-		// stack to avoiding loops from circular referencing
-		parents = [],
-		parentsB = [],
-
-		getProto = Object.getPrototypeOf || function ( obj ) {
-			/*jshint camelcase:false */
-			return obj.__proto__;
-		},
-		callbacks = (function () {
-
-			// for string, boolean, number and null
-			function useStrictEquality( b, a ) {
-				/*jshint eqeqeq:false */
-				if ( b instanceof a.constructor || a instanceof b.constructor ) {
-					// to catch short annotation VS 'new' annotation of a
-					// declaration
-					// e.g. var i = 1;
-					// var j = new Number(1);
-					return a == b;
-				} else {
-					return a === b;
-				}
-			}
-
-			return {
-				"string": useStrictEquality,
-				"boolean": useStrictEquality,
-				"number": useStrictEquality,
-				"null": useStrictEquality,
-				"undefined": useStrictEquality,
-
-				"nan": function( b ) {
-					return isNaN( b );
-				},
-
-				"date": function( b, a ) {
-					return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-				},
-
-				"regexp": function( b, a ) {
-					return QUnit.objectType( b ) === "regexp" &&
-						// the regex itself
-						a.source === b.source &&
-						// and its modifiers
-						a.global === b.global &&
-						// (gmi) ...
-						a.ignoreCase === b.ignoreCase &&
-						a.multiline === b.multiline &&
-						a.sticky === b.sticky;
-				},
-
-				// - skip when the property is a method of an instance (OOP)
-				// - abort otherwise,
-				// initial === would have catch identical references anyway
-				"function": function() {
-					var caller = callers[callers.length - 1];
-					return caller !== Object && typeof caller !== "undefined";
-				},
-
-				"array": function( b, a ) {
-					var i, j, len, loop, aCircular, bCircular;
-
-					// b could be an object literal here
-					if ( QUnit.objectType( b ) !== "array" ) {
-						return false;
-					}
-
-					len = a.length;
-					if ( len !== b.length ) {
-						// safe and faster
-						return false;
-					}
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-					for ( i = 0; i < len; i++ ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									parents.pop();
-									parentsB.pop();
-									return false;
-								}
-							}
-						}
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							parents.pop();
-							parentsB.pop();
-							return false;
-						}
-					}
-					parents.pop();
-					parentsB.pop();
-					return true;
-				},
-
-				"object": function( b, a ) {
-					/*jshint forin:false */
-					var i, j, loop, aCircular, bCircular,
-						// Default to true
-						eq = true,
-						aProperties = [],
-						bProperties = [];
-
-					// comparing constructors is more strict than using
-					// instanceof
-					if ( a.constructor !== b.constructor ) {
-						// Allow objects with no prototype to be equivalent to
-						// objects with Object as their constructor.
-						if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
-							( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
-								return false;
-						}
-					}
-
-					// stack constructor before traversing properties
-					callers.push( a.constructor );
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-
-					// be strict: don't ensure hasOwnProperty and go deep
-					for ( i in a ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									eq = false;
-									break;
-								}
-							}
-						}
-						aProperties.push(i);
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							eq = false;
-							break;
-						}
-					}
-
-					parents.pop();
-					parentsB.pop();
-					callers.pop(); // unstack, we are done
-
-					for ( i in b ) {
-						bProperties.push( i ); // collect b's properties
-					}
-
-					// Ensures identical properties name
-					return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-				}
-			};
-		}());
-
-	innerEquiv = function() { // can take multiple arguments
-		var args = [].slice.apply( arguments );
-		if ( args.length < 2 ) {
-			return true; // end transition
-		}
-
-		return (function( a, b ) {
-			if ( a === b ) {
-				return true; // catch the most you can
-			} else if ( a === null || b === null || typeof a === "undefined" ||
-					typeof b === "undefined" ||
-					QUnit.objectType(a) !== QUnit.objectType(b) ) {
-				return false; // don't lose time with error prone cases
-			} else {
-				return bindCallbacks(a, callbacks, [ b, a ]);
-			}
-
-			// apply transition with (1..n) arguments
-		}( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
-	};
-
-	return innerEquiv;
-}());
-
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
-	function quote( str ) {
-		return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
-	}
-	function literal( o ) {
-		return o + "";
-	}
-	function join( pre, arr, post ) {
-		var s = jsDump.separator(),
-			base = jsDump.indent(),
-			inner = jsDump.indent(1);
-		if ( arr.join ) {
-			arr = arr.join( "," + s + inner );
-		}
-		if ( !arr ) {
-			return pre + post;
-		}
-		return [ pre, inner + arr, base + post ].join(s);
-	}
-	function array( arr, stack ) {
-		var i = arr.length, ret = new Array(i);
-		this.up();
-		while ( i-- ) {
-			ret[i] = this.parse( arr[i] , undefined , stack);
-		}
-		this.down();
-		return join( "[", ret, "]" );
-	}
-
-	var reName = /^function (\w+)/,
-		jsDump = {
-			// type is used mostly internally, you can fix a (custom)type in advance
-			parse: function( obj, type, stack ) {
-				stack = stack || [ ];
-				var inStack, res,
-					parser = this.parsers[ type || this.typeOf(obj) ];
-
-				type = typeof parser;
-				inStack = inArray( obj, stack );
-
-				if ( inStack !== -1 ) {
-					return "recursion(" + (inStack - stack.length) + ")";
-				}
-				if ( type === "function" )  {
-					stack.push( obj );
-					res = parser.call( this, obj, stack );
-					stack.pop();
-					return res;
-				}
-				return ( type === "string" ) ? parser : this.parsers.error;
-			},
-			typeOf: function( obj ) {
-				var type;
-				if ( obj === null ) {
-					type = "null";
-				} else if ( typeof obj === "undefined" ) {
-					type = "undefined";
-				} else if ( QUnit.is( "regexp", obj) ) {
-					type = "regexp";
-				} else if ( QUnit.is( "date", obj) ) {
-					type = "date";
-				} else if ( QUnit.is( "function", obj) ) {
-					type = "function";
-				} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
-					type = "window";
-				} else if ( obj.nodeType === 9 ) {
-					type = "document";
-				} else if ( obj.nodeType ) {
-					type = "node";
-				} else if (
-					// native arrays
-					toString.call( obj ) === "[object Array]" ||
-					// NodeList objects
-					( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-				) {
-					type = "array";
-				} else if ( obj.constructor === Error.prototype.constructor ) {
-					type = "error";
-				} else {
-					type = typeof obj;
-				}
-				return type;
-			},
-			separator: function() {
-				return this.multiline ?	this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
-			},
-			// extra can be a number, shortcut for increasing-calling-decreasing
-			indent: function( extra ) {
-				if ( !this.multiline ) {
-					return "";
-				}
-				var chr = this.indentChar;
-				if ( this.HTML ) {
-					chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
-				}
-				return new Array( this.depth + ( extra || 0 ) ).join(chr);
-			},
-			up: function( a ) {
-				this.depth += a || 1;
-			},
-			down: function( a ) {
-				this.depth -= a || 1;
-			},
-			setParser: function( name, parser ) {
-				this.parsers[name] = parser;
-			},
-			// The next 3 are exposed so you can use them
-			quote: quote,
-			literal: literal,
-			join: join,
-			//
-			depth: 1,
-			// This is the list of parsers, to modify them, use jsDump.setParser
-			parsers: {
-				window: "[Window]",
-				document: "[Document]",
-				error: function(error) {
-					return "Error(\"" + error.message + "\")";
-				},
-				unknown: "[Unknown]",
-				"null": "null",
-				"undefined": "undefined",
-				"function": function( fn ) {
-					var ret = "function",
-						// functions never have name in IE
-						name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
-
-					if ( name ) {
-						ret += " " + name;
-					}
-					ret += "( ";
-
-					ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
-					return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
-				},
-				array: array,
-				nodelist: array,
-				"arguments": array,
-				object: function( map, stack ) {
-					/*jshint forin:false */
-					var ret = [ ], keys, key, val, i;
-					QUnit.jsDump.up();
-					keys = [];
-					for ( key in map ) {
-						keys.push( key );
-					}
-					keys.sort();
-					for ( i = 0; i < keys.length; i++ ) {
-						key = keys[ i ];
-						val = map[ key ];
-						ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
-					}
-					QUnit.jsDump.down();
-					return join( "{", ret, "}" );
-				},
-				node: function( node ) {
-					var len, i, val,
-						open = QUnit.jsDump.HTML ? "&lt;" : "<",
-						close = QUnit.jsDump.HTML ? "&gt;" : ">",
-						tag = node.nodeName.toLowerCase(),
-						ret = open + tag,
-						attrs = node.attributes;
-
-					if ( attrs ) {
-						for ( i = 0, len = attrs.length; i < len; i++ ) {
-							val = attrs[i].nodeValue;
-							// IE6 includes all attributes in .attributes, even ones not explicitly set.
-							// Those have values like undefined, null, 0, false, "" or "inherit".
-							if ( val && val !== "inherit" ) {
-								ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
-							}
-						}
-					}
-					ret += close;
-
-					// Show content of TextNode or CDATASection
-					if ( node.nodeType === 3 || node.nodeType === 4 ) {
-						ret += node.nodeValue;
-					}
-
-					return ret + open + "/" + tag + close;
-				},
-				// function calls it internally, it's the arguments part of the function
-				functionArgs: function( fn ) {
-					var args,
-						l = fn.length;
-
-					if ( !l ) {
-						return "";
-					}
-
-					args = new Array(l);
-					while ( l-- ) {
-						// 97 is 'a'
-						args[l] = String.fromCharCode(97+l);
-					}
-					return " " + args.join( ", " ) + " ";
-				},
-				// object calls it internally, the key part of an item in a map
-				key: quote,
-				// function calls it internally, it's the content of the function
-				functionCode: "[code]",
-				// node calls it internally, it's an html attribute value
-				attribute: quote,
-				string: quote,
-				date: quote,
-				regexp: literal,
-				number: literal,
-				"boolean": literal
-			},
-			// if true, entities are escaped ( <, >, \t, space and \n )
-			HTML: false,
-			// indentation unit
-			indentChar: "  ",
-			// if true, items in a collection, are separated by a \n, else just a space.
-			multiline: true
-		};
-
-	return jsDump;
-}());
-
-// from jquery.js
-function inArray( elem, array ) {
-	if ( array.indexOf ) {
-		return array.indexOf( elem );
-	}
-
-	for ( var i = 0, length = array.length; i < length; i++ ) {
-		if ( array[ i ] === elem ) {
-			return i;
-		}
-	}
-
-	return -1;
-}
-
-/*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
-	/*jshint eqeqeq:false, eqnull:true */
-	function diff( o, n ) {
-		var i,
-			ns = {},
-			os = {};
-
-		for ( i = 0; i < n.length; i++ ) {
-			if ( !hasOwn.call( ns, n[i] ) ) {
-				ns[ n[i] ] = {
-					rows: [],
-					o: null
-				};
-			}
-			ns[ n[i] ].rows.push( i );
-		}
-
-		for ( i = 0; i < o.length; i++ ) {
-			if ( !hasOwn.call( os, o[i] ) ) {
-				os[ o[i] ] = {
-					rows: [],
-					n: null
-				};
-			}
-			os[ o[i] ].rows.push( i );
-		}
-
-		for ( i in ns ) {
-			if ( hasOwn.call( ns, i ) ) {
-				if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
-					n[ ns[i].rows[0] ] = {
-						text: n[ ns[i].rows[0] ],
-						row: os[i].rows[0]
-					};
-					o[ os[i].rows[0] ] = {
-						text: o[ os[i].rows[0] ],
-						row: ns[i].rows[0]
-					};
-				}
-			}
-		}
-
-		for ( i = 0; i < n.length - 1; i++ ) {
-			if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
-						n[ i + 1 ] == o[ n[i].row + 1 ] ) {
-
-				n[ i + 1 ] = {
-					text: n[ i + 1 ],
-					row: n[i].row + 1
-				};
-				o[ n[i].row + 1 ] = {
-					text: o[ n[i].row + 1 ],
-					row: i + 1
-				};
-			}
-		}
-
-		for ( i = n.length - 1; i > 0; i-- ) {
-			if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
-						n[ i - 1 ] == o[ n[i].row - 1 ]) {
-
-				n[ i - 1 ] = {
-					text: n[ i - 1 ],
-					row: n[i].row - 1
-				};
-				o[ n[i].row - 1 ] = {
-					text: o[ n[i].row - 1 ],
-					row: i - 1
-				};
-			}
-		}
-
-		return {
-			o: o,
-			n: n
-		};
-	}
-
-	return function( o, n ) {
-		o = o.replace( /\s+$/, "" );
-		n = n.replace( /\s+$/, "" );
-
-		var i, pre,
-			str = "",
-			out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
-			oSpace = o.match(/\s+/g),
-			nSpace = n.match(/\s+/g);
-
-		if ( oSpace == null ) {
-			oSpace = [ " " ];
-		}
-		else {
-			oSpace.push( " " );
-		}
-
-		if ( nSpace == null ) {
-			nSpace = [ " " ];
-		}
-		else {
-			nSpace.push( " " );
-		}
-
-		if ( out.n.length === 0 ) {
-			for ( i = 0; i < out.o.length; i++ ) {
-				str += "<del>" + out.o[i] + oSpace[i] + "</del>";
-			}
-		}
-		else {
-			if ( out.n[0].text == null ) {
-				for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
-					str += "<del>" + out.o[n] + oSpace[n] + "</del>";
-				}
-			}
-
-			for ( i = 0; i < out.n.length; i++ ) {
-				if (out.n[i].text == null) {
-					str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
-				}
-				else {
-					// `pre` initialized at top of scope
-					pre = "";
-
-					for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
-						pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
-					}
-					str += " " + out.n[i].text + nSpace[i] + pre;
-				}
-			}
-		}
-
-		return str;
-	};
-}());
-
-// for CommonJS environments, export everything
-if ( typeof exports !== "undefined" ) {
-	extend( exports, QUnit.constructor.prototype );
-}
-
-// get at whatever the global object is, like window in browsers
-}( (function() {return this;}.call()) ));
diff --git a/docs/slides/ETH14/_support/reveal.js/test/test-markdown-element-attributes.js b/docs/slides/ETH14/_support/reveal.js/test/test-markdown-element-attributes.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/test/test-markdown-element-attributes.js
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 4, 'found four slides' );
-	});
-
-
-	test( 'Attributes on element header in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.fade-out' ).length, 1, 'found one vertical slide with class fragment.fade-out on header' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.shrink' ).length, 1, 'found one vertical slide with class fragment.shrink on header' );
-	});
-
-	test( 'Attributes on element paragraphs in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section p.fragment.grow' ).length, 2, 'found a vertical slide with two paragraphs with class fragment.grow' );
-	});
-
-	test( 'Attributes on element list items in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section li.fragment.roll-in' ).length, 3, 'found a vertical slide with three list items with class fragment.roll-in' );
-	});
-
-	test( 'Attributes on element paragraphs in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-red' ).length, 4, 'found a horizontal slide with four paragraphs with class fragment.grow' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section li.fragment.highlight-green' ).length, 5, 'found a horizontal slide with five list items with class fragment.roll-in' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section img.reveal.stretch' ).length, 1, 'found a horizontal slide with stretched image, class img.reveal.stretch' );
-	});
-
-	test( 'Attributes on elements in vertical slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section h2.fragment.highlight-red' ).length, 2, 'found two h2 titles with fragment highlight-red in vertical slides with default element attribute separator' );
-	});
-
-	test( 'Attributes on elements in single slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-blue' ).length, 3, 'found three elements with fragment highlight-blue in single slide with default element attribute separator' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/ETH14/_support/reveal.js/test/test-markdown-slide-attributes.js b/docs/slides/ETH14/_support/reveal.js/test/test-markdown-slide-attributes.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/test/test-markdown-slide-attributes.js
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 6, 'found six vertical slides' );
-	});
-
-	test( 'Id on slide', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section#slide2' ).length, 1, 'found one slide with id slide2' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, 'found one slide with a link to slide2' );
-	});
-
-	test( 'data-background attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-background attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-transition attributes with inline content', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/ETH14/_support/reveal.js/test/test-markdown.js b/docs/slides/ETH14/_support/reveal.js/test/test-markdown.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/test/test-markdown.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/ETH14/_support/reveal.js/test/test.js b/docs/slides/ETH14/_support/reveal.js/test/test.js
deleted file mode 100644
--- a/docs/slides/ETH14/_support/reveal.js/test/test.js
+++ /dev/null
@@ -1,438 +0,0 @@
-
-// These tests expect the DOM to contain a presentation
-// with the following slide structure:
-//
-// 1
-// 2 - Three sub-slides
-// 3 - Three fragment elements
-// 3 - Two fragments with same data-fragment-index
-// 4
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	// ---------------------------------------------------------------
-	// DOM TESTS
-
-	QUnit.module( 'DOM' );
-
-	test( 'Initial slides classes', function() {
-		var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' )
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' );
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' );
-
-		ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' );
-	});
-
-	// ---------------------------------------------------------------
-	// API TESTS
-
-	QUnit.module( 'API' );
-
-	test( 'Reveal.isReady', function() {
-		strictEqual( Reveal.isReady(), true, 'returns true' );
-	});
-
-	test( 'Reveal.isOverview', function() {
-		strictEqual( Reveal.isOverview(), false, 'false by default' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), true, 'true after toggling on' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), false, 'false after toggling off' );
-	});
-
-	test( 'Reveal.isPaused', function() {
-		strictEqual( Reveal.isPaused(), false, 'false by default' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), true, 'true after pausing' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), false, 'false after resuming' );
-	});
-
-	test( 'Reveal.isFirstSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-
-		Reveal.slide( 1, 0 );
-		strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.isLastSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-
-		var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1;
-
-		Reveal.slide( lastSlideIndex, 0 );
-		strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( ', 0+ lastSlideIndex +' )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.getIndices', function() {
-		var indices = Reveal.getIndices();
-
-		ok( typeof indices.hasOwnProperty( 'h' ), 'h exists' );
-		ok( typeof indices.hasOwnProperty( 'v' ), 'v exists' );
-		ok( typeof indices.hasOwnProperty( 'f' ), 'f exists' );
-
-		Reveal.slide( 1, 0 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 0, 'h 1, v 0' );
-
-		Reveal.slide( 1, 2 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 2, 'h 1, v 2' );
-
-		Reveal.slide( 0, 0 );
-	});
-
-	test( 'Reveal.getSlide', function() {
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-
-		equal( Reveal.getSlide( 0 ), firstSlide, 'gets correct first slide' );
-
-		strictEqual( Reveal.getSlide( 100 ), undefined, 'returns undefined when slide can\'t be found' );
-	});
-
-	test( 'Reveal.getPreviousSlide/getCurrentSlide', function() {
-		Reveal.slide( 0, 0 );
-		Reveal.slide( 1, 0 );
-
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-		var secondSlide = document.querySelector( '.reveal .slides>section:nth-child(2)>section' );
-
-		equal( Reveal.getPreviousSlide(), firstSlide, 'previous is slide #0' );
-		equal( Reveal.getCurrentSlide(), secondSlide, 'current is slide #1' );
-	});
-
-	test( 'Reveal.getScale', function() {
-		ok( typeof Reveal.getScale() === 'number', 'has scale' );
-	});
-
-	test( 'Reveal.getConfig', function() {
-		ok( typeof Reveal.getConfig() === 'object', 'has config' );
-	});
-
-	test( 'Reveal.configure', function() {
-		strictEqual( Reveal.getConfig().loop, false, '"loop" is false to start with' );
-
-		Reveal.configure({ loop: true });
-		strictEqual( Reveal.getConfig().loop, true, '"loop" has changed to true' );
-
-		Reveal.configure({ loop: false, customTestValue: 1 });
-		strictEqual( Reveal.getConfig().customTestValue, 1, 'supports custom values' );
-	});
-
-	test( 'Reveal.availableRoutes', function() {
-		Reveal.slide( 0, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: false, up: false, down: false, right: true }, 'correct for first slide' );
-
-		Reveal.slide( 1, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: true, up: false, down: true, right: true }, 'correct for vertical slide' );
-	});
-
-	test( 'Reveal.next', function() {
-		Reveal.slide( 0, 0 );
-
-		// Step through vertical child slides
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 1, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined } );
-
-		// Step through fragments
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 } );
-	});
-
-	test( 'Reveal.next at end', function() {
-		Reveal.slide( 3 );
-
-		// We're at the end, this should have no effect
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-	});
-
-
-	// ---------------------------------------------------------------
-	// FRAGMENT TESTS
-
-	QUnit.module( 'Fragments' );
-
-	test( 'Sliding to fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 }, 'Reveal.slide( 2, 0, -1 )' );
-
-		Reveal.slide( 2, 0, 0 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'Reveal.slide( 2, 0, 0 )' );
-
-		Reveal.slide( 2, 0, 2 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'Reveal.slide( 2, 0, 2 )' );
-
-		Reveal.slide( 2, 0, 1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'Reveal.slide( 2, 0, 1 )' );
-	});
-
-	test( 'Hiding all fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 1, 'one fragment visible when index is 0' );
-
-		Reveal.slide( 2, 0, -1 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when index is -1' );
-	});
-
-	test( 'Current fragment', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment at index -1' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 1, 'one current fragment at index 0' );
-
-		Reveal.slide( 1, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to next slide' );
-	});
-
-	test( 'Stepping through fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-
-		// forwards:
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'next() goes to next fragment' );
-
-		Reveal.right();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'right() goes to next fragment' );
-
-		Reveal.down();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'down() goes to next fragment' );
-
-		Reveal.down(); // moves to f #3
-
-		// backwards:
-
-		Reveal.prev();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'prev() goes to prev fragment' );
-
-		Reveal.left();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'left() goes to prev fragment' );
-
-		Reveal.up();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'up() goes to prev fragment' );
-	});
-
-	test( 'Stepping past fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 0, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when on previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 3, 'all fragments visible when on future slide' );
-	});
-
-	test( 'Fragment indices', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(2)' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 2, 'both fragments of same index are shown' );
-	});
-
-	test( 'Index generation', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		// These have no indices defined to start with
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '2' );
-	});
-
-	test( 'Index normalization', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(3)' );
-
-		// These start out as 1-4-4 and should normalize to 0-1-1
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '1' );
-	});
-
-	asyncTest( 'fragmentshown event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmentshown', _onEvent );
-
-		Reveal.slide( 2, 0 );
-		Reveal.slide( 2, 0 ); // should do nothing
-		Reveal.slide( 2, 0, 0 ); // should do nothing
-		Reveal.next();
-		Reveal.next();
-		Reveal.prev(); // shouldn't fire fragmentshown
-
-		start();
-
-		Reveal.removeEventListener( 'fragmentshown', _onEvent );
-	});
-
-	asyncTest( 'fragmenthidden event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmenthidden', _onEvent );
-
-		Reveal.slide( 2, 0, 2 );
-		Reveal.slide( 2, 0, 2 ); // should do nothing
-		Reveal.prev();
-		Reveal.prev();
-		Reveal.next(); // shouldn't fire fragmenthidden
-
-		start();
-
-		Reveal.removeEventListener( 'fragmenthidden', _onEvent );
-	});
-
-
-	// ---------------------------------------------------------------
-	// CONFIGURATION VALUES
-
-	QUnit.module( 'Configuration' );
-
-	test( 'Controls', function() {
-		var controlsElement = document.querySelector( '.reveal>.controls' );
-
-		Reveal.configure({ controls: false });
-		equal( controlsElement.style.display, 'none', 'controls are hidden' );
-
-		Reveal.configure({ controls: true });
-		equal( controlsElement.style.display, 'block', 'controls are visible' );
-	});
-
-	test( 'Progress', function() {
-		var progressElement = document.querySelector( '.reveal>.progress' );
-
-		Reveal.configure({ progress: false });
-		equal( progressElement.style.display, 'none', 'progress are hidden' );
-
-		Reveal.configure({ progress: true });
-		equal( progressElement.style.display, 'block', 'progress are visible' );
-	});
-
-	test( 'Loop', function() {
-		Reveal.configure({ loop: true });
-
-		Reveal.slide( 0, 0 );
-
-		Reveal.left();
-		notEqual( Reveal.getIndices().h, 0, 'looped from start to end' );
-
-		Reveal.right();
-		equal( Reveal.getIndices().h, 0, 'looped from end to start' );
-
-		Reveal.configure({ loop: false });
-	});
-
-
-	// ---------------------------------------------------------------
-	// EVENT TESTS
-
-	QUnit.module( 'Events' );
-
-	asyncTest( 'slidechanged', function() {
-		expect( 3 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'slidechanged', _onEvent );
-
-		Reveal.slide( 1, 0 ); // should trigger
-		Reveal.slide( 1, 0 ); // should do nothing
-		Reveal.next(); // should trigger
-		Reveal.slide( 3, 0 ); // should trigger
-		Reveal.next(); // should do nothing
-
-		start();
-
-		Reveal.removeEventListener( 'slidechanged', _onEvent );
-
-	});
-
-	asyncTest( 'paused', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'paused', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'paused', _onEvent );
-	});
-
-	asyncTest( 'resumed', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'resumed', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'resumed', _onEvent );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/ETH14/_support/template.reveal b/docs/slides/ETH14/_support/template.reveal
deleted file mode 100644
--- a/docs/slides/ETH14/_support/template.reveal
+++ /dev/null
@@ -1,128 +0,0 @@
-<!doctype html>  
-<html lang="en">
-	
-<head>
-<meta charset="utf-8">
-
-<title>Liquid Types</title>
-
-<meta name="description" content="Liquid Types IHP 2014">
-<meta name="author" content="Ranjit Jhala">
-
-<meta name="apple-mobile-web-app-capable" content="yes" />
-
-<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
-
-<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
-
-<link rel="stylesheet" href="$reveal$/css/reveal.css">
-<link rel="stylesheet" href="$reveal$/css/theme/seminar.css" id="theme">
-<!-- <link rel="stylesheet" href="$reveal$/css/print/pdf.css"> -->
-<link rel="stylesheet" href="../_support/liquidhaskell.css">
-
-<!-- For syntax highlighting -->
-<link rel="stylesheet" href="$reveal$/lib/css/zenburn.css">
-
-<script>
-	// If the query includes 'print-pdf' we'll use the PDF print sheet
-	document.write( '<link rel="stylesheet" href="$reveal$/css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
-</script>
-
-<!--[if lt IE 9]>
-<script src="lib/js/html5shiv.js"></script>
-<![endif]-->
-</head>
-<body>
-
-\(
-\require{color}
-\definecolor{kvcol}{RGB}{203,23,206}
-\definecolor{tycol}{RGB}{5,177,93}
-\definecolor{refcol}{RGB}{18,110,213}
-
-\newcommand{\quals}{\mathbb{Q}}
-\newcommand{\defeq}{\ \doteq\ }
-\newcommand{\subty}{\preceq}
-\newcommand{\True}{\mathit{True}}
-\newcommand{\Int}{\mathtt{Int}}
-\newcommand{\Nat}{\mathtt{Nat}}
-\newcommand{\Zero}{\mathtt{Zero}}
-\newcommand{\foo}[4]{{#1}^{#4} + {#2}^{#4} = {#3}^{#4}}
-\newcommand{\reft}[3]{\{\bindx{#1}{#2} \mid {#3}\}}
-\newcommand{\ereft}[3]{\bindx{#1}{\{#2 \mid #3\}}}
-\newcommand{\bindx}[2]{{#1}\!:\!{#2}}
-\newcommand{\reftx}[2]{\{{#1}\mid{#2}\}}
-\newcommand{\inferrule}[3][]{\frac{#2}{#3}\;{#1}}
-\newcommand{\kvar}[1]{\color{kvcol}{\mathbf{\kappa_{#1}}}}
-\newcommand{\llen}[1]{\mathtt{llen}(#1)}
-\)
-
-<div class="reveal">
-<!-- 
-Used to fade in a background when a specific slide state is reached
--->
-<div class="state-background"></div>
-
-<!-- Slides
-Any section element inside of this "slides" container is displayed as a slide
--->
-<div class="slides">
-<!-- Pandoc -->
-$if(title)$
-<section class="titlepage">
-<h1 class="title">$title$</h1>
-$for(author)$
-<h2 class="author">$author$</h2>
-$endfor$
-<h3 class="date">$date$</h3>
-</section>
-$endif$
-$body$
-<!-- End Pandoc -->
-
-</div>
-<!-- End Slides -->
-
-<!-- Presentation progress bar -->
-<div class="progress"><span></span></div>
-</div>
-
-<!-- Initialize reveal.js :: make settings changes here -->
-<script src="$reveal$/lib/js/head.min.js"></script>
-<script src="$reveal$/js/reveal.js"></script>
-
-<!-- ORIGINAL <script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-     -->
-
-<!-- LOCAL
-<script type="text/javascript" src="file:///Users/rjhala/research/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
--->
-
-<script type="text/javascript" src="$mathjax$/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-
-<script>		
-	// Full list of configuration options available here:
-	// https://github.com/hakimel/reveal.js#configuration
-	Reveal.initialize({
-		controls: true,
-		progress: true,
-		history: true,
-		center: false,
-        rollingLinks: false,
-        theme: Reveal.getQueryHash().theme || 'seminar', // available themes are in /css/theme
-		transition: Reveal.getQueryHash().transition || 'fade', // default/cube/page/concave/linear(2d)
-
-		// Optional libraries used to extend on reveal.js
-		dependencies: [
-			//{ src: '$reveal$/lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
-			{ src: '$reveal$/lib/js/classList.js', condition: function() { return !document.body.classList; } },
-			{ src: '$reveal$/lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-			{ src: '$reveal$/plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-		]
-	});
-</script>
-
-</body>
-</html>
diff --git a/docs/slides/ETH14/cleanup b/docs/slides/ETH14/cleanup
deleted file mode 100644
--- a/docs/slides/ETH14/cleanup
+++ /dev/null
@@ -1,1 +0,0 @@
-find . | grep -E -e '\.(smt2|bak|json|css|md|hi|out|fqout|fq|o|err|annot|log|html|cgi|liquid)$' | xargs rm -rf
diff --git a/docs/slides/ETH14/img/RedBlack.png b/docs/slides/ETH14/img/RedBlack.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/RedBlack.png and /dev/null differ
diff --git a/docs/slides/ETH14/img/minindex-classic.png b/docs/slides/ETH14/img/minindex-classic.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/minindex-classic.png and /dev/null differ
diff --git a/docs/slides/ETH14/img/minindex-invariant.png b/docs/slides/ETH14/img/minindex-invariant.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/minindex-invariant.png and /dev/null differ
diff --git a/docs/slides/ETH14/img/minindex-modern.png b/docs/slides/ETH14/img/minindex-modern.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/minindex-modern.png and /dev/null differ
diff --git a/docs/slides/ETH14/img/minindex-reduce.png b/docs/slides/ETH14/img/minindex-reduce.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/minindex-reduce.png and /dev/null differ
diff --git a/docs/slides/ETH14/img/tension0.png b/docs/slides/ETH14/img/tension0.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/tension0.png and /dev/null differ
diff --git a/docs/slides/ETH14/img/tension1.png b/docs/slides/ETH14/img/tension1.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/tension1.png and /dev/null differ
diff --git a/docs/slides/ETH14/img/tension2.png b/docs/slides/ETH14/img/tension2.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/tension2.png and /dev/null differ
diff --git a/docs/slides/ETH14/img/tension3.png b/docs/slides/ETH14/img/tension3.png
deleted file mode 100644
Binary files a/docs/slides/ETH14/img/tension3.png and /dev/null differ
diff --git a/docs/slides/ETH14/lhs/00_Motivation.lhs b/docs/slides/ETH14/lhs/00_Motivation.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/00_Motivation.lhs
+++ /dev/null
@@ -1,243 +0,0 @@
- {#asds}
-========
-
-Algorithmic Verification 
-------------------------
-
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-<br>
-<br>
-
-**Goal**
-
-<br>
-
-Automatically Proving Properties of Programs 
-
-Algorithmic Verification
-========================
-
-A Classic Example 
------------------
-
-<img src="../img/minindex-classic.png" height=300px>
-
-**Verify:** indices `i`, `min` are *within bounds* of `arr`
-
-A Classic Example 
------------------
-
-<img src="../img/minindex-classic.png" height=300px>
-
-Easy, use Program **Logic** + **Analysis**
-
-Program Logic 
--------------
-
-<img src="../img/minindex-invariant.png" height=300px>
-
--------------------   ----------------------------------------------------
-**Specification**     *Predicates* eg. invariants, pre-/post-conditions
-**Verification**      *Conditions* checked by SMT solver
--------------------   ----------------------------------------------------
-
-Program Logic 
--------------
-
-<br>
-
--------------------   ----------------------------------------------------
-**Specification**     *Predicates* eg. invariants, pre-/post-conditions
-**Verification**      *Conditions* checked by SMT solver
--------------------   ----------------------------------------------------
-
-<br>
-
-No invariants? **Inference** via Analysis...
-
-Program Analysis 
-----------------
-
-<br>
-
-**Invariants are Fixpoints of Reachable States**
-
-<br>
-
-Computable via *Dataflow Analysis* or *Abstract Interpretation*
-
-<br>
-
-Logic + Analysis 
-----------------
-
-<br>
-
--------------------   ----------------------------------------------------
-**Specification**     *Predicates*, eg. invariants, pre-/post-conditions
-**Verification**      *Conditions* checked by SMT solver
-**Inference**         *Fixpoint* over abstract domain
--------------------   ----------------------------------------------------
-
-<br>
-
-<div class="fragment">
-But ... limited to "classical" programs!
-</div>
-
-
-"Classical" vs. "Modern" Programs
-=================================
-
-
- {#classicalvmodern}
---------------------
-
-
-"Classical" Programs
---------------------
-
-<br>
-
-<div class="fragment">
-**Imperative**
-
-Assignments, Branches, Loops
-</div>
-
-<br>
-
-<div class="fragment">
-**First-Order Functions**
-
-Recursion 
-</div>
-
-<br>
-
-<div class="fragment">
-**Objects**
-
-Classes, Inheritance*
-</div>
-
-
-"Modern" Programs
------------------
-
-
-<div class="fragment">
-**Containers**
-
-Arrays, Lists, HashMaps,...
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Polymorphism**
-
-Generics, Typeclasses...
-</div>
-
-<br>
-
-<div class="fragment">
-**Higher Order Functions**
-
-Callbacks, map, reduce, filter,...
-</div>
-
-
-A "Modern" Example 
-------------------
-
-<img src="../img/minindex-modern.png" height=300px>
-
-Verify indices `i`, `min` are *within bounds* of `arr`
-
-A "Modern" Example 
-------------------
-
-<img src="../img/minindex-modern.png" height=300px>
-
-Pose vexing challenges for Logic + Analysis
-
-Logic + Analysis Challenges
-----------------------------
-
-<img src="../img/minindex-modern.png" height=250px>
-
-+ How to analyze **unbounded** contents of `arr`?
-+ <div class="fragment">How to **summarize** `reduce` independent of `callback`?</div>
-+ <div class="fragment">How to precisely reuse summary at each **context** ?</div>
-
-
- {#motiv}
-=========
-
-Logic + Analysis + *Types*
---------------------------
-
-
-Logic + Analysis + *Types*
-==========================
-
-
-Refinement Types
-----------------
-
-<br>
-
-Use **Types** to lift **Logic + Analysis** to Modern Programs 
-
-<br>
-
-<div class="fragment">
-
------   ----   ---   ----   -------------------   -------------------------------------------
-                            **Specification**     *Types* + Predicates 
-                            **Verification**      *Subtyping* + Verification Conditions
-                            **Inference**         *Type Inference* + Abstract Interpretation
------   ----   ---   ----   -------------------   -------------------------------------------
-
-<br>
-<br>
-
-[[continue]](01_SimpleRefinements.lhs.slides.html)
-
-</div>
-
-Refinement Types
-----------------
-
-
-
-<br>
-<br>
-
-Plan 
-----
-
-+ <a href="01_SimpleRefinements.lhs.slides.html" target="_blank">Refinements</a>
-+ <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-+ <div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target= "_blank">Higher-Order Functions</a></div>
-+ <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements:</a><a href="06_Inductive.lhs.slides.html" target="_blank">Code</a>,<a href="07_Array.lhs.slides.html" target= "_blank">Data</a></div>
-+ <div class="fragment"><a href="11_Evaluation.lhs.slides.html" target="_blank">Evaluation</a></div>
-+ <div class="fragment"><a href="12_Conclusion.lhs.slides.html" target="_blank">Conclusion</a></div>
-
-<br>
-<br>
-
-
-
-<div class="fragment">[[continue...]](01_SimpleRefinements.lhs.slides.html)</div>
diff --git a/docs/slides/ETH14/lhs/01_SimpleRefinements.lhs b/docs/slides/ETH14/lhs/01_SimpleRefinements.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/01_SimpleRefinements.lhs
+++ /dev/null
@@ -1,831 +0,0 @@
- {#simplerefinements}
-=======================
-
-Simple Refinement Types
------------------------
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-module SimpleRefinements where
-import Language.Haskell.Liquid.Prelude
-import Prelude hiding (abs, max)
-
--- boring haskell type sigs
-zero    :: Int
-zero'   :: Int
-safeDiv :: Int -> Int -> Int
-abs     :: Int -> Int
-nats    :: L Int
-range   :: Int -> Int -> L Int
-\end{code}
-
-</div>
-
-
-Simple Refinement Types
-=======================
-
-
-Types + Predicates 
-------------------
-
-
-Example: Integers equal to `0`
-------------------------------
-
-<br>
-
-\begin{code}
-{-@ type Zero = {v:Int | v = 0} @-}
-
-{-@ zero :: Zero @-}
-zero     =  0
-\end{code}
-
-<br>
-
-<div class="fragment">
-Refinement types via special comments `{-@ ... @-}` 
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo</a> 
-</div>
-
-
-
-Refinements Are Predicates
-==========================
-
-From A Decidable Logic
-----------------------
-
-<br> 
-
-1. Expressions
-
-2. Predicates
-
-<br>
-
-<div class="fragment">
-
-**Refinement Logic: QF-UFLIA**
-
-Quant.-Free. Uninterpreted Functions and Linear Arithmetic 
-
-</div>
-
-
-Expressions
------------
-
-<br>
-
-\begin{spec} <div/> 
-e := x, y, z,...    -- variable
-   | 0, 1, 2,...    -- constant
-   | (e + e)        -- addition
-   | (e - e)        -- subtraction
-   | (c * e)        -- linear multiplication
-   | (f e1 ... en)  -- uninterpreted function
-\end{spec}
-
-Predicates
-----------
-
-<br>
-
-\begin{spec} <div/>
-p := e           -- atom 
-   | e1 == e2    -- equality
-   | e1 <  e2    -- ordering 
-   | (p && p)    -- and
-   | (p || p)    -- or
-   | (not p)     -- negation
-\end{spec}
-
-<br>
-
-
-Refinement Types
-----------------
-
-
-<br>
-
-\begin{spec}<div/>
-b := Int 
-   | Bool 
-   | ...         -- base types
-   | a, b, c     -- type variables
-
-t := {x:b | p}   -- refined base 
-   | x:t -> t    -- refined function  
-\end{spec}
-
-
-Subtyping Judgment 
-------------------
-
-<br>
-
-$$\boxed{\Gamma \vdash t_1 \preceq t_2}$$
-
-<div class="fragment">
-
-<br>
-
-Where **environment** $\Gamma$ is a sequence of binders
-
-<br>
-
-$$\Gamma \defeq \overline{\bindx{x_i}{t_i}}$$
-
-</div>
-
-Subtyping is Implication
-------------------------
-
-<br>
-
-[PVS' Predicate Subtyping](http://pvs.csl.sri.com/papers/subtypes98/tse98.pdf)
-
-<br>
-
-(For **Base** Types ...)
-
-
-
-
-Subtyping is Implication
-------------------------
-
-<br>
-
-$$
-\begin{array}{rl}
-{\mathbf{If\ VC\ is\ Valid}}   & \bigwedge_i P_i \Rightarrow  Q  \Rightarrow R \\
-                & \\
-{\mathbf{Then}} & \overline{\bindx{x_i}{P_i}} \vdash \reft{v}{b}{Q} \subty \reft{v}{b}{R} \\
-\end{array}
-$$ 
-
-
-Example: Natural Numbers
-------------------------
-
-<br>
-
-\begin{spec} <div/>  
-        type Nat = {v:Int | 0 <= v}
-\end{spec}
-
-<br>
-
-<div class="fragment">
-
-$$
-\begin{array}{rcrccll}
-\mathbf{VC\ is\ Valid:} & \True     & \Rightarrow &  v = 0   & \Rightarrow &  0 \leq v & \mbox{(by SMT)} \\
-%                &           &             &          &             &           \\
-\mathbf{So:}      & \emptyset & \vdash      & \Zero  & \subty      & \Nat   &   \\
-\end{array}
-$$
-</div>
-
-<br>
-
-<div class="fragment">
-
-Hence, we can type:
-
-\begin{code}
-{-@ zero' :: Nat @-}
-zero'     =  zero   -- zero :: Zero <: Nat
-\end{code}
-</div>
-
-Contracts: Function Types
-=========================
-
- {#as}
-------
-
-Pre-Conditions
---------------
-
-
-<br>
-
-\begin{code}
-safeDiv n d = n `div` d   -- crashes if d==0
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Requires** non-zero input divisor `d`
-
-\begin{code}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-\end{code}
-</div>
-
-<br>
-
-
-<div class="fragment">
-Specify pre-condition as **input type** 
-
-\begin{code}
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{code}
-
-</div>
-
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code}
-{-@ bad :: Nat -> Int @-}
-bad n   = 10 `safeDiv` n
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Rejected As** 
-
-$$\bindx{n}{\Nat} \vdash \reftx{v}{v = n} \not \subty \reftx{v}{v \not = 0}$$
-
-</div>
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code}
-{-@ ok  :: Nat -> Int @-}
-ok n    = 10 `safeDiv` (n+1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Verifies As** 
-
-$\bindx{n}{\Nat} \vdash \reftx{v}{v = n+1} \subty \reftx{v}{v \not = 0}$
-</div>
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{spec} <div/>
-{-@ ok  :: Nat -> Int @-}
-ok n    = 10 `safeDiv` (n+1)
-\end{spec}
-
-<br>
-
-**Verifies As**
-
-$$(0 \leq n) \Rightarrow (v = n+1) \Rightarrow (v \not = 0)$$
-
-
-
-Post-Conditions
----------------
-
-**Ensures** output is a `Nat` greater than input `x`.
-
-\begin{code}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{code}
-
-<br>
-
-<div class="fragment">
-Specify post-condition as **output type**
-
-\begin{code}
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-**Dependent Function Types**
-
-Outputs *refer to* inputs
-</div>
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-Postcondition is checked at **return-site**
-
-<br>
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-**Verified As**
-
-<br>
-
-$$\begin{array}{rll}
-\bindx{x}{\Int},\bindx{\_}{0 \leq x}      & \vdash \reftx{v}{v = x}     & \subty \reftx{v}{0 \leq v \wedge x \leq v} \\
-\bindx{x}{\Int},\bindx{\_}{0 \not \leq x} & \vdash \reftx{v}{v = 0 - x} & \subty \reftx{v}{0 \leq v \wedge x \leq v} \\
-\end{array}$$
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-**Verified As**
-
-<br>
-
-$$\begin{array}{rll}
-(0 \leq x)      & \Rightarrow (v = x)     & \Rightarrow (0 \leq v \wedge x \leq v) \\
-(0 \not \leq x) & \Rightarrow (v = 0 - x) & \Rightarrow (0 \leq v \wedge x \leq v) \\
-\end{array}$$
-
-
- {#inference}
-=============
-
-From Checking To Inference
---------------------------
-
-<br>
-<br>
-
-**So far**
-
-How to **check** code against given signature
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-How to **infer** signatures from code
-
-</div>
-
-From Checking To Inference
---------------------------
-
-<br>
-<br>
-
-
-**2-Phase Process**
-
-<div class="fragment">
-
-<br>
-
-1. Hindley-Milner infers **types**
-2. Abstract Interpr. infers **refinements**  
-
-</div>
-
-<br>
-
-<div class="fragment">Lets quickly look at 2. </div>
-
-
-
-From Checking To Inference
-==========================
-
-
-Recipe
-------
-
-<br>
-
-<div class="fragment">
-
-**Step 1. Templates**
-
-Types with variables $\kvar{}$ for *unknown* refinements
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Step 2. Constraints**
-
-Typecheck templates: VCs $\rightarrow$ Horn *constraints* over $\kvar{}$
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Step 3. Solve**
-
-Via *least-fixpoint* over suitable abstract domain
-
-</div>
-
-Step 1. Templates (`abs`)
--------------------------
-
-<br>
-
-<div class="fragment">
-**Type**
-
-$$\bindx{x}{\Int} \rightarrow \Int$$
-</div>
-
-<br>
-
-<div class="fragment">
-**Template**
-
-$$\ereft{x}{\Int}{\kvar{1}} \rightarrow \reft{v}{\Int}{\kvar{2}}$$
-</div>
-
-Step 2. Constraints (`abs`)
--------------------------
-
-<br>
-
-Step 2. Constraints (`abs`)
--------------------------
-
-<br>
-
-**Subtyping Queries**
-
-<br>
-
-$$
-\begin{array}{rll}
-\bindx{x}{\kvar{1}},\bindx{\_}{0 \leq x}      & \vdash \reftx{v}{v = x}     & \subty \reftx{v}{\kvar{2}} \\
-\bindx{x}{\kvar{1}},\bindx{\_}{0 \not \leq x} & \vdash \reftx{v}{v = 0 - x} & \subty \reftx{v}{\kvar{2}} \\
-\end{array}
-$$
-
-Step 2. Constraints (`abs`)
--------------------------
-
-<br>
-
-**Verification Conditions**
-
-<br>
-
-$$\begin{array}{rll}
-{\kvar{1}} \wedge (0 \leq x)      & \Rightarrow (v = x)     & \Rightarrow \kvar{2} \\
-{\kvar{1}} \wedge (0 \not \leq x) & \Rightarrow (v = 0 - x) & \Rightarrow \kvar{2} \\
-\end{array}$$
-
-
-Step 2. Constraints (`abs`)
--------------------------
-
-<br>
-
-**Horn Constraints** over $\kvar{}$
-
-<br>
-
-$$\begin{array}{rll}
-{\kvar{1}} \wedge (0 \leq x)      & \Rightarrow (v = x)     & \Rightarrow \kvar{2} \\
-{\kvar{1}} \wedge (0 \not \leq x) & \Rightarrow (v = 0 - x) & \Rightarrow \kvar{2} \\
-\end{array}$$
-
-<br>
-<br>
-
-**Note:** $\kvar{}$ occur positively, hence constraints are monotone.
-
-Step 3. Solve (`abs`)
----------------------
-
-<br>
-
-Least-fixpoint over abstract domain 
-
-<br>
-
-Step 3. Solve (`abs`)
----------------------
-
-**Predicate Abstraction**
-
-Conjunction of predicates from (finite) ground set $\quals$
-
-<br>
-
-<div class="fragment">
-$$\mbox{e.g.}\ \quals \defeq \{ c \sim X \}$$
-
-<br>
-
-$$\begin{array}{ccll}
-  c     & \in & \{0,1,\ldots   \}                & \mbox{program constants} \\
-  X     & \in & \{n,x,v,\ldots \}                & \mbox{program variables} \\
-  \sim  & \in & \{<, \leq, >, \geq, =, \not =\}  & \mbox{comparisons}       \\
-  \end{array}$$
-
-</div>
-
-Step 3. Solve (`abs`)
----------------------
-
-Least-fixpoint over abstract domain 
-
-<br>
-
-**Predicate Abstraction**
-
-Conjunction of predicates from (finite) ground set $\quals$
-
-<br>
-
-+ Obtain $\quals$ via CEGAR
-+ Or use other domains
-
-<br>
-
-[[Houdini](http://dl.acm.org/citation.cfm?id=730008), [HMC](http://goto.ucsd.edu/~rjhala/papers/hmc.html)]
-
-
-Recipe Scales Up
-----------------
-
-<br>
-
-**1. Templates** $\rightarrow$ **2. Horn Constraints** $\rightarrow$ **3. Fixpoint**
-
-<br>
-
-<div class="fragment">
-+ Define type *checker* and get *inference* for free 
-
-+ Scales to Collections, HOFs, Polymorphism
-
-</div>
-<br>
-
-<div class="fragment">
-**Next:** Collections
-</div>
-
-<!--
-<div class="fragment">
-**Key Requirement** 
-
-Refinements belong in abstract domain, e.g. QF-UFLIA
-</div>
--->
-
-
- {#universalinvariants}
-=======================
-
-Types = Universal Invariants
-----------------------------
-
-(Notoriously hard with *pure* SMT)
-
-Types Yield Universal Invariants
-================================
-
-Example: Lists
---------------
-
-
-<div class="hidden">
-\begin{code}
-infixr `C`
-\end{code}
-</div>
-
-
-<br>
-
-
-\begin{code}
-data L a = N          -- Empty 
-         | C a (L a)  -- Cons 
-\end{code}
-
-
-<br>
-
-<div class="fragment">
-
-How to **specify** every element in `nats` is non-negative?
-
-\begin{code}
-nats     =  0 `C` 1 `C` 3 `C` N
-\end{code}
-</div>
-
-
-Example: Lists
---------------
-
-<br>
-
-How to **specify** every element in `nats` is non-negative?
-
-\begin{spec} 
-nats     =  0 `C` 1 `C` 2 `C` N
-\end{spec}
-
-<br>
-
-**Logic**
-
-$$\forall x \in \mathtt{nats}. 0 \leq x$$
-
-<br>
-
-<div class="fragment">
-VCs over **quantified formulas** ... *challenging* for SMT
-</div>
-
-
-Example: Lists
---------------
-
-<br>
-
-How to **specify** every element in `nats` is non-negative?
-
-\begin{spec} 
-nats     =  0 `C` 1 `C` 2 `C` N
-\end{spec}
-
-<br>
-
-**Refinement Types**
-
-\begin{code}
-{-@ nats :: L Nat @-}
-\end{code}
-
-<br>
-
-+ <div class="fragment">Type *implicitly* has quantification</div>
-+ <div class="fragment">Sub-typing *eliminates* quantifiers</div>
-+ <div class="fragment">Robust verification via *quantifier-free* VCs</div>
-
-Example: Lists
---------------
-
-How to **verify** ? 
-
-\begin{spec} <div/>
-{-@ nats :: L Nat @-}
-nats   = l0
-  where
-    l0 = 0 `C` l1  -- Nat `C` L Nat >>> L Nat
-    l1 = 1 `C` l2  -- Nat `C` L Nat >>> L Nat
-    l2 = 2 `C` l3  -- Nat `C` L Nat >>> L Nat
-    l3 = N         -- L Nat
-\end{spec}
-
-<br>
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s **between** `i` and `j`
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s **between** `i` and `j`
-
-<br>
-
-\begin{code}
-{-@ type Btwn I J = { v:_ | I<=v && v<J } @-}
-\end{code}
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-<br>
-
-\begin{code}
-{-@ range :: i:Int -> j:Int -> L (Btwn i j) @-}
-range i j            = go i
-  where
-    go n | n < j     = n `C` go (n + 1)  
-         | otherwise = N
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Note:** Type of `go` is automatically inferred
-</div>
-
-
-Example: Indexing Into List
----------------------------
-
-\begin{code} 
-(!)          :: L a -> Int -> a
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "Oops!"
-\end{code}
-
-<br>
-
-<div class="fragment">(Mouseover to view type of `liquidError`)</div>
-
-<br>
-
-<div class="fragment">To ensure safety, *require* `i` between `0` and list **length**</div>
-
-<br>
-
-<div class="fragment">Need way to **measure** the length of a list [[continue...]](02_Measures.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/ETH14/lhs/02_Measures.lhs b/docs/slides/ETH14/lhs/02_Measures.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/02_Measures.lhs
+++ /dev/null
@@ -1,309 +0,0 @@
-
- {#measures}
-============
-
-Measuring Data Types
---------------------
-
-<div class="hidden">
-
-\begin{code}
-
-{-# LIQUID "--no-termination" #-}
-{-# LIQUID "--full" #-}
-
-module Measures where
-import Prelude hiding ((!!), length)
-import Language.Haskell.Liquid.Prelude
-
-
-length      :: L a -> Int
-(!)         :: L a -> Int -> a
-insert      :: Ord a => a -> L a -> L a
-insertSort  :: Ord a => [a] -> L a
-
-infixr `C`
-\end{code}
-
-</div>
-
-
-Measuring Data Types 
-====================
-
-Recap
------
-
-1. <div class="fragment">**Refinements:** Types + Predicates</div>
-2. <div class="fragment">**Subtyping:** SMT Implication</div>
-
-
-Example: Length of a List 
--------------------------
-
-Given a type for lists:
-
-<br>
-
-\begin{code}
-data L a = N | C a (L a)
-\end{code}
-
-<div class="fragment">
-<br>
-
-We can define the **length** as:
-
-<br>
-
-\begin{code}
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-\end{code}
-
-<div class="hidden">
-
-\begin{code}
-{-@ data L [llen] a = N | C {hd :: a, tl :: L a } @-}
-{-@ invariant {v: L a | 0 <= llen v}              @-} 
-\end{code}
-
-</div>
-
-Example: Length of a List 
--------------------------
-
-\begin{spec}
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + llen xs  @-}
-\end{spec}
-
-<br>
-
-We **strengthen** data constructor types
-
-<br>
-
-\begin{spec} <div/>
-data L a where 
-  N :: {v: L a | (llen v) = 0}
-  C :: a -> t:_ -> {v:_| llen v = 1 + llen t}
-\end{spec}
-
-Measures Are Uninterpreted
---------------------------
-
-\begin{spec} <br>
-data L a where 
-  N :: {v: L a | (llen v) = 0}
-  C :: a -> t:_ -> {v:_| llen v = 1 + llen t}
-\end{spec}
-
-<br>
-
-`llen` is an **uninterpreted function** in SMT logic
-
-Measures Are Uninterpreted
---------------------------
-
-<br>
-
-In SMT, [uninterpreted function](http://fm.csl.sri.com/SSFT12/smt-euf-arithmetic.pdf) $f$ obeys **congruence** axiom:
-
-<br>
-
-$$\forall \overline{x}, \overline{y}. \overline{x} = \overline{y} \Rightarrow
-f(\overline{x}) = f(\overline{y})$$
-
-<br>
-
-<div class="fragment">
-Other properties of `llen` asserted when typing **fold** & **unfold**
-</div>
-
-<br>
-
-<div class="fragment">
-Crucial for *efficient*, *decidable* and *predictable* verification.
-</div>
-
-Measures Are Uninterpreted
---------------------------
-
-Other properties of `llen` asserted when typing **fold** & **unfold**
-
-<br>
-
-<div class="fragment">
-\begin{spec}**Fold**<br>
-z = C x y     -- z :: {v | llen v = 1 + llen y}
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{spec}**Unfold**<br>
-case z of 
-  N     -> e1 -- z :: {v | llen v = 0}
-  C x y -> e2 -- z :: {v | llen v = 1 + llen y}
-\end{spec}
-</div>
-
-
-Measured Refinements
---------------------
-
-Now, we can verify:
-
-<br>
-
-\begin{code}
-{-@ length      :: xs:L a -> EqLen xs @-}
-length N        = 0
-length (C _ xs) = 1 + length xs
-\end{code}
-
-<div class="fragment">
-
-<br>
-
-Where `EqLen` is a type alias:
-
-\begin{code}
-{-@ type EqLen Xs = {v:Nat | v = llen Xs} @-}
-\end{code}
-
-</div>
-
-List Indexing Redux
--------------------
-
-We can type list lookup:
-
-\begin{code}
-{-@ (!)      :: xs:L a -> LtLen xs -> a @-}
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "never happens!"
-\end{code}
-
-<br>
-
-<div class="fragment">
-Where `LtLen` is a type alias:
-
-\begin{code}
-{-@ type LtLen Xs = {v:Nat | v < llen Xs} @-}
-\end{code}
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellMeasure.hs" target= "_blank">Demo:</a> 
-&nbsp; What if we *remove* the precondition?
-
-</div>
-
-Multiple Measures
------------------
-
-<br>
-
-**Multiple** measures by **conjoining** refinements.
-
-<br>
-
-<div class="fragment">
-
-e.g. Red Black Tree
-
-+ Height
-+ Color
-+ Nodes, etc.
-
-<br>
-
-Refined Data Constructors
-=========================
-
- {#refined-data-cons}
----------------------
-
-Can encode *other* invariants **inside constructors**
-
-<div class="fragment">
-
-<br>
-
-\begin{code}
-{-@ data L a = N
-             | C { x  :: a 
-                 , xs :: L {v:a| x <= v} } @-}
-\end{code}
-</div>
-<br>
-
-<div class="fragment">
-Head `x` is less than **every** element of tail `xs`
-</div>
-
-<br>
-
-<div class="fragment">
-i.e. specifies **increasing** Lists 
-</div>
-
-Increasing Lists 
-----------------
-
-\begin{spec} <br>
-data L a where
-  N :: L a
-  C :: x:a -> xs: L {v:a | x <= v} -> L a
-\end{spec}
-
-<br>
-
-- <div class="fragment">We **check** property when **folding** `C`</div>
-- <div class="fragment">We **assume** property when **unfolding** `C`</div>
-
-Increasing Lists 
-----------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellInsertSort.hs" target= "_blank">Demo: Insertion Sort</a> (hover for inferred types) 
-
-<br>
-
-\begin{code}
-insertSort xs = foldr insert N xs
-
-insert y (x `C` xs) 
-  | y <= x    = y `C` (x `C` xs)
-  | otherwise = x `C` insert y xs
-insert y N    = y `C` N    
-\end{code}
-
-<br>
-
-Recap
------
-
-<br>
-<br>
-
-
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. **Measures:** Strengthened Constructors
-
-<br>
-
-<div class="fragment">Logic + Analysis for Collections</div>
-
-<br>
-<br>
-
-<div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target="_blank">[continue]</a></div>
diff --git a/docs/slides/ETH14/lhs/03_HigherOrderFunctions.lhs b/docs/slides/ETH14/lhs/03_HigherOrderFunctions.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/03_HigherOrderFunctions.lhs
+++ /dev/null
@@ -1,276 +0,0 @@
-  {#hofs}
-=========
-
-<div class="hidden">
-\begin{code}
-module Loop (
-    listSum
-  , sumNats
-  ) where
-
-import Prelude
-
-{-@ LIQUID "--no-termination"@-}
-sumNats  :: [Int] -> Int
-add         :: Int -> Int -> Int
-\end{code}
-</div>
-
-Higher-Order Functions 
-----------------------
-
-Types scale to *Higher-Order Functions*  
-
-<br>
-
-<div class="fragment">
-
-+ map
-+ fold
-+ visitors
-+ callbacks
-+ ...
-
-</div>
-
-<br>
-
-<div class="fragment">Difficult with *first-order program logics*</div>
-
-
-Higher Order Specifications 
-===========================
-
-Example: Higher Order Loop
---------------------------
-
-<br>
-
-\begin{code}
-loop :: Int -> Int -> α -> (Int -> α -> α) -> α
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-By subtyping, we infer `f` called with values `(Btwn lo hi)`
-
-
-Example: Summing Lists
-----------------------
-
-\begin{code}
-listSum xs     = loop 0 n 0 body 
-  where 
-    body i acc = acc + (xs !! i)
-    n          = length xs
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Function Subtyping** 
-
-\begin{spec}
-loop :: l -> h -> α -> (Btwn l h -> α -> α) -> α
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-At callsite, since `l := 0` and `h := llen xs` 
-
-\begin{spec}
-body :: Btwn 0 (llen xs) -> Int -> Int
-\end{spec}
-</div>
-
-Example: Summing Lists
-----------------------
-
-\begin{spec}
-listSum xs     = loop 0 n 0 body 
-  where 
-    body i acc = acc + (xs !! i)
-    n          = length xs
-\end{spec}
-
-<br>
-
-**Function Subtyping** 
-
-\begin{spec}
-body :: Btwn 0 (llen xs) -> Int -> Int
-\end{spec}
-
-<br>
-
-So `i` is `Btwn 0 (llen xs)`; indexing `!!` is verified safe.
-
-
- {#polyinst}
-============
-
-Polymorphic Instantiation
--------------------------
-
-<br>
-<br>
-<br>
-
-<div class="fragment">
-"Plugging in" summaries at call-sites
-</div>
-
-Polymorphic Instantiation
-=========================
-
- {#poly}
---------
-
-Example: Summing `Nat`s
------------------------
-
-\begin{code}
-{-@ sumNats :: [Nat] -> Nat @-}
-sumNats xs  = foldl (+) 0 xs 
-\end{code}
-
-<br>
-
-<div class="fragment">
-\begin{spec} Recall 
-foldl :: (α -> β -> α) -> α -> [β] -> α
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-How to **instantiate** `α` and `β` ?
-</div>
-
-Function Subtyping
-------------------
-
-\begin{spec}<div/>
-(+) ::  x:Int -> y:Int -> {v:Int|v=x+y} 
-    <:  Nat   -> Nat   -> Nat
-\end{spec}
-
-<br>
-
-<div class="fragment">
-Because,
-
-\begin{spec}<div/>
-             |- Nat       <: Int  -- Contra (in)
-x:Nat, y:Nat |- {v = x+y} <: Nat  -- Co    (out)
-\end{spec}
-</div>
-
-<br>
-
-<div class="fragment">
-Because,
-
-\begin{spec}<div/>
-  0<=x && 0<=y && v = x+y   => 0 <= v
-\end{spec}
-</div>
-
-
-
-
-Example: Summing `Nat`s
------------------------
-
-\begin{spec} <div/> 
-{-@ sumNats :: [Nat] -> Nat @-}
-sumNats xs  = foldl (+) 0 xs 
-\end{spec}
-
-<br>
-
-\begin{spec} Where:
-foldl :: (α -> β -> α) -> α -> [β] -> α
-(+)   :: Nat -> Nat -> Nat
-\end{spec}
-
-<br>
-
-<div class="fragment">
-Hence, `sumNats` verified by **instantiating** `α,β := Nat`
-</div>
-
-<br>
-
-<div class="fragment">
-`α` is **loop invariant**, instantiation is invariant **inference**
-</div>
-
-Instantiation And Inference
----------------------------
-
-Polymorphism ubiquitous, so inference is critical!
-
-<br>
-
-<div class="fragment">
-**Step 1. Templates** 
-Instantiate with unknown refinements
-
-$$
-\begin{array}{rcl}
-\alpha & \defeq & \reft{v}{\Int}{\kvar{\alpha}}\\
-\beta  & \defeq & \reft{v}{\Int}{\kvar{\beta}}\\
-\end{array}
-$$
-</div>
-
-<br>
-<div class="fragment">
-**Step 2. Horn-Constraints** 
-By type checking the templates
-</div>
-
-<br>
-<div class="fragment">
-**Step 3. Fixpoint** 
-Abstract interpretation to get solution for $\kvar{}$
-</div>
-
-
-Iteration Dependence
---------------------
-
-**Problem:** Cannot use parametric polymorphism to verify
-
-<br>
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-As property only holds after **last iteration** ...
-
-<br>
-
-... cannot instantiate $\alpha \defeq \reft{v}{\Int}{v = n + m}$
-</div>
-
-<br>
-
-<div class="fragment">
-**Problem:** *Iteration-dependent* invariants...? &nbsp; &nbsp; [[Continue]](04_AbstractRefinements.lhs.slides.html)
-</div>
-
diff --git a/docs/slides/ETH14/lhs/04_AbstractRefinements.lhs b/docs/slides/ETH14/lhs/04_AbstractRefinements.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/04_AbstractRefinements.lhs
+++ /dev/null
@@ -1,285 +0,0 @@
-  {#abstractrefinements}
-========================
-
-<div class="hidden">
-
-\begin{code}
-module AbstractRefinements where
-
-import Prelude 
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
--- o,no        :: Int
-maxInt       :: Int -> Int -> Int
-\end{code}
-</div>
-
-
-
-Abstract Refinements
---------------------
-
-
-Abstract Refinements
-====================
-
-A Tricky Problem
-----------------
-
-<br>
-
-<div class="fragment">
-
-**Problem** 
-
-Require *context-dependent* invariants & summaries for HOFs.
-
-</div>
-
-<br>
-<br>
-
-<div class="fragment">
-
-**Example** 
-
-How to summarize *iteration-dependence* for higher-order `loop`?
-
-</div>
-
-
-
-
-Problem Is Pervasive
---------------------
-
-Lets distill it to a simple example...
-
-<div class="fragment">
-
-<br>
-
-(First, a few aliases)
-
-<br>
-
-\begin{code}
-{-@ type Odd  = {v:Int | (v mod 2) = 1} @-}
-{-@ type Even = {v:Int | (v mod 2) = 0} @-}
-\end{code}
-
-</div>
-
-
-Example: `maxInt` 
------------------
-
-Compute the larger of two `Int`s:
-
-\begin{spec} <br> 
-maxInt     :: Int -> Int -> Int 
-maxInt x y = if y <= x then x else y
-\end{spec}
-
-
-
-Example: `maxInt` 
------------------
-
-Has **many incomparable** refinement types/summaries
-
-\begin{spec}<br>
-maxInt :: Nat  -> Nat  -> Nat
-maxInt :: Even -> Even -> Even
-maxInt :: Odd  -> Odd  -> Odd 
-\end{spec}
-
-<br>
-
-<div class="fragment">*Which* should we use?</div>
-
-
-Refinement Polymorphism 
------------------------
-
-`maxInt` returns **one of** its two inputs `x` and `y` 
-
-<div class="fragment">
-
-<div align="center">
-
-<br>
-
----------   ---   -------------------------------------------
-   **If**    :    the *inputs* satisfy a property  
-
- **Then**    :    the *output* satisfies that property
----------   ---   -------------------------------------------
-
-<br>
-
-</div>
-</div>
-
-<div class="fragment">Above holds **for all properties**!</div>
-
-<br>
-
-<div class="fragment"> 
-
-**Need to abstract properties over types**
-
-</div>
-
-Parametric Refinements 
-----------------------
-
-Enable *quantification over refinements* ...
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">Type says: **for any** `p` that is a property of `Int`, </div>
-
-- <div class="fragment">`max` **takes** two `Int`s that satisfy `p`,</div>
-
-- <div class="fragment">`max` **returns** an `Int` that satisfies `p`.</div>
-
-Parametric Refinements 
-----------------------
-
-Enable *quantification over refinements* ...
-
-<br>
-
-\begin{spec}<div/>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{spec}
-
-<br>
-
-[Key idea: ](http://goto.ucsd.edu/~rjhala/papers/abstract_refinement_types.html)
-&nbsp; `Int<p>` &nbsp; is just  &nbsp; $\reft{v}{\Int}{p(v)}$ 
-
-<br>
-
-Abstract Refinement is **uninterpreted function** in SMT logic
-
-Parametric Refinements 
-----------------------
-
-\begin{spec}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{spec}
-
-<br>
-
-**Check Implementation via SMT**
-
-Parametric Refinements 
-----------------------
-
-\begin{spec}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{spec}
-
-<br>
-
-**Check Implementation via SMT**
-
-<br>
-
-$$\begin{array}{rll}
-\ereft{x}{\Int}{p(x)},\ereft{y}{\Int}{p(y)} & \vdash \reftx{v}{v = y} & \subty \reftx{v}{p(v)} \\
-\ereft{x}{\Int}{p(x)},\ereft{y}{\Int}{p(y)} & \vdash \reftx{v}{v = x} & \subty \reftx{v}{p(v)} \\
-\end{array}$$
-
-Parametric Refinements 
-----------------------
-
-\begin{spec}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{spec}
-
-<br>
-
-**Check Implementation via SMT**
-
-<br>
-
-$$\begin{array}{rll}
-{p(x)} \wedge {p(y)} & \Rightarrow {v = y} & \Rightarrow {p(v)} \\
-{p(x)} \wedge {p(y)} & \Rightarrow {v = x} & \Rightarrow {p(v)} \\
-\end{array}$$
-
-
-Using Abstract Refinements
---------------------------
-
-- <div class="fragment">**If** we call `maxInt` with args satisfying *common property*,</div>
-- <div class="fragment">**Then** `p` instantiated property, *result* gets same property.</div>
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ xo :: Odd  @-}
-xo = maxInt 3 7     -- p := \v -> Odd v 
-
-{-@ xe :: Even @-}
-xe = maxInt 2 8     -- p := \v -> Even v 
-\end{code}
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Infer Instantiation by Liquid Typing**
-
-At call-site, instantiate `p` with unknown $\kvar{p}$ and solve!
-</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. **Abstract Refinements** over Types
-
-<br>
-<br>
-
-<div class="fragment">
-  Abstract Refinements decouple invariants from **code** ...
-
-<br>
-
-<a href="06_Inductive.lhs.slides.html" target="_blank">[continue]</a>
-</div>
-
diff --git a/docs/slides/ETH14/lhs/05_Composition.lhs b/docs/slides/ETH14/lhs/05_Composition.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/05_Composition.lhs
+++ /dev/null
@@ -1,161 +0,0 @@
-Abstract Refinements {#composition}
-===================================
-
-Very General Mechanism 
-----------------------
-
-**Next:** Lets add parameters...
-
-<div class="hidden">
-\begin{code}
-module Composition where
-
-import Prelude hiding ((.))
-
-plus     :: Int -> Int -> Int
-plus3'   :: Int -> Int
-\end{code}
-</div>
-
-
-Example: `plus`
----------------
-
-\begin{code}
-{-@ plus :: x:_ -> y:_ -> {v:_ | v=x+y} @-}
-plus x y = x + y
-\end{code}
-
-
-Example: `plus 3` 
------------------
-
-<br>
-
-\begin{code}
-{-@ plus3' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3'     = plus 3
-\end{code}
-
-<br>
-
-Easily verified by LiquidHaskell
-
-A Composed Variant
-------------------
-
-Lets define `plus3` by *composition*
-
-A Composition Operator 
-----------------------
-
-\begin{code}
-(#) :: (b -> c) -> (a -> b) -> a -> c
-(#) f g x = f (g x)
-\end{code}
-
-
-`plus3` By Composition
------------------------
-
-\begin{code}
-{-@ plus3'' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3''     = plus 1 # plus 2
-\end{code}
-
-<br>
-
-Yikes! Verification *fails*. But why?
-
-<br>
-
-<div class="fragment">(Hover mouse over `#` for a clue)</div>
-
-How to type compose (#) ? 
--------------------------
-
-This specification is *too weak* <br>
-
-\begin{spec} <br>
-(#) :: (b -> c) -> (a -> b) -> (a -> c)
-\end{spec}
-
-<br>
-
-Output type does not *relate* `c` with `a`!
-
-How to type compose (.) ?
--------------------------
-
-Write specification with abstract refinement type:
-
-<br>
-
-\begin{code}
-{-@ (.) :: forall <p :: b->c->Prop, 
-                   q :: a->b->Prop>.
-             f:(x:b -> c<p x>) 
-          -> g:(x:a -> b<q x>) 
-          -> y:a -> exists[z:b<q y>].c<p z>
- @-}
-(.) f g y = f (g y)
-\end{code}
-
-Using (.) Operator 
-------------------
-
-<br>
-
-\begin{code}
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br>
-
-<div class="fragment">*Verifies!*</div>
-
-
-Using (.) Operator 
-------------------
-
-\begin{spec} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{spec}
-
-<br>
-
-LiquidHaskell *instantiates*
-
-- `p` with `\x -> v = x + 1`
-- `q` with `\x -> v = x + 2`
-
-Using (.) Operator 
-------------------
-
-\begin{spec} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{spec}
-
-<br> To *infer* that output of `plus3` has type: 
-
-`exists [z:{v = y + 2}].{v = z + 1}`
-
-<div class="fragment">
-
-`<:`
-
-`{v:Int|v=3}`
-</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract:** Refinements over Type Signatures
-    + <div class="fragment">*Dependencies* using refinement parameters</div>
diff --git a/docs/slides/ETH14/lhs/06_Inductive.lhs b/docs/slides/ETH14/lhs/06_Inductive.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/06_Inductive.lhs
+++ /dev/null
@@ -1,491 +0,0 @@
-Abstract Refinements {#induction}
-=================================
-
-Decoupling Invariants & Code
-----------------------------
-
-+ Abstract refinements deoouple invariants from code
-
-+ Yield precise, reusable **summaries** of HOFs
-
-Recall: Tricky Problem
-----------------------
-
-<br>
-
-<div class="fragment">
-
-**Problem** 
-
-Require *context-dependent* invariants & summaries for HOFs.
-
-</div>
-
-<br>
-<br>
-
-<div class="fragment">
-
-**A Solution** 
-
-Decoupled invariants yield *precise* & *reusable* summaries
-
-
-
-</div>
-
-
-
-
-<div class="hidden">
-
-\begin{code}
-module Loop where
-import Prelude hiding ((!!), foldr, length, (++))
--- import Measures
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-
-size  :: L a -> Int
-add   :: Int -> Int -> Int
-loop  :: Int -> Int -> α -> (Int -> α -> α) -> α
-foldr :: (L a -> a -> b -> b) -> b -> L a -> b
-\end{code}
-</div>
-
-Induction
-=========
-
-Example: `loop` redux 
----------------------
-
-Recall the *higher-order* `loop` 
-
-<br>
-
-\begin{code}
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{spec} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{spec}
-
-<br>
-
-<div class="fragment">
-
-**Problem**
-
-- As property only holds after *last* loop iteration...
-
-- ... cannot instantiate `α` with `{v:Int | v = n + m}`
-
-</div>
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{spec} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{spec}
-
-<br>
-
-**Problem** 
-
-Need invariant relating *iteration* `i` with *accumulator* `acc`
-
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{spec} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{spec}
-
-<br>
-
-**Solution** 
-
-- Abstract Refinement `p :: Int -> a -> Prop`
-
-- `(p i acc)` relates *iteration* `i` with *accumulator* `acc`
-
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{spec} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{spec}
-
-<br>
-
-<div class="fragment">
-<div align="center">
-
-------------  ---   ----------------------------
-  **Assume**   :    `out = loop lo hi base f` 
-
-   **Prove**   :    `(p hi out)`
-------------  ---   ----------------------------
-
-</div>
-</div>
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{spec} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{spec}
-
-<br>
-
-**Base Case:** &nbsp; Initial accumulator `base` satisfies invariant
-
-
-`(p lo base)`   
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{spec} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{spec}
-
-<br>
-
-**Inductive Step:** &nbsp; `f` *preserves* invariant at `i`
-
-
-`(p i acc) => (p (i+1) (f i acc))`
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{spec} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{spec}
-
-<br>
-
-**"By Induction"** &nbsp; `out` satisfies invariant at `hi` 
-
-`(p hi out)`
-
-
-Induction in `loop` (by type)
------------------------------
-
-Induction is an **abstract refinement type** for `loop` 
-
-<br>
-
-\begin{code}
-{-@ loop :: forall a <p :: Int -> a -> Prop>.
-        lo:Int
-     -> hi:{Int | lo <= hi}
-     -> base:a<p lo>                      
-     -> f:(i:Int -> a<p i> -> a<p (i+1)>) 
-     -> a<p hi>                           @-}
-\end{code}
-
-<br>
-
-Induction in `loop` (by type)
------------------------------
-
-`p` is the *index dependent* invariant!
-
-
-\begin{spec}<br> 
-p    :: Int -> a -> Prop             -- invt 
-base :: a<p lo>                      -- base 
-f    :: i:Int -> a<p i> -> a<p(i+1)> -- step
-out  :: a<p hi>                      -- goal
-\end{spec}
-
-
-
-Using Induction
----------------
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br>
-
-**Verified** by *instantiating* the abstract refinement of `loop`
-
-`p := \i acc -> acc = i + n`
-
-
-<!--
-
-Using Induction
----------------
-
-\begin{spec} <div/>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{spec}
-
-<br>
-
-Verified by instantiating `p := \i acc -> acc = i + n`
-
-- <div class="fragment">**Base:**  `n = 0 + n`</div>
-
-- <div class="fragment">**Step:**  `acc = i + n  =>  acc + 1 = (i + 1) + n`</div>
-
-- <div class="fragment">**Goal:**  `out = m + n`</div>
-
--->
-
-Generalizes To Structures 
--------------------------
-
-Same idea applies for induction over *structures* ...
-
-
-Structural Induction
-====================
-
-Example: Lists
---------------
-
-<br>
-
-\begin{code}
-data L a = N 
-         | C a (L a)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets write a generic loop over such lists ...
-</div>
-
-Example: `foldr`
-----------------
-
-\begin{spec} <br>
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{spec}
-
-<br>
-
-<div class="fragment">
-Lets brace ourselves for the type...
-</div>
-
-Example: `foldr`
-----------------
-
-\begin{code}
-{-@ foldr :: 
-    forall a b <p :: L a -> b -> Prop>. 
-      (xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)>) 
-    -> b<p N> 
-    -> ys:L a
-    -> b<p ys>                            @-}
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets step through the type...
-</div>
-
-
-`foldr`: Abstract Refinement
-----------------------------
-
-\begin{spec} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  ::  b<p ys>                            
-\end{spec}
-
-<br>
-
-`(p xs b)` relates `b` with **folded** `xs`
-
-`p :: L a -> b -> Prop`
-
-
-`foldr`: Base Case
-------------------
-
-\begin{spec} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{spec}
-
-<br>
-
-`base` is related to **empty** list `N`
-
-`base :: b<p N>` 
-
-
-
-`foldr`: Ind. Step 
-------------------
-
-\begin{spec} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{spec}
-
-<br>
-
-`step` **extends** relation from `xs` to `C x xs`
-
-`step :: xs:_ -> x:_ -> b<p xs> -> b<p (C x xs)>`
-
-
-`foldr`: Output
----------------
-
-\begin{spec} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{spec}
-
-<br>
-
-Hence, relation holds between `out` and **entire input** list `ys`
-
-`out :: b<p ys>`
-
-Using `foldr`: Size
--------------------
-
-We can now verify <br>
-
-\begin{code}
-{-@ size :: xs:_ -> {v:Int| v = llen xs} @-}
-size     = foldr (\_ _ n -> n + 1) 0
-\end{code}
-
-<br>
-
-<div class="fragment">
-by *automatically instantiating*
-
-`p := \xs acc -> acc = llen xs`
-</div>
-
-Using `foldr`: Append
----------------------
-
-We can now verify <br>
-
-\begin{code}
-{-@ (++) :: xs:_ -> ys:_ -> Cat a xs ys @-} 
-xs ++ ys = foldr (\_ -> C) ys xs 
-\end{code}
-
-<br>
-
-<div class="fragment">
-where 
-
-\begin{code}
-{-@ type Cat a X Y = 
-    {v:_| llen v = llen X + llen Y} @-}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-By automatically instantiating 
-
-`p := \xs acc -> llen acc = llen xs + llen ys`
-
-</div>
-
-Recap
------
-
-<br>
-
-Abstract refinements *decouple* **invariant** from **iteration**
-
-<br>
-
-<div class="fragment">**Reusable** summaries for higher-order functions.</div>
-
-<br>
-
-<div class="fragment">**Automatic** checking and instantiation by SMT.</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over Type Signatures
-    + <div class="fragment">**Functions**</div>
-    + <div class="fragment">**Data** <a href="07_Array.lhs.slides.html" target="_blank">[continue]</a></div>
diff --git a/docs/slides/ETH14/lhs/07_Array.lhs b/docs/slides/ETH14/lhs/07_Array.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/07_Array.lhs
+++ /dev/null
@@ -1,294 +0,0 @@
-Abstract Refinements {#data}
-============================
-
-Recap
------
-
-<br>
-
-**So far**
-
-Abstract Refinements decouple invariants from *functions*
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-Decouple invariants from *data structures*
-
-</div>
-
-
-
-Decouple Invariants From Data {#vector} 
-=======================================
-
-Example: Vectors 
-----------------
-
-<div class="hidden">
-\begin{code}
-module LiquidArray where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume, liquidError)
-
-{-@ LIQUID "--no-termination" @-}
-initialize :: Int -> Vec Int
-\end{code}
-</div>
-
-<div class="fragment">
-
-For this talk, implemented as maps from `Int` to `a` 
-
-<br>
-
-\begin{code}
-data Vec a = V (Int -> a)
-\end{code}
-
-</div>
-
-
-Abstract *Domain* and *Range*
------------------------------
-
-Parameterize type with *two* abstract refinements:
-
-<br>
-
-\begin{code}
-{-@ data Vec a < dom :: Int -> Prop,
-                 rng :: Int -> a -> Prop >
-      = V {a :: i:Int<dom> -> a <rng i>}  @-}
-\end{code}
-
-<br>
-
-- `dom`: *domain* on which `Vec` is *defined* 
-
-- `rng`: *range*  and relationship with *index*
-
-Abstract *Domain* and *Range*
------------------------------
-
-Diverse `Vec`tors by *instantiating* `dom` and `rng`
-
-<br>
-
-<div class="fragment">
-
-An alias for *segments* between `I` and `J`
-
-<br>
-
-\begin{code}
-{-@ predicate Btwn I V J = I <= V && V < J @-}
-\end{code}
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type IdVec N = Vec <{\v -> Btwn 0 v N}, 
-                        {\k v -> v = k}> 
-                       Int                  @-}
-\end{code}
-
-</div>
-
-
-Ex: Zero-Terminated Vectors
----------------------------
-
-Defined between `[0..N)`, with *last* element equal to `0`:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type ZeroTerm N = 
-     Vec <{\v -> Btwn 0 v N}, 
-          {\k v -> k = N-1 => v = 0}> 
-          Int                         @-}
-\end{code}
-
-</div>
-
-Ex: Fibonacci Table 
--------------------
-
-A vector whose value at index `k` is either 
-
-- `0` (undefined), or, 
-
-- `k`th fibonacci number 
-
-\begin{code}
-{-@ type FibV =  
-     Vec <{\v -> true}, 
-          {\k v -> v = 0 || v = fib k}> 
-          Int                          @-}
-\end{code}
-
-
-An API for Vectors
-------------------
-
-
-<br>
-<br>
-
-- `empty`
-
-- `set`
-
-- `get`
-
-
-API: Empty Vectors
------------------
-
-`empty` a Vector whose domain is `false` (defined at *no* key)
-
-<br>
-
-\begin{code}
-{-@ empty :: forall <p :: Int -> a -> Prop>. 
-               Vec <{v:Int|false}, p> a     @-}
-
-empty     = V $ \_ -> error "empty vector!"
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-What would happen if we changed `false` to `true`?
-</div>
-
-API: `get` Key's Value 
-----------------------
-
-- *Input* `key` in *domain*
-
-- *Output* value in *range* related with `k`
-
-<br>
-
-\begin{code}
-{-@ get :: forall a <d :: Int -> Prop,  
-                     r :: Int -> a -> Prop>.
-           key:Int <d>
-        -> vec:Vec <d, r> a
-        -> a<r key>                        @-}
-
-get k (V f) = f k
-\end{code}
-
-
-API: `set` Key's Value 
-----------------------
-
-- <div class="fragment">Input `key` in *domain*</div>
-
-- <div class="fragment">Input `val` in *range* related with `key`</div>
-
-- <div class="fragment">Input `vec` defined at *domain except at* `key`</div>
-
-- <div class="fragment">Output domain *includes* `key`</div>
-
-API: `set` Key's Value 
-----------------------
-
-\begin{code}
-{-@ set :: forall a <d :: Int -> Prop,
-                     r :: Int -> a -> Prop>.
-           key: Int<d> -> val: a<r key>
-        -> vec: Vec<{v:Int<d>| v /= key},r> a
-        -> Vec <d, r> a                     @-}
-
-set key val (V f) = V $ \k -> if k == key 
-                                then val 
-                                else f k
-\end{code}
-
-<br>
-
-<div class="hidden">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-Help! Can you spot and fix the errors? 
-</div>
-
-Using the Vector API
---------------------
-
-Loop over vector, setting each key `i` equal to `i`:
-
-<br>
-
-\begin{code}
-{-@ initialize :: n:Nat -> IdVec n @-}
-initialize n      = loop 0 empty
-  where
-    loop i a 
-      | i < n     = let a' = set i i a
-                    in
-                        loop (i+1) a'
-      | otherwise = a 
-\end{code}
-
-Recap
------
-
-<br>
-
-+ Created a `Vec` (Array) container 
-
-+ Decoupled *domain* and *range* invariants from *data*
-
-+ Enabled analysis of *array segments*
-
-<br>
-
-Recap
------
-
-<br>
-
-Custom *array segment* program analyses: 
-
-<br>
-
-- Gopan-Reps-Sagiv, POPL 05
-- J.-McMillan, CAV 07
-- Logozzo-Cousot-Cousot, POPL 11
-- Dillig-Dillig, POPL 12 
-
-<br>
-
-Encoded in (abstract) refinement typed API.
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over Type Signatures
-    + Functions
-    + <div class="fragment">**Data**</div>
-
-<div class="fragment">[[continue...]](11_Evaluation.lhs.slides.html)</div>
diff --git a/docs/slides/ETH14/lhs/08_Recursive.lhs b/docs/slides/ETH14/lhs/08_Recursive.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/08_Recursive.lhs
+++ /dev/null
@@ -1,460 +0,0 @@
-Abstract Refinements {#data}
-============================
-
-Recap
------
-
-**So far**
-
-Abstract Refinements decouple invariants from
-
-+ functions
-+ indexed data
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-Decouple invariants from **recursive** data structures
-</div>
-
-
-
-Decouple Invariants From Data {#recursive} 
-==========================================
-
- {#asd}
--------
-
-Recursive Structures 
---------------------
-
-Lets see another example of decoupling...
-
-<div class="hidden">
-\begin{code}
-{-# LANGUAGE NoMonomorphismRestriction #-}
-
-module List (insertSort) where
-
-{-@ LIQUID "--no-termination" @-}
-
-mergeSort     :: Ord a => [a] -> [a]
-insertSort :: (Ord a) => [a] -> L a 
-slist :: L Int
-slist' :: L Int
-iGoUp, iGoDn, iDiff :: [Int]
-infixr `C`
-\end{code}
-</div>
-
-Decouple Invariants From Recursive Data
-=======================================
-
-Recall: Lists
--------------
-
-\begin{code}
-data L a = N 
-         | C { hd :: a, tl :: L a }
-\end{code}
-
-
-Recall: Refined Constructors 
-----------------------------
-
-Define **increasing** Lists with strengthened constructors:
-
-\begin{spec} <br>
-data L a where
-  N :: L a
-  C :: hd:a -> tl: L {v:a | hd <= v} -> L a
-\end{spec}
-
-Problem: Decreasing Lists?
---------------------------
-
-What if we need *both* [increasing *and* decreasing lists?](http://hackage.haskell.org/package/base-4.7.0.0/docs/src/Data-List.html#sort)
-
-<br>
-
-<div class="hidden">
-[Separate (indexed) types](http://web.cecs.pdx.edu/~sheard/Code/QSort.html) get quite complicated ...
-</div>
-
-Abstract That Refinement!
--------------------------
-
-\begin{code}
-{-@ data L a <p :: a -> a -> Prop>
-      = N 
-      | C { hd :: a, tl :: L <p> a<p hd> } @-}
-\end{code}
-
-<br>
-
-<div class="fragment"> `p` is a **binary relation** between two `a` values</div>
-
-<br>
-
-<div class="fragment"> Definition relates `hd` with **all** the elements of `tl`</div>
-
-<br>
-
-<div class="fragment"> Recursive: `p` holds for **every pair** of elements!</div>
-
-Example
--------
-
-Consider a list with *three* or more elements 
-
-\begin{spec} <br>
-x1 `C` x2 `C` x3 `C` rest :: L <p> a 
-\end{spec}
-
-Example: Unfold Once
---------------------
-
-\begin{spec} <br> 
-x1                 :: a
-x2 `C` x3 `C` rest :: L <p> a<p x1> 
-\end{spec}
-
-Example: Unfold Twice
----------------------
-
-\begin{spec} <br> 
-x1          :: a
-x2          :: a<p x1>  
-x3 `C` rest :: L <p> a<p x1 && p x2> 
-\end{spec}
-
-Example: Unfold Thrice
-----------------------
-
-\begin{spec} <br> 
-x1   :: a
-x2   :: a<p x1>  
-x3   :: a<p x1 && p x2>  
-rest :: L <p> a<p x1 && p x2 && p x3> 
-\end{spec}
-
-<br>
-
-<div class="fragment">
-Note how `p` holds between **every pair** of elements in the list. 
-</div>
-
-A Concrete Example
-------------------
-
-That was a rather *abstract*!
-
-<br>
-
-How can we *use* fact that `p` holds between *every pair*?
-
-<br>
-
-<div class="fragment">**Instantiate** `p` with a *concrete* refinement</div>
-
-
-Example: Increasing Lists
--------------------------
-
-**Instantiate** `p` with a *concrete* refinement
-
-<br>
-
-\begin{code}
-{-@ type IncL a = L <{\hd v -> hd <= v}> a @-}
-\end{code}
-
-<br>
-
-<div class="fragment"> Refinement says: &nbsp; `hd` less than **every** `v` in tail,</div>
-
-<br>
-
-<div class="fragment"> i.e., `IncL` denotes **increasing** lists. </div>
-
-Example: Increasing Lists
--------------------------
-
-LiquidHaskell *verifies* that `slist` is indeed increasing...
-
-\begin{code}
-{-@ slist :: IncL Int @-}
-slist     = 1 `C` 6 `C` 12 `C` N
-\end{code}
-
-<br> 
-
-<div class="fragment">
-
-... and *protests* that `slist'` is not: 
-
-\begin{code}
-{-@ slist' :: IncL Int @-}
-slist' = 6 `C` 1 `C` 12 `C` N
-\end{code}
-</div>
-
-Insertion Sort
---------------
-
-\begin{code}
-{-@ insertSort :: (Ord a) => [a] -> IncL a @-}
-insertSort     = foldr insert N
-
-insert y N          = y `C` N
-insert y (x `C` xs) 
-  | y < x           = y `C` (x `C` xs)
-  | otherwise       = x `C` insert y xs
-\end{code}
-
-<br>
-
-(Mouseover `insert` to see inferred type.)
-
-Checking GHC Lists
-------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target= "_blank">Demo:</a> 
-Above applies to GHC's List definition:
-
-\begin{spec} <br> 
-data [a] <p :: a -> a -> Prop>
-  = [] 
-  | (:) { h :: a, tl :: [a<p h>]<p> }
-\end{spec}
-
-Checking GHC Lists
-------------------
-
-Increasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Incs a = [a]<{\h v -> h <= v}> @-}
-
-{-@ iGoUp :: Incs Int @-}
-iGoUp     = [1,2,3]
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Decreasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Decs a = [a]<{\h v -> h >= v}> @-}
-
-{-@ iGoDn :: Decs Int @-}
-iGoDn     = [3,2,1]
-\end{code}
-
-
-Checking GHC Lists
-------------------
-
-Duplicate-free Lists
-
-<br>
-
-\begin{code}
-{-@ type Difs a = [a]<{\h v -> h /= v}> @-}
-
-{-@ iDiff :: Difs Int @-}
-iDiff     = [1,3,2]
-\end{code}
-
-Checking Lists
---------------
-
-Now we can check all the usual list sorting algorithms 
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target="_blank">Demo:</a> List Sorting
-
-<!-- 
-
-Example: `mergeSort` [1/2]
---------------------------
-
-\begin{code}
-{-@ mergeSort  :: (Ord a) => [a] -> Incs a @-}
-mergeSort []   = []
-mergeSort [x]  = [x]
-mergeSort xs   = merge xs1' xs2' 
-  where 
-   (xs1, xs2)  = split xs
-   xs1'        = mergeSort xs1
-   xs2'        = mergeSort xs2
-\end{code}
-
-Example: `mergeSort` [2/2]
---------------------------
-
-\begin{code}
-split (x:y:zs) = (x:xs, y:ys) 
-  where 
-    (xs, ys)   = split zs
-split xs       = (xs, [])
-
-merge xs []    = xs
-merge [] ys    = ys
-merge (x:xs) (y:ys) 
-  | x <= y     = x : merge xs (y:ys)
-  | otherwise  = y : merge (x:xs) ys
-\end{code}
-
-Example: Binary Trees
----------------------
-
-... `Map` from keys of type `k` to values of type `a` 
-
-<br>
-
-<div class="fragment">
-
-Implemented, as a binary tree:
-
-<br>
-
-\begin{code}
-data Map k a = Tip
-             | Bin Size k a (Map k a) (Map k a)
-
-type Size    = Int
-\end{code}
-</div>
-
-Two Abstract Refinements
-------------------------
-
-- `l` : relates root `key` with `left`-subtree keys
-- `r` : relates root `key` with `right`-subtree keys
-
-<br>
-
-\begin{code}
-{-@ data Map k a < l :: k -> k -> Prop
-                 , r :: k -> k -> Prop >
-    = Tip
-    | Bin (sz :: Size) (key :: k) (val :: a)
-          (left  :: Map <l,r> (k<l key>) a)
-          (right :: Map <l,r> (k<r key>) a) @-}
-\end{code}
-
-
-Ex: Binary Search Trees
------------------------
-
-Keys are *Binary-Search* Ordered
-
-<br>
-
-\begin{code}
-{-@ type BST k a = 
-      Map <{\r v -> v < r }, 
-           {\r v -> v > r }> 
-          k a                   @-}
-\end{code}
-
-Ex: Minimum Heaps 
------------------
-
-Root contains *minimum* value
-
-<br>
-
-\begin{code}
-{-@ type MinHeap k a = 
-      Map <{\r v -> r <= v}, 
-           {\r v -> r <= v}> 
-           k a               @-}
-\end{code}
-
-Ex: Maximum Heaps 
------------------
-
-Root contains *maximum* value
-
-<br>
-
-\begin{code}
-{-@ type MaxHeap k a = 
-      Map <{\r v -> r >= v}, 
-           {\r v -> r >= v}> 
-           k a               @-}
-\end{code}
-
-
-Example: Data.Map
------------------
-
-Standard Key-Value container
-
-<br>
-
-- <div class="fragment">1300+ non-comment lines</div>
-
-- <div class="fragment">`insert`, `split`, `merge`,...</div>
-
-- <div class="fragment">Rotation, Rebalance,...</div>
-
-<br>
-
-<div class="fragment">
-SMT & inference crucial for [verification](https://github.com/ucsd-progsys/liquidhaskell/blob/master/benchmarks/esop2013-submission/Base.hs)
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Map.hs" target="_blank">Demo:</a> Binary Search Maps
-</div>
-
-Recap: Abstract Refinements
----------------------------
-
-<div class="fragment">
-
-Decouple invariants from **functions**
-
-+ `max`
-+ `loop`
-+ `foldr`
-
-</div>
-
-<div class="fragment">
-Decouple invariants from **data**
-
-+ `Vector`
-+ `List`
-+ `Tree`
-
-</div>
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. **Abstract:** Refinements over functions and data
-5. <div class="fragment"><a href="11_Evaluation.lhs.slides.html" target="_blank">Evaluation</a></div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](11_Evaluation.lhs.slides.html)</div>
diff --git a/docs/slides/ETH14/lhs/09_Laziness.lhs b/docs/slides/ETH14/lhs/09_Laziness.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/09_Laziness.lhs
+++ /dev/null
@@ -1,271 +0,0 @@
- {#laziness}
-============
-
-<div class="hidden">
-\begin{code}
-module Laziness where
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ LIQUID "--no-termination" @-}
-
-safeDiv :: Int -> Int -> Int
-foo     :: Int -> Int
--- zero    :: Int 
--- diverge :: a -> b
-\end{code}
-</div>
-
-
-Lazy Evaluation?
-----------------
-
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-
-
-[[Skip]](11_Evaluation.lhs.slides.html)
-
-Lazy Evaluation
-===============
-
-SMT based Verification
-----------------------
-
-Techniques developed for **strict** languages
-
-<br>
-
-<div class="fragment">
-
------------------------   ---   ------------------------------------------
-        **Floyd-Hoare**    :    `ESCJava`, `SpecSharp` ...
-     **Model Checkers**    :    `Slam`, `Blast` ...
-   **Refinement Types**    :    `DML`, `Stardust`, `Sage`, `F7`, `F*`, ...
------------------------   ---   ------------------------------------------
-
-</div>
-
-<br>
-
-<div class="fragment">
-Surely soundness carries over to Haskell, right?
-</div>
-
-
-Back To the Beginning
----------------------
-
-\begin{code}
-{-@ safeDiv :: Int -> {v:Int|v /= 0} -> Int @-}
-safeDiv n 0 = liquidError "div-by-zero!"
-safeDiv n d = n `div` d
-\end{code}
-
-<br>
-
-<div class="fragment">
-Should only call `safeDiv` with **non-zero** values
-</div>
-
-An Innocent Function
---------------------
-
-`foo` returns a value **strictly less than** input.
-
-<br>
-
-\begin{spec} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-\end{spec}
-
-LiquidHaskell Lies! 
--------------------
-
-\begin{code}
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0    
-              a = foo z
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-<div class="fragment">
-Why is this program **deemed safe**?! 
-</div>
-
-
-*Safe* With Eager Eval
-----------------------
-
-\begin{spec} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{spec}
-
-<br>
-
-<div class="fragment">
-**Safe** in Java, ML: program spins away, **never hits** divide-by-zero 
-</div>
-
-*Unsafe* With Lazy Eval
------------------------
-
-\begin{spec} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{spec}
-
-<br>
-
-**Unsafe** in Haskell: program skips `foo z` and **hits** divide-by-zero!
-
-Problem: Divergence
--------------------
-
-What is denoted by:
-
-`e :: {v:Int | P}`
-
-
-<br>
-
-<div class="fragment">
-`e` evaluates to `Int` satisfying `P`  
-</div>
-
-<div class="fragment">
-or
-
-**diverges**! 
-</div>
-
-<div class="fragment">
-<br>
-
-Classical Floyd-Hoare notion of [partial correctness](http://en.wikipedia.org/wiki/Hoare_logic#Partial_and_total_correctness)
-
-</div>
-
-
-
-Problem: Divergence
--------------------
-
-\begin{spec} **Consider** <div/> 
-        {-@ e :: {v : Int | P} @-}
-
-        let x = e in body 
-\end{spec}
-
-<br>
-
-<div class="fragment">
-**Eager Evaluation** 
-
-*Can* assume `P(x)` when checking `body`
-</div>
-
-<br>
-
-<div class="fragment">
-**Lazy Evaluation** 
-
-*Cannot* assume `P(x)` when checking `body`
-</div>
-
-Eager vs. Lazy Binders 
-----------------------
-
-\begin{spec} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{spec}
-
-
-<br>
-
-Inconsistent refinement for `a` is sound for **eager**, unsound for **lazy**
-
-
-Panic! Now what?
----------------
-
-<div class="fragment">
-**Solution** 
-
-Assign *non-trivial* refinements to *non-diverging* terms!
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Require A Termination Analysis**
-
-Don't worry, its easy...
-
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=TellingLies.hs" target="_blank">Demo:</a> &nbsp; Disable `"--no-termination"` and see what happens!
-</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. **Lazy Evaluation:** Requires Termination
-6. <div class="fragment">**Termination:** via Refinements!</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](10_Termination.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/ETH14/lhs/10_Termination.lhs b/docs/slides/ETH14/lhs/10_Termination.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/10_Termination.lhs
+++ /dev/null
@@ -1,314 +0,0 @@
-Termination {#termination}
-==========================
-
-
-<div class="hidden">
-\begin{code}
-module Termination where
-
-import Prelude hiding (gcd, mod, map)
-fib :: Int -> Int
-gcd :: Int -> Int -> Int
-infixr `C`
-
-data L a = N | C a (L a)
-
-{-@ invariant {v: (L a) | 0 <= (llen v)} @-}
-
-mod :: Int -> Int -> Int
-mod a b | a - b >  b = mod (a - b) b
-        | a - b <  b = a - b
-        | a - b == b = 0
-
-merge :: Ord a => L a -> L a -> L a
-\end{code}
-</div>
-
-<!--
-
-Dependent != Refinement
------------------------
-
-<div class="fragment">**Dependent Types**</div>
-
-+ <div class="fragment">*Arbitrary terms* appear inside types</div> 
-+ <div class="fragment">Termination ensures well-defined</div>
-
-<br>
-
-<div class="fragment">**Refinement Types**</div>
-
-+ <div class="fragment">*Restricted refinements* appear in types</div>
-+ <div class="fragment">Termination *not* required ...</div> 
-+ <div class="fragment">... except, alas, with *lazy* evaluation!</div>
-
--->
-
-Refinements & Termination
--------------------------
-
-<div class="fragment">
-Fortunately, we can ensure termination **using refinements**
-</div>
-
-
-Main Idea
----------
-
-Recursive calls must be on **smaller** inputs
-
-<br>
-
-+ [Turing](http://classes.soe.ucsc.edu/cmps210/Winter11/Papers/turing-1936.pdf)
-+ [Sized Types](http://dl.acm.org/citation.cfm?id=240882)
-+ [DML](http://dl.acm.org/citation.cfm?id=609232)
-+ [Size Change Principle](http://dl.acm.org/citation.cfm?id=360210)
-
-Recur On *Smaller* `Nat` 
-------------------------
-
-<div class="fragment">
-
-**To ensure termination of**
-
-\begin{spec} <div/>
-foo   :: Nat -> T
-foo x =  body
-\end{spec}
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:Nat | v < x} -> T`
-
-<br>
-
-*i.e.* require recursive calls have `Nat` inputs *smaller than* `x`
-</div>
-
-
-
-Ex: Recur On *Smaller* `Nat` 
-----------------------------
-
-\begin{code}
-{-@ fib  :: Nat -> Nat @-}
-fib 0    = 1
-fib 1    = 1
-fib n    = fib (n-1) + fib (n-2)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Terminates, as both `n-1` and `n-2` are `< n`
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=GCD.hs" target="_blank">Demo:</a> &nbsp; What if we drop the `fib 1` equation? 
-</div>
-
-Refinements Are Essential!
---------------------------
-
-\begin{code}
-{-@ gcd :: a:Nat -> {b:Nat | b < a} -> Int @-}
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Need refinements to prove `(a mod b) < b` at *recursive* call!
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ mod :: a:Nat 
-        -> b:{v:Nat|(0 < v && v < a)} 
-        -> {v:Nat| v < b}                 @-}
-\end{code}
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{spec}<div/>
-foo   :: S -> T
-foo x = body
-\end{spec}
-
-<br>
-
-<div class="fragment">
-**Reduce** to `Nat` case...
-</div>
-
-<br>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{spec}<div/>
-foo   :: S -> T
-foo x = body
-\end{spec}
-
-<br>
-
-Specify a **default measure** `mS :: S -> Int`
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:s | 0 <= (mS v) < (mS x)} -> T`
-</div>
-
-
-Ex: Recur on *smaller* `List`
------------------------------
-
-\begin{code} 
-map f N        = N
-map f (C x xs) = (f x) `C` (map f xs) 
-\end{code}
-
-<br>
-
-Terminates using **default** measure `llen` 
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ data L [llen] a = N 
-                    | C { x::a, xs :: L a} @-}
-
-{-@ measure llen :: L a -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)   @-}
-\end{code}
-</div>
-
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of smallness spread across **multiple inputs**?
-
-<br>
-
-\begin{code}
-merge xs@(x `C` xs') ys@(y `C` ys')
-  | x < y     = x `C` merge xs' ys
-  | otherwise = y `C` merge xs ys'
-\end{code}
-
-<br>
-
-<div class="fragment">
-Neither input decreases, but their **sum** does.
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-Neither input decreases, but their **sum** does.
-
-<br>
-
-\begin{code}
-{-@ merge :: Ord a => xs:_ -> ys:_ -> _ 
-          /  [(llen xs) + (llen ys)]     @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-Synthesize **ghost** parameter equal to `[...]`
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-... thereby reducing to decreasing **single parameter** case. 
-
-</div>
-
-Important Extensions 
---------------------
-
-<br>
-
-<div class="fragment">**Mutual** recursion</div>
-
-<br>
-
-<div class="fragment">**Lexicographic** ordering</div>
-
-<br>
-
-<div class="fragment">Fit easily into our framework ...</div>
-
-Recap
------
-
-Main idea: Recursive calls on **smaller** inputs
-
-<br>
-
-<div class="fragment">Use refinements to **check** smaller</div>
-
-<br>
-
-<div class="fragment">Use refinements to **establish** smaller</div>
-
-
-A Curious Circularity
----------------------
-
-<div class="fragment">Refinements require termination ...</div> 
-
-<br>
-
-<div class="fragment">... Termination requires refinements!</div>
-
-<br>
-
-<div class="fragment"> Meta-theory is tricky, but all ends well.</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. Lazy Evaluation: Requires Termination
-6. **Termination:** via Refinements!
-7. <div class="fragment">**Evaluation:** How good is this in practice?</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](11_Evaluation.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/ETH14/lhs/11_Evaluation.lhs b/docs/slides/ETH14/lhs/11_Evaluation.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/11_Evaluation.lhs
+++ /dev/null
@@ -1,93 +0,0 @@
- {#ASda}
-========
-
-Evaluation
-----------
-
-
-
-Evaluation
-==========
-
-LiquidHaskell Is For Real
--------------------------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-<br>
-
-**Substantial Code Bases**
-
-10KLoc, 50+ Modules
-
-<br>
-
-**Complex Properties**
-
-Memory Safety, Functional Correctness*, Termination
-
-<br>
-
-<div class="fragment">
-**Inference is Crucial**
-</div>
-
-
-Numbers
--------
-
-<div align="center">
-
-**Library**                     **LOC**
----------------------------   ---------
-`Data.List`                         814
-`Data.Set.Splay`                    149
-`Data.Vector.Algorithms`           1219
-`HsColour`                         1047
-`Data.Map.Base`                    1396
-`Data.Text`                        3125
-`Data.Bytestring`                  3501
-**Total**                     **11251**
----------------------------   ---------
-
-</div>
-
-Numbers
--------
-
-<div align="center">
-
-**Library**                     **LOC**     **Time**
----------------------------   ---------   ----------
-`Data.List`                         814          26s
-`Data.Set.Splay`                    149          27s
-`Data.Vector.Algorithms`           1219          89s 
-`HsColour`                         1047         196s
-`Data.Map.Base`                    1396         174s
-`Data.Text`                        3125         499s
-`Data.Bytestring`                  3501         294s
-**Total**                     **11251**    **1305s**
----------------------------   ---------   ----------
-
-</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. **Evaluation**
-5. <div class="fragment"><a href="12_Conclusion.lhs.slides.html" target="_blank">Conclusion</a></div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](12_Conclusion.lhs.slides.html)</div>
diff --git a/docs/slides/ETH14/lhs/12_Conclusion.lhs b/docs/slides/ETH14/lhs/12_Conclusion.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/12_Conclusion.lhs
+++ /dev/null
@@ -1,96 +0,0 @@
- {#ASda}
-========
-
-Conclusion
-----------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-Conclusion
-==========
-
-Liquid Types 
-------------
-
-
-Use **Types** to lift **Logic + Analysis** to Modern Programs 
-
-<br>
-
-<div class="fragment"> 
-
--------------------       ------------------------------------------------
-**Properties:**           Predicates *+ Types*
-**Proofs:**               Verification Conditions *+ Subtyping* 
-**Inference:**            Abstract Interpretation *+ Hindley-Milner*
--------------------       ------------------------------------------------
-
-</div>
-
-
-Liquid Types 
-------------
-
-Use **Types** to lift **Logic + Analysis** to Modern Programs 
-
-<br>
-
-**Take Home: Types are a simple and uniform way to analyze**
-
-+ Unbounded Data (eg. Arrays, Lists, HashMaps)
-+ Polymorphism   (eg. Generics,...)
-+ Callbacks/HOFs (eg. map, reduce, filter,...)
-
-<div class="hidden">
-
-Liquid Types 
-------------
-
-Use **Types** to lift **Logic + Analysis** to Modern Programs 
-
-<br>
-
-**Take Home 2: Uninterpreted Functions**
-
-+ Measures for Datatype properties
-
-+ Abstract Refinements 
-
-</div>
-
-Current & Future Work
----------------------
-
-**Technology**
-
-+ Speed
-+ Imperative Features (Pointers, Mutation, ...) 
-+ Diagnostics & *Error Messages*
-
-Current & Future Work
----------------------
-
-**Applications**
-
-+ Concurrency & Distribution
-+ Probabilistic Behavior
-+ Completion, Repair & Synthesis
-
- {#asd}
-=======
-
-Thank You!
-----------
-
-<br>
-
-[`http://goto.ucsd.edu/liquid`](http://goto.ucsd.edu/liquid)
-
-<br>
-
diff --git a/docs/slides/ETH14/lhs/Index.lhs b/docs/slides/ETH14/lhs/Index.lhs
deleted file mode 100644
--- a/docs/slides/ETH14/lhs/Index.lhs
+++ /dev/null
@@ -1,50 +0,0 @@
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-
- {#ASD}
-=======
-
-
-Types & Program Analysis 
-------------------------
-
-
-<br>
-<br>
-
-**Ranjit Jhala**
-
-University of California, San Diego
-
-<br>
-<br>
-
-Joint work with: 
-
-N. Vazou, E. Seidel, P. Rondon, D. Vytiniotis, S. Peyton-Jones
-
-<br>
-
-<div class="fragment">
-[[continue]](00_Motivation.lhs.slides.html)
-</div>
-
-
-Plan 
-----
-
-+ <a href="00_Motivation.lhs.slides.html" target="_blank">Motivation</a>
-+ <div class="fragment"><a href="01_SimpleRefinements.lhs.slides.html" target="_blank">Refinements</a></div>
-+ <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-+ <div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target= "_blank">Higher-Order Functions</a></div>
-+ <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements:</a> <a href="06_Inductive.lhs.slides.html" target="_blank">Code</a>,<a href="07_Array.lhs.slides.html" target= "_blank">Data</a></div>
-+ <div class="fragment"><a href="11_Evaluation.lhs.slides.html" target="_blank">Evaluation</a></div>
-+ <div class="fragment"><a href="12_Conclusion.lhs.slides.html" target="_blank">Conclusion</a></div>
-
diff --git a/docs/slides/Galois2014/000_Refinements.hs b/docs/slides/Galois2014/000_Refinements.hs
deleted file mode 100644
--- a/docs/slides/Galois2014/000_Refinements.hs
+++ /dev/null
@@ -1,119 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--smtsolver=cvc4" @-}
-
-module Refinements where
-
-import Prelude hiding (abs)
-
-divide    :: Int -> Int -> Int
-
-
------------------------------------------------------------------------
--- | Simple Refinement Types
------------------------------------------------------------------------
-
-{-@ six :: {v:Int | v = 6} @-}
-six = 6 :: Int
-
-
-
------------------------------------------------------------------------
--- | Type Aliases are nice, we're gonna be liberal in our use of them
------------------------------------------------------------------------
-
-{-@ type Nat     = {v:Int | v >= 0} @-}
-{-@ type Pos     = {v:Int | v >  0} @-}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-
-
------------------------------------------------------------------------
--- | Subtyping via Implication
------------------------------------------------------------------------
-
-{-@ six' :: NonZero @-}
-six' = six
-
--- {v:Int | v = 6} <: {v:Int | v /= 0}
--- ==>
---          v = 6  =>          v /= 0
-
-
------------------------------------------------------------------------
--- | Function Contracts: Preconditions & Dead Code 
------------------------------------------------------------------------
-
-{-@ die :: {v:_ | false} -> a @-}
-die msg = error msg
-
--- Precondition says, there are **NO** valid inputs for @die@.
--- If program type-checks, means @die@ is **NEVER** called at run-time.
-
-
-
-
-
------------------------------------------------------------------------
--- | Function Contracts: Safe Division 
------------------------------------------------------------------------
-
-divide x 0 = die "divide-by-zero"
-divide x n = x `div` n
-
-
-
--- | What's the problem above? Nothing to *prevent*
---   us from calling `divide` with 0. Oops.
---   How shall we fix it?
-
-
-
-
-
-
-
-avg2 x y   = divide (x + y)     2
-avg3 x y z = divide (x + y + z) 3
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | But whats the problem here?
------------------------------------------------------------------------
-
-avg xs     = divide total n 
-  where
-    total  = sum xs
-    n      = length xs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------
--- | CHEAT AREA ----------------------------------------------
---------------------------------------------------------------
-
--- # START Errors 1 (divide)
--- # END   Errors 1 (avg)
-
-{- divide :: Int -> NonZero -> Int     @-}
diff --git a/docs/slides/Galois2014/001_Refinements.hs b/docs/slides/Galois2014/001_Refinements.hs
deleted file mode 100644
--- a/docs/slides/Galois2014/001_Refinements.hs
+++ /dev/null
@@ -1,91 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--totality"       @-}
-{-@ LIQUID "--smtsolver=cvc4" @-}
-
-module Refinements where
-
-import Prelude hiding (map, foldr, foldr1)
-
-divide    :: Int -> Int -> Int
------------------------------------------------------------------------
--- | Our first Data Type
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
------------------------------------------------------------------------
--- | A few Higher-Order Functions
------------------------------------------------------------------------
-
-map                  :: (a -> b) -> List a -> List b
-map f N              = N
-map f (C x xs)       = C (f x) (map f xs) 
-
-
-foldr                :: (a -> b -> b) -> b -> List a -> b 
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
-
-
--- Uh oh. How shall we fix the error? Lets move on for now...
-
-foldr1           :: (a -> a -> a) -> List a -> a   
-foldr1 f (C x xs)    = foldr f x xs
--- foldr1 f N           = die "foldr1"
-
-
-
--- foldr1 f zs = case zs of
---   C x xs -> foldr f x xs
---   N      -> GHC.patError "YIKES"
-
-
------------------------------------------------------------------------
--- | Measuring the Size of Data
------------------------------------------------------------------------
-
-{-@ measure size @-}
-size          :: List a -> Int
-size (C x xs) = 1 + size xs 
-size N        = 0
-
-
--- N :: {v:List a | size v = 0}
--- C :: x:a -> xs:List a
---   -> {v:List a | size v = 1 + size xs}
-
-
-append N        ys = ys
-append (C x xs) ys = C x (append xs ys)
-
-
-
------------------------------------------------------------------------
--- | Definitions from 000_Refinements.hs
------------------------------------------------------------------------
-
-{-@ type Nat     = {v:Int | v >= 0} @-}
-{-@ type Pos     = {v:Int | v >  0} @-}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-
-{-@ die :: {v:_ | false} -> a @-}
-die msg = error msg
-
-{-@ divide :: Int -> NonZero -> Int @-}
-divide x 0 = die "divide-by-zero"
-divide x n = x `div` n
-
------------------------------------------------------------------------
--- | CHEAT AREA 
------------------------------------------------------------------------
-
--- # START-ERRORS 1 (foldr1)
--- # END-ERRORS   0
-
-{- map    :: _ -> xs:_ -> {v:_ | size v = size xs}               @-}
-{- append :: xs:_ -> ys:_ -> {v: _ | size v = size ys + size xs} @-}
-{- foldr1 :: (a -> a -> a) -> {v:List a | size v > 0} -> a       @-}   
diff --git a/docs/slides/Galois2014/01_Elements.hs b/docs/slides/Galois2014/01_Elements.hs
deleted file mode 100644
--- a/docs/slides/Galois2014/01_Elements.hs
+++ /dev/null
@@ -1,106 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--smtsolver=cvc4" @-}
-module Elems where
-
-import Prelude hiding (elem)
-
-import Data.Set (Set (..))
-
-
------------------------------------------------------------------------------
--- | 1. Reasoning about the Set of Elements in a List ----------------------- 
------------------------------------------------------------------------------
-
--- | The set of `elems` of a list
-
-
-
-
-
-{-@ measure elems :: [a] -> (Set a)
-    elems ([])    = (Set_empty 0)
-    elems (x:xs)  = (Set_cup (Set_sng x) (elems xs))
-  @-}
-
-
-
-
--- | A few handy aliases
-
-{-@ predicate EqElts Xs Ys    = elems Xs = elems Ys                      @-}
-{-@ predicate UnElts Xs Ys Zs = elems Xs = Set_cup (elems Ys) (elems Zs) @-}
-
--- | Reasoning about `append` and `reverse`
-
-{-@ append  :: xs:_ -> ys:_ -> {v:_ | UnElts v xs ys} @-}  
-append [] ys     = ys
-append (x:xs) ys = x : append xs ys 
-
-
-{-@ reverse :: xs:_ -> {v:_ | EqElts v xs} @-}
-reverse xs           = revAcc xs []
-  where 
-   revAcc []     acc = acc
-   revAcc (x:xs) acc = revAcc xs (x:acc)
-
-
-
-
------------------------------------------------------------------------------
--- | 2. Checking for duplicates (xmonad) ------------------------------------ 
------------------------------------------------------------------------------
-
--- | Is a list free of duplicates?
-   
-{-@ measure nodups :: [a] -> Prop
-    nodups ([])   = true
-    nodups (x:xs) = (not (Set_mem x (elems xs)) && nodups xs)
-  @-}
-
--- | Weeding out duplicates.
-   
-{-@ nub :: xs:_ -> {v:_ | nodups v && EqElts v xs} @-}
-nub xs             = go xs []
-  where
-    go (x:xs) l
-      | x `elem` l = go xs l     
-      | otherwise  = go xs (x:l) 
-    go [] l        = l
-
-
-{-@ elem :: x:_ -> ys:_ -> {v:Bool | Prop v <=> Set_mem x (elems ys)} @-}
-elem x []     = False
-elem x (y:ys) = x == y || elem x ys
-
------------------------------------------------------------------------------
--- | 3. Associative Lookups ------------------------------------------------- 
------------------------------------------------------------------------------
-
--- The dread "key-not-found". How can we fix it?
-find key ((k,v) : kvs)
-  | key == k  = v
-  | otherwise = find key kvs
-find _ []     = die "Key not found! Lookup failed!"
-
-
-{-@ die :: {v:_ | false} -> b @-}
-die x = error x
-
-
-----------------------------------------------------------------------------
--- | CHEAT AREA ------------------------------------------------------------
-----------------------------------------------------------------------------
-
-{- predicate ValidKey K M    = Set_mem K (keys M)  @-}
-
-{- measure keys  :: [(a, b)] -> (Set a)
-    keys ([])     = (Set_empty 0)
-    keys (kv:kvs) = (Set_cup (Set_sng (fst kv)) (keys kvs))
-  @-}
-
--- # START ERRORS 1 (find)
--- # END   ERRORS 0 
-
-{- find :: k:_ -> {m:_ | ValidKey k m} -> _ @-}
-
diff --git a/docs/slides/Galois2014/05_Memory.hs b/docs/slides/Galois2014/05_Memory.hs
deleted file mode 100644
--- a/docs/slides/Galois2014/05_Memory.hs
+++ /dev/null
@@ -1,401 +0,0 @@
-{-# LANGUAGE ForeignFunctionInterface #-}
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--smtsolver=cvc4" @-}
-{-@ LIQUID "--diffcheck"     @-}
-
-module Memory where
-
-import Prelude hiding (null)
-import Data.Char
-import Data.Word
-import Foreign.C.Types
-import Foreign.ForeignPtr
-import Foreign.Ptr
-import Foreign.Storable
-import System.IO.Unsafe
-import Data.ByteString.Internal (c2w, w2c)
-import Language.Haskell.Liquid.Prelude
-
-------------------------------------------------------------------------
--- | 1. Low-level Pointer API  -----------------------------------------
-------------------------------------------------------------------------
-
--- | Create a buffer of size 4 and initialize it with zeros
-
-zero4  = do fp <- mallocForeignPtrBytes 4
-            withForeignPtr fp $ \p -> do
-              poke (p `plusPtr` 0) zero 
-              poke (p `plusPtr` 1) zero 
-              poke (p `plusPtr` 2) zero 
-              poke (p `plusPtr` 3) zero 
-            return fp
-        where
-            zero = 0 :: Word8
-
--- But whats to prevent an overflow, e.g. writing to offset 5 or 50?
-            
-
-
--- | Types for Pointers
-
--- data Ptr a         
--- data ForeignPtr a 
-
--- | Size of Ptr and ForeignPtr
-
--- measure plen  :: Ptr a -> Int 
--- measure fplen :: ForeignPtr a -> Int 
-
-
-{-@ type PtrN a N        = {v:Ptr a        |  plen v  = N}  @-}
-{-@ type ForeignPtrN a N = {v:ForeignPtr a |  fplen v = N}  @-}
-
--- | Allocating Memory
-
-{-@ assume mallocForeignPtrBytes :: n:Nat -> IO (ForeignPtrN a n) @-}
-
--- | Using a pointer
-
-{- withForeignPtr :: fp:ForeignPtr a 
-                  -> (PtrN a (fplen fp) -> IO b)  
-                  -> IO b             
--}
-
--- | Pointer Arithmetic
-
-{- plusPtr :: p:Ptr a
-           -> o:{Nat|o <= plen p}   -- in bounds
-           -> PtrN b (plen b - o)   -- remainder
--}
-
--- | Read and Write
-
-{- peek :: {v:Ptr a | 0 < plen v} -> IO a  
-   poke :: {v:Ptr a | 0 < plen v} -> a -> IO ()  
- -}
-
--- | Example: Preventing Overflows e.g. writing 5 or 50 zeros?
-
-zero4' = do fp <- mallocForeignPtrBytes 4
-            withForeignPtr fp $ \p -> do
-              poke (p `plusPtr` 0) zero 
-              poke (p `plusPtr` 1) zero 
-              poke (p `plusPtr` 2) zero 
-              poke (p `plusPtr` 5) zero 
-            return fp
-        where
-            zero = 0 :: Word8
-
-
-
-------------------------------------------------------------------------
--- | 2. ByteString API -------------------------------------------------
-------------------------------------------------------------------------
-
-data ByteString = PS {
-    bPtr :: ForeignPtr Word8
-  , bOff :: !Int
-  , bLen :: !Int
-  }
-
-
--- | Refined Type, with invariants
-
-{-@ data ByteString = PS {
-      bPtr :: ForeignPtr Word8
-    , bOff :: {v:Nat| v        <= fplen bPtr}
-    , bLen :: {v:Nat| v + bOff <= fplen bPtr}
-    }
-
-  @-}
-
---             fplen ptr = 23
---               v
---       |-----------------------|
--- ptr = "  eric loves burritos  "
---          |------------------|
---          ^          ^
---         off = 2    len = 19
-
--- ex = PS ptr off len              -- 2 <= 23  &&  (2 + 19) <= 23   ==> SAFE
-
--- | Some useful abbreviations
-
-{-@ type ByteStringN N = {v:ByteString | bLen v = N} @-}
-{-@ type StringN N     = {v:String     | len v  = N} @-}
-
--- | Legal Bytestrings 
-
-{- good1 :: IO (ByteStringN 5) @-}
-good1 = do fp <- mallocForeignPtrBytes 5
-           return $ PS fp 0 5
-
-{- good2 :: IO (ByteStringN 3) @-}
-good2 = do fp <- mallocForeignPtrBytes 5
-           return $ PS fp 2 3
-
--- | Illegal Bytestrings 
-
-bad1 = do fp <- mallocForeignPtrBytes 3 
-          return $ PS fp 0 10 
-
-bad2 = do fp <- mallocForeignPtrBytes 3
-          return $ PS fp 2 2
-
-
-
--- | ByteString API: `create`
-
-create :: Int -> (Ptr Word8 -> IO ()) -> ByteString
-
-create n fill = unsafePerformIO $ do
-  fp  <- mallocForeignPtrBytes n
-  withForeignPtr fp fill 
-  return $! PS fp 0 n
-
-
--- Yikes, there is an error! How to fix?
-
--- | ByteStringN API: `unsafeTake`
-
-unsafeTake n (PS x s l) = PS x s n
-
--- Wow, thats super fast. O(1)! But how to fix the error?
-
--- | ByteString API: `pack`
-
-pack          :: String -> ByteString
-pack str      = create n $ \p -> go p xs
-  where
-  n           = length str
-  xs          = map c2w str
-  go p (x:xs) = poke p x >> go (plusPtr p 1) xs
-  go _ []     = return  ()
-
--- Hmm. How to fix the error?
-
-
-
--- | ByteString API: `unpack` 
-
-
-
-
-unpack :: ByteString -> String 
-unpack (PS _  _ 0)  = []
-unpack (PS ps s l)  = unsafePerformIO $ withForeignPtr ps $ \p ->
-   go (p `plusPtr` s) (l - 1) []
-  where
-   go p 0 acc = peek p >>= \e -> return (w2c e : acc)
-   go p n acc = peek (p `plusPtr` n) >>= \e -> go p (n-1) (w2c e : acc)
-
-
-
-------------------------------------------------------------------------
--- | 3. Application API (Heartbleed no more!) --------------------------
-------------------------------------------------------------------------
-
-chop     :: String -> Int -> String 
-chop s n =  s'
-  where 
-    b    = pack s          -- down to low-level
-    b'   = unsafeTake n b  -- grab n chars
-    s'   = unpack b'       -- up to high-level
-
--- Whats the problem?
-
-
-
-
-
--- | "HeartBleed" no more
-
-demo     = [ex6, ex30]
-  where
-    ex   = ['R','a','n','j','i','t']
-    ex6  = chop ex 6  -- ok
-    ex30 = chop ex 30 -- out of bounds
-
-
--- "Bleeding" `chop ex 30` *rejected* by compiler
-
-
-
-------------------------------------------------------------------------
--- | 3. Bonus Material -------------------------------------------------
-------------------------------------------------------------------------
-
--- | `group` ing ByteStrings 
-
-{- How shall we type `group` where
-
-     group "foobaaar"
-
-   returns
-
-     ["f","oo", "b", "aaa", "r"]
-
--}
-
--- | An alias for NON-EMPTY ByteStrings
-    
-{-@ type ByteStringNE = {v:ByteString | bLen v > 0} @-}
-
--- | A measure for the sum of sizes of a LIST of ByteStrings
-    
-{-@ measure bLens  :: [ByteString] -> Int
-    bLens ([])   = 0
-    bLens (x:xs) = (bLen x + bLens xs)
-  @-}
-
--- | @group@
-    
-{-@ group :: b:ByteString -> {v: [ByteStringNE] | bLens v = bLen b} @-}
-group xs
-    | null xs   = []
-    | otherwise = let y = unsafeHead xs
-                      (ys, zs) = spanByte (unsafeHead xs) (unsafeTail xs)
-                  in (y `cons` ys) : group zs
-
-
--- | @spanByte@ does the heavy lifting
-
-{-@ spanByte :: Word8 -> b:ByteString -> (ByteStringPair b) @-}
-spanByte :: Word8 -> ByteString -> (ByteString, ByteString)
-spanByte c ps@(PS x s l) = unsafePerformIO $ withForeignPtr x $ \p ->
-    go (p `plusPtr` s) 0
-  where
-    go p i | i >= l    = return (ps, empty)
-           | otherwise = do c' <- peekByteOff p i
-                            if c /= c'
-                                then return (unsafeTake i ps, unsafeDrop i ps)
-                                else go p (i+1)
-
--- | Using the alias
-                            
-{-@ type ByteStringPair B = (ByteString, ByteString)<{\x1 x2 ->
-       bLen x1 + bLen x2 = bLen B}> @-}
-
-
-
-
-
-
-
-
-
-
-
-----------------------------------------------------------------------------
--- | CHEAT AREA
-----------------------------------------------------------------------------
-
--- #START ERRORS 13
--- #END   ERRORS 4 (zero4', bad1, bad2, ex30) 
-                            
-{- create     :: n:Nat -> (PtrN Word8 n -> IO ()) -> ByteStringN n      @-}
-{- unsafeTake :: n:Nat -> b:{ByteString | n <= bLen b} -> ByteStringN n @-}
-{- pack       :: s:String -> ByteStringN (len s)                        @-}
-{- unpack     :: b:ByteString -> {v:String | len v = bLen b}            @-}
-{- chop       :: s:String -> n:{Nat | n <= len s} -> StringN n          @-} 
-
-{- qualif Unpack(v:a, acc:b, n:int) : len v = 1 + n + len acc @-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | Helper Code (Stuff from BS benchmark, to make demo self-contained)
------------------------------------------------------------------------
-
-{-@ unsafeCreate :: l:Nat -> ((PtrN Word8 l) -> IO ()) -> (ByteStringN l) @-}
-unsafeCreate n f = create n f -- unsafePerformIO $ create n f
-
-{-@ invariant {v:ByteString   | bLen  v >= 0} @-}
-{-@ invariant {v:[ByteString] | bLens v >= 0} @-}
-
-{-@ qualif PLLen(v:a, p:b) : (len v) <= (plen p) @-}
-{-@ qualif ForeignPtrN(v:ForeignPtr a, n:int): fplen v = n @-}
-{-@ qualif FPLenPLen(v:Ptr a, fp:ForeignPtr a): fplen fp = plen v @-}
-{-@ qualif PtrLen(v:Ptr a, xs:List b): plen v = len xs @-}
-{-@ qualif PlenEq(v: Ptr a, x: int): x <= (plen v) @-}
-
-{-@ unsafeHead :: {v:ByteString | (bLen v) > 0} -> Word8 @-}
-
-unsafeHead :: ByteString -> Word8
-unsafeHead (PS x s l) = liquidAssert (l > 0) $
-  unsafePerformIO  $  withForeignPtr x $ \p -> peekByteOff p s
-
-{-@ unsafeTail :: b:{v:ByteString | (bLen v) > 0}
-               -> {v:ByteString | (bLen v) = (bLen b) - 1} @-}
-unsafeTail :: ByteString -> ByteString
-unsafeTail (PS ps s l) = liquidAssert (l > 0) $ PS ps (s+1) (l-1)
-
-{-@ null :: b:ByteString -> {v:Bool | ((Prop v) <=> ((bLen b) = 0))} @-}
-null :: ByteString -> Bool
-null (PS _ _ l) = liquidAssert (l >= 0) $ l <= 0
-
-{-@ unsafeDrop :: n:Nat
-               -> b:{v: ByteString | n <= (bLen v)} 
-               -> {v:ByteString | (bLen v) = (bLen b) - n} @-}
-unsafeDrop  :: Int -> ByteString -> ByteString
-unsafeDrop n (PS x s l) = liquidAssert (0 <= n && n <= l) $ PS x (s+n) (l-n)
-
-{-@ cons :: Word8 -> b:ByteString -> {v:ByteString | (bLen v) = 1 + (bLen b)} @-}
-cons :: Word8 -> ByteString -> ByteString
-cons c (PS x s l) = unsafeCreate (l+1) $ \p -> withForeignPtr x $ \f -> do
-        poke p c
-        memcpy (p `plusPtr` 1) (f `plusPtr` s) (fromIntegral l)
-
-{-@ empty :: {v:ByteString | (bLen v) = 0} @-} 
-empty :: ByteString
-empty = PS nullForeignPtr 0 0
-
-{-@ assume
-    c_memcpy :: dst:(PtrV Word8)
-             -> src:(PtrV Word8) 
-             -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))} 
-             -> IO (Ptr Word8)
-  @-}
-foreign import ccall unsafe "string.h memcpy" c_memcpy
-    :: Ptr Word8 -> Ptr Word8 -> CSize -> IO (Ptr Word8)
-
-{-@ memcpy :: dst:(PtrV Word8)
-           -> src:(PtrV Word8) 
-           -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))} 
-           -> IO () 
-  @-}
-memcpy :: Ptr Word8 -> Ptr Word8 -> CSize -> IO ()
-memcpy p q s = c_memcpy p q s >> return ()
-
-{-@ assume nullForeignPtr :: {v: ForeignPtr Word8 | (fplen v) = 0} @-}
-nullForeignPtr :: ForeignPtr Word8
-nullForeignPtr = unsafePerformIO $ newForeignPtr_ nullPtr
-{-# NOINLINE nullForeignPtr #-}
-
-
-
diff --git a/docs/slides/HS2014/Basics-blank.hs b/docs/slides/HS2014/Basics-blank.hs
deleted file mode 100644
--- a/docs/slides/HS2014/Basics-blank.hs
+++ /dev/null
@@ -1,105 +0,0 @@
-module Basics where
-
--- list of numbers between 0 and 100
-
-list = [1,10,30]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-range :: Int -> Int -> [Int]
-range lo hi
-  | lo <= hi  = lo : range (lo + 1)  hi
-  | otherwise = []
-
--- range 1 4 = [1,2,3]
--- range 1 1 = []
-
-
-
-
-
-
-
-
-
-
--- length (range lo hi) = hi - lo
-
-
-
-
-
-
-
-
-
-
-
-
--- measures let us describe properties of data
--- without *embedding* them into the data definition!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-data CSV a = CSV { cols :: [String], rows :: [[a]] }
-
-csv = CSV [ "Month", "Days"]
-          [ ["Jan",  "31"]
-          , ["Feb", "28"] 
-          ]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--- Local Variables:
--- flycheck-checker: haskell-liquid
--- End:
-
--- list :: [Int]
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--diffcheck" @-}
-{-@ LIQUID "--short-names" @-}
diff --git a/docs/slides/HS2014/Basics.lhs b/docs/slides/HS2014/Basics.lhs
deleted file mode 100644
--- a/docs/slides/HS2014/Basics.lhs
+++ /dev/null
@@ -1,288 +0,0 @@
-> {-@ LIQUID "--no-termination" @-}
-> {-@ LIQUID "--short-names"    @-}
-> 
-> module Basics where
-> 
-> import Prelude hiding (head, max)
-> import qualified Data.ByteString.Char8 as B
-> import qualified Data.ByteString.Unsafe as B
-> import Data.List (find)
-> import Language.Haskell.Liquid.Prelude
-
-Well-typed programs can't go wrong.
-
-> dog = B.pack "dog"
-
-< λ> B.unsafeIndex dog 2
-< 103
-< λ> B.unsafeIndex dog 10
-< 0
-< λ> B.unsafeIndex dog 10000000000
-< segmentation fault
-
-That's no good, it would be nice if the type system could prevent us from doing
-that. Today I'm going to present our experience in designing such a type system,
-and in using it to verify over 10KLoC of real Haskell code.
-
-
-Refinement Types
-================
-
-We'll start with a lightning tour of LiquidHaskell before getting into the
-gritty benchmarks.
-
-A refinment type is a Haskell type where each component of the type is annotated
-with a predicate from an SMT-decidable logic. For example,
-
-< {v:Int | v >= 0 && v < 100}
-
-describes the set of `Int`s that are between 0 and 100. We'll make heavy use of
-*aliases* to simplify the types, e.g.
-
-> {-@ predicate Btwn Lo N Hi = Lo <= N && N < Hi @-}
-> {-@ type Rng Lo Hi = {v:Int | Btwn Lo v Hi}    @-}
-
-< Rng 0 100
-
-is equivalent to the first type.
-
-To double check note that,
-
-> {-@ okRange :: [Rng 0 100] @-}
-> okRange = [1,10,30] :: [Int]
- 
-but, of course,
-
-> {-@ badRange :: [Rng 0 100] @-}
-> badRange = [1,10,300] :: [Int]
-
-
-We can describe a function's *contract* by refining its input and output types
-with our desired pre- and post-conditions.
-
-> {-@ range :: lo:Int -> hi:{Int | lo <= hi} -> [Rng lo hi] @-}
-
-This type tells us that `range` accepts two `Int`s, the second being larger than
-the first, and returns a `[Int]` where all of the elements are between `lo` and
-`hi`. Now if we implement `range`
-
-> range :: Int -> Int -> [Int]
-> range lo hi
->   | lo <= hi  = lo : range (lo + 1) hi
->   | otherwise = []
-
-LiquidHaskell complains that `lo` is not *strictly* less than `hi`!
-
-Fortunately, that's easily fixed, we'll just replace the `<=` in the guard with `<`.
-
-> {-@ range' :: lo:Int -> hi:{Int | lo <= hi} -> [Rng lo hi] @-}
-> range' :: Int -> Int -> [Int]
-> range' lo hi
->   | lo < hi   = lo : range' (lo + 1) hi
->   | otherwise = []
-
-
-Holes
------
-
-Typing out the base Haskell types can be tedious, especially since GHC will
-infer them. So we use `_` to represent a *type-hole*, which LiquidHaskell will
-automatically fill in by asking GHC. For example, if we wrote a function
-`rangeFind` with type
-
-< (Int -> Bool) -> Int -> Int -> Maybe Int
-
-we could write the refined type
-
-> {-@ rangeFind :: _ -> lo:_ -> hi:{_ | lo <= hi} -> Maybe (Rng lo hi) @-}
-> rangeFind f lo hi = find f $ range lo hi
-
-Note that in order for `rangeFind` to type-check, LiquidHaskell has to infer
-that `find` returns a `Maybe (Rng lo hi)` (show off liquid-pos-tip), which it
-does by instantiating `find`s type parameter `a` with `Rng lo hi`.
-
-Ok, we can talk about Integers, what about arbitrary, user-defined datatypes?
-
-
-Measures
-========
-
-Let's go one step further with `range` and reason about the length of the 
-resulting list. Given that
-
-< range 0 2 == [0,1]
-
-and
-
-< range 1 1 == []
-
-it looks like the length of the output list should be `hi - lo`, but how do we 
-express that in LiquidHaskell?
-
-(Instead of defining an index that is baked into the type definition)
-we'll define a *measure*, which you can think of as a *view* of the datatype.
-
-< {-@ measure len :: [a] -> Int
-<     len ([])   = 0
-<     len (x:xs) = 1 + (len xs)
-<   @-}
-
-Measures look like Haskell functions, but they're *not*. They are a very
-restricted subset of inductively-defined Haskell functions with a single
-equation per data constructor. LiquidHaskell translates measures into refined
-types for the data constructors, e.g.
-
-< []  :: {v:[a] | len v = 0}
-< (:) :: _ -> xs:_ -> {v:[a] | len v = len xs + 1}
-
-ASIDE: another great spot to show off liquid-pos-tip.
-NV: state that measures are uninterpreted functions into logic
-
-> mylist = 1 : []
-
-LiquidHaskell's interpretation of measures is a key distinction from indexed
-data types, because we can define multiple measures independently of the actual
-type definition, and LiquidHaskell will just conjoin the refinements arising
-from the individual measures.
-
-ASIDE: perhaps quickly show by defining `measure null` as a throwaway.
-
-With our measure in hand we can now specify our final type for `range`
-
-> {-@ range'' :: lo:Int -> hi:{Int | lo <= hi} -> {v:[Rng lo hi] | len v = hi - lo } @-}
-
-Notice that we don't need to change the implementation at all, LiquidHaskell 
-accepts it as is!
-
-> range'' :: Int -> Int -> [Int]
-> range'' lo hi
->   | lo < hi   = lo : range'' (lo + 1) hi
->   | otherwise = []
-
-We can also give precise specifications to, e.g., `append`
-
-> {-@ append :: xs:_ -> ys:_ -> {v:_ | len v = len xs + len ys} @-}
-> append []     ys = ys
-> append (x:xs) ys = x : append xs ys
-
-
-
-
-Refined Data Types
-------------------
-
-Sometimes we *want* every instance of a type to satisfy some invariant. Every
-row in a `CSV` table should have the same number of columns.
-
-NV: Universal invariants that we get by type polymorphism is not trivial, 
-so maybe give a simple type like [{v:Int |  v > 0}]
-before going into [ListL a cols]
-
-
-> data CSV a = CSV { cols :: [String], rows :: [[a]] }
-> {-@ type ListL a L = {v:[a] | len v = len L} @-}
-> {-@ data CSV a = CSV { cols :: [String], rows :: [ListL a cols] } @-}
-
-Since the invariant is *baked into* the refined type definition, LiquidHaskell
-will reject *any* `CSV` value that does not satisfy the invariant.
-
-> good_2 = CSV [ "Month", "Days"]
->              [ ["Jan", "31"]
->              , ["Feb", "28"] ]
-> bad_2  = CSV [ "Month", "Days"]
->              [ ["Jan", "31"]
->              , ["Feb"] ]
-
-
-
-RJ:BEGIN-CUT
-
-Refined Type-Classes
---------------------
-
-Perhaps there's a common interface that we want multiple data types to support,
-e.g. random-access. Many such interfaces have protocols that define how to
-*safely* use the interface, like "don't index out-of-bounds". We can describe
-these protocols in LiquidHaskell by packaging the functions into a type-class
-and giving it a refined definition.
-
-> class Indexable f where
->   size :: f a -> Int
->   at   :: f a -> Int -> a
->
-> {-@
-> class Indexable f where
->   size :: forall a. xs:f a -> {v:Nat | v = sz xs}
->   at   :: forall a. xs:f a -> {v:Nat | v < sz xs} -> a
-> @-}
-
-This poses a bit of a problem though, how do we define the `sz` measure?
-Measures have to be defined for a specific datatype so LiquidHaskell can refine
-the constructors. We'll work around this issue by introducing *type-indexed*
-measures.
-
-> {-@ class measure sz :: forall a. a -> Int @-}
-> {-@ instance measure sz :: [a] -> Int
->     sz ([])   = 0
->     sz (x:xs) = 1 + (sz xs)
->   @-}
-> {-@ invariant {v:[a] | sz v >= 0} @-}
-
-Apart from allowing definitions for multiple types, class measures work just
-like regular measures, i.e. they're translated into refined data constructor
-types.
-
-If we go ahead and define an instance for lists,
-
-> instance Indexable [] where
->   size []        = 0
->   size (x:xs)    = 1 + size xs
->
->   (x:xs) `at` 0  = x
->   (x:xs) `at` i  = xs `at` (i-1)
-
-LiquidHaskell will verify that our implementation matches the class
-specification.
-
-Clients of a type-class get to assume that the instances have been defined
-correctly, i.e. LiquidHaskell will happily prove that 
-
-> sum :: (Indexable f) => f Int -> Int
-> sum xs = go 0 
->   where
->     go i | i < size xs = xs `at` i + go (i+1)
->          | otherwise   = 0
-
-is safe for **all** instances of `Indexable`.
-
-
-Abstract Refinements
---------------------
-
-All of the examples so far have used *concrete* refinements, but sometimes
-we just want to say that *some* property will be preserved by the function, e.g.
-
-> max     :: Int -> Int -> Int 
-> max x y = if x > y then x else y
->
-> {-@ xPos  :: {v: _ | v > 0} @-}
-> xPos  = max 10 13
->
-> {-@ xNeg  :: {v: _ | v < 0} @-}
-> xNeg  = max (0-5) (0-8)
->
-> {-@ xEven :: {v: _ | v mod 2 == 0} @-}
-> xEven = max 4 (0-6)
-
-Since `max` returns one of it's arguments, we know that if *both* inputs share
-some property, then *so will the output*. In LiquidHaskell we can express this
-by abstracting over the refinements.
-
-> {-@ max :: forall <p :: Int -> Prop>.
->            Int<p> -> Int<p> -> Int<p>
->   @-}
-
-RJ:END-CUT
-
-Now that we've covered the basics of using LiquidHaskell, let's take a look at
-our first experiment: proving functions total.
diff --git a/docs/slides/HS2014/ByteString-BAD-DIFFCHECK.hs b/docs/slides/HS2014/ByteString-BAD-DIFFCHECK.hs
deleted file mode 100644
--- a/docs/slides/HS2014/ByteString-BAD-DIFFCHECK.hs
+++ /dev/null
@@ -1,108 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--diffcheck"      @-}
-{-@ LIQUID "--short-names"    @-}
-{-# LANGUAGE ForeignFunctionInterface #-}
-module Bytestring where
-
-import Prelude hiding (null)
-import Data.Char
-import Data.Word
-import Foreign.C.Types
-import Foreign.ForeignPtr
-import Foreign.Ptr
-import Foreign.Storable
-import System.IO.Unsafe
-import Language.Haskell.Liquid.Prelude
-
-
-data ByteString = PS { bPayload :: ForeignPtr Word8
-                     , bOffset  :: !Int
-                     , bLength  :: !Int
-                     }
-
-{- measure fplen :: ForeignPtr a -> Int -}
-
-{-@ data ByteString = PS
-      { bPayload :: ForeignPtr Word8
-      , bOffset  :: {v:Nat | v           <= fplen bPayload}
-      , bLength  :: {v:Nat | bOffset + v <= fplen bPayload}
-      }
-  @-}
-
-{-@ type ByteStringN N = {v:ByteString | bLength v = N} @-}
-
-{-@ type ForeignN a N = {v:ForeignPtr a | fplen v = N} @-}
-{-@ assume mallocForeignPtrBytes :: n:Nat -> IO (ForeignN a n) @-}
-
-bs = do fp <- mallocForeignPtrBytes 5
-        return $ PS fp 2 3
-
-{-@ create :: l:Nat -> (PtrN Word8 l -> IO ()) -> IO (ByteStringN l) @-}
-create l f = do
-    fp <- mallocForeignPtrBytes  l
-    withForeignPtr fp $ \p -> f p
-    return $! PS fp 0 l
-
-foo = create 5 $ \p -> poke (p `plusPtr` 4) (0 :: Word8)
-
-{-@ pack :: s:[Word8] -> ByteStringN (len s) @-}
-pack str = unsafeCreate (length str) $ \p -> go p  str
-  where
-    go _ []     = return  ()
-    go p (x:xs) = poke p x >> go (p `plusPtr` 1) xs
-
-
--- uncomment this spec and then twiddle the definition to rerun diffcheck, it 
--- will only resolve the type error on the line you twiddle.
-{- unsafeIndex :: b:ByteString -> {v:Nat | v < bLength b} -> Word8 @-}
-unsafeIndex (PS x s l) i = liquidAssert (i >= 0 && i < l)  $
-    unsafePerformIO $ withForeignPtr x $ \p -> peekByteOff p (s + i) --FIXME: diffcheck breaks here
-
-
-
-
-
-good = let b = pack [1,2,3]
-       in unsafeIndex b 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- Helper Code
------------------------------------------------------------------------
-{-@ unsafeCreate :: l:Nat -> (PtrN Word8 l -> IO ()) -> (ByteStringN l) @-}
-unsafeCreate n f = unsafePerformIO $ create n f
-
-{-@ invariant {v:ByteString   | bLength  v >= 0} @-}
-
-{-@ qualif PLLen(v:a, p:b) : (len v) <= (plen p) @-}
-{-@ qualif ForeignPtrN(v:ForeignPtr a, n:int): fplen v = n @-}
-{-@ qualif FPLenPLen(v:Ptr a, fp:ForeignPtr a): fplen fp = plen v @-}
-{-@ qualif PtrLen(v:Ptr a, xs:List b): plen v = len xs @-}
-{-@ qualif PlenEq(v: Ptr a, x: int): x <= (plen v) @-}
-
--- Local Variables:
--- flycheck-checker: haskell-liquid
--- End:
-
-create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteString
-unsafeIndex :: ByteString -> Int -> Word8
diff --git a/docs/slides/HS2014/ByteString-blank.hs b/docs/slides/HS2014/ByteString-blank.hs
deleted file mode 100644
--- a/docs/slides/HS2014/ByteString-blank.hs
+++ /dev/null
@@ -1,213 +0,0 @@
-module Bytestring where
-
-import Prelude hiding (null)
-import Data.Char
-import Data.Word
-import Foreign.C.Types
-import Foreign.ForeignPtr
-import Foreign.Ptr
-import Foreign.Storable
-import System.IO.Unsafe
-import Language.Haskell.Liquid.Prelude
-
-
-data ByteString = PS { bPayload :: ForeignPtr Word8
-                     , bOffset  :: !Int
-                     , bLength  :: !Int
-                     }
-
-{- measure fplen :: ForeignPtr a -> Int -}
-
-{-@ data ByteString = PS
-      { bPayload :: ForeignPtr Word8
-      , bOffset  :: {v:Nat | v           <= fplen bPayload}
-      , bLength  :: {v:Nat | bOffset + v <= fplen bPayload}
-      }
-  @-}
-
-{-@ type ByteStringN N = {v:ByteString | bLength v = N} @-}
-
-{-@ type ForeignN a N = {v:ForeignPtr a | fplen v = N} @-}
-{-@ assume mallocForeignPtrBytes :: n:Nat -> IO (ForeignN a n) @-}
-
-bs = do fp <- mallocForeignPtrBytes 5
-        return $ PS fp 2 3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-create l f = do
-    fp <- mallocForeignPtrBytes l
-    withForeignPtr fp $ \p -> f p
-    return $! PS fp 0 l
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-foo = create 5 $ \p -> poke (p `plusPtr` 4) (0 :: Word8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-pack str = unsafeCreate (length str) $ \p -> go p  str
-  where
-    go _ []     = return ()
-    go p (x:xs) = poke p x >> go (p `plusPtr` 1) xs
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-unsafeIndex (PS x s l) i = liquidAssert (i >= 0 && i < l)  $
-    unsafePerformIO $ withForeignPtr x $ \p -> peekByteOff p (s+i)
-
-
-
-
-good = let b = pack [1,2,3]
-       in unsafeIndex b 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- Helper Code
------------------------------------------------------------------------
-{-@ unsafeCreate :: l:Nat -> (PtrN Word8 l -> IO ()) -> (ByteStringN l) @-}
-unsafeCreate n f = unsafePerformIO $ create n f
-
-{-@ invariant {v:ByteString   | bLength  v >= 0} @-}
-
-{-@ qualif PLLen(v:a, p:b) : (len v) <= (plen p) @-}
-{-@ qualif ForeignPtrN(v:ForeignPtr a, n:int): fplen v = n @-}
-{-@ qualif FPLenPLen(v:Ptr a, fp:ForeignPtr a): fplen fp = plen v @-}
-{-@ qualif PtrLen(v:Ptr a, xs:List b): plen v = len xs @-}
-{-@ qualif PlenEq(v: Ptr a, x: int): x <= (plen v) @-}
-
--- Local Variables:
--- flycheck-checker: haskell-liquid
--- End:
-
-create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteString
-unsafeIndex :: ByteString -> Int -> Word8
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--diffcheck"      @-}
-{-@ LIQUID "--short-names"    @-}
diff --git a/docs/slides/HS2014/ByteString.lhs b/docs/slides/HS2014/ByteString.lhs
deleted file mode 100644
--- a/docs/slides/HS2014/ByteString.lhs
+++ /dev/null
@@ -1,344 +0,0 @@
-> {-@ LIQUID "--no-termination" @-}
-> {-@ LIQUID "--short-names"    @-}
-> {-@  LIQUID "--diffcheck"     @-}
-> {-# LANGUAGE ForeignFunctionInterface #-}
-> 
-> module Bytestring where
-> 
-> import Prelude hiding (null)
-> import Data.Char
-> import Data.Word
-> import Foreign.C.Types
-> import Foreign.ForeignPtr
-> import Foreign.Ptr
-> import Foreign.Storable
-> import System.IO.Unsafe
-> import Language.Haskell.Liquid.Prelude
-
-Now for some real fun, let's try to prove that `ByteString` is memory-safe! 
-
-`ByteString`s are at the heart of many Haskell applications, e.g. web servers, 
-and, as we saw at the beginning of the talk, a bad access can lead to a segfault 
-or, even worse, leaking arbitrary memory.
-
-A `ByteString` consists of a pointer into a region of memory, an offset into 
-the region, and a length.
-
-> data ByteString = PS { bPayload :: ForeignPtr Word8
->                      , bOffset  :: !Int
->                      , bLength  :: !Int
->                      }
-
-The crucial invariant is that we should only be able to reach valid memory 
-locations via the offset and length, i.e. the sum `off + len` *must not exceed* 
-the "length" of the pointer.
-
-> {-@ data ByteString = PS
->       { bPayload :: ForeignPtr Word8
->       , bOffset  :: {v:Nat | v           <= fplen bPayload}
->       , bLength  :: {v:Nat | bOffset + v <= fplen bPayload}
->       }
->   @-}
-
-What is the "length" of a pointer? It's the number of bytes that are
-addressable from the base of the pointer. We can't compute it, but that
-won't stop us from talking about it in our types. We provide a "ghost"
-measure called `fplen` to refer to this length.
-
-NV: "ghost measure" is more complicated than uninterpreted function
-
-< {-@ measure fplen :: ForeignPtr a -> Int @-}
-
-and use it to define a foreign-pointer to a segment containing *N* bytes
-
-> {-@ type ForeignN a N = {v:ForeignPtr a | fplen v = N} @-}
-
-Since we haven't defined any equations for `fplen` we won't get strengthed 
-constructors. Instead, we will *assume* that `malloc` behaves sensibly and
-allocates the number of bytes you asked for.
-
-> {-@ assume mallocForeignPtrBytes :: n:Nat -> IO (ForeignN a n) @-}
-
-Now let's create a few `ByteString`s. Here's a `ByteString` with 5 valid 
-indices. 
-
-> good_bs1 = do fp <- mallocForeignPtrBytes 5
->               return $ PS fp 0 5
-
-Note that the *length* of the BS is *not* the same as the region
-of allocated memory. 
-
-Here's a `ByteString` whose pointer region has 5-bytes, but the BS itself
-is of size 4.
- 
-> good_bs2 = do fp <- mallocForeignPtrBytes 5
->               return $ PS fp 2 4
-
-LiquidHaskell won't let us build a `ByteString` that claims to have more valid 
-indices than it *actually* does
-
-> bad_bs1 = do
->   fp <- mallocForeignPtrBytes 0 
->   return $ PS fp 0 10 
-
-even if we try to be sneaky with the length parameter.
-
-> bad_bs2 = do fp <- mallocForeignPtrBytes 3
->              return $ PS fp 2 2
-
-
-Creating ByteStrings
---------------------
-
-Nobody actually builds `ByteString`s like this though.
-
-The authors have kindly provided a higher-order function
-called `create` to handle the actual allocation. To `create`
-a `ByteString` you have to say how many bytes you want and
-provide a function that will fill in the newly allocated memory.
-
-> create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteString
-> create l f = do
->     fp <- mallocForeignPtrBytes l
->     withForeignPtr fp $ \p -> f p
->     return $! PS fp 0 l
-
-But this seems horribly unsafe!
-
-What's to stop the parameter `f` from poking any random,
-invalid offset from the pointer it wants to?
-
-We could, e.g.
-
-* create a BS of size `5`, and
-* write a `0` at the index `10`.
-
-ASIDE: have these assumed types around to suppress the type-errors that LH will 
-       show, just remove them when script introduces type
-
-> {- assume plusPtr :: p:Ptr a -> n:Int -> Ptr b      @-}
-> {- assume poke :: Storable a => Ptr a -> a -> IO () @-}
-
-END ASIDE
-
-> bad_create = create 5 $ \p -> poke (p `plusPtr` 10) (0 :: Word8)
-
-which clearly isn't correct. We'd like to say that the provided
-function can only address locations a up to a certain offset
-from the pointer.
-
-Just as we had `fplen` to talk about the "length" of a `ForeignPtr`,
-we have provided `plen` to talk about the "length" of a `Ptr`, and
-we've defined a helpful alias
-
-< {-@ type PtrN a N = {v:Ptr a | plen v = N} @-}
-
-which says that a `PtrN a n` has precisely `n` addressable bytes
-from its base.
-
-
-Pointer Arithmetic
-------------------
-
-We have also given `plusPtr` the type
-
-< {-@ plusPtr :: p:Ptr a -> n:Int -> {v:Ptr a | plen v = plen p - n} @-}
-
-which says that as you increment a `Ptr`, you're left with fewer addressable
-bytes.
-
-Finally, we type `poke` as 
-
-< {-@ poke :: Storable a => {v:Ptr a | 0 <= plen v } -> a -> IO () @-}
-
-which says that the given `Ptr` must be addressable in order to safely `poke` it.
-
-Now we have all of the necessary tools to *prevent* ourselves from
-shooting ourselves in the foot with functions like `bad_create`.
-
-We'll just give `create` the type
- 
-> {-@ create :: l:Nat -> (PtrN Word8 l -> IO ()) -> IO (ByteStringN l) @-}
-
-where the alias
-
-> {-@ type ByteStringN N = {v:ByteString | bLength v = N} @-}
-
-describes `ByteString`s of length `N`.
-
-Lo and behold, LiquidHaskell has flagged `bad_create` as unsafe! 
-
-Furthermore, we can write things like
-
-> good_create = create 5 $ \p -> poke (p `plusPtr` 2) (0 :: Word8)
-
-Here's a real example from the BS library:
-
-> packWith        :: (a -> Word8) -> [a] -> ByteString
-> packWith k str  = unsafeCreate (length str) $ \p -> go p str
->   where
->     go _ []     = return ()
->     go p (x:xs) = poke p (k x) >> go (p `plusPtr` 1) xs
-
-proving that `pack` will *never* write out-of-bounds!
-
-
-ES: CUT
-
-
-Nested Data
------------
-
-For a more in depth example, let's take a look at `group`,
-which transforms strings like
-
-   `"foobaaar"`
-
-into *lists* of strings like
-
-   `["f","oo", "b", "aaa", "r"]`.
-
-The specification is that `group` should produce a list of `ByteStrings`
-
-1. that are all *non-empty* (safety)
-2. the sum of whose lengths is equal to the length of the input string (precision)
-
-We use the type alias
-
-> {-@ type ByteStringNE = {v:ByteString | bLength v > 0} @-}
-
-to specify (safety) and introduce a new measure
-
-> {-@ measure bLengths  :: [ByteString] -> Int
->     bLengths ([])   = 0
->     bLengths (x:xs) = (bLength x) + (bLengths xs)
->   @-}
-
-to specify (precision). The full type-specification looks like this:
-
-> {-@ group :: b:ByteString -> {v: [ByteStringNE] | bLengths v = bLength b} @-}
-> group xs
->     | null xs   = []
->     | otherwise = let y = unsafeHead xs
->                       (ys, zs) = spanByte (unsafeHead xs) (unsafeTail xs)
->                   in (y `cons` ys) : group zs
-
-As you can probably tell, `spanByte` appears to be doing a lot of the work here,
-so let's take a closer look at it to see why the post-condition holds.
-
-> spanByte :: Word8 -> ByteString -> (ByteString, ByteString)
-> spanByte c ps@(PS x s l) = unsafePerformIO $ withForeignPtr x $ \p ->
->     go (p `plusPtr` s) 0
->   where
->     go p i | i >= l    = return (ps, empty)
->            | otherwise = do c' <- peekByteOff p i
->                             if c /= c'
->                                 then return (unsafeTake i ps, unsafeDrop i ps)
->                                 else go p (i+1)
-
-LiquidHaskell infers that `0 <= i <= l` and therefore that all of the memory
-accesses are safe. Furthermore, due to the precise specifications given to
-`unsafeTake` and `unsafeDrop`, it is able to prove that `spanByte` has the type
-
-> {-@ spanByte :: Word8 -> b:ByteString -> (ByteStringPair b) @-}
-
-where `ByteStringPair b` describes a pair of `ByteString`s whose lengths sum to
-the length of `b`.
-
-> {-@ type ByteStringPair B = (ByteString, ByteString)<{\x1 x2 ->
->       bLength x1 + bLength x2 = bLength B}> @-}
-
-
-RJ:LIMITATIONS
-
-Those familiar with the internals of ByteString may notice that we have made a
-small change in `group`, the original implementation was
-
-< group :: ByteString -> [ByteString]
-< group xs
-<     | null xs   = []
-<     | otherwise = ys : group zs
-<     where
-<         (ys, zs) = spanByte (unsafeHead xs) xs
-
-Unfortunately this change was necessary in order to prove the safety invariant,
-that `group` returns a list of non-empty `ByteString`s. The real type we would
-like to give to `spanByte` (which would enable verification of the original
-`group`) would say something like
-
-  `spanByte x b` returns a pair of `ByteString`s, the first of which is non-empty
-  *iff* `x = head b`
-
-but it is unclear how to prove this at the moment in LiquidHaskell
-(TODO: figure out what would need to change to prove this.)
-
-> -----------------------------------------------------------------------
-> -- Helper Code
-> -----------------------------------------------------------------------
-> {-@ unsafeCreate :: l:Nat -> ((PtrN Word8 l) -> IO ()) -> (ByteStringN l) @-}
-> unsafeCreate n f = unsafePerformIO $ create n f
->
-> {-@ invariant {v:ByteString   | bLength  v >= 0} @-}
-> {-@ invariant {v:[ByteString] | bLengths v >= 0} @-}
-> 
-> {-@ qualif PLLen(v:a, p:b) : (len v) <= (plen p) @-}
-> {-@ qualif ForeignPtrN(v:ForeignPtr a, n:int): fplen v = n @-}
-> {-@ qualif FPLenPLen(v:Ptr a, fp:ForeignPtr a): fplen fp = plen v @-}
-> {-@ qualif PtrLen(v:Ptr a, xs:List b): plen v = len xs @-}
-> {-@ qualif PlenEq(v: Ptr a, x: int): x <= (plen v) @-}
->
-> {-@ unsafeHead :: {v:ByteString | (bLength v) > 0} -> Word8 @-}
-> unsafeHead :: ByteString -> Word8
-> unsafeHead (PS x s l) = liquidAssert (l > 0) $
->   unsafePerformIO  $  withForeignPtr x $ \p -> peekByteOff p s
-> 
-> {-@ unsafeTail :: b:{v:ByteString | (bLength v) > 0}
->                -> {v:ByteString | (bLength v) = (bLength b) - 1} @-}
-> unsafeTail :: ByteString -> ByteString
-> unsafeTail (PS ps s l) = liquidAssert (l > 0) $ PS ps (s+1) (l-1)
-> 
-> {-@ null :: b:ByteString -> {v:Bool | ((Prop v) <=> ((bLength b) = 0))} @-}
-> null :: ByteString -> Bool
-> null (PS _ _ l) = liquidAssert (l >= 0) $ l <= 0
-> 
-> {-@ unsafeTake :: n:Nat -> b:{v: ByteString | n <= (bLength v)} -> (ByteStringN n) @-}
-> unsafeTake :: Int -> ByteString -> ByteString
-> unsafeTake n (PS x s l) = liquidAssert (0 <= n && n <= l) $ PS x s n
-> 
-> {-@ unsafeDrop :: n:Nat
->                -> b:{v: ByteString | n <= (bLength v)} 
->                -> {v:ByteString | (bLength v) = (bLength b) - n} @-}
-> unsafeDrop  :: Int -> ByteString -> ByteString
-> unsafeDrop n (PS x s l) = liquidAssert (0 <= n && n <= l) $ PS x (s+n) (l-n)
-> 
-> {-@ cons :: Word8 -> b:ByteString -> {v:ByteString | (bLength v) = 1 + (bLength b)} @-}
-> cons :: Word8 -> ByteString -> ByteString
-> cons c (PS x s l) = unsafeCreate (l+1) $ \p -> withForeignPtr x $ \f -> do
->         poke p c
->         memcpy (p `plusPtr` 1) (f `plusPtr` s) (fromIntegral l)
-> 
-> {-@ empty :: {v:ByteString | (bLength v) = 0} @-} 
-> empty :: ByteString
-> empty = PS nullForeignPtr 0 0
-> 
-> {-@ assume
->     c_memcpy :: dst:(PtrV Word8)
->              -> src:(PtrV Word8) 
->              -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))} 
->              -> IO (Ptr Word8)
->   @-}
-> foreign import ccall unsafe "string.h memcpy" c_memcpy
->     :: Ptr Word8 -> Ptr Word8 -> CSize -> IO (Ptr Word8)
-> 
-> {-@ memcpy :: dst:(PtrV Word8)
->            -> src:(PtrV Word8) 
->            -> size: {v:CSize | (v <= (plen src) && v <= (plen dst))} 
->            -> IO () 
->   @-}
-> memcpy :: Ptr Word8 -> Ptr Word8 -> CSize -> IO ()
-> memcpy p q s = c_memcpy p q s >> return ()
-> 
-> {-@ assume nullForeignPtr :: {v: ForeignPtr Word8 | (fplen v) = 0} @-}
-> nullForeignPtr :: ForeignPtr Word8
-> nullForeignPtr = unsafePerformIO $ newForeignPtr_ nullPtr
-> {-# NOINLINE nullForeignPtr #-}
diff --git a/docs/slides/HS2014/TODO.md b/docs/slides/HS2014/TODO.md
deleted file mode 100644
--- a/docs/slides/HS2014/TODO.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Timing
-- basics     5min (currently 12)
-- totality   7min (currently 7)
-- bytestring 8min (currently 12)
-
-figure out sub-segments, allocate time to each, rehearse in isolation
-
-## Desired
-- intro / contrived unsafeIndex motivator: 1 min
-- basics: 6 min
-  - list of numbers between 0 and 100: 1.5 min
-  - range + bug: 1.5 min
-  - measures​ / add length to range output​: ​3​ min
-  - CSV: 1 min
-- totality: 5 min
-  - head: 2 min
-  - safeZipWith: 1 min
-  - nestcomment: 2 min
-- bytestring: 9 min
-  - data definition: 1 min
-  - fplen / "ghost measures": 1 min
-  - make good / bad bytestrings manually: 1 min
-  - create: 4 min
-  - pack: 1 min
-  - unsafeIndex / preventing motivating segfault: 1 min
-- results / conclusion: 1 min
diff --git a/docs/slides/HS2014/Totality-blank.hs b/docs/slides/HS2014/Totality-blank.hs
deleted file mode 100644
--- a/docs/slides/HS2014/Totality-blank.hs
+++ /dev/null
@@ -1,73 +0,0 @@
-{-@ LIQUID "--totality" @-}
-module Totality where
-
-import Prelude hiding (head)
-
-head (x:_) = x
-
--- head xs = case xs of
---   (x:_) -> x
---   []    -> patError "..."
-
--- patError :: {v:String | false} -> a
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-nestcomment n ('{':'-':ss) | n>=0 = (("{-"++cs),rm)
-                                  where (cs,rm) = nestcomment (n+1) ss
-nestcomment n ('-':'}':ss) | n>0  = let (cs,rm) = nestcomment (n-1) ss
-                                    in (("-}"++cs),rm)
-nestcomment n ('-':'}':ss) | n==0 = ("-}",ss)
-nestcomment n (s:ss)       | n>=0 = ((s:cs),rm)
-                                  where (cs,rm) = nestcomment n ss
-nestcomment n [] = ([],[])
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--- Local Variables:
--- flycheck-checker: haskell-liquid
--- End:
-
-nestcomment :: Int -> String -> (String,String)
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--diffcheck"      @-}
-{-@ LIQUID "--short-names"    @-}
diff --git a/docs/slides/HS2014/Totality.lhs b/docs/slides/HS2014/Totality.lhs
deleted file mode 100644
--- a/docs/slides/HS2014/Totality.lhs
+++ /dev/null
@@ -1,126 +0,0 @@
-> {-@ LIQUID "--no-termination" @-}
-> {-@ LIQUID "--totality"       @-}
-> {-@ LIQUID "--diffcheck"      @-}
-> 
-> module Totality where
-> 
-> import Prelude hiding (head)
-> import Language.Haskell.Liquid.Prelude
-> import Control.Exception.Base
-
-One of the most maligned Haskell functions is also one of the simplest.
-
-> head (x:_) = x
-
-Many people argue that `head` and co. should be removed from the Prelude because
-they're partial functions, and partial functions are dangerous.
-
-The often-recommended alternative of making partial functions return a `Maybe` or
-`Either` is often tedious and encourages the use of *other* partial functions like `fromJust`.
-
-What we really ought to do is *prove* that undefined case can never arise.
-
-This is relatively easy in LiquidHaskell.
-
-GHC already does much of the heavy lifting by filling in all of the undefined
-cases with explicit calls to various error functions, e.g.
-
-< head (x:_) = x
-
-is transformed into
-
-< head xs = case xs of
-<   (x:_) = x
-<   []    = patError "..."
-
-The path is clear, we want to make LiquidHaskell prove that we will never call 
-any of these internal error functions that GHC inserts. We can accomplish this 
-by giving each function a refined type where the pre-condition is `false`, i.e.
-
-< {-@ patError :: {v:_ | false} -> a @-}
-
-*If* LiquidHaskell can prove `false` at any of these callsites, it means there 
-was a contradiction somewhere along the way and the call is effectively dead 
-code. So how do we prove that `patError` is unreachable in `head`?
-
-We can specify that `head` should only be called with *non-empty* lists by 
-giving it a refined type like
-
-> {-@ head :: {v:[a] | 0 < len v} -> a @-}
-
-Now, when LiquidHaskell sees the case-analysis on the `[]` case, it puts
-
-< len xs = 0
-
-in the environemnt as usual, *but* we just gave `head` a pre-condition that
-
-< len xs > 0
-
-So we actually end up with
-
-< len xs = 0 && len xs > 0
-
-which is a contradiction, therefore it is safe to "call" `patError` since we 
-have proven that the call will never *actually* happen.
-
-
-Partial Zipping
----------------
-
-Inside LiquidHaskell, we often want to combine multiple lists, so we use the 
-stalwart `zipWith` function. The problem with `zipWith` is that if the two 
-lists are *not* the same size, it will *silently drop* the remaining items of 
-the longer list.
-
-This is almost *never* what we want, instead we consider it an error to call 
-`zipWith` on lists of non-equal length. So we've written our own `safeZipWith` 
-function that leaves the case of zipping a nil and a cons undefined.
-
-> safeZipWith f = go
->   where
->     go (x:xs) (y:ys) = f x y : go xs ys
->     go []     []     = []
-
-As you can see, LiquidHaskell is not happy with this definition! It (rightly) 
-complains that we've left a case unhandled because we haven't yet told it that 
-we only want `safeZipWith` to accept lists of equal length. Luckily, this is 
-easily rectified, we'll introduce a handy type-alias for a list with the same
-length as another list
-
-> {-@ type ListL a Xs = {v:[a] | len v == len Xs} @-} 
-
-and use it to concisely express our contract for `safeZipWith`.
-
-> {-@ safeZipWith :: (a -> b -> c) -> xs:[a] -> ListL b xs -> ListL c xs @-}
-
-
-Totality in Real-World
-----------------------
-
-If that was not convincing enough, I'll leave you with a final example from 
-HsColour, which is probably invoked thousands of times per day.
-
-> nestcomment :: Int -> String -> (String, String)
-> nestcomment n ('{':'-':ss) | n>=0 = (("{-"++   cs),rm)
->                                   where (cs,rm) = nestcomment (n+1) ss
-> nestcomment n ('-':'}':ss) | n>0  = let (cs,rm) = nestcomment (n-1) ss
->                                     in (("-}"++cs),rm)
-> nestcomment n ('-':'}':ss) | n==0 = ("-}",ss)
-> nestcomment n (s:ss)       | n>=0 = ((s:cs),rm)
->                                   where (cs,rm) = nestcomment n ss
-> nestcomment n [] = ([],[])
-
-What this function does precisely is not that important, notice instead that 
-LiquidHaskell has flagged it as partial, because there's an unhandled case
-
-< nestcomment n (s:ss) | n < 0 = ????
-
-Well, it doesn't seem particularly sensible to have a *negative* nesting depth, 
-so we'll just tell LiquidHaskell that `nestcomment` should really only be 
-called with natural numbers (without incurring the wrath of Peano numbers)!
-
-> {-@ nestcomment :: Nat -> _ -> (_,_) @-}
-
-
-So that was totality, next let's try something more ambitious, proving memory 
-safety in `ByteString`!
diff --git a/docs/slides/IHP14/Makefile b/docs/slides/IHP14/Makefile
deleted file mode 100644
--- a/docs/slides/IHP14/Makefile
+++ /dev/null
@@ -1,91 +0,0 @@
-####################################################################
-SERVERHOME=nvazou@goto.ucsd.edu:~/public_html/liquidtutorial/
-RJSERVER=rjhala@goto.ucsd.edu:~/public_html/liquid/haskell/plpv/lhs/
-####################################################################
-
-STRIPCODE=./MkCode.hs
-
-REVEAL=pandoc \
-	   --from=markdown\
-	   --to=html5                           \
-	   --standalone                         \
-	   --mathjax \
-	   --section-divs                       \
-	   --template=_support/template.reveal  \
-	   --variable reveal=../_support/reveal.js
-
-FREVEAL=pandoc \
- 	   --from=markdown+lhs\
-	   --to=html5                           \
-	   --standalone                         \
-	   --mathjax \
-	   --section-divs                       \
-	   --template=_support/template.reveal  \
-	   --variable reveal=../_support/reveal.js
-
-PANDOC=pandoc --columns=80  -s --mathjax --slide-level=2
-SLIDY=$(PANDOC) -t slidy
-DZSLIDES=$(PANDOC) --highlight-style tango --css=slides.css -w dzslides
-HANDOUT=$(PANDOC) --highlight-style tango --css=text.css -w html5
-WEBTEX=$(PANDOC) -s --webtex -i -t slidy
-BEAMER=pandoc -t beamer
-LIQUID=liquid --short-names 
-
-mdObjects   := $(patsubst %.lhs,%.lhs.markdown,$(wildcard lhs/*.lhs))
-htmlObjects := $(patsubst %.lhs,%.lhs.slides.html,$(wildcard lhs/*.lhs))
-pdfObjects  := $(patsubst %.lhs,%.lhs.slides.pdf,$(wildcard lhs/*.lhs))
-fhtmlObjects := $(patsubst %.lhs,%.fast.html,$(wildcard lhs/*.lhs))
-
-####################################################################
-
-
-all: slides 
-
-fast: $(fhtmlObjects)
-
-one: $(mdObjects)
-	$(REVEAL) lhs/.liquid/00_Index.lhs.markdown > lhs/index.html
-
-tut: $(mdObjects)
-	$(REVEAL) lhs/.liquid/*.markdown > lhs/tutorial.html 
-
-slides: $(htmlObjects)
-
-
-pdfslides: $(pdfObjects)
-
-plpv: slides
-	scp lhs/*.html $(RJSERVER)
-
-lhs/.liquid/%.lhs.markdown: lhs/%.lhs
-	-$(LIQUID) $?
-
-
-lhs/%.fast: lhs/%.lhs
-	$(STRIPCODE) $? > $@ 
-
-lhs/%.fast.html: lhs/%.fast
-	$(FREVEAL) $? -o $@ 
-
-lhs/%.lhs.slides.html: lhs/.liquid/%.lhs.markdown
-	$(REVEAL) $? -o $@ 
-
-lhs/%.lhs.slides.pdf: lhs/.liquid/%.lhs.markdown
-	$(BEAMER) $? -o $@
-
-
-copy:
-	cp lhs/*lhs.html html/
-	cp lhs/*lhs.slides.html html/
-	cp css/*.css html/
-	cp -r fonts html/
-	cp index.html html/
-	cp Benchmarks.html html/
-
-clean:
-	cd lhs/ && ../cleanup && cd ../
-#	cd html/ && rm -rf * && cd ../
-#	cp index.html html/
-
-upload: 
-	scp -r html/* $(SERVERHOME)
diff --git a/docs/slides/IHP14/MkCode.hs b/docs/slides/IHP14/MkCode.hs
deleted file mode 100644
--- a/docs/slides/IHP14/MkCode.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env runhaskell
-
-import System.Environment   (getArgs)
-import System.FilePath      (replaceExtension)
-import Data.Char            (isSpace)
-import Data.List            (isPrefixOf)
-
-main     = getArgs >>= mapM txFile 
-
-txFile f = (putStrLn . unlines . map txLine . lines) =<< readFile f
-
-txLine l 
-  | pfx `isPrefixOf` l = pfx
-  | otherwise          = l
-  where
-    pfx                = "\\begin{code}"
-
diff --git a/docs/slides/IHP14/_support/.template2.reveal.swp b/docs/slides/IHP14/_support/.template2.reveal.swp
deleted file mode 100644
Binary files a/docs/slides/IHP14/_support/.template2.reveal.swp and /dev/null differ
diff --git a/docs/slides/IHP14/_support/liquid.css b/docs/slides/IHP14/_support/liquid.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/IHP14/_support/liquidhaskell.css b/docs/slides/IHP14/_support/liquidhaskell.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/liquidhaskell.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/IHP14/_support/reveal.js/.travis.yml b/docs/slides/IHP14/_support/reveal.js/.travis.yml
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - 0.8
-before_script:
-  - npm install -g grunt-cli
diff --git a/docs/slides/IHP14/_support/reveal.js/Gruntfile.js b/docs/slides/IHP14/_support/reveal.js/Gruntfile.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/Gruntfile.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/* global module:false */
-module.exports = function(grunt) {
-	var port = grunt.option('port') || 8000;
-	// Project configuration
-	grunt.initConfig({
-		pkg: grunt.file.readJSON('package.json'),
-		meta: {
-			banner:
-				'/*!\n' +
-				' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
-				' * http://lab.hakim.se/reveal-js\n' +
-				' * MIT licensed\n' +
-				' *\n' +
-				' * Copyright (C) 2014 Hakim El Hattab, http://hakim.se\n' +
-				' */'
-		},
-
-		qunit: {
-			files: [ 'test/*.html' ]
-		},
-
-		uglify: {
-			options: {
-				banner: '<%= meta.banner %>\n'
-			},
-			build: {
-				src: 'js/reveal.js',
-				dest: 'js/reveal.min.js'
-			}
-		},
-
-		cssmin: {
-			compress: {
-				files: {
-					'css/reveal.min.css': [ 'css/reveal.css' ]
-				}
-			}
-		},
-
-		sass: {
-			main: {
-				files: {
-					'css/theme/default.css': 'css/theme/source/default.scss',
-					'css/theme/beige.css': 'css/theme/source/beige.scss',
-					'css/theme/night.css': 'css/theme/source/night.scss',
-					'css/theme/serif.css': 'css/theme/source/serif.scss',
-					'css/theme/simple.css': 'css/theme/source/simple.scss',
-					'css/theme/sky.css': 'css/theme/source/sky.scss',
-					'css/theme/moon.css': 'css/theme/source/moon.scss',
-					'css/theme/solarized.css': 'css/theme/source/solarized.scss',
-					'css/theme/blood.css': 'css/theme/source/blood.scss'
-				}
-			}
-		},
-
-		jshint: {
-			options: {
-				curly: false,
-				eqeqeq: true,
-				immed: true,
-				latedef: true,
-				newcap: true,
-				noarg: true,
-				sub: true,
-				undef: true,
-				eqnull: true,
-				browser: true,
-				expr: true,
-				globals: {
-					head: false,
-					module: false,
-					console: false,
-					unescape: false
-				}
-			},
-			files: [ 'Gruntfile.js', 'js/reveal.js' ]
-		},
-
-		connect: {
-			server: {
-				options: {
-					port: port,
-					base: '.'
-				}
-			}
-		},
-
-		zip: {
-			'reveal-js-presentation.zip': [
-				'index.html',
-				'css/**',
-				'js/**',
-				'lib/**',
-				'images/**',
-				'plugin/**'
-			]
-		},
-
-		watch: {
-			main: {
-				files: [ 'Gruntfile.js', 'js/reveal.js', 'css/reveal.css' ],
-				tasks: 'default'
-			},
-			theme: {
-				files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ],
-				tasks: 'themes'
-			}
-		}
-
-	});
-
-	// Dependencies
-	grunt.loadNpmTasks( 'grunt-contrib-qunit' );
-	grunt.loadNpmTasks( 'grunt-contrib-jshint' );
-	grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
-	grunt.loadNpmTasks( 'grunt-contrib-uglify' );
-	grunt.loadNpmTasks( 'grunt-contrib-watch' );
-	grunt.loadNpmTasks( 'grunt-contrib-sass' );
-	grunt.loadNpmTasks( 'grunt-contrib-connect' );
-	grunt.loadNpmTasks( 'grunt-zip' );
-
-	// Default task
-	grunt.registerTask( 'default', [ 'jshint', 'cssmin', 'uglify', 'qunit' ] );
-
-	// Theme task
-	grunt.registerTask( 'themes', [ 'sass' ] );
-
-	// Package presentation to archive
-	grunt.registerTask( 'package', [ 'default', 'zip' ] );
-
-	// Serve presentation locally
-	grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
-
-	// Run tests
-	grunt.registerTask( 'test', [ 'jshint', 'qunit' ] );
-
-};
diff --git a/docs/slides/IHP14/_support/reveal.js/LICENSE b/docs/slides/IHP14/_support/reveal.js/LICENSE
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2014 Hakim El Hattab, http://hakim.se
-
-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.
diff --git a/docs/slides/IHP14/_support/reveal.js/README.md b/docs/slides/IHP14/_support/reveal.js/README.md
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/README.md
+++ /dev/null
@@ -1,933 +0,0 @@
-# reveal.js [![Build Status](https://travis-ci.org/hakimel/reveal.js.png?branch=master)](https://travis-ci.org/hakimel/reveal.js)
-
-A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://lab.hakim.se/reveal-js/).
-
-reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). It's best viewed in a browser with support for CSS 3D transforms but [fallbacks](https://github.com/hakimel/reveal.js/wiki/Browser-Support) are available to make sure your presentation can still be viewed elsewhere.
-
-
-#### More reading:
-- [Installation](#installation): Step-by-step instructions for getting reveal.js running on your computer.
-- [Changelog](https://github.com/hakimel/reveal.js/releases): Up-to-date version history.
-- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own!
-- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks.
-
-## Online Editor
-
-Presentations are written using HTML or markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [http://slid.es](http://slid.es).
-
-
-## Instructions
-
-### Markup
-
-Markup hierarchy needs to be ``<div class="reveal"> <div class="slides"> <section>`` where the ``<section>`` represents one slide and can be repeated indefinitely. If you place multiple ``<section>``'s inside of another ``<section>`` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and it will be included in the horizontal sequence. For example:
-
-```html
-<div class="reveal">
-	<div class="slides">
-		<section>Single Horizontal Slide</section>
-		<section>
-			<section>Vertical Slide 1</section>
-			<section>Vertical Slide 2</section>
-		</section>
-	</div>
-</div>
-```
-
-### Markdown
-
-It's possible to write your slides using Markdown. To enable Markdown, add the ```data-markdown``` attribute to your ```<section>``` elements and wrap the contents in a ```<script type="text/template">``` like the example below.
-
-This is based on [data-markdown](https://gist.github.com/1343518) from [Paul Irish](https://github.com/paulirish) modified to use [marked](https://github.com/chjj/marked) to support [Github Flavoured Markdown](https://help.github.com/articles/github-flavored-markdown). Sensitive to indentation (avoid mixing tabs and spaces) and line breaks (avoid consecutive breaks).
-
-```html
-<section data-markdown>
-	<script type="text/template">
-		## Page title
-
-		A paragraph with some text and a [link](http://hakim.se).
-	</script>
-</section>
-```
-
-#### External Markdown
-
-You can write your content as a separate file and have reveal.js load it at runtime. Note the separator arguments which determine how slides are delimited in the external file. The ```data-charset``` attribute is optional and specifies which charset to use when loading the external file.
-
-When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup).
-
-```html
-<section data-markdown="example.md"  
-         data-separator="^\n\n\n"  
-         data-vertical="^\n\n"  
-         data-notes="^Note:"  
-         data-charset="iso-8859-15">
-</section>
-```
-
-#### Element Attributes
-
-Special syntax (in html comment) is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things.
-
-```html
-<section data-markdown>
-	<script type="text/template">
-		- Item 1 <!-- .element: class="fragment" data-fragment-index="2" -->
-		- Item 2 <!-- .element: class="fragment" data-fragment-index="1" -->
-	</script>
-</section>
-```
-
-#### Slide Attributes
-
-Special syntax (in html comment) is available for adding attributes to the slide `<section>` elements generated by your Markdown.
-
-```html
-<section data-markdown>
-	<script type="text/template">
-	<!-- .slide: data-background="#ff0000" -->
-		Markdown content
-	</script>
-</section>
-```
-
-
-### Configuration
-
-At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below.
-
-```javascript
-Reveal.initialize({
-
-	// Display controls in the bottom right corner
-	controls: true,
-
-	// Display a presentation progress bar
-	progress: true,
-
-	// Display the page number of the current slide
-	slideNumber: false,
-
-	// Push each slide change to the browser history
-	history: false,
-
-	// Enable keyboard shortcuts for navigation
-	keyboard: true,
-
-	// Enable the slide overview mode
-	overview: true,
-
-	// Vertical centering of slides
-	center: true,
-
-	// Enables touch navigation on devices with touch input
-	touch: true,
-
-	// Loop the presentation
-	loop: false,
-
-	// Change the presentation direction to be RTL
-	rtl: false,
-
-	// Turns fragments on and off globally
-	fragments: true,
-
-	// Flags if the presentation is running in an embedded mode,
-	// i.e. contained within a limited portion of the screen
-	embedded: false,
-
-	// Number of milliseconds between automatically proceeding to the
-	// next slide, disabled when set to 0, this value can be overwritten
-	// by using a data-autoslide attribute on your slides
-	autoSlide: 0,
-
-	// Stop auto-sliding after user input
-	autoSlideStoppable: true,
-
-	// Enable slide navigation via mouse wheel
-	mouseWheel: false,
-
-	// Hides the address bar on mobile devices
-	hideAddressBar: true,
-
-	// Opens links in an iframe preview overlay
-	previewLinks: false,
-
-	// Transition style
-	transition: 'default', // default/cube/page/concave/zoom/linear/fade/none
-
-	// Transition speed
-	transitionSpeed: 'default', // default/fast/slow
-
-	// Transition style for full page slide backgrounds
-	backgroundTransition: 'default', // default/none/slide/concave/convex/zoom
-
-	// Number of slides away from the current that are visible
-	viewDistance: 3,
-
-	// Parallax background image
-	parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'"
-
-	// Parallax background size
-	parallaxBackgroundSize: '' // CSS syntax, e.g. "2100px 900px"
-
-
-});
-```
-
-Note that the new default vertical centering option will break compatibility with slides that were using transitions with backgrounds (`cube` and `page`). To restore the previous behavior, set `center` to `false`.
-
-
-The configuration can be updated after initialization using the ```configure``` method:
-
-```javascript
-// Turn autoSlide off
-Reveal.configure({ autoSlide: 0 });
-
-// Start auto-sliding every 5s
-Reveal.configure({ autoSlide: 5000 });
-```
-
-
-### Dependencies
-
-Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example:
-
-```javascript
-Reveal.initialize({
-	dependencies: [
-		// Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/
-		{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
-
-		// Interpret Markdown in <section> elements
-		{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-		{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-
-		// Syntax highlight for <code> elements
-		{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
-
-		// Zoom in and out with Alt+click
-		{ src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
-
-		// Speaker notes
-		{ src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } },
-
-		// Remote control your reveal.js presentation using a touch device
-		{ src: 'plugin/remotes/remotes.js', async: true, condition: function() { return !!document.body.classList; } },
-
-		// MathJax
-		{ src: 'plugin/math/math.js', async: true }
-	]
-});
-```
-
-You can add your own extensions using the same syntax. The following properties are available for each dependency object:
-- **src**: Path to the script to load
-- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false
-- **callback**: [optional] Function to execute when the script has loaded
-- **condition**: [optional] Function which must return true for the script to be loaded
-
-
-### Presentation Size
-
-All presentations have a normal size, that is the resolution at which they are authored. The framework will automatically scale presentations uniformly based on this size to ensure that everything fits on any given display or viewport.
-
-See below for a list of configuration options related to sizing, including default values:
-
-```javascript
-Reveal.initialize({
-
-	...
-
-	// The "normal" size of the presentation, aspect ratio will be preserved
-	// when the presentation is scaled to fit different resolutions. Can be
-	// specified using percentage units.
-	width: 960,
-	height: 700,
-
-	// Factor of the display size that should remain empty around the content
-	margin: 0.1,
-
-	// Bounds for smallest/largest possible scale to apply to content
-	minScale: 0.2,
-	maxScale: 1.0
-
-});
-```
-
-
-### Auto-sliding
-
-Presentations can be configure to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides:
-
-```javascript
-// Slide every five seconds
-Reveal.configure({
-  autoSlide: 5000
-});
-```
-
-When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Sliding is also paused automatically as soon as the user starts navigating. You can disable these controls by specifying ```autoSlideStoppable: false``` in your reveal.js config.
-
-You can also override the slide duration for individual slides by using the ```data-autoslide``` attribute on individual sections:
-
-```html
-<section data-autoslide="10000">This will remain on screen for 10 seconds</section>
-```
-
-
-### Keyboard Bindings
-
-If you're unhappy with any of the default keyboard bindings you can override them using the ```keyboard``` config option:
-
-```javascript
-Reveal.configure({
-  keyboard: {
-    13: 'next', // go to the next slide when the ENTER key is pressed
-    27: function() {}, // do something custom when ESC is pressed
-    32: null // don't do anything when SPACE is pressed (i.e. disable a reveal.js default binding)
-  }
-});
-```
-
-
-### API
-
-The ``Reveal`` class provides a JavaScript API for controlling navigation and reading state:
-
-```javascript
-// Navigation
-Reveal.slide( indexh, indexv, indexf );
-Reveal.left();
-Reveal.right();
-Reveal.up();
-Reveal.down();
-Reveal.prev();
-Reveal.next();
-Reveal.prevFragment();
-Reveal.nextFragment();
-Reveal.toggleOverview();
-Reveal.togglePause();
-
-// Retrieves the previous and current slide elements
-Reveal.getPreviousSlide();
-Reveal.getCurrentSlide();
-
-Reveal.getIndices(); // { h: 0, v: 0 } }
-
-// State checks
-Reveal.isFirstSlide();
-Reveal.isLastSlide();
-Reveal.isOverview();
-Reveal.isPaused();
-```
-
-### Ready Event
-
-The 'ready' event is fired when reveal.js has loaded all (synchronous) dependencies and is ready to start navigating.
-
-```javascript
-Reveal.addEventListener( 'ready', function( event ) {
-	// event.currentSlide, event.indexh, event.indexv
-} );
-```
-
-### Slide Changed Event
-
-An 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes.
-
-Some libraries, like MathJax (see [#226](https://github.com/hakimel/reveal.js/issues/226#issuecomment-10261609)), get confused by the transforms and display states of slides. Often times, this can be fixed by calling their update or render function from this callback.
-
-```javascript
-Reveal.addEventListener( 'slidechanged', function( event ) {
-	// event.previousSlide, event.currentSlide, event.indexh, event.indexv
-} );
-```
-
-
-### States
-
-If you set ``data-state="somestate"`` on a slide ``<section>``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide.
-
-Furthermore you can also listen to these changes in state via JavaScript:
-
-```javascript
-Reveal.addEventListener( 'somestate', function() {
-	// TODO: Sprinkle magic
-}, false );
-```
-
-### Slide Backgrounds
-
-Slides are contained within a limited portion of the screen by default to allow them to fit any display and scale uniformly. You can apply full page background colors or images by applying a ```data-background``` attribute to your ```<section>``` elements. Below are a few examples.
-
-```html
-<section data-background="#ff0000">
-	<h2>All CSS color formats are supported, like rgba() or hsl().</h2>
-</section>
-<section data-background="http://example.com/image.png">
-	<h2>This slide will have a full-size background image.</h2>
-</section>
-<section data-background="http://example.com/image.png" data-background-size="100px" data-background-repeat="repeat">
-	<h2>This background image will be sized to 100px and repeated.</h2>
-</section>
-```
-
-Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing ```backgroundTransition: 'slide'``` to the ```Reveal.initialize()``` call. Alternatively you can set ```data-background-transition``` on any section with a background to override that specific transition.
-
-
-### Parallax Background
-
-If you want to use a parallax scrolling background, set the two following config properties when initializing reveal.js (the third one is optional).
-
-```javascript
-Reveal.initialize({
-
-	// Parallax background image
-	parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg"
-
-	// Parallax background size
-	parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto)
-
-	// This slide transition gives best results:
-	transition: linear
-
-});
-```
-
-Make sure that the background size is much bigger than screen size to allow for some scrolling. [View example](http://lab.hakim.se/reveal-js/?parallaxBackgroundImage=https%3A%2F%2Fs3.amazonaws.com%2Fhakim-static%2Freveal-js%2Freveal-parallax-1.jpg&parallaxBackgroundSize=2100px%20900px).
-
-
-
-### Slide Transitions
-The global presentation transition is set using the ```transition``` config value. You can override the global transition for a specific slide by using the ```data-transition``` attribute:
-
-```html
-<section data-transition="zoom">
-	<h2>This slide will override the presentation transition and zoom!</h2>
-</section>
-
-<section data-transition-speed="fast">
-	<h2>Choose from three transition speeds: default, fast or slow!</h2>
-</section>
-```
-
-Note that this does not work with the page and cube transitions.
-
-
-### Internal links
-
-It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```<section id="some-slide">```):
-
-```html
-<a href="#/2/2">Link</a>
-<a href="#/some-slide">Link</a>
-```
-
-You can also add relative navigation links, similar to the built in reveal.js controls, by appending one of the following classes on any element. Note that each element is automatically given an ```enabled``` class when it's a valid navigation route based on the current slide.
-
-```html
-<a href="#" class="navigate-left">
-<a href="#" class="navigate-right">
-<a href="#" class="navigate-up">
-<a href="#" class="navigate-down">
-<a href="#" class="navigate-prev"> <!-- Previous vertical or horizontal slide -->
-<a href="#" class="navigate-next"> <!-- Next vertical or horizontal slide -->
-```
-
-
-### Fragments
-Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://lab.hakim.se/reveal-js/#/fragments
-
-The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment:
-
-```html
-<section>
-	<p class="fragment grow">grow</p>
-	<p class="fragment shrink">shrink</p>
-	<p class="fragment roll-in">roll-in</p>
-	<p class="fragment fade-out">fade-out</p>
-	<p class="fragment current-visible">visible only once</p>
-	<p class="fragment highlight-current-blue">blue only once</p>
-	<p class="fragment highlight-red">highlight-red</p>
-	<p class="fragment highlight-green">highlight-green</p>
-	<p class="fragment highlight-blue">highlight-blue</p>
-</section>
-```
-
-Multiple fragments can be applied to the same element sequentially by wrapping it, this will fade in the text on the first step and fade it back out on the second.
-
-```html
-<section>
-	<span class="fragment fade-in">
-		<span class="fragment fade-out">I'll fade in, then out</span>
-	</span>
-</section>
-```
-
-The display order of fragments can be controlled using the ```data-fragment-index``` attribute.
-
-```html
-<section>
-	<p class="fragment" data-fragment-index="3">Appears last</p>
-	<p class="fragment" data-fragment-index="1">Appears first</p>
-	<p class="fragment" data-fragment-index="2">Appears second</p>
-</section>
-```
-
-### Fragment events
-
-When a slide fragment is either shown or hidden reveal.js will dispatch an event.
-
-Some libraries, like MathJax (see #505), get confused by the initially hidden fragment elements. Often times this can be fixed by calling their update or render function from this callback.
-
-```javascript
-Reveal.addEventListener( 'fragmentshown', function( event ) {
-	// event.fragment = the fragment DOM element
-} );
-Reveal.addEventListener( 'fragmenthidden', function( event ) {
-	// event.fragment = the fragment DOM element
-} );
-```
-
-### Code syntax highlighting
-
-By default, Reveal is configured with [highlight.js](http://softwaremaniacs.org/soft/highlight/en/) for code syntax highlighting. Below is an example with clojure code that will be syntax highlighted. When the `data-trim` attribute is present surrounding whitespace is automatically removed.
-
-```html
-<section>
-	<pre><code data-trim>
-(def lazy-fib
-  (concat
-   [0 1]
-   ((fn rfib [a b]
-        (lazy-cons (+ a b) (rfib b (+ a b)))) 0 1)))
-	</code></pre>
-</section>
-```
-
-### Slide number
-If you would like to display the page number of the current slide you can do so using the ```slideNumber``` configuration value.
-
-```javascript
-Reveal.configure({ slideNumber: true });
-```
-
-
-### Overview mode
-
-Press "Esc" or "o" keys to toggle the overview mode on and off. While you're in this mode, you can still navigate between slides,
-as if you were at 1,000 feet above your presentation. The overview mode comes with a few API hooks:
-
-```javascript
-Reveal.addEventListener( 'overviewshown', function( event ) { /* ... */ } );
-Reveal.addEventListener( 'overviewhidden', function( event ) { /* ... */ } );
-
-// Toggle the overview mode programmatically
-Reveal.toggleOverview();
-```
-
-### Fullscreen mode
-Just press »F« on your keyboard to show your presentation in fullscreen mode. Press the »ESC« key to exit fullscreen mode.
-
-
-### Embedded media
-Embedded HTML5 `<video>`/`<audio>` and YouTube iframes are automatically paused when you navigate away from a slide. This can be disabled by decorating your element with a `data-ignore` attribute.
-
-Add `data-autoplay` to your media element if you want it to automatically start playing when the slide is shown:
-
-```html
-<video data-autoplay src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
-```
-
-Additionally the framework automatically pushes two [post messages](https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) to all iframes, ```slide:start``` when the slide containing the iframe is made visible and ```slide:stop``` when it is hidden.
-
-
-### Stretching elements
-Sometimes it's desirable to have an element, like an image or video, stretch to consume as much space as possible within a given slide. This can be done by adding the ```.stretch``` class to an element as seen below:
-
-```html
-<section>
-	<h2>This video will use up the remaining space on the slide</h2>
-    <video class="stretch" src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
-</section>
-```
-
-Limitations:
-- Only direct descendants of a slide section can be stretched
-- Only one descendant per slide section can be stretched
-
-
-## PDF Export
-
-Presentations can be exported to PDF via a special print stylesheet. This feature requires that you use [Google Chrome](http://google.com/chrome).
-Here's an example of an exported presentation that's been uploaded to SlideShare: http://www.slideshare.net/hakimel/revealjs-13872948.
-
-1. Open your presentation with [css/print/pdf.css](https://github.com/hakimel/reveal.js/blob/master/css/print/pdf.css) included on the page. The default index HTML lets you add *print-pdf* anywhere in the query to include the stylesheet, for example: [lab.hakim.se/reveal-js?print-pdf](http://lab.hakim.se/reveal-js?print-pdf).
-2. Open the in-browser print dialog (CMD+P).
-3. Change the **Destination** setting to **Save as PDF**.
-4. Change the **Layout** to **Landscape**.
-5. Change the **Margins** to **None**.
-6. Click **Save**.
-
-![Chrome Print Settings](https://s3.amazonaws.com/hakim-static/reveal-js/pdf-print-settings.png)
-
-## Theming
-
-The framework comes with a few different themes included:
-
-- default: Gray background, white text, blue links
-- beige: Beige background, dark text, brown links
-- sky: Blue background, thin white text, blue links
-- night: Black background, thick white text, orange links
-- serif: Cappuccino background, gray text, brown links
-- simple: White background, black text, blue links
-- solarized: Cream-colored background, dark green text, blue links
-
-Each theme is available as a separate stylesheet. To change theme you will need to replace **default** below with your desired theme name in index.html:
-
-```html
-<link rel="stylesheet" href="css/theme/default.css" id="theme">
-```
-
-If you want to add a theme of your own see the instructions here: [/css/theme/README.md](https://github.com/hakimel/reveal.js/blob/master/css/theme/README.md).
-
-
-## Speaker Notes
-
-reveal.js comes with a speaker notes plugin which can be used to present per-slide notes in a separate browser window. The notes window also gives you a preview of the next upcoming slide so it may be helpful even if you haven't written any notes. Press the 's' key on your keyboard to open the notes window.
-
-Notes are defined by appending an ```<aside>``` element to a slide as seen below. You can add the ```data-markdown``` attribute to the aside element if you prefer writing notes using Markdown.
-
-When used locally, this feature requires that reveal.js [runs from a local web server](#full-setup).
-
-```html
-<section>
-	<h2>Some Slide</h2>
-
-	<aside class="notes">
-		Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard).
-	</aside>
-</section>
-```
-
-If you're using the external Markdown plugin, you can add notes with the help of a special delimiter:
-
-```html
-<section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n" data-notes="^Note:"></section>
-
-# Title
-## Sub-title
-
-Here is some content...
-
-Note:
-This will only display in the notes window.
-```
-
-## Server Side Speaker Notes
-
-In some cases it can be desirable to run notes on a separate device from the one you're presenting on. The Node.js-based notes plugin lets you do this using the same note definitions as its client side counterpart. Include the required scripts by adding the following dependencies:
-
-```javascript
-Reveal.initialize({
-	...
-
-	dependencies: [
-		{ src: 'socket.io/socket.io.js', async: true },
-		{ src: 'plugin/notes-server/client.js', async: true }
-	]
-});
-```
-
-Then:
-
-1. Install [Node.js](http://nodejs.org/)
-2. Run ```npm install```
-3. Run ```node plugin/notes-server```
-
-
-## Multiplexing
-
-The multiplex plugin allows your audience to view the slides of the presentation you are controlling on their own phone, tablet or laptop. As the master presentation navigates the slides, all client presentations will update in real time. See a demo at [http://revealjs.jit.su/](http://revealjs.jit.su).
-
-The multiplex plugin needs the following 3 things to operate:
-
-1. Master presentation that has control
-2. Client presentations that follow the master
-3. Socket.io server to broadcast events from the master to the clients
-
-More details:
-
-#### Master presentation
-Served from a static file server accessible (preferably) only to the presenter. This need only be on your (the presenter's) computer. (It's safer to run the master presentation from your own computer, so if the venue's Internet goes down it doesn't stop the show.) An example would be to execute the following commands in the directory of your master presentation: 
-
-1. ```npm install node-static```
-2. ```static```
-
-If you want to use the speaker notes plugin with your master presentation then make sure you have the speaker notes plugin configured correctly along with the configuration shown below, then execute ```node plugin/notes-server``` in the directory of your master presentation. The configuration below will cause it to connect to the socket.io server as a master, as well as launch your speaker-notes/static-file server.
-
-You can then access your master presentation at ```http://localhost:1947```
-
-Example configuration:
-```javascript
-Reveal.initialize({
-	// other options...
-
-	multiplex: {
-		// Example values. To generate your own, see the socket.io server instructions.
-		secret: '13652805320794272084', // Obtained from the socket.io server. Gives this (the master) control of the presentation
-		id: '1ea875674b17ca76', // Obtained from socket.io server
-		url: 'revealjs.jit.su:80' // Location of socket.io server
-	},
-
-	// Don't forget to add the dependencies
-	dependencies: [
-		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
-		{ src: 'plugin/multiplex/master.js', async: true },
-
-		// and if you want speaker notes
-		{ src: 'plugin/notes-server/client.js', async: true }
-
-		// other dependencies...
-	]
-});
-```
-
-#### Client presentation
-Served from a publicly accessible static file server. Examples include: GitHub Pages, Amazon S3, Dreamhost, Akamai, etc. The more reliable, the better. Your audience can then access the client presentation via ```http://example.com/path/to/presentation/client/index.html```, with the configuration below causing them to connect to the socket.io server as clients.
-
-Example configuration:
-```javascript
-Reveal.initialize({
-	// other options...
-
-	multiplex: {
-		// Example values. To generate your own, see the socket.io server instructions.
-		secret: null, // null so the clients do not have control of the master presentation
-		id: '1ea875674b17ca76', // id, obtained from socket.io server
-		url: 'revealjs.jit.su:80' // Location of socket.io server
-	},
-
-	// Don't forget to add the dependencies
-	dependencies: [
-		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
-		{ src: 'plugin/multiplex/client.js', async: true }
-
-		// other dependencies...
-	]
-});
-```
-
-#### Socket.io server
-Server that receives the slideChanged events from the master presentation and broadcasts them out to the connected client presentations. This needs to be publicly accessible. You can run your own socket.io server with the commands:
-
-1. ```npm install```
-2. ```node plugin/multiplex```
-
-Or you use the socket.io server at [http://revealjs.jit.su](http://revealjs.jit.su).
-
-You'll need to generate a unique secret and token pair for your master and client presentations. To do so, visit ```http://example.com/token```, where ```http://example.com``` is the location of your socket.io server. Or if you're going to use the socket.io server at [http://revealjs.jit.su](http://revealjs.jit.su), visit [http://revealjs.jit.su/token](http://revealjs.jit.su/token).
-
-You are very welcome to point your presentations at the Socket.io server running at [http://revealjs.jit.su](http://revealjs.jit.su), but availability and stability are not guaranteed. For anything mission critical I recommend you run your own server. It is simple to deploy to nodejitsu, heroku, your own environment, etc.
-
-##### socket.io server as file static server
-
-The socket.io server can play the role of static file server for your client presentation, as in the example at [http://revealjs.jit.su](http://revealjs.jit.su). (Open [http://revealjs.jit.su](http://revealjs.jit.su) in two browsers. Navigate through the slides on one, and the other will update to match.) 
-
-Example configuration:
-```javascript
-Reveal.initialize({
-	// other options...
-
-	multiplex: {
-		// Example values. To generate your own, see the socket.io server instructions.
-		secret: null, // null so the clients do not have control of the master presentation
-		id: '1ea875674b17ca76', // id, obtained from socket.io server
-		url: 'example.com:80' // Location of your socket.io server
-	},
-
-	// Don't forget to add the dependencies
-	dependencies: [
-		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
-		{ src: 'plugin/multiplex/client.js', async: true }
-
-		// other dependencies...
-	]
-```
-
-It can also play the role of static file server for your master presentation and client presentations at the same time (as long as you don't want to use speaker notes). (Open [http://revealjs.jit.su](http://revealjs.jit.su) in two browsers. Navigate through the slides on one, and the other will update to match. Navigate through the slides on the second, and the first will update to match.) This is probably not desirable, because you don't want your audience to mess with your slides while you're presenting. ;)
-
-Example configuration:
-```javascript
-Reveal.initialize({
-	// other options...
-
-	multiplex: {
-		// Example values. To generate your own, see the socket.io server instructions.
-		secret: '13652805320794272084', // Obtained from the socket.io server. Gives this (the master) control of the presentation
-		id: '1ea875674b17ca76', // Obtained from socket.io server
-		url: 'example.com:80' // Location of your socket.io server
-	},
-
-	// Don't forget to add the dependencies
-	dependencies: [
-		{ src: '//cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.10/socket.io.min.js', async: true },
-		{ src: 'plugin/multiplex/master.js', async: true },
-		{ src: 'plugin/multiplex/client.js', async: true }
-
-		// other dependencies...
-	]
-});
-```
-
-## Leap Motion
-The Leap Motion plugin lets you utilize your [Leap Motion](https://www.leapmotion.com/) device to control basic navigation of your presentation. The gestures currently supported are:
-
-##### 1 to 2 fingers
-Pointer &mdash; Point to anything on screen. Move your finger past the device to expand the pointer.
-
-##### 1 hand + 3 or more fingers (left/right/up/down)
-Navigate through your slides. See config options to invert movements.
-
-##### 2 hands upwards
-Toggle the overview mode. Do it a second time to exit the overview.
-
-#### Config Options
-You can edit the following options:
-
-| Property          | Default           | Description
-| ----------------- |:-----------------:| :-------------
-| autoCenter        | true              | Center the pointer based on where you put your finger into the leap motions detection field.
-| gestureDelay      | 500               | How long to delay between gestures in milliseconds.
-| naturalSwipe      | true              | Swipe as though you were touching a touch screen. Set to false to invert.
-| pointerColor      | #00aaff           | The color of the pointer.
-| pointerOpacity    | 0.7               | The opacity of the pointer.
-| pointerSize       | 15                | The minimum height and width of the pointer.
-| pointerTolerance  | 120               | Bigger = slower pointer.
-
-
-Example configuration:
-```js
-Reveal.initialize({
-
-	// other options...
-
-	leap: {
-		naturalSwipe   : false,    // Invert swipe gestures
-		pointerOpacity : 0.5,      // Set pointer opacity to 0.5
-		pointerColor   : '#d80000' // Red pointer
-	},
-
-	dependencies: [
-		{ src: 'plugin/leap/leap.js', async: true }
-	]
-
-});
-```
-
-## MathJax
-
-If you want to display math equations in your presentation you can easily do so by including this plugin. The plugin is a very thin wrapper around the [MathJax](http://www.mathjax.org/) library. To use it you'll need to include it as a reveal.js dependency, [find our more about dependencies here](#dependencies).
-
-The plugin defaults to using [LaTeX](http://en.wikipedia.org/wiki/LaTeX) but that can be adjusted through the ```math``` configuration object. Note that MathJax is loaded from a remote server. If you want to use it offline you'll need to download a copy of the library and adjust the ```mathjax``` configuration value. 
-
-Below is an example of how the plugin can be configured. If you don't intend to change these values you do not need to include the ```math``` config object at all.
-
-```js
-Reveal.initialize({
-
-	// other options ...
-
-	math: {
-		mathjax: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js',
-		config: 'TeX-AMS_HTML-full'  // See http://docs.mathjax.org/en/latest/config-files.html
-	},
-	
-	dependencies: [
-		{ src: 'plugin/math/math.js', async: true }
-	]
-
-});
-```
-
-Read MathJax's documentation if you need [HTTPS delivery](http://docs.mathjax.org/en/latest/start.html#secure-access-to-the-cdn) or serving of [specific versions](http://docs.mathjax.org/en/latest/configuration.html#loading-mathjax-from-the-cdn) for stability.
-
-
-## Installation
-
-The **basic setup** is for authoring presentations only. The **full setup** gives you access to all reveal.js features and plugins such as speaker notes as well as the development tasks needed to make changes to the source.
-
-### Basic setup
-
-The core of reveal.js is very easy to install. You'll simply need to download a copy of this repository and open the index.html file directly in your browser.
-
-1. Download the latest version of reveal.js from <https://github.com/hakimel/reveal.js/releases>
-
-2. Unzip and replace the example contents in index.html with your own
-
-3. Open index.html in a browser to view it
-
-
-### Full setup
-
-Some reveal.js features, like external markdown and speaker notes, require that presentations run from a local web server. The following instructions will set up such a server as well as all of the development tasks needed to make edits to the reveal.js source code.
-
-1. Install [Node.js](http://nodejs.org/)
-
-2. Install [Grunt](http://gruntjs.com/getting-started#installing-the-cli)
-
-4. Clone the reveal.js repository
-   ```sh
-   $ git clone https://github.com/hakimel/reveal.js.git
-   ```
-
-5. Navigate to the reveal.js folder
-   ```sh
-   $ cd reveal.js
-   ```
-
-6. Install dependencies
-   ```sh
-   $ npm install
-   ```
-
-7. Serve the presentation and monitor source files for changes
-   ```sh
-   $ grunt serve
-   ```
-
-8. Open <http://localhost:8000> to view your presentation
-
-   You can change the port by using `grunt serve --port 8001`.
-
-
-### Folder Structure
-- **css/** Core styles without which the project does not function
-- **js/** Like above but for JavaScript
-- **plugin/** Components that have been developed as extensions to reveal.js
-- **lib/** All other third party assets (JavaScript, CSS, fonts)
-
-
-### Contributing
-
-Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. If you are reporting a bug make sure to include information about which browser and operating system you are using as well as the necessary steps to reproduce the issue.
-
-If you have personal support questions use [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js).
-
-
-#### Pull requests
-
-- Should follow the coding style of the file you work in, most importantly:
-  - Tabs to indent
-  - Single-quoted strings
-- Should be made towards the **dev branch**
-- Should be submitted from a feature/topic branch (not your master)
-- Should not include the minified **reveal.min.js** file
-
-
-## License
-
-MIT licensed
-
-Copyright (C) 2014 Hakim El Hattab, http://hakim.se
diff --git a/docs/slides/IHP14/_support/reveal.js/css/print/paper.css b/docs/slides/IHP14/_support/reveal.js/css/print/paper.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/print/paper.css
+++ /dev/null
@@ -1,176 +0,0 @@
-/* Default Print Stylesheet Template
-   by Rob Glazebrook of CSSnewbie.com
-   Last Updated: June 4, 2008
-
-   Feel free (nay, compelled) to edit, append, and
-   manipulate this file as you see fit. */
-
-
-/* SECTION 1: Set default width, margin, float, and
-   background. This prevents elements from extending
-   beyond the edge of the printed page, and prevents
-   unnecessary background images from printing */
-body {
-	background: #fff;
-	font-size: 13pt;
-	width: auto;
-	height: auto;
-	border: 0;
-	margin: 0 5%;
-	padding: 0;
-	float: none !important;
-	overflow: visible;
-}
-html {
-	background: #fff;
-	width: auto;
-	height: auto;
-	overflow: visible;
-}
-
-/* SECTION 2: Remove any elements not needed in print.
-   This would include navigation, ads, sidebars, etc. */
-.nestedarrow,
-.controls,
-.reveal .progress,
-.reveal.overview,
-.fork-reveal,
-.share-reveal,
-.state-background {
-	display: none !important;
-}
-
-/* SECTION 3: Set body font face, size, and color.
-   Consider using a serif font for readability. */
-body, p, td, li, div, a {
-	font-size: 16pt!important;
-	font-family: Georgia, "Times New Roman", Times, serif !important;
-	color: #000;
-}
-
-/* SECTION 4: Set heading font face, sizes, and color.
-   Differentiate your headings from your body text.
-   Perhaps use a large sans-serif for distinction. */
-h1,h2,h3,h4,h5,h6 {
-	color: #000!important;
-	height: auto;
-	line-height: normal;
-	font-family: Georgia, "Times New Roman", Times, serif !important;
-	text-shadow: 0 0 0 #000 !important;
-	text-align: left;
-	letter-spacing: normal;
-}
-/* Need to reduce the size of the fonts for printing */
-h1 { font-size: 26pt !important;  }
-h2 { font-size: 22pt !important; }
-h3 { font-size: 20pt !important; }
-h4 { font-size: 20pt !important; font-variant: small-caps; }
-h5 { font-size: 19pt !important; }
-h6 { font-size: 18pt !important; font-style: italic; }
-
-/* SECTION 5: Make hyperlinks more usable.
-   Ensure links are underlined, and consider appending
-   the URL to the end of the link for usability. */
-a:link,
-a:visited {
-	color: #000 !important;
-	font-weight: bold;
-	text-decoration: underline;
-}
-/*
-.reveal a:link:after,
-.reveal a:visited:after {
-	content: " (" attr(href) ") ";
-	color: #222 !important;
-	font-size: 90%;
-}
-*/
-
-
-/* SECTION 6: more reveal.js specific additions by @skypanther */
-ul, ol, div, p {
-	visibility: visible;
-	position: static;
-	width: auto;
-	height: auto;
-	display: block;
-	overflow: visible;
-	margin: auto;
-	text-align: left !important;
-}
-.reveal .slides {
-	position: static;
-	width: auto;
-	height: auto;
-
-	left: auto;
-	top: auto;
-	margin-left: auto;
-	margin-top: auto;
-	padding: auto;
-
-	overflow: visible;
-	display: block;
-
-	text-align: center;
-	-webkit-perspective: none;
-	   -moz-perspective: none;
-	    -ms-perspective: none;
-	        perspective: none;
-
-	-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-.reveal .slides>section,
-.reveal .slides>section>section {
-
-	visibility: visible !important;
-	position: static !important;
-	width: 90% !important;
-	height: auto !important;
-	display: block !important;
-	overflow: visible !important;
-
-	left: 0% !important;
-	top: 0% !important;
-	margin-left: 0px !important;
-	margin-top: 0px !important;
-	padding: 20px 0px !important;
-
-	opacity: 1 !important;
-
-	-webkit-transform-style: flat !important;
-	   -moz-transform-style: flat !important;
-	    -ms-transform-style: flat !important;
-	        transform-style: flat !important;
-
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-}
-.reveal section {
-	page-break-after: always !important;
-	display: block !important;
-}
-.reveal section .fragment {
-	opacity: 1 !important;
-	visibility: visible !important;
-
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-}
-.reveal section:last-of-type {
-	page-break-after: avoid !important;
-}
-.reveal section img {
-	display: block;
-	margin: 15px 0px;
-	background: rgba(255,255,255,1);
-	border: 1px solid #666;
-	box-shadow: none;
-}
diff --git a/docs/slides/IHP14/_support/reveal.js/css/print/pdf.css b/docs/slides/IHP14/_support/reveal.js/css/print/pdf.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/print/pdf.css
+++ /dev/null
@@ -1,190 +0,0 @@
-/* Default Print Stylesheet Template
-   by Rob Glazebrook of CSSnewbie.com
-   Last Updated: June 4, 2008
-
-   Feel free (nay, compelled) to edit, append, and
-   manipulate this file as you see fit. */
-
-
-/* SECTION 1: Set default width, margin, float, and
-   background. This prevents elements from extending
-   beyond the edge of the printed page, and prevents
-   unnecessary background images from printing */
-
-* {
-	-webkit-print-color-adjust: exact;
-}
-
-body {
-	font-size: 18pt;
-	width: 297mm;
-	height: 229mm;
-	margin: 0 auto !important;
-	border: 0;
-	padding: 0;
-	float: none !important;
-	overflow: visible;
-}
-
-html {
-	width: 100%;
-	height: 100%;
-	overflow: visible;
-}
-
-@page {
-	size: letter landscape;
-	margin: 0;
-}
-
-/* SECTION 2: Remove any elements not needed in print.
-   This would include navigation, ads, sidebars, etc. */
-.nestedarrow,
-.controls,
-.reveal .progress,
-.reveal.overview,
-.fork-reveal,
-.share-reveal,
-.state-background {
-	display: none !important;
-}
-
-/* SECTION 3: Set body font face, size, and color.
-   Consider using a serif font for readability. */
-body, p, td, li, div {
-	font-size: 18pt;
-}
-
-/* SECTION 4: Set heading font face, sizes, and color.
-   Differentiate your headings from your body text.
-   Perhaps use a large sans-serif for distinction. */
-h1,h2,h3,h4,h5,h6 {
-	text-shadow: 0 0 0 #000 !important;
-}
-
-/* SECTION 5: Make hyperlinks more usable.
-   Ensure links are underlined, and consider appending
-   the URL to the end of the link for usability. */
-a:link,
-a:visited {
-	font-weight: normal;
-	text-decoration: underline;
-}
-
-.reveal pre code {
-	overflow: hidden !important;
-	font-family: monospace !important;
-}
-
-
-/* SECTION 6: more reveal.js specific additions by @skypanther */
-ul, ol, div, p {
-	visibility: visible;
-	position: static;
-	width: auto;
-	height: auto;
-	display: block;
-	overflow: visible;
-	margin: auto;
-}
-.reveal {
-	width: auto !important;
-	height: auto !important;
-	overflow: hidden !important;
-}
-.reveal .slides {
-	position: static;
-	width: 100%;
-	height: auto;
-
-	left: auto;
-	top: auto;
-	margin: 0 !important;
-	padding: 0 !important;
-
-	overflow: visible;
-	display: block;
-
-	text-align: center;
-
-	-webkit-perspective: none;
-	   -moz-perspective: none;
-	    -ms-perspective: none;
-	        perspective: none;
-
-	-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-.reveal .slides section {
-
-	page-break-after: always !important;
-
-	visibility: visible !important;
-	position: relative !important;
-	width: 100% !important;
-	height: 229mm !important;
-	min-height: 229mm !important;
-	display: block !important;
-	overflow: hidden !important;
-
-	left: 0 !important;
-	top: 0 !important;
-	margin: 0 !important;
-	padding: 2cm 2cm 0 2cm !important;
-	box-sizing: border-box !important;
-
-	opacity: 1 !important;
-
-	-webkit-transform-style: flat !important;
-	   -moz-transform-style: flat !important;
-	    -ms-transform-style: flat !important;
-	        transform-style: flat !important;
-
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-}
-.reveal section.stack {
-	margin: 0 !important;
-	padding: 0 !important;
-	page-break-after: avoid !important;
-	height: auto !important;
-	min-height: auto !important;
-}
-.reveal .absolute-element {
-	margin-left: 2.2cm;
-	margin-top: 1.8cm;
-}
-.reveal section .fragment {
-	opacity: 1 !important;
-	visibility: visible !important;
-
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-}
-.reveal section .slide-background {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	z-index: 0;
-}
-.reveal section>* {
-	position: relative;
-	z-index: 1;
-}
-.reveal img {
-	box-shadow: none;
-}
-.reveal .roll {
-	overflow: visible;
-	line-height: 1em;
-}
-.reveal small a {
-	font-size: 16pt !important;
-}
diff --git a/docs/slides/IHP14/_support/reveal.js/css/reveal.css b/docs/slides/IHP14/_support/reveal.js/css/reveal.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/reveal.css
+++ /dev/null
@@ -1,1882 +0,0 @@
-@charset "UTF-8";
-
-/*!
- * reveal.js
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
- */
-
-
-/*********************************************
- * RESET STYLES
- *********************************************/
-
-html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe,
-.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre,
-.reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code,
-.reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp,
-.reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var,
-.reveal b, .reveal u, .reveal i, .reveal center,
-.reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li,
-.reveal fieldset, .reveal form, .reveal label, .reveal legend,
-.reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td,
-.reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed,
-.reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup,
-.reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary,
-.reveal time, .reveal mark, .reveal audio, video {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	font-size: 100%;
-	font: inherit;
-	vertical-align: baseline;
-}
-
-.reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure,
-.reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section {
-	display: block;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-html,
-body {
-	width: 100%;
-	height: 100%;
-	overflow: hidden;
-}
-
-body {
-	position: relative;
-	line-height: 1;
-}
-
-::selection {
-	background: #FF5E99;
-	color: #fff;
-	text-shadow: none;
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-	-webkit-hyphens: auto;
-	   -moz-hyphens: auto;
-	        hyphens: auto;
-
-	word-wrap: break-word;
-	line-height: 1;
-}
-
-.reveal h1 { font-size: 3.77em; }
-.reveal h2 { font-size: 1.85em;	}
-.reveal h3 { font-size: 1.55em;	}
-.reveal h4 { font-size: 1em;	}
-
-
-/*********************************************
- * VIEW FRAGMENTS
- *********************************************/
-
-.reveal .slides section .fragment {
-	opacity: 0;
-
-	-webkit-transition: all .2s ease;
-	   -moz-transition: all .2s ease;
-	    -ms-transition: all .2s ease;
-	     -o-transition: all .2s ease;
-	        transition: all .2s ease;
-}
-	.reveal .slides section .fragment.visible {
-		opacity: 1;
-	}
-
-.reveal .slides section .fragment.grow {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.grow.visible {
-		-webkit-transform: scale( 1.3 );
-		   -moz-transform: scale( 1.3 );
-		    -ms-transform: scale( 1.3 );
-		     -o-transform: scale( 1.3 );
-		        transform: scale( 1.3 );
-	}
-
-.reveal .slides section .fragment.shrink {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.shrink.visible {
-		-webkit-transform: scale( 0.7 );
-		   -moz-transform: scale( 0.7 );
-		    -ms-transform: scale( 0.7 );
-		     -o-transform: scale( 0.7 );
-		        transform: scale( 0.7 );
-	}
-
-.reveal .slides section .fragment.zoom-in {
-	opacity: 0;
-
-	-webkit-transform: scale( 0.1 );
-	   -moz-transform: scale( 0.1 );
-	    -ms-transform: scale( 0.1 );
-	     -o-transform: scale( 0.1 );
-	        transform: scale( 0.1 );
-}
-
-	.reveal .slides section .fragment.zoom-in.visible {
-		opacity: 1;
-
-		-webkit-transform: scale( 1 );
-		   -moz-transform: scale( 1 );
-		    -ms-transform: scale( 1 );
-		     -o-transform: scale( 1 );
-		        transform: scale( 1 );
-	}
-
-.reveal .slides section .fragment.roll-in {
-	opacity: 0;
-
-	-webkit-transform: rotateX( 90deg );
-	   -moz-transform: rotateX( 90deg );
-	    -ms-transform: rotateX( 90deg );
-	     -o-transform: rotateX( 90deg );
-	        transform: rotateX( 90deg );
-}
-	.reveal .slides section .fragment.roll-in.visible {
-		opacity: 1;
-
-		-webkit-transform: rotateX( 0 );
-		   -moz-transform: rotateX( 0 );
-		    -ms-transform: rotateX( 0 );
-		     -o-transform: rotateX( 0 );
-		        transform: rotateX( 0 );
-	}
-
-.reveal .slides section .fragment.fade-out {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.fade-out.visible {
-		opacity: 0;
-	}
-
-.reveal .slides section .fragment.semi-fade-out {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.semi-fade-out.visible {
-		opacity: 0.5;
-	}
-
-.reveal .slides section .fragment.current-visible {
-	opacity:0;
-}
-
-.reveal .slides section .fragment.current-visible.current-fragment {
-	opacity:1;
-}
-
-.reveal .slides section .fragment.highlight-red,
-.reveal .slides section .fragment.highlight-current-red,
-.reveal .slides section .fragment.highlight-green,
-.reveal .slides section .fragment.highlight-current-green,
-.reveal .slides section .fragment.highlight-blue,
-.reveal .slides section .fragment.highlight-current-blue {
-	opacity: 1;
-}
-	.reveal .slides section .fragment.highlight-red.visible {
-		color: #ff2c2d
-	}
-	.reveal .slides section .fragment.highlight-green.visible {
-		color: #17ff2e;
-	}
-	.reveal .slides section .fragment.highlight-blue.visible {
-		color: #1b91ff;
-	}
-
-.reveal .slides section .fragment.highlight-current-red.current-fragment {
-	color: #ff2c2d
-}
-.reveal .slides section .fragment.highlight-current-green.current-fragment {
-	color: #17ff2e;
-}
-.reveal .slides section .fragment.highlight-current-blue.current-fragment {
-	color: #1b91ff;
-}
-
-
-/*********************************************
- * DEFAULT ELEMENT STYLES
- *********************************************/
-
-/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */
-.reveal:after {
-  content: '';
-  font-style: italic;
-}
-
-.reveal iframe {
-	z-index: 1;
-}
-
-/* Ensure certain elements are never larger than the slide itself */
-.reveal img,
-.reveal video,
-.reveal iframe {
-	max-width: 95%;
-	max-height: 95%;
-}
-
-/** Prevents layering issues in certain browser/transition combinations */
-.reveal a {
-	position: relative;
-}
-
-.reveal strong,
-.reveal b {
-	font-weight: bold;
-}
-
-.reveal em,
-.reveal i {
-	font-style: italic;
-}
-
-.reveal ol,
-.reveal ul {
-	display: inline-block;
-
-	text-align: left;
-	margin: 0 0 0 1em;
-}
-
-.reveal ol {
-	list-style-type: decimal;
-}
-
-.reveal ul {
-	list-style-type: disc;
-}
-
-.reveal ul ul {
-	list-style-type: square;
-}
-
-.reveal ul ul ul {
-	list-style-type: circle;
-}
-
-.reveal ul ul,
-.reveal ul ol,
-.reveal ol ol,
-.reveal ol ul {
-	display: block;
-	margin-left: 40px;
-}
-
-.reveal p {
-	margin-bottom: 10px;
-	line-height: 1.2em;
-}
-
-.reveal q,
-.reveal blockquote {
-	quotes: none;
-}
-
-.reveal blockquote {
-	display: block;
-	position: relative;
-	width: 70%;
-	margin: 5px auto;
-	padding: 5px;
-
-	font-style: italic;
-	background: rgba(255, 255, 255, 0.05);
-	box-shadow: 0px 0px 2px rgba(0,0,0,0.2);
-}
-	.reveal blockquote p:first-child,
-	.reveal blockquote p:last-child {
-		display: inline-block;
-	}
-
-.reveal q {
-	font-style: italic;
-}
-
-.reveal pre {
-	display: block;
-	position: relative;
-	width: 90%;
-	margin: 10px auto;
-
-	text-align: left;
-	font-size: 0.81em;
-	font-family: monospace;
-	line-height: 1.2em;
-
-	word-wrap: break-word;
-
-	box-shadow: 0px 0px 6px rgba(0,0,0,0.3);
-}
-.reveal code {
-	font-family: monospace;
-	font-size: 0.81em;
-}
-.reveal pre code {
-	padding: 5px;
-	overflow: auto;
-	max-height: 400px;
-	word-wrap: normal;
-}
-.reveal pre.stretch code {
-	height: 100%;
-	max-height: 100%;
-
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-
-.reveal table th,
-.reveal table td {
-	text-align: left;
-	padding-right: .3em;
-}
-
-.reveal table th {
-	font-weight: bold;
-}
-
-.reveal sup {
-	vertical-align: super;
-}
-.reveal sub {
-	vertical-align: sub;
-}
-
-.reveal small {
-	display: inline-block;
-	font-size: 0.6em;
-	line-height: 1.2em;
-	vertical-align: top;
-}
-
-.reveal small * {
-	vertical-align: top;
-}
-
-.reveal .stretch {
-	max-width: none;
-	max-height: none;
-}
-
-
-/*********************************************
- * CONTROLS
- *********************************************/
-
-.reveal .controls {
-	display: none;
-	position: fixed;
-	width: 110px;
-	height: 110px;
-	z-index: 30;
-	right: 10px;
-	bottom: 10px;
-}
-
-.reveal .controls div {
-	position: absolute;
-	opacity: 0.05;
-	width: 0;
-	height: 0;
-	border: 12px solid transparent;
-
-	-moz-transform: scale(.9999);
-
-	-webkit-transition: all 0.2s ease;
-	   -moz-transition: all 0.2s ease;
-	    -ms-transition: all 0.2s ease;
-	     -o-transition: all 0.2s ease;
-	        transition: all 0.2s ease;
-}
-
-.reveal .controls div.enabled {
-	opacity: 0.7;
-	cursor: pointer;
-}
-
-.reveal .controls div.enabled:active {
-	margin-top: 1px;
-}
-
-	.reveal .controls div.navigate-left {
-		top: 42px;
-
-		border-right-width: 22px;
-		border-right-color: #eee;
-	}
-		.reveal .controls div.navigate-left.fragmented {
-			opacity: 0.3;
-		}
-
-	.reveal .controls div.navigate-right {
-		left: 74px;
-		top: 42px;
-
-		border-left-width: 22px;
-		border-left-color: #eee;
-	}
-		.reveal .controls div.navigate-right.fragmented {
-			opacity: 0.3;
-		}
-
-	.reveal .controls div.navigate-up {
-		left: 42px;
-
-		border-bottom-width: 22px;
-		border-bottom-color: #eee;
-	}
-		.reveal .controls div.navigate-up.fragmented {
-			opacity: 0.3;
-		}
-
-	.reveal .controls div.navigate-down {
-		left: 42px;
-		top: 74px;
-
-		border-top-width: 22px;
-		border-top-color: #eee;
-	}
-		.reveal .controls div.navigate-down.fragmented {
-			opacity: 0.3;
-		}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	position: fixed;
-	display: none;
-	height: 3px;
-	width: 100%;
-	bottom: 0;
-	left: 0;
-	z-index: 10;
-}
-	.reveal .progress:after {
-		content: '';
-		display: 'block';
-		position: absolute;
-		height: 20px;
-		width: 100%;
-		top: -20px;
-	}
-	.reveal .progress span {
-		display: block;
-		height: 100%;
-		width: 0px;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-
-.reveal .slide-number {
-	position: fixed;
-	display: block;
-	right: 15px;
-	bottom: 15px;
-	opacity: 0.5;
-	z-index: 31;
-	font-size: 12px;
-}
-
-/*********************************************
- * SLIDES
- *********************************************/
-
-.reveal {
-	position: relative;
-	width: 100%;
-	height: 100%;
-
-	-ms-touch-action: none;
-}
-
-.reveal .slides {
-	position: absolute;
-    max-width: 1024px;
-	width: 120%;
-	height: 100%;
-	left: 50%;
-	top: 50%;
-
-	overflow: visible;
-	z-index: 1;
-	text-align: center;
-
-	-webkit-transition: -webkit-perspective .4s ease;
-	   -moz-transition: -moz-perspective .4s ease;
-	    -ms-transition: -ms-perspective .4s ease;
-	     -o-transition: -o-perspective .4s ease;
-	        transition: perspective .4s ease;
-
-	-webkit-perspective: 600px;
-	   -moz-perspective: 600px;
-	    -ms-perspective: 600px;
-	        perspective: 600px;
-
-	-webkit-perspective-origin: 0px -100px;
-	   -moz-perspective-origin: 0px -100px;
-	    -ms-perspective-origin: 0px -100px;
-	        perspective-origin: 0px -100px;
-}
-
-.reveal .slides>section {
-	-ms-perspective: 600px;
-}
-
-.reveal .slides>section,
-.reveal .slides>section>section {
-	display: none;
-	position: absolute;
-	width: 100%;
-	padding: 20px 0px;
-
-	z-index: 10;
-	line-height: 1.2em;
-	font-weight: inherit;
-
-	-webkit-transform-style: preserve-3d;
-	   -moz-transform-style: preserve-3d;
-	    -ms-transform-style: preserve-3d;
-	        transform-style: preserve-3d;
-
-	-webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						-webkit-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	   -moz-transition: -moz-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						-moz-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	    -ms-transition: -ms-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						-ms-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	     -o-transition: -o-transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						-o-transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	        transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985),
-						opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-}
-
-/* Global transition speed settings */
-.reveal[data-transition-speed="fast"] .slides section {
-	-webkit-transition-duration: 400ms;
-	   -moz-transition-duration: 400ms;
-	    -ms-transition-duration: 400ms;
-	        transition-duration: 400ms;
-}
-.reveal[data-transition-speed="slow"] .slides section {
-	-webkit-transition-duration: 1200ms;
-	   -moz-transition-duration: 1200ms;
-	    -ms-transition-duration: 1200ms;
-	        transition-duration: 1200ms;
-}
-
-/* Slide-specific transition speed overrides */
-.reveal .slides section[data-transition-speed="fast"] {
-	-webkit-transition-duration: 400ms;
-	   -moz-transition-duration: 400ms;
-	    -ms-transition-duration: 400ms;
-	        transition-duration: 400ms;
-}
-.reveal .slides section[data-transition-speed="slow"] {
-	-webkit-transition-duration: 1200ms;
-	   -moz-transition-duration: 1200ms;
-	    -ms-transition-duration: 1200ms;
-	        transition-duration: 1200ms;
-}
-
-.reveal .slides>section {
-	left: -50%;
-	top: -50%;
-}
-
-.reveal .slides>section.stack {
-	padding-top: 0;
-	padding-bottom: 0;
-}
-
-.reveal .slides>section.present,
-.reveal .slides>section>section.present {
-	display: block;
-	z-index: 11;
-	opacity: 1;
-}
-
-.reveal.center,
-.reveal.center .slides,
-.reveal.center .slides section {
-	min-height: auto !important;
-}
-
-/* Don't allow interaction with invisible slides */
-.reveal .slides>section.future,
-.reveal .slides>section>section.future,
-.reveal .slides>section.past,
-.reveal .slides>section>section.past {
-	pointer-events: none;
-}
-
-.reveal.overview .slides>section,
-.reveal.overview .slides>section>section {
-	pointer-events: auto;
-}
-
-
-
-/*********************************************
- * DEFAULT TRANSITION
- *********************************************/
-
-.reveal .slides>section[data-transition=default].past,
-.reveal .slides>section.past {
-	display: block;
-	opacity: 0;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-}
-.reveal .slides>section[data-transition=default].future,
-.reveal .slides>section.future {
-	display: block;
-	opacity: 0;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-}
-
-.reveal .slides>section>section[data-transition=default].past,
-.reveal .slides>section>section.past {
-	display: block;
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
-	   -moz-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
-	    -ms-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
-	        transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
-}
-.reveal .slides>section>section[data-transition=default].future,
-.reveal .slides>section>section.future {
-	display: block;
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
-	   -moz-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
-	    -ms-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
-	        transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
-}
-
-
-/*********************************************
- * CONCAVE TRANSITION
- *********************************************/
-
-.reveal .slides>section[data-transition=concave].past,
-.reveal.concave  .slides>section.past {
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-}
-.reveal .slides>section[data-transition=concave].future,
-.reveal.concave .slides>section.future {
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-}
-
-.reveal .slides>section>section[data-transition=concave].past,
-.reveal.concave .slides>section>section.past {
-	-webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	   -moz-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	    -ms-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	        transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-}
-.reveal .slides>section>section[data-transition=concave].future,
-.reveal.concave .slides>section>section.future {
-	-webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	   -moz-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	    -ms-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	        transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-}
-
-
-/*********************************************
- * ZOOM TRANSITION
- *********************************************/
-
-.reveal .slides>section[data-transition=zoom],
-.reveal.zoom .slides>section {
-	-webkit-transition-timing-function: ease;
-	   -moz-transition-timing-function: ease;
-	    -ms-transition-timing-function: ease;
-	     -o-transition-timing-function: ease;
-	        transition-timing-function: ease;
-}
-
-.reveal .slides>section[data-transition=zoom].past,
-.reveal.zoom .slides>section.past {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(16);
-	   -moz-transform: scale(16);
-	    -ms-transform: scale(16);
-	     -o-transform: scale(16);
-	        transform: scale(16);
-}
-.reveal .slides>section[data-transition=zoom].future,
-.reveal.zoom .slides>section.future {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(0.2);
-	   -moz-transform: scale(0.2);
-	    -ms-transform: scale(0.2);
-	     -o-transform: scale(0.2);
-	        transform: scale(0.2);
-}
-
-.reveal .slides>section>section[data-transition=zoom].past,
-.reveal.zoom .slides>section>section.past {
-	-webkit-transform: translate(0, -150%);
-	   -moz-transform: translate(0, -150%);
-	    -ms-transform: translate(0, -150%);
-	     -o-transform: translate(0, -150%);
-	        transform: translate(0, -150%);
-}
-.reveal .slides>section>section[data-transition=zoom].future,
-.reveal.zoom .slides>section>section.future {
-	-webkit-transform: translate(0, 150%);
-	   -moz-transform: translate(0, 150%);
-	    -ms-transform: translate(0, 150%);
-	     -o-transform: translate(0, 150%);
-	        transform: translate(0, 150%);
-}
-
-
-/*********************************************
- * LINEAR TRANSITION
- *********************************************/
-
-.reveal.linear section {
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	    -ms-backface-visibility: hidden;
-	        backface-visibility: hidden;
-}
-
-.reveal .slides>section[data-transition=linear].past,
-.reveal.linear .slides>section.past {
-	-webkit-transform: translate(-150%, 0);
-	   -moz-transform: translate(-150%, 0);
-	    -ms-transform: translate(-150%, 0);
-	     -o-transform: translate(-150%, 0);
-	        transform: translate(-150%, 0);
-}
-.reveal .slides>section[data-transition=linear].future,
-.reveal.linear .slides>section.future {
-	-webkit-transform: translate(150%, 0);
-	   -moz-transform: translate(150%, 0);
-	    -ms-transform: translate(150%, 0);
-	     -o-transform: translate(150%, 0);
-	        transform: translate(150%, 0);
-}
-
-.reveal .slides>section>section[data-transition=linear].past,
-.reveal.linear .slides>section>section.past {
-	-webkit-transform: translate(0, -150%);
-	   -moz-transform: translate(0, -150%);
-	    -ms-transform: translate(0, -150%);
-	     -o-transform: translate(0, -150%);
-	        transform: translate(0, -150%);
-}
-.reveal .slides>section>section[data-transition=linear].future,
-.reveal.linear .slides>section>section.future {
-	-webkit-transform: translate(0, 150%);
-	   -moz-transform: translate(0, 150%);
-	    -ms-transform: translate(0, 150%);
-	     -o-transform: translate(0, 150%);
-	        transform: translate(0, 150%);
-}
-
-
-/*********************************************
- * CUBE TRANSITION
- *********************************************/
-
-.reveal.cube .slides {
-	-webkit-perspective: 1300px;
-	   -moz-perspective: 1300px;
-	    -ms-perspective: 1300px;
-	        perspective: 1300px;
-}
-
-.reveal.cube .slides section {
-	padding: 30px;
-	min-height: 700px;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	    -ms-backface-visibility: hidden;
-	        backface-visibility: hidden;
-
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-	.reveal.center.cube .slides section {
-		min-height: auto;
-	}
-	.reveal.cube .slides section:not(.stack):before {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		background: rgba(0,0,0,0.1);
-		border-radius: 4px;
-
-		-webkit-transform: translateZ( -20px );
-		   -moz-transform: translateZ( -20px );
-		    -ms-transform: translateZ( -20px );
-		     -o-transform: translateZ( -20px );
-		        transform: translateZ( -20px );
-	}
-	.reveal.cube .slides section:not(.stack):after {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 90%;
-		height: 30px;
-		left: 5%;
-		bottom: 0;
-		background: none;
-		z-index: 1;
-
-		border-radius: 4px;
-		box-shadow: 0px 95px 25px rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ(-90px) rotateX( 65deg );
-		   -moz-transform: translateZ(-90px) rotateX( 65deg );
-		    -ms-transform: translateZ(-90px) rotateX( 65deg );
-		     -o-transform: translateZ(-90px) rotateX( 65deg );
-		        transform: translateZ(-90px) rotateX( 65deg );
-	}
-
-.reveal.cube .slides>section.stack {
-	padding: 0;
-	background: none;
-}
-
-.reveal.cube .slides>section.past {
-	-webkit-transform-origin: 100% 0%;
-	   -moz-transform-origin: 100% 0%;
-	    -ms-transform-origin: 100% 0%;
-	        transform-origin: 100% 0%;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-}
-
-.reveal.cube .slides>section.future {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg);
-}
-
-.reveal.cube .slides>section>section.past {
-	-webkit-transform-origin: 0% 100%;
-	   -moz-transform-origin: 0% 100%;
-	    -ms-transform-origin: 0% 100%;
-	        transform-origin: 0% 100%;
-
-	-webkit-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	   -moz-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	    -ms-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	        transform: translate3d(0, -100%, 0) rotateX(90deg);
-}
-
-.reveal.cube .slides>section>section.future {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	   -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	    -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	        transform: translate3d(0, 100%, 0) rotateX(-90deg);
-}
-
-
-/*********************************************
- * PAGE TRANSITION
- *********************************************/
-
-.reveal.page .slides {
-	-webkit-perspective-origin: 0% 50%;
-	   -moz-perspective-origin: 0% 50%;
-	    -ms-perspective-origin: 0% 50%;
-	        perspective-origin: 0% 50%;
-
-	-webkit-perspective: 3000px;
-	   -moz-perspective: 3000px;
-	    -ms-perspective: 3000px;
-	        perspective: 3000px;
-}
-
-.reveal.page .slides section {
-	padding: 30px;
-	min-height: 700px;
-
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-	.reveal.page .slides section.past {
-		z-index: 12;
-	}
-	.reveal.page .slides section:not(.stack):before {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		background: rgba(0,0,0,0.1);
-
-		-webkit-transform: translateZ( -20px );
-		   -moz-transform: translateZ( -20px );
-		    -ms-transform: translateZ( -20px );
-		     -o-transform: translateZ( -20px );
-		        transform: translateZ( -20px );
-	}
-	.reveal.page .slides section:not(.stack):after {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 90%;
-		height: 30px;
-		left: 5%;
-		bottom: 0;
-		background: none;
-		z-index: 1;
-
-		border-radius: 4px;
-		box-shadow: 0px 95px 25px rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ(-90px) rotateX( 65deg );
-	}
-
-.reveal.page .slides>section.stack {
-	padding: 0;
-	background: none;
-}
-
-.reveal.page .slides>section.past {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	   -moz-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	    -ms-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	        transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-}
-
-.reveal.page .slides>section.future {
-	-webkit-transform-origin: 100% 0%;
-	   -moz-transform-origin: 100% 0%;
-	    -ms-transform-origin: 100% 0%;
-	        transform-origin: 100% 0%;
-
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-
-.reveal.page .slides>section>section.past {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	   -moz-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	    -ms-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	        transform: translate3d(0, -40%, 0) rotateX(80deg);
-}
-
-.reveal.page .slides>section>section.future {
-	-webkit-transform-origin: 0% 100%;
-	   -moz-transform-origin: 0% 100%;
-	    -ms-transform-origin: 0% 100%;
-	        transform-origin: 0% 100%;
-
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-
-
-/*********************************************
- * FADE TRANSITION
- *********************************************/
-
-.reveal .slides section[data-transition=fade],
-.reveal.fade .slides section,
-.reveal.fade .slides>section>section {
-    -webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	     -o-transform: none;
-	        transform: none;
-
-	-webkit-transition: opacity 0.5s;
-	   -moz-transition: opacity 0.5s;
-	    -ms-transition: opacity 0.5s;
-	     -o-transition: opacity 0.5s;
-	        transition: opacity 0.5s;
-}
-
-
-.reveal.fade.overview .slides section,
-.reveal.fade.overview .slides>section>section,
-.reveal.fade.overview-deactivating .slides section,
-.reveal.fade.overview-deactivating .slides>section>section {
-	-webkit-transition: none;
-	   -moz-transition: none;
-	    -ms-transition: none;
-	     -o-transition: none;
-	        transition: none;
-}
-
-
-/*********************************************
- * NO TRANSITION
- *********************************************/
-
-.reveal .slides section[data-transition=none],
-.reveal.none .slides section {
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	     -o-transform: none;
-	        transform: none;
-
-	-webkit-transition: none;
-	   -moz-transition: none;
-	    -ms-transition: none;
-	     -o-transition: none;
-	        transition: none;
-}
-
-
-/*********************************************
- * OVERVIEW
- *********************************************/
-
-.reveal.overview .slides {
-	-webkit-perspective-origin: 0% 0%;
-	   -moz-perspective-origin: 0% 0%;
-	    -ms-perspective-origin: 0% 0%;
-	        perspective-origin: 0% 0%;
-
-	-webkit-perspective: 700px;
-	   -moz-perspective: 700px;
-	    -ms-perspective: 700px;
-	        perspective: 700px;
-}
-
-.reveal.overview .slides section {
-	height: 600px;
-	top: -300px !important;
-	overflow: hidden;
-	opacity: 1 !important;
-	visibility: visible !important;
-	cursor: pointer;
-	background: rgba(0,0,0,0.1);
-}
-.reveal.overview .slides section .fragment {
-	opacity: 1;
-}
-.reveal.overview .slides section:after,
-.reveal.overview .slides section:before {
-	display: none !important;
-}
-.reveal.overview .slides section>section {
-	opacity: 1;
-	cursor: pointer;
-}
-	.reveal.overview .slides section:hover {
-		background: rgba(0,0,0,0.3);
-	}
-	.reveal.overview .slides section.present {
-		background: rgba(0,0,0,0.3);
-	}
-.reveal.overview .slides>section.stack {
-	padding: 0;
-	top: 0 !important;
-	background: none;
-	overflow: visible;
-}
-
-
-/*********************************************
- * PAUSED MODE
- *********************************************/
-
-.reveal .pause-overlay {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 100%;
-	height: 100%;
-	background: black;
-	visibility: hidden;
-	opacity: 0;
-	z-index: 100;
-
-	-webkit-transition: all 1s ease;
-	   -moz-transition: all 1s ease;
-	    -ms-transition: all 1s ease;
-	     -o-transition: all 1s ease;
-	        transition: all 1s ease;
-}
-.reveal.paused .pause-overlay {
-	visibility: visible;
-	opacity: 1;
-}
-
-
-/*********************************************
- * FALLBACK
- *********************************************/
-
-.no-transforms {
-	overflow-y: auto;
-}
-
-.no-transforms .reveal .slides {
-	position: relative;
-	width: 80%;
-	height: auto !important;
-	top: 0;
-	left: 50%;
-	margin: 0;
-	text-align: center;
-}
-
-.no-transforms .reveal .controls,
-.no-transforms .reveal .progress {
-	display: none !important;
-}
-
-.no-transforms .reveal .slides section {
-	display: block !important;
-	opacity: 1 !important;
-	position: relative !important;
-	height: auto;
-	min-height: auto;
-	top: 0;
-	left: -50%;
-	margin: 70px 0;
-
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	     -o-transform: none;
-	        transform: none;
-}
-
-.no-transforms .reveal .slides section section {
-	left: 0;
-}
-
-.reveal .no-transition,
-.reveal .no-transition * {
-	-webkit-transition: none !important;
-	   -moz-transition: none !important;
-	    -ms-transition: none !important;
-	     -o-transition: none !important;
-	        transition: none !important;
-}
-
-
-/*********************************************
- * BACKGROUND STATES [DEPRECATED]
- *********************************************/
-
-.reveal .state-background {
-	position: absolute;
-	width: 100%;
-	height: 100%;
-	background: rgba( 0, 0, 0, 0 );
-
-	-webkit-transition: background 800ms ease;
-	   -moz-transition: background 800ms ease;
-	    -ms-transition: background 800ms ease;
-	     -o-transition: background 800ms ease;
-	        transition: background 800ms ease;
-}
-.alert .reveal .state-background {
-	background: rgba( 200, 50, 30, 0.6 );
-}
-.soothe .reveal .state-background {
-	background: rgba( 50, 200, 90, 0.4 );
-}
-.blackout .reveal .state-background {
-	background: rgba( 0, 0, 0, 0.6 );
-}
-.whiteout .reveal .state-background {
-	background: rgba( 255, 255, 255, 0.6 );
-}
-.cobalt .reveal .state-background {
-	background: rgba( 22, 152, 213, 0.6 );
-}
-.mint .reveal .state-background {
-	background: rgba( 22, 213, 75, 0.6 );
-}
-.submerge .reveal .state-background {
-	background: rgba( 12, 25, 77, 0.6);
-}
-.lila .reveal .state-background {
-	background: rgba( 180, 50, 140, 0.6 );
-}
-.sunset .reveal .state-background {
-	background: rgba( 255, 122, 0, 0.6 );
-}
-
-
-/*********************************************
- * PER-SLIDE BACKGROUNDS
- *********************************************/
-
-.reveal>.backgrounds {
-	position: absolute;
-	width: 100%;
-	height: 100%;
-
-	-webkit-perspective: 600px;
-	   -moz-perspective: 600px;
-	    -ms-perspective: 600px;
-	        perspective: 600px;
-}
-	.reveal .slide-background {
-		position: absolute;
-		width: 100%;
-		height: 100%;
-		opacity: 0;
-		visibility: hidden;
-
-		background-color: rgba( 0, 0, 0, 0 );
-		background-position: 50% 50%;
-		background-repeat: no-repeat;
-		background-size: cover;
-
-		-webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-	.reveal .slide-background.present {
-		opacity: 1;
-		visibility: visible;
-	}
-
-	.print-pdf .reveal .slide-background {
-		opacity: 1 !important;
-		visibility: visible !important;
-	}
-
-/* Immediate transition style */
-.reveal[data-background-transition=none]>.backgrounds .slide-background,
-.reveal>.backgrounds .slide-background[data-background-transition=none] {
-	-webkit-transition: none;
-	   -moz-transition: none;
-	    -ms-transition: none;
-	     -o-transition: none;
-	        transition: none;
-}
-
-/* 2D slide */
-.reveal[data-background-transition=slide]>.backgrounds .slide-background,
-.reveal>.backgrounds .slide-background[data-background-transition=slide] {
-	opacity: 1;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	    -ms-backface-visibility: hidden;
-	        backface-visibility: hidden;
-}
-	.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,
-	.reveal>.backgrounds .slide-background.past[data-background-transition=slide] {
-		-webkit-transform: translate(-100%, 0);
-		   -moz-transform: translate(-100%, 0);
-		    -ms-transform: translate(-100%, 0);
-		     -o-transform: translate(-100%, 0);
-		        transform: translate(-100%, 0);
-	}
-	.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,
-	.reveal>.backgrounds .slide-background.future[data-background-transition=slide] {
-		-webkit-transform: translate(100%, 0);
-		   -moz-transform: translate(100%, 0);
-		    -ms-transform: translate(100%, 0);
-		     -o-transform: translate(100%, 0);
-		        transform: translate(100%, 0);
-	}
-
-	.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,
-	.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide] {
-		-webkit-transform: translate(0, -100%);
-		   -moz-transform: translate(0, -100%);
-		    -ms-transform: translate(0, -100%);
-		     -o-transform: translate(0, -100%);
-		        transform: translate(0, -100%);
-	}
-	.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,
-	.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide] {
-		-webkit-transform: translate(0, 100%);
-		   -moz-transform: translate(0, 100%);
-		    -ms-transform: translate(0, 100%);
-		     -o-transform: translate(0, 100%);
-		        transform: translate(0, 100%);
-	}
-
-
-/* Convex */
-.reveal[data-background-transition=convex]>.backgrounds .slide-background.past,
-.reveal>.backgrounds .slide-background.past[data-background-transition=convex] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-}
-.reveal[data-background-transition=convex]>.backgrounds .slide-background.future,
-.reveal>.backgrounds .slide-background.future[data-background-transition=convex] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-}
-
-.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past,
-.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
-	   -moz-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
-	    -ms-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
-	        transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
-}
-.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future,
-.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
-	   -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
-	    -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
-	        transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
-}
-
-
-/* Concave */
-.reveal[data-background-transition=concave]>.backgrounds .slide-background.past,
-.reveal>.backgrounds .slide-background.past[data-background-transition=concave] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-}
-.reveal[data-background-transition=concave]>.backgrounds .slide-background.future,
-.reveal>.backgrounds .slide-background.future[data-background-transition=concave] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-}
-
-.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past,
-.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
-	   -moz-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
-	    -ms-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
-	        transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
-}
-.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future,
-.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave] {
-	opacity: 0;
-
-	-webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
-	   -moz-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
-	    -ms-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
-	        transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
-}
-
-/* Zoom */
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background,
-.reveal>.backgrounds .slide-background[data-background-transition=zoom] {
-	-webkit-transition-timing-function: ease;
-	   -moz-transition-timing-function: ease;
-	    -ms-transition-timing-function: ease;
-	     -o-transition-timing-function: ease;
-	        transition-timing-function: ease;
-}
-
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past,
-.reveal>.backgrounds .slide-background.past[data-background-transition=zoom] {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(16);
-	   -moz-transform: scale(16);
-	    -ms-transform: scale(16);
-	     -o-transform: scale(16);
-	        transform: scale(16);
-}
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future,
-.reveal>.backgrounds .slide-background.future[data-background-transition=zoom] {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(0.2);
-	   -moz-transform: scale(0.2);
-	    -ms-transform: scale(0.2);
-	     -o-transform: scale(0.2);
-	        transform: scale(0.2);
-}
-
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past,
-.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom] {
-	opacity: 0;
-		visibility: hidden;
-
-		-webkit-transform: scale(16);
-		   -moz-transform: scale(16);
-		    -ms-transform: scale(16);
-		     -o-transform: scale(16);
-		        transform: scale(16);
-}
-.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future,
-.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom] {
-	opacity: 0;
-	visibility: hidden;
-
-	-webkit-transform: scale(0.2);
-	   -moz-transform: scale(0.2);
-	    -ms-transform: scale(0.2);
-	     -o-transform: scale(0.2);
-	        transform: scale(0.2);
-}
-
-
-/* Global transition speed settings */
-.reveal[data-transition-speed="fast"]>.backgrounds .slide-background {
-	-webkit-transition-duration: 400ms;
-	   -moz-transition-duration: 400ms;
-	    -ms-transition-duration: 400ms;
-	        transition-duration: 400ms;
-}
-.reveal[data-transition-speed="slow"]>.backgrounds .slide-background {
-	-webkit-transition-duration: 1200ms;
-	   -moz-transition-duration: 1200ms;
-	    -ms-transition-duration: 1200ms;
-	        transition-duration: 1200ms;
-}
-
-
-/*********************************************
- * RTL SUPPORT
- *********************************************/
-
-.reveal.rtl .slides,
-.reveal.rtl .slides h1,
-.reveal.rtl .slides h2,
-.reveal.rtl .slides h3,
-.reveal.rtl .slides h4,
-.reveal.rtl .slides h5,
-.reveal.rtl .slides h6 {
-	direction: rtl;
-	font-family: sans-serif;
-}
-
-.reveal.rtl pre,
-.reveal.rtl code {
-	direction: ltr;
-}
-
-.reveal.rtl ol,
-.reveal.rtl ul {
-	text-align: right;
-}
-
-.reveal.rtl .progress span {
-	float: right
-}
-
-/*********************************************
- * PARALLAX BACKGROUND
- *********************************************/
-
-.reveal.has-parallax-background .backgrounds {
-	-webkit-transition: all 0.8s ease;
-	   -moz-transition: all 0.8s ease;
-	    -ms-transition: all 0.8s ease;
-	        transition: all 0.8s ease;
-}
-
-/* Global transition speed settings */
-.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds {
-	-webkit-transition-duration: 400ms;
-	   -moz-transition-duration: 400ms;
-	    -ms-transition-duration: 400ms;
-	        transition-duration: 400ms;
-}
-.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds {
-	-webkit-transition-duration: 1200ms;
-	   -moz-transition-duration: 1200ms;
-	    -ms-transition-duration: 1200ms;
-	        transition-duration: 1200ms;
-}
-
-
-/*********************************************
- * LINK PREVIEW OVERLAY
- *********************************************/
-
- .reveal .preview-link-overlay {
- 	position: absolute;
- 	top: 0;
- 	left: 0;
- 	width: 100%;
- 	height: 100%;
- 	z-index: 1000;
- 	background: rgba( 0, 0, 0, 0.9 );
- 	opacity: 0;
- 	visibility: hidden;
-
- 	-webkit-transition: all 0.3s ease;
- 	   -moz-transition: all 0.3s ease;
- 	    -ms-transition: all 0.3s ease;
- 	        transition: all 0.3s ease;
- }
- 	.reveal .preview-link-overlay.visible {
- 		opacity: 1;
- 		visibility: visible;
- 	}
-
- 	.reveal .preview-link-overlay .spinner {
- 		position: absolute;
- 		display: block;
- 		top: 50%;
- 		left: 50%;
- 		width: 32px;
- 		height: 32px;
- 		margin: -16px 0 0 -16px;
- 		z-index: 10;
- 		background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);
-
- 		visibility: visible;
- 		opacity: 0.6;
-
- 		-webkit-transition: all 0.3s ease;
- 		   -moz-transition: all 0.3s ease;
- 		    -ms-transition: all 0.3s ease;
- 		        transition: all 0.3s ease;
- 	}
-
- 	.reveal .preview-link-overlay header {
- 		position: absolute;
- 		left: 0;
- 		top: 0;
- 		width: 100%;
- 		height: 40px;
- 		z-index: 2;
- 		border-bottom: 1px solid #222;
- 	}
- 		.reveal .preview-link-overlay header a {
- 			display: inline-block;
- 			width: 40px;
- 			height: 40px;
- 			padding: 0 10px;
- 			float: right;
- 			opacity: 0.6;
-
- 			box-sizing: border-box;
- 		}
- 			.reveal .preview-link-overlay header a:hover {
- 				opacity: 1;
- 			}
- 			.reveal .preview-link-overlay header a .icon {
- 				display: inline-block;
- 				width: 20px;
- 				height: 20px;
-
- 				background-position: 50% 50%;
- 				background-size: 100%;
- 				background-repeat: no-repeat;
- 			}
- 			.reveal .preview-link-overlay header a.close .icon {
- 				background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC);
- 			}
- 			.reveal .preview-link-overlay header a.external .icon {
- 				background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==);
- 			}
-
- 	.reveal .preview-link-overlay .viewport {
- 		position: absolute;
- 		top: 40px;
- 		right: 0;
- 		bottom: 0;
- 		left: 0;
- 	}
-
- 	.reveal .preview-link-overlay .viewport iframe {
- 		width: 100%;
- 		height: 100%;
- 		max-width: 100%;
- 		max-height: 100%;
- 		border: 0;
-
- 		opacity: 0;
- 		visibility: hidden;
-
- 		-webkit-transition: all 0.3s ease;
- 		   -moz-transition: all 0.3s ease;
- 		    -ms-transition: all 0.3s ease;
- 		        transition: all 0.3s ease;
- 	}
-
- 	.reveal .preview-link-overlay.loaded .viewport iframe {
- 		opacity: 1;
- 		visibility: visible;
- 	}
-
- 	.reveal .preview-link-overlay.loaded .spinner {
- 		opacity: 0;
- 		visibility: hidden;
-
- 		-webkit-transform: scale(0.2);
- 		   -moz-transform: scale(0.2);
- 		    -ms-transform: scale(0.2);
- 		        transform: scale(0.2);
- 	}
-
-
-
-/*********************************************
- * PLAYBACK COMPONENT
- *********************************************/
-
-.reveal .playback {
-	position: fixed;
-	left: 15px;
-	bottom: 15px;
-	z-index: 30;
-	cursor: pointer;
-
-	-webkit-transition: all 400ms ease;
-	   -moz-transition: all 400ms ease;
-	    -ms-transition: all 400ms ease;
-	        transition: all 400ms ease;
-}
-
-.reveal.overview .playback {
-	opacity: 0;
-	visibility: hidden;
-}
-
-
-/*********************************************
- * ROLLING LINKS
- *********************************************/
-
-.reveal .roll {
-	display: inline-block;
-	line-height: 1.2;
-	overflow: hidden;
-
-	vertical-align: top;
-
-	-webkit-perspective: 400px;
-	   -moz-perspective: 400px;
-	    -ms-perspective: 400px;
-	        perspective: 400px;
-
-	-webkit-perspective-origin: 50% 50%;
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-	.reveal .roll:hover {
-		background: none;
-		text-shadow: none;
-	}
-.reveal .roll span {
-	display: block;
-	position: relative;
-	padding: 0 2px;
-
-	pointer-events: none;
-
-	-webkit-transition: all 400ms ease;
-	   -moz-transition: all 400ms ease;
-	    -ms-transition: all 400ms ease;
-	        transition: all 400ms ease;
-
-	-webkit-transform-origin: 50% 0%;
-	   -moz-transform-origin: 50% 0%;
-	    -ms-transform-origin: 50% 0%;
-	        transform-origin: 50% 0%;
-
-	-webkit-transform-style: preserve-3d;
-	   -moz-transform-style: preserve-3d;
-	    -ms-transform-style: preserve-3d;
-	        transform-style: preserve-3d;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	        backface-visibility: hidden;
-}
-	.reveal .roll:hover span {
-	    background: rgba(0,0,0,0.5);
-
-	    -webkit-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	       -moz-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	        -ms-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	            transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	}
-.reveal .roll span:after {
-	content: attr(data-title);
-
-	display: block;
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0 2px;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	        backface-visibility: hidden;
-
-	-webkit-transform-origin: 50% 0%;
-	   -moz-transform-origin: 50% 0%;
-	    -ms-transform-origin: 50% 0%;
-	        transform-origin: 50% 0%;
-
-	-webkit-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	   -moz-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	    -ms-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	        transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-}
-
-
-/*********************************************
- * SPEAKER NOTES
- *********************************************/
-
-.reveal aside.notes {
-	display: none;
-}
-
-
-/*********************************************
- * ZOOM PLUGIN
- *********************************************/
-
-.zoomed .reveal *,
-.zoomed .reveal *:before,
-.zoomed .reveal *:after {
-	-webkit-transform: none !important;
-	   -moz-transform: none !important;
-	    -ms-transform: none !important;
-	        transform: none !important;
-
-	-webkit-backface-visibility: visible !important;
-	   -moz-backface-visibility: visible !important;
-	    -ms-backface-visibility: visible !important;
-	        backface-visibility: visible !important;
-}
-
-.zoomed .reveal .progress,
-.zoomed .reveal .controls {
-	opacity: 0;
-}
-
-.zoomed .reveal .roll span {
-	background: none;
-}
-
-.zoomed .reveal .roll span:after {
-	visibility: hidden;
-}
-
-
diff --git a/docs/slides/IHP14/_support/reveal.js/css/reveal.min.css b/docs/slides/IHP14/_support/reveal.js/css/reveal.min.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/reveal.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-@charset "UTF-8";/*!
- * reveal.js
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
- */ html,body,.reveal div,.reveal span,.reveal applet,.reveal object,.reveal iframe,.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6,.reveal p,.reveal blockquote,.reveal pre,.reveal a,.reveal abbr,.reveal acronym,.reveal address,.reveal big,.reveal cite,.reveal code,.reveal del,.reveal dfn,.reveal em,.reveal img,.reveal ins,.reveal kbd,.reveal q,.reveal s,.reveal samp,.reveal small,.reveal strike,.reveal strong,.reveal sub,.reveal sup,.reveal tt,.reveal var,.reveal b,.reveal u,.reveal i,.reveal center,.reveal dl,.reveal dt,.reveal dd,.reveal ol,.reveal ul,.reveal li,.reveal fieldset,.reveal form,.reveal label,.reveal legend,.reveal table,.reveal caption,.reveal tbody,.reveal tfoot,.reveal thead,.reveal tr,.reveal th,.reveal td,.reveal article,.reveal aside,.reveal canvas,.reveal details,.reveal embed,.reveal figure,.reveal figcaption,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal output,.reveal ruby,.reveal section,.reveal summary,.reveal time,.reveal mark,.reveal audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}.reveal article,.reveal aside,.reveal details,.reveal figcaption,.reveal figure,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal section{display:block}html,body{width:100%;height:100%;overflow:hidden}body{position:relative;line-height:1}::selection{background:#FF5E99;color:#fff;text-shadow:none}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;word-wrap:break-word;line-height:1}.reveal h1{font-size:3.77em}.reveal h2{font-size:2.11em}.reveal h3{font-size:1.55em}.reveal h4{font-size:1em}.reveal .slides section .fragment{opacity:0;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .slides section .fragment.visible{opacity:1}.reveal .slides section .fragment.grow{opacity:1}.reveal .slides section .fragment.grow.visible{-webkit-transform:scale(1.3);-moz-transform:scale(1.3);-ms-transform:scale(1.3);-o-transform:scale(1.3);transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1}.reveal .slides section .fragment.shrink.visible{-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}.reveal .slides section .fragment.zoom-in{opacity:0;-webkit-transform:scale(0.1);-moz-transform:scale(0.1);-ms-transform:scale(0.1);-o-transform:scale(0.1);transform:scale(0.1)}.reveal .slides section .fragment.zoom-in.visible{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.reveal .slides section .fragment.roll-in{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}.reveal .slides section .fragment.roll-in.visible{opacity:1;-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-ms-transform:rotateX(0);-o-transform:rotateX(0);transform:rotateX(0)}.reveal .slides section .fragment.fade-out{opacity:1}.reveal .slides section .fragment.fade-out.visible{opacity:0}.reveal .slides section .fragment.semi-fade-out{opacity:1}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5}.reveal .slides section .fragment.current-visible{opacity:0}.reveal .slides section .fragment.current-visible.current-fragment{opacity:1}.reveal .slides section .fragment.highlight-red,.reveal .slides section .fragment.highlight-current-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-current-green,.reveal .slides section .fragment.highlight-blue,.reveal .slides section .fragment.highlight-current-blue{opacity:1}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal .slides section .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .slides section .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .slides section .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal iframe{z-index:1}.reveal img,.reveal video,.reveal iframe{max-width:95%;max-height:95%}.reveal a{position:relative}.reveal strong,.reveal b{font-weight:700}.reveal em,.reveal i{font-style:italic}.reveal ol,.reveal ul{display:inline-block;text-align:left;margin:0 0 0 1em}.reveal ol{list-style-type:decimal}.reveal ul{list-style-type:disc}.reveal ul ul{list-style-type:square}.reveal ul ul ul{list-style-type:circle}.reveal ul ul,.reveal ul ol,.reveal ol ol,.reveal ol ul{display:block;margin-left:40px}.reveal p{margin-bottom:10px;line-height:1.2em}.reveal q,.reveal blockquote{quotes:none}.reveal blockquote{display:block;position:relative;width:70%;margin:5px auto;padding:5px;font-style:italic;background:rgba(255,255,255,.05);box-shadow:0 0 2px rgba(0,0,0,.2)}.reveal blockquote p:first-child,.reveal blockquote p:last-child{display:inline-block}.reveal q{font-style:italic}.reveal pre{display:block;position:relative;width:90%;margin:15px auto;text-align:left;font-size:.55em;font-family:monospace;line-height:1.2em;word-wrap:break-word;box-shadow:0 0 6px rgba(0,0,0,.3)}.reveal code{font-family:monospace}.reveal pre code{padding:5px;overflow:auto;max-height:400px;word-wrap:normal}.reveal pre.stretch code{height:100%;max-height:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal table th,.reveal table td{text-align:left;padding-right:.3em}.reveal table th{font-weight:700}.reveal sup{vertical-align:super}.reveal sub{vertical-align:sub}.reveal small{display:inline-block;font-size:.6em;line-height:1.2em;vertical-align:top}.reveal small *{vertical-align:top}.reveal .stretch{max-width:none;max-height:none}.reveal .controls{display:none;position:fixed;width:110px;height:110px;z-index:30;right:10px;bottom:10px}.reveal .controls div{position:absolute;opacity:.05;width:0;height:0;border:12px solid transparent;-moz-transform:scale(.9999);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .controls div.enabled{opacity:.7;cursor:pointer}.reveal .controls div.enabled:active{margin-top:1px}.reveal .controls div.navigate-left{top:42px;border-right-width:22px;border-right-color:#eee}.reveal .controls div.navigate-left.fragmented{opacity:.3}.reveal .controls div.navigate-right{left:74px;top:42px;border-left-width:22px;border-left-color:#eee}.reveal .controls div.navigate-right.fragmented{opacity:.3}.reveal .controls div.navigate-up{left:42px;border-bottom-width:22px;border-bottom-color:#eee}.reveal .controls div.navigate-up.fragmented{opacity:.3}.reveal .controls div.navigate-down{left:42px;top:74px;border-top-width:22px;border-top-color:#eee}.reveal .controls div.navigate-down.fragmented{opacity:.3}.reveal .progress{position:fixed;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10}.reveal .progress:after{content:'';display:'block';position:absolute;height:20px;width:100%;top:-20px}.reveal .progress span{display:block;height:100%;width:0;-webkit-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);transition:width 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-number{position:fixed;display:block;right:15px;bottom:15px;opacity:.5;z-index:31;font-size:12px}.reveal{position:relative;width:100%;height:100%;-ms-touch-action:none}.reveal .slides{position:absolute;width:100%;height:100%;left:50%;top:50%;overflow:visible;z-index:1;text-align:center;-webkit-transition:-webkit-perspective .4s ease;-moz-transition:-moz-perspective .4s ease;-ms-transition:-ms-perspective .4s ease;-o-transition:-o-perspective .4s ease;transition:perspective .4s ease;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px;-webkit-perspective-origin:0 -100px;-moz-perspective-origin:0 -100px;-ms-perspective-origin:0 -100px;perspective-origin:0 -100px}.reveal .slides>section{-ms-perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;padding:20px 0;z-index:10;line-height:1.2em;font-weight:inherit;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:-webkit-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-webkit-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:-moz-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-moz-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:-ms-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-ms-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:-o-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-o-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);transition:transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow] .slides section{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides section[data-transition-speed=fast]{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal .slides section[data-transition-speed=slow]{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides>section{left:-50%;top:-50%}.reveal .slides>section.stack{padding-top:0;padding-bottom:0}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:auto!important}.reveal .slides>section.future,.reveal .slides>section>section.future,.reveal .slides>section.past,.reveal .slides>section>section.past{pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section[data-transition=default].past,.reveal .slides>section.past{display:block;opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section.future{display:block;opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section.past{display:block;opacity:0;-webkit-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-moz-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-ms-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section.future{display:block;opacity:0;-webkit-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-moz-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-ms-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides>section[data-transition=concave].past,.reveal.concave .slides>section.past{-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal.concave .slides>section.future{-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal.concave .slides>section>section.past{-webkit-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-moz-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-ms-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal.concave .slides>section>section.future{-webkit-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-moz-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-ms-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides>section[data-transition=zoom],.reveal.zoom .slides>section{-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-ms-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal.zoom .slides>section.past{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal.zoom .slides>section.future{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal.zoom .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=zoom].future,.reveal.zoom .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.linear section{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal.linear .slides>section.past{-webkit-transform:translate(-150%,0);-moz-transform:translate(-150%,0);-ms-transform:translate(-150%,0);-o-transform:translate(-150%,0);transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal.linear .slides>section.future{-webkit-transform:translate(150%,0);-moz-transform:translate(150%,0);-ms-transform:translate(150%,0);-o-transform:translate(150%,0);transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal.linear .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal.linear .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.cube .slides{-webkit-perspective:1300px;-moz-perspective:1300px;-ms-perspective:1300px;perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.center.cube .slides section{min-height:auto}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg);-moz-transform:translateZ(-90px) rotateX(65deg);-ms-transform:translateZ(-90px) rotateX(65deg);-o-transform:translateZ(-90px) rotateX(65deg);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0}.reveal.cube .slides>section.past{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg);transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg);-moz-transform:translate3d(100%,0,0) rotateY(90deg);-ms-transform:translate3d(100%,0,0) rotateY(90deg);transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg);-moz-transform:translate3d(0,-100%,0) rotateX(90deg);-ms-transform:translate3d(0,-100%,0) rotateX(90deg);transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg);-moz-transform:translate3d(0,100%,0) rotateX(-90deg);-ms-transform:translate3d(0,100%,0) rotateX(-90deg);transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{-webkit-perspective-origin:0 50%;-moz-perspective-origin:0 50%;-ms-perspective-origin:0 50%;perspective-origin:0 50%;-webkit-perspective:3000px;-moz-perspective:3000px;-ms-perspective:3000px;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0}.reveal.page .slides>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(-40%,0,0) rotateY(-80deg);-moz-transform:translate3d(-40%,0,0) rotateY(-80deg);-ms-transform:translate3d(-40%,0,0) rotateY(-80deg);transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,-40%,0) rotateX(80deg);-moz-transform:translate3d(0,-40%,0) rotateX(80deg);-ms-transform:translate3d(0,-40%,0) rotateX(80deg);transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section,.reveal.fade .slides>section>section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:opacity .5s;-moz-transition:opacity .5s;-ms-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section,.reveal.fade.overview-deactivating .slides section,.reveal.fade.overview-deactivating .slides>section>section{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal.overview .slides{-webkit-perspective-origin:0 0;-moz-perspective-origin:0 0;-ms-perspective-origin:0 0;perspective-origin:0 0;-webkit-perspective:700px;-moz-perspective:700px;-ms-perspective:700px;perspective:700px}.reveal.overview .slides section{height:600px;top:-300px!important;overflow:hidden;opacity:1!important;visibility:visible!important;cursor:pointer;background:rgba(0,0,0,.1)}.reveal.overview .slides section .fragment{opacity:1}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides section>section{opacity:1;cursor:pointer}.reveal.overview .slides section:hover{background:rgba(0,0,0,.3)}.reveal.overview .slides section.present{background:rgba(0,0,0,.3)}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0;overflow:visible}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;-webkit-transition:all 1s ease;-moz-transition:all 1s ease;-ms-transition:all 1s ease;-o-transition:all 1s ease;transition:all 1s ease}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.no-transforms{overflow-y:auto}.no-transforms .reveal .slides{position:relative;width:80%;height:auto!important;top:0;left:50%;margin:0;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none!important}.no-transforms .reveal .slides section{display:block!important;opacity:1!important;position:relative!important;height:auto;min-height:auto;top:0;left:-50%;margin:70px 0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}.no-transforms .reveal .slides section section{left:0}.reveal .no-transition,.reveal .no-transition *{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important;transition:none!important}.reveal .state-background{position:absolute;width:100%;height:100%;background:rgba(0,0,0,0);-webkit-transition:background 800ms ease;-moz-transition:background 800ms ease;-ms-transition:background 800ms ease;-o-transition:background 800ms ease;transition:background 800ms ease}.alert .reveal .state-background{background:rgba(200,50,30,.6)}.soothe .reveal .state-background{background:rgba(50,200,90,.4)}.blackout .reveal .state-background{background:rgba(0,0,0,.6)}.whiteout .reveal .state-background{background:rgba(255,255,255,.6)}.cobalt .reveal .state-background{background:rgba(22,152,213,.6)}.mint .reveal .state-background{background:rgba(22,213,75,.6)}.submerge .reveal .state-background{background:rgba(12,25,77,.6)}.lila .reveal .state-background{background:rgba(180,50,140,.6)}.sunset .reveal .state-background{background:rgba(255,122,0,.6)}.reveal>.backgrounds{position:absolute;width:100%;height:100%;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px}.reveal .slide-background{position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;background-color:rgba(0,0,0,0);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;-webkit-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);transition:all 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-background.present{opacity:1;visibility:visible}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal[data-background-transition=none]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=none]{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal[data-background-transition=slide]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=slide]{opacity:1;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=slide]{-webkit-transform:translate(-100%,0);-moz-transform:translate(-100%,0);-ms-transform:translate(-100%,0);-o-transform:translate(-100%,0);transform:translate(-100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=slide]{-webkit-transform:translate(100%,0);-moz-transform:translate(100%,0);-ms-transform:translate(100%,0);-o-transform:translate(100%,0);transform:translate(100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide]{-webkit-transform:translate(0,-100%);-moz-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-o-transform:translate(0,-100%);transform:translate(0,-100%)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide]{-webkit-transform:translate(0,100%);-moz-transform:translate(0,100%);-ms-transform:translate(0,100%);-o-transform:translate(0,100%);transform:translate(0,100%)}.reveal[data-background-transition=convex]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);-moz-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);-moz-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=zoom]{-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-ms-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl pre,.reveal.rtl code{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{float:right}.reveal.has-parallax-background .backgrounds{-webkit-transition:all .8s ease;-moz-transition:all .8s ease;-ms-transition:all .8s ease;transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .preview-link-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.visible{opacity:1;visibility:visible}.reveal .preview-link-overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal .preview-link-overlay header a{display:inline-block;width:40px;height:40px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal .preview-link-overlay header a:hover{opacity:1}.reveal .preview-link-overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal .preview-link-overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal .preview-link-overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal .preview-link-overlay .viewport{position:absolute;top:40px;right:0;bottom:0;left:0}.reveal .preview-link-overlay .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.loaded .viewport iframe{opacity:1;visibility:visible}.reveal .preview-link-overlay.loaded .spinner{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);transform:scale(0.2)}.reveal .playback{position:fixed;left:15px;bottom:15px;z-index:30;cursor:pointer;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;-webkit-perspective:400px;-moz-perspective:400px;-ms-perspective:400px;perspective:400px;-webkit-perspective-origin:50% 50%;-moz-perspective-origin:50% 50%;-ms-perspective-origin:50% 50%;perspective-origin:50% 50%}.reveal .roll:hover{background:0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);-webkit-transform:translate3d(0px,0,-45px) rotateX(90deg);-moz-transform:translate3d(0px,0,-45px) rotateX(90deg);-ms-transform:translate3d(0px,0,-45px) rotateX(90deg);transform:translate3d(0px,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:translate3d(0px,110%,0) rotateX(-90deg);-moz-transform:translate3d(0px,110%,0) rotateX(-90deg);-ms-transform:translate3d(0px,110%,0) rotateX(-90deg);transform:translate3d(0px,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.zoomed .reveal *,.zoomed .reveal :before,.zoomed .reveal :after{-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;transform:none!important;-webkit-backface-visibility:visible!important;-moz-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .progress,.zoomed .reveal .controls{opacity:0}.zoomed .reveal .roll span{background:0}.zoomed .reveal .roll span:after{visibility:hidden}
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/README.md b/docs/slides/IHP14/_support/reveal.js/css/theme/README.md
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-## Dependencies
-
-Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup
-
-You also need to install Ruby and then Sass (with `gem install sass`).
-
-## Creating a Theme
-
-To create your own theme, start by duplicating any ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source) and adding it to the compilation list in the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js).
-
-Each theme file does four things in the following order:
-
-1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)**
-Shared utility functions.
-
-2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)**
-Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3.
-
-3. **Override**
-This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding full selectors with hardcoded styles.
-
-4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)**
-The template theme file which will generate final CSS output based on the currently defined variables.
-
-When you are done, run `grunt themes` to compile the Sass file to CSS and you are ready to use your new theme.
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/beige.css b/docs/slides/IHP14/_support/reveal.js/css/theme/beige.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/beige.css
+++ /dev/null
@@ -1,148 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * Beige theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-@font-face {
-  font-family: 'League Gothic';
-  src: url("../../lib/font/league_gothic-webfont.eot");
-  src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg");
-  font-weight: normal;
-  font-style: normal; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f7f2d3;
-  background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3));
-  background: -webkit-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background: -o-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background: -ms-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background: radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
-  background-color: #f7f3de; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #333333; }
-
-::selection {
-  color: white;
-  background: rgba(79, 64, 28, 0.99);
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #333333;
-  font-family: "League Gothic", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #8b743d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #c0a86e;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #564826; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #333333;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #8b743d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #8b743d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #8b743d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #8b743d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #8b743d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #c0a86e; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #c0a86e; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #c0a86e; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #c0a86e; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #8b743d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #8b743d; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/blood.css b/docs/slides/IHP14/_support/reveal.js/css/theme/blood.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/blood.css
+++ /dev/null
@@ -1,175 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
-/**
- * Blood theme for reveal.js
- * Author: Walther http://github.com/Walther
- *
- * Designed to be used with highlight.js theme
- * "monokai_sublime.css" available from
- * https://github.com/isagalaev/highlight.js/
- *
- * For other themes, change $codeBackground accordingly.
- *
- */
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #222222;
-  background: -moz-radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #626262), color-stop(100%, #222222));
-  background: -webkit-radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background: -o-radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background: -ms-radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background: radial-gradient(center, circle cover, #626262 0%, #222222 100%);
-  background-color: #2b2b2b; }
-
-.reveal {
-  font-family: Ubuntu, "sans-serif";
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #eeeeee; }
-
-::selection {
-  color: white;
-  background: #aa2233;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #eeeeee;
-  font-family: Ubuntu, "sans-serif";
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: 2px 2px 2px #222222; }
-
-.reveal h1 {
-  text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #aa2233;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #dd5566;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #6a1520; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #eeeeee;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #aa2233;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #aa2233; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #aa2233; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #aa2233; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #aa2233; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #dd5566; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #dd5566; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #dd5566; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #dd5566; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #aa2233;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #aa2233; }
-
-.reveal p {
-  font-weight: 300;
-  text-shadow: 1px 1px #222222; }
-
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  font-weight: 700; }
-
-.reveal a:not(.image),
-.reveal a:not(.image):hover {
-  text-shadow: 2px 2px 2px #000; }
-
-.reveal small a:not(.image),
-.reveal small a:not(.image):hover {
-  text-shadow: 1px 1px 1px #000; }
-
-.reveal p code {
-  background-color: #23241f;
-  display: inline-block;
-  border-radius: 7px; }
-
-.reveal small code {
-  vertical-align: baseline; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/default.css b/docs/slides/IHP14/_support/reveal.js/css/theme/default.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/default.css
+++ /dev/null
@@ -1,148 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * Default theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-@font-face {
-  font-family: 'League Gothic';
-  src: url("../../lib/font/league_gothic-webfont.eot");
-  src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg");
-  font-weight: normal;
-  font-style: normal; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #1c1e20;
-  background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20));
-  background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
-  background-color: #2b2b2b; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #eeeeee; }
-
-::selection {
-  color: white;
-  background: #ff5e99;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #eeeeee;
-  font-family: "League Gothic", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-.reveal h1 {
-  text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #13daec;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #71e9f4;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #0d99a5; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #eeeeee;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #13daec;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #13daec; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #13daec; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #13daec; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #13daec; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #71e9f4; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #71e9f4; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #71e9f4; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #71e9f4; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #13daec;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #13daec; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/moon.css b/docs/slides/IHP14/_support/reveal.js/css/theme/moon.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/moon.css
+++ /dev/null
@@ -1,148 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * Solarized Dark theme for reveal.js.
- * Author: Achim Staebler
- */
-@font-face {
-  font-family: 'League Gothic';
-  src: url("../../lib/font/league_gothic-webfont.eot");
-  src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg");
-  font-weight: normal;
-  font-style: normal; }
-
-/**
- * Solarized colors by Ethan Schoonover
- */
-html * {
-  color-profile: sRGB;
-  rendering-intent: auto; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #002b36;
-  background-color: #002b36; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #93a1a1; }
-
-::selection {
-  color: white;
-  background: #d33682;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #eee8d5;
-  font-family: "League Gothic", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #268bd2;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #78b9e6;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #1a6091; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #93a1a1;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #268bd2;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #268bd2; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #268bd2; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #268bd2; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #268bd2; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #78b9e6; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #78b9e6; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #78b9e6; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #78b9e6; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #268bd2;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #268bd2; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/night.css b/docs/slides/IHP14/_support/reveal.js/css/theme/night.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/night.css
+++ /dev/null
@@ -1,136 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
-/**
- * Black theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #111111;
-  background-color: #111111; }
-
-.reveal {
-  font-family: "Open Sans", sans-serif;
-  font-size: 30px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #eeeeee; }
-
-::selection {
-  color: white;
-  background: #e7ad52;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #eeeeee;
-  font-family: "Montserrat", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: -0.03em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #e7ad52;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #f3d7ac;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #d08a1d; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #eeeeee;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #e7ad52;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #e7ad52; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #e7ad52; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #e7ad52; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #e7ad52; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #f3d7ac; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #f3d7ac; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #f3d7ac; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #f3d7ac; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #e7ad52;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #e7ad52; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/seminar.css b/docs/slides/IHP14/_support/reveal.js/css/theme/seminar.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/seminar.css
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f0f1eb;
-  background-color: #f0f1eb; }
-
-.reveal {
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-.reveal a {
-  color: #8b7c69;
-  text-decoration: none;
-}
-::selection {
-  color: white;
-  background: #26351c;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 40px 0;
-  color: #383d3d;
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	// :color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.05em 0.05em 0.25em blue;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-/*
-.reveal a:not(.image) {
-  line-height: 1.3em; }
-
-
-.reveal a:not(.image) {
-  color: #51483d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #8b7c69;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #25211c; }
-
-*/
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #51483d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #51483d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #51483d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #51483d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #51483d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #8b7c69; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #8b7c69; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #8b7c69; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #8b7c69; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #51483d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #51483d; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/seminar.orig.css b/docs/slides/IHP14/_support/reveal.js/css/theme/seminar.orig.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/seminar.orig.css
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- * The default theme for reveal.js presentations.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.ttf') format('truetype');
-	font-weight: normal;
-	font-style: normal;
-}
-
-@font-face {
-		font-family: 'PTSansNarrow';
-        src: url('../../lib/font/PT_Sans-Narrow-Web-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-@font-face {
-		font-family: 'OpenSans';
-        src: url('../../lib/font/OpenSans-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'OpenSans', Times, 'Times New Roman', serif;
-	font-size: 36;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #eee;
-
-	background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiM1NTVhNWYiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMWMxZTIwIiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
-	background-color: #2b2b2b;
-	background: -moz-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%, rgba(28,30,32,1) 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(85,90,95,1)), color-stop(100%,rgba(28,30,32,1)));
-	background: -webkit-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -o-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-}
-
-
-/*********************************************
- * main.css OVERIDES
- *********************************************/
-
-
-/*--DW-- uncomment below to undo globally centered text from main.css*/
-
-/*.reveal .slides {
-	text-align: left;
-}
-
-.reveal li {
-	padding-bottom: 0.7em;
-	line-height: 1em;
-}
-.reveal ul ul {
-	padding-left: 8%;
-	padding-top: 0.7em;
-	font-size: 85%;
-}*/
-
-/*--DW--
-* override list width to make multiline list items
-* a bit more manageable
-*/
-.reveal ul {
-	max-width: 80%;
-}
-
-.reveal li {
-	padding-bottom: 0.3em;
-}
-
-/*--DW-- uncenter pararagraph blocks*/
-.reveal .slides p {
-	text-align: left
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2 {
-	margin: 0 0 20px 0;
-	color: #eee;
-	font-family: 'League Gothic', Impact, sans-serif;
-	line-height: 0.9em;
-	letter-spacing: 0.02em;
-	
-	text-align: center;
-	text-transform: uppercase;
-	text-shadow: 0px 1px 0px rgba(0,0,0,1);
-}
-
-.reveal h2 {
-	font-family: 'PTSansNarrow';
-	font-size: 130%;
-}
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-
-
-/*********************************************
- * BLOCKQUOTES
- *********************************************/
-
-/*--DW--*/
-.reveal blockquote
-{   background: rgba(255,255,255, .2);
-    font-size: 75%;
-    text-align: justify;
-    width: 70%;
-    padding: 0.5em 5% 0.2em;
-    margin: 0 10%;
-    border: 2px solid rgba(255, 255, 255, .1);
-    -webkit-box-shadow: .1em .1em .5em black inset;
-    -moz-box-shadow: .1em .1em .5em black inset;
-    box-shadow: .1em .1em .5em black inset;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: hsl(185, 85%, 50%);
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-.reveal a:not(.image):hover {
-	color: hsl(185, 85%, 70%);
-	
-	text-shadow: none;
-	border: none;
-	border-radius: 2px;
-}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: hsl(185, 60%, 35%);
-}
-
-
-/*********************************************
- * IMAGES AND FIGURES
- *********************************************/
-
-/*--DW-- added figures; changed img styling*/
-/*pandoc*/
-.reveal figure {
-	margin-left: auto;
-	margin-right: auto;
-}
-
-/*pandoc*/
-.reveal figcaption {
-	text-align: center;
-	font-size: 75%;
-	font-style: italic;
-}
-.reveal section img,
-.reveal section embed {
-/*	width: 80%;
-	height: 80%;
-*/	display: block;
-	margin-left: auto;
-	margin-right: auto;
-	padding: 15px;
-	background: rgba(255,255,255, .75);
-    border: 2px solid rgba(255, 255, 255, .1);
-    -webkit-box-shadow: .1em .1em .5em black inset;
-       -moz-box-shadow: .1em .1em .5em black inset;
-            box-shadow: .1em .1em .5em black inset;
-
-/*--DW-- original image box styling*/
-/*
--webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-
--webkit-transition: all .2s linear;
-   -moz-transition: all .2s linear;
-    -ms-transition: all .2s linear;
-     -o-transition: all .2s linear;
-        transition: all .2s linear;
-*/
-}
-
-.reveal a:hover img {
-	background: rgba(255,255,255,0.2);
-	border-color: #13DAEC;
-	
-	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		/*color: hsl(185, 85%, 70%);*/
-		color: rgba(138, 201, 85, 0.60);
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		/*background: hsl(185, 85%, 50%);*/
-		background: rgba(138, 201, 85, 0.60);
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/serif.css b/docs/slides/IHP14/_support/reveal.js/css/theme/serif.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/serif.css
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-.reveal a:not(.image) {
-  line-height: 1.3em; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f0f1eb;
-  background-color: #f0f1eb; }
-
-.reveal {
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-::selection {
-  color: white;
-  background: #26351c;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #383d3d;
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #51483d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #8b7c69;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #25211c; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #51483d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #51483d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #51483d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #51483d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #51483d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #8b7c69; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #8b7c69; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #8b7c69; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #8b7c69; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #51483d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #51483d; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/simple.css b/docs/slides/IHP14/_support/reveal.js/css/theme/simple.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/simple.css
+++ /dev/null
@@ -1,138 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is darkblue.
- *
- * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
- * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: white;
-  background-color: white; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-::selection {
-  color: white;
-  background: rgba(0, 0, 0, 0.99);
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: black;
-  font-family: "News Cycle", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: darkblue;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #0000f1;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #00003f; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: darkblue;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: darkblue; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: darkblue; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: darkblue; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: darkblue; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #0000f1; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #0000f1; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #0000f1; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #0000f1; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: darkblue;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: darkblue; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/sky.css b/docs/slides/IHP14/_support/reveal.js/css/theme/sky.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/sky.css
+++ /dev/null
@@ -1,145 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
-/**
- * Sky theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-.reveal a:not(.image) {
-  line-height: 1.3em; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #add9e4;
-  background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4));
-  background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
-  background-color: #f7fbfc; }
-
-.reveal {
-  font-family: "Open Sans", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #333333; }
-
-::selection {
-  color: white;
-  background: #134674;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #333333;
-  font-family: "Quicksand", sans-serif;
-  line-height: 0.9em;
-  letter-spacing: -0.08em;
-  text-transform: uppercase;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #3b759e;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #74a7cb;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #264c66; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #333333;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #3b759e;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #3b759e; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #3b759e; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #3b759e; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #3b759e; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #74a7cb; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #74a7cb; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #74a7cb; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #74a7cb; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #3b759e;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #3b759e; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/solarized.css b/docs/slides/IHP14/_support/reveal.js/css/theme/solarized.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/solarized.css
+++ /dev/null
@@ -1,148 +0,0 @@
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-/**
- * Solarized Light theme for reveal.js.
- * Author: Achim Staebler
- */
-@font-face {
-  font-family: 'League Gothic';
-  src: url("../../lib/font/league_gothic-webfont.eot");
-  src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg");
-  font-weight: normal;
-  font-style: normal; }
-
-/**
- * Solarized colors by Ethan Schoonover
- */
-html * {
-  color-profile: sRGB;
-  rendering-intent: auto; }
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #fdf6e3;
-  background-color: #fdf6e3; }
-
-.reveal {
-  font-family: "Lato", sans-serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: #657b83; }
-
-::selection {
-  color: white;
-  background: #d33682;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 20px 0;
-  color: #586e75;
-  font-family: "League Gothic", Impact, sans-serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: uppercase;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #268bd2;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #78b9e6;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #1a6091; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid #657b83;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #268bd2;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #268bd2; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #268bd2; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #268bd2; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #268bd2; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #78b9e6; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #78b9e6; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #78b9e6; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #78b9e6; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #268bd2;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #268bd2; }
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/beige.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/beige.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/beige.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Beige theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-
-// Override theme settings (see ../template/settings.scss)
-$mainColor: #333;
-$headingColor: #333;
-$headingTextShadow: none;
-$backgroundColor: #f7f3de;
-$linkColor: #8b743d;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: rgba(79, 64, 28, 0.99);
-$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
-
-// Background generator
-@mixin bodyBackground() {
-	@include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) );
-}
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/blood.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/blood.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/blood.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Blood theme for reveal.js
- * Author: Walther http://github.com/Walther
- *
- * Designed to be used with highlight.js theme
- * "monokai_sublime.css" available from
- * https://github.com/isagalaev/highlight.js/
- *
- * For other themes, change $codeBackground accordingly.
- *
- */
-
- // Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-// Include theme-specific fonts
-
-@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
-
-// Colors used in the theme
-$blood: #a23;
-$coal: #222;
-$codeBackground: #23241f;
-
-// Main text
-$mainFont: Ubuntu, 'sans-serif';
-$mainFontSize: 36px;
-$mainColor: #eee;
-
-// Headings
-$headingFont: Ubuntu, 'sans-serif';
-$headingTextShadow: 2px 2px 2px $coal;
-
-// h1 shadow, borrowed humbly from 
-// (c) Default theme by Hakim El Hattab
-$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
-
-// Links
-$linkColor: $blood;
-$linkColorHover: lighten( $linkColor, 20% );
-
-// Text selection
-$selectionBackgroundColor: $blood;
-$selectionColor: #fff;
-
-// Background generator
-@mixin bodyBackground() {
-    @include radial-gradient( $coal, lighten( $coal, 25% ) );
-}
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
-
-// some overrides after theme template import
-
-.reveal p {
-    font-weight: 300;
-    text-shadow: 1px 1px $coal;
-}
-
-.reveal h1, 
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-    font-weight: 700;
-}
-
-.reveal a:not(.image),
-.reveal a:not(.image):hover {
-    text-shadow: 2px 2px 2px #000;
-}
-
-.reveal small a:not(.image),
-.reveal small a:not(.image):hover {
-    text-shadow: 1px 1px 1px #000;
-}
-
-.reveal p code {
-    background-color: $codeBackground;
-    display: inline-block;
-    border-radius: 7px;
-}
-
-.reveal small code {
-    vertical-align: baseline;
-}
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/default.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/default.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/default.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Default theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-// Override theme settings (see ../template/settings.scss)
-$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
-
-// Background generator
-@mixin bodyBackground() {
-	@include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) );
-}
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/moon.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/moon.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/moon.scss
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Solarized Dark theme for reveal.js.
- * Author: Achim Staebler
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-/**
- * Solarized colors by Ethan Schoonover
- */
-html * {
-	color-profile: sRGB;
-	rendering-intent: auto;
-}
-
-// Solarized colors
-$base03:    #002b36;
-$base02:    #073642;
-$base01:    #586e75;
-$base00:    #657b83;
-$base0:     #839496;
-$base1:     #93a1a1;
-$base2:     #eee8d5;
-$base3:     #fdf6e3;
-$yellow:    #b58900;
-$orange:    #cb4b16;
-$red:       #dc322f;
-$magenta:   #d33682;
-$violet:    #6c71c4;
-$blue:      #268bd2;
-$cyan:      #2aa198;
-$green:     #859900;
-
-// Override theme settings (see ../template/settings.scss)
-$mainColor: $base1;
-$headingColor: $base2;
-$headingTextShadow: none;
-$backgroundColor: $base03;
-$linkColor: $blue;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: $magenta;
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/night.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/night.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/night.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Black theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-// Include theme-specific fonts
-@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
-
-
-// Override theme settings (see ../template/settings.scss)
-$backgroundColor: #111;
-
-$mainFont: 'Open Sans', sans-serif;
-$linkColor: #e7ad52;
-$linkColorHover: lighten( $linkColor, 20% );
-$headingFont: 'Montserrat', Impact, sans-serif;
-$headingTextShadow: none;
-$headingLetterSpacing: -0.03em;
-$headingTextTransform: none;
-$selectionBackgroundColor: #e7ad52;
-$mainFontSize: 30px;
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/serif.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/serif.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/serif.scss
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Override theme settings (see ../template/settings.scss)
-$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
-$mainColor: #000;
-$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
-$headingColor: #383D3D;
-$headingTextShadow: none;
-$headingTextTransform: none;
-$backgroundColor: #F0F1EB;
-$linkColor: #51483D;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: #26351C;
-
-.reveal a:not(.image) {
-  line-height: 1.3em;
-}
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/simple.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/simple.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/simple.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is darkblue.
- *
- * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
- * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-
-// Override theme settings (see ../template/settings.scss)
-$mainFont: 'Lato', sans-serif;
-$mainColor: #000;
-$headingFont: 'News Cycle', Impact, sans-serif;
-$headingColor: #000;
-$headingTextShadow: none;
-$headingTextTransform: none;
-$backgroundColor: #fff;
-$linkColor: #00008B;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: rgba(0, 0, 0, 0.99);
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/sky.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/sky.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/sky.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Sky theme for reveal.js.
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
-@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
-
-
-// Override theme settings (see ../template/settings.scss)
-$mainFont: 'Open Sans', sans-serif;
-$mainColor: #333;
-$headingFont: 'Quicksand', sans-serif;
-$headingColor: #333;
-$headingLetterSpacing: -0.08em;
-$headingTextShadow: none;
-$backgroundColor: #f7fbfc;
-$linkColor: #3b759e;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: #134674;
-
-// Fix links so they are not cut off
-.reveal a:not(.image) {
-	line-height: 1.3em;
-}
-
-// Background generator
-@mixin bodyBackground() {
-	@include radial-gradient( #add9e4, #f7fbfc );
-}
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/source/solarized.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/source/solarized.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/source/solarized.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Solarized Light theme for reveal.js.
- * Author: Achim Staebler
- */
-
-
-// Default mixins and settings -----------------
-@import "../template/mixins";
-@import "../template/settings";
-// ---------------------------------------------
-
-
-
-// Include theme-specific fonts
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-
-/**
- * Solarized colors by Ethan Schoonover
- */
-html * {
-	color-profile: sRGB;
-	rendering-intent: auto;
-}
-
-// Solarized colors
-$base03:    #002b36;
-$base02:    #073642;
-$base01:    #586e75;
-$base00:    #657b83;
-$base0:     #839496;
-$base1:     #93a1a1;
-$base2:     #eee8d5;
-$base3:     #fdf6e3;
-$yellow:    #b58900;
-$orange:    #cb4b16;
-$red:       #dc322f;
-$magenta:   #d33682;
-$violet:    #6c71c4;
-$blue:      #268bd2;
-$cyan:      #2aa198;
-$green:     #859900;
-
-// Override theme settings (see ../template/settings.scss)
-$mainColor: $base00;
-$headingColor: $base01;
-$headingTextShadow: none;
-$backgroundColor: $base3;
-$linkColor: $blue;
-$linkColorHover: lighten( $linkColor, 20% );
-$selectionBackgroundColor: $magenta;
-
-// Background generator
-// @mixin bodyBackground() {
-// 	@include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
-// }
-
-
-
-// Theme template ------------------------------
-@import "../template/theme";
-// ---------------------------------------------
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/template/mixins.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/template/mixins.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/template/mixins.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-@mixin vertical-gradient( $top, $bottom ) {
-	background: $top;
-	background: -moz-linear-gradient( top, $top 0%, $bottom 100% );
-	background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) );
-	background: -webkit-linear-gradient( top, $top 0%, $bottom 100% );
-	background: -o-linear-gradient( top, $top 0%, $bottom 100% );
-	background: -ms-linear-gradient( top, $top 0%, $bottom 100% );
-	background: linear-gradient( top, $top 0%, $bottom 100% );
-}
-
-@mixin horizontal-gradient( $top, $bottom ) {
-	background: $top;
-	background: -moz-linear-gradient( left, $top 0%, $bottom 100% );
-	background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) );
-	background: -webkit-linear-gradient( left, $top 0%, $bottom 100% );
-	background: -o-linear-gradient( left, $top 0%, $bottom 100% );
-	background: -ms-linear-gradient( left, $top 0%, $bottom 100% );
-	background: linear-gradient( left, $top 0%, $bottom 100% );
-}
-
-@mixin radial-gradient( $outer, $inner, $type: circle ) {
-	background: $outer;
-	background: -moz-radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-	background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) );
-	background: -webkit-radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-	background: -o-radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-	background: -ms-radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-	background: radial-gradient( center, $type cover,  $inner 0%, $outer 100% );
-}
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/template/settings.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/template/settings.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/template/settings.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-// Base settings for all themes that can optionally be
-// overridden by the super-theme
-
-// Background of the presentation
-$backgroundColor: #2b2b2b;
-
-// Primary/body text
-$mainFont: 'Lato', sans-serif;
-$mainFontSize: 36px;
-$mainColor: #eee;
-
-// Headings
-$headingMargin: 0 0 20px 0;
-$headingFont: 'League Gothic', Impact, sans-serif;
-$headingColor: #eee;
-$headingLineHeight: 0.9em;
-$headingLetterSpacing: 0.02em;
-$headingTextTransform: uppercase;
-$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
-$heading1TextShadow: $headingTextShadow;
-
-// Links and actions
-$linkColor: #13DAEC;
-$linkColorHover: lighten( $linkColor, 20% );
-
-// Text selection
-$selectionBackgroundColor: #FF5E99;
-$selectionColor: #fff;
-
-// Generates the presentation background, can be overridden
-// to return a background image or gradient
-@mixin bodyBackground() {
-	background: $backgroundColor;
-}
diff --git a/docs/slides/IHP14/_support/reveal.js/css/theme/template/theme.scss b/docs/slides/IHP14/_support/reveal.js/css/theme/template/theme.scss
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/css/theme/template/theme.scss
+++ /dev/null
@@ -1,170 +0,0 @@
-// Base theme template for reveal.js
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	@include bodyBackground();
-	background-color: $backgroundColor;
-}
-
-.reveal {
-	font-family: $mainFont;
-	font-size: $mainFontSize;
-	font-weight: normal;
-	letter-spacing: -0.02em;
-	color: $mainColor;
-}
-
-::selection {
-	color: $selectionColor;
-	background: $selectionBackgroundColor;
-	text-shadow: none;
-}
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-	margin: $headingMargin;
-	color: $headingColor;
-
-	font-family: $headingFont;
-	line-height: $headingLineHeight;
-	letter-spacing: $headingLetterSpacing;
-
-	text-transform: $headingTextTransform;
-	text-shadow: $headingTextShadow;
-}
-
-.reveal h1 {
-	text-shadow: $heading1TextShadow;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: $linkColor;
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		color: $linkColorHover;
-
-		text-shadow: none;
-		border: none;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: darken( $linkColor, 15% );
-}
-
-
-/*********************************************
- * IMAGES
- *********************************************/
-
-.reveal section img {
-	margin: 15px 0px;
-	background: rgba(255,255,255,0.12);
-	border: 4px solid $mainColor;
-
-	box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: $linkColor;
-
-		box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-	border-right-color: $linkColor;
-}
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-	border-left-color: $linkColor;
-}
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-	border-bottom-color: $linkColor;
-}
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-	border-top-color: $linkColor;
-}
-
-.reveal .controls div.navigate-left.enabled:hover {
-	border-right-color: $linkColorHover;
-}
-
-.reveal .controls div.navigate-right.enabled:hover {
-	border-left-color: $linkColorHover;
-}
-
-.reveal .controls div.navigate-up.enabled:hover {
-	border-bottom-color: $linkColorHover;
-}
-
-.reveal .controls div.navigate-down.enabled:hover {
-	border-top-color: $linkColorHover;
-}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: $linkColor;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: $linkColor;
-}
-
-
diff --git a/docs/slides/IHP14/_support/reveal.js/index.html b/docs/slides/IHP14/_support/reveal.js/index.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/index.html
+++ /dev/null
@@ -1,394 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - The HTML Presentation Framework</title>
-
-		<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
-		<meta name="author" content="Hakim El Hattab">
-
-		<meta name="apple-mobile-web-app-capable" content="yes" />
-		<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
-
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-		<link rel="stylesheet" href="css/reveal.min.css">
-		<link rel="stylesheet" href="css/theme/default.css" id="theme">
-
-		<!-- For syntax highlighting -->
-		<link rel="stylesheet" href="lib/css/zenburn.css">
-
-		<!-- If the query includes 'print-pdf', include the PDF print sheet -->
-		<script>
-			if( window.location.search.match( /print-pdf/gi ) ) {
-				var link = document.createElement( 'link' );
-				link.rel = 'stylesheet';
-				link.type = 'text/css';
-				link.href = 'css/print/pdf.css';
-				document.getElementsByTagName( 'head' )[0].appendChild( link );
-			}
-		</script>
-
-		<!--[if lt IE 9]>
-		<script src="lib/js/html5shiv.js"></script>
-		<![endif]-->
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<!-- Any section element inside of this container is displayed as a slide -->
-			<div class="slides">
-				<section>
-					<h1>Reveal.js</h1>
-					<h3>HTML Presentations Made Easy</h3>
-					<p>
-						<small>Created by <a href="http://hakim.se">Hakim El Hattab</a> / <a href="http://twitter.com/hakimel">@hakimel</a></small>
-					</p>
-				</section>
-
-				<section>
-					<h2>Heads Up</h2>
-					<p>
-						reveal.js is a framework for easily creating beautiful presentations using HTML. You'll need a browser with
-						support for CSS 3D transforms to see it in its full glory.
-					</p>
-
-					<aside class="notes">
-						Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard).
-					</aside>
-				</section>
-
-				<!-- Example of nested vertical slides -->
-				<section>
-					<section>
-						<h2>Vertical Slides</h2>
-						<p>
-							Slides can be nested inside of other slides,
-							try pressing <a href="#" class="navigate-down">down</a>.
-						</p>
-						<a href="#" class="image navigate-down">
-							<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
-						</a>
-					</section>
-					<section>
-						<h2>Basement Level 1</h2>
-						<p>Press down or up to navigate.</p>
-					</section>
-					<section>
-						<h2>Basement Level 2</h2>
-						<p>Cornify</p>
-						<a class="test" href="http://cornify.com">
-							<img width="280" height="326" src="https://s3.amazonaws.com/hakim-static/reveal-js/cornify.gif" alt="Unicorn">
-						</a>
-					</section>
-					<section>
-						<h2>Basement Level 3</h2>
-						<p>That's it, time to go back up.</p>
-						<a href="#/2" class="image">
-							<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Up arrow" style="-webkit-transform: rotate(180deg);">
-						</a>
-					</section>
-				</section>
-
-				<section>
-					<h2>Slides</h2>
-					<p>
-						Not a coder? No problem. There's a fully-featured visual editor for authoring these, try it out at <a href="http://slid.es" target="_blank">http://slid.es</a>.
-					</p>
-				</section>
-
-				<section>
-					<h2>Point of View</h2>
-					<p>
-						Press <strong>ESC</strong> to enter the slide overview.
-					</p>
-					<p>
-						Hold down alt and click on any element to zoom in on it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>. Alt + click anywhere to zoom back out.
-					</p>
-				</section>
-
-				<section>
-					<h2>Works in Mobile Safari</h2>
-					<p>
-						Try it out! You can swipe through the slides and pinch your way to the overview.
-					</p>
-				</section>
-
-				<section>
-					<h2>Marvelous Unordered List</h2>
-					<ul>
-						<li>No order here</li>
-						<li>Or here</li>
-						<li>Or here</li>
-						<li>Or here</li>
-					</ul>
-				</section>
-
-				<section>
-					<h2>Fantastic Ordered List</h2>
-					<ol>
-						<li>One is smaller than...</li>
-						<li>Two is smaller than...</li>
-						<li>Three!</li>
-					</ol>
-				</section>
-
-				<section data-markdown>
-					<script type="text/template">
-						## Markdown support
-
-						For those of you who like that sort of thing. Instructions and a bit more info available [here](https://github.com/hakimel/reveal.js#markdown).
-
-						```
-						<section data-markdown>
-						  ## Markdown support
-
-						  For those of you who like that sort of thing.
-						  Instructions and a bit more info available [here](https://github.com/hakimel/reveal.js#markdown).
-						</section>
-						```
-					</script>
-				</section>
-
-				<section id="transitions">
-					<h2>Transition Styles</h2>
-					<p>
-						You can select from different transitions, like: <br>
-						<a href="?transition=cube#/transitions">Cube</a> -
-						<a href="?transition=page#/transitions">Page</a> -
-						<a href="?transition=concave#/transitions">Concave</a> -
-						<a href="?transition=zoom#/transitions">Zoom</a> -
-						<a href="?transition=linear#/transitions">Linear</a> -
-						<a href="?transition=fade#/transitions">Fade</a> -
-						<a href="?transition=none#/transitions">None</a> -
-						<a href="?#/transitions">Default</a>
-					</p>
-				</section>
-
-				<section id="themes">
-					<h2>Themes</h2>
-					<p>
-						Reveal.js comes with a few themes built in: <br>
-						<a href="?#/themes">Default</a> -
-						<a href="?theme=sky#/themes">Sky</a> -
-						<a href="?theme=beige#/themes">Beige</a> -
-						<a href="?theme=simple#/themes">Simple</a> -
-						<a href="?theme=serif#/themes">Serif</a> -
-						<a href="?theme=night#/themes">Night</a> <br>
-						<a href="?theme=moon#/themes">Moon</a> -
-						<a href="?theme=solarized#/themes">Solarized</a>
-					</p>
-					<p>
-						<small>
-							* Theme demos are loaded after the presentation which leads to flicker. In production you should load your theme in the <code>&lt;head&gt;</code> using a <code>&lt;link&gt;</code>.
-						</small>
-					</p>
-				</section>
-
-				<section>
-					<h2>Global State</h2>
-					<p>
-						Set <code>data-state="something"</code> on a slide and <code>"something"</code>
-						will be added as a class to the document element when the slide is open. This lets you
-						apply broader style changes, like switching the background.
-					</p>
-				</section>
-
-				<section data-state="customevent">
-					<h2>Custom Events</h2>
-					<p>
-						Additionally custom events can be triggered on a per slide basis by binding to the <code>data-state</code> name.
-					</p>
-					<pre><code data-trim contenteditable style="font-size: 18px; margin-top: 20px;">
-Reveal.addEventListener( 'customevent', function() {
-	console.log( '"customevent" has fired' );
-} );
-					</code></pre>
-				</section>
-
-				<section>
-					<section data-background="#007777">
-						<h2>Slide Backgrounds</h2>
-						<p>
-							Set <code>data-background="#007777"</code> on a slide to change the full page background to the given color. All CSS color formats are supported.
-						</p>
-						<a href="#" class="image navigate-down">
-							<img width="178" height="238" src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
-						</a>
-					</section>
-					<section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png">
-						<h2>Image Backgrounds</h2>
-						<pre><code>&lt;section data-background="image.png"&gt;</code></pre>
-					</section>
-					<section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" data-background-repeat="repeat" data-background-size="100px">
-						<h2>Repeated Image Backgrounds</h2>
-						<pre><code style="word-wrap: break-word;">&lt;section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"&gt;</code></pre>
-					</section>
-				</section>
-
-				<section data-transition="linear" data-background="#4d7e65" data-background-transition="slide">
-					<h2>Background Transitions</h2>
-					<p>
-						Pass reveal.js the <code>backgroundTransition: 'slide'</code> config argument to make backgrounds slide rather than fade.
-					</p>
-				</section>
-
-				<section data-transition="linear" data-background="#8c4738" data-background-transition="slide">
-					<h2>Background Transition Override</h2>
-					<p>
-						You can override background transitions per slide by using <code>data-background-transition="slide"</code>.
-					</p>
-				</section>
-
-				<section>
-					<h2>Clever Quotes</h2>
-					<p>
-						These guys come in two forms, inline: <q cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
-						&ldquo;The nice thing about standards is that there are so many to choose from&rdquo;</q> and block:
-					</p>
-					<blockquote cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
-						&ldquo;For years there has been a theory that millions of monkeys typing at random on millions of typewriters would
-						reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.&rdquo;
-					</blockquote>
-				</section>
-
-				<section>
-					<h2>Pretty Code</h2>
-					<pre><code data-trim contenteditable>
-function linkify( selector ) {
-  if( supports3DTransforms ) {
-
-    var nodes = document.querySelectorAll( selector );
-
-    for( var i = 0, len = nodes.length; i &lt; len; i++ ) {
-      var node = nodes[i];
-
-      if( !node.className ) {
-        node.className += ' roll';
-      }
-    }
-  }
-}
-					</code></pre>
-					<p>Courtesy of <a href="http://softwaremaniacs.org/soft/highlight/en/description/">highlight.js</a>.</p>
-				</section>
-
-				<section>
-					<h2>Intergalactic Interconnections</h2>
-					<p>
-						You can link between slides internally,
-						<a href="#/2/3">like this</a>.
-					</p>
-				</section>
-
-				<section>
-					<section id="fragments">
-						<h2>Fragmented Views</h2>
-						<p>Hit the next arrow...</p>
-						<p class="fragment">... to step through ...</p>
-						<ol>
-							<li class="fragment"><code>any type</code></li>
-							<li class="fragment"><em>of view</em></li>
-							<li class="fragment"><strong>fragments</strong></li>
-						</ol>
-
-						<aside class="notes">
-							This slide has fragments which are also stepped through in the notes window.
-						</aside>
-					</section>
-					<section>
-						<h2>Fragment Styles</h2>
-						<p>There's a few styles of fragments, like:</p>
-						<p class="fragment grow">grow</p>
-						<p class="fragment shrink">shrink</p>
-						<p class="fragment roll-in">roll-in</p>
-						<p class="fragment fade-out">fade-out</p>
-						<p class="fragment highlight-red">highlight-red</p>
-						<p class="fragment highlight-green">highlight-green</p>
-						<p class="fragment highlight-blue">highlight-blue</p>
-						<p class="fragment current-visible">current-visible</p>
-						<p class="fragment highlight-current-blue">highlight-current-blue</p>
-					</section>
-				</section>
-
-				<section>
-					<h2>Spectacular image!</h2>
-					<a class="image" href="http://lab.hakim.se/meny/" target="_blank">
-						<img width="320" height="299" src="http://s3.amazonaws.com/hakim-static/portfolio/images/meny.png" alt="Meny">
-					</a>
-				</section>
-
-				<section>
-					<h2>Export to PDF</h2>
-					<p>Presentations can be <a href="https://github.com/hakimel/reveal.js#pdf-export">exported to PDF</a>, below is an example that's been uploaded to SlideShare.</p>
-					<iframe id="slideshare" src="http://www.slideshare.net/slideshow/embed_code/13872948" width="455" height="356" style="margin:0;overflow:hidden;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe>
-					<script>
-						document.getElementById('slideshare').attributeName = 'allowfullscreen';
-					</script>
-				</section>
-
-				<section>
-					<h2>Take a Moment</h2>
-					<p>
-						Press b or period on your keyboard to enter the 'paused' mode. This mode is helpful when you want to take distracting slides off the screen
-						during a presentation.
-					</p>
-				</section>
-
-				<section>
-					<h2>Stellar Links</h2>
-					<ul>
-						<li><a href="http://slid.es">Try the online editor</a></li>
-						<li><a href="https://github.com/hakimel/reveal.js">Source code on GitHub</a></li>
-						<li><a href="http://twitter.com/hakimel">Follow me on Twitter</a></li>
-					</ul>
-				</section>
-
-				<section>
-					<h1>THE END</h1>
-					<h3>BY Hakim El Hattab / hakim.se</h3>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="lib/js/head.min.js"></script>
-		<script src="js/reveal.min.js"></script>
-
-		<script>
-
-			// Full list of configuration options available here:
-			// https://github.com/hakimel/reveal.js#configuration
-			Reveal.initialize({
-				controls: true,
-				progress: true,
-				history: true,
-				center: true,
-
-				theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
-				transition: Reveal.getQueryHash().transition || 'default', // default/cube/page/concave/zoom/linear/fade/none
-
-				// Parallax scrolling
-				// parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg',
-				// parallaxBackgroundSize: '2100px 900px',
-
-				// Optional libraries used to extend on reveal.js
-				dependencies: [
-					{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
-					{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-					{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-					{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
-					{ src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
-					{ src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
-				]
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/js/reveal.js b/docs/slides/IHP14/_support/reveal.js/js/reveal.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/js/reveal.js
+++ /dev/null
@@ -1,3382 +0,0 @@
-/*!
- * reveal.js
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
- */
-var Reveal = (function(){
-
-	'use strict';
-
-	var SLIDES_SELECTOR = '.reveal .slides section',
-		HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section',
-		VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section',
-		HOME_SLIDE_SELECTOR = '.reveal .slides>section:first-of-type',
-
-		// Configurations defaults, can be overridden at initialization time
-		config = {
-
-			// The "normal" size of the presentation, aspect ratio will be preserved
-			// when the presentation is scaled to fit different resolutions
-			width: 960,
-			height: 700,
-
-			// Factor of the display size that should remain empty around the content
-			margin: 0.1,
-
-			// Bounds for smallest/largest possible scale to apply to content
-			minScale: 0.2,
-			maxScale: 1.0,
-
-			// Display controls in the bottom right corner
-			controls: true,
-
-			// Display a presentation progress bar
-			progress: true,
-
-			// Display the page number of the current slide
-			slideNumber: false,
-
-			// Push each slide change to the browser history
-			history: false,
-
-			// Enable keyboard shortcuts for navigation
-			keyboard: true,
-
-			// Enable the slide overview mode
-			overview: true,
-
-			// Vertical centering of slides
-			center: true,
-
-			// Enables touch navigation on devices with touch input
-			touch: true,
-
-			// Loop the presentation
-			loop: false,
-
-			// Change the presentation direction to be RTL
-			rtl: false,
-
-			// Turns fragments on and off globally
-			fragments: true,
-
-			// Flags if the presentation is running in an embedded mode,
-			// i.e. contained within a limited portion of the screen
-			embedded: false,
-
-			// Number of milliseconds between automatically proceeding to the
-			// next slide, disabled when set to 0, this value can be overwritten
-			// by using a data-autoslide attribute on your slides
-			autoSlide: 0,
-
-			// Stop auto-sliding after user input
-			autoSlideStoppable: true,
-
-			// Enable slide navigation via mouse wheel
-			mouseWheel: false,
-
-			// Apply a 3D roll to links on hover
-			rollingLinks: false,
-
-			// Hides the address bar on mobile devices
-			hideAddressBar: true,
-
-			// Opens links in an iframe preview overlay
-			previewLinks: false,
-
-			// Focuses body when page changes visiblity to ensure keyboard shortcuts work
-			focusBodyOnPageVisiblityChange: true,
-
-			// Theme (see /css/theme)
-			theme: null,
-
-			// Transition style
-			transition: 'default', // default/cube/page/concave/zoom/linear/fade/none
-
-			// Transition speed
-			transitionSpeed: 'default', // default/fast/slow
-
-			// Transition style for full page slide backgrounds
-			backgroundTransition: 'default', // default/linear/none
-
-			// Parallax background image
-			parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg"
-
-			// Parallax background size
-			parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px"
-
-			// Number of slides away from the current that are visible
-			viewDistance: 3,
-
-			// Script dependencies to load
-			dependencies: []
-
-		},
-
-		// Flags if reveal.js is loaded (has dispatched the 'ready' event)
-		loaded = false,
-
-		// The horizontal and vertical index of the currently active slide
-		indexh,
-		indexv,
-
-		// The previous and current slide HTML elements
-		previousSlide,
-		currentSlide,
-
-		previousBackground,
-
-		// Slides may hold a data-state attribute which we pick up and apply
-		// as a class to the body. This list contains the combined state of
-		// all current slides.
-		state = [],
-
-		// The current scale of the presentation (see width/height config)
-		scale = 1,
-
-		// Cached references to DOM elements
-		dom = {},
-
-		// Features supported by the browser, see #checkCapabilities()
-		features = {},
-
-		// Client is a mobile device, see #checkCapabilities()
-		isMobileDevice,
-
-		// Throttles mouse wheel navigation
-		lastMouseWheelStep = 0,
-
-		// Delays updates to the URL due to a Chrome thumbnailer bug
-		writeURLTimeout = 0,
-
-		// A delay used to activate the overview mode
-		activateOverviewTimeout = 0,
-
-		// A delay used to deactivate the overview mode
-		deactivateOverviewTimeout = 0,
-
-		// Flags if the interaction event listeners are bound
-		eventsAreBound = false,
-
-		// The current auto-slide duration
-		autoSlide = 0,
-
-		// Auto slide properties
-		autoSlidePlayer,
-		autoSlideTimeout = 0,
-		autoSlideStartTime = -1,
-		autoSlidePaused = false,
-
-		// Holds information about the currently ongoing touch input
-		touch = {
-			startX: 0,
-			startY: 0,
-			startSpan: 0,
-			startCount: 0,
-			captured: false,
-			threshold: 40
-		};
-
-	/**
-	 * Starts up the presentation if the client is capable.
-	 */
-	function initialize( options ) {
-
-		checkCapabilities();
-
-		if( !features.transforms2d && !features.transforms3d ) {
-			document.body.setAttribute( 'class', 'no-transforms' );
-
-			// If the browser doesn't support core features we won't be
-			// using JavaScript to control the presentation
-			return;
-		}
-
-		// Force a layout when the whole page, incl fonts, has loaded
-		window.addEventListener( 'load', layout, false );
-
-		var query = Reveal.getQueryHash();
-
-		// Do not accept new dependencies via query config to avoid
-		// the potential of malicious script injection
-		if( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies'];
-
-		// Copy options over to our config object
-		extend( config, options );
-		extend( config, query );
-
-		// Hide the address bar in mobile browsers
-		hideAddressBar();
-
-		// Loads the dependencies and continues to #start() once done
-		load();
-
-	}
-
-	/**
-	 * Inspect the client to see what it's capable of, this
-	 * should only happens once per runtime.
-	 */
-	function checkCapabilities() {
-
-		features.transforms3d = 'WebkitPerspective' in document.body.style ||
-								'MozPerspective' in document.body.style ||
-								'msPerspective' in document.body.style ||
-								'OPerspective' in document.body.style ||
-								'perspective' in document.body.style;
-
-		features.transforms2d = 'WebkitTransform' in document.body.style ||
-								'MozTransform' in document.body.style ||
-								'msTransform' in document.body.style ||
-								'OTransform' in document.body.style ||
-								'transform' in document.body.style;
-
-		features.requestAnimationFrameMethod = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
-		features.requestAnimationFrame = typeof features.requestAnimationFrameMethod === 'function';
-
-		features.canvas = !!document.createElement( 'canvas' ).getContext;
-
-		isMobileDevice = navigator.userAgent.match( /(iphone|ipod|android)/gi );
-
-	}
-
-
-    /**
-     * Loads the dependencies of reveal.js. Dependencies are
-     * defined via the configuration option 'dependencies'
-     * and will be loaded prior to starting/binding reveal.js.
-     * Some dependencies may have an 'async' flag, if so they
-     * will load after reveal.js has been started up.
-     */
-	function load() {
-
-		var scripts = [],
-			scriptsAsync = [],
-			scriptsToPreload = 0;
-
-		// Called once synchronous scripts finish loading
-		function proceed() {
-			if( scriptsAsync.length ) {
-				// Load asynchronous scripts
-				head.js.apply( null, scriptsAsync );
-			}
-
-			start();
-		}
-
-		function loadScript( s ) {
-			head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], function() {
-				// Extension may contain callback functions
-				if( typeof s.callback === 'function' ) {
-					s.callback.apply( this );
-				}
-
-				if( --scriptsToPreload === 0 ) {
-					proceed();
-				}
-			});
-		}
-
-		for( var i = 0, len = config.dependencies.length; i < len; i++ ) {
-			var s = config.dependencies[i];
-
-			// Load if there's no condition or the condition is truthy
-			if( !s.condition || s.condition() ) {
-				if( s.async ) {
-					scriptsAsync.push( s.src );
-				}
-				else {
-					scripts.push( s.src );
-				}
-
-				loadScript( s );
-			}
-		}
-
-		if( scripts.length ) {
-			scriptsToPreload = scripts.length;
-
-			// Load synchronous scripts
-			head.js.apply( null, scripts );
-		}
-		else {
-			proceed();
-		}
-
-	}
-
-	/**
-	 * Starts up reveal.js by binding input events and navigating
-	 * to the current URL deeplink if there is one.
-	 */
-	function start() {
-
-		// Make sure we've got all the DOM elements we need
-		setupDOM();
-
-		// Resets all vertical slides so that only the first is visible
-		resetVerticalSlides();
-
-		// Updates the presentation to match the current configuration values
-		configure();
-
-		// Read the initial hash
-		readURL();
-
-		// Update all backgrounds
-		updateBackground( true );
-
-		// Notify listeners that the presentation is ready but use a 1ms
-		// timeout to ensure it's not fired synchronously after #initialize()
-		setTimeout( function() {
-			// Enable transitions now that we're loaded
-			dom.slides.classList.remove( 'no-transition' );
-
-			loaded = true;
-
-			dispatchEvent( 'ready', {
-				'indexh': indexh,
-				'indexv': indexv,
-				'currentSlide': currentSlide
-			} );
-		}, 1 );
-
-	}
-
-	/**
-	 * Finds and stores references to DOM elements which are
-	 * required by the presentation. If a required element is
-	 * not found, it is created.
-	 */
-	function setupDOM() {
-
-		// Cache references to key DOM elements
-		dom.theme = document.querySelector( '#theme' );
-		dom.wrapper = document.querySelector( '.reveal' );
-		dom.slides = document.querySelector( '.reveal .slides' );
-
-		// Prevent transitions while we're loading
-		dom.slides.classList.add( 'no-transition' );
-
-		// Background element
-		dom.background = createSingletonNode( dom.wrapper, 'div', 'backgrounds', null );
-
-		// Progress bar
-		dom.progress = createSingletonNode( dom.wrapper, 'div', 'progress', '<span></span>' );
-		dom.progressbar = dom.progress.querySelector( 'span' );
-
-		// Arrow controls
-		createSingletonNode( dom.wrapper, 'aside', 'controls',
-			'<div class="navigate-left"></div>' +
-			'<div class="navigate-right"></div>' +
-			'<div class="navigate-up"></div>' +
-			'<div class="navigate-down"></div>' );
-
-		// Slide number
-		dom.slideNumber = createSingletonNode( dom.wrapper, 'div', 'slide-number', '' );
-
-		// State background element [DEPRECATED]
-		createSingletonNode( dom.wrapper, 'div', 'state-background', null );
-
-		// Overlay graphic which is displayed during the paused mode
-		createSingletonNode( dom.wrapper, 'div', 'pause-overlay', null );
-
-		// Cache references to elements
-		dom.controls = document.querySelector( '.reveal .controls' );
-
-		// There can be multiple instances of controls throughout the page
-		dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) );
-		dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) );
-		dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) );
-		dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) );
-		dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) );
-		dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) );
-
-	}
-
-	/**
-	 * Creates an HTML element and returns a reference to it.
-	 * If the element already exists the existing instance will
-	 * be returned.
-	 */
-	function createSingletonNode( container, tagname, classname, innerHTML ) {
-
-		var node = container.querySelector( '.' + classname );
-		if( !node ) {
-			node = document.createElement( tagname );
-			node.classList.add( classname );
-			if( innerHTML !== null ) {
-				node.innerHTML = innerHTML;
-			}
-			container.appendChild( node );
-		}
-		return node;
-
-	}
-
-	/**
-	 * Creates the slide background elements and appends them
-	 * to the background container. One element is created per
-	 * slide no matter if the given slide has visible background.
-	 */
-	function createBackgrounds() {
-
-		if( isPrintingPDF() ) {
-			document.body.classList.add( 'print-pdf' );
-		}
-
-		// Clear prior backgrounds
-		dom.background.innerHTML = '';
-		dom.background.classList.add( 'no-transition' );
-
-		// Helper method for creating a background element for the
-		// given slide
-		function _createBackground( slide, container ) {
-
-			var data = {
-				background: slide.getAttribute( 'data-background' ),
-				backgroundSize: slide.getAttribute( 'data-background-size' ),
-				backgroundImage: slide.getAttribute( 'data-background-image' ),
-				backgroundColor: slide.getAttribute( 'data-background-color' ),
-				backgroundRepeat: slide.getAttribute( 'data-background-repeat' ),
-				backgroundPosition: slide.getAttribute( 'data-background-position' ),
-				backgroundTransition: slide.getAttribute( 'data-background-transition' )
-			};
-
-			var element = document.createElement( 'div' );
-			element.className = 'slide-background';
-
-			if( data.background ) {
-				// Auto-wrap image urls in url(...)
-				if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) {
-					element.style.backgroundImage = 'url('+ data.background +')';
-				}
-				else {
-					element.style.background = data.background;
-				}
-			}
-
-			if( data.background || data.backgroundColor || data.backgroundImage ) {
-				element.setAttribute( 'data-background-hash', data.background + data.backgroundSize + data.backgroundImage + data.backgroundColor + data.backgroundRepeat + data.backgroundPosition + data.backgroundTransition );
-			}
-
-			// Additional and optional background properties
-			if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize;
-			if( data.backgroundImage ) element.style.backgroundImage = 'url("' + data.backgroundImage + '")';
-			if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;
-			if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat;
-			if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition;
-			if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );
-
-			container.appendChild( element );
-
-			return element;
-
-		}
-
-		// Iterate over all horizontal slides
-		toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( slideh ) {
-
-			var backgroundStack;
-
-			if( isPrintingPDF() ) {
-				backgroundStack = _createBackground( slideh, slideh );
-			}
-			else {
-				backgroundStack = _createBackground( slideh, dom.background );
-			}
-
-			// Iterate over all vertical slides
-			toArray( slideh.querySelectorAll( 'section' ) ).forEach( function( slidev ) {
-
-				if( isPrintingPDF() ) {
-					_createBackground( slidev, slidev );
-				}
-				else {
-					_createBackground( slidev, backgroundStack );
-				}
-
-			} );
-
-		} );
-
-		// Add parallax background if specified
-		if( config.parallaxBackgroundImage ) {
-
-			dom.background.style.backgroundImage = 'url("' + config.parallaxBackgroundImage + '")';
-			dom.background.style.backgroundSize = config.parallaxBackgroundSize;
-
-			// Make sure the below properties are set on the element - these properties are
-			// needed for proper transitions to be set on the element via CSS. To remove
-			// annoying background slide-in effect when the presentation starts, apply
-			// these properties after short time delay
-			setTimeout( function() {
-				dom.wrapper.classList.add( 'has-parallax-background' );
-			}, 1 );
-
-		}
-		else {
-
-			dom.background.style.backgroundImage = '';
-			dom.wrapper.classList.remove( 'has-parallax-background' );
-
-		}
-
-	}
-
-	/**
-	 * Applies the configuration settings from the config
-	 * object. May be called multiple times.
-	 */
-	function configure( options ) {
-
-		var numberOfSlides = document.querySelectorAll( SLIDES_SELECTOR ).length;
-
-		dom.wrapper.classList.remove( config.transition );
-
-		// New config options may be passed when this method
-		// is invoked through the API after initialization
-		if( typeof options === 'object' ) extend( config, options );
-
-		// Force linear transition based on browser capabilities
-		if( features.transforms3d === false ) config.transition = 'linear';
-
-		dom.wrapper.classList.add( config.transition );
-
-		dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );
-		dom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition );
-
-		dom.controls.style.display = config.controls ? 'block' : 'none';
-		dom.progress.style.display = config.progress ? 'block' : 'none';
-
-		if( config.rtl ) {
-			dom.wrapper.classList.add( 'rtl' );
-		}
-		else {
-			dom.wrapper.classList.remove( 'rtl' );
-		}
-
-		if( config.center ) {
-			dom.wrapper.classList.add( 'center' );
-		}
-		else {
-			dom.wrapper.classList.remove( 'center' );
-		}
-
-		if( config.mouseWheel ) {
-			document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
-			document.addEventListener( 'mousewheel', onDocumentMouseScroll, false );
-		}
-		else {
-			document.removeEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
-			document.removeEventListener( 'mousewheel', onDocumentMouseScroll, false );
-		}
-
-		// Rolling 3D links
-		if( config.rollingLinks ) {
-			enableRollingLinks();
-		}
-		else {
-			disableRollingLinks();
-		}
-
-		// Iframe link previews
-		if( config.previewLinks ) {
-			enablePreviewLinks();
-		}
-		else {
-			disablePreviewLinks();
-			enablePreviewLinks( '[data-preview-link]' );
-		}
-
-		// Auto-slide playback controls
-		if( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable && features.canvas && features.requestAnimationFrame ) {
-			autoSlidePlayer = new Playback( dom.wrapper, function() {
-				return Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 );
-			} );
-
-			autoSlidePlayer.on( 'click', onAutoSlidePlayerClick );
-			autoSlidePaused = false;
-		}
-		else if( autoSlidePlayer ) {
-			autoSlidePlayer.destroy();
-			autoSlidePlayer = null;
-		}
-
-		// Load the theme in the config, if it's not already loaded
-		if( config.theme && dom.theme ) {
-			var themeURL = dom.theme.getAttribute( 'href' );
-			var themeFinder = /[^\/]*?(?=\.css)/;
-			var themeName = themeURL.match(themeFinder)[0];
-
-			if(  config.theme !== themeName ) {
-				themeURL = themeURL.replace(themeFinder, config.theme);
-				dom.theme.setAttribute( 'href', themeURL );
-			}
-		}
-
-		sync();
-
-	}
-
-	/**
-	 * Binds all event listeners.
-	 */
-	function addEventListeners() {
-
-		eventsAreBound = true;
-
-		window.addEventListener( 'hashchange', onWindowHashChange, false );
-		window.addEventListener( 'resize', onWindowResize, false );
-
-		if( config.touch ) {
-			dom.wrapper.addEventListener( 'touchstart', onTouchStart, false );
-			dom.wrapper.addEventListener( 'touchmove', onTouchMove, false );
-			dom.wrapper.addEventListener( 'touchend', onTouchEnd, false );
-
-			// Support pointer-style touch interaction as well
-			if( window.navigator.msPointerEnabled ) {
-				dom.wrapper.addEventListener( 'MSPointerDown', onPointerDown, false );
-				dom.wrapper.addEventListener( 'MSPointerMove', onPointerMove, false );
-				dom.wrapper.addEventListener( 'MSPointerUp', onPointerUp, false );
-			}
-		}
-
-		if( config.keyboard ) {
-			document.addEventListener( 'keydown', onDocumentKeyDown, false );
-		}
-
-		if( config.progress && dom.progress ) {
-			dom.progress.addEventListener( 'click', onProgressClicked, false );
-		}
-
-		if( config.focusBodyOnPageVisiblityChange ) {
-			var visibilityChange;
-
-			if( 'hidden' in document ) {
-				visibilityChange = 'visibilitychange';
-			}
-			else if( 'msHidden' in document ) {
-				visibilityChange = 'msvisibilitychange';
-			}
-			else if( 'webkitHidden' in document ) {
-				visibilityChange = 'webkitvisibilitychange';
-			}
-
-			if( visibilityChange ) {
-				document.addEventListener( visibilityChange, onPageVisibilityChange, false );
-			}
-		}
-
-		[ 'touchstart', 'click' ].forEach( function( eventName ) {
-			dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } );
-			dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } );
-			dom.controlsUp.forEach( function( el ) { el.addEventListener( eventName, onNavigateUpClicked, false ); } );
-			dom.controlsDown.forEach( function( el ) { el.addEventListener( eventName, onNavigateDownClicked, false ); } );
-			dom.controlsPrev.forEach( function( el ) { el.addEventListener( eventName, onNavigatePrevClicked, false ); } );
-			dom.controlsNext.forEach( function( el ) { el.addEventListener( eventName, onNavigateNextClicked, false ); } );
-		} );
-
-	}
-
-	/**
-	 * Unbinds all event listeners.
-	 */
-	function removeEventListeners() {
-
-		eventsAreBound = false;
-
-		document.removeEventListener( 'keydown', onDocumentKeyDown, false );
-		window.removeEventListener( 'hashchange', onWindowHashChange, false );
-		window.removeEventListener( 'resize', onWindowResize, false );
-
-		dom.wrapper.removeEventListener( 'touchstart', onTouchStart, false );
-		dom.wrapper.removeEventListener( 'touchmove', onTouchMove, false );
-		dom.wrapper.removeEventListener( 'touchend', onTouchEnd, false );
-
-		if( window.navigator.msPointerEnabled ) {
-			dom.wrapper.removeEventListener( 'MSPointerDown', onPointerDown, false );
-			dom.wrapper.removeEventListener( 'MSPointerMove', onPointerMove, false );
-			dom.wrapper.removeEventListener( 'MSPointerUp', onPointerUp, false );
-		}
-
-		if ( config.progress && dom.progress ) {
-			dom.progress.removeEventListener( 'click', onProgressClicked, false );
-		}
-
-		[ 'touchstart', 'click' ].forEach( function( eventName ) {
-			dom.controlsLeft.forEach( function( el ) { el.removeEventListener( eventName, onNavigateLeftClicked, false ); } );
-			dom.controlsRight.forEach( function( el ) { el.removeEventListener( eventName, onNavigateRightClicked, false ); } );
-			dom.controlsUp.forEach( function( el ) { el.removeEventListener( eventName, onNavigateUpClicked, false ); } );
-			dom.controlsDown.forEach( function( el ) { el.removeEventListener( eventName, onNavigateDownClicked, false ); } );
-			dom.controlsPrev.forEach( function( el ) { el.removeEventListener( eventName, onNavigatePrevClicked, false ); } );
-			dom.controlsNext.forEach( function( el ) { el.removeEventListener( eventName, onNavigateNextClicked, false ); } );
-		} );
-
-	}
-
-	/**
-	 * Extend object a with the properties of object b.
-	 * If there's a conflict, object b takes precedence.
-	 */
-	function extend( a, b ) {
-
-		for( var i in b ) {
-			a[ i ] = b[ i ];
-		}
-
-	}
-
-	/**
-	 * Converts the target object to an array.
-	 */
-	function toArray( o ) {
-
-		return Array.prototype.slice.call( o );
-
-	}
-
-	/**
-	 * Measures the distance in pixels between point a
-	 * and point b.
-	 *
-	 * @param {Object} a point with x/y properties
-	 * @param {Object} b point with x/y properties
-	 */
-	function distanceBetween( a, b ) {
-
-		var dx = a.x - b.x,
-			dy = a.y - b.y;
-
-		return Math.sqrt( dx*dx + dy*dy );
-
-	}
-
-	/**
-	 * Applies a CSS transform to the target element.
-	 */
-	function transformElement( element, transform ) {
-
-		element.style.WebkitTransform = transform;
-		element.style.MozTransform = transform;
-		element.style.msTransform = transform;
-		element.style.OTransform = transform;
-		element.style.transform = transform;
-
-	}
-
-	/**
-	 * Retrieves the height of the given element by looking
-	 * at the position and height of its immediate children.
-	 */
-	function getAbsoluteHeight( element ) {
-
-		var height = 0;
-
-		if( element ) {
-			var absoluteChildren = 0;
-
-			toArray( element.childNodes ).forEach( function( child ) {
-
-				if( typeof child.offsetTop === 'number' && child.style ) {
-					// Count # of abs children
-					if( child.style.position === 'absolute' ) {
-						absoluteChildren += 1;
-					}
-
-					height = Math.max( height, child.offsetTop + child.offsetHeight );
-				}
-
-			} );
-
-			// If there are no absolute children, use offsetHeight
-			if( absoluteChildren === 0 ) {
-				height = element.offsetHeight;
-			}
-
-		}
-
-		return height;
-
-	}
-
-	/**
-	 * Returns the remaining height within the parent of the
-	 * target element after subtracting the height of all
-	 * siblings.
-	 *
-	 * remaining height = [parent height] - [ siblings height]
-	 */
-	function getRemainingHeight( element, height ) {
-
-		height = height || 0;
-
-		if( element ) {
-			var parent = element.parentNode;
-			var siblings = parent.childNodes;
-
-			// Subtract the height of each sibling
-			toArray( siblings ).forEach( function( sibling ) {
-
-				if( typeof sibling.offsetHeight === 'number' && sibling !== element ) {
-
-					var styles = window.getComputedStyle( sibling ),
-						marginTop = parseInt( styles.marginTop, 10 ),
-						marginBottom = parseInt( styles.marginBottom, 10 );
-
-					height -= sibling.offsetHeight + marginTop + marginBottom;
-
-				}
-
-			} );
-
-			var elementStyles = window.getComputedStyle( element );
-
-			// Subtract the margins of the target element
-			height -= parseInt( elementStyles.marginTop, 10 ) +
-						parseInt( elementStyles.marginBottom, 10 );
-
-		}
-
-		return height;
-
-	}
-
-	/**
-	 * Checks if this instance is being used to print a PDF.
-	 */
-	function isPrintingPDF() {
-
-		return ( /print-pdf/gi ).test( window.location.search );
-
-	}
-
-	/**
-	 * Hides the address bar if we're on a mobile device.
-	 */
-	function hideAddressBar() {
-
-		if( config.hideAddressBar && isMobileDevice ) {
-			// Events that should trigger the address bar to hide
-			window.addEventListener( 'load', removeAddressBar, false );
-			window.addEventListener( 'orientationchange', removeAddressBar, false );
-		}
-
-	}
-
-	/**
-	 * Causes the address bar to hide on mobile devices,
-	 * more vertical space ftw.
-	 */
-	function removeAddressBar() {
-
-		setTimeout( function() {
-			window.scrollTo( 0, 1 );
-		}, 10 );
-
-	}
-
-	/**
-	 * Dispatches an event of the specified type from the
-	 * reveal DOM element.
-	 */
-	function dispatchEvent( type, properties ) {
-
-		var event = document.createEvent( "HTMLEvents", 1, 2 );
-		event.initEvent( type, true, true );
-		extend( event, properties );
-		dom.wrapper.dispatchEvent( event );
-
-	}
-
-	/**
-	 * Wrap all links in 3D goodness.
-	 */
-	function enableRollingLinks() {
-
-		if( features.transforms3d && !( 'msPerspective' in document.body.style ) ) {
-			var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' );
-
-			for( var i = 0, len = anchors.length; i < len; i++ ) {
-				var anchor = anchors[i];
-
-				if( anchor.textContent && !anchor.querySelector( '*' ) && ( !anchor.className || !anchor.classList.contains( anchor, 'roll' ) ) ) {
-					var span = document.createElement('span');
-					span.setAttribute('data-title', anchor.text);
-					span.innerHTML = anchor.innerHTML;
-
-					anchor.classList.add( 'roll' );
-					anchor.innerHTML = '';
-					anchor.appendChild(span);
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * Unwrap all 3D links.
-	 */
-	function disableRollingLinks() {
-
-		var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a.roll' );
-
-		for( var i = 0, len = anchors.length; i < len; i++ ) {
-			var anchor = anchors[i];
-			var span = anchor.querySelector( 'span' );
-
-			if( span ) {
-				anchor.classList.remove( 'roll' );
-				anchor.innerHTML = span.innerHTML;
-			}
-		}
-
-	}
-
-	/**
-	 * Bind preview frame links.
-	 */
-	function enablePreviewLinks( selector ) {
-
-		var anchors = toArray( document.querySelectorAll( selector ? selector : 'a' ) );
-
-		anchors.forEach( function( element ) {
-			if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) {
-				element.addEventListener( 'click', onPreviewLinkClicked, false );
-			}
-		} );
-
-	}
-
-	/**
-	 * Unbind preview frame links.
-	 */
-	function disablePreviewLinks() {
-
-		var anchors = toArray( document.querySelectorAll( 'a' ) );
-
-		anchors.forEach( function( element ) {
-			if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) {
-				element.removeEventListener( 'click', onPreviewLinkClicked, false );
-			}
-		} );
-
-	}
-
-	/**
-	 * Opens a preview window for the target URL.
-	 */
-	function openPreview( url ) {
-
-		closePreview();
-
-		dom.preview = document.createElement( 'div' );
-		dom.preview.classList.add( 'preview-link-overlay' );
-		dom.wrapper.appendChild( dom.preview );
-
-		dom.preview.innerHTML = [
-			'<header>',
-				'<a class="close" href="#"><span class="icon"></span></a>',
-				'<a class="external" href="'+ url +'" target="_blank"><span class="icon"></span></a>',
-			'</header>',
-			'<div class="spinner"></div>',
-			'<div class="viewport">',
-				'<iframe src="'+ url +'"></iframe>',
-			'</div>'
-		].join('');
-
-		dom.preview.querySelector( 'iframe' ).addEventListener( 'load', function( event ) {
-			dom.preview.classList.add( 'loaded' );
-		}, false );
-
-		dom.preview.querySelector( '.close' ).addEventListener( 'click', function( event ) {
-			closePreview();
-			event.preventDefault();
-		}, false );
-
-		dom.preview.querySelector( '.external' ).addEventListener( 'click', function( event ) {
-			closePreview();
-		}, false );
-
-		setTimeout( function() {
-			dom.preview.classList.add( 'visible' );
-		}, 1 );
-
-	}
-
-	/**
-	 * Closes the iframe preview window.
-	 */
-	function closePreview() {
-
-		if( dom.preview ) {
-			dom.preview.setAttribute( 'src', '' );
-			dom.preview.parentNode.removeChild( dom.preview );
-			dom.preview = null;
-		}
-
-	}
-
-	/**
-	 * Applies JavaScript-controlled layout rules to the
-	 * presentation.
-	 */
-	function layout() {
-
-		if( dom.wrapper && !isPrintingPDF() ) {
-
-			// Available space to scale within
-			var availableWidth = dom.wrapper.offsetWidth,
-				availableHeight = dom.wrapper.offsetHeight;
-
-			// Reduce available space by margin
-			availableWidth -= ( availableHeight * config.margin );
-			availableHeight -= ( availableHeight * config.margin );
-
-			// Dimensions of the content
-			var slideWidth = config.width,
-				slideHeight = config.height,
-				slidePadding = 20; // TODO Dig this out of DOM
-
-			// Layout the contents of the slides
-			layoutSlideContents( config.width, config.height, slidePadding );
-
-			// Slide width may be a percentage of available width
-			if( typeof slideWidth === 'string' && /%$/.test( slideWidth ) ) {
-				slideWidth = parseInt( slideWidth, 10 ) / 100 * availableWidth;
-			}
-
-			// Slide height may be a percentage of available height
-			if( typeof slideHeight === 'string' && /%$/.test( slideHeight ) ) {
-				slideHeight = parseInt( slideHeight, 10 ) / 100 * availableHeight;
-			}
-
-			dom.slides.style.width = slideWidth + 'px';
-			dom.slides.style.height = slideHeight + 'px';
-
-			// Determine scale of content to fit within available space
-			scale = Math.min( availableWidth / slideWidth, availableHeight / slideHeight );
-
-			// Respect max/min scale settings
-			scale = Math.max( scale, config.minScale );
-			scale = Math.min( scale, config.maxScale );
-
-			// Prefer applying scale via zoom since Chrome blurs scaled content
-			// with nested transforms
-			if( typeof dom.slides.style.zoom !== 'undefined' && !navigator.userAgent.match( /(iphone|ipod|ipad|android)/gi ) ) {
-				dom.slides.style.zoom = scale;
-			}
-			// Apply scale transform as a fallback
-			else {
-				transformElement( dom.slides, 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)' );
-			}
-
-			// Select all slides, vertical and horizontal
-			var slides = toArray( document.querySelectorAll( SLIDES_SELECTOR ) );
-
-			for( var i = 0, len = slides.length; i < len; i++ ) {
-				var slide = slides[ i ];
-
-				// Don't bother updating invisible slides
-				if( slide.style.display === 'none' ) {
-					continue;
-				}
-
-				if( config.center || slide.classList.contains( 'center' ) ) {
-					// Vertical stacks are not centred since their section
-					// children will be
-					if( slide.classList.contains( 'stack' ) ) {
-						slide.style.top = 0;
-					}
-					else {
-						slide.style.top = Math.max( - ( getAbsoluteHeight( slide ) / 2 ) - slidePadding, -slideHeight / 2 ) + 'px';
-					}
-				}
-				else {
-					slide.style.top = '';
-				}
-
-			}
-
-			updateProgress();
-			updateParallax();
-
-		}
-
-	}
-
-	/**
-	 * Applies layout logic to the contents of all slides in
-	 * the presentation.
-	 */
-	function layoutSlideContents( width, height, padding ) {
-
-		// Handle sizing of elements with the 'stretch' class
-		toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) {
-
-			// Determine how much vertical space we can use
-			var remainingHeight = getRemainingHeight( element, ( height - ( padding * 2 ) ) );
-
-			// Consider the aspect ratio of media elements
-			if( /(img|video)/gi.test( element.nodeName ) ) {
-				var nw = element.naturalWidth || element.videoWidth,
-					nh = element.naturalHeight || element.videoHeight;
-
-				var es = Math.min( width / nw, remainingHeight / nh );
-
-				element.style.width = ( nw * es ) + 'px';
-				element.style.height = ( nh * es ) + 'px';
-
-			}
-			else {
-				element.style.width = width + 'px';
-				element.style.height = remainingHeight + 'px';
-			}
-
-		} );
-
-	}
-
-	/**
-	 * Stores the vertical index of a stack so that the same
-	 * vertical slide can be selected when navigating to and
-	 * from the stack.
-	 *
-	 * @param {HTMLElement} stack The vertical stack element
-	 * @param {int} v Index to memorize
-	 */
-	function setPreviousVerticalIndex( stack, v ) {
-
-		if( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) {
-			stack.setAttribute( 'data-previous-indexv', v || 0 );
-		}
-
-	}
-
-	/**
-	 * Retrieves the vertical index which was stored using
-	 * #setPreviousVerticalIndex() or 0 if no previous index
-	 * exists.
-	 *
-	 * @param {HTMLElement} stack The vertical stack element
-	 */
-	function getPreviousVerticalIndex( stack ) {
-
-		if( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) {
-			// Prefer manually defined start-indexv
-			var attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv';
-
-			return parseInt( stack.getAttribute( attributeName ) || 0, 10 );
-		}
-
-		return 0;
-
-	}
-
-	/**
-	 * Displays the overview of slides (quick nav) by
-	 * scaling down and arranging all slide elements.
-	 *
-	 * Experimental feature, might be dropped if perf
-	 * can't be improved.
-	 */
-	function activateOverview() {
-
-		// Only proceed if enabled in config
-		if( config.overview ) {
-
-			// Don't auto-slide while in overview mode
-			cancelAutoSlide();
-
-			var wasActive = dom.wrapper.classList.contains( 'overview' );
-
-			// Vary the depth of the overview based on screen size
-			var depth = window.innerWidth < 400 ? 1000 : 2500;
-
-			dom.wrapper.classList.add( 'overview' );
-			dom.wrapper.classList.remove( 'overview-deactivating' );
-
-			clearTimeout( activateOverviewTimeout );
-			clearTimeout( deactivateOverviewTimeout );
-
-			// Not the pretties solution, but need to let the overview
-			// class apply first so that slides are measured accurately
-			// before we can position them
-			activateOverviewTimeout = setTimeout( function() {
-
-				var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-
-				for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) {
-					var hslide = horizontalSlides[i],
-						hoffset = config.rtl ? -105 : 105;
-
-					hslide.setAttribute( 'data-index-h', i );
-
-					// Apply CSS transform
-					transformElement( hslide, 'translateZ(-'+ depth +'px) translate(' + ( ( i - indexh ) * hoffset ) + '%, 0%)' );
-
-					if( hslide.classList.contains( 'stack' ) ) {
-
-						var verticalSlides = hslide.querySelectorAll( 'section' );
-
-						for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) {
-							var verticalIndex = i === indexh ? indexv : getPreviousVerticalIndex( hslide );
-
-							var vslide = verticalSlides[j];
-
-							vslide.setAttribute( 'data-index-h', i );
-							vslide.setAttribute( 'data-index-v', j );
-
-							// Apply CSS transform
-							transformElement( vslide, 'translate(0%, ' + ( ( j - verticalIndex ) * 105 ) + '%)' );
-
-							// Navigate to this slide on click
-							vslide.addEventListener( 'click', onOverviewSlideClicked, true );
-						}
-
-					}
-					else {
-
-						// Navigate to this slide on click
-						hslide.addEventListener( 'click', onOverviewSlideClicked, true );
-
-					}
-				}
-
-				updateSlidesVisibility();
-
-				layout();
-
-				if( !wasActive ) {
-					// Notify observers of the overview showing
-					dispatchEvent( 'overviewshown', {
-						'indexh': indexh,
-						'indexv': indexv,
-						'currentSlide': currentSlide
-					} );
-				}
-
-			}, 10 );
-
-		}
-
-	}
-
-	/**
-	 * Exits the slide overview and enters the currently
-	 * active slide.
-	 */
-	function deactivateOverview() {
-
-		// Only proceed if enabled in config
-		if( config.overview ) {
-
-			clearTimeout( activateOverviewTimeout );
-			clearTimeout( deactivateOverviewTimeout );
-
-			dom.wrapper.classList.remove( 'overview' );
-
-			// Temporarily add a class so that transitions can do different things
-			// depending on whether they are exiting/entering overview, or just
-			// moving from slide to slide
-			dom.wrapper.classList.add( 'overview-deactivating' );
-
-			deactivateOverviewTimeout = setTimeout( function () {
-				dom.wrapper.classList.remove( 'overview-deactivating' );
-			}, 1 );
-
-			// Select all slides
-			toArray( document.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) {
-				// Resets all transforms to use the external styles
-				transformElement( slide, '' );
-
-				slide.removeEventListener( 'click', onOverviewSlideClicked, true );
-			} );
-
-			slide( indexh, indexv );
-
-			cueAutoSlide();
-
-			// Notify observers of the overview hiding
-			dispatchEvent( 'overviewhidden', {
-				'indexh': indexh,
-				'indexv': indexv,
-				'currentSlide': currentSlide
-			} );
-
-		}
-	}
-
-	/**
-	 * Toggles the slide overview mode on and off.
-	 *
-	 * @param {Boolean} override Optional flag which overrides the
-	 * toggle logic and forcibly sets the desired state. True means
-	 * overview is open, false means it's closed.
-	 */
-	function toggleOverview( override ) {
-
-		if( typeof override === 'boolean' ) {
-			override ? activateOverview() : deactivateOverview();
-		}
-		else {
-			isOverview() ? deactivateOverview() : activateOverview();
-		}
-
-	}
-
-	/**
-	 * Checks if the overview is currently active.
-	 *
-	 * @return {Boolean} true if the overview is active,
-	 * false otherwise
-	 */
-	function isOverview() {
-
-		return dom.wrapper.classList.contains( 'overview' );
-
-	}
-
-	/**
-	 * Checks if the current or specified slide is vertical
-	 * (nested within another slide).
-	 *
-	 * @param {HTMLElement} slide [optional] The slide to check
-	 * orientation of
-	 */
-	function isVerticalSlide( slide ) {
-
-		// Prefer slide argument, otherwise use current slide
-		slide = slide ? slide : currentSlide;
-
-		return slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i );
-
-	}
-
-	/**
-	 * Handling the fullscreen functionality via the fullscreen API
-	 *
-	 * @see http://fullscreen.spec.whatwg.org/
-	 * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode
-	 */
-	function enterFullscreen() {
-
-		var element = document.body;
-
-		// Check which implementation is available
-		var requestMethod = element.requestFullScreen ||
-							element.webkitRequestFullscreen ||
-							element.webkitRequestFullScreen ||
-							element.mozRequestFullScreen ||
-							element.msRequestFullScreen;
-
-		if( requestMethod ) {
-			requestMethod.apply( element );
-		}
-
-	}
-
-	/**
-	 * Enters the paused mode which fades everything on screen to
-	 * black.
-	 */
-	function pause() {
-
-		var wasPaused = dom.wrapper.classList.contains( 'paused' );
-
-		cancelAutoSlide();
-		dom.wrapper.classList.add( 'paused' );
-
-		if( wasPaused === false ) {
-			dispatchEvent( 'paused' );
-		}
-
-	}
-
-	/**
-	 * Exits from the paused mode.
-	 */
-	function resume() {
-
-		var wasPaused = dom.wrapper.classList.contains( 'paused' );
-		dom.wrapper.classList.remove( 'paused' );
-
-		cueAutoSlide();
-
-		if( wasPaused ) {
-			dispatchEvent( 'resumed' );
-		}
-
-	}
-
-	/**
-	 * Toggles the paused mode on and off.
-	 */
-	function togglePause() {
-
-		if( isPaused() ) {
-			resume();
-		}
-		else {
-			pause();
-		}
-
-	}
-
-	/**
-	 * Checks if we are currently in the paused mode.
-	 */
-	function isPaused() {
-
-		return dom.wrapper.classList.contains( 'paused' );
-
-	}
-
-	/**
-	 * Steps from the current point in the presentation to the
-	 * slide which matches the specified horizontal and vertical
-	 * indices.
-	 *
-	 * @param {int} h Horizontal index of the target slide
-	 * @param {int} v Vertical index of the target slide
-	 * @param {int} f Optional index of a fragment within the
-	 * target slide to activate
-	 * @param {int} o Optional origin for use in multimaster environments
-	 */
-	function slide( h, v, f, o ) {
-
-		// Remember where we were at before
-		previousSlide = currentSlide;
-
-		// Query all horizontal slides in the deck
-		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-
-		// If no vertical index is specified and the upcoming slide is a
-		// stack, resume at its previous vertical index
-		if( v === undefined ) {
-			v = getPreviousVerticalIndex( horizontalSlides[ h ] );
-		}
-
-		// If we were on a vertical stack, remember what vertical index
-		// it was on so we can resume at the same position when returning
-		if( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) {
-			setPreviousVerticalIndex( previousSlide.parentNode, indexv );
-		}
-
-		// Remember the state before this slide
-		var stateBefore = state.concat();
-
-		// Reset the state array
-		state.length = 0;
-
-		var indexhBefore = indexh || 0,
-			indexvBefore = indexv || 0;
-
-		// Activate and transition to the new slide
-		indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );
-		indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );
-
-		// Update the visibility of slides now that the indices have changed
-		updateSlidesVisibility();
-
-		layout();
-
-		// Apply the new state
-		stateLoop: for( var i = 0, len = state.length; i < len; i++ ) {
-			// Check if this state existed on the previous slide. If it
-			// did, we will avoid adding it repeatedly
-			for( var j = 0; j < stateBefore.length; j++ ) {
-				if( stateBefore[j] === state[i] ) {
-					stateBefore.splice( j, 1 );
-					continue stateLoop;
-				}
-			}
-
-			document.documentElement.classList.add( state[i] );
-
-			// Dispatch custom event matching the state's name
-			dispatchEvent( state[i] );
-		}
-
-		// Clean up the remains of the previous state
-		while( stateBefore.length ) {
-			document.documentElement.classList.remove( stateBefore.pop() );
-		}
-
-		// If the overview is active, re-activate it to update positions
-		if( isOverview() ) {
-			activateOverview();
-		}
-
-		// Find the current horizontal slide and any possible vertical slides
-		// within it
-		var currentHorizontalSlide = horizontalSlides[ indexh ],
-			currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );
-
-		// Store references to the previous and current slides
-		currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;
-
-		// Show fragment, if specified
-		if( typeof f !== 'undefined' ) {
-			navigateFragment( f );
-		}
-
-		// Dispatch an event if the slide changed
-		var slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore );
-		if( slideChanged ) {
-			dispatchEvent( 'slidechanged', {
-				'indexh': indexh,
-				'indexv': indexv,
-				'previousSlide': previousSlide,
-				'currentSlide': currentSlide,
-				'origin': o
-			} );
-		}
-		else {
-			// Ensure that the previous slide is never the same as the current
-			previousSlide = null;
-		}
-
-		// Solves an edge case where the previous slide maintains the
-		// 'present' class when navigating between adjacent vertical
-		// stacks
-		if( previousSlide ) {
-			previousSlide.classList.remove( 'present' );
-
-			// Reset all slides upon navigate to home
-			// Issue: #285
-			if ( document.querySelector( HOME_SLIDE_SELECTOR ).classList.contains( 'present' ) ) {
-				// Launch async task
-				setTimeout( function () {
-					var slides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.stack') ), i;
-					for( i in slides ) {
-						if( slides[i] ) {
-							// Reset stack
-							setPreviousVerticalIndex( slides[i], 0 );
-						}
-					}
-				}, 0 );
-			}
-		}
-
-		// Handle embedded content
-		if( slideChanged ) {
-			stopEmbeddedContent( previousSlide );
-			startEmbeddedContent( currentSlide );
-		}
-
-		updateControls();
-		updateProgress();
-		updateBackground();
-		updateParallax();
-		updateSlideNumber();
-
-		// Update the URL hash
-		writeURL();
-
-		cueAutoSlide();
-
-	}
-
-	/**
-	 * Syncs the presentation with the current DOM. Useful
-	 * when new slides or control elements are added or when
-	 * the configuration has changed.
-	 */
-	function sync() {
-
-		// Subscribe to input
-		removeEventListeners();
-		addEventListeners();
-
-		// Force a layout to make sure the current config is accounted for
-		layout();
-
-		// Reflect the current autoSlide value
-		autoSlide = config.autoSlide;
-
-		// Start auto-sliding if it's enabled
-		cueAutoSlide();
-
-		// Re-create the slide backgrounds
-		createBackgrounds();
-
-		sortAllFragments();
-
-		updateControls();
-		updateProgress();
-		updateBackground( true );
-		updateSlideNumber();
-
-	}
-
-	/**
-	 * Resets all vertical slides so that only the first
-	 * is visible.
-	 */
-	function resetVerticalSlides() {
-
-		var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-		horizontalSlides.forEach( function( horizontalSlide ) {
-
-			var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) );
-			verticalSlides.forEach( function( verticalSlide, y ) {
-
-				if( y > 0 ) {
-					verticalSlide.classList.remove( 'present' );
-					verticalSlide.classList.remove( 'past' );
-					verticalSlide.classList.add( 'future' );
-				}
-
-			} );
-
-		} );
-
-	}
-
-	/**
-	 * Sorts and formats all of fragments in the
-	 * presentation.
-	 */
-	function sortAllFragments() {
-
-		var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-		horizontalSlides.forEach( function( horizontalSlide ) {
-
-			var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) );
-			verticalSlides.forEach( function( verticalSlide, y ) {
-
-				sortFragments( verticalSlide.querySelectorAll( '.fragment' ) );
-
-			} );
-
-			if( verticalSlides.length === 0 ) sortFragments( horizontalSlide.querySelectorAll( '.fragment' ) );
-
-		} );
-
-	}
-
-	/**
-	 * Updates one dimension of slides by showing the slide
-	 * with the specified index.
-	 *
-	 * @param {String} selector A CSS selector that will fetch
-	 * the group of slides we are working with
-	 * @param {Number} index The index of the slide that should be
-	 * shown
-	 *
-	 * @return {Number} The index of the slide that is now shown,
-	 * might differ from the passed in index if it was out of
-	 * bounds.
-	 */
-	function updateSlides( selector, index ) {
-
-		// Select all slides and convert the NodeList result to
-		// an array
-		var slides = toArray( document.querySelectorAll( selector ) ),
-			slidesLength = slides.length;
-
-		if( slidesLength ) {
-
-			// Should the index loop?
-			if( config.loop ) {
-				index %= slidesLength;
-
-				if( index < 0 ) {
-					index = slidesLength + index;
-				}
-			}
-
-			// Enforce max and minimum index bounds
-			index = Math.max( Math.min( index, slidesLength - 1 ), 0 );
-
-			for( var i = 0; i < slidesLength; i++ ) {
-				var element = slides[i];
-
-				var reverse = config.rtl && !isVerticalSlide( element );
-
-				element.classList.remove( 'past' );
-				element.classList.remove( 'present' );
-				element.classList.remove( 'future' );
-
-				// http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute
-				element.setAttribute( 'hidden', '' );
-
-				if( i < index ) {
-					// Any element previous to index is given the 'past' class
-					element.classList.add( reverse ? 'future' : 'past' );
-
-					var pastFragments = toArray( element.querySelectorAll( '.fragment' ) );
-
-					// Show all fragments on prior slides
-					while( pastFragments.length ) {
-						var pastFragment = pastFragments.pop();
-						pastFragment.classList.add( 'visible' );
-						pastFragment.classList.remove( 'current-fragment' );
-					}
-				}
-				else if( i > index ) {
-					// Any element subsequent to index is given the 'future' class
-					element.classList.add( reverse ? 'past' : 'future' );
-
-					var futureFragments = toArray( element.querySelectorAll( '.fragment.visible' ) );
-
-					// No fragments in future slides should be visible ahead of time
-					while( futureFragments.length ) {
-						var futureFragment = futureFragments.pop();
-						futureFragment.classList.remove( 'visible' );
-						futureFragment.classList.remove( 'current-fragment' );
-					}
-				}
-
-				// If this element contains vertical slides
-				if( element.querySelector( 'section' ) ) {
-					element.classList.add( 'stack' );
-				}
-			}
-
-			// Mark the current slide as present
-			slides[index].classList.add( 'present' );
-			slides[index].removeAttribute( 'hidden' );
-
-			// If this slide has a state associated with it, add it
-			// onto the current state of the deck
-			var slideState = slides[index].getAttribute( 'data-state' );
-			if( slideState ) {
-				state = state.concat( slideState.split( ' ' ) );
-			}
-
-		}
-		else {
-			// Since there are no slides we can't be anywhere beyond the
-			// zeroth index
-			index = 0;
-		}
-
-		return index;
-
-	}
-
-	/**
-	 * Optimization method; hide all slides that are far away
-	 * from the present slide.
-	 */
-	function updateSlidesVisibility() {
-
-		// Select all slides and convert the NodeList result to
-		// an array
-		var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ),
-			horizontalSlidesLength = horizontalSlides.length,
-			distanceX,
-			distanceY;
-
-		if( horizontalSlidesLength ) {
-
-			// The number of steps away from the present slide that will
-			// be visible
-			var viewDistance = isOverview() ? 10 : config.viewDistance;
-
-			// Limit view distance on weaker devices
-			if( isMobileDevice ) {
-				viewDistance = isOverview() ? 6 : 1;
-			}
-
-			for( var x = 0; x < horizontalSlidesLength; x++ ) {
-				var horizontalSlide = horizontalSlides[x];
-
-				var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ),
-					verticalSlidesLength = verticalSlides.length;
-
-				// Loops so that it measures 1 between the first and last slides
-				distanceX = Math.abs( ( indexh - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0;
-
-				// Show the horizontal slide if it's within the view distance
-				horizontalSlide.style.display = distanceX > viewDistance ? 'none' : 'block';
-
-				if( verticalSlidesLength ) {
-
-					var oy = getPreviousVerticalIndex( horizontalSlide );
-
-					for( var y = 0; y < verticalSlidesLength; y++ ) {
-						var verticalSlide = verticalSlides[y];
-
-						distanceY = x === indexh ? Math.abs( indexv - y ) : Math.abs( y - oy );
-
-						verticalSlide.style.display = ( distanceX + distanceY ) > viewDistance ? 'none' : 'block';
-					}
-
-				}
-			}
-
-		}
-
-	}
-
-	/**
-	 * Updates the progress bar to reflect the current slide.
-	 */
-	function updateProgress() {
-
-		// Update progress if enabled
-		if( config.progress && dom.progress ) {
-
-			var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-
-			// The number of past and total slides
-			var totalCount = document.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length;
-			var pastCount = 0;
-
-			// Step through all slides and count the past ones
-			mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) {
-
-				var horizontalSlide = horizontalSlides[i];
-				var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) );
-
-				for( var j = 0; j < verticalSlides.length; j++ ) {
-
-					// Stop as soon as we arrive at the present
-					if( verticalSlides[j].classList.contains( 'present' ) ) {
-						break mainLoop;
-					}
-
-					pastCount++;
-
-				}
-
-				// Stop as soon as we arrive at the present
-				if( horizontalSlide.classList.contains( 'present' ) ) {
-					break;
-				}
-
-				// Don't count the wrapping section for vertical slides
-				if( horizontalSlide.classList.contains( 'stack' ) === false ) {
-					pastCount++;
-				}
-
-			}
-
-			dom.progressbar.style.width = ( pastCount / ( totalCount - 1 ) ) * window.innerWidth + 'px';
-
-		}
-
-	}
-
-	/**
-	 * Updates the slide number div to reflect the current slide.
-	 */
-	function updateSlideNumber() {
-
-		// Update slide number if enabled
-		if( config.slideNumber && dom.slideNumber) {
-
-			// Display the number of the page using 'indexh - indexv' format
-			var indexString = indexh;
-			if( indexv > 0 ) {
-				indexString += ' - ' + indexv;
-			}
-
-			dom.slideNumber.innerHTML = indexString;
-		}
-
-	}
-
-	/**
-	 * Updates the state of all control/navigation arrows.
-	 */
-	function updateControls() {
-
-		var routes = availableRoutes();
-		var fragments = availableFragments();
-
-		// Remove the 'enabled' class from all directions
-		dom.controlsLeft.concat( dom.controlsRight )
-						.concat( dom.controlsUp )
-						.concat( dom.controlsDown )
-						.concat( dom.controlsPrev )
-						.concat( dom.controlsNext ).forEach( function( node ) {
-			node.classList.remove( 'enabled' );
-			node.classList.remove( 'fragmented' );
-		} );
-
-		// Add the 'enabled' class to the available routes
-		if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' );	} );
-		if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } );
-		if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' );	} );
-		if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } );
-
-		// Prev/next buttons
-		if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } );
-		if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } );
-
-		// Highlight fragment directions
-		if( currentSlide ) {
-
-			// Always apply fragment decorator to prev/next buttons
-			if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-			if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-
-			// Apply fragment decorators to directional buttons based on
-			// what slide axis they are in
-			if( isVerticalSlide( currentSlide ) ) {
-				if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-				if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-			}
-			else {
-				if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-				if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } );
-			}
-
-		}
-
-	}
-
-	/**
-	 * Updates the background elements to reflect the current
-	 * slide.
-	 *
-	 * @param {Boolean} includeAll If true, the backgrounds of
-	 * all vertical slides (not just the present) will be updated.
-	 */
-	function updateBackground( includeAll ) {
-
-		var currentBackground = null;
-
-		// Reverse past/future classes when in RTL mode
-		var horizontalPast = config.rtl ? 'future' : 'past',
-			horizontalFuture = config.rtl ? 'past' : 'future';
-
-		// Update the classes of all backgrounds to match the
-		// states of their slides (past/present/future)
-		toArray( dom.background.childNodes ).forEach( function( backgroundh, h ) {
-
-			if( h < indexh ) {
-				backgroundh.className = 'slide-background ' + horizontalPast;
-			}
-			else if ( h > indexh ) {
-				backgroundh.className = 'slide-background ' + horizontalFuture;
-			}
-			else {
-				backgroundh.className = 'slide-background present';
-
-				// Store a reference to the current background element
-				currentBackground = backgroundh;
-			}
-
-			if( includeAll || h === indexh ) {
-				toArray( backgroundh.childNodes ).forEach( function( backgroundv, v ) {
-
-					if( v < indexv ) {
-						backgroundv.className = 'slide-background past';
-					}
-					else if ( v > indexv ) {
-						backgroundv.className = 'slide-background future';
-					}
-					else {
-						backgroundv.className = 'slide-background present';
-
-						// Only if this is the present horizontal and vertical slide
-						if( h === indexh ) currentBackground = backgroundv;
-					}
-
-				} );
-			}
-
-		} );
-
-		// Don't transition between identical backgrounds. This
-		// prevents unwanted flicker.
-		if( currentBackground ) {
-			var previousBackgroundHash = previousBackground ? previousBackground.getAttribute( 'data-background-hash' ) : null;
-			var currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' );
-			if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== previousBackground ) {
-				dom.background.classList.add( 'no-transition' );
-			}
-
-			previousBackground = currentBackground;
-		}
-
-		// Allow the first background to apply without transition
-		setTimeout( function() {
-			dom.background.classList.remove( 'no-transition' );
-		}, 1 );
-
-	}
-
-	/**
-	 * Updates the position of the parallax background based
-	 * on the current slide index.
-	 */
-	function updateParallax() {
-
-		if( config.parallaxBackgroundImage ) {
-
-			var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),
-				verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR );
-
-			var backgroundSize = dom.background.style.backgroundSize.split( ' ' ),
-				backgroundWidth, backgroundHeight;
-
-			if( backgroundSize.length === 1 ) {
-				backgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 );
-			}
-			else {
-				backgroundWidth = parseInt( backgroundSize[0], 10 );
-				backgroundHeight = parseInt( backgroundSize[1], 10 );
-			}
-
-			var slideWidth = dom.background.offsetWidth;
-			var horizontalSlideCount = horizontalSlides.length;
-			var horizontalOffset = -( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) * indexh;
-
-			var slideHeight = dom.background.offsetHeight;
-			var verticalSlideCount = verticalSlides.length;
-			var verticalOffset = verticalSlideCount > 0 ? -( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ) * indexv : 0;
-
-			dom.background.style.backgroundPosition = horizontalOffset + 'px ' + verticalOffset + 'px';
-
-		}
-
-	}
-
-	/**
-	 * Determine what available routes there are for navigation.
-	 *
-	 * @return {Object} containing four booleans: left/right/up/down
-	 */
-	function availableRoutes() {
-
-		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),
-			verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR );
-
-		var routes = {
-			left: indexh > 0 || config.loop,
-			right: indexh < horizontalSlides.length - 1 || config.loop,
-			up: indexv > 0,
-			down: indexv < verticalSlides.length - 1
-		};
-
-		// reverse horizontal controls for rtl
-		if( config.rtl ) {
-			var left = routes.left;
-			routes.left = routes.right;
-			routes.right = left;
-		}
-
-		return routes;
-
-	}
-
-	/**
-	 * Returns an object describing the available fragment
-	 * directions.
-	 *
-	 * @return {Object} two boolean properties: prev/next
-	 */
-	function availableFragments() {
-
-		if( currentSlide && config.fragments ) {
-			var fragments = currentSlide.querySelectorAll( '.fragment' );
-			var hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.visible)' );
-
-			return {
-				prev: fragments.length - hiddenFragments.length > 0,
-				next: !!hiddenFragments.length
-			};
-		}
-		else {
-			return { prev: false, next: false };
-		}
-
-	}
-
-	/**
-	 * Start playback of any embedded content inside of
-	 * the targeted slide.
-	 */
-	function startEmbeddedContent( slide ) {
-
-		if( slide && !isSpeakerNotes() ) {
-			// HTML5 media elements
-			toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) {
-				if( el.hasAttribute( 'data-autoplay' ) ) {
-					el.play();
-				}
-			} );
-
-			// iframe embeds
-			toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) {
-				el.contentWindow.postMessage( 'slide:start', '*' );
-			});
-
-			// YouTube embeds
-			toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) {
-				if( el.hasAttribute( 'data-autoplay' ) ) {
-					el.contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' );
-				}
-			});
-		}
-
-	}
-
-	/**
-	 * Stop playback of any embedded content inside of
-	 * the targeted slide.
-	 */
-	function stopEmbeddedContent( slide ) {
-
-		if( slide ) {
-			// HTML5 media elements
-			toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) {
-				if( !el.hasAttribute( 'data-ignore' ) ) {
-					el.pause();
-				}
-			} );
-
-			// iframe embeds
-			toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) {
-				el.contentWindow.postMessage( 'slide:stop', '*' );
-			});
-
-			// YouTube embeds
-			toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) {
-				if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) {
-					el.contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' );
-				}
-			});
-		}
-
-	}
-
-	/**
-	 * Checks if this presentation is running inside of the
-	 * speaker notes window.
-	 */
-	function isSpeakerNotes() {
-
-		return !!window.location.search.match( /receiver/gi );
-
-	}
-
-	/**
-	 * Reads the current URL (hash) and navigates accordingly.
-	 */
-	function readURL() {
-
-		var hash = window.location.hash;
-
-		// Attempt to parse the hash as either an index or name
-		var bits = hash.slice( 2 ).split( '/' ),
-			name = hash.replace( /#|\//gi, '' );
-
-		// If the first bit is invalid and there is a name we can
-		// assume that this is a named link
-		if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) {
-			// Find the slide with the specified name
-			var element = document.querySelector( '#' + name );
-
-			if( element ) {
-				// Find the position of the named slide and navigate to it
-				var indices = Reveal.getIndices( element );
-				slide( indices.h, indices.v );
-			}
-			// If the slide doesn't exist, navigate to the current slide
-			else {
-				slide( indexh || 0, indexv || 0 );
-			}
-		}
-		else {
-			// Read the index components of the hash
-			var h = parseInt( bits[0], 10 ) || 0,
-				v = parseInt( bits[1], 10 ) || 0;
-
-			if( h !== indexh || v !== indexv ) {
-				slide( h, v );
-			}
-		}
-
-	}
-
-	/**
-	 * Updates the page URL (hash) to reflect the current
-	 * state.
-	 *
-	 * @param {Number} delay The time in ms to wait before
-	 * writing the hash
-	 */
-	function writeURL( delay ) {
-
-		if( config.history ) {
-
-			// Make sure there's never more than one timeout running
-			clearTimeout( writeURLTimeout );
-
-			// If a delay is specified, timeout this call
-			if( typeof delay === 'number' ) {
-				writeURLTimeout = setTimeout( writeURL, delay );
-			}
-			else {
-				var url = '/';
-
-				// If the current slide has an ID, use that as a named link
-				if( currentSlide && typeof currentSlide.getAttribute( 'id' ) === 'string' ) {
-					url = '/' + currentSlide.getAttribute( 'id' );
-				}
-				// Otherwise use the /h/v index
-				else {
-					if( indexh > 0 || indexv > 0 ) url += indexh;
-					if( indexv > 0 ) url += '/' + indexv;
-				}
-
-				window.location.hash = url;
-			}
-		}
-
-	}
-
-	/**
-	 * Retrieves the h/v location of the current, or specified,
-	 * slide.
-	 *
-	 * @param {HTMLElement} slide If specified, the returned
-	 * index will be for this slide rather than the currently
-	 * active one
-	 *
-	 * @return {Object} { h: <int>, v: <int>, f: <int> }
-	 */
-	function getIndices( slide ) {
-
-		// By default, return the current indices
-		var h = indexh,
-			v = indexv,
-			f;
-
-		// If a slide is specified, return the indices of that slide
-		if( slide ) {
-			var isVertical = isVerticalSlide( slide );
-			var slideh = isVertical ? slide.parentNode : slide;
-
-			// Select all horizontal slides
-			var horizontalSlides = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-
-			// Now that we know which the horizontal slide is, get its index
-			h = Math.max( horizontalSlides.indexOf( slideh ), 0 );
-
-			// If this is a vertical slide, grab the vertical index
-			if( isVertical ) {
-				v = Math.max( toArray( slide.parentNode.querySelectorAll( 'section' ) ).indexOf( slide ), 0 );
-			}
-		}
-
-		if( !slide && currentSlide ) {
-			var hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0;
-			if( hasFragments ) {
-				var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );
-				f = visibleFragments.length - 1;
-			}
-		}
-
-		return { h: h, v: v, f: f };
-
-	}
-
-	/**
-	 * Return a sorted fragments list, ordered by an increasing
-	 * "data-fragment-index" attribute.
-	 *
-	 * Fragments will be revealed in the order that they are returned by
-	 * this function, so you can use the index attributes to control the
-	 * order of fragment appearance.
-	 *
-	 * To maintain a sensible default fragment order, fragments are presumed
-	 * to be passed in document order. This function adds a "fragment-index"
-	 * attribute to each node if such an attribute is not already present,
-	 * and sets that attribute to an integer value which is the position of
-	 * the fragment within the fragments list.
-	 */
-	function sortFragments( fragments ) {
-
-		fragments = toArray( fragments );
-
-		var ordered = [],
-			unordered = [],
-			sorted = [];
-
-		// Group ordered and unordered elements
-		fragments.forEach( function( fragment, i ) {
-			if( fragment.hasAttribute( 'data-fragment-index' ) ) {
-				var index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 );
-
-				if( !ordered[index] ) {
-					ordered[index] = [];
-				}
-
-				ordered[index].push( fragment );
-			}
-			else {
-				unordered.push( [ fragment ] );
-			}
-		} );
-
-		// Append fragments without explicit indices in their
-		// DOM order
-		ordered = ordered.concat( unordered );
-
-		// Manually count the index up per group to ensure there
-		// are no gaps
-		var index = 0;
-
-		// Push all fragments in their sorted order to an array,
-		// this flattens the groups
-		ordered.forEach( function( group ) {
-			group.forEach( function( fragment ) {
-				sorted.push( fragment );
-				fragment.setAttribute( 'data-fragment-index', index );
-			} );
-
-			index ++;
-		} );
-
-		return sorted;
-
-	}
-
-	/**
-	 * Navigate to the specified slide fragment.
-	 *
-	 * @param {Number} index The index of the fragment that
-	 * should be shown, -1 means all are invisible
-	 * @param {Number} offset Integer offset to apply to the
-	 * fragment index
-	 *
-	 * @return {Boolean} true if a change was made in any
-	 * fragments visibility as part of this call
-	 */
-	function navigateFragment( index, offset ) {
-
-		if( currentSlide && config.fragments ) {
-
-			var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment' ) );
-			if( fragments.length ) {
-
-				// If no index is specified, find the current
-				if( typeof index !== 'number' ) {
-					var lastVisibleFragment = sortFragments( currentSlide.querySelectorAll( '.fragment.visible' ) ).pop();
-
-					if( lastVisibleFragment ) {
-						index = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );
-					}
-					else {
-						index = -1;
-					}
-				}
-
-				// If an offset is specified, apply it to the index
-				if( typeof offset === 'number' ) {
-					index += offset;
-				}
-
-				var fragmentsShown = [],
-					fragmentsHidden = [];
-
-				toArray( fragments ).forEach( function( element, i ) {
-
-					if( element.hasAttribute( 'data-fragment-index' ) ) {
-						i = parseInt( element.getAttribute( 'data-fragment-index' ), 10 );
-					}
-
-					// Visible fragments
-					if( i <= index ) {
-						if( !element.classList.contains( 'visible' ) ) fragmentsShown.push( element );
-						element.classList.add( 'visible' );
-						element.classList.remove( 'current-fragment' );
-
-						if( i === index ) {
-							element.classList.add( 'current-fragment' );
-						}
-					}
-					// Hidden fragments
-					else {
-						if( element.classList.contains( 'visible' ) ) fragmentsHidden.push( element );
-						element.classList.remove( 'visible' );
-						element.classList.remove( 'current-fragment' );
-					}
-
-
-				} );
-
-				if( fragmentsHidden.length ) {
-					dispatchEvent( 'fragmenthidden', { fragment: fragmentsHidden[0], fragments: fragmentsHidden } );
-				}
-
-				if( fragmentsShown.length ) {
-					dispatchEvent( 'fragmentshown', { fragment: fragmentsShown[0], fragments: fragmentsShown } );
-				}
-
-				updateControls();
-
-				return !!( fragmentsShown.length || fragmentsHidden.length );
-
-			}
-
-		}
-
-		return false;
-
-	}
-
-	/**
-	 * Navigate to the next slide fragment.
-	 *
-	 * @return {Boolean} true if there was a next fragment,
-	 * false otherwise
-	 */
-	function nextFragment() {
-
-		return navigateFragment( null, 1 );
-
-	}
-
-	/**
-	 * Navigate to the previous slide fragment.
-	 *
-	 * @return {Boolean} true if there was a previous fragment,
-	 * false otherwise
-	 */
-	function previousFragment() {
-
-		return navigateFragment( null, -1 );
-
-	}
-
-	/**
-	 * Cues a new automated slide if enabled in the config.
-	 */
-	function cueAutoSlide() {
-
-		cancelAutoSlide();
-
-		if( currentSlide ) {
-
-			var parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null;
-			var slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' );
-
-			// Pick value in the following priority order:
-			// 1. Current slide's data-autoslide
-			// 2. Parent slide's data-autoslide
-			// 3. Global autoSlide setting
-			if( slideAutoSlide ) {
-				autoSlide = parseInt( slideAutoSlide, 10 );
-			}
-			else if( parentAutoSlide ) {
-				autoSlide = parseInt( parentAutoSlide, 10 );
-			}
-			else {
-				autoSlide = config.autoSlide;
-			}
-
-			// If there are media elements with data-autoplay,
-			// automatically set the autoSlide duration to the
-			// length of that media
-			toArray( currentSlide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) {
-				if( el.hasAttribute( 'data-autoplay' ) ) {
-					if( autoSlide && el.duration * 1000 > autoSlide ) {
-						autoSlide = ( el.duration * 1000 ) + 1000;
-					}
-				}
-			} );
-
-			// Cue the next auto-slide if:
-			// - There is an autoSlide value
-			// - Auto-sliding isn't paused by the user
-			// - The presentation isn't paused
-			// - The overview isn't active
-			// - The presentation isn't over
-			if( autoSlide && !autoSlidePaused && !isPaused() && !isOverview() && ( !Reveal.isLastSlide() || config.loop === true ) ) {
-				autoSlideTimeout = setTimeout( navigateNext, autoSlide );
-				autoSlideStartTime = Date.now();
-			}
-
-			if( autoSlidePlayer ) {
-				autoSlidePlayer.setPlaying( autoSlideTimeout !== -1 );
-			}
-
-		}
-
-	}
-
-	/**
-	 * Cancels any ongoing request to auto-slide.
-	 */
-	function cancelAutoSlide() {
-
-		clearTimeout( autoSlideTimeout );
-		autoSlideTimeout = -1;
-
-	}
-
-	function pauseAutoSlide() {
-
-		autoSlidePaused = true;
-		clearTimeout( autoSlideTimeout );
-
-		if( autoSlidePlayer ) {
-			autoSlidePlayer.setPlaying( false );
-		}
-
-	}
-
-	function resumeAutoSlide() {
-
-		autoSlidePaused = false;
-		cueAutoSlide();
-
-	}
-
-	function navigateLeft() {
-
-		// Reverse for RTL
-		if( config.rtl ) {
-			if( ( isOverview() || nextFragment() === false ) && availableRoutes().left ) {
-				slide( indexh + 1 );
-			}
-		}
-		// Normal navigation
-		else if( ( isOverview() || previousFragment() === false ) && availableRoutes().left ) {
-			slide( indexh - 1 );
-		}
-
-	}
-
-	function navigateRight() {
-
-		// Reverse for RTL
-		if( config.rtl ) {
-			if( ( isOverview() || previousFragment() === false ) && availableRoutes().right ) {
-				slide( indexh - 1 );
-			}
-		}
-		// Normal navigation
-		else if( ( isOverview() || nextFragment() === false ) && availableRoutes().right ) {
-			slide( indexh + 1 );
-		}
-
-	}
-
-	function navigateUp() {
-
-		// Prioritize hiding fragments
-		if( ( isOverview() || previousFragment() === false ) && availableRoutes().up ) {
-			slide( indexh, indexv - 1 );
-		}
-
-	}
-
-	function navigateDown() {
-
-		// Prioritize revealing fragments
-		if( ( isOverview() || nextFragment() === false ) && availableRoutes().down ) {
-			slide( indexh, indexv + 1 );
-		}
-
-	}
-
-	/**
-	 * Navigates backwards, prioritized in the following order:
-	 * 1) Previous fragment
-	 * 2) Previous vertical slide
-	 * 3) Previous horizontal slide
-	 */
-	function navigatePrev() {
-
-		// Prioritize revealing fragments
-		if( previousFragment() === false ) {
-			if( availableRoutes().up ) {
-				navigateUp();
-			}
-			else {
-				// Fetch the previous horizontal slide, if there is one
-				var previousSlide = document.querySelector( HORIZONTAL_SLIDES_SELECTOR + '.past:nth-child(' + indexh + ')' );
-
-				if( previousSlide ) {
-					var v = ( previousSlide.querySelectorAll( 'section' ).length - 1 ) || undefined;
-					var h = indexh - 1;
-					slide( h, v );
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * Same as #navigatePrev() but navigates forwards.
-	 */
-	function navigateNext() {
-
-		// Prioritize revealing fragments
-		if( nextFragment() === false ) {
-			availableRoutes().down ? navigateDown() : navigateRight();
-		}
-
-		// If auto-sliding is enabled we need to cue up
-		// another timeout
-		cueAutoSlide();
-
-	}
-
-
-	// --------------------------------------------------------------------//
-	// ----------------------------- EVENTS -------------------------------//
-	// --------------------------------------------------------------------//
-
-	/**
-	 * Called by all event handlers that are based on user
-	 * input.
-	 */
-	function onUserInput( event ) {
-
-		if( config.autoSlideStoppable ) {
-			pauseAutoSlide();
-		}
-
-	}
-
-	/**
-	 * Handler for the document level 'keydown' event.
-	 */
-	function onDocumentKeyDown( event ) {
-
-		onUserInput( event );
-
-		// Check if there's a focused element that could be using
-		// the keyboard
-		var activeElement = document.activeElement;
-		var hasFocus = !!( document.activeElement && ( document.activeElement.type || document.activeElement.href || document.activeElement.contentEditable !== 'inherit' ) );
-
-		// Disregard the event if there's a focused element or a
-		// keyboard modifier key is present
-		if( hasFocus || (event.shiftKey && event.keyCode !== 32) || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		// While paused only allow "unpausing" keyboard events (b and .)
-		if( isPaused() && [66,190,191].indexOf( event.keyCode ) === -1 ) {
-			return false;
-		}
-
-		var triggered = false;
-
-		// 1. User defined key bindings
-		if( typeof config.keyboard === 'object' ) {
-
-			for( var key in config.keyboard ) {
-
-				// Check if this binding matches the pressed key
-				if( parseInt( key, 10 ) === event.keyCode ) {
-
-					var value = config.keyboard[ key ];
-
-					// Callback function
-					if( typeof value === 'function' ) {
-						value.apply( null, [ event ] );
-					}
-					// String shortcuts to reveal.js API
-					else if( typeof value === 'string' && typeof Reveal[ value ] === 'function' ) {
-						Reveal[ value ].call();
-					}
-
-					triggered = true;
-
-				}
-
-			}
-
-		}
-
-		// 2. System defined key bindings
-		if( triggered === false ) {
-
-			// Assume true and try to prove false
-			triggered = true;
-
-			switch( event.keyCode ) {
-				// p, page up
-				case 80: case 33: navigatePrev(); break;
-				// n, page down
-				case 78: case 34: navigateNext(); break;
-				// h, left
-				case 72: case 37: navigateLeft(); break;
-				// l, right
-				case 76: case 39: navigateRight(); break;
-				// k, up
-				case 75: case 38: navigateUp(); break;
-				// j, down
-				case 74: case 40: navigateDown(); break;
-				// home
-				case 36: slide( 0 ); break;
-				// end
-				case 35: slide( Number.MAX_VALUE ); break;
-				// space
-				case 32: isOverview() ? deactivateOverview() : event.shiftKey ? navigatePrev() : navigateNext(); break;
-				// return
-				case 13: isOverview() ? deactivateOverview() : triggered = false; break;
-				// b, period, Logitech presenter tools "black screen" button
-				case 66: case 190: case 191: togglePause(); break;
-				// f
-				case 70: enterFullscreen(); break;
-				default:
-					triggered = false;
-			}
-
-		}
-
-		// If the input resulted in a triggered action we should prevent
-		// the browsers default behavior
-		if( triggered ) {
-			event.preventDefault();
-		}
-		// ESC or O key
-		else if ( ( event.keyCode === 27 || event.keyCode === 79 ) && features.transforms3d ) {
-			if( dom.preview ) {
-				closePreview();
-			}
-			else {
-				toggleOverview();
-			}
-
-			event.preventDefault();
-		}
-
-		// If auto-sliding is enabled we need to cue up
-		// another timeout
-		cueAutoSlide();
-
-	}
-
-	/**
-	 * Handler for the 'touchstart' event, enables support for
-	 * swipe and pinch gestures.
-	 */
-	function onTouchStart( event ) {
-
-		touch.startX = event.touches[0].clientX;
-		touch.startY = event.touches[0].clientY;
-		touch.startCount = event.touches.length;
-
-		// If there's two touches we need to memorize the distance
-		// between those two points to detect pinching
-		if( event.touches.length === 2 && config.overview ) {
-			touch.startSpan = distanceBetween( {
-				x: event.touches[1].clientX,
-				y: event.touches[1].clientY
-			}, {
-				x: touch.startX,
-				y: touch.startY
-			} );
-		}
-
-	}
-
-	/**
-	 * Handler for the 'touchmove' event.
-	 */
-	function onTouchMove( event ) {
-
-		// Each touch should only trigger one action
-		if( !touch.captured ) {
-			onUserInput( event );
-
-			var currentX = event.touches[0].clientX;
-			var currentY = event.touches[0].clientY;
-
-			// If the touch started with two points and still has
-			// two active touches; test for the pinch gesture
-			if( event.touches.length === 2 && touch.startCount === 2 && config.overview ) {
-
-				// The current distance in pixels between the two touch points
-				var currentSpan = distanceBetween( {
-					x: event.touches[1].clientX,
-					y: event.touches[1].clientY
-				}, {
-					x: touch.startX,
-					y: touch.startY
-				} );
-
-				// If the span is larger than the desire amount we've got
-				// ourselves a pinch
-				if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) {
-					touch.captured = true;
-
-					if( currentSpan < touch.startSpan ) {
-						activateOverview();
-					}
-					else {
-						deactivateOverview();
-					}
-				}
-
-				event.preventDefault();
-
-			}
-			// There was only one touch point, look for a swipe
-			else if( event.touches.length === 1 && touch.startCount !== 2 ) {
-
-				var deltaX = currentX - touch.startX,
-					deltaY = currentY - touch.startY;
-
-				if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
-					touch.captured = true;
-					navigateLeft();
-				}
-				else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
-					touch.captured = true;
-					navigateRight();
-				}
-				else if( deltaY > touch.threshold ) {
-					touch.captured = true;
-					navigateUp();
-				}
-				else if( deltaY < -touch.threshold ) {
-					touch.captured = true;
-					navigateDown();
-				}
-
-				// If we're embedded, only block touch events if they have
-				// triggered an action
-				if( config.embedded ) {
-					if( touch.captured || isVerticalSlide( currentSlide ) ) {
-						event.preventDefault();
-					}
-				}
-				// Not embedded? Block them all to avoid needless tossing
-				// around of the viewport in iOS
-				else {
-					event.preventDefault();
-				}
-
-			}
-		}
-		// There's a bug with swiping on some Android devices unless
-		// the default action is always prevented
-		else if( navigator.userAgent.match( /android/gi ) ) {
-			event.preventDefault();
-		}
-
-	}
-
-	/**
-	 * Handler for the 'touchend' event.
-	 */
-	function onTouchEnd( event ) {
-
-		touch.captured = false;
-
-	}
-
-	/**
-	 * Convert pointer down to touch start.
-	 */
-	function onPointerDown( event ) {
-
-		if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) {
-			event.touches = [{ clientX: event.clientX, clientY: event.clientY }];
-			onTouchStart( event );
-		}
-
-	}
-
-	/**
-	 * Convert pointer move to touch move.
-	 */
-	function onPointerMove( event ) {
-
-		if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) {
-			event.touches = [{ clientX: event.clientX, clientY: event.clientY }];
-			onTouchMove( event );
-		}
-
-	}
-
-	/**
-	 * Convert pointer up to touch end.
-	 */
-	function onPointerUp( event ) {
-
-		if( event.pointerType === event.MSPOINTER_TYPE_TOUCH ) {
-			event.touches = [{ clientX: event.clientX, clientY: event.clientY }];
-			onTouchEnd( event );
-		}
-
-	}
-
-	/**
-	 * Handles mouse wheel scrolling, throttled to avoid skipping
-	 * multiple slides.
-	 */
-	function onDocumentMouseScroll( event ) {
-
-		if( Date.now() - lastMouseWheelStep > 600 ) {
-
-			lastMouseWheelStep = Date.now();
-
-			var delta = event.detail || -event.wheelDelta;
-			if( delta > 0 ) {
-				navigateNext();
-			}
-			else {
-				navigatePrev();
-			}
-
-		}
-
-	}
-
-	/**
-	 * Clicking on the progress bar results in a navigation to the
-	 * closest approximate horizontal slide using this equation:
-	 *
-	 * ( clickX / presentationWidth ) * numberOfSlides
-	 */
-	function onProgressClicked( event ) {
-
-		onUserInput( event );
-
-		event.preventDefault();
-
-		var slidesTotal = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length;
-		var slideIndex = Math.floor( ( event.clientX / dom.wrapper.offsetWidth ) * slidesTotal );
-
-		slide( slideIndex );
-
-	}
-
-	/**
-	 * Event handler for navigation control buttons.
-	 */
-	function onNavigateLeftClicked( event ) { event.preventDefault(); onUserInput(); navigateLeft(); }
-	function onNavigateRightClicked( event ) { event.preventDefault(); onUserInput(); navigateRight(); }
-	function onNavigateUpClicked( event ) { event.preventDefault(); onUserInput(); navigateUp(); }
-	function onNavigateDownClicked( event ) { event.preventDefault(); onUserInput(); navigateDown(); }
-	function onNavigatePrevClicked( event ) { event.preventDefault(); onUserInput(); navigatePrev(); }
-	function onNavigateNextClicked( event ) { event.preventDefault(); onUserInput(); navigateNext(); }
-
-	/**
-	 * Handler for the window level 'hashchange' event.
-	 */
-	function onWindowHashChange( event ) {
-
-		readURL();
-
-	}
-
-	/**
-	 * Handler for the window level 'resize' event.
-	 */
-	function onWindowResize( event ) {
-
-		layout();
-
-	}
-
-	/**
-	 * Handle for the window level 'visibilitychange' event.
-	 */
-	function onPageVisibilityChange( event ) {
-
-		var isHidden =  document.webkitHidden ||
-						document.msHidden ||
-						document.hidden;
-
-		// If, after clicking a link or similar and we're coming back,
-		// focus the document.body to ensure we can use keyboard shortcuts
-		if( isHidden === false && document.activeElement !== document.body ) {
-			document.activeElement.blur();
-			document.body.focus();
-		}
-
-	}
-
-	/**
-	 * Invoked when a slide is and we're in the overview.
-	 */
-	function onOverviewSlideClicked( event ) {
-
-		// TODO There's a bug here where the event listeners are not
-		// removed after deactivating the overview.
-		if( eventsAreBound && isOverview() ) {
-			event.preventDefault();
-
-			var element = event.target;
-
-			while( element && !element.nodeName.match( /section/gi ) ) {
-				element = element.parentNode;
-			}
-
-			if( element && !element.classList.contains( 'disabled' ) ) {
-
-				deactivateOverview();
-
-				if( element.nodeName.match( /section/gi ) ) {
-					var h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),
-						v = parseInt( element.getAttribute( 'data-index-v' ), 10 );
-
-					slide( h, v );
-				}
-
-			}
-		}
-
-	}
-
-	/**
-	 * Handles clicks on links that are set to preview in the
-	 * iframe overlay.
-	 */
-	function onPreviewLinkClicked( event ) {
-
-		var url = event.target.getAttribute( 'href' );
-		if( url ) {
-			openPreview( url );
-			event.preventDefault();
-		}
-
-	}
-
-	/**
-	 * Handles click on the auto-sliding controls element.
-	 */
-	function onAutoSlidePlayerClick( event ) {
-
-		// Replay
-		if( Reveal.isLastSlide() && config.loop === false ) {
-			slide( 0, 0 );
-			resumeAutoSlide();
-		}
-		// Resume
-		else if( autoSlidePaused ) {
-			resumeAutoSlide();
-		}
-		// Pause
-		else {
-			pauseAutoSlide();
-		}
-
-	}
-
-
-	// --------------------------------------------------------------------//
-	// ------------------------ PLAYBACK COMPONENT ------------------------//
-	// --------------------------------------------------------------------//
-
-
-	/**
-	 * Constructor for the playback component, which displays
-	 * play/pause/progress controls.
-	 *
-	 * @param {HTMLElement} container The component will append
-	 * itself to this
-	 * @param {Function} progressCheck A method which will be
-	 * called frequently to get the current progress on a range
-	 * of 0-1
-	 */
-	function Playback( container, progressCheck ) {
-
-		// Cosmetics
-		this.diameter = 50;
-		this.thickness = 3;
-
-		// Flags if we are currently playing
-		this.playing = false;
-
-		// Current progress on a 0-1 range
-		this.progress = 0;
-
-		// Used to loop the animation smoothly
-		this.progressOffset = 1;
-
-		this.container = container;
-		this.progressCheck = progressCheck;
-
-		this.canvas = document.createElement( 'canvas' );
-		this.canvas.className = 'playback';
-		this.canvas.width = this.diameter;
-		this.canvas.height = this.diameter;
-		this.context = this.canvas.getContext( '2d' );
-
-		this.container.appendChild( this.canvas );
-
-		this.render();
-
-	}
-
-	Playback.prototype.setPlaying = function( value ) {
-
-		var wasPlaying = this.playing;
-
-		this.playing = value;
-
-		// Start repainting if we weren't already
-		if( !wasPlaying && this.playing ) {
-			this.animate();
-		}
-		else {
-			this.render();
-		}
-
-	};
-
-	Playback.prototype.animate = function() {
-
-		var progressBefore = this.progress;
-
-		this.progress = this.progressCheck();
-
-		// When we loop, offset the progress so that it eases
-		// smoothly rather than immediately resetting
-		if( progressBefore > 0.8 && this.progress < 0.2 ) {
-			this.progressOffset = this.progress;
-		}
-
-		this.render();
-
-		if( this.playing ) {
-			features.requestAnimationFrameMethod.call( window, this.animate.bind( this ) );
-		}
-
-	};
-
-	/**
-	 * Renders the current progress and playback state.
-	 */
-	Playback.prototype.render = function() {
-
-		var progress = this.playing ? this.progress : 0,
-			radius = ( this.diameter / 2 ) - this.thickness,
-			x = this.diameter / 2,
-			y = this.diameter / 2,
-			iconSize = 14;
-
-		// Ease towards 1
-		this.progressOffset += ( 1 - this.progressOffset ) * 0.1;
-
-		var endAngle = ( - Math.PI / 2 ) + ( progress * ( Math.PI * 2 ) );
-		var startAngle = ( - Math.PI / 2 ) + ( this.progressOffset * ( Math.PI * 2 ) );
-
-		this.context.save();
-		this.context.clearRect( 0, 0, this.diameter, this.diameter );
-
-		// Solid background color
-		this.context.beginPath();
-		this.context.arc( x, y, radius + 2, 0, Math.PI * 2, false );
-		this.context.fillStyle = 'rgba( 0, 0, 0, 0.4 )';
-		this.context.fill();
-
-		// Draw progress track
-		this.context.beginPath();
-		this.context.arc( x, y, radius, 0, Math.PI * 2, false );
-		this.context.lineWidth = this.thickness;
-		this.context.strokeStyle = '#666';
-		this.context.stroke();
-
-		if( this.playing ) {
-			// Draw progress on top of track
-			this.context.beginPath();
-			this.context.arc( x, y, radius, startAngle, endAngle, false );
-			this.context.lineWidth = this.thickness;
-			this.context.strokeStyle = '#fff';
-			this.context.stroke();
-		}
-
-		this.context.translate( x - ( iconSize / 2 ), y - ( iconSize / 2 ) );
-
-		// Draw play/pause icons
-		if( this.playing ) {
-			this.context.fillStyle = '#fff';
-			this.context.fillRect( 0, 0, iconSize / 2 - 2, iconSize );
-			this.context.fillRect( iconSize / 2 + 2, 0, iconSize / 2 - 2, iconSize );
-		}
-		else {
-			this.context.beginPath();
-			this.context.translate( 2, 0 );
-			this.context.moveTo( 0, 0 );
-			this.context.lineTo( iconSize - 2, iconSize / 2 );
-			this.context.lineTo( 0, iconSize );
-			this.context.fillStyle = '#fff';
-			this.context.fill();
-		}
-
-		this.context.restore();
-
-	};
-
-	Playback.prototype.on = function( type, listener ) {
-		this.canvas.addEventListener( type, listener, false );
-	};
-
-	Playback.prototype.off = function( type, listener ) {
-		this.canvas.removeEventListener( type, listener, false );
-	};
-
-	Playback.prototype.destroy = function() {
-
-		this.playing = false;
-
-		if( this.canvas.parentNode ) {
-			this.container.removeChild( this.canvas );
-		}
-
-	};
-
-
-	// --------------------------------------------------------------------//
-	// ------------------------------- API --------------------------------//
-	// --------------------------------------------------------------------//
-
-
-	return {
-		initialize: initialize,
-		configure: configure,
-		sync: sync,
-
-		// Navigation methods
-		slide: slide,
-		left: navigateLeft,
-		right: navigateRight,
-		up: navigateUp,
-		down: navigateDown,
-		prev: navigatePrev,
-		next: navigateNext,
-
-		// Fragment methods
-		navigateFragment: navigateFragment,
-		prevFragment: previousFragment,
-		nextFragment: nextFragment,
-
-		// Deprecated aliases
-		navigateTo: slide,
-		navigateLeft: navigateLeft,
-		navigateRight: navigateRight,
-		navigateUp: navigateUp,
-		navigateDown: navigateDown,
-		navigatePrev: navigatePrev,
-		navigateNext: navigateNext,
-
-		// Forces an update in slide layout
-		layout: layout,
-
-		// Returns an object with the available routes as booleans (left/right/top/bottom)
-		availableRoutes: availableRoutes,
-
-		// Returns an object with the available fragments as booleans (prev/next)
-		availableFragments: availableFragments,
-
-		// Toggles the overview mode on/off
-		toggleOverview: toggleOverview,
-
-		// Toggles the "black screen" mode on/off
-		togglePause: togglePause,
-
-		// State checks
-		isOverview: isOverview,
-		isPaused: isPaused,
-
-		// Adds or removes all internal event listeners (such as keyboard)
-		addEventListeners: addEventListeners,
-		removeEventListeners: removeEventListeners,
-
-		// Returns the indices of the current, or specified, slide
-		getIndices: getIndices,
-
-		// Returns the slide at the specified index, y is optional
-		getSlide: function( x, y ) {
-			var horizontalSlide = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ];
-			var verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' );
-
-			if( typeof y !== 'undefined' ) {
-				return verticalSlides ? verticalSlides[ y ] : undefined;
-			}
-
-			return horizontalSlide;
-		},
-
-		// Returns the previous slide element, may be null
-		getPreviousSlide: function() {
-			return previousSlide;
-		},
-
-		// Returns the current slide element
-		getCurrentSlide: function() {
-			return currentSlide;
-		},
-
-		// Returns the current scale of the presentation content
-		getScale: function() {
-			return scale;
-		},
-
-		// Returns the current configuration object
-		getConfig: function() {
-			return config;
-		},
-
-		// Helper method, retrieves query string as a key/value hash
-		getQueryHash: function() {
-			var query = {};
-
-			location.search.replace( /[A-Z0-9]+?=([\w\.%-]*)/gi, function(a) {
-				query[ a.split( '=' ).shift() ] = a.split( '=' ).pop();
-			} );
-
-			// Basic deserialization
-			for( var i in query ) {
-				var value = query[ i ];
-
-				query[ i ] = unescape( value );
-
-				if( value === 'null' ) query[ i ] = null;
-				else if( value === 'true' ) query[ i ] = true;
-				else if( value === 'false' ) query[ i ] = false;
-				else if( value.match( /^\d+$/ ) ) query[ i ] = parseFloat( value );
-			}
-
-			return query;
-		},
-
-		// Returns true if we're currently on the first slide
-		isFirstSlide: function() {
-			return document.querySelector( SLIDES_SELECTOR + '.past' ) == null ? true : false;
-		},
-
-		// Returns true if we're currently on the last slide
-		isLastSlide: function() {
-			if( currentSlide ) {
-				// Does this slide has next a sibling?
-				if( currentSlide.nextElementSibling ) return false;
-
-				// If it's vertical, does its parent have a next sibling?
-				if( isVerticalSlide( currentSlide ) && currentSlide.parentNode.nextElementSibling ) return false;
-
-				return true;
-			}
-
-			return false;
-		},
-
-		// Checks if reveal.js has been loaded and is ready for use
-		isReady: function() {
-			return loaded;
-		},
-
-		// Forward event binding to the reveal DOM element
-		addEventListener: function( type, listener, useCapture ) {
-			if( 'addEventListener' in window ) {
-				( dom.wrapper || document.querySelector( '.reveal' ) ).addEventListener( type, listener, useCapture );
-			}
-		},
-		removeEventListener: function( type, listener, useCapture ) {
-			if( 'addEventListener' in window ) {
-				( dom.wrapper || document.querySelector( '.reveal' ) ).removeEventListener( type, listener, useCapture );
-			}
-		}
-	};
-
-})();
diff --git a/docs/slides/IHP14/_support/reveal.js/js/reveal.min.js b/docs/slides/IHP14/_support/reveal.js/js/reveal.min.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/js/reveal.min.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * reveal.js 2.6.1 (2014-03-13, 09:22)
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
- */
-var Reveal=function(){"use strict";function a(a){if(b(),!ec.transforms2d&&!ec.transforms3d)return document.body.setAttribute("class","no-transforms"),void 0;window.addEventListener("load",A,!1);var d=Reveal.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,k(_b,a),k(_b,d),r(),c()}function b(){ec.transforms3d="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,ec.transforms2d="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,ec.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,ec.requestAnimationFrame="function"==typeof ec.requestAnimationFrameMethod,ec.canvas=!!document.createElement("canvas").getContext,Vb=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function c(){function a(){e.length&&head.js.apply(null,e),d()}function b(b){head.ready(b.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],function(){"function"==typeof b.callback&&b.callback.apply(this),0===--f&&a()})}for(var c=[],e=[],f=0,g=0,h=_b.dependencies.length;h>g;g++){var i=_b.dependencies[g];(!i.condition||i.condition())&&(i.async?e.push(i.src):c.push(i.src),b(i))}c.length?(f=c.length,head.js.apply(null,c)):a()}function d(){e(),Q(),h(),cb(),X(!0),setTimeout(function(){dc.slides.classList.remove("no-transition"),ac=!0,t("ready",{indexh:Qb,indexv:Rb,currentSlide:Tb})},1)}function e(){dc.theme=document.querySelector("#theme"),dc.wrapper=document.querySelector(".reveal"),dc.slides=document.querySelector(".reveal .slides"),dc.slides.classList.add("no-transition"),dc.background=f(dc.wrapper,"div","backgrounds",null),dc.progress=f(dc.wrapper,"div","progress","<span></span>"),dc.progressbar=dc.progress.querySelector("span"),f(dc.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),dc.slideNumber=f(dc.wrapper,"div","slide-number",""),f(dc.wrapper,"div","state-background",null),f(dc.wrapper,"div","pause-overlay",null),dc.controls=document.querySelector(".reveal .controls"),dc.controlsLeft=l(document.querySelectorAll(".navigate-left")),dc.controlsRight=l(document.querySelectorAll(".navigate-right")),dc.controlsUp=l(document.querySelectorAll(".navigate-up")),dc.controlsDown=l(document.querySelectorAll(".navigate-down")),dc.controlsPrev=l(document.querySelectorAll(".navigate-prev")),dc.controlsNext=l(document.querySelectorAll(".navigate-next"))}function f(a,b,c,d){var e=a.querySelector("."+c);return e||(e=document.createElement(b),e.classList.add(c),null!==d&&(e.innerHTML=d),a.appendChild(e)),e}function g(){function a(a,b){var c={background:a.getAttribute("data-background"),backgroundSize:a.getAttribute("data-background-size"),backgroundImage:a.getAttribute("data-background-image"),backgroundColor:a.getAttribute("data-background-color"),backgroundRepeat:a.getAttribute("data-background-repeat"),backgroundPosition:a.getAttribute("data-background-position"),backgroundTransition:a.getAttribute("data-background-transition")},d=document.createElement("div");return d.className="slide-background",c.background&&(/^(http|file|\/\/)/gi.test(c.background)||/\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test(c.background)?d.style.backgroundImage="url("+c.background+")":d.style.background=c.background),(c.background||c.backgroundColor||c.backgroundImage)&&d.setAttribute("data-background-hash",c.background+c.backgroundSize+c.backgroundImage+c.backgroundColor+c.backgroundRepeat+c.backgroundPosition+c.backgroundTransition),c.backgroundSize&&(d.style.backgroundSize=c.backgroundSize),c.backgroundImage&&(d.style.backgroundImage='url("'+c.backgroundImage+'")'),c.backgroundColor&&(d.style.backgroundColor=c.backgroundColor),c.backgroundRepeat&&(d.style.backgroundRepeat=c.backgroundRepeat),c.backgroundPosition&&(d.style.backgroundPosition=c.backgroundPosition),c.backgroundTransition&&d.setAttribute("data-background-transition",c.backgroundTransition),b.appendChild(d),d}q()&&document.body.classList.add("print-pdf"),dc.background.innerHTML="",dc.background.classList.add("no-transition"),l(document.querySelectorAll(Yb)).forEach(function(b){var c;c=q()?a(b,b):a(b,dc.background),l(b.querySelectorAll("section")).forEach(function(b){q()?a(b,b):a(b,c)})}),_b.parallaxBackgroundImage?(dc.background.style.backgroundImage='url("'+_b.parallaxBackgroundImage+'")',dc.background.style.backgroundSize=_b.parallaxBackgroundSize,setTimeout(function(){dc.wrapper.classList.add("has-parallax-background")},1)):(dc.background.style.backgroundImage="",dc.wrapper.classList.remove("has-parallax-background"))}function h(a){var b=document.querySelectorAll(Xb).length;if(dc.wrapper.classList.remove(_b.transition),"object"==typeof a&&k(_b,a),ec.transforms3d===!1&&(_b.transition="linear"),dc.wrapper.classList.add(_b.transition),dc.wrapper.setAttribute("data-transition-speed",_b.transitionSpeed),dc.wrapper.setAttribute("data-background-transition",_b.backgroundTransition),dc.controls.style.display=_b.controls?"block":"none",dc.progress.style.display=_b.progress?"block":"none",_b.rtl?dc.wrapper.classList.add("rtl"):dc.wrapper.classList.remove("rtl"),_b.center?dc.wrapper.classList.add("center"):dc.wrapper.classList.remove("center"),_b.mouseWheel?(document.addEventListener("DOMMouseScroll",Bb,!1),document.addEventListener("mousewheel",Bb,!1)):(document.removeEventListener("DOMMouseScroll",Bb,!1),document.removeEventListener("mousewheel",Bb,!1)),_b.rollingLinks?u():v(),_b.previewLinks?w():(x(),w("[data-preview-link]")),b>1&&_b.autoSlide&&_b.autoSlideStoppable&&ec.canvas&&ec.requestAnimationFrame?(Wb=new Pb(dc.wrapper,function(){return Math.min(Math.max((Date.now()-mc)/kc,0),1)}),Wb.on("click",Ob),nc=!1):Wb&&(Wb.destroy(),Wb=null),_b.theme&&dc.theme){var c=dc.theme.getAttribute("href"),d=/[^\/]*?(?=\.css)/,e=c.match(d)[0];_b.theme!==e&&(c=c.replace(d,_b.theme),dc.theme.setAttribute("href",c))}P()}function i(){if(jc=!0,window.addEventListener("hashchange",Jb,!1),window.addEventListener("resize",Kb,!1),_b.touch&&(dc.wrapper.addEventListener("touchstart",vb,!1),dc.wrapper.addEventListener("touchmove",wb,!1),dc.wrapper.addEventListener("touchend",xb,!1),window.navigator.msPointerEnabled&&(dc.wrapper.addEventListener("MSPointerDown",yb,!1),dc.wrapper.addEventListener("MSPointerMove",zb,!1),dc.wrapper.addEventListener("MSPointerUp",Ab,!1))),_b.keyboard&&document.addEventListener("keydown",ub,!1),_b.progress&&dc.progress&&dc.progress.addEventListener("click",Cb,!1),_b.focusBodyOnPageVisiblityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,Lb,!1)}["touchstart","click"].forEach(function(a){dc.controlsLeft.forEach(function(b){b.addEventListener(a,Db,!1)}),dc.controlsRight.forEach(function(b){b.addEventListener(a,Eb,!1)}),dc.controlsUp.forEach(function(b){b.addEventListener(a,Fb,!1)}),dc.controlsDown.forEach(function(b){b.addEventListener(a,Gb,!1)}),dc.controlsPrev.forEach(function(b){b.addEventListener(a,Hb,!1)}),dc.controlsNext.forEach(function(b){b.addEventListener(a,Ib,!1)})})}function j(){jc=!1,document.removeEventListener("keydown",ub,!1),window.removeEventListener("hashchange",Jb,!1),window.removeEventListener("resize",Kb,!1),dc.wrapper.removeEventListener("touchstart",vb,!1),dc.wrapper.removeEventListener("touchmove",wb,!1),dc.wrapper.removeEventListener("touchend",xb,!1),window.navigator.msPointerEnabled&&(dc.wrapper.removeEventListener("MSPointerDown",yb,!1),dc.wrapper.removeEventListener("MSPointerMove",zb,!1),dc.wrapper.removeEventListener("MSPointerUp",Ab,!1)),_b.progress&&dc.progress&&dc.progress.removeEventListener("click",Cb,!1),["touchstart","click"].forEach(function(a){dc.controlsLeft.forEach(function(b){b.removeEventListener(a,Db,!1)}),dc.controlsRight.forEach(function(b){b.removeEventListener(a,Eb,!1)}),dc.controlsUp.forEach(function(b){b.removeEventListener(a,Fb,!1)}),dc.controlsDown.forEach(function(b){b.removeEventListener(a,Gb,!1)}),dc.controlsPrev.forEach(function(b){b.removeEventListener(a,Hb,!1)}),dc.controlsNext.forEach(function(b){b.removeEventListener(a,Ib,!1)})})}function k(a,b){for(var c in b)a[c]=b[c]}function l(a){return Array.prototype.slice.call(a)}function m(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function n(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function o(a){var b=0;if(a){var c=0;l(a.childNodes).forEach(function(a){"number"==typeof a.offsetTop&&a.style&&("absolute"===a.style.position&&(c+=1),b=Math.max(b,a.offsetTop+a.offsetHeight))}),0===c&&(b=a.offsetHeight)}return b}function p(a,b){if(b=b||0,a){var c=a.parentNode,d=c.childNodes;l(d).forEach(function(c){if("number"==typeof c.offsetHeight&&c!==a){var d=window.getComputedStyle(c),e=parseInt(d.marginTop,10),f=parseInt(d.marginBottom,10);b-=c.offsetHeight+e+f}});var e=window.getComputedStyle(a);b-=parseInt(e.marginTop,10)+parseInt(e.marginBottom,10)}return b}function q(){return/print-pdf/gi.test(window.location.search)}function r(){_b.hideAddressBar&&Vb&&(window.addEventListener("load",s,!1),window.addEventListener("orientationchange",s,!1))}function s(){setTimeout(function(){window.scrollTo(0,1)},10)}function t(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),k(c,b),dc.wrapper.dispatchEvent(c)}function u(){if(ec.transforms3d&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(Xb+" a:not(.image)"),b=0,c=a.length;c>b;b++){var d=a[b];if(!(!d.textContent||d.querySelector("*")||d.className&&d.classList.contains(d,"roll"))){var e=document.createElement("span");e.setAttribute("data-title",d.text),e.innerHTML=d.innerHTML,d.classList.add("roll"),d.innerHTML="",d.appendChild(e)}}}function v(){for(var a=document.querySelectorAll(Xb+" a.roll"),b=0,c=a.length;c>b;b++){var d=a[b],e=d.querySelector("span");e&&(d.classList.remove("roll"),d.innerHTML=e.innerHTML)}}function w(a){var b=l(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Nb,!1)})}function x(){var a=l(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Nb,!1)})}function y(a){z(),dc.preview=document.createElement("div"),dc.preview.classList.add("preview-link-overlay"),dc.wrapper.appendChild(dc.preview),dc.preview.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>','<a class="external" href="'+a+'" target="_blank"><span class="icon"></span></a>',"</header>",'<div class="spinner"></div>','<div class="viewport">','<iframe src="'+a+'"></iframe>',"</div>"].join(""),dc.preview.querySelector("iframe").addEventListener("load",function(){dc.preview.classList.add("loaded")},!1),dc.preview.querySelector(".close").addEventListener("click",function(a){z(),a.preventDefault()},!1),dc.preview.querySelector(".external").addEventListener("click",function(){z()},!1),setTimeout(function(){dc.preview.classList.add("visible")},1)}function z(){dc.preview&&(dc.preview.setAttribute("src",""),dc.preview.parentNode.removeChild(dc.preview),dc.preview=null)}function A(){if(dc.wrapper&&!q()){var a=dc.wrapper.offsetWidth,b=dc.wrapper.offsetHeight;a-=b*_b.margin,b-=b*_b.margin;var c=_b.width,d=_b.height,e=20;B(_b.width,_b.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),dc.slides.style.width=c+"px",dc.slides.style.height=d+"px",cc=Math.min(a/c,b/d),cc=Math.max(cc,_b.minScale),cc=Math.min(cc,_b.maxScale),"undefined"==typeof dc.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?n(dc.slides,"translate(-50%, -50%) scale("+cc+") translate(50%, 50%)"):dc.slides.style.zoom=cc;for(var f=l(document.querySelectorAll(Xb)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=_b.center||i.classList.contains("center")?i.classList.contains("stack")?0:Math.max(-(o(i)/2)-e,-d/2)+"px":"")}U(),Y()}}function B(a,b,c){l(dc.slides.querySelectorAll("section > .stretch")).forEach(function(d){var e=p(d,b-2*c);if(/(img|video)/gi.test(d.nodeName)){var f=d.naturalWidth||d.videoWidth,g=d.naturalHeight||d.videoHeight,h=Math.min(a/f,e/g);d.style.width=f*h+"px",d.style.height=g*h+"px"}else d.style.width=a+"px",d.style.height=e+"px"})}function C(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function D(a){if("object"==typeof a&&"function"==typeof a.setAttribute&&a.classList.contains("stack")){var b=a.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(a.getAttribute(b)||0,10)}return 0}function E(){if(_b.overview){kb();var a=dc.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;dc.wrapper.classList.add("overview"),dc.wrapper.classList.remove("overview-deactivating"),clearTimeout(hc),clearTimeout(ic),hc=setTimeout(function(){for(var c=document.querySelectorAll(Yb),d=0,e=c.length;e>d;d++){var f=c[d],g=_b.rtl?-105:105;if(f.setAttribute("data-index-h",d),n(f,"translateZ(-"+b+"px) translate("+(d-Qb)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Qb?Rb:D(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),n(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Mb,!0)}else f.addEventListener("click",Mb,!0)}T(),A(),a||t("overviewshown",{indexh:Qb,indexv:Rb,currentSlide:Tb})},10)}}function F(){_b.overview&&(clearTimeout(hc),clearTimeout(ic),dc.wrapper.classList.remove("overview"),dc.wrapper.classList.add("overview-deactivating"),ic=setTimeout(function(){dc.wrapper.classList.remove("overview-deactivating")},1),l(document.querySelectorAll(Xb)).forEach(function(a){n(a,""),a.removeEventListener("click",Mb,!0)}),O(Qb,Rb),jb(),t("overviewhidden",{indexh:Qb,indexv:Rb,currentSlide:Tb}))}function G(a){"boolean"==typeof a?a?E():F():H()?F():E()}function H(){return dc.wrapper.classList.contains("overview")}function I(a){return a=a?a:Tb,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function J(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function K(){var a=dc.wrapper.classList.contains("paused");kb(),dc.wrapper.classList.add("paused"),a===!1&&t("paused")}function L(){var a=dc.wrapper.classList.contains("paused");dc.wrapper.classList.remove("paused"),jb(),a&&t("resumed")}function M(){N()?L():K()}function N(){return dc.wrapper.classList.contains("paused")}function O(a,b,c,d){Sb=Tb;var e=document.querySelectorAll(Yb);void 0===b&&(b=D(e[a])),Sb&&Sb.parentNode&&Sb.parentNode.classList.contains("stack")&&C(Sb.parentNode,Rb);var f=bc.concat();bc.length=0;var g=Qb||0,h=Rb||0;Qb=S(Yb,void 0===a?Qb:a),Rb=S(Zb,void 0===b?Rb:b),T(),A();a:for(var i=0,j=bc.length;j>i;i++){for(var k=0;k<f.length;k++)if(f[k]===bc[i]){f.splice(k,1);continue a}document.documentElement.classList.add(bc[i]),t(bc[i])}for(;f.length;)document.documentElement.classList.remove(f.pop());H()&&E();var m=e[Qb],n=m.querySelectorAll("section");Tb=n[Rb]||m,"undefined"!=typeof c&&gb(c);var o=Qb!==g||Rb!==h;o?t("slidechanged",{indexh:Qb,indexv:Rb,previousSlide:Sb,currentSlide:Tb,origin:d}):Sb=null,Sb&&(Sb.classList.remove("present"),document.querySelector($b).classList.contains("present")&&setTimeout(function(){var a,b=l(document.querySelectorAll(Yb+".stack"));for(a in b)b[a]&&C(b[a],0)},0)),o&&(ab(Sb),_(Tb)),W(),U(),X(),Y(),V(),db(),jb()}function P(){j(),i(),A(),kc=_b.autoSlide,jb(),g(),R(),W(),U(),X(!0),V()}function Q(){var a=l(document.querySelectorAll(Yb));a.forEach(function(a){var b=l(a.querySelectorAll("section"));b.forEach(function(a,b){b>0&&(a.classList.remove("present"),a.classList.remove("past"),a.classList.add("future"))})})}function R(){var a=l(document.querySelectorAll(Yb));a.forEach(function(a){var b=l(a.querySelectorAll("section"));b.forEach(function(a){fb(a.querySelectorAll(".fragment"))}),0===b.length&&fb(a.querySelectorAll(".fragment"))})}function S(a,b){var c=l(document.querySelectorAll(a)),d=c.length;if(d){_b.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var e=0;d>e;e++){var f=c[e],g=_b.rtl&&!I(f);if(f.classList.remove("past"),f.classList.remove("present"),f.classList.remove("future"),f.setAttribute("hidden",""),b>e){f.classList.add(g?"future":"past");for(var h=l(f.querySelectorAll(".fragment"));h.length;){var i=h.pop();i.classList.add("visible"),i.classList.remove("current-fragment")}}else if(e>b){f.classList.add(g?"past":"future");for(var j=l(f.querySelectorAll(".fragment.visible"));j.length;){var k=j.pop();k.classList.remove("visible"),k.classList.remove("current-fragment")}}f.querySelector("section")&&f.classList.add("stack")}c[b].classList.add("present"),c[b].removeAttribute("hidden");var m=c[b].getAttribute("data-state");m&&(bc=bc.concat(m.split(" ")))}else b=0;return b}function T(){var a,b,c=l(document.querySelectorAll(Yb)),d=c.length;if(d){var e=H()?10:_b.viewDistance;Vb&&(e=H()?6:1);for(var f=0;d>f;f++){var g=c[f],h=l(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Qb-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=D(g),k=0;i>k;k++){var m=h[k];b=f===Qb?Math.abs(Rb-k):Math.abs(k-j),m.style.display=a+b>e?"none":"block"}}}}function U(){if(_b.progress&&dc.progress){var a=l(document.querySelectorAll(Yb)),b=document.querySelectorAll(Xb+":not(.stack)").length,c=0;a:for(var d=0;d<a.length;d++){for(var e=a[d],f=l(e.querySelectorAll("section")),g=0;g<f.length;g++){if(f[g].classList.contains("present"))break a;c++}if(e.classList.contains("present"))break;e.classList.contains("stack")===!1&&c++}dc.progressbar.style.width=c/(b-1)*window.innerWidth+"px"}}function V(){if(_b.slideNumber&&dc.slideNumber){var a=Qb;Rb>0&&(a+=" - "+Rb),dc.slideNumber.innerHTML=a}}function W(){var a=Z(),b=$();dc.controlsLeft.concat(dc.controlsRight).concat(dc.controlsUp).concat(dc.controlsDown).concat(dc.controlsPrev).concat(dc.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&dc.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&dc.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&dc.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&dc.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&dc.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&dc.controlsNext.forEach(function(a){a.classList.add("enabled")}),Tb&&(b.prev&&dc.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),I(Tb)?(b.prev&&dc.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&dc.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&dc.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function X(a){var b=null,c=_b.rtl?"future":"past",d=_b.rtl?"past":"future";if(l(dc.background.childNodes).forEach(function(e,f){Qb>f?e.className="slide-background "+c:f>Qb?e.className="slide-background "+d:(e.className="slide-background present",b=e),(a||f===Qb)&&l(e.childNodes).forEach(function(a,c){Rb>c?a.className="slide-background past":c>Rb?a.className="slide-background future":(a.className="slide-background present",f===Qb&&(b=a))})}),b){var e=Ub?Ub.getAttribute("data-background-hash"):null,f=b.getAttribute("data-background-hash");f&&f===e&&b!==Ub&&dc.background.classList.add("no-transition"),Ub=b}setTimeout(function(){dc.background.classList.remove("no-transition")},1)}function Y(){if(_b.parallaxBackgroundImage){var a,b,c=document.querySelectorAll(Yb),d=document.querySelectorAll(Zb),e=dc.background.style.backgroundSize.split(" ");1===e.length?a=b=parseInt(e[0],10):(a=parseInt(e[0],10),b=parseInt(e[1],10));var f=dc.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*Qb,i=dc.background.offsetHeight,j=d.length,k=j>0?-(b-i)/(j-1)*Rb:0;dc.background.style.backgroundPosition=h+"px "+k+"px"}}function Z(){var a=document.querySelectorAll(Yb),b=document.querySelectorAll(Zb),c={left:Qb>0||_b.loop,right:Qb<a.length-1||_b.loop,up:Rb>0,down:Rb<b.length-1};if(_b.rtl){var d=c.left;c.left=c.right,c.right=d}return c}function $(){if(Tb&&_b.fragments){var a=Tb.querySelectorAll(".fragment"),b=Tb.querySelectorAll(".fragment:not(.visible)");return{prev:a.length-b.length>0,next:!!b.length}}return{prev:!1,next:!1}}function _(a){a&&!bb()&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function ab(a){a&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function bb(){return!!window.location.search.match(/receiver/gi)}function cb(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d=document.querySelector("#"+c);if(d){var e=Reveal.getIndices(d);O(e.h,e.v)}else O(Qb||0,Rb||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==Qb||g!==Rb)&&O(f,g)}}function db(a){if(_b.history)if(clearTimeout(gc),"number"==typeof a)gc=setTimeout(db,a);else{var b="/";Tb&&"string"==typeof Tb.getAttribute("id")?b="/"+Tb.getAttribute("id"):((Qb>0||Rb>0)&&(b+=Qb),Rb>0&&(b+="/"+Rb)),window.location.hash=b}}function eb(a){var b,c=Qb,d=Rb;if(a){var e=I(a),f=e?a.parentNode:a,g=l(document.querySelectorAll(Yb));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(l(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&Tb){var h=Tb.querySelectorAll(".fragment").length>0;if(h){var i=Tb.querySelectorAll(".fragment.visible");b=i.length-1}}return{h:c,v:d,f:b}}function fb(a){a=l(a);var b=[],c=[],d=[];a.forEach(function(a){if(a.hasAttribute("data-fragment-index")){var d=parseInt(a.getAttribute("data-fragment-index"),10);b[d]||(b[d]=[]),b[d].push(a)}else c.push([a])}),b=b.concat(c);var e=0;return b.forEach(function(a){a.forEach(function(a){d.push(a),a.setAttribute("data-fragment-index",e)}),e++}),d}function gb(a,b){if(Tb&&_b.fragments){var c=fb(Tb.querySelectorAll(".fragment"));if(c.length){if("number"!=typeof a){var d=fb(Tb.querySelectorAll(".fragment.visible")).pop();a=d?parseInt(d.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof b&&(a+=b);var e=[],f=[];return l(c).forEach(function(b,c){b.hasAttribute("data-fragment-index")&&(c=parseInt(b.getAttribute("data-fragment-index"),10)),a>=c?(b.classList.contains("visible")||e.push(b),b.classList.add("visible"),b.classList.remove("current-fragment"),c===a&&b.classList.add("current-fragment")):(b.classList.contains("visible")&&f.push(b),b.classList.remove("visible"),b.classList.remove("current-fragment"))}),f.length&&t("fragmenthidden",{fragment:f[0],fragments:f}),e.length&&t("fragmentshown",{fragment:e[0],fragments:e}),W(),!(!e.length&&!f.length)}}return!1}function hb(){return gb(null,1)}function ib(){return gb(null,-1)}function jb(){if(kb(),Tb){var a=Tb.parentNode?Tb.parentNode.getAttribute("data-autoslide"):null,b=Tb.getAttribute("data-autoslide");kc=b?parseInt(b,10):a?parseInt(a,10):_b.autoSlide,l(Tb.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&kc&&1e3*a.duration>kc&&(kc=1e3*a.duration+1e3)}),!kc||nc||N()||H()||Reveal.isLastSlide()&&_b.loop!==!0||(lc=setTimeout(sb,kc),mc=Date.now()),Wb&&Wb.setPlaying(-1!==lc)}}function kb(){clearTimeout(lc),lc=-1}function lb(){nc=!0,clearTimeout(lc),Wb&&Wb.setPlaying(!1)}function mb(){nc=!1,jb()}function nb(){_b.rtl?(H()||hb()===!1)&&Z().left&&O(Qb+1):(H()||ib()===!1)&&Z().left&&O(Qb-1)}function ob(){_b.rtl?(H()||ib()===!1)&&Z().right&&O(Qb-1):(H()||hb()===!1)&&Z().right&&O(Qb+1)}function pb(){(H()||ib()===!1)&&Z().up&&O(Qb,Rb-1)}function qb(){(H()||hb()===!1)&&Z().down&&O(Qb,Rb+1)}function rb(){if(ib()===!1)if(Z().up)pb();else{var a=document.querySelector(Yb+".past:nth-child("+Qb+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Qb-1;O(c,b)}}}function sb(){hb()===!1&&(Z().down?qb():ob()),jb()}function tb(){_b.autoSlideStoppable&&lb()}function ub(a){tb(a),document.activeElement;var b=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(b||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(N()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var c=!1;if("object"==typeof _b.keyboard)for(var d in _b.keyboard)if(parseInt(d,10)===a.keyCode){var e=_b.keyboard[d];"function"==typeof e?e.apply(null,[a]):"string"==typeof e&&"function"==typeof Reveal[e]&&Reveal[e].call(),c=!0}if(c===!1)switch(c=!0,a.keyCode){case 80:case 33:rb();break;case 78:case 34:sb();break;case 72:case 37:nb();break;case 76:case 39:ob();break;case 75:case 38:pb();break;case 74:case 40:qb();break;case 36:O(0);break;case 35:O(Number.MAX_VALUE);break;case 32:H()?F():a.shiftKey?rb():sb();break;case 13:H()?F():c=!1;break;case 66:case 190:case 191:M();break;case 70:J();break;default:c=!1}c?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!ec.transforms3d||(dc.preview?z():G(),a.preventDefault()),jb()}}function vb(a){oc.startX=a.touches[0].clientX,oc.startY=a.touches[0].clientY,oc.startCount=a.touches.length,2===a.touches.length&&_b.overview&&(oc.startSpan=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:oc.startX,y:oc.startY}))}function wb(a){if(oc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{tb(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===oc.startCount&&_b.overview){var d=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:oc.startX,y:oc.startY});Math.abs(oc.startSpan-d)>oc.threshold&&(oc.captured=!0,d<oc.startSpan?E():F()),a.preventDefault()}else if(1===a.touches.length&&2!==oc.startCount){var e=b-oc.startX,f=c-oc.startY;e>oc.threshold&&Math.abs(e)>Math.abs(f)?(oc.captured=!0,nb()):e<-oc.threshold&&Math.abs(e)>Math.abs(f)?(oc.captured=!0,ob()):f>oc.threshold?(oc.captured=!0,pb()):f<-oc.threshold&&(oc.captured=!0,qb()),_b.embedded?(oc.captured||I(Tb))&&a.preventDefault():a.preventDefault()}}}function xb(){oc.captured=!1}function yb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],vb(a))}function zb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],wb(a))}function Ab(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],xb(a))}function Bb(a){if(Date.now()-fc>600){fc=Date.now();var b=a.detail||-a.wheelDelta;b>0?sb():rb()}}function Cb(a){tb(a),a.preventDefault();var b=l(document.querySelectorAll(Yb)).length,c=Math.floor(a.clientX/dc.wrapper.offsetWidth*b);O(c)}function Db(a){a.preventDefault(),tb(),nb()}function Eb(a){a.preventDefault(),tb(),ob()}function Fb(a){a.preventDefault(),tb(),pb()}function Gb(a){a.preventDefault(),tb(),qb()}function Hb(a){a.preventDefault(),tb(),rb()}function Ib(a){a.preventDefault(),tb(),sb()}function Jb(){cb()}function Kb(){A()}function Lb(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function Mb(a){if(jc&&H()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(F(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);O(c,d)}}}function Nb(a){var b=a.target.getAttribute("href");b&&(y(b),a.preventDefault())}function Ob(){Reveal.isLastSlide()&&_b.loop===!1?(O(0,0),mb()):nc?mb():lb()}function Pb(a,b){this.diameter=50,this.thickness=3,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=a,this.progressCheck=b,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}var Qb,Rb,Sb,Tb,Ub,Vb,Wb,Xb=".reveal .slides section",Yb=".reveal .slides>section",Zb=".reveal .slides>section.present>section",$b=".reveal .slides>section:first-of-type",_b={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,autoSlide:0,autoSlideStoppable:!0,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,focusBodyOnPageVisiblityChange:!0,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",parallaxBackgroundImage:"",parallaxBackgroundSize:"",viewDistance:3,dependencies:[]},ac=!1,bc=[],cc=1,dc={},ec={},fc=0,gc=0,hc=0,ic=0,jc=!1,kc=0,lc=0,mc=-1,nc=!1,oc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return Pb.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},Pb.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&ec.requestAnimationFrameMethod.call(window,this.animate.bind(this))},Pb.prototype.render=function(){var a=this.playing?this.progress:0,b=this.diameter/2-this.thickness,c=this.diameter/2,d=this.diameter/2,e=14;this.progressOffset+=.1*(1-this.progressOffset);var f=-Math.PI/2+a*2*Math.PI,g=-Math.PI/2+this.progressOffset*2*Math.PI;this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(c,d,b+2,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(c,d,b,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(c,d,b,g,f,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(c-e/2,d-e/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,e/2-2,e),this.context.fillRect(e/2+2,0,e/2-2,e)):(this.context.beginPath(),this.context.translate(2,0),this.context.moveTo(0,0),this.context.lineTo(e-2,e/2),this.context.lineTo(0,e),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()},Pb.prototype.on=function(a,b){this.canvas.addEventListener(a,b,!1)},Pb.prototype.off=function(a,b){this.canvas.removeEventListener(a,b,!1)},Pb.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},{initialize:a,configure:h,sync:P,slide:O,left:nb,right:ob,up:pb,down:qb,prev:rb,next:sb,navigateFragment:gb,prevFragment:ib,nextFragment:hb,navigateTo:O,navigateLeft:nb,navigateRight:ob,navigateUp:pb,navigateDown:qb,navigatePrev:rb,navigateNext:sb,layout:A,availableRoutes:Z,availableFragments:$,toggleOverview:G,togglePause:M,isOverview:H,isPaused:N,addEventListeners:i,removeEventListeners:j,getIndices:eb,getSlide:function(a,b){var c=document.querySelectorAll(Yb)[a],d=c&&c.querySelectorAll("section");
-return"undefined"!=typeof b?d?d[b]:void 0:c},getPreviousSlide:function(){return Sb},getCurrentSlide:function(){return Tb},getScale:function(){return cc},getConfig:function(){return _b},getQueryHash:function(){var a={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()});for(var b in a){var c=a[b];a[b]=unescape(c),"null"===c?a[b]=null:"true"===c?a[b]=!0:"false"===c?a[b]=!1:c.match(/^\d+$/)&&(a[b]=parseFloat(c))}return a},isFirstSlide:function(){return null==document.querySelector(Xb+".past")?!0:!1},isLastSlide:function(){return Tb?Tb.nextElementSibling?!1:I(Tb)&&Tb.parentNode.nextElementSibling?!1:!0:!1},isReady:function(){return ac},addEventListener:function(a,b,c){"addEventListener"in window&&(dc.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(dc.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}();
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/css/zenburn.css b/docs/slides/IHP14/_support/reveal.js/lib/css/zenburn.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/lib/css/zenburn.css
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-
-Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
-based on dark.css by Ivan Sagalaev
-
-*/
-
-pre code {
-  display: block; padding: 0.5em;
-  background: #3F3F3F;
-  color: #DCDCDC;
-}
-
-pre .keyword,
-pre .tag,
-pre .css .class,
-pre .css .id,
-pre .lisp .title,
-pre .nginx .title,
-pre .request,
-pre .status,
-pre .clojure .attribute {
-  color: #E3CEAB;
-}
-
-pre .django .template_tag,
-pre .django .variable,
-pre .django .filter .argument {
-  color: #DCDCDC;
-}
-
-pre .number,
-pre .date {
-  color: #8CD0D3;
-}
-
-pre .dos .envvar,
-pre .dos .stream,
-pre .variable,
-pre .apache .sqbracket {
-  color: #EFDCBC;
-}
-
-pre .dos .flow,
-pre .diff .change,
-pre .python .exception,
-pre .python .built_in,
-pre .literal,
-pre .tex .special {
-  color: #EFEFAF;
-}
-
-pre .diff .chunk,
-pre .subst {
-  color: #8F8F8F;
-}
-
-pre .dos .keyword,
-pre .python .decorator,
-pre .title,
-pre .haskell .type,
-pre .diff .header,
-pre .ruby .class .parent,
-pre .apache .tag,
-pre .nginx .built_in,
-pre .tex .command,
-pre .prompt {
-    color: #efef8f;
-}
-
-pre .dos .winutils,
-pre .ruby .symbol,
-pre .ruby .symbol .string,
-pre .ruby .string {
-  color: #DCA3A3;
-}
-
-pre .diff .deletion,
-pre .string,
-pre .tag .value,
-pre .preprocessor,
-pre .built_in,
-pre .sql .aggregate,
-pre .javadoc,
-pre .smalltalk .class,
-pre .smalltalk .localvars,
-pre .smalltalk .array,
-pre .css .rules .value,
-pre .attr_selector,
-pre .pseudo,
-pre .apache .cbracket,
-pre .tex .formula {
-  color: #CC9393;
-}
-
-pre .shebang,
-pre .diff .addition,
-pre .comment,
-pre .java .annotation,
-pre .template_comment,
-pre .pi,
-pre .doctype {
-  color: #7F9F7F;
-}
-
-pre .coffeescript .javascript,
-pre .javascript .xml,
-pre .tex .formula,
-pre .xml .javascript,
-pre .xml .vbscript,
-pre .xml .css,
-pre .xml .cdata {
-  opacity: 0.5;
-}
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.eot b/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.eot
deleted file mode 100644
Binary files a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.eot and /dev/null differ
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.svg b/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.svg
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.svg
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="LeagueGothicRegular" horiz-adv-x="724" >
-<font-face units-per-em="2048" ascent="1505" descent="-543" />
-<missing-glyph horiz-adv-x="315" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="2048" />
-<glyph unicode="&#xd;" horiz-adv-x="682" />
-<glyph unicode=" "  horiz-adv-x="315" />
-<glyph unicode="&#x09;" horiz-adv-x="315" />
-<glyph unicode="&#xa0;" horiz-adv-x="315" />
-<glyph unicode="!" horiz-adv-x="387" d="M74 1505h239l-55 -1099h-129zM86 0v227h215v-227h-215z" />
-<glyph unicode="&#x22;" horiz-adv-x="329" d="M57 1505h215l-30 -551h-154z" />
-<glyph unicode="#" horiz-adv-x="1232" d="M49 438l27 195h198l37 258h-196l26 194h197l57 420h197l-57 -420h260l57 420h197l-58 -420h193l-27 -194h-192l-37 -258h190l-26 -195h-191l-59 -438h-197l60 438h-261l-59 -438h-197l60 438h-199zM471 633h260l37 258h-260z" />
-<glyph unicode="$" horiz-adv-x="692" d="M37 358l192 13q12 -186 129 -187q88 0 93 185q0 74 -61 175q-21 36 -34 53l-40 55q-28 38 -65.5 90t-70.5 101.5t-70.5 141.5t-37.5 170q4 293 215 342v131h123v-125q201 -23 235 -282l-192 -25q-14 129 -93 125q-80 -2 -84 -162q0 -102 94 -227l41 -59q30 -42 37 -52 t33 -48l37 -52q41 -57 68 -109l26 -55q43 -94 43 -186q-4 -338 -245 -369v-217h-123v221q-236 41 -250 352z" />
-<glyph unicode="%" horiz-adv-x="1001" d="M55 911v437q0 110 82 156q33 18 90.5 18t97.5 -44t44 -87l4 -43v-437q0 -107 -81 -157q-32 -19 -77 -19q-129 0 -156 135zM158 0l553 1505h131l-547 -1505h-137zM178 911q-4 -55 37 -55q16 0 25.5 14.5t9.5 26.5v451q2 55 -35 55q-18 0 -27.5 -13.5t-9.5 -27.5v-451z M631 158v436q0 108 81 156q33 20 79 20q125 0 153 -135l4 -41v-436q0 -110 -80 -156q-32 -18 -90.5 -18t-98.5 43t-44 88zM754 158q-4 -57 37 -58q37 0 34 58v436q2 55 -34 55q-18 0 -27.5 -13t-9.5 -28v-450z" />
-<glyph unicode="&#x26;" horiz-adv-x="854" d="M49 304q0 126 44 225.5t126 222.5q-106 225 -106 442v18q0 94 47 180q70 130 223 130q203 0 252 -215q14 -61 12 -113q0 -162 -205 -434q76 -174 148 -285q33 96 47 211l176 -33q-16 -213 -92 -358q55 -63 92 -76v-235q-23 0 -86 37.5t-123 101.5q-123 -139 -252 -139 t-216 97t-87 223zM263 325.5q1 -65.5 28.5 -107.5t78.5 -42t117 86q-88 139 -174 295q-18 -30 -34.5 -98t-15.5 -133.5zM305 1194q0 -111 55 -246q101 156 101 252q-2 2 0 15.5t-2 36t-11 42.5q-19 52 -61.5 52t-62 -38t-19.5 -75v-39z" />
-<glyph unicode="'" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="(" horiz-adv-x="561" d="M66 645q0 143 29.5 292.5t73.5 261.5q92 235 159 343l30 47l162 -84q-38 -53 -86.5 -148t-82.5 -189.5t-61.5 -238t-27.5 -284.5t26.5 -282.5t64.5 -240.5q80 -207 141 -296l26 -39l-162 -84q-41 61 -96 173t-94 217.5t-70.5 257t-31.5 294.5z" />
-<glyph unicode=")" horiz-adv-x="561" d="M41 -213q36 50 85.5 147t83.5 190t61.5 236.5t27.5 284.5t-26.5 282.5t-64.5 240.5q-78 205 -140 298l-27 39l162 84q41 -61 96 -173.5t94 -217t71 -257.5t32 -296t-30 -292.5t-74 -260.5q-92 -233 -159 -342l-30 -47z" />
-<glyph unicode="*" horiz-adv-x="677" d="M74 1251l43 148l164 -70l-19 176h154l-19 -176l164 70l43 -148l-172 -34l115 -138l-131 -80l-78 152l-76 -152l-131 80l115 138z" />
-<glyph unicode="+" horiz-adv-x="1060" d="M74 649v172h370v346h172v-346h371v-172h-371v-346h-172v346h-370z" />
-<glyph unicode="," horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="-" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="." horiz-adv-x="321" d="M53 0v227h215v-227h-215z" />
-<glyph unicode="/" horiz-adv-x="720" d="M8 -147l543 1652h162l-537 -1652h-168z" />
-<glyph unicode="0" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="1" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="2" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="3" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="4" horiz-adv-x="684" d="M25 328v194l323 983h221v-983h103v-194h-103v-328h-202v328h-342zM213 522h154v516h-13z" />
-<glyph unicode="5" horiz-adv-x="704" d="M74 438h221v-59q0 -115 14.5 -159t52 -44t53 45t15.5 156v336q0 111 -70 110q-33 0 -59.5 -40t-26.5 -70h-186v792h535v-219h-344v-313q74 55 127 51q78 0 133 -40t77 -100q35 -98 35 -171v-336q0 -393 -289 -393q-78 0 -133 29.5t-84.5 71.5t-46.5 109q-24 98 -24 244z " />
-<glyph unicode="6" horiz-adv-x="700" d="M66 309v856q0 356 288.5 356.5t288.5 -356.5v-94h-221q0 162 -11.5 210t-53.5 48t-56 -37t-14 -127v-268q59 37 124.5 37t119 -36t75.5 -93q37 -92 37 -189v-307q0 -90 -42 -187q-26 -61 -89 -99.5t-157.5 -38.5t-158 38.5t-88.5 99.5q-42 98 -42 187zM287 244 q0 -20 17.5 -44t49 -24t50 24.5t18.5 43.5v450q0 18 -18.5 43t-49 25t-48 -20.5t-19.5 -41.5v-456z" />
-<glyph unicode="7" horiz-adv-x="589" d="M8 1286v219h557v-221l-221 -1284h-229l225 1286h-332z" />
-<glyph unicode="8" horiz-adv-x="696" d="M53 322v176q0 188 115 297q-102 102 -102 276v127q0 213 147 293q57 31 135 31t135.5 -31t84 -71t42.5 -93q21 -66 21 -129v-127q0 -174 -103 -276q115 -109 115 -297v-176q0 -222 -153 -306q-60 -32 -142 -32t-141.5 32.5t-88 73.5t-44.5 96q-21 69 -21 136zM269 422 q1 -139 16.5 -187.5t57.5 -48.5t59.5 30t21.5 71t4 158t-13.5 174t-66.5 57t-66.5 -57.5t-12.5 -196.5zM284 1116q-1 -123 11 -173t53 -50t53.5 50t12.5 170t-12.5 167t-51.5 47t-52 -44t-14 -167z" />
-<glyph unicode="9" horiz-adv-x="700" d="M57 340v94h222q0 -162 11 -210t53 -48t56.5 37t14.5 127v283q-59 -37 -125 -37t-119 35.5t-76 92.5q-37 96 -37 189v293q0 87 43 188q25 60 88.5 99t157.5 39t157.5 -39t88.5 -99q43 -101 43 -188v-856q0 -356 -289 -356t-289 356zM279 825q0 -18 18 -42.5t49 -24.5 t48.5 20.5t19.5 40.5v443q0 20 -17.5 43.5t-49.5 23.5t-50 -24.5t-18 -42.5v-437z" />
-<glyph unicode=":" horiz-adv-x="362" d="M74 0v227h215v-227h-215zM74 893v227h215v-227h-215z" />
-<glyph unicode=";" horiz-adv-x="362" d="M74 0v227h215v-227l-113 -266h-102l71 266h-71zM74 893v227h215v-227h-215z" />
-<glyph unicode="&#x3c;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="=" horiz-adv-x="1058" d="M74 477v172h911v-172h-911zM74 864v172h911v-172h-911z" />
-<glyph unicode="&#x3e;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="?" horiz-adv-x="645" d="M25 1260q24 67 78 131q105 128 235 122q82 -2 138 -33.5t82 -81.5q46 -88 46 -170.5t-80 -219.5l-57 -96q-18 -32 -42 -106.5t-24 -143.5v-256h-190v256q0 102 24.5 195t48 140t65.5 118t50 105t-9 67.5t-60 34.5t-78 -48t-49 -98zM199 0h215v227h-215v-227z" />
-<glyph unicode="@" horiz-adv-x="872" d="M66 303v889q0 97 73 200q39 56 117 93t184.5 37t184 -37t116.5 -93q74 -105 74 -200v-793h-164l-20 56q-14 -28 -46 -48t-67 -20q-145 0 -145 172v485q0 170 145 170q71 0 113 -67v45q0 51 -45 104.5t-145.5 53.5t-145.5 -53.5t-45 -104.5v-889q0 -53 44 -103t153.5 -50 t160.5 63l152 -86q-109 -143 -320 -143q-106 0 -184 35.5t-117 90.5q-73 102 -73 193zM535 573q0 -53 48 -53t48 53v455q0 53 -48 53t-48 -53v-455z" />
-<glyph unicode="A" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="B" horiz-adv-x="745" d="M82 0v1505h194q205 0 304.5 -91t99.5 -308q0 -106 -29.5 -175t-107.5 -136q14 -5 47 -38.5t54 -71.5q52 -97 52 -259q0 -414 -342 -426h-272zM303 219q74 0 109 31q55 56 55 211t-63 195q-42 26 -93 26h-8v-463zM303 885q87 0 119 39q45 55 45 138t-14.5 124t-30.5 60.5 t-45 28.5q-35 11 -74 11v-401z" />
-<glyph unicode="C" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175z" />
-<glyph unicode="D" horiz-adv-x="761" d="M82 0v1505h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174zM303 221q117 0 140.5 78t23.5 399v111q0 322 -23.5 398.5t-140.5 76.5v-1063z" />
-<glyph unicode="E" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506z" />
-<glyph unicode="F" horiz-adv-x="616" d="M82 0v1505h526v-227h-305v-395h205v-228h-205v-655h-221z" />
-<glyph unicode="G" horiz-adv-x="737" d="M67 271.5q0 26.5 1 37.5v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-231h-221v231q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-905q0 -46 19.5 -78.5t54 -32.5t53 28t18.5 54l2 29v272h-88v187h309v-750h-131l-26 72 q-70 -88 -172 -88q-203 0 -250 213q-11 48 -11 74.5z" />
-<glyph unicode="H" horiz-adv-x="778" d="M82 0v1505h221v-622h172v622h221v-1505h-221v655h-172v-655h-221z" />
-<glyph unicode="I" horiz-adv-x="385" d="M82 0v1505h221v-1505h-221z" />
-<glyph unicode="J" horiz-adv-x="423" d="M12 -14v217q4 0 12.5 -1t29 2t35.5 12t28.5 34.5t13.5 62.5v1192h221v-1226q0 -137 -74 -216q-74 -78 -223 -78h-4q-19 0 -39 1z" />
-<glyph unicode="K" horiz-adv-x="768" d="M82 0v1505h221v-526h8l195 526h215l-203 -495l230 -1010h-216l-153 655l-6 31h-6l-64 -154v-532h-221z" />
-<glyph unicode="L" horiz-adv-x="604" d="M82 0v1505h221v-1300h293v-205h-514z" />
-<glyph unicode="M" horiz-adv-x="991" d="M82 0v1505h270l131 -688l11 -80h4l10 80l131 688h270v-1505h-204v1010h-13l-149 -1010h-94l-142 946l-8 64h-12v-1010h-205z" />
-<glyph unicode="N" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203z" />
-<glyph unicode="O" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="P" horiz-adv-x="720" d="M82 0v1505h221q166 0 277.5 -105.5t111.5 -345t-111.5 -346t-277.5 -106.5v-602h-221zM303 827q102 0 134 45.5t32 175.5t-33 181t-133 51v-453z" />
-<glyph unicode="Q" horiz-adv-x="729" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -94 -45 -182q33 -43 88 -53v-189q-160 0 -227 117q-55 -18 -125 -18t-130 33.5t-88 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887 q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="R" horiz-adv-x="739" d="M82 0v1505h221q377 0 377 -434q0 -258 -123 -342l141 -729h-221l-115 635h-59v-635h-221zM303 840q117 0 149 98q15 49 15 125t-15.5 125t-45.5 68q-44 30 -103 30v-446z" />
-<glyph unicode="S" horiz-adv-x="702" d="M37 422l217 20q0 -256 104 -256q90 0 91 166q0 59 -32 117.5t-45 79.5l-54 79q-40 58 -77 113t-73.5 117t-68 148.5t-31.5 162.5q0 139 71.5 245t216.5 108h10q88 0 152 -36t94 -100q54 -120 54 -264l-217 -20q0 217 -89 217q-75 -2 -75 -146q0 -59 23 -105 q32 -66 58 -104l197 -296q31 -49 67 -139.5t36 -166.5q0 -378 -306 -378h-2q-229 0 -290 188q-31 99 -31 250z" />
-<glyph unicode="T" horiz-adv-x="647" d="M4 1278v227h639v-227h-209v-1278h-221v1278h-209z" />
-<glyph unicode="U" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175z" />
-<glyph unicode="V" horiz-adv-x="716" d="M18 1505h215l111 -827l8 -64h13l118 891h215l-229 -1505h-221z" />
-<glyph unicode="W" horiz-adv-x="1036" d="M25 1505h204l88 -782l5 -49h16l100 831h160l100 -831h17l92 831h205l-203 -1505h-172l-115 801h-8l-115 -801h-172z" />
-<glyph unicode="X" horiz-adv-x="737" d="M16 0l244 791l-240 714h218l120 -381l7 -18h8l127 399h217l-240 -714l244 -791h-217l-127 449l-4 18h-8l-132 -467h-217z" />
-<glyph unicode="Y" horiz-adv-x="700" d="M14 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641z" />
-<glyph unicode="Z" horiz-adv-x="626" d="M20 0v238l347 1048h-297v219h536v-219l-352 -1067h352v-219h-586z" />
-<glyph unicode="[" horiz-adv-x="538" d="M82 -213v1718h399v-196h-202v-1325h202v-197h-399z" />
-<glyph unicode="\" horiz-adv-x="792" d="M8 1692h162l614 -1872h-168z" />
-<glyph unicode="]" horiz-adv-x="538" d="M57 -16h203v1325h-203v196h400v-1718h-400v197z" />
-<glyph unicode="^" horiz-adv-x="1101" d="M53 809l381 696h234l381 -696h-199l-299 543l-299 -543h-199z" />
-<glyph unicode="_" horiz-adv-x="1210" d="M74 -154h1063v-172h-1063v172z" />
-<glyph unicode="`" horiz-adv-x="1024" d="M293 1489h215l106 -184h-159z" />
-<glyph unicode="a" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="b" horiz-adv-x="686" d="M82 0v1505h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-74h-207zM289 246q0 -29 19.5 -48.5t42 -19.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -21.5t-19.5 -46.5v-628z" />
-<glyph unicode="c" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331z" />
-<glyph unicode="d" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v458h207v-1505h-207v74q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 19.5t19.5 48.5v628q0 25 -19.5 46.5t-42 21.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="e" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="f" horiz-adv-x="475" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-65 0 -65 -175v-5v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="g" horiz-adv-x="700" d="M12 -184q0 94 162 170q-125 35 -125 149q0 45 40 93t89 75q-51 35 -80.5 95.5t-34.5 105.5l-4 43v305q0 35 16.5 91t41 94t79 69t126.5 31q135 0 206 -103q102 102 170 103v-185q-72 0 -120 -24l10 -70v-317q0 -37 -17.5 -90.5t-42 -90t-79 -66.5t-104.5 -30t-62 2 q-29 -25 -29 -46t11 -33.5t42 -20.5t45.5 -10t65.5 -10.5t95 -21.5t89 -41q96 -60 96 -205t-103 -212q-100 -65 -250 -65h-9q-156 2 -240 50t-84 165zM213 -150q0 -77 132 -77h3q59 0 108.5 19t49.5 54t-20.5 52.5t-90.5 29.5l-106 21q-76 -43 -76 -99zM262 509 q0 -17 15.5 -45t44.5 -28q63 6 63 101v307q-2 0 0 10q1 3 1 7q0 8 -3 19q-4 15 -9 30q-11 36 -46 36t-50.5 -25.5t-15.5 -52.5v-359z" />
-<glyph unicode="h" horiz-adv-x="690" d="M82 0v1505h207v-479l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="i" horiz-adv-x="370" d="M82 0v1120h207v-1120h-207zM82 1298v207h207v-207h-207z" />
-<glyph unicode="j" horiz-adv-x="364" d="M-45 -182q29 -8 57 -8q64 0 64 142v1168h207v-1149q0 -186 -51 -266q-23 -35 -71 -62.5t-115 -27.5t-91 12v191zM76 1298v207h207v-207h-207z" />
-<glyph unicode="k" horiz-adv-x="641" d="M82 0v1505h207v-714h10l113 329h186l-149 -364l188 -756h-199l-102 453l-4 16h-10l-33 -82v-387h-207z" />
-<glyph unicode="l" horiz-adv-x="370" d="M82 0v1505h207v-1505h-207z" />
-<glyph unicode="m" horiz-adv-x="1021" d="M82 0v1120h207v-94q2 0 33 30q80 81 139 81q100 0 139 -125q125 125 194.5 125t109.5 -69t40 -150v-918h-194v887q-1 49 -56 49q-41 0 -78 -53v-883h-194v887q0 49 -55 49q-41 0 -78 -53v-883h-207z" />
-<glyph unicode="n" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="o" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="p" horiz-adv-x="686" d="M82 -385v1505h207v-73q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="q" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v73h207v-1505h-207v459q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 21.5t19.5 46.5v628q0 29 -19.5 48.5t-42 19.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="r" horiz-adv-x="503" d="M82 0v1120h207v-125q8 41 58.5 91.5t148.5 50.5v-230q-34 11 -77 11t-86.5 -39t-43.5 -101v-778h-207z" />
-<glyph unicode="s" horiz-adv-x="630" d="M37 326h192q0 -170 97 -170q71 0 71 131q0 78 -129 202q-68 66 -98.5 99t-64 101.5t-33.5 134t12 114.5t39 95q59 100 201 104h11q161 0 211 -105q42 -86 42 -198h-193q0 131 -67 131q-63 -2 -64 -131q0 -33 23.5 -73t45 -62.5t66.5 -65.5q190 -182 191 -342 q0 -123 -64.5 -215t-199.5 -92q-197 0 -260 170q-29 76 -29 172z" />
-<glyph unicode="t" horiz-adv-x="501" d="M20 934v186h105v277h207v-277h141v-186h-141v-557q0 -184 65 -184l76 8v-203q-45 -14 -112 -14t-114.5 28.5t-70 64.5t-34.5 96q-17 79 -17 187v574h-105z" />
-<glyph unicode="u" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5z" />
-<glyph unicode="v" horiz-adv-x="602" d="M16 1120h201l68 -649l8 -72h16l76 721h201l-183 -1120h-204z" />
-<glyph unicode="w" horiz-adv-x="905" d="M20 1120h189l65 -585l9 -64h12l96 649h123l86 -585l10 -64h13l73 649h189l-166 -1120h-172l-80 535l-10 63h-8l-91 -598h-172z" />
-<glyph unicode="x" horiz-adv-x="618" d="M16 0l193 578l-176 542h194l74 -262l6 -31h4l6 31l74 262h195l-176 -542l192 -578h-201l-84 283l-6 30h-4l-6 -30l-84 -283h-201z" />
-<glyph unicode="y" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5z" />
-<glyph unicode="z" horiz-adv-x="532" d="M12 0v168l285 764h-240v188h459v-168l-285 -764h285v-188h-504z" />
-<glyph unicode="{" horiz-adv-x="688" d="M61 453v163q72 0 102 49.5t30 90.5v397q0 223 96 298t342 71v-172q-135 2 -188.5 -38t-53.5 -159v-397q0 -143 -127 -221q127 -82 127 -222v-397q0 -119 53.5 -159t188.5 -38v-172q-246 -4 -342 71t-96 298v397q0 57 -41 97.5t-91 42.5z" />
-<glyph unicode="|" horiz-adv-x="356" d="M82 -512v2204h192v-2204h-192z" />
-<glyph unicode="}" horiz-adv-x="688" d="M57 -281q135 -2 188.5 38t53.5 159v397q0 139 127 222q-127 78 -127 221v397q0 119 -53 159t-189 38v172q246 4 342.5 -71t96.5 -298v-397q0 -63 41 -101.5t90 -38.5v-163q-72 -4 -101.5 -52.5t-29.5 -87.5v-397q0 -223 -96.5 -298t-342.5 -71v172z" />
-<glyph unicode="~" horiz-adv-x="1280" d="M113 1352q35 106 115 200q34 41 94.5 74t121 33t116.5 -18.5t82 -33t83 -51.5q106 -72 174 -71q109 0 178 153l13 29l135 -57q-63 -189 -206 -276q-56 -34 -120 -34q-121 0 -272 101q-115 74 -178.5 74t-113.5 -45.5t-69 -90.5l-18 -45z" />
-<glyph unicode="&#xa1;" horiz-adv-x="387" d="M74 -385l55 1100h129l55 -1100h-239zM86 893v227h215v-227h-215z" />
-<glyph unicode="&#xa2;" horiz-adv-x="636" d="M66 508v489q0 297 208 328v242h123v-244q98 -16 144.5 -88t46.5 -227v-88h-189v135q0 90 -72.5 90t-72.5 -90v-604q0 -90 72 -91q74 0 73 91v155h189v-108q0 -156 -46 -228.5t-145 -89.5v-303h-123v301q-209 31 -208 330z" />
-<glyph unicode="&#xa3;" horiz-adv-x="817" d="M4 63q8 20 23.5 53.5t70 91.5t117.5 68q37 111 37 189t-31 184h-188v137h147l-6 21q-78 254 -78 333t15.5 140t48.5 116q72 122 231 126q190 4 267 -126q65 -108 65 -276h-213q0 201 -115 197q-47 -2 -68.5 -51t-21.5 -139.5t70 -315.5l6 -25h211v-137h-174 q25 -100 24.5 -189t-57.5 -204q16 -8 44 -24q59 -35 89 -35q74 4 82 190l188 -22q-12 -182 -81.5 -281.5t-169.5 -99.5q-51 0 -143.5 51t-127.5 51t-63.5 -25.5t-40.5 -52.5l-12 -24z" />
-<glyph unicode="&#xa5;" horiz-adv-x="720" d="M25 1505h217l110 -481l6 -14h4l7 14l110 481h217l-196 -753h147v-138h-176v-137h176v-137h-176v-340h-221v340h-176v137h176v137h-176v138h147z" />
-<glyph unicode="&#xa8;" horiz-adv-x="1024" d="M272 1305v200h191v-200h-191zM561 1305v200h191v-200h-191z" />
-<glyph unicode="&#xa9;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM627 487v531q0 122 97 174q40 22 95 22 q147 0 182 -147l7 -49v-125h-138v142q0 11 -12 28.5t-37 17.5q-47 -2 -49 -63v-531q0 -63 49 -63q53 2 49 63v125h138v-125q0 -68 -40 -127q-18 -26 -57 -47.5t-108.5 -21.5t-117.5 49t-54 98z" />
-<glyph unicode="&#xaa;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xad;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#xae;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM625 313v879h196q231 0 232 -258 q0 -76 -16.5 -125t-71.5 -96l106 -400h-151l-95 365h-55v-365h-145zM770 805h45q43 0 65.5 21.5t27.5 45t5 61.5t-5 62.5t-27.5 46t-65.5 21.5h-45v-258z" />
-<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M313 1315v162h398v-162h-398z" />
-<glyph unicode="&#xb2;" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="&#xb3;" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="&#xb4;" horiz-adv-x="1024" d="M410 1305l106 184h215l-162 -184h-159z" />
-<glyph unicode="&#xb7;" horiz-adv-x="215" d="M0 649v228h215v-228h-215z" />
-<glyph unicode="&#xb8;" horiz-adv-x="1024" d="M426 -111h172v-141l-45 -133h-104l40 133h-63v141z" />
-<glyph unicode="&#xb9;" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="&#xba;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="&#xbf;" horiz-adv-x="645" d="M41 -106q0 82 80 219l57 95q18 32 42 106.5t24 144.5v256h190v-256q0 -102 -24.5 -195.5t-48 -140.5t-65.5 -118t-50 -104.5t9 -67.5t60 -35t78 48.5t49 98.5l179 -84q-24 -66 -78 -132q-104 -126 -236 -122q-163 4 -220 115q-46 90 -46 172zM231 893v227h215v-227h-215z " />
-<glyph unicode="&#xc0;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM141 1823h215l107 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc1;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM293 1638l106 185h215l-161 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc2;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM133 1638l141 185h220l141 -185h-189l-63 72l-61 -72h-189zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc3;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM184 1632v152q49 39 95.5 39t104.5 -18.5t100.5 -19.5t97.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-98 19.5t-102 -33zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc4;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM143 1638v201h191v-201h-191zM307 541h152l-64 475l-6 39h-12zM432 1638v201h191v-201h-191z" />
-<glyph unicode="&#xc5;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM231 1761.5q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM307 541h152l-64 475l-6 39h-12zM309 1761.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50 t-23.5 50t-52.5 21.5t-52.5 -21.5t-23.5 -50z" />
-<glyph unicode="&#xc6;" horiz-adv-x="1099" d="M16 0l420 1505h623v-227h-285v-395h205v-242h-205v-414h285v-227h-506v307h-227l-90 -307h-220zM393 541h160v514h-10z" />
-<glyph unicode="&#xc7;" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM268 -111v-141h64l-41 -133h104l45 133v141h-172z" />
-<glyph unicode="&#xc8;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM111 1823h215l106 -185h-160z" />
-<glyph unicode="&#xc9;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM236 1638l106 185h215l-162 -185h-159z" />
-<glyph unicode="&#xca;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM84 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xcb;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM94 1638v201h191v-201h-191zM383 1638v201h190v-201h-190z" />
-<glyph unicode="&#xcc;" horiz-adv-x="401" d="M-6 1823h215l106 -185h-159zM98 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcd;" horiz-adv-x="401" d="M82 0v1505h221v-1505h-221zM86 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xce;" horiz-adv-x="370" d="M-66 1638l142 185h219l141 -185h-188l-64 72l-61 -72h-189zM74 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcf;" horiz-adv-x="372" d="M-53 1638v201h190v-201h-190zM76 0v1505h221v-1505h-221zM236 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd0;" horiz-adv-x="761" d="M20 655v228h62v622h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174v655h-62zM303 221q117 0 141.5 81t22.5 452q2 371 -22.5 450.5t-141.5 79.5v-401h84v-228h-84v-434z " />
-<glyph unicode="&#xd1;" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203zM207 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39t-102.5 19.5t-100 19.5t-99.5 -33z" />
-<glyph unicode="&#xd2;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM121 1823h215l106 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd3;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM285 1638l106 185h215l-162 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5 t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd4;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM113 1638l141 185h219l141 -185h-188l-64 72l-61 -72h-188zM289 309q0 -46 19.5 -78 t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd5;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM164 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39 t-102.5 19.5t-100 19.5t-99.5 -33zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd6;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM123 1638v201h190v-201h-190zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887zM412 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd8;" d="M59 -20l47 157q-36 74 -36 148l-2 24v887q0 42 17 106t45 107t88.5 78t148 35t153.5 -43l15 47h122l-45 -150q43 -84 43 -155l2 -25v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-150.5 -34.5t-153 43l-15 -47h-129zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v488zM289 727l147 479q-8 100 -74 101q-35 0 -53 -28t-18 -54l-2 -29v-469z" />
-<glyph unicode="&#xd9;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM145 1823h215l107 -185h-160z" />
-<glyph unicode="&#xda;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM307 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xdb;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM125 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xdc;" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175zM135 1638v201h191v-201h-191zM424 1638v201h190v-201h-190z" />
-<glyph unicode="&#xdd;" horiz-adv-x="704" d="M16 1505l226 -864v-641h221v641l225 864h-217l-111 -481l-6 -14h-4l-6 14l-111 481h-217zM254 1638l106 185h215l-161 -185h-160z" />
-<glyph unicode="&#xde;" d="M82 0v1505h219v-241h2q166 0 277.5 -105.5t111.5 -345.5t-111.5 -346.5t-277.5 -106.5v-360h-221zM303 586q102 0 134 45t32 175t-33 181t-133 51v-452z" />
-<glyph unicode="&#xdf;" horiz-adv-x="733" d="M66 0v1235q0 123 70.5 205t206.5 82t204.5 -81t68.5 -197t-88 -181q152 -88 152 -488q0 -362 -87 -475q-46 -59 -102.5 -79.5t-144.5 -20.5v193q45 0 70 25q57 57 57 357q0 316 -57 377q-25 27 -70 27v141q35 0 60.5 33t25.5 84q0 100 -86 100q-74 0 -74 -102v-1235h-206 z" />
-<glyph unicode="&#xe0;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1489h215 l107 -184h-160zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe1;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xe2;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM90 1305 l141 184h220l141 -184h-189l-63 71l-61 -71h-189zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe3;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM143 1305v151 q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe4;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1305v200 h191v-200h-191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM391 1305v200h191v-200h-191z" />
-<glyph unicode="&#xe5;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM188 1421.5 q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM266 1421.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50t-23.5 50t-52.5 21.5t-52.5 -21.5 t-23.5 -50z" />
-<glyph unicode="&#xe6;" horiz-adv-x="989" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t197.5 88q84 0 152 -52q66 51 162 52q199 0 251 -197q14 -51 15 -92v-326h-342v-256q0 -60 38 -88q17 -12 38 -12q70 10 73 113v122h193v-129 q0 -37 -16.5 -93t-41 -95t-80 -69.5t-130.5 -30.5q-158 0 -226 131q-102 -131 -221 -131q-59 0 -112.5 60t-53.5 191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM588 684h149v158q0 48 -19.5 81t-53 33t-53 -28.5t-21.5 -57.5l-2 -28v-158z " />
-<glyph unicode="&#xe7;" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331zM238 -111v-141h63l-41 -133h105l45 133v141h-172z " />
-<glyph unicode="&#xe8;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM102 1489h215l107 -184 h-160zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xe9;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xea;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM80 1305l141 184h219 l142 -184h-189l-63 71l-62 -71h-188zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xeb;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM90 1305v200h191v-200 h-191zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xec;" horiz-adv-x="370" d="M-33 1489h215l107 -184h-160zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xed;" horiz-adv-x="370" d="M82 0h207v1120h-207v-1120zM82 1305l106 184h215l-161 -184h-160z" />
-<glyph unicode="&#xee;" horiz-adv-x="370" d="M-66 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xef;" horiz-adv-x="372" d="M-53 1305v200h190v-200h-190zM82 0v1120h207v-1120h-207zM236 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf0;" horiz-adv-x="673" d="M76 279v579q0 279 172 279q63 0 155 -78q-12 109 -51 203l-82 -72l-55 63l100 88l-45 66l109 100q25 -27 53 -61l94 82l56 -66l-101 -88q125 -201 125 -446v-656q0 -102 -56 -188q-26 -39 -80 -69.5t-129 -30.5t-130 30.5t-80 73.5q-53 91 -53 160zM270 267.5 q-2 -11.5 2 -29t10 -34.5q16 -38 58 -38q70 10 72 113v563q-2 0 0 11t-2 28.5t-10 34.5q-16 40 -60 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf1;" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207zM147 1305v151q49 39 95.5 39t105 -18.5t97 -19.5t100.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#xf2;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM98 1489h215l107 -184h-160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf3;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5 t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM260 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xf4;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM78 1305l141 184h219l142 -184h-189l-63 71l-62 -71h-188zM258 267.5q-2 -11.5 2 -29 t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf5;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM131 1305v151q49 39 95.5 39t104.5 -18.5t98.5 -19.5t98.5 32v-152q-51 -39 -95 -39 t-102 19.5t-101 19.5t-99 -32zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf6;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM90 1305v200h191v-200h-191zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf8;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t118 32t117.5 -19l21 80h75l-30 -121q88 -84 94 -229v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-120.5 -30.5t-112 16l-20 -78h-80l31 121q-41 39 -64.5 97.5t-25.5 97.5zM258 436l125 486q-18 35 -55 34q-68 -10 -70 -114 v-406zM274 197q17 -31 54 -31q70 10 71 113v403z" />
-<glyph unicode="&#xf9;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM113 1489h215l106 -184h-160z" />
-<glyph unicode="&#xfa;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM274 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfb;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM94 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189z" />
-<glyph unicode="&#xfc;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM106 1305v200h191v-200h-191zM395 1305v200h191v-200h-191z" />
-<glyph unicode="&#xfd;" horiz-adv-x="634" d="M25 1120l190 -1153q0 -68 -36 -123t-97 -61l-49 4v-184q70 -4 92 -4q115 0 192.5 95t94.5 222l198 1204h-202l-82 -688l-4 -57h-9l-4 57l-82 688h-202zM231 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfe;" horiz-adv-x="686" d="M82 -385v1890h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="&#xff;" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5zM78 1305v200h190v-200h-190zM367 1305v200h190v-200h-190z" />
-<glyph unicode="&#x152;" horiz-adv-x="983" d="M68 309v887q0 41 17 101.5t45 100.5t88.5 73.5t143.5 33.5h580v-227h-285v-395h205v-242h-205v-414h285v-227h-580q-84 0 -144 31.5t-88 78.5q-55 91 -60 169zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v901q-6 96 -74 97q-35 0 -53 -28t-18 -54l-2 -29 v-887z" />
-<glyph unicode="&#x153;" horiz-adv-x="995" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t145.5 32t156 -60q66 59 170 60q199 0 252 -197q14 -51 14 -92v-326h-342v-250q0 -46 22.5 -76t53.5 -30q70 10 73 113v122h193v-129q0 -37 -16.5 -93t-41 -95t-80 -69.5t-146 -30.5t-154.5 57q-68 -57 -156 -57t-143.5 30.5 t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM594 684h149v158q0 48 -19 81t-58 33t-55.5 -37.5t-16.5 -70.5v-164z" />
-<glyph unicode="&#x178;" horiz-adv-x="704" d="M16 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641zM113 1638v201h190v-201h-190zM401 1638v201h191v-201h-191z" />
-<glyph unicode="&#x2c6;" horiz-adv-x="1021" d="M260 1305l141 184h220l141 -184h-189l-63 71l-61 -71h-189z" />
-<glyph unicode="&#x2dc;" horiz-adv-x="1024" d="M313 1305v151q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#x2000;" horiz-adv-x="952" />
-<glyph unicode="&#x2001;" horiz-adv-x="1905" />
-<glyph unicode="&#x2002;" horiz-adv-x="952" />
-<glyph unicode="&#x2003;" horiz-adv-x="1905" />
-<glyph unicode="&#x2004;" horiz-adv-x="635" />
-<glyph unicode="&#x2005;" horiz-adv-x="476" />
-<glyph unicode="&#x2006;" horiz-adv-x="317" />
-<glyph unicode="&#x2007;" horiz-adv-x="317" />
-<glyph unicode="&#x2008;" horiz-adv-x="238" />
-<glyph unicode="&#x2009;" horiz-adv-x="381" />
-<glyph unicode="&#x200a;" horiz-adv-x="105" />
-<glyph unicode="&#x2010;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2011;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2012;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2013;" horiz-adv-x="806" d="M74 649v195h659v-195h-659z" />
-<glyph unicode="&#x2014;" horiz-adv-x="972" d="M74 649v195h825v-195h-825z" />
-<glyph unicode="&#x2018;" horiz-adv-x="309" d="M49 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x2019;" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="&#x201a;" horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="&#x201c;" horiz-adv-x="624" d="M53 1012v227l113 266h102l-71 -266h71v-227h-215zM356 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x201d;" horiz-adv-x="624" d="M53 1012l72 266h-72v227h215v-227l-112 -266h-103zM356 1012l72 266h-72v227h215v-227l-112 -266h-103z" />
-<glyph unicode="&#x201e;" horiz-adv-x="624" d="M53 0v227h215v-227l-112 -266h-103l72 266h-72zM356 0v227h215v-227l-112 -266h-103l72 266h-72z" />
-<glyph unicode="&#x2022;" horiz-adv-x="663" d="M82 815q0 104 72.5 177t177 73t177.5 -72.5t73 -177t-73 -177.5t-177 -73t-177 73t-73 177z" />
-<glyph unicode="&#x2026;" horiz-adv-x="964" d="M53 0v227h215v-227h-215zM375 0v227h215v-227h-215zM696 0v227h215v-227h-215z" />
-<glyph unicode="&#x202f;" horiz-adv-x="381" />
-<glyph unicode="&#x2039;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="&#x203a;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="&#x205f;" horiz-adv-x="476" />
-<glyph unicode="&#x20ac;" horiz-adv-x="813" d="M53 547v137h107v137h-107v137h107v238q0 42 17.5 106t45 107t88 78t144.5 35t144 -34t88 -81q53 -90 61 -178l2 -33v-84h-207v84q-2 0 0 11.5t-3 27.5t-12 33q-18 39 -69 39q-70 -10 -78 -111v-238h233v-137h-233v-137h233v-137h-233v-238q0 -43 21.5 -76.5t59.5 -33.5 t58.5 27.5t20.5 56.5l2 26v84h207v-84q0 -38 -17.5 -104t-45.5 -109t-88 -77.5t-144 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175l-2 35v238h-107z" />
-<glyph unicode="&#x2122;" horiz-adv-x="937" d="M74 1401v104h321v-104h-104v-580h-113v580h-104zM440 821v684h138l67 -319h6l68 319h137v-684h-104v449l-78 -449h-51l-80 449v-449h-103z" />
-<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 0v1120h1120v-1120h-1120z" />
-<glyph unicode="&#xfb01;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2v-184q-41 12 -91 12t-69.5 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h358v-1120h-207v934h-151v-934h-207v934h-105z" />
-<glyph unicode="&#xfb02;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2h164v-1505h-207v1329q-37 4 -67.5 4t-50 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="&#xfb03;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1120h207v-1120h-207zM1032 1298v207h207v-207h-207z" />
-<glyph unicode="&#xfb04;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1505h207v-1505h-207z" />
-</font>
-</defs></svg> 
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.ttf b/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.ttf
deleted file mode 100644
Binary files a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.ttf and /dev/null differ
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.woff b/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.woff
deleted file mode 100644
Binary files a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic-webfont.woff and /dev/null differ
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic_license b/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic_license
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/lib/font/league_gothic_license
+++ /dev/null
@@ -1,2 +0,0 @@
-SIL Open Font License (OFL)
-http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/js/classList.js b/docs/slides/IHP14/_support/reveal.js/lib/js/classList.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/lib/js/classList.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
-if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p<o;p++){if(p in this&&this[p]===q){return p}}return -1},n=function(o,p){this.name=o;this.code=DOMException[o];this.message=p},g=function(p,o){if(o===""){throw new n("SYNTAX_ERR","An invalid or illegal string was specified")}if(/\s/.test(o)){throw new n("INVALID_CHARACTER_ERR","String contains an invalid character")}return c.call(p,o)},d=function(s){var r=k.call(s.className),q=r?r.split(/\s+/):[],p=0,o=q.length;for(;p<o;p++){this.push(q[p])}this._updateClassName=function(){s.className=this.toString()}},e=d[f]=[],i=function(){return new d(this)};n[f]=Error[f];e.item=function(o){return this[o]||null};e.contains=function(o){o+="";return g(this,o)!==-1};e.add=function(o){o+="";if(g(this,o)===-1){this.push(o);this._updateClassName()}};e.remove=function(p){p+="";var o=g(this,p);if(o!==-1){this.splice(o,1);this._updateClassName()}};e.toggle=function(o){o+="";if(g(this,o)===-1){this.add(o)}else{this.remove(o)}};e.toString=function(){return this.join(" ")};if(b.defineProperty){var l={get:i,enumerable:true,configurable:true};try{b.defineProperty(m,a,l)}catch(h){if(h.number===-2146823252){l.enumerable=false;b.defineProperty(m,a,l)}}}else{if(b[f].__defineGetter__){m.__defineGetter__(a,i)}}}(self))};
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/js/head.min.js b/docs/slides/IHP14/_support/reveal.js/lib/js/head.min.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/lib/js/head.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
-    Head JS     The only script in your <HEAD>
-    Copyright   Tero Piirainen (tipiirai)
-    License     MIT / http://bit.ly/mit-license
-    Version     0.96
-
-    http://headjs.com
-*/(function(a){function z(){d||(d=!0,s(e,function(a){p(a)}))}function y(c,d){var e=a.createElement("script");e.type="text/"+(c.type||"javascript"),e.src=c.src||c,e.async=!1,e.onreadystatechange=e.onload=function(){var a=e.readyState;!d.done&&(!a||/loaded|complete/.test(a))&&(d.done=!0,d())},(a.body||b).appendChild(e)}function x(a,b){if(a.state==o)return b&&b();if(a.state==n)return k.ready(a.name,b);if(a.state==m)return a.onpreload.push(function(){x(a,b)});a.state=n,y(a.url,function(){a.state=o,b&&b(),s(g[a.name],function(a){p(a)}),u()&&d&&s(g.ALL,function(a){p(a)})})}function w(a,b){a.state===undefined&&(a.state=m,a.onpreload=[],y({src:a.url,type:"cache"},function(){v(a)}))}function v(a){a.state=l,s(a.onpreload,function(a){a.call()})}function u(a){a=a||h;var b;for(var c in a){if(a.hasOwnProperty(c)&&a[c].state!=o)return!1;b=!0}return b}function t(a){return Object.prototype.toString.call(a)=="[object Function]"}function s(a,b){if(!!a){typeof a=="object"&&(a=[].slice.call(a));for(var c=0;c<a.length;c++)b.call(a,a[c],c)}}function r(a){var b;if(typeof a=="object")for(var c in a)a[c]&&(b={name:c,url:a[c]});else b={name:q(a),url:a};var d=h[b.name];if(d&&d.url===b.url)return d;h[b.name]=b;return b}function q(a){var b=a.split("/"),c=b[b.length-1],d=c.indexOf("?");return d!=-1?c.substring(0,d):c}function p(a){a._done||(a(),a._done=1)}var b=a.documentElement,c,d,e=[],f=[],g={},h={},i=a.createElement("script").async===!0||"MozAppearance"in a.documentElement.style||window.opera,j=window.head_conf&&head_conf.head||"head",k=window[j]=window[j]||function(){k.ready.apply(null,arguments)},l=1,m=2,n=3,o=4;i?k.js=function(){var a=arguments,b=a[a.length-1],c={};t(b)||(b=null),s(a,function(d,e){d!=b&&(d=r(d),c[d.name]=d,x(d,b&&e==a.length-2?function(){u(c)&&p(b)}:null))});return k}:k.js=function(){var a=arguments,b=[].slice.call(a,1),d=b[0];if(!c){f.push(function(){k.js.apply(null,a)});return k}d?(s(b,function(a){t(a)||w(r(a))}),x(r(a[0]),t(d)?d:function(){k.js.apply(null,b)})):x(r(a[0]));return k},k.ready=function(b,c){if(b==a){d?p(c):e.push(c);return k}t(b)&&(c=b,b="ALL");if(typeof b!="string"||!t(c))return k;var f=h[b];if(f&&f.state==o||b=="ALL"&&u()&&d){p(c);return k}var i=g[b];i?i.push(c):i=g[b]=[c];return k},k.ready(a,function(){u()&&s(g.ALL,function(a){p(a)}),k.feature&&k.feature("domloaded",!0)});if(window.addEventListener)a.addEventListener("DOMContentLoaded",z,!1),window.addEventListener("load",z,!1);else if(window.attachEvent){a.attachEvent("onreadystatechange",function(){a.readyState==="complete"&&z()});var A=1;try{A=window.frameElement}catch(B){}!A&&b.doScroll&&function(){try{b.doScroll("left"),z()}catch(a){setTimeout(arguments.callee,1);return}}(),window.attachEvent("onload",z)}!a.readyState&&a.addEventListener&&(a.readyState="loading",a.addEventListener("DOMContentLoaded",handler=function(){a.removeEventListener("DOMContentLoaded",handler,!1),a.readyState="complete"},!1)),setTimeout(function(){c=!0,s(f,function(a){a()})},300)})(document)
diff --git a/docs/slides/IHP14/_support/reveal.js/lib/js/html5shiv.js b/docs/slides/IHP14/_support/reveal.js/lib/js/html5shiv.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/lib/js/html5shiv.js
+++ /dev/null
@@ -1,7 +0,0 @@
-document.createElement('header');
-document.createElement('nav');
-document.createElement('section');
-document.createElement('article');
-document.createElement('aside');
-document.createElement('footer');
-document.createElement('hgroup');
diff --git a/docs/slides/IHP14/_support/reveal.js/package.json b/docs/slides/IHP14/_support/reveal.js/package.json
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "name": "reveal.js",
-  "version": "2.6.2",
-  "description": "The HTML Presentation Framework",
-  "homepage": "http://lab.hakim.se/reveal-js",
-  "subdomain": "revealjs",
-  "scripts": {
-    "test": "grunt test",
-    "start": ""
-  },
-  "author": {
-    "name": "Hakim El Hattab",
-    "email": "hakim.elhattab@gmail.com",
-    "web": "http://hakim.se"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hakimel/reveal.js.git"
-  },
-  "engines": {
-    "node": "~0.8.0"
-  },
-  "dependencies": {
-    "underscore": "~1.5.1",
-    "express": "~2.5.9",
-    "mustache": "~0.7.2",
-    "socket.io": "~0.9.13"
-  },
-  "devDependencies": {
-    "grunt-contrib-qunit": "~0.2.2",
-    "grunt-contrib-jshint": "~0.6.4",
-    "grunt-contrib-cssmin": "~0.4.1",
-    "grunt-contrib-uglify": "~0.2.4",
-    "grunt-contrib-watch": "~0.5.3",
-    "grunt-contrib-sass": "~0.5.0",
-    "grunt-contrib-connect": "~0.4.1",
-    "grunt-zip": "~0.7.0",
-    "grunt": "~0.4.0"
-  },
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "https://github.com/hakimel/reveal.js/blob/master/LICENSE"
-    }
-  ]
-}
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/highlight/highlight.js b/docs/slides/IHP14/_support/reveal.js/plugin/highlight/highlight.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/highlight/highlight.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// START CUSTOM REVEAL.JS INTEGRATION
-(function() {
-	if( typeof window.addEventListener === 'function' ) {
-		var hljs_nodes = document.querySelectorAll( 'pre code' );
-
-		for( var i = 0, len = hljs_nodes.length; i < len; i++ ) {
-			var element = hljs_nodes[i];
-
-			// trim whitespace if data-trim attribute is present
-			if( element.hasAttribute( 'data-trim' ) && typeof element.innerHTML.trim === 'function' ) {
-				element.innerHTML = element.innerHTML.trim();
-			}
-
-			// Now escape html unless prevented by author
-			if( ! element.hasAttribute( 'data-noescape' )) {
-				element.innerHTML = element.innerHTML.replace(/</g,"&lt;").replace(/>/g,"&gt;");
-			}
-
-			// re-highlight when focus is lost (for edited code)
-			element.addEventListener( 'focusout', function( event ) {
-				hljs.highlightBlock( event.currentTarget );
-			}, false );
-		}
-	}
-})();
-// END CUSTOM REVEAL.JS INTEGRATION
-
-// highlight.js build includes support for:
-// All languages in master + fsharp
-
-
-var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+(q.parentNode?q.parentNode.className:"")).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(r){function o(s){return(s&&s.source)||s}function p(t,s){return RegExp(o(t),"m"+(r.cI?"i":"")+(s?"g":""))}function q(z,x){if(z.compiled){return}z.compiled=true;var u=[];if(z.k){var s={};function A(B,t){t.split(" ").forEach(function(C){var D=C.split("|");s[D[0]]=[B,D[1]?Number(D[1]):1];u.push(D[0])})}z.lR=p(z.l||hljs.IR+"(?!\\.)",true);if(typeof z.k=="string"){A("keyword",z.k)}else{for(var y in z.k){if(!z.k.hasOwnProperty(y)){continue}A(y,z.k[y])}}z.k=s}if(x){if(z.bWK){z.b="\\b("+u.join("|")+")\\b(?!\\.)\\s*"}z.bR=p(z.b?z.b:"\\B|\\b");if(!z.e&&!z.eW){z.e="\\B|\\b"}if(z.e){z.eR=p(z.e)}z.tE=o(z.e)||"";if(z.eW&&x.tE){z.tE+=(z.e?"|":"")+x.tE}}if(z.i){z.iR=p(z.i)}if(z.r===undefined){z.r=1}if(!z.c){z.c=[]}for(var w=0;w<z.c.length;w++){if(z.c[w]=="self"){z.c[w]=z}q(z.c[w],z)}if(z.starts){q(z.starts,x)}var v=[];for(var w=0;w<z.c.length;w++){v.push(o(z.c[w].b))}if(z.tE){v.push(o(z.tE))}if(z.i){v.push(o(z.i))}z.t=v.length?p(v.join("|"),true):{exec:function(t){return null}}}q(r)}function d(E,F,C){function o(r,N){for(var M=0;M<N.c.length;M++){var L=N.c[M].bR.exec(r);if(L&&L.index==0){return N.c[M]}}}function s(L,r){if(L.e&&L.eR.test(r)){return L}if(L.eW){return s(L.parent,r)}}function t(r,L){return !C&&L.i&&L.iR.test(r)}function y(M,r){var L=G.cI?r[0].toLowerCase():r[0];return M.k.hasOwnProperty(L)&&M.k[L]}function H(){var L=l(w);if(!A.k){return L}var r="";var O=0;A.lR.lastIndex=0;var M=A.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=y(A,M);if(N){v+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=A.lR.lastIndex;M=A.lR.exec(L)}return r+L.substr(O)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function K(){return A.sL!==undefined?z():H()}function J(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){x+=L;w=""}else{if(M.eB){x+=l(r)+L;w=""}else{x+=L;w=r}}A=Object.create(M,{parent:{value:A}})}function D(L,r){w+=L;if(r===undefined){x+=K();return 0}var N=o(r,A);if(N){x+=K();J(N,r);return N.rB?0:r.length}var O=s(A,r);if(O){var M=A;if(!(M.rE||M.eE)){w+=r}x+=K();do{if(A.cN){x+="</span>"}B+=A.r;A=A.parent}while(A!=O.parent);if(M.eE){x+=l(r)}w="";if(O.starts){J(O.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw new Error('Illegal lexem "'+r+'" for mode "'+(A.cN||"<unnamed>")+'"')}w+=r;return r.length||1}var G=e[E];f(G);var A=G;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(F);if(!u){break}q=D(F.substr(p,u.index-p),u[0]);p=u.index+q}D(F.substr(p));return{r:B,keyword_count:v,value:x,language:E}}catch(I){if(I.message.indexOf("Illegal")!=-1){return{r:0,keyword_count:0,value:l(F)}}else{throw I}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s,false);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v,true):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES["1c"]=function(b){var f="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";var c="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";var e="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a],r:0};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функция)",e:"$",l:f,k:"процедура функция",c:[{cN:"title",b:f},{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"экспорт",eW:true,l:f,k:"экспорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}}(hljs);hljs.LANGUAGES.actionscript=function(a){var d="[a-zA-Z_$][a-zA-Z0-9_$]*";var c="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var e={cN:"rest_arg",b:"[.]{3}",e:d,r:10};var b={cN:"title",b:d};return{k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:"package",bWK:true,e:"{",k:"package",c:[b]},{cN:"class",bWK:true,e:"{",k:"class interface",c:[{bWK:true,k:"extends implements"},b]},{cN:"preprocessor",bWK:true,e:";",k:"import include"},{cN:"function",bWK:true,e:"[{;]",k:"function",i:"\\S",c:[b,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,e]},{cN:"type",b:":",e:c,r:10}]}]}}(hljs);hljs.LANGUAGES.apache=function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,k:{keyword:"acceptfilter acceptmutex acceptpathinfo accessfilename action addalt addaltbyencoding addaltbytype addcharset adddefaultcharset adddescription addencoding addhandler addicon addiconbyencoding addiconbytype addinputfilter addlanguage addmoduleinfo addoutputfilter addoutputfilterbytype addtype alias aliasmatch allow allowconnect allowencodedslashes allowoverride anonymous anonymous_logemail anonymous_mustgiveemail anonymous_nouserid anonymous_verifyemail authbasicauthoritative authbasicprovider authdbduserpwquery authdbduserrealmquery authdbmgroupfile authdbmtype authdbmuserfile authdefaultauthoritative authdigestalgorithm authdigestdomain authdigestnccheck authdigestnonceformat authdigestnoncelifetime authdigestprovider authdigestqop authdigestshmemsize authgroupfile authldapbinddn authldapbindpassword authldapcharsetconfig authldapcomparednonserver authldapdereferencealiases authldapgroupattribute authldapgroupattributeisdn authldapremoteuserattribute authldapremoteuserisdn authldapurl authname authnprovideralias authtype authuserfile authzdbmauthoritative authzdbmtype authzdefaultauthoritative authzgroupfileauthoritative authzldapauthoritative authzownerauthoritative authzuserauthoritative balancermember browsermatch browsermatchnocase bufferedlogs cachedefaultexpire cachedirlength cachedirlevels cachedisable cacheenable cachefile cacheignorecachecontrol cacheignoreheaders cacheignorenolastmod cacheignorequerystring cachelastmodifiedfactor cachemaxexpire cachemaxfilesize cacheminfilesize cachenegotiateddocs cacheroot cachestorenostore cachestoreprivate cgimapextension charsetdefault charsetoptions charsetsourceenc checkcaseonly checkspelling chrootdir contentdigest cookiedomain cookieexpires cookielog cookiename cookiestyle cookietracking coredumpdirectory customlog dav davdepthinfinity davgenericlockdb davlockdb davmintimeout dbdexptime dbdkeep dbdmax dbdmin dbdparams dbdpersist dbdpreparesql dbdriver defaulticon defaultlanguage defaulttype deflatebuffersize deflatecompressionlevel deflatefilternote deflatememlevel deflatewindowsize deny directoryindex directorymatch directoryslash documentroot dumpioinput dumpiologlevel dumpiooutput enableexceptionhook enablemmap enablesendfile errordocument errorlog example expiresactive expiresbytype expiresdefault extendedstatus extfilterdefine extfilteroptions fileetag filterchain filterdeclare filterprotocol filterprovider filtertrace forcelanguagepriority forcetype forensiclog gracefulshutdowntimeout group header headername hostnamelookups identitycheck identitychecktimeout imapbase imapdefault imapmenu include indexheadinsert indexignore indexoptions indexorderdefault indexstylesheet isapiappendlogtoerrors isapiappendlogtoquery isapicachefile isapifakeasync isapilognotsupported isapireadaheadbuffer keepalive keepalivetimeout languagepriority ldapcacheentries ldapcachettl ldapconnectiontimeout ldapopcacheentries ldapopcachettl ldapsharedcachefile ldapsharedcachesize ldaptrustedclientcert ldaptrustedglobalcert ldaptrustedmode ldapverifyservercert limitinternalrecursion limitrequestbody limitrequestfields limitrequestfieldsize limitrequestline limitxmlrequestbody listen listenbacklog loadfile loadmodule lockfile logformat loglevel maxclients maxkeepaliverequests maxmemfree maxrequestsperchild maxrequestsperthread maxspareservers maxsparethreads maxthreads mcachemaxobjectcount mcachemaxobjectsize mcachemaxstreamingbuffer mcacheminobjectsize mcacheremovalalgorithm mcachesize metadir metafiles metasuffix mimemagicfile minspareservers minsparethreads mmapfile mod_gzip_on mod_gzip_add_header_count mod_gzip_keep_workfiles mod_gzip_dechunk mod_gzip_min_http mod_gzip_minimum_file_size mod_gzip_maximum_file_size mod_gzip_maximum_inmem_size mod_gzip_temp_dir mod_gzip_item_include mod_gzip_item_exclude mod_gzip_command_version mod_gzip_can_negotiate mod_gzip_handle_methods mod_gzip_static_suffix mod_gzip_send_vary mod_gzip_update_static modmimeusepathinfo multiviewsmatch namevirtualhost noproxy nwssltrustedcerts nwsslupgradeable options order passenv pidfile protocolecho proxybadheader proxyblock proxydomain proxyerroroverride proxyftpdircharset proxyiobuffersize proxymaxforwards proxypass proxypassinterpolateenv proxypassmatch proxypassreverse proxypassreversecookiedomain proxypassreversecookiepath proxypreservehost proxyreceivebuffersize proxyremote proxyremotematch proxyrequests proxyset proxystatus proxytimeout proxyvia readmename receivebuffersize redirect redirectmatch redirectpermanent redirecttemp removecharset removeencoding removehandler removeinputfilter removelanguage removeoutputfilter removetype requestheader require rewritebase rewritecond rewriteengine rewritelock rewritelog rewriteloglevel rewritemap rewriteoptions rewriterule rlimitcpu rlimitmem rlimitnproc satisfy scoreboardfile script scriptalias scriptaliasmatch scriptinterpretersource scriptlog scriptlogbuffer scriptloglength scriptsock securelisten seerequesttail sendbuffersize serveradmin serveralias serverlimit servername serverpath serverroot serversignature servertokens setenv setenvif setenvifnocase sethandler setinputfilter setoutputfilter ssienableaccess ssiendtag ssierrormsg ssistarttag ssitimeformat ssiundefinedecho sslcacertificatefile sslcacertificatepath sslcadnrequestfile sslcadnrequestpath sslcarevocationfile sslcarevocationpath sslcertificatechainfile sslcertificatefile sslcertificatekeyfile sslciphersuite sslcryptodevice sslengine sslhonorciperorder sslmutex ssloptions sslpassphrasedialog sslprotocol sslproxycacertificatefile sslproxycacertificatepath sslproxycarevocationfile sslproxycarevocationpath sslproxyciphersuite sslproxyengine sslproxymachinecertificatefile sslproxymachinecertificatepath sslproxyprotocol sslproxyverify sslproxyverifydepth sslrandomseed sslrequire sslrequiressl sslsessioncache sslsessioncachetimeout sslusername sslverifyclient sslverifydepth startservers startthreads substitute suexecusergroup threadlimit threadsperchild threadstacksize timeout traceenable transferlog typesconfig unsetenv usecanonicalname usecanonicalphysicalport user userdir virtualdocumentroot virtualdocumentrootip virtualscriptalias virtualscriptaliasip win32disableacceptex xbithack",literal:"on off"},c:[a.HCM,{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,{cN:"tag",b:"</?",e:">"},a.QSM]}}(hljs);hljs.LANGUAGES.applescript=function(a){var b=a.inherit(a.QSM,{i:""});var e={cN:"title",b:a.UIR};var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bWK:true,k:"on",i:"[${=;\\n]",c:[e,d]}].concat(c),i:"//"}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);hljs.LANGUAGES.asciidoc=function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{4,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}}(hljs);hljs.LANGUAGES.avrasm=function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$"},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}}(hljs);hljs.LANGUAGES.axapta=function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"{",i:":",k:"class interface",c:[{cN:"inheritance",bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]}]}}(hljs);hljs.LANGUAGES.bash=function(a){var c={cN:"variable",b:/\$[\w\d#@][\w\d_]*/};var b={cN:"variable",b:/\$\{(.*?)\}/};var e={cN:"string",b:/"/,e:/"/,c:[a.BE,c,b,{cN:"variable",b:/\$\(/,e:/\)/,c:a.BE}],r:0};var d={cN:"string",b:/'/,e:/'/,r:0};return{l:/-?[a-z]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[{cN:"title",b:/\w[\w\d_]*/}],r:0},a.HCM,a.NM,e,d,c,b]}}(hljs);hljs.LANGUAGES.brainfuck=function(a){return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",eE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]"},{cN:"literal",b:"[\\+\\-]"}]}}(hljs);hljs.LANGUAGES.clojure=function(l){var e={built_in:"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for doseq dosync dotimes and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import intern refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! import use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if throw printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time ns assert re-find re-groups rand-int rand mod locking assert-valid-fdecl alias namespace resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! memfn to-array future future-call into-array aset gen-class reduce merge map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j={cN:"string",b:'"',e:'"',c:[l.BE],r:0};var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:"\\S",c:[o,m]}}(hljs);hljs.LANGUAGES.cmake=function(a){return{cI:true,k:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file",c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}}(hljs);hljs.LANGUAGES.coffeescript=function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f={cN:"title",b:a};var e={cN:"subst",b:"#\\{",e:"}",k:b,};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",b:"'''",e:"'''",c:[c.BE]},{cN:"string",b:"'",e:"'",c:[c.BE],r:0},{cN:"string",b:'"""',e:'"""',c:[c.BE,e]},{cN:"string",b:'"',e:'"',c:[c.BE,e],r:0},{cN:"regexp",b:"///",e:"///",c:[c.HCM]},{cN:"regexp",b:"//[gim]*",r:0},{cN:"regexp",b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bWK:true,k:"class",e:"$",i:"[:\\[\\]]",c:[{bWK:true,k:"extends",eW:true,i:":",c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true}])}}(hljs);hljs.LANGUAGES.cpp=function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.css=function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.d=function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?',r:0};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}}(hljs);hljs.LANGUAGES.delphi=function(b){var f="and safecall cdecl then string exports library not pascal set virtual file in array label packed end. index while const raise for to implementation with except overload destructor downto finally program exit unit inherited override if type until function do begin repeat goto nil far initialization object else var uses external resourcestring interface end finalization class asm mod case on shr shl of register xorwrite threadvar try record near stored constructor stdcall inline div out or procedure";var e="safecall stdcall pascal stored const implementation finalization except to finally program inherited override then exports string read not mod shr try div shl set library message packed index for near overload label downto exit public goto interface asm on of constructor or private array unit raise destructor var type until function else external with case default record while protected property procedure published and cdecl do threadvar file in if end virtual write far out begin repeat nil initialization object uses resourcestring class register xorwrite inline static";var a={cN:"comment",b:"{",e:"}",r:0};var g={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}],r:0};var d={cN:"string",b:"(#\\d+)+"};var h={cN:"function",bWK:true,e:"[:;]",k:"function constructor|10 destructor|10 procedure|10",c:[{cN:"title",b:b.IR},{cN:"params",b:"\\(",e:"\\)",k:f,c:[c,d]},a,g]};return{cI:true,k:f,i:'("|\\$[G-Zg-z]|\\/\\*|</)',c:[a,g,b.CLCM,c,d,b.NM,h,{cN:"class",b:"=\\bclass\\b",e:"end;",k:e,c:[c,d,a,g,b.CLCM,h]}]}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.django=function(c){function e(h,g){return(g==undefined||(!h.cN&&g.cN=="tag")||h.cN=="value")}function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}if(e(l,k)){m=b.concat(m)}if(m.length){g.c=m}}return g}var d={cN:"filter",b:"\\|[A-Za-z]+\\:?",k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:'"',e:'"'}]};var b=[{cN:"template_comment",b:"{%\\s*comment\\s*%}",e:"{%\\s*endcomment\\s*%}"},{cN:"template_comment",b:"{#",e:"#}"},{cN:"template_tag",b:"{%",e:"%}",k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[d]},{cN:"variable",b:"{{",e:"}}",c:[d]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.dos=function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}}(hljs);hljs.LANGUAGES["erlang-repl"]=function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}}(hljs);hljs.LANGUAGES.erlang=function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#",e:"}",i:".",r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",eW:true,r:0}]};var k={k:f,b:"(fun|receive|if|try|case)",e:"end"};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(</|\\*=|\\+=|-=|/=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+c+"\\s*\\(",e:"->",rB:true,i:"\\(|#|//|/\\*|\\\\|:",c:[d,{cN:"title",b:c}],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}}(hljs);hljs.LANGUAGES.fsharp=function(a){var b="'[a-zA-Z0-9_]+";return{k:"yield! return! let! do!abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun|10 function global if in inherit inline interface internal lazy let match member module mutable|10 namespace new null of open or override private public rec|10 return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"//",e:"$",rB:true},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bWK:true,e:"\\(|=|$",k:"type",c:[{cN:"title",b:a.UIR}]},{cN:"annotation",b:"\\[<",e:">\\]",r:10},{cN:"typeparam",b:"<",e:">",c:[{cN:"title",b:b}]},a.CLCM,a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}}(hljs);hljs.LANGUAGES.glsl=function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}}(hljs);hljs.LANGUAGES.go=function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"string",b:"`",e:"`"},{cN:"number",b:"[^a-zA-Z_0-9](\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?",r:0},a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.haml=function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(-#|/).*$",r:0},{b:"^\\s*-(?!#)",starts:{e:"\\n",sL:"ruby"},r:0},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+",r:0},{cN:"value",b:"[#\\.]\\w+",r:0},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,r:0,c:[{cN:"symbol",b:":\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,r:0,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0}],r:10},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"},r:0}]}}(hljs);hljs.LANGUAGES.handlebars=function(c){function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}m=d.concat(m);if(m.length){g.c=m}}return g}var b="each in with if else unless bindattr action collection debugger log outlet template unbound view yield";var e={cN:"variable",b:"[a-zA-Z.]+",k:b};var d=[{cN:"expression",b:"{{",e:"}}",c:[{cN:"begin-block",b:"#[a-zA-Z .]+",k:b},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z .]+",k:b},{cN:"variable",b:"[a-zA-Z.]+",k:b}]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.haskell=function(a){var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},{cN:"title",b:"[_a-z][\\w']*"}]};var b={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance not as foreign ccall safe unsafe",c:[{cN:"comment",b:"--",e:"$"},{cN:"preprocessor",b:"{-#",e:"#-}"},{cN:"comment",c:["self"],b:"{-",e:"-}"},{cN:"string",b:"\\s+'",e:"'",c:[a.BE],r:0},a.QSM,{cN:"import",b:"\\bimport",e:"$",k:"import qualified as hiding",c:[c],i:"\\W\\.|;"},{cN:"module",b:"\\bmodule",e:"where",k:"module where",c:[c],i:"\\W\\.|;"},{cN:"class",b:"\\b(class|instance)",e:"where",k:"class where instance",c:[d]},{cN:"typedef",b:"\\b(data|(new)?type)",e:"$",k:"data type newtype deriving",c:[d,c,b]},a.CNM,{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},d,{cN:"title",b:"^[_a-z][\\w']*"},{b:"->|<-"}]}}(hljs);hljs.LANGUAGES.http=function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}}(hljs);hljs.LANGUAGES.ini=function(a){return{cI:true,i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}}(hljs);hljs.LANGUAGES.java=function(a){return{k:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,{cN:"class",bWK:true,e:"{",k:"class interface",eE:true,i:":",c:[{bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,sL:"xml"}],r:0},{cN:"function",bWK:true,e:/{/,k:"function",c:[{cN:"title",b:/[A-Za-z$_][0-9A-Za-z$_]*/},{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);hljs.LANGUAGES.lasso=function(b){var a="[a-zA-Z_][a-zA-Z0-9_.]*|&[lg]t;";var c="<\\?(lasso(script)?|=)";return{cI:true,l:a,k:{literal:"true false none minimal full all infinity nan and or not bw ew cn lt lte gt gte eq neq ft rx nrx",built_in:"array date decimal duration integer map pair string tag xml null list queue set stack staticarray local var variable data global self inherited void",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require skip split_thread sum take thread to trait type where with yield"},c:[{cN:"preprocessor",b:"\\]|\\?>",r:0,starts:{cN:"markup",e:"\\[|"+c,rE:true}},{cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true}},{cN:"preprocessor",b:"\\[no_square_brackets|\\[/noprocess|"+c},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10},b.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},b.CBLCLM,b.CNM,b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",b:"#\\d+|[#$]"+a},{cN:"tag",b:"::",e:a},{cN:"attribute",b:"\\.\\.\\.|-"+b.UIR},{cN:"class",bWK:true,k:"define",eE:true,e:"\\(|=>",c:[{cN:"title",b:b.UIR+"=?"}]}]}}(hljs);hljs.LANGUAGES.lisp=function(i){var l="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var m="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var k={cN:"shebang",b:"^#!",e:"$"};var a={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d=[{cN:"number",b:m},{cN:"number",b:"#b[0-1]+(/[0-1]+)?"},{cN:"number",b:"#o[0-7]+(/[0-7]+)?"},{cN:"number",b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{cN:"number",b:"#c\\("+m+" +"+m,e:"\\)"}];var h={cN:"string",b:'"',e:'"',c:[i.BE],r:0};var n={cN:"comment",b:";",e:"$"};var g={cN:"variable",b:"\\*",e:"\\*"};var o={cN:"keyword",b:"[:&]"+l};var b={b:"\\(",e:"\\)",c:["self",a,h].concat(d)};var e={cN:"quoted",b:"['`]\\(",e:"\\)",c:d.concat([h,g,o,b])};var c={cN:"quoted",b:"\\(quote ",e:"\\)",k:{title:"quote"},c:d.concat([h,g,o,b])};var j={cN:"list",b:"\\(",e:"\\)"};var f={eW:true,r:0};j.c=[{cN:"title",b:l},f];f.c=[e,c,j,a].concat(d).concat([h,n,g,o]);return{i:"[^\\s]",c:d.concat([k,a,h,n,e,c,j])}}(hljs);hljs.LANGUAGES.lua=function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bWK:true,e:"\\)",k:"function",c:[{cN:"title",b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"},{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}}(hljs);hljs.LANGUAGES.markdown=function(a){return{c:[{cN:"header",b:"^#{1,3}",e:"$"},{cN:"header",b:"^.+?\\n[=-]{2,}$"},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",b:"\\*.+?\\*"},{cN:"emphasis",b:"_.+?_",r:0},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",b:"`.+?`"},{cN:"code",b:"^    ",e:"$",r:0},{cN:"horizontal_rule",b:"^-{3,}",e:"$"},{b:"\\[.+?\\]\\(.+?\\)",rB:true,c:[{cN:"link_label",b:"\\[.+\\]"},{cN:"link_url",b:"\\(",e:"\\)",eB:true,eE:true}]}]}}(hljs);hljs.LANGUAGES.matlab=function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bWK:true,e:"$",k:"function",c:[{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:""},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b},{cN:"comment",b:"\\%",e:"$"}].concat(b)}}(hljs);hljs.LANGUAGES.mel=function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:"</",c:[a.CNM,a.ASM,a.QSM,{cN:"string",b:"`",e:"`",c:[a.BE]},{cN:"variable",b:"\\$\\d",r:5},{cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)"},a.CLCM,a.CBLCLM]}}(hljs);hljs.LANGUAGES.mizar=function(a){return{k:["environ vocabularies notations constructors definitions registrations theorems schemes requirements","begin end definition registration cluster existence pred func defpred deffunc theorem proof","let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from","be being by means equals implies iff redefine define now not or attr is mode suppose per cases set","thesis contradiction scheme reserve struct","correctness compatibility coherence symmetry assymetry reflexivity irreflexivity","connectedness uniqueness commutativity idempotence involutiveness projectivity"].join(" "),c:[{cN:"comment",b:"::",e:"$"}]}}(hljs);hljs.LANGUAGES.nginx=function(b){var c=[{cN:"variable",b:"\\$\\d+"},{cN:"variable",b:"\\${",e:"}"},{cN:"variable",b:"[\\$\\@]"+b.UIR}];var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[b.HCM,{cN:"string",b:'"',e:'"',c:[b.BE].concat(c),r:0},{cN:"string",b:"'",e:"'",c:[b.BE].concat(c),r:0},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",b:"\\s\\^",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"~\\*?\\s+",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"\\*(\\.[a-z\\-]+)+",c:[b.BE].concat(c)},{cN:"regexp",b:"([a-z\\-]+\\.)+\\*",c:[b.BE].concat(c)},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0}].concat(c)};return{c:[b.HCM,{b:b.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:b.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}}(hljs);hljs.LANGUAGES.objectivec=function(a){var b={keyword:"int float while private char catch export sizeof typedef const struct for union unsigned long volatile static protected bool mutable if public do return goto void enum else break extern asm case short default double throw register explicit signed typename try this switch continue wchar_t inline readonly assign property self synchronized end synthesize id optional required nonatomic super unichar finally dynamic IBOutlet IBAction selector strong weak readonly",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"({|$)",k:"interface class protocol implementation",c:[{cN:"id",b:a.UIR}]},{cN:"variable",b:"\\."+a.UIR,r:0}]}}(hljs);hljs.LANGUAGES.parser3=function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}}(hljs);hljs.LANGUAGES.perl=function(e){var a="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var d={cN:"subst",b:"[$@]\\{",e:"\\}",k:a,r:10};var b={cN:"variable",b:"\\$\\d"};var i={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var f=[e.BE,d,b,i];var h={b:"->",c:[{b:e.IR},{b:"{",e:"}"}]};var g={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var c=[b,i,e.HCM,g,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},h,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:f,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:f,r:5},{cN:"string",b:"'",e:"'",c:[e.BE],r:0},{cN:"string",b:'"',e:'"',c:f,r:0},{cN:"string",b:"`",e:"`",c:[e.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"("+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,g,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bWK:true,e:"(\\s*\\(.*?\\))?[;{]",k:"sub",r:5},{cN:"operator",b:"-\\w\\b",r:0}];d.c=c;h.c[1].c=c;return{k:a,c:c}}(hljs);hljs.LANGUAGES.php=function(a){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var b=[a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),{cN:"string",b:'b"',e:'"',c:[a.BE]},{cN:"string",b:"b'",e:"'",c:[a.BE]}];var c=[a.BNM,a.CNM];var d={cN:"title",b:a.UIR};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return implements parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception php_user_filter default die require __FUNCTION__ enddeclare final try this switch continue endfor endif declare unset true false namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ __halt_compiler",c:[a.CLCM,a.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"}]},{cN:"comment",eB:true,b:"__halt_compiler.+?;",eW:true},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[a.BE]},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"},e,{cN:"function",bWK:true,e:"{",k:"function",i:"\\$|\\[|%",c:[d,{cN:"params",b:"\\(",e:"\\)",c:["self",e,a.CBLCLM].concat(b).concat(c)}]},{cN:"class",bWK:true,e:"{",k:"class",i:"[:\\(\\$]",c:[{bWK:true,eW:true,k:"extends",c:[d]},d]},{b:"=>"}].concat(b).concat(c)}}(hljs);hljs.LANGUAGES.profile=function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[{cN:"title",b:a.UIR,r:0}],r:0}]}}(hljs);hljs.LANGUAGES.python=function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var c=[{cN:"string",b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{cN:"string",b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{cN:"string",b:/(u|r|ur)'/,e:/'/,c:[a.BE],r:10},{cN:"string",b:/(u|r|ur)"/,e:/"/,c:[a.BE],r:10},{cN:"string",b:/(b|br)'/,e:/'/,c:[a.BE]},{cN:"string",b:/(b|br)"/,e:/"/,c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:/\(/,e:/\)/,c:["self",a.CNM,f].concat(c)};var b={bWK:true,e:/:/,i:/[${=;\n]/,c:[e,d],r:10};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10",built_in:"None True False Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:c.concat([f,a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}])}}(hljs);hljs.LANGUAGES.r=function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[a.BE],r:0},{cN:"string",b:"'",e:"'",c:[a.BE],r:0}]}}(hljs);hljs.LANGUAGES.rib=function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"</",c:[a.HCM,a.CNM,a.ASM,a.QSM]}}(hljs);hljs.LANGUAGES.rsl=function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"shader",bWK:true,e:"\\(",k:"surface displacement light volume imager"},{cN:"shading",bWK:true,e:"\\(",k:"illuminate illuminance gather"}]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.ruleslanguage=function(a){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEMASK|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN DELETE SAVE SAVE_UPDATE CLEAR DETERMINANT LABEL REPORT REVENUE ABORT CALL DONE LEAVE EACH IN LIST NOVALUE FROM TOTAL CHARGE BLOCK AND OR CSV_FILE BILL_PERIOD RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM ABORT WARN NUMDAYS RATE_CODE READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"array",b:"#[a-zA-Z .]+"}]}}(hljs);hljs.LANGUAGES.rust=function(b){var d={cN:"title",b:b.UIR};var c={cN:"number",b:"\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\.[0-9_]+)?([uif](8|16|32|64)?)?)",r:0};var a="assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while";return{k:a,i:"</",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:"function",bWK:true,e:"(\\(|<)",k:"fn",c:[d]},{cN:"preprocessor",b:"#\\[",e:"\\]"},{bWK:true,e:"(=|<)",k:"type",c:[d],i:"\\S"},{bWK:true,e:"({|<)",k:"trait enum",c:[d],i:"\\S"}]}}(hljs);hljs.LANGUAGES.scala=function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,b,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bWK:true,k:"extends with",r:10},{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}}(hljs);hljs.LANGUAGES.scss=function(a){var c="[a-zA-Z-][a-zA-Z0-9_-]*";var d={cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};var b={cN:"hexcolor",b:"#[0-9A-Fa-f]+"};var e={cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"important",b:"!important"}]}};return{cI:true,i:"[=/|']",c:[a.CLCM,a.CBLCLM,{cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]},{cN:"id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{cN:"pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{cN:"value",b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{cN:"value",b:":",e:";",c:[b,a.NM,a.QSM,a.ASM,{cN:"important",b:"!important"}]},{cN:"at_rule",b:"@",e:"[{;]",k:"mixin include for extend charset import media page font-face namespace",c:[d,a.QSM,a.ASM,b,a.NM,{cN:"preprocessor",b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}}(hljs);hljs.LANGUAGES.smalltalk=function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"',r:0},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":"},a.CNM,c,d,{cN:"localvars",b:"\\|\\s*"+b+"(\\s+"+b+")*\\s*\\|"},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}}(hljs);hljs.LANGUAGES.sql=function(a){return{cI:true,c:[{cN:"operator",b:"(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}],r:0},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}}(hljs);hljs.LANGUAGES.tex=function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}}(hljs);hljs.LANGUAGES.vala=function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bWK:true,e:"{",k:"class interface delegate namespace",i:"[^,:\\n\\s\\.]",c:[{cN:"title",b:a.UIR}]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}}(hljs);hljs.LANGUAGES.vbnet=function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"(//|endif|gosub|variant|wend)",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}}(hljs);hljs.LANGUAGES.vbscript=function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$"},a.CNM]}}(hljs);hljs.LANGUAGES.vhdl=function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/leap/leap.js b/docs/slides/IHP14/_support/reveal.js/plugin/leap/leap.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/leap/leap.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2013, Leap Motion, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Version 0.2.0 - http://js.leapmotion.com/0.2.0/leap.min.js
- * Grab latest versions from http://js.leapmotion.com/
- */
-
-!function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i}({1:[function(require,module,exports){var chooseProtocol=require("./protocol").chooseProtocol,EventEmitter=require("events").EventEmitter,_=require("underscore");var BaseConnection=module.exports=function(opts){this.opts=_.defaults(opts||{},{host:"127.0.0.1",enableGestures:false,port:6437,enableHeartbeat:true,heartbeatInterval:100,requestProtocolVersion:3});this.host=opts.host;this.port=opts.port;this.on("ready",function(){this.enableGestures(this.opts.enableGestures);if(this.opts.enableHeartbeat)this.startHeartbeat()});this.on("disconnect",function(){if(this.opts.enableHeartbeat)this.stopHeartbeat()});this.heartbeatTimer=null};BaseConnection.prototype.getUrl=function(){return"ws://"+this.host+":"+this.port+"/v"+this.opts.requestProtocolVersion+".json"};BaseConnection.prototype.sendHeartbeat=function(){if(this.protocol){this.setHeartbeatState(true);this.protocol.sendHeartbeat(this)}};BaseConnection.prototype.handleOpen=function(){this.emit("connect")};BaseConnection.prototype.enableGestures=function(enabled){this.gesturesEnabled=enabled?true:false;this.send(this.protocol.encode({enableGestures:this.gesturesEnabled}))};BaseConnection.prototype.handleClose=function(){this.disconnect();this.startReconnection()};BaseConnection.prototype.startReconnection=function(){var connection=this;setTimeout(function(){connection.connect()},1e3)};BaseConnection.prototype.disconnect=function(){if(!this.socket)return;this.socket.close();delete this.socket;delete this.protocol;this.emit("disconnect")};BaseConnection.prototype.handleData=function(data){var message=JSON.parse(data);var messageEvent;if(this.protocol===undefined){messageEvent=this.protocol=chooseProtocol(message);this.emit("ready")}else{messageEvent=this.protocol(message)}this.emit(messageEvent.type,messageEvent)};BaseConnection.prototype.connect=function(){if(this.socket)return;this.socket=this.setupSocket();return true};BaseConnection.prototype.send=function(data){this.socket.send(data)};BaseConnection.prototype.stopHeartbeat=function(){if(!this.heartbeatTimer)return;clearInterval(this.heartbeatTimer);delete this.heartbeatTimer;this.setHeartbeatState(false)};BaseConnection.prototype.setHeartbeatState=function(state){if(this.heartbeatState===state)return;this.heartbeatState=state;this.emit(this.heartbeatState?"focus":"blur")};_.extend(BaseConnection.prototype,EventEmitter.prototype)},{"./protocol":12,events:17,underscore:20}],2:[function(require,module,exports){var CircularBuffer=module.exports=function(size){this.pos=0;this._buf=[];this.size=size};CircularBuffer.prototype.get=function(i){if(i==undefined)i=0;if(i>=this.size)return undefined;if(i>=this._buf.length)return undefined;return this._buf[(this.pos-i-1)%this.size]};CircularBuffer.prototype.push=function(o){this._buf[this.pos%this.size]=o;return this.pos++}},{}],3:[function(require,module,exports){var Connection=module.exports=require("./base_connection");Connection.prototype.setupSocket=function(){var connection=this;var socket=new WebSocket(this.getUrl());socket.onopen=function(){connection.handleOpen()};socket.onmessage=function(message){connection.handleData(message.data)};socket.onclose=function(){connection.handleClose()};return socket};Connection.prototype.startHeartbeat=function(){if(!this.protocol.sendHeartbeat||this.heartbeatTimer)return;var connection=this;var propertyName=null;if(typeof document.hidden!=="undefined"){propertyName="hidden"}else if(typeof document.mozHidden!=="undefined"){propertyName="mozHidden"}else if(typeof document.msHidden!=="undefined"){propertyName="msHidden"}else if(typeof document.webkitHidden!=="undefined"){propertyName="webkitHidden"}else{propertyName=undefined}var windowVisible=true;var focusListener=window.addEventListener("focus",function(e){windowVisible=true});var blurListener=window.addEventListener("blur",function(e){windowVisible=false});this.on("disconnect",function(){if(connection.heartbeatTimer){clearTimeout(connection.heartbeatTimer);delete connection.heartbeatTimer}window.removeEventListener(focusListener);window.removeEventListener(blurListener)});this.heartbeatTimer=setInterval(function(){var isVisible=propertyName===undefined?true:document[propertyName]===false;if(isVisible&&windowVisible){connection.sendHeartbeat()}else{connection.setHeartbeatState(false)}},this.opts.heartbeatInterval)}},{"./base_connection":1}],4:[function(require,module,exports){!function(process){var Frame=require("./frame"),CircularBuffer=require("./circular_buffer"),Pipeline=require("./pipeline"),EventEmitter=require("events").EventEmitter,gestureListener=require("./gesture").gestureListener,_=require("underscore");var Controller=module.exports=function(opts){var inNode=typeof process!=="undefined"&&process.title==="node";opts=_.defaults(opts||{},{inNode:inNode});this.inNode=opts.inNode;opts=_.defaults(opts||{},{frameEventName:this.useAnimationLoop()?"animationFrame":"deviceFrame",supressAnimationLoop:false});this.supressAnimationLoop=opts.supressAnimationLoop;this.frameEventName=opts.frameEventName;this.history=new CircularBuffer(200);this.lastFrame=Frame.Invalid;this.lastValidFrame=Frame.Invalid;this.lastConnectionFrame=Frame.Invalid;this.accumulatedGestures=[];if(opts.connectionType===undefined){this.connectionType=this.inBrowser()?require("./connection"):require("./node_connection")}else{this.connectionType=opts.connectionType}this.connection=new this.connectionType(opts);this.setupConnectionEvents()};Controller.prototype.gesture=function(type,cb){var creator=gestureListener(this,type);if(cb!==undefined){creator.stop(cb)}return creator};Controller.prototype.inBrowser=function(){return!this.inNode};Controller.prototype.useAnimationLoop=function(){return this.inBrowser()&&typeof chrome==="undefined"};Controller.prototype.connect=function(){var controller=this;if(this.connection.connect()&&this.inBrowser()&&!controller.supressAnimationLoop){var callback=function(){controller.emit("animationFrame",controller.lastConnectionFrame);window.requestAnimFrame(callback)};window.requestAnimFrame(callback)}};Controller.prototype.disconnect=function(){this.connection.disconnect()};Controller.prototype.frame=function(num){return this.history.get(num)||Frame.Invalid};Controller.prototype.loop=function(callback){switch(callback.length){case 1:this.on(this.frameEventName,callback);break;case 2:var controller=this;var scheduler=null;var immediateRunnerCallback=function(frame){callback(frame,function(){if(controller.lastFrame!=frame){immediateRunnerCallback(controller.lastFrame)}else{controller.once(controller.frameEventName,immediateRunnerCallback)}})};this.once(this.frameEventName,immediateRunnerCallback);break}this.connect()};Controller.prototype.addStep=function(step){if(!this.pipeline)this.pipeline=new Pipeline(this);this.pipeline.addStep(step)};Controller.prototype.processFrame=function(frame){if(frame.gestures){this.accumulatedGestures=this.accumulatedGestures.concat(frame.gestures)}if(this.pipeline){frame=this.pipeline.run(frame);if(!frame)frame=Frame.Invalid}this.lastConnectionFrame=frame;this.emit("deviceFrame",frame)};Controller.prototype.processFinishedFrame=function(frame){this.lastFrame=frame;if(frame.valid){this.lastValidFrame=frame}frame.controller=this;frame.historyIdx=this.history.push(frame);if(frame.gestures){frame.gestures=this.accumulatedGestures;this.accumulatedGestures=[];for(var gestureIdx=0;gestureIdx!=frame.gestures.length;gestureIdx++){this.emit("gesture",frame.gestures[gestureIdx],frame)}}this.emit("frame",frame)};Controller.prototype.setupConnectionEvents=function(){var controller=this;this.connection.on("frame",function(frame){controller.processFrame(frame)});this.on(this.frameEventName,function(frame){controller.processFinishedFrame(frame)});this.connection.on("disconnect",function(){controller.emit("disconnect")});this.connection.on("ready",function(){controller.emit("ready")});this.connection.on("connect",function(){controller.emit("connect")});this.connection.on("focus",function(){controller.emit("focus")});this.connection.on("blur",function(){controller.emit("blur")});this.connection.on("protocol",function(protocol){controller.emit("protocol",protocol)});this.connection.on("deviceConnect",function(evt){controller.emit(evt.state?"deviceConnected":"deviceDisconnected")})};_.extend(Controller.prototype,EventEmitter.prototype)}(require("__browserify_process"))},{"./circular_buffer":2,"./connection":3,"./frame":5,"./gesture":6,"./node_connection":16,"./pipeline":10,__browserify_process:18,events:17,underscore:20}],5:[function(require,module,exports){var Hand=require("./hand"),Pointable=require("./pointable"),createGesture=require("./gesture").createGesture,glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,InteractionBox=require("./interaction_box"),_=require("underscore");var Frame=module.exports=function(data){this.valid=true;this.id=data.id;this.timestamp=data.timestamp;this.hands=[];this.handsMap={};this.pointables=[];this.tools=[];this.fingers=[];if(data.interactionBox){this.interactionBox=new InteractionBox(data.interactionBox)}this.gestures=[];this.pointablesMap={};this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.data=data;this.type="frame";this.currentFrameRate=data.currentFrameRate;var handMap={};for(var handIdx=0,handCount=data.hands.length;handIdx!=handCount;handIdx++){var hand=new Hand(data.hands[handIdx]);hand.frame=this;this.hands.push(hand);this.handsMap[hand.id]=hand;handMap[hand.id]=handIdx}for(var pointableIdx=0,pointableCount=data.pointables.length;pointableIdx!=pointableCount;pointableIdx++){var pointable=new Pointable(data.pointables[pointableIdx]);pointable.frame=this;this.pointables.push(pointable);this.pointablesMap[pointable.id]=pointable;(pointable.tool?this.tools:this.fingers).push(pointable);if(pointable.handId!==undefined&&handMap.hasOwnProperty(pointable.handId)){var hand=this.hands[handMap[pointable.handId]];hand.pointables.push(pointable);(pointable.tool?hand.tools:hand.fingers).push(pointable)}}if(data.gestures){for(var gestureIdx=0,gestureCount=data.gestures.length;gestureIdx!=gestureCount;gestureIdx++){this.gestures.push(createGesture(data.gestures[gestureIdx]))}}};Frame.prototype.tool=function(id){var pointable=this.pointable(id);return pointable.tool?pointable:Pointable.Invalid};Frame.prototype.pointable=function(id){return this.pointablesMap[id]||Pointable.Invalid};Frame.prototype.finger=function(id){var pointable=this.pointable(id);return!pointable.tool?pointable:Pointable.Invalid};Frame.prototype.hand=function(id){return this.handsMap[id]||Hand.Invalid};Frame.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Frame.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceFrame._rotation[5],this._rotation[2]-sinceFrame._rotation[6],this._rotation[3]-sinceFrame._rotation[1]])};Frame.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);return mat3.multiply(mat3.create(),sinceFrame._rotation,transpose)};Frame.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;return Math.exp(this._scaleFactor-sinceFrame._scaleFactor)};Frame.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.subtract(vec3.create(),this._translation,sinceFrame._translation)};Frame.prototype.toString=function(){var str="Frame [ id:"+this.id+" | timestamp:"+this.timestamp+" | Hand count:("+this.hands.length+") | Pointable count:("+this.pointables.length+")";if(this.gestures)str+=" | Gesture count:("+this.gestures.length+")";str+=" ]";return str};Frame.prototype.dump=function(){var out="";out+="Frame Info:<br/>";out+=this.toString();out+="<br/><br/>Hands:<br/>";for(var handIdx=0,handCount=this.hands.length;handIdx!=handCount;handIdx++){out+="  "+this.hands[handIdx].toString()+"<br/>"}out+="<br/><br/>Pointables:<br/>";for(var pointableIdx=0,pointableCount=this.pointables.length;pointableIdx!=pointableCount;pointableIdx++){out+="  "+this.pointables[pointableIdx].toString()+"<br/>"}if(this.gestures){out+="<br/><br/>Gestures:<br/>";for(var gestureIdx=0,gestureCount=this.gestures.length;gestureIdx!=gestureCount;gestureIdx++){out+="  "+this.gestures[gestureIdx].toString()+"<br/>"}}out+="<br/><br/>Raw JSON:<br/>";out+=JSON.stringify(this.data);return out};Frame.Invalid={valid:false,hands:[],fingers:[],tools:[],gestures:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},hand:function(){return Hand.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"gl-matrix":19,underscore:20}],6:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3,EventEmitter=require("events").EventEmitter,_=require("underscore");var createGesture=exports.createGesture=function(data){var gesture;switch(data.type){case"circle":gesture=new CircleGesture(data);break;case"swipe":gesture=new SwipeGesture(data);break;case"screenTap":gesture=new ScreenTapGesture(data);break;case"keyTap":gesture=new KeyTapGesture(data);break;default:throw"unkown gesture type"}gesture.id=data.id;gesture.handIds=data.handIds;gesture.pointableIds=data.pointableIds;gesture.duration=data.duration;gesture.state=data.state;gesture.type=data.type;return gesture};var gestureListener=exports.gestureListener=function(controller,type){var handlers={};var gestureMap={};var gestureCreator=function(){var candidateGesture=gestureMap[gesture.id];if(candidateGesture!==undefined)gesture.update(gesture,frame);if(gesture.state=="start"||gesture.state=="stop"){if(type==gesture.type&&gestureMap[gesture.id]===undefined){gestureMap[gesture.id]=new Gesture(gesture,frame);gesture.update(gesture,frame)}if(gesture.state=="stop"){delete gestureMap[gesture.id]}}};controller.on("gesture",function(gesture,frame){if(gesture.type==type){if(gesture.state=="start"||gesture.state=="stop"){if(gestureMap[gesture.id]===undefined){var gestureTracker=new Gesture(gesture,frame);gestureMap[gesture.id]=gestureTracker;_.each(handlers,function(cb,name){gestureTracker.on(name,cb)})}}gestureMap[gesture.id].update(gesture,frame);if(gesture.state=="stop"){delete gestureMap[gesture.id]}}});var builder={start:function(cb){handlers["start"]=cb;return builder},stop:function(cb){handlers["stop"]=cb;return builder},complete:function(cb){handlers["stop"]=cb;return builder},update:function(cb){handlers["update"]=cb;return builder}};return builder};var Gesture=exports.Gesture=function(gesture,frame){this.gestures=[gesture];this.frames=[frame]};Gesture.prototype.update=function(gesture,frame){this.gestures.push(gesture);this.frames.push(frame);this.emit(gesture.state,this)};_.extend(Gesture.prototype,EventEmitter.prototype);var CircleGesture=function(data){this.center=data.center;this.normal=data.normal;this.progress=data.progress;this.radius=data.radius};CircleGesture.prototype.toString=function(){return"CircleGesture ["+JSON.stringify(this)+"]"};var SwipeGesture=function(data){this.startPosition=data.startPosition;this.position=data.position;this.direction=data.direction;this.speed=data.speed};SwipeGesture.prototype.toString=function(){return"SwipeGesture ["+JSON.stringify(this)+"]"};var ScreenTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};ScreenTapGesture.prototype.toString=function(){return"ScreenTapGesture ["+JSON.stringify(this)+"]"};var KeyTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};KeyTapGesture.prototype.toString=function(){return"KeyTapGesture ["+JSON.stringify(this)+"]"}},{events:17,"gl-matrix":19,underscore:20}],7:[function(require,module,exports){var Pointable=require("./pointable"),glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,_=require("underscore");var Hand=module.exports=function(data){this.id=data.id;this.palmPosition=data.palmPosition;this.direction=data.direction;this.palmVelocity=data.palmVelocity;this.palmNormal=data.palmNormal;this.sphereCenter=data.sphereCenter;this.sphereRadius=data.sphereRadius;this.valid=true;this.pointables=[];this.fingers=[];this.tools=[];this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.timeVisible=data.timeVisible;this.stabilizedPalmPosition=data.stabilizedPalmPosition};Hand.prototype.finger=function(id){var finger=this.frame.finger(id);return finger&&finger.handId==this.id?finger:Pointable.Invalid};Hand.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Hand.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceHand._rotation[5],this._rotation[2]-sinceHand._rotation[6],this._rotation[3]-sinceHand._rotation[1]])};Hand.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);var m=mat3.multiply(mat3.create(),sinceHand._rotation,transpose);return m};Hand.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 1;return Math.exp(this._scaleFactor-sinceHand._scaleFactor)};Hand.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return[this._translation[0]-sinceHand._translation[0],this._translation[1]-sinceHand._translation[1],this._translation[2]-sinceHand._translation[2]]};Hand.prototype.toString=function(){return"Hand [ id: "+this.id+" | palm velocity:"+this.palmVelocity+" | sphere center:"+this.sphereCenter+" ] "};Hand.Invalid={valid:false,fingers:[],tools:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./pointable":11,"gl-matrix":19,underscore:20}],8:[function(require,module,exports){!function(){module.exports={Controller:require("./controller"),Frame:require("./frame"),Gesture:require("./gesture"),Hand:require("./hand"),Pointable:require("./pointable"),InteractionBox:require("./interaction_box"),Connection:require("./connection"),CircularBuffer:require("./circular_buffer"),UI:require("./ui"),glMatrix:require("gl-matrix"),mat3:require("gl-matrix").mat3,vec3:require("gl-matrix").vec3,loopController:undefined,loop:function(opts,callback){if(callback===undefined){callback=opts;opts={}}if(!this.loopController)this.loopController=new this.Controller(opts);this.loopController.loop(callback)}}}()},{"./circular_buffer":2,"./connection":3,"./controller":4,"./frame":5,"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"./ui":13,"gl-matrix":19}],9:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var InteractionBox=module.exports=function(data){this.valid=true;this.center=data.center;this.size=data.size;this.width=data.size[0];this.height=data.size[1];this.depth=data.size[2]};InteractionBox.prototype.denormalizePoint=function(normalizedPosition){return vec3.fromValues((normalizedPosition[0]-.5)*this.size[0]+this.center[0],(normalizedPosition[1]-.5)*this.size[1]+this.center[1],(normalizedPosition[2]-.5)*this.size[2]+this.center[2])};InteractionBox.prototype.normalizePoint=function(position,clamp){var vec=vec3.fromValues((position[0]-this.center[0])/this.size[0]+.5,(position[1]-this.center[1])/this.size[1]+.5,(position[2]-this.center[2])/this.size[2]+.5);if(clamp){vec[0]=Math.min(Math.max(vec[0],0),1);vec[1]=Math.min(Math.max(vec[1],0),1);vec[2]=Math.min(Math.max(vec[2],0),1)}return vec};InteractionBox.prototype.toString=function(){return"InteractionBox [ width:"+this.width+" | height:"+this.height+" | depth:"+this.depth+" ]"};InteractionBox.Invalid={valid:false}},{"gl-matrix":19}],10:[function(require,module,exports){var Pipeline=module.exports=function(){this.steps=[]};Pipeline.prototype.addStep=function(step){this.steps.push(step)};Pipeline.prototype.run=function(frame){var stepsLength=this.steps.length;for(var i=0;i!=stepsLength;i++){if(!frame)break;frame=this.steps[i](frame)}return frame}},{}],11:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var Pointable=module.exports=function(data){this.valid=true;this.id=data.id;this.handId=data.handId;this.length=data.length;this.tool=data.tool;this.width=data.width;this.direction=data.direction;this.stabilizedTipPosition=data.stabilizedTipPosition;this.tipPosition=data.tipPosition;this.tipVelocity=data.tipVelocity;this.touchZone=data.touchZone;this.touchDistance=data.touchDistance;this.timeVisible=data.timeVisible};Pointable.prototype.toString=function(){if(this.tool==true){return"Pointable [ id:"+this.id+" "+this.length+"mmx | with:"+this.width+"mm | direction:"+this.direction+" ]"}else{return"Pointable [ id:"+this.id+" "+this.length+"mmx | direction: "+this.direction+" ]"}};Pointable.Invalid={valid:false}},{"gl-matrix":19}],12:[function(require,module,exports){var Frame=require("./frame");var Event=function(data){this.type=data.type;this.state=data.state};var chooseProtocol=exports.chooseProtocol=function(header){var protocol;switch(header.version){case 1:protocol=JSONProtocol(1,function(data){return new Frame(data)});break;case 2:protocol=JSONProtocol(2,function(data){return new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;case 3:protocol=JSONProtocol(3,function(data){return data.event?new Event(data.event):new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;default:throw"unrecognized version"}return protocol};var JSONProtocol=function(version,cb){var protocol=cb;protocol.encode=function(message){return JSON.stringify(message)};protocol.version=version;protocol.versionLong="Version "+version;protocol.type="protocol";return protocol}},{"./frame":5}],13:[function(require,module,exports){exports.UI={Region:require("./ui/region"),Cursor:require("./ui/cursor")}},{"./ui/cursor":14,"./ui/region":15}],14:[function(require,module,exports){var Cursor=module.exports=function(){return function(frame){var pointable=frame.pointables.sort(function(a,b){return a.z-b.z})[0];if(pointable&&pointable.valid){frame.cursorPosition=pointable.tipPosition}return frame}}},{}],15:[function(require,module,exports){var EventEmitter=require("events").EventEmitter,_=require("underscore");var Region=module.exports=function(start,end){this.start=new Vector(start);this.end=new Vector(end);this.enteredFrame=null};Region.prototype.hasPointables=function(frame){for(var i=0;i!=frame.pointables.length;i++){var position=frame.pointables[i].tipPosition;if(position.x>=this.start.x&&position.x<=this.end.x&&position.y>=this.start.y&&position.y<=this.end.y&&position.z>=this.start.z&&position.z<=this.end.z){return true}}return false};Region.prototype.listener=function(opts){var region=this;if(opts&&opts.nearThreshold)this.setupNearRegion(opts.nearThreshold);return function(frame){return region.updatePosition(frame)}};Region.prototype.clipper=function(){var region=this;return function(frame){region.updatePosition(frame);return region.enteredFrame?frame:null}};Region.prototype.setupNearRegion=function(distance){var nearRegion=this.nearRegion=new Region([this.start.x-distance,this.start.y-distance,this.start.z-distance],[this.end.x+distance,this.end.y+distance,this.end.z+distance]);var region=this;nearRegion.on("enter",function(frame){region.emit("near",frame)});nearRegion.on("exit",function(frame){region.emit("far",frame)});region.on("exit",function(frame){region.emit("near",frame)})};Region.prototype.updatePosition=function(frame){if(this.nearRegion)this.nearRegion.updatePosition(frame);if(this.hasPointables(frame)&&this.enteredFrame==null){this.enteredFrame=frame;this.emit("enter",this.enteredFrame)}else if(!this.hasPointables(frame)&&this.enteredFrame!=null){this.enteredFrame=null;this.emit("exit",this.enteredFrame)}return frame};Region.prototype.normalize=function(position){return new Vector([(position.x-this.start.x)/(this.end.x-this.start.x),(position.y-this.start.y)/(this.end.y-this.start.y),(position.z-this.start.z)/(this.end.z-this.start.z)])};Region.prototype.mapToXY=function(position,width,height){var normalized=this.normalize(position);var x=normalized.x,y=normalized.y;if(x>1)x=1;else if(x<-1)x=-1;if(y>1)y=1;else if(y<-1)y=-1;return[(x+1)/2*width,(1-y)/2*height,normalized.z]};_.extend(Region.prototype,EventEmitter.prototype)},{events:17,underscore:20}],16:[function(require,module,exports){},{}],17:[function(require,module,exports){!function(process){if(!process.EventEmitter)process.EventEmitter=function(){};var EventEmitter=exports.EventEmitter=process.EventEmitter;var isArray=typeof Array.isArray==="function"?Array.isArray:function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function indexOf(xs,x){if(xs.indexOf)return xs.indexOf(x);for(var i=0;i<xs.length;i++){if(x===xs[i])return i}return-1}var defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!this._events)this._events={};this._events.maxListeners=n};EventEmitter.prototype.emit=function(type){if(type==="error"){if(!this._events||!this._events.error||isArray(this._events.error)&&!this._events.error.length){if(arguments[1]instanceof Error){throw arguments[1]}else{throw new Error("Uncaught, unspecified 'error' event.")}return false}}if(!this._events)return false;var handler=this._events[type];if(!handler)return false;if(typeof handler=="function"){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:var args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}return true}else if(isArray(handler)){var args=Array.prototype.slice.call(arguments,1);var listeners=handler.slice();for(var i=0,l=listeners.length;i<l;i++){listeners[i].apply(this,args)}return true}else{return false}};EventEmitter.prototype.addListener=function(type,listener){if("function"!==typeof listener){throw new Error("addListener only takes instances of Function")}if(!this._events)this._events={};this.emit("newListener",type,listener);if(!this._events[type]){this._events[type]=listener}else if(isArray(this._events[type])){if(!this._events[type].warned){var m;if(this._events.maxListeners!==undefined){m=this._events.maxListeners}else{m=defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);console.trace()}}this._events[type].push(listener)}else{this._events[type]=[this._events[type],listener]}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){var self=this;self.on(type,function g(){self.removeListener(type,g);listener.apply(this,arguments)});return this};EventEmitter.prototype.removeListener=function(type,listener){if("function"!==typeof listener){throw new Error("removeListener only takes instances of Function")}if(!this._events||!this._events[type])return this;var list=this._events[type];if(isArray(list)){var i=indexOf(list,listener);if(i<0)return this;list.splice(i,1);if(list.length==0)delete this._events[type]}else if(this._events[type]===listener){delete this._events[type]}return this};EventEmitter.prototype.removeAllListeners=function(type){if(arguments.length===0){this._events={};return this}if(type&&this._events&&this._events[type])this._events[type]=null;return this};EventEmitter.prototype.listeners=function(type){if(!this._events)this._events={};if(!this._events[type])this._events[type]=[];if(!isArray(this._events[type])){this._events[type]=[this._events[type]]}return this._events[type]}}(require("__browserify_process"))},{__browserify_process:18}],18:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){if(ev.source===window&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],19:[function(require,module,exports){!function(){!function(){"use strict";var shim={};if(typeof exports==="undefined"){if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){shim.exports={};define(function(){return shim.exports})}else{shim.exports=window}}else{shim.exports=exports}!function(exports){var vec2={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec2.create=function(){return new Float32Array(2)};vec2.clone=function(a){var out=new Float32Array(2);out[0]=a[0];out[1]=a[1];return out};vec2.fromValues=function(x,y){var out=new Float32Array(2);out[0]=x;out[1]=y;return out};vec2.copy=function(out,a){out[0]=a[0];out[1]=a[1];return out};vec2.set=function(out,x,y){out[0]=x;out[1]=y;return out};vec2.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];return out};vec2.sub=vec2.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];return out};vec2.mul=vec2.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];return out};vec2.div=vec2.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];return out};vec2.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);
-out[1]=Math.min(a[1],b[1]);return out};vec2.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);return out};vec2.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;return out};vec2.dist=vec2.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return Math.sqrt(x*x+y*y)};vec2.sqrDist=vec2.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return x*x+y*y};vec2.len=vec2.length=function(a){var x=a[0],y=a[1];return Math.sqrt(x*x+y*y)};vec2.sqrLen=vec2.squaredLength=function(a){var x=a[0],y=a[1];return x*x+y*y};vec2.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];return out};vec2.normalize=function(out,a){var x=a[0],y=a[1];var len=x*x+y*y;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len}return out};vec2.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]};vec2.cross=function(out,a,b){var z=a[0]*b[1]-a[1]*b[0];out[0]=out[1]=0;out[2]=z;return out};vec2.lerp=function(out,a,b,t){var ax=a[0],ay=a[1];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);return out};vec2.transformMat2=function(out,a,m){var x=a[0],y=a[1];out[0]=x*m[0]+y*m[1];out[1]=x*m[2]+y*m[3];return out};vec2.forEach=function(){var vec=new Float32Array(2);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=2}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1]}return a}}();vec2.str=function(a){return"vec2("+a[0]+", "+a[1]+")"};if(typeof exports!=="undefined"){exports.vec2=vec2}var vec3={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec3.create=function(){return new Float32Array(3)};vec3.clone=function(a){var out=new Float32Array(3);out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.fromValues=function(x,y,z){var out=new Float32Array(3);out[0]=x;out[1]=y;out[2]=z;return out};vec3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.set=function(out,x,y,z){out[0]=x;out[1]=y;out[2]=z;return out};vec3.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];return out};vec3.sub=vec3.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];return out};vec3.mul=vec3.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];return out};vec3.div=vec3.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];return out};vec3.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);return out};vec3.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);return out};vec3.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;return out};vec3.dist=vec3.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrDist=vec3.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return x*x+y*y+z*z};vec3.len=vec3.length=function(a){var x=a[0],y=a[1],z=a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrLen=vec3.squaredLength=function(a){var x=a[0],y=a[1],z=a[2];return x*x+y*y+z*z};vec3.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];return out};vec3.normalize=function(out,a){var x=a[0],y=a[1],z=a[2];var len=x*x+y*y+z*z;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len}return out};vec3.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]};vec3.cross=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2];out[0]=ay*bz-az*by;out[1]=az*bx-ax*bz;out[2]=ax*by-ay*bx;return out};vec3.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);return out};vec3.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12];out[1]=m[1]*x+m[5]*y+m[9]*z+m[13];out[2]=m[2]*x+m[6]*y+m[10]*z+m[14];return out};vec3.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec3.forEach=function(){var vec=new Float32Array(3);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=3}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2]}return a}}();vec3.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};if(typeof exports!=="undefined"){exports.vec3=vec3}var vec4={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec4.create=function(){return new Float32Array(4)};vec4.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.fromValues=function(x,y,z,w){var out=new Float32Array(4);out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.set=function(out,x,y,z,w){out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];out[3]=a[3]+b[3];return out};vec4.sub=vec4.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];out[3]=a[3]-b[3];return out};vec4.mul=vec4.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];out[3]=a[3]*b[3];return out};vec4.div=vec4.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];out[3]=a[3]/b[3];return out};vec4.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);out[3]=Math.min(a[3],b[3]);return out};vec4.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);out[3]=Math.max(a[3],b[3]);return out};vec4.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;out[3]=a[3]*b;return out};vec4.dist=vec4.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrDist=vec4.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return x*x+y*y+z*z+w*w};vec4.len=vec4.length=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrLen=vec4.squaredLength=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return x*x+y*y+z*z+w*w};vec4.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=-a[3];return out};vec4.normalize=function(out,a){var x=a[0],y=a[1],z=a[2],w=a[3];var len=x*x+y*y+z*z+w*w;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;out[3]=a[3]*len}return out};vec4.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]};vec4.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);out[3]=aw+t*(b[3]-aw);return out};vec4.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2],w=a[3];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12]*w;out[1]=m[1]*x+m[5]*y+m[9]*z+m[13]*w;out[2]=m[2]*x+m[6]*y+m[10]*z+m[14]*w;out[3]=m[3]*x+m[7]*y+m[11]*z+m[15]*w;return out};vec4.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec4.forEach=function(){var vec=new Float32Array(4);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=4}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];vec[3]=a[i+3];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2];a[i+3]=vec[3]}return a}}();vec4.str=function(a){return"vec4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.vec4=vec4}var mat2={};var mat2Identity=new Float32Array([1,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat2.create=function(){return new Float32Array(mat2Identity)};mat2.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=1;return out};mat2.transpose=function(out,a){if(out===a){var a1=a[1];out[1]=a[2];out[2]=a1}else{out[0]=a[0];out[1]=a[2];out[2]=a[1];out[3]=a[3]}return out};mat2.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],det=a0*a3-a2*a1;if(!det){return null}det=1/det;out[0]=a3*det;out[1]=-a1*det;out[2]=-a2*det;out[3]=a0*det;return out};mat2.adjoint=function(out,a){var a0=a[0];out[0]=a[3];out[1]=-a[1];out[2]=-a[2];out[3]=a0;return out};mat2.determinant=function(a){return a[0]*a[3]-a[2]*a[1]};mat2.mul=mat2.multiply=function(out,a,b){var a0=a[0],a1=a[1],a2=a[2],a3=a[3];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=a0*b0+a1*b2;out[1]=a0*b1+a1*b3;out[2]=a2*b0+a3*b2;out[3]=a2*b1+a3*b3;return out};mat2.rotate=function(out,a,rad){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],s=Math.sin(rad),c=Math.cos(rad);out[0]=a0*c+a1*s;out[1]=a0*-s+a1*c;out[2]=a2*c+a3*s;out[3]=a2*-s+a3*c;return out};mat2.scale=function(out,a,v){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],v0=v[0],v1=v[1];out[0]=a0*v0;out[1]=a1*v1;out[2]=a2*v0;out[3]=a3*v1;return out};mat2.str=function(a){return"mat2("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.mat2=mat2}var mat3={};var mat3Identity=new Float32Array([1,0,0,0,1,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat3.create=function(){return new Float32Array(mat3Identity)};mat3.clone=function(a){var out=new Float32Array(9);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=1;out[5]=0;out[6]=0;out[7]=0;out[8]=1;return out};mat3.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a12=a[5];out[1]=a[3];out[2]=a[6];out[3]=a01;out[5]=a[7];out[6]=a02;out[7]=a12}else{out[0]=a[0];out[1]=a[3];out[2]=a[6];out[3]=a[1];out[4]=a[4];out[5]=a[7];out[6]=a[2];out[7]=a[5];out[8]=a[8]}return out};mat3.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b01=a22*a11-a12*a21,b11=-a22*a10+a12*a20,b21=a21*a10-a11*a20,det=a00*b01+a01*b11+a02*b21;if(!det){return null}det=1/det;out[0]=b01*det;out[1]=(-a22*a01+a02*a21)*det;out[2]=(a12*a01-a02*a11)*det;out[3]=b11*det;out[4]=(a22*a00-a02*a20)*det;out[5]=(-a12*a00+a02*a10)*det;out[6]=b21*det;out[7]=(-a21*a00+a01*a20)*det;out[8]=(a11*a00-a01*a10)*det;return out};mat3.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];out[0]=a11*a22-a12*a21;out[1]=a02*a21-a01*a22;out[2]=a01*a12-a02*a11;out[3]=a12*a20-a10*a22;out[4]=a00*a22-a02*a20;out[5]=a02*a10-a00*a12;out[6]=a10*a21-a11*a20;out[7]=a01*a20-a00*a21;out[8]=a00*a11-a01*a10;return out};mat3.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];return a00*(a22*a11-a12*a21)+a01*(-a22*a10+a12*a20)+a02*(a21*a10-a11*a20)};mat3.mul=mat3.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b00=b[0],b01=b[1],b02=b[2],b10=b[3],b11=b[4],b12=b[5],b20=b[6],b21=b[7],b22=b[8];out[0]=b00*a00+b01*a10+b02*a20;out[1]=b00*a01+b01*a11+b02*a21;out[2]=b00*a02+b01*a12+b02*a22;out[3]=b10*a00+b11*a10+b12*a20;out[4]=b10*a01+b11*a11+b12*a21;out[5]=b10*a02+b11*a12+b12*a22;out[6]=b20*a00+b21*a10+b22*a20;out[7]=b20*a01+b21*a11+b22*a21;out[8]=b20*a02+b21*a12+b22*a22;return out};mat3.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"};if(typeof exports!=="undefined"){exports.mat3=mat3}var mat4={};var mat4Identity=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat4.create=function(){return new Float32Array(mat4Identity)};mat4.clone=function(a){var out=new Float32Array(16);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=1;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=1;out[11]=0;out[12]=0;out[13]=0;out[14]=0;out[15]=1;return out};mat4.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a03=a[3],a12=a[6],a13=a[7],a23=a[11];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a01;out[6]=a[9];out[7]=a[13];out[8]=a02;out[9]=a12;out[11]=a[14];out[12]=a03;out[13]=a13;out[14]=a23}else{out[0]=a[0];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a[1];out[5]=a[5];out[6]=a[9];out[7]=a[13];out[8]=a[2];out[9]=a[6];out[10]=a[10];out[11]=a[14];out[12]=a[3];out[13]=a[7];out[14]=a[11];out[15]=a[15]}return out};mat4.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32,det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(!det){return null}det=1/det;out[0]=(a11*b11-a12*b10+a13*b09)*det;out[1]=(a02*b10-a01*b11-a03*b09)*det;out[2]=(a31*b05-a32*b04+a33*b03)*det;out[3]=(a22*b04-a21*b05-a23*b03)*det;out[4]=(a12*b08-a10*b11-a13*b07)*det;out[5]=(a00*b11-a02*b08+a03*b07)*det;out[6]=(a32*b02-a30*b05-a33*b01)*det;out[7]=(a20*b05-a22*b02+a23*b01)*det;out[8]=(a10*b10-a11*b08+a13*b06)*det;out[9]=(a01*b08-a00*b10-a03*b06)*det;out[10]=(a30*b04-a31*b02+a33*b00)*det;out[11]=(a21*b02-a20*b04-a23*b00)*det;out[12]=(a11*b07-a10*b09-a12*b06)*det;out[13]=(a00*b09-a01*b07+a02*b06)*det;out[14]=(a31*b01-a30*b03-a32*b00)*det;out[15]=(a20*b03-a21*b01+a22*b00)*det;return out};mat4.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];out[0]=a11*(a22*a33-a23*a32)-a21*(a12*a33-a13*a32)+a31*(a12*a23-a13*a22);out[1]=-(a01*(a22*a33-a23*a32)-a21*(a02*a33-a03*a32)+a31*(a02*a23-a03*a22));out[2]=a01*(a12*a33-a13*a32)-a11*(a02*a33-a03*a32)+a31*(a02*a13-a03*a12);out[3]=-(a01*(a12*a23-a13*a22)-a11*(a02*a23-a03*a22)+a21*(a02*a13-a03*a12));out[4]=-(a10*(a22*a33-a23*a32)-a20*(a12*a33-a13*a32)+a30*(a12*a23-a13*a22));out[5]=a00*(a22*a33-a23*a32)-a20*(a02*a33-a03*a32)+a30*(a02*a23-a03*a22);out[6]=-(a00*(a12*a33-a13*a32)-a10*(a02*a33-a03*a32)+a30*(a02*a13-a03*a12));out[7]=a00*(a12*a23-a13*a22)-a10*(a02*a23-a03*a22)+a20*(a02*a13-a03*a12);out[8]=a10*(a21*a33-a23*a31)-a20*(a11*a33-a13*a31)+a30*(a11*a23-a13*a21);out[9]=-(a00*(a21*a33-a23*a31)-a20*(a01*a33-a03*a31)+a30*(a01*a23-a03*a21));out[10]=a00*(a11*a33-a13*a31)-a10*(a01*a33-a03*a31)+a30*(a01*a13-a03*a11);out[11]=-(a00*(a11*a23-a13*a21)-a10*(a01*a23-a03*a21)+a20*(a01*a13-a03*a11));out[12]=-(a10*(a21*a32-a22*a31)-a20*(a11*a32-a12*a31)+a30*(a11*a22-a12*a21));out[13]=a00*(a21*a32-a22*a31)-a20*(a01*a32-a02*a31)+a30*(a01*a22-a02*a21);out[14]=-(a00*(a11*a32-a12*a31)-a10*(a01*a32-a02*a31)+a30*(a01*a12-a02*a11));out[15]=a00*(a11*a22-a12*a21)-a10*(a01*a22-a02*a21)+a20*(a01*a12-a02*a11);return out};mat4.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32;return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06};mat4.mul=mat4.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=b0*a00+b1*a10+b2*a20+b3*a30;out[1]=b0*a01+b1*a11+b2*a21+b3*a31;out[2]=b0*a02+b1*a12+b2*a22+b3*a32;out[3]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[4];b1=b[5];b2=b[6];b3=b[7];out[4]=b0*a00+b1*a10+b2*a20+b3*a30;out[5]=b0*a01+b1*a11+b2*a21+b3*a31;out[6]=b0*a02+b1*a12+b2*a22+b3*a32;out[7]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[8];b1=b[9];b2=b[10];b3=b[11];out[8]=b0*a00+b1*a10+b2*a20+b3*a30;out[9]=b0*a01+b1*a11+b2*a21+b3*a31;out[10]=b0*a02+b1*a12+b2*a22+b3*a32;out[11]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[12];b1=b[13];b2=b[14];b3=b[15];out[12]=b0*a00+b1*a10+b2*a20+b3*a30;out[13]=b0*a01+b1*a11+b2*a21+b3*a31;out[14]=b0*a02+b1*a12+b2*a22+b3*a32;out[15]=b0*a03+b1*a13+b2*a23+b3*a33;return out};mat4.translate=function(out,a,v){var x=v[0],y=v[1],z=v[2],a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;if(a===out){out[12]=a[0]*x+a[4]*y+a[8]*z+a[12];out[13]=a[1]*x+a[5]*y+a[9]*z+a[13];out[14]=a[2]*x+a[6]*y+a[10]*z+a[14];out[15]=a[3]*x+a[7]*y+a[11]*z+a[15]}else{a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a03;out[4]=a10;out[5]=a11;out[6]=a12;out[7]=a13;out[8]=a20;out[9]=a21;out[10]=a22;out[11]=a23;out[12]=a00*x+a10*y+a20*z+a[12];out[13]=a01*x+a11*y+a21*z+a[13];out[14]=a02*x+a12*y+a22*z+a[14];out[15]=a03*x+a13*y+a23*z+a[15]}return out};mat4.scale=function(out,a,v){var x=v[0],y=v[1],z=v[2];out[0]=a[0]*x;out[1]=a[1]*x;out[2]=a[2]*x;out[3]=a[3]*x;out[4]=a[4]*y;out[5]=a[5]*y;out[6]=a[6]*y;out[7]=a[7]*y;out[8]=a[8]*z;out[9]=a[9]*z;out[10]=a[10]*z;out[11]=a[11]*z;out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.rotate=function(out,a,rad,axis){var x=axis[0],y=axis[1],z=axis[2],len=Math.sqrt(x*x+y*y+z*z),s,c,t,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,b00,b01,b02,b10,b11,b12,b20,b21,b22;if(Math.abs(len)<GLMAT_EPSILON){return null}len=1/len;x*=len;y*=len;z*=len;s=Math.sin(rad);c=Math.cos(rad);t=1-c;a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];b00=x*x*t+c;b01=y*x*t+z*s;b02=z*x*t-y*s;b10=x*y*t-z*s;b11=y*y*t+c;b12=z*y*t+x*s;b20=x*z*t+y*s;b21=y*z*t-x*s;b22=z*z*t+c;out[0]=a00*b00+a10*b01+a20*b02;out[1]=a01*b00+a11*b01+a21*b02;out[2]=a02*b00+a12*b01+a22*b02;out[3]=a03*b00+a13*b01+a23*b02;out[4]=a00*b10+a10*b11+a20*b12;out[5]=a01*b10+a11*b11+a21*b12;out[6]=a02*b10+a12*b11+a22*b12;out[7]=a03*b10+a13*b11+a23*b12;out[8]=a00*b20+a10*b21+a20*b22;out[9]=a01*b20+a11*b21+a21*b22;out[10]=a02*b20+a12*b21+a22*b22;out[11]=a03*b20+a13*b21+a23*b22;if(a!==out){out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}return out};mat4.rotateX=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[4]=a10*c+a20*s;out[5]=a11*c+a21*s;out[6]=a12*c+a22*s;out[7]=a13*c+a23*s;out[8]=a20*c-a10*s;out[9]=a21*c-a11*s;out[10]=a22*c-a12*s;out[11]=a23*c-a13*s;return out};mat4.rotateY=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c-a20*s;out[1]=a01*c-a21*s;out[2]=a02*c-a22*s;out[3]=a03*c-a23*s;out[8]=a00*s+a20*c;out[9]=a01*s+a21*c;out[10]=a02*s+a22*c;out[11]=a03*s+a23*c;return out};mat4.rotateZ=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7];if(a!==out){out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c+a10*s;out[1]=a01*c+a11*s;out[2]=a02*c+a12*s;out[3]=a03*c+a13*s;out[4]=a10*c-a00*s;out[5]=a11*c-a01*s;out[6]=a12*c-a02*s;out[7]=a13*c-a03*s;return out};mat4.fromRotationTranslation=function(out,q,v){var x=q[0],y=q[1],z=q[2],w=q[3],x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;out[0]=1-(yy+zz);out[1]=xy+wz;out[2]=xz-wy;out[3]=0;out[4]=xy-wz;out[5]=1-(xx+zz);out[6]=yz+wx;out[7]=0;out[8]=xz+wy;out[9]=yz-wx;out[10]=1-(xx+yy);out[11]=0;out[12]=v[0];out[13]=v[1];out[14]=v[2];out[15]=1;return out};mat4.frustum=function(out,left,right,bottom,top,near,far){var rl=1/(right-left),tb=1/(top-bottom),nf=1/(near-far);out[0]=near*2*rl;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=near*2*tb;out[6]=0;out[7]=0;out[8]=(right+left)*rl;out[9]=(top+bottom)*tb;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=far*near*2*nf;out[15]=0;return out};mat4.perspective=function(out,fovy,aspect,near,far){var f=1/Math.tan(fovy/2),nf=1/(near-far);out[0]=f/aspect;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=f;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=2*far*near*nf;out[15]=0;return out};mat4.ortho=function(out,left,right,bottom,top,near,far){var lr=1/(left-right),bt=1/(bottom-top),nf=1/(near-far);out[0]=-2*lr;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=-2*bt;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=2*nf;out[11]=0;out[12]=(left+right)*lr;out[13]=(top+bottom)*bt;out[14]=(far+near)*nf;out[15]=1;return out};mat4.lookAt=function(out,eye,center,up){var x0,x1,x2,y0,y1,y2,z0,z1,z2,len,eyex=eye[0],eyey=eye[1],eyez=eye[2],upx=up[0],upy=up[1],upz=up[2],centerx=center[0],centery=center[1],centerz=center[2];if(Math.abs(eyex-centerx)<GLMAT_EPSILON&&Math.abs(eyey-centery)<GLMAT_EPSILON&&Math.abs(eyez-centerz)<GLMAT_EPSILON){return mat4.identity(out)}z0=eyex-centerx;z1=eyey-centery;z2=eyez-centerz;len=1/Math.sqrt(z0*z0+z1*z1+z2*z2);z0*=len;z1*=len;z2*=len;x0=upy*z2-upz*z1;x1=upz*z0-upx*z2;x2=upx*z1-upy*z0;len=Math.sqrt(x0*x0+x1*x1+x2*x2);if(!len){x0=0;x1=0;x2=0}else{len=1/len;x0*=len;x1*=len;x2*=len}y0=z1*x2-z2*x1;y1=z2*x0-z0*x2;y2=z0*x1-z1*x0;len=Math.sqrt(y0*y0+y1*y1+y2*y2);if(!len){y0=0;y1=0;y2=0}else{len=1/len;y0*=len;y1*=len;y2*=len}out[0]=x0;out[1]=y0;out[2]=z0;out[3]=0;out[4]=x1;out[5]=y1;out[6]=z1;out[7]=0;out[8]=x2;out[9]=y2;out[10]=z2;out[11]=0;out[12]=-(x0*eyex+x1*eyey+x2*eyez);out[13]=-(y0*eyex+y1*eyey+y2*eyez);out[14]=-(z0*eyex+z1*eyey+z2*eyez);out[15]=1;return out};mat4.str=function(a){return"mat4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+")"};if(typeof exports!=="undefined"){exports.mat4=mat4}var quat={};var quatIdentity=new Float32Array([0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}quat.create=function(){return new Float32Array(quatIdentity)};quat.clone=vec4.clone;quat.fromValues=vec4.fromValues;quat.copy=vec4.copy;quat.set=vec4.set;quat.identity=function(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out};quat.setAxisAngle=function(out,axis,rad){rad=rad*.5;var s=Math.sin(rad);out[0]=s*axis[0];out[1]=s*axis[1];out[2]=s*axis[2];out[3]=Math.cos(rad);return out};quat.add=vec4.add;quat.mul=quat.multiply=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=b[3];out[0]=ax*bw+aw*bx+ay*bz-az*by;out[1]=ay*bw+aw*by+az*bx-ax*bz;out[2]=az*bw+aw*bz+ax*by-ay*bx;out[3]=aw*bw-ax*bx-ay*by-az*bz;return out};quat.scale=vec4.scale;quat.rotateX=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+aw*bx;out[1]=ay*bw+az*bx;out[2]=az*bw-ay*bx;out[3]=aw*bw-ax*bx;return out};quat.rotateY=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],by=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw-az*by;out[1]=ay*bw+aw*by;out[2]=az*bw+ax*by;out[3]=aw*bw-ay*by;return out};quat.rotateZ=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bz=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+ay*bz;out[1]=ay*bw-ax*bz;out[2]=az*bw+aw*bz;out[3]=aw*bw-az*bz;return out};quat.calculateW=function(out,a){var x=a[0],y=a[1],z=a[2];out[0]=x;out[1]=y;out[2]=z;out[3]=-Math.sqrt(Math.abs(1-x*x-y*y-z*z));return out};quat.dot=vec4.dot;quat.lerp=vec4.lerp;quat.slerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=a[3];var cosHalfTheta=ax*bx+ay*by+az*bz+aw*bw,halfTheta,sinHalfTheta,ratioA,ratioB;if(Math.abs(cosHalfTheta)>=1){if(out!==a){out[0]=ax;out[1]=ay;out[2]=az;out[3]=aw}return out}halfTheta=Math.acos(cosHalfTheta);sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001){out[0]=ax*.5+bx*.5;out[1]=ay*.5+by*.5;out[2]=az*.5+bz*.5;out[3]=aw*.5+bw*.5;return out}ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta;ratioB=Math.sin(t*halfTheta)/sinHalfTheta;out[0]=ax*ratioA+bx*ratioB;out[1]=ay*ratioA+by*ratioB;out[2]=az*ratioA+bz*ratioB;out[3]=aw*ratioA+bw*ratioB;return out};quat.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],dot=a0*a0+a1*a1+a2*a2+a3*a3,invDot=dot?1/dot:0;out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out};quat.conjugate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out};quat.len=quat.length=vec4.length;quat.sqrLen=quat.squaredLength=vec4.squaredLength;quat.normalize=vec4.normalize;quat.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.quat=quat}}(shim.exports)}()}()},{}],20:[function(require,module,exports){!function(){!function(){var root=this;var previousUnderscore=root._;var breaker={};var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var push=ArrayProto.push,slice=ArrayProto.slice,concat=ArrayProto.concat,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeForEach=ArrayProto.forEach,nativeMap=ArrayProto.map,nativeReduce=ArrayProto.reduce,nativeReduceRight=ArrayProto.reduceRight,nativeFilter=ArrayProto.filter,nativeEvery=ArrayProto.every,nativeSome=ArrayProto.some,nativeIndexOf=ArrayProto.indexOf,nativeLastIndexOf=ArrayProto.lastIndexOf,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){if(obj instanceof _)return obj;if(!(this instanceof _))return new _(obj);this._wrapped=obj};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=_}exports._=_}else{root._=_}_.VERSION="1.4.4";var each=_.each=_.forEach=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i<l;i++){if(iterator.call(context,obj[i],i,obj)===breaker)return}}else{for(var key in obj){if(_.has(obj,key)){if(iterator.call(context,obj[key],key,obj)===breaker)return}}}};_.map=_.collect=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeMap&&obj.map===nativeMap)return obj.map(iterator,context);each(obj,function(value,index,list){results[results.length]=iterator.call(context,value,index,list)});return results};var reduceError="Reduce of empty array with no initial value";_.reduce=_.foldl=_.inject=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduce&&obj.reduce===nativeReduce){if(context)iterator=_.bind(iterator,context);return initial?obj.reduce(iterator,memo):obj.reduce(iterator)}each(obj,function(value,index,list){if(!initial){memo=value;initial=true}else{memo=iterator.call(context,memo,value,index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.reduceRight=_.foldr=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduceRight&&obj.reduceRight===nativeReduceRight){if(context)iterator=_.bind(iterator,context);return initial?obj.reduceRight(iterator,memo):obj.reduceRight(iterator)}var length=obj.length;if(length!==+length){var keys=_.keys(obj);length=keys.length}each(obj,function(value,index,list){index=keys?keys[--length]:--length;if(!initial){memo=obj[index];initial=true}else{memo=iterator.call(context,memo,obj[index],index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.find=_.detect=function(obj,iterator,context){var result;any(obj,function(value,index,list){if(iterator.call(context,value,index,list)){result=value;return true}});return result};_.filter=_.select=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeFilter&&obj.filter===nativeFilter)return obj.filter(iterator,context);each(obj,function(value,index,list){if(iterator.call(context,value,index,list))results[results.length]=value});return results};_.reject=function(obj,iterator,context){return _.filter(obj,function(value,index,list){return!iterator.call(context,value,index,list)},context)};_.every=_.all=function(obj,iterator,context){iterator||(iterator=_.identity);var result=true;if(obj==null)return result;if(nativeEvery&&obj.every===nativeEvery)return obj.every(iterator,context);each(obj,function(value,index,list){if(!(result=result&&iterator.call(context,value,index,list)))return breaker});return!!result};var any=_.some=_.any=function(obj,iterator,context){iterator||(iterator=_.identity);var result=false;if(obj==null)return result;if(nativeSome&&obj.some===nativeSome)return obj.some(iterator,context);each(obj,function(value,index,list){if(result||(result=iterator.call(context,value,index,list)))return breaker});return!!result};_.contains=_.include=function(obj,target){if(obj==null)return false;if(nativeIndexOf&&obj.indexOf===nativeIndexOf)return obj.indexOf(target)!=-1;return any(obj,function(value){return value===target})};_.invoke=function(obj,method){var args=slice.call(arguments,2);var isFunc=_.isFunction(method);return _.map(obj,function(value){return(isFunc?method:value[method]).apply(value,args)})};_.pluck=function(obj,key){return _.map(obj,function(value){return value[key]})};_.where=function(obj,attrs,first){if(_.isEmpty(attrs))return first?null:[];return _[first?"find":"filter"](obj,function(value){for(var key in attrs){if(attrs[key]!==value[key])return false}return true})};_.findWhere=function(obj,attrs){return _.where(obj,attrs,true)};_.max=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.max.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return-Infinity;var result={computed:-Infinity,value:-Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed>=result.computed&&(result={value:value,computed:computed})});return result.value};_.min=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.min.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return Infinity;var result={computed:Infinity,value:Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed<result.computed&&(result={value:value,computed:computed})});return result.value};_.shuffle=function(obj){var rand;var index=0;var shuffled=[];each(obj,function(value){rand=_.random(index++);shuffled[index-1]=shuffled[rand];shuffled[rand]=value});return shuffled};var lookupIterator=function(value){return _.isFunction(value)?value:function(obj){return obj[value]}};_.sortBy=function(obj,value,context){var iterator=lookupIterator(value);return _.pluck(_.map(obj,function(value,index,list){return{value:value,index:index,criteria:iterator.call(context,value,index,list)}}).sort(function(left,right){var a=left.criteria;
-var b=right.criteria;if(a!==b){if(a>b||a===void 0)return 1;if(a<b||b===void 0)return-1}return left.index<right.index?-1:1}),"value")};var group=function(obj,value,context,behavior){var result={};var iterator=lookupIterator(value||_.identity);each(obj,function(value,index){var key=iterator.call(context,value,index,obj);behavior(result,key,value)});return result};_.groupBy=function(obj,value,context){return group(obj,value,context,function(result,key,value){(_.has(result,key)?result[key]:result[key]=[]).push(value)})};_.countBy=function(obj,value,context){return group(obj,value,context,function(result,key){if(!_.has(result,key))result[key]=0;result[key]++})};_.sortedIndex=function(array,obj,iterator,context){iterator=iterator==null?_.identity:lookupIterator(iterator);var value=iterator.call(context,obj);var low=0,high=array.length;while(low<high){var mid=low+high>>>1;iterator.call(context,array[mid])<value?low=mid+1:high=mid}return low};_.toArray=function(obj){if(!obj)return[];if(_.isArray(obj))return slice.call(obj);if(obj.length===+obj.length)return _.map(obj,_.identity);return _.values(obj)};_.size=function(obj){if(obj==null)return 0;return obj.length===+obj.length?obj.length:_.keys(obj).length};_.first=_.head=_.take=function(array,n,guard){if(array==null)return void 0;return n!=null&&!guard?slice.call(array,0,n):array[0]};_.initial=function(array,n,guard){return slice.call(array,0,array.length-(n==null||guard?1:n))};_.last=function(array,n,guard){if(array==null)return void 0;if(n!=null&&!guard){return slice.call(array,Math.max(array.length-n,0))}else{return array[array.length-1]}};_.rest=_.tail=_.drop=function(array,n,guard){return slice.call(array,n==null||guard?1:n)};_.compact=function(array){return _.filter(array,_.identity)};var flatten=function(input,shallow,output){each(input,function(value){if(_.isArray(value)){shallow?push.apply(output,value):flatten(value,shallow,output)}else{output.push(value)}});return output};_.flatten=function(array,shallow){return flatten(array,shallow,[])};_.without=function(array){return _.difference(array,slice.call(arguments,1))};_.uniq=_.unique=function(array,isSorted,iterator,context){if(_.isFunction(isSorted)){context=iterator;iterator=isSorted;isSorted=false}var initial=iterator?_.map(array,iterator,context):array;var results=[];var seen=[];each(initial,function(value,index){if(isSorted?!index||seen[seen.length-1]!==value:!_.contains(seen,value)){seen.push(value);results.push(array[index])}});return results};_.union=function(){return _.uniq(concat.apply(ArrayProto,arguments))};_.intersection=function(array){var rest=slice.call(arguments,1);return _.filter(_.uniq(array),function(item){return _.every(rest,function(other){return _.indexOf(other,item)>=0})})};_.difference=function(array){var rest=concat.apply(ArrayProto,slice.call(arguments,1));return _.filter(array,function(value){return!_.contains(rest,value)})};_.zip=function(){var args=slice.call(arguments);var length=_.max(_.pluck(args,"length"));var results=new Array(length);for(var i=0;i<length;i++){results[i]=_.pluck(args,""+i)}return results};_.object=function(list,values){if(list==null)return{};var result={};for(var i=0,l=list.length;i<l;i++){if(values){result[list[i]]=values[i]}else{result[list[i][0]]=list[i][1]}}return result};_.indexOf=function(array,item,isSorted){if(array==null)return-1;var i=0,l=array.length;if(isSorted){if(typeof isSorted=="number"){i=isSorted<0?Math.max(0,l+isSorted):isSorted}else{i=_.sortedIndex(array,item);return array[i]===item?i:-1}}if(nativeIndexOf&&array.indexOf===nativeIndexOf)return array.indexOf(item,isSorted);for(;i<l;i++)if(array[i]===item)return i;return-1};_.lastIndexOf=function(array,item,from){if(array==null)return-1;var hasIndex=from!=null;if(nativeLastIndexOf&&array.lastIndexOf===nativeLastIndexOf){return hasIndex?array.lastIndexOf(item,from):array.lastIndexOf(item)}var i=hasIndex?from:array.length;while(i--)if(array[i]===item)return i;return-1};_.range=function(start,stop,step){if(arguments.length<=1){stop=start||0;start=0}step=arguments[2]||1;var len=Math.max(Math.ceil((stop-start)/step),0);var idx=0;var range=new Array(len);while(idx<len){range[idx++]=start;start+=step}return range};_.bind=function(func,context){if(func.bind===nativeBind&&nativeBind)return nativeBind.apply(func,slice.call(arguments,1));var args=slice.call(arguments,2);return function(){return func.apply(context,args.concat(slice.call(arguments)))}};_.partial=function(func){var args=slice.call(arguments,1);return function(){return func.apply(this,args.concat(slice.call(arguments)))}};_.bindAll=function(obj){var funcs=slice.call(arguments,1);if(funcs.length===0)funcs=_.functions(obj);each(funcs,function(f){obj[f]=_.bind(obj[f],obj)});return obj};_.memoize=function(func,hasher){var memo={};hasher||(hasher=_.identity);return function(){var key=hasher.apply(this,arguments);return _.has(memo,key)?memo[key]:memo[key]=func.apply(this,arguments)}};_.delay=function(func,wait){var args=slice.call(arguments,2);return setTimeout(function(){return func.apply(null,args)},wait)};_.defer=function(func){return _.delay.apply(_,[func,1].concat(slice.call(arguments,1)))};_.throttle=function(func,wait){var context,args,timeout,result;var previous=0;var later=function(){previous=new Date;timeout=null;result=func.apply(context,args)};return function(){var now=new Date;var remaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0){clearTimeout(timeout);timeout=null;previous=now;result=func.apply(context,args)}else if(!timeout){timeout=setTimeout(later,remaining)}return result}};_.debounce=function(func,wait,immediate){var timeout,result;return function(){var context=this,args=arguments;var later=function(){timeout=null;if(!immediate)result=func.apply(context,args)};var callNow=immediate&&!timeout;clearTimeout(timeout);timeout=setTimeout(later,wait);if(callNow)result=func.apply(context,args);return result}};_.once=function(func){var ran=false,memo;return function(){if(ran)return memo;ran=true;memo=func.apply(this,arguments);func=null;return memo}};_.wrap=function(func,wrapper){return function(){var args=[func];push.apply(args,arguments);return wrapper.apply(this,args)}};_.compose=function(){var funcs=arguments;return function(){var args=arguments;for(var i=funcs.length-1;i>=0;i--){args=[funcs[i].apply(this,args)]}return args[0]}};_.after=function(times,func){if(times<=0)return func();return function(){if(--times<1){return func.apply(this,arguments)}}};_.keys=nativeKeys||function(obj){if(obj!==Object(obj))throw new TypeError("Invalid object");var keys=[];for(var key in obj)if(_.has(obj,key))keys[keys.length]=key;return keys};_.values=function(obj){var values=[];for(var key in obj)if(_.has(obj,key))values.push(obj[key]);return values};_.pairs=function(obj){var pairs=[];for(var key in obj)if(_.has(obj,key))pairs.push([key,obj[key]]);return pairs};_.invert=function(obj){var result={};for(var key in obj)if(_.has(obj,key))result[obj[key]]=key;return result};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key)}return names.sort()};_.extend=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){obj[prop]=source[prop]}}});return obj};_.pick=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));each(keys,function(key){if(key in obj)copy[key]=obj[key]});return copy};_.omit=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));for(var key in obj){if(!_.contains(keys,key))copy[key]=obj[key]}return copy};_.defaults=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){if(obj[prop]==null)obj[prop]=source[prop]}}});return obj};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj)};_.tap=function(obj,interceptor){interceptor(obj);return obj};var eq=function(a,b,aStack,bStack){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a instanceof _)a=a._wrapped;if(b instanceof _)b=b._wrapped;var className=toString.call(a);if(className!=toString.call(b))return false;switch(className){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return false;var length=aStack.length;while(length--){if(aStack[length]==a)return bStack[length]==b}aStack.push(a);bStack.push(b);var size=0,result=true;if(className=="[object Array]"){size=a.length;result=size==b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack)))break}}}else{var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(_.isFunction(aCtor)&&aCtor instanceof aCtor&&_.isFunction(bCtor)&&bCtor instanceof bCtor)){return false}for(var key in a){if(_.has(a,key)){size++;if(!(result=_.has(b,key)&&eq(a[key],b[key],aStack,bStack)))break}}if(result){for(key in b){if(_.has(b,key)&&!size--)break}result=!size}}aStack.pop();bStack.pop();return result};_.isEqual=function(a,b){return eq(a,b,[],[])};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true};_.isElement=function(obj){return!!(obj&&obj.nodeType===1)};_.isArray=nativeIsArray||function(obj){return toString.call(obj)=="[object Array]"};_.isObject=function(obj){return obj===Object(obj)};each(["Arguments","Function","String","Number","Date","RegExp"],function(name){_["is"+name]=function(obj){return toString.call(obj)=="[object "+name+"]"}});if(!_.isArguments(arguments)){_.isArguments=function(obj){return!!(obj&&_.has(obj,"callee"))}}if(typeof/./!=="function"){_.isFunction=function(obj){return typeof obj==="function"}}_.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj))};_.isNaN=function(obj){return _.isNumber(obj)&&obj!=+obj};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)=="[object Boolean]"};_.isNull=function(obj){return obj===null};_.isUndefined=function(obj){return obj===void 0};_.has=function(obj,key){return hasOwnProperty.call(obj,key)};_.noConflict=function(){root._=previousUnderscore;return this};_.identity=function(value){return value};_.times=function(n,iterator,context){var accum=Array(n);for(var i=0;i<n;i++)accum[i]=iterator.call(context,i);return accum};_.random=function(min,max){if(max==null){max=min;min=0}return min+Math.floor(Math.random()*(max-min+1))};var entityMap={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};entityMap.unescape=_.invert(entityMap.escape);var entityRegexes={escape:new RegExp("["+_.keys(entityMap.escape).join("")+"]","g"),unescape:new RegExp("("+_.keys(entityMap.unescape).join("|")+")","g")};_.each(["escape","unescape"],function(method){_[method]=function(string){if(string==null)return"";return(""+string).replace(entityRegexes[method],function(match){return entityMap[method][match]})}});_.result=function(object,property){if(object==null)return null;var value=object[property];return _.isFunction(value)?value.call(object):value};_.mixin=function(obj){each(_.functions(obj),function(name){var func=_[name]=obj[name];_.prototype[name]=function(){var args=[this._wrapped];push.apply(args,arguments);return result.call(this,func.apply(_,args))}})};var idCounter=0;_.uniqueId=function(prefix){var id=++idCounter+"";return prefix?prefix+id:id};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/(.)^/;var escapes={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"};var escaper=/\\|'|\r|\n|\t|\u2028|\u2029/g;_.template=function(text,data,settings){var render;settings=_.defaults({},settings,_.templateSettings);var matcher=new RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join("|")+"|$","g");var index=0;var source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,function(match){return"\\"+escapes[match]});if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'"}if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'"}if(evaluate){source+="';\n"+evaluate+"\n__p+='"}index=offset+match.length;return match});source+="';\n";if(!settings.variable)source="with(obj||{}){\n"+source+"}\n";source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+"return __p;\n";try{render=new Function(settings.variable||"obj","_",source)}catch(e){e.source=source;throw e}if(data)return render(data,_);var template=function(data){return render.call(this,data,_)};template.source="function("+(settings.variable||"obj")+"){\n"+source+"}";return template};_.chain=function(obj){return _(obj).chain()};var result=function(obj){return this._chain?_(obj).chain():obj};_.mixin(_);each(["pop","push","reverse","shift","sort","splice","unshift"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){var obj=this._wrapped;method.apply(obj,arguments);if((name=="shift"||name=="splice")&&obj.length===0)delete obj[0];return result.call(this,obj)}});each(["concat","join","slice"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){return result.call(this,method.apply(this._wrapped,arguments))}});_.extend(_.prototype,{chain:function(){this._chain=true;return this},value:function(){return this._wrapped}})}.call(this)}()},{}],21:[function(require,module,exports){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}();Leap=require("../lib/index")},{"../lib/index":8}]},{},[21]);
-
-/*
- * Leap Motion integration for Reveal.js.
- * James Sun  [sun16]
- * Rory Hardy [gneatgeek]
- */
-
-(function () {
-  var body        = document.body,
-      controller  = new Leap.Controller({ enableGestures: true }),
-      lastGesture = 0,
-      leapConfig  = Reveal.getConfig().leap,
-      pointer     = document.createElement( 'div' ),
-      config      = {
-        autoCenter       : true,      // Center pointer around detected position.
-        gestureDelay     : 500,       // How long to delay between gestures.
-        naturalSwipe     : true,      // Swipe as if it were a touch screen.
-        pointerColor     : '#00aaff', // Default color of the pointer.
-        pointerOpacity   : 0.7,       // Default opacity of the pointer.
-        pointerSize      : 15,        // Default minimum height/width of the pointer.
-        pointerTolerance : 120        // Bigger = slower pointer.
-      },
-      entered, enteredPosition, now, size, tipPosition; // Other vars we need later, but don't need to redeclare.
-
-      // Merge user defined settings with defaults
-      if( leapConfig ) {
-        for( key in leapConfig ) {
-          config[key] = leapConfig[key];
-        }
-      }
-
-      pointer.id = 'leap';
-
-      pointer.style.position        = 'absolute';
-      pointer.style.visibility      = 'hidden';
-      pointer.style.zIndex          = 50;
-      pointer.style.opacity         = config.pointerOpacity;
-      pointer.style.backgroundColor = config.pointerColor;
-
-      body.appendChild( pointer );
-
-  // Leap's loop
-  controller.on( 'frame', function ( frame ) {
-    // Timing code to rate limit gesture execution
-    now = new Date().getTime();
-
-    // Pointer: 1 to 2 fingers. Strictly one finger works but may cause innaccuracies.
-    // The innaccuracies were observed on a development model and may not be an issue with consumer models.
-    if( frame.fingers.length > 0 && frame.fingers.length < 3 ) {
-      // Invert direction and multiply by 3 for greater effect.
-      size = -3 * frame.fingers[0].tipPosition[2];
-
-      if( size < config.pointerSize ) {
-        size = config.pointerSize;
-      }
-
-      pointer.style.width        = size     + 'px';
-      pointer.style.height       = size     + 'px';
-      pointer.style.borderRadius = size - 5 + 'px';
-      pointer.style.visibility   = 'visible';
-
-      if( config.autoCenter ) {
-        tipPosition = frame.fingers[0].tipPosition;
-
-        // Check whether the finger has entered the z range of the Leap Motion. Used for the autoCenter option.
-        if( !entered ) {
-          entered         = true;
-          enteredPosition = frame.fingers[0].tipPosition;
-        }
-
-        pointer.style.top =
-          (-1 * (( tipPosition[1] - enteredPosition[1] ) * body.offsetHeight / config.pointerTolerance )) +
-            ( body.offsetHeight / 2 ) + 'px';
-
-        pointer.style.left =
-          (( tipPosition[0] - enteredPosition[0] ) * body.offsetWidth / config.pointerTolerance ) +
-            ( body.offsetWidth / 2 ) + 'px';
-      }
-      else {
-        pointer.style.top  = ( 1 - (( tipPosition[1] - 50) / config.pointerTolerance )) *
-          body.offsetHeight + 'px';
-
-        pointer.style.left = ( tipPosition[0] * body.offsetWidth / config.pointerTolerance ) +
-          ( body.offsetWidth / 2 ) + 'px';
-      }
-    }
-    else {
-      // Hide pointer on exit
-      entered                  = false;
-      pointer.style.visibility = 'hidden';
-    }
-
-    // Gestures
-    if( frame.gestures.length > 0 && (now - lastGesture) > config.gestureDelay ) {
-      var gesture = frame.gestures[0];
-
-      // One hand gestures
-      if( frame.hands.length === 1 ) {
-        // Swipe gestures. 3+ fingers.
-        if( frame.fingers.length > 2 && gesture.type === 'swipe' ) {
-          // Define here since some gestures will throw undefined for these.
-          var x = gesture.direction[0],
-              y = gesture.direction[1];
-
-          // Left/right swipe gestures
-          if( Math.abs( x ) > Math.abs( y )) {
-            if( x > 0 ) {
-              config.naturalSwipe ? Reveal.left() : Reveal.right();
-            }
-            else {
-              config.naturalSwipe ? Reveal.right() : Reveal.left();
-            }
-          }
-          // Up/down swipe gestures
-          else {
-            if( y > 0 ) {
-              config.naturalSwipe ? Reveal.down() : Reveal.up();
-            }
-            else {
-              config.naturalSwipe ? Reveal.up() : Reveal.down();
-            }
-          }
-
-          lastGesture = now;
-        }
-      }
-      // Two hand gestures
-      else if( frame.hands.length === 2 ) {
-        // Upward two hand swipe gesture
-        if( gesture.direction[1] > 0 && gesture.type === 'swipe' ) {
-          Reveal.toggleOverview();
-        }
-
-        lastGesture = now;
-      }
-    }
-  });
-
-  controller.connect();
-})();
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/markdown/example.html b/docs/slides/IHP14/_support/reveal.js/plugin/markdown/example.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/markdown/example.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Markdown Demo</title>
-
-		<link rel="stylesheet" href="../../css/reveal.css">
-		<link rel="stylesheet" href="../../css/theme/default.css" id="theme">
-
-        <link rel="stylesheet" href="../../lib/css/zenburn.css">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-                <!-- Use external markdown resource, separate slides by three newlines; vertical slides by two newlines -->
-                <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section>
-
-                <!-- Slides are separated by three dashes (quick 'n dirty regular expression) -->
-                <section data-markdown data-separator="---">
-                    <script type="text/template">
-                        ## Demo 1
-                        Slide 1
-                        ---
-                        ## Demo 1
-                        Slide 2
-                        ---
-                        ## Demo 1
-                        Slide 3
-                    </script>
-                </section>
-
-                <!-- Slides are separated by newline + three dashes + newline, vertical slides identical but two dashes -->
-                <section data-markdown data-separator="^\n---\n$" data-vertical="^\n--\n$">
-                    <script type="text/template">
-                        ## Demo 2
-                        Slide 1.1
-
-                        --
-
-                        ## Demo 2
-                        Slide 1.2
-
-                        ---
-
-                        ## Demo 2
-                        Slide 2
-                    </script>
-                </section>
-
-                <!-- No "extra" slides, since there are no separators defined (so they'll become horizontal rulers) -->
-                <section data-markdown>
-                    <script type="text/template">
-                        A
-
-                        ---
-
-                        B
-
-                        ---
-
-                        C
-                    </script>
-                </section>
-
-                <!-- Slide attributes -->
-                <section data-markdown>
-                    <script type="text/template">
-                        <!-- .slide: data-background="#000000" -->
-                        ## Slide attributes
-                    </script>
-                </section>
-
-                <!-- Element attributes -->
-                <section data-markdown>
-                    <script type="text/template">
-                        ## Element attributes
-                        - Item 1 <!-- .element: class="fragment" data-fragment-index="2" -->
-                        - Item 2 <!-- .element: class="fragment" data-fragment-index="1" -->
-                    </script>
-                </section>
-
-                <!-- Code -->
-                <section data-markdown>
-                    <script type="text/template">
-                        ```php
-                        public function foo()
-                        {
-                            $foo = array(
-                                'bar' => 'bar'
-                            )
-                        }
-                        ```
-                    </script>
-                </section>
-
-            </div>
-		</div>
-
-		<script src="../../lib/js/head.min.js"></script>
-		<script src="../../js/reveal.js"></script>
-
-		<script>
-
-			Reveal.initialize({
-				controls: true,
-				progress: true,
-				history: true,
-				center: true,
-
-				// Optional libraries used to extend on reveal.js
-				dependencies: [
-					{ src: '../../lib/js/classList.js', condition: function() { return !document.body.classList; } },
-					{ src: 'marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-                    { src: 'markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-                    { src: '../highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
-					{ src: '../notes/notes.js' }
-				]
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/markdown/example.md b/docs/slides/IHP14/_support/reveal.js/plugin/markdown/example.md
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/markdown/example.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Markdown Demo
-
-
-
-## External 1.1
-
-Content 1.1
-
-Note: This will only appear in the speaker notes window.
-
-
-## External 1.2
-
-Content 1.2
-
-
-
-## External 2
-
-Content 2.1
-
-
-
-## External 3.1
-
-Content 3.1
-
-
-## External 3.2
-
-Content 3.2
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/markdown/markdown.js b/docs/slides/IHP14/_support/reveal.js/plugin/markdown/markdown.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/markdown/markdown.js
+++ /dev/null
@@ -1,392 +0,0 @@
-/**
- * The reveal.js markdown plugin. Handles parsing of
- * markdown inside of presentations as well as loading
- * of external markdown documents.
- */
-(function( root, factory ) {
-	if( typeof exports === 'object' ) {
-		module.exports = factory( require( './marked' ) );
-	}
-	else {
-		// Browser globals (root is window)
-		root.RevealMarkdown = factory( root.marked );
-		root.RevealMarkdown.initialize();
-	}
-}( this, function( marked ) {
-
-	if( typeof marked === 'undefined' ) {
-		throw 'The reveal.js Markdown plugin requires marked to be loaded';
-	}
-
-	if( typeof hljs !== 'undefined' ) {
-		marked.setOptions({
-			highlight: function( lang, code ) {
-				return hljs.highlightAuto( lang, code ).value;
-			}
-		});
-	}
-
-	var DEFAULT_SLIDE_SEPARATOR = '^\n---\n$',
-		DEFAULT_NOTES_SEPARATOR = 'note:',
-		DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
-		DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
-
-
-	/**
-	 * Retrieves the markdown contents of a slide section
-	 * element. Normalizes leading tabs/whitespace.
-	 */
-	function getMarkdownFromSlide( section ) {
-
-		var template = section.querySelector( 'script' );
-
-		// strip leading whitespace so it isn't evaluated as code
-		var text = ( template || section ).textContent;
-
-		var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
-			leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
-
-		if( leadingTabs > 0 ) {
-			text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
-		}
-		else if( leadingWs > 1 ) {
-			text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' );
-		}
-
-		return text;
-
-	}
-
-	/**
-	 * Given a markdown slide section element, this will
-	 * return all arguments that aren't related to markdown
-	 * parsing. Used to forward any other user-defined arguments
-	 * to the output markdown slide.
-	 */
-	function getForwardedAttributes( section ) {
-
-		var attributes = section.attributes;
-		var result = [];
-
-		for( var i = 0, len = attributes.length; i < len; i++ ) {
-			var name = attributes[i].name,
-				value = attributes[i].value;
-
-			// disregard attributes that are used for markdown loading/parsing
-			if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
-
-			if( value ) {
-				result.push( name + '=' + value );
-			}
-			else {
-				result.push( name );
-			}
-		}
-
-		return result.join( ' ' );
-
-	}
-
-	/**
-	 * Inspects the given options and fills out default
-	 * values for what's not defined.
-	 */
-	function getSlidifyOptions( options ) {
-
-		options = options || {};
-		options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
-		options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
-		options.attributes = options.attributes || '';
-
-		return options;
-
-	}
-
-	/**
-	 * Helper function for constructing a markdown slide.
-	 */
-	function createMarkdownSlide( content, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
-
-		if( notesMatch.length === 2 ) {
-			content = notesMatch[0] + '<aside class="notes" data-markdown>' + notesMatch[1].trim() + '</aside>';
-		}
-
-		return '<script type="text/template">' + content + '</script>';
-
-	}
-
-	/**
-	 * Parses a data string into multiple slides based
-	 * on the passed in separator arguments.
-	 */
-	function slidify( markdown, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
-			horizontalSeparatorRegex = new RegExp( options.separator );
-
-		var matches,
-			lastIndex = 0,
-			isHorizontal,
-			wasHorizontal = true,
-			content,
-			sectionStack = [];
-
-		// iterate until all blocks between separators are stacked up
-		while( matches = separatorRegex.exec( markdown ) ) {
-			notes = null;
-
-			// determine direction (horizontal by default)
-			isHorizontal = horizontalSeparatorRegex.test( matches[0] );
-
-			if( !isHorizontal && wasHorizontal ) {
-				// create vertical stack
-				sectionStack.push( [] );
-			}
-
-			// pluck slide content from markdown input
-			content = markdown.substring( lastIndex, matches.index );
-
-			if( isHorizontal && wasHorizontal ) {
-				// add to horizontal stack
-				sectionStack.push( content );
-			}
-			else {
-				// add to vertical stack
-				sectionStack[sectionStack.length-1].push( content );
-			}
-
-			lastIndex = separatorRegex.lastIndex;
-			wasHorizontal = isHorizontal;
-		}
-
-		// add the remaining slide
-		( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
-
-		var markdownSections = '';
-
-		// flatten the hierarchical stack, and insert <section data-markdown> tags
-		for( var i = 0, len = sectionStack.length; i < len; i++ ) {
-			// vertical
-			if( sectionStack[i] instanceof Array ) {
-				markdownSections += '<section '+ options.attributes +'>';
-
-				sectionStack[i].forEach( function( child ) {
-					markdownSections += '<section data-markdown>' +  createMarkdownSlide( child, options ) + '</section>';
-				} );
-
-				markdownSections += '</section>';
-			}
-			else {
-				markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
-			}
-		}
-
-		return markdownSections;
-
-	}
-
-	/**
-	 * Parses any current data-markdown slides, splits
-	 * multi-slide markdown into separate sections and
-	 * handles loading of external markdown.
-	 */
-	function processSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]'),
-			section;
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			section = sections[i];
-
-			if( section.getAttribute( 'data-markdown' ).length ) {
-
-				var xhr = new XMLHttpRequest(),
-					url = section.getAttribute( 'data-markdown' );
-
-				datacharset = section.getAttribute( 'data-charset' );
-
-				// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
-				if( datacharset != null && datacharset != '' ) {
-					xhr.overrideMimeType( 'text/html; charset=' + datacharset );
-				}
-
-				xhr.onreadystatechange = function() {
-					if( xhr.readyState === 4 ) {
-						if ( xhr.status >= 200 && xhr.status < 300 ) {
-
-							section.outerHTML = slidify( xhr.responseText, {
-								separator: section.getAttribute( 'data-separator' ),
-								verticalSeparator: section.getAttribute( 'data-vertical' ),
-								notesSeparator: section.getAttribute( 'data-notes' ),
-								attributes: getForwardedAttributes( section )
-							});
-
-						}
-						else {
-
-							section.outerHTML = '<section data-state="alert">' +
-								'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
-								'Check your browser\'s JavaScript console for more details.' +
-								'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
-								'</section>';
-
-						}
-					}
-				};
-
-				xhr.open( 'GET', url, false );
-
-				try {
-					xhr.send();
-				}
-				catch ( e ) {
-					alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
-				}
-
-			}
-			else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-vertical' ) || section.getAttribute( 'data-notes' ) ) {
-
-				section.outerHTML = slidify( getMarkdownFromSlide( section ), {
-					separator: section.getAttribute( 'data-separator' ),
-					verticalSeparator: section.getAttribute( 'data-vertical' ),
-					notesSeparator: section.getAttribute( 'data-notes' ),
-					attributes: getForwardedAttributes( section )
-				});
-
-			}
-			else {
-				section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
-			}
-		}
-
-	}
-
-	/**
-	 * Check if a node value has the attributes pattern.
-	 * If yes, extract it and add that value as one or several attributes
-	 * the the terget element.
-	 *
-	 * You need Cache Killer on Chrome to see the effect on any FOM transformation
-	 * directly on refresh (F5)
-	 * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
-	 */
-	function addAttributeInElement( node, elementTarget, separator ) {
-
-		var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
-		var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' );
-		var nodeValue = node.nodeValue;
-		if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
-
-			var classes = matches[1];
-			nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
-			node.nodeValue = nodeValue;
-			while( matchesClass = mardownClassRegex.exec( classes ) ) {
-				elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Add attributes to the parent element of a text node,
-	 * or the element of an attribute node.
-	 */
-	function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
-
-		if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
-			previousParentElement = element;
-			for( var i = 0; i < element.childNodes.length; i++ ) {
-				childElement = element.childNodes[i];
-				if ( i > 0 ) {
-					j = i - 1;
-					while ( j >= 0 ) {
-						aPreviousChildElement = element.childNodes[j];
-						if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
-							previousParentElement = aPreviousChildElement;
-							break;
-						}
-						j = j - 1;
-					}
-				}
-				parentSection = section;
-				if( childElement.nodeName ==  "section" ) {
-					parentSection = childElement ;
-					previousParentElement = childElement ;
-				}
-				if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
-					addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
-				}
-			}
-		}
-
-		if ( element.nodeType == Node.COMMENT_NODE ) {
-			if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
-				addAttributeInElement( element, section, separatorSectionAttributes );
-			}
-		}
-	}
-
-	/**
-	 * Converts any current data-markdown slides in the
-	 * DOM to HTML.
-	 */
-	function convertSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]');
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			var section = sections[i];
-
-			// Only parse the same slide once
-			if( !section.getAttribute( 'data-markdown-parsed' ) ) {
-
-				section.setAttribute( 'data-markdown-parsed', true )
-
-				var notes = section.querySelector( 'aside.notes' );
-				var markdown = getMarkdownFromSlide( section );
-
-				section.innerHTML = marked( markdown );
-				addAttributes( 	section, section, null, section.getAttribute( 'data-element-attributes' ) ||
-								section.parentNode.getAttribute( 'data-element-attributes' ) ||
-								DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
-								section.getAttribute( 'data-attributes' ) ||
-								section.parentNode.getAttribute( 'data-attributes' ) ||
-								DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
-
-				// If there were notes, we need to re-add them after
-				// having overwritten the section's HTML
-				if( notes ) {
-					section.appendChild( notes );
-				}
-
-			}
-
-		}
-
-	}
-
-	// API
-	return {
-
-		initialize: function() {
-			processSlides();
-			convertSlides();
-		},
-
-		// TODO: Do these belong in the API?
-		processSlides: processSlides,
-		convertSlides: convertSlides,
-		slidify: slidify
-
-	};
-
-}));
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/markdown/marked.js b/docs/slides/IHP14/_support/reveal.js/plugin/markdown/marked.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/markdown/marked.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
- */
-
-(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
-text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";block.html=replace(block.html)("comment",/\x3c!--[\s\S]*?--\x3e/)("closed",
-/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1",
-"\\2")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm)if(this.options.tables)this.rules=block.tables;else this.rules=block.gfm}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};
-Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1)this.tokens.push({type:"space"})}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,
-"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,
-"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]="center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].split(/ *\| */);this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=
-src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);
-bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+
-1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item[item.length-1]==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script",text:cap[0]});continue}if(top&&
-(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]=
-"center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */);this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1][cap[1].length-1]==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",
-text:cap[0]});continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^\x3c!--[\s\S]*?--\x3e|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
-code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([^\s]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
-em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;
-if(!this.links)throw new Error("Tokens array requires a `links` property.");if(this.options.gfm)if(this.options.breaks)this.rules=inline.breaks;else this.rules=inline.gfm;else if(this.options.pedantic)this.rules=inline.pedantic}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);
-out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1][6]===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.url.exec(src)){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.tag.exec(src)){src=src.substring(cap[0].length);
-out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);out+=this.outputLink(cap,{href:cap[2],title:cap[3]});continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0][0];src=cap[0].substring(1)+src;continue}out+=this.outputLink(cap,link);continue}if(cap=this.rules.strong.exec(src)){src=
-src.substring(cap[0].length);out+="<strong>"+this.output(cap[2]||cap[1])+"</strong>";continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+="<em>"+this.output(cap[2]||cap[1])+"</em>";continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+="<code>"+escape(cap[2],true)+"</code>";continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+="<br>";continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+="<del>"+
-this.output(cap[1])+"</del>";continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(cap[0]);continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return out};InlineLexer.prototype.outputLink=function(cap,link){if(cap[0][0]!=="!")return'<a href="'+escape(link.href)+'"'+(link.title?' title="'+escape(link.title)+'"':"")+">"+this.output(cap[1])+"</a>";else return'<img src="'+escape(link.href)+'" alt="'+escape(cap[1])+'"'+(link.title?' title="'+
-escape(link.title)+'"':"")+">"};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,"\u2014").replace(/'([^']*)'/g,"\u2018$1\u2019").replace(/"([^"]*)"/g,"\u201c$1\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>0.5)ch="x"+ch.toString(16);out+="&#"+ch+";"}return out};function Parser(options){this.tokens=[];this.token=null;
-this.options=options||marked.defaults}Parser.parse=function(src,options){var parser=new Parser(options);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options);this.tokens=src.reverse();var out="";while(this.next())out+=this.tok();return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;
-while(this.peek().type==="text")body+="\n"+this.next().text;return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case "space":return"";case "hr":return"<hr>\n";case "heading":return"<h"+this.token.depth+">"+this.inline.output(this.token.text)+"</h"+this.token.depth+">\n";case "code":if(this.options.highlight){var code=this.options.highlight(this.token.text,this.token.lang);if(code!=null&&code!==this.token.text){this.token.escaped=true;this.token.text=code}}if(!this.token.escaped)this.token.text=
-escape(this.token.text,true);return"<pre><code"+(this.token.lang?' class="'+this.options.langPrefix+this.token.lang+'"':"")+">"+this.token.text+"</code></pre>\n";case "table":var body="",heading,i,row,cell,j;body+="<thead>\n<tr>\n";for(i=0;i<this.token.header.length;i++){heading=this.inline.output(this.token.header[i]);body+=this.token.align[i]?'<th align="'+this.token.align[i]+'">'+heading+"</th>\n":"<th>"+heading+"</th>\n"}body+="</tr>\n</thead>\n";body+="<tbody>\n";for(i=0;i<this.token.cells.length;i++){row=
-this.token.cells[i];body+="<tr>\n";for(j=0;j<row.length;j++){cell=this.inline.output(row[j]);body+=this.token.align[j]?'<td align="'+this.token.align[j]+'">'+cell+"</td>\n":"<td>"+cell+"</td>\n"}body+="</tr>\n"}body+="</tbody>\n";return"<table>\n"+body+"</table>\n";case "blockquote_start":var body="";while(this.next().type!=="blockquote_end")body+=this.tok();return"<blockquote>\n"+body+"</blockquote>\n";case "list_start":var type=this.token.ordered?"ol":"ul",body="";while(this.next().type!=="list_end")body+=
-this.tok();return"<"+type+">\n"+body+"</"+type+">\n";case "list_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.token.type==="text"?this.parseText():this.tok();return"<li>"+body+"</li>\n";case "loose_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.tok();return"<li>"+body+"</li>\n";case "html":return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;case "paragraph":return"<p>"+this.inline.output(this.token.text)+
-"</p>\n";case "text":return"<p>"+this.parseText()+"</p>\n"}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=
-1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target)if(Object.prototype.hasOwnProperty.call(target,key))obj[key]=target[key]}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}if(opt)opt=merge({},marked.defaults,opt);var tokens=Lexer.lex(tokens,opt),highlight=opt.highlight,pending=0,l=tokens.length,i=0;if(!highlight||highlight.length<3)return callback(null,Parser.parse(tokens,opt));var done=function(){delete opt.highlight;
-var out=Parser.parse(tokens,opt);opt.highlight=highlight;return callback(null,out)};for(;i<l;i++)(function(token){if(token.type!=="code")return;pending++;return highlight(token.text,token.lang,function(err,code){if(code==null||code===token.text)return--pending||done();token.text=code;token.escaped=true;--pending||done()})})(tokens[i]);return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";
-if((opt||marked.defaults).silent)return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>";throw e;}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:""};marked.Parser=Parser;marked.parser=Parser.parse;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;
-marked.parse=marked;if(typeof exports==="object")module.exports=marked;else if(typeof define==="function"&&define.amd)define(function(){return marked});else this.marked=marked}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/math/math.js b/docs/slides/IHP14/_support/reveal.js/plugin/math/math.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/math/math.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * A plugin which enables rendering of math equations inside
- * of reveal.js slides. Essentially a thin wrapper for MathJax.
- *
- * @author Hakim El Hattab
- */
-var RevealMath = window.RevealMath || (function(){
-
-	var options = Reveal.getConfig().math || {};
-	options.mathjax = options.mathjax || 'http://cdn.mathjax.org/mathjax/latest/MathJax.js';
-	options.config = options.config || 'TeX-AMS_HTML-full';
-
-	loadScript( options.mathjax + '?config=' + options.config, function() {
-
-		MathJax.Hub.Config({
-			messageStyle: 'none',
-			tex2jax: { inlineMath: [['$','$'],['\\(','\\)']] },
-			skipStartupTypeset: true
-		});
-
-		// Typeset followed by an immediate reveal.js layout since
-		// the typesetting process could affect slide height
-		MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] );
-		MathJax.Hub.Queue( Reveal.layout );
-
-		// Reprocess equations in slides when they turn visible
-		Reveal.addEventListener( 'slidechanged', function( event ) {
-
-			MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] );
-
-		} );
-
-	} );
-
-	function loadScript( url, callback ) {
-
-		var head = document.querySelector( 'head' );
-		var script = document.createElement( 'script' );
-		script.type = 'text/javascript';
-		script.src = url;
-
-		// Wrapper for callback to make sure it only fires once
-		var finish = function() {
-			if( typeof callback === 'function' ) {
-				callback.call();
-				callback = null;
-			}
-		}
-
-		script.onload = finish;
-
-		// IE
-		script.onreadystatechange = function() {
-			if ( this.readyState === 'loaded' ) {
-				finish();
-			}
-		}
-
-		// Normal browsers
-		head.appendChild( script );
-
-	}
-
-})();
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/client.js b/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/client.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/client.js
+++ /dev/null
@@ -1,13 +0,0 @@
-(function() {
-	var multiplex = Reveal.getConfig().multiplex;
-	var socketId = multiplex.id;
-	var socket = io.connect(multiplex.url);
-
-	socket.on(multiplex.id, function(data) {
-		// ignore data from sockets that aren't ours
-		if (data.socketId !== socketId) { return; }
-		if( window.location.host === 'localhost:1947' ) return;
-
-		Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote');
-	});
-}());
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/index.js b/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/index.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var express		= require('express');
-var fs			= require('fs');
-var io			= require('socket.io');
-var crypto		= require('crypto');
-
-var app			= express.createServer();
-var staticDir	= express.static;
-
-io				= io.listen(app);
-
-var opts = {
-	port: 1948,
-	baseDir : __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		if (typeof slideData.secret == 'undefined' || slideData.secret == null || slideData.secret === '') return;
-		if (createHash(slideData.secret) === slideData.socketId) {
-			slideData.secret = null;
-			socket.broadcast.emit(slideData.socketId, slideData);
-		};
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/token", function(req,res) {
-	var ts = new Date().getTime();
-	var rand = Math.floor(Math.random()*9999999);
-	var secret = ts.toString() + rand.toString();
-	res.send({secret: secret, socketId: createHash(secret)});
-});
-
-var createHash = function(secret) {
-	var cipher = crypto.createCipher('blowfish', secret);
-	return(cipher.final('hex'));
-};
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset );
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/master.js b/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/master.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/multiplex/master.js
+++ /dev/null
@@ -1,51 +0,0 @@
-(function() {
-	// Don't emit events from inside of notes windows
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var multiplex = Reveal.getConfig().multiplex;
-
-	var socket = io.connect(multiplex.url);
-
-	var notify = function( slideElement, indexh, indexv, origin ) {
-		if( typeof origin === 'undefined' && origin !== 'remote' ) {
-			var nextindexh;
-			var nextindexv;
-
-			var fragmentindex = Reveal.getIndices().f;
-			if (typeof fragmentindex == 'undefined') {
-				fragmentindex = 0;
-			}
-
-			if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-				nextindexh = indexh;
-				nextindexv = indexv + 1;
-			} else {
-				nextindexh = indexh + 1;
-				nextindexv = 0;
-			}
-
-			var slideData = {
-				indexh : indexh,
-				indexv : indexv,
-				indexf : fragmentindex,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				secret: multiplex.secret,
-				socketId : multiplex.id
-			};
-
-			socket.emit('slidechanged', slideData);
-		}
-	}
-
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		notify( event.currentSlide, event.indexh, event.indexv, event.origin );
-	} );
-
-	var fragmentNotify = function( event ) {
-		notify( Reveal.getCurrentSlide(), Reveal.getIndices().h, Reveal.getIndices().v, event.origin );
-	};
-
-	Reveal.addEventListener( 'fragmentshown', fragmentNotify );
-	Reveal.addEventListener( 'fragmenthidden', fragmentNotify );
-}());
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/client.js b/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/client.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/client.js
+++ /dev/null
@@ -1,57 +0,0 @@
-(function() {
-	// don't emit events from inside the previews themselves
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var socket = io.connect(window.location.origin);
-	var socketId = Math.random().toString().slice(2);
-	
-	console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
-	window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);
-
-	// Fires when a fragment is shown
-	Reveal.addEventListener( 'fragmentshown', function( event ) {
-		var fragmentData = {
-			fragment : 'next',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when a fragment is hidden
-	Reveal.addEventListener( 'fragmenthidden', function( event ) {
-		var fragmentData = {
-			fragment : 'previous',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when slide is changed
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		var nextindexh;
-		var nextindexv;
-		var slideElement = event.currentSlide;
-
-		if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-			nextindexh = event.indexh;
-			nextindexv = event.indexv + 1;
-		} else {
-			nextindexh = event.indexh + 1;
-			nextindexv = 0;
-		}
-
-		var notes = slideElement.querySelector('aside.notes');
-		var slideData = {
-			notes : notes ? notes.innerHTML : '',
-			indexh : event.indexh,
-			indexv : event.indexv,
-			nextindexh : nextindexh,
-			nextindexv : nextindexv,
-			socketId : socketId,
-			markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false
-
-		};
-
-		socket.emit('slidechanged', slideData);
-	} );
-}());
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/index.js b/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/index.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/index.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var express   = require('express');
-var fs        = require('fs');
-var io        = require('socket.io');
-var _         = require('underscore');
-var Mustache  = require('mustache');
-
-var app       = express.createServer();
-var staticDir = express.static;
-
-io            = io.listen(app);
-
-var opts = {
-	port :      1947,
-	baseDir :   __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		socket.broadcast.emit('slidedata', slideData);
-	});
-	socket.on('fragmentchanged', function(fragmentData) {
-		socket.broadcast.emit('fragmentdata', fragmentData);
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/notes/:socketId", function(req, res) {
-
-	fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
-		res.send(Mustache.to_html(data.toString(), {
-			socketId : req.params.socketId
-		}));
-	});
-	// fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
-});
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
-
-console.log( brown + "reveal.js - Speaker Notes" + reset );
-console.log( "1. Open the slides at " + green + slidesLocation + reset );
-console.log( "2. Click on the link your JS console to go to the notes page" );
-console.log( "3. Advance through your slides and your notes will advance automatically" );
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/notes.html b/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/notes.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/notes-server/notes.html
+++ /dev/null
@@ -1,142 +0,0 @@
-<!doctype html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8">
-
-		<meta name="viewport" content="width=1150">
-
-		<title>reveal.js - Slide Notes</title>
-
-		<style>
-			body {
-				font-family: Helvetica;
-			}
-
-			#notes {
-				font-size: 24px;
-				width: 640px;
-				margin-top: 5px;
-				clear: left;
-			}
-
-			#wrap-current-slide {
-				width: 640px;
-				height: 512px;
-				float: left;
-				overflow: hidden;
-			}
-
-			#current-slide {
-				width: 1280px;
-				height: 1024px;
-				border: none;
-
-				-webkit-transform-origin: 0 0;
-				   -moz-transform-origin: 0 0;
-				    -ms-transform-origin: 0 0;
-				     -o-transform-origin: 0 0;
-				        transform-origin: 0 0;
-
-				-webkit-transform: scale(0.5);
-				   -moz-transform: scale(0.5);
-				    -ms-transform: scale(0.5);
-				     -o-transform: scale(0.5);
-				        transform: scale(0.5);
-			}
-
-			#wrap-next-slide {
-				width: 448px;
-				height: 358px;
-				float: left;
-				margin: 0 0 0 10px;
-				overflow: hidden;
-			}
-
-			#next-slide {
-				width: 1280px;
-				height: 1024px;
-				border: none;
-
-				-webkit-transform-origin: 0 0;
-				   -moz-transform-origin: 0 0;
-				    -ms-transform-origin: 0 0;
-				     -o-transform-origin: 0 0;
-				        transform-origin: 0 0;
-
-				-webkit-transform: scale(0.35);
-				   -moz-transform: scale(0.35);
-				    -ms-transform: scale(0.35);
-				     -o-transform: scale(0.35);
-				        transform: scale(0.35);
-			}
-
-			.slides {
-				position: relative;
-				margin-bottom: 10px;
-				border: 1px solid black;
-				border-radius: 2px;
-				background: rgb(28, 30, 32);
-			}
-
-			.slides span {
-				position: absolute;
-				top: 3px;
-				left: 3px;
-				font-weight: bold;
-				font-size: 14px;
-				color: rgba( 255, 255, 255, 0.9 );
-			}
-		</style>
-	</head>
-
-	<body>
-
-		<div id="wrap-current-slide" class="slides">
-			<iframe src="/?receiver" width="1280" height="1024" id="current-slide"></iframe>
-		</div>
-
-		<div id="wrap-next-slide" class="slides">
-			<iframe src="/?receiver" width="640" height="512" id="next-slide"></iframe>
-			<span>UPCOMING:</span>
-		</div>
-		<div id="notes"></div>
-
-		<script src="/socket.io/socket.io.js"></script>
-		<script src="/plugin/markdown/marked.js"></script>
-
-		<script>
-		var socketId = '{{socketId}}';
-		var socket = io.connect(window.location.origin);
-		var notes = document.getElementById('notes');
-		var currentSlide = document.getElementById('current-slide');
-		var nextSlide = document.getElementById('next-slide');
-
-		socket.on('slidedata', function(data) {
-			// ignore data from sockets that aren't ours
-			if (data.socketId !== socketId) { return; }
-
-			if (data.markdown) {
-				notes.innerHTML = marked(data.notes);
-			}
-			else {
-				notes.innerHTML = data.notes;
-			}
-
-			currentSlide.contentWindow.Reveal.slide(data.indexh, data.indexv);
-			nextSlide.contentWindow.Reveal.slide(data.nextindexh, data.nextindexv);
-		});
-		socket.on('fragmentdata', function(data) {
-			// ignore data from sockets that aren't ours
-			if (data.socketId !== socketId) { return; }
-
-			if (data.fragment === 'next') {
-				currentSlide.contentWindow.Reveal.nextFragment();
-			}
-			else if (data.fragment === 'previous') {
-				currentSlide.contentWindow.Reveal.prevFragment();
-			}
-		});
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/notes/notes.html b/docs/slides/IHP14/_support/reveal.js/plugin/notes/notes.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/notes/notes.html
+++ /dev/null
@@ -1,267 +0,0 @@
-<!doctype html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Slide Notes</title>
-
-		<style>
-			body {
-				font-family: Helvetica;
-			}
-
-			#notes {
-				font-size: 24px;
-				width: 640px;
-				margin-top: 5px;
-				clear: left;
-			}
-
-			#wrap-current-slide {
-				width: 640px;
-				height: 512px;
-				float: left;
-				overflow: hidden;
-			}
-
-			#current-slide {
-				width: 1280px;
-				height: 1024px;
-				border: none;
-
-				-webkit-transform-origin: 0 0;
-				   -moz-transform-origin: 0 0;
-					-ms-transform-origin: 0 0;
-					 -o-transform-origin: 0 0;
-						transform-origin: 0 0;
-
-				-webkit-transform: scale(0.5);
-				   -moz-transform: scale(0.5);
-					-ms-transform: scale(0.5);
-					 -o-transform: scale(0.5);
-						transform: scale(0.5);
-			}
-
-			#wrap-next-slide {
-				width: 448px;
-				height: 358px;
-				float: left;
-				margin: 0 0 0 10px;
-				overflow: hidden;
-			}
-
-			#next-slide {
-				width: 1280px;
-				height: 1024px;
-				border: none;
-
-				-webkit-transform-origin: 0 0;
-				   -moz-transform-origin: 0 0;
-					-ms-transform-origin: 0 0;
-					 -o-transform-origin: 0 0;
-						transform-origin: 0 0;
-
-				-webkit-transform: scale(0.35);
-				   -moz-transform: scale(0.35);
-					-ms-transform: scale(0.35);
-					 -o-transform: scale(0.35);
-						transform: scale(0.35);
-			}
-
-			.slides {
-				position: relative;
-				margin-bottom: 10px;
-				border: 1px solid black;
-				border-radius: 2px;
-				background: rgb(28, 30, 32);
-			}
-
-			.slides span {
-				position: absolute;
-				top: 3px;
-				left: 3px;
-				font-weight: bold;
-				font-size: 14px;
-				color: rgba( 255, 255, 255, 0.9 );
-			}
-
-			.error {
-				font-weight: bold;
-				color: red;
-				font-size: 1.5em;
-				text-align: center;
-				margin-top: 10%;
-			}
-
-			.error code {
-				font-family: monospace;
-			}
-
-			.time {
-				width: 448px;
-				margin: 30px 0 0 10px;
-				float: left;
-				text-align: center;
-				opacity: 0;
-
-				-webkit-transition: opacity 0.4s;
-				   -moz-transition: opacity 0.4s;
-				     -o-transition: opacity 0.4s;
-				        transition: opacity 0.4s;
-			}
-
-			.elapsed,
-			.clock {
-				color: #333;
-				font-size: 2em;
-				text-align: center;
-				display: inline-block;
-				padding: 0.5em;
-				background-color: #eee;
-				border-radius: 10px;
-			}
-
-			.elapsed h2,
-			.clock h2 {
-				font-size: 0.8em;
-				line-height: 100%;
-				margin: 0;
-				color: #aaa;
-			}
-
-			.elapsed .mute {
-				color: #ddd;
-			}
-
-		</style>
-	</head>
-
-	<body>
-
-		<script>
-			function getNotesURL( controls ) {
-				return window.opener.location.protocol + '//' + window.opener.location.host + window.opener.location.pathname + '?receiver&controls='+ ( controls || 'false' ) +'&progress=false&overview=false' + window.opener.location.hash;
-			}
-			var notesCurrentSlideURL = getNotesURL( true );
-			var notesNextSlideURL = getNotesURL( false );
-		</script>
-
-		<div id="wrap-current-slide" class="slides">
-			<script>document.write( '<iframe width="1280" height="1024" id="current-slide" src="'+ notesCurrentSlideURL +'"></iframe>' );</script>
-		</div>
-
-		<div id="wrap-next-slide" class="slides">
-			<script>document.write( '<iframe width="640" height="512" id="next-slide" src="'+ notesNextSlideURL +'"></iframe>' );</script>
-			<span>UPCOMING:</span>
-		</div>
-
-		<div class="time">
-			<div class="clock">
-				<h2>Time</h2>
-				<span id="clock">0:00:00 AM</span>
-			</div>
-			<div class="elapsed">
-				<h2>Elapsed</h2>
-				<span id="hours">00</span><span id="minutes">:00</span><span id="seconds">:00</span>
-			</div>
-		</div>
-
-		<div id="notes"></div>
-
-		<script src="../../plugin/markdown/marked.js"></script>
-		<script>
-
-			window.addEventListener( 'load', function() {
-
-				if( window.opener && window.opener.location && window.opener.location.href ) {
-
-					var notes = document.getElementById( 'notes' ),
-						currentSlide = document.getElementById( 'current-slide' ),
-						nextSlide = document.getElementById( 'next-slide' ),
-						silenced = false;
-
-					window.addEventListener( 'message', function( event ) {
-						var data = JSON.parse( event.data );
-
-						// No need for updating the notes in case of fragment changes
-						if ( data.notes !== undefined) {
-							if( data.markdown ) {
-								notes.innerHTML = marked( data.notes );
-							}
-							else {
-								notes.innerHTML = data.notes;
-							}
-						}
-
-						silenced = true;
-
-						// Update the note slides
-						currentSlide.contentWindow.Reveal.slide( data.indexh, data.indexv, data.indexf );
-						nextSlide.contentWindow.Reveal.slide( data.nextindexh, data.nextindexv );
-
-						silenced = false;
-
-					}, false );
-
-					var start = new Date(),
-						timeEl = document.querySelector( '.time' ),
-						clockEl = document.getElementById( 'clock' ),
-						hoursEl = document.getElementById( 'hours' ),
-						minutesEl = document.getElementById( 'minutes' ),
-						secondsEl = document.getElementById( 'seconds' );
-
-					setInterval( function() {
-
-						timeEl.style.opacity = 1;
-
-						var diff, hours, minutes, seconds,
-							now = new Date();
-
-						diff = now.getTime() - start.getTime();
-						hours = Math.floor( diff / ( 1000 * 60 * 60 ) );
-						minutes = Math.floor( ( diff / ( 1000 * 60 ) ) % 60 );
-						seconds = Math.floor( ( diff / 1000 ) % 60 );
-
-						clockEl.innerHTML = now.toLocaleTimeString();
-						hoursEl.innerHTML = zeroPadInteger( hours );
-						hoursEl.className = hours > 0 ? "" : "mute";
-						minutesEl.innerHTML = ":" + zeroPadInteger( minutes );
-						minutesEl.className = minutes > 0 ? "" : "mute";
-						secondsEl.innerHTML = ":" + zeroPadInteger( seconds );
-
-					}, 1000 );
-
-					// Broadcasts the state of the notes window to synchronize
-					// the main window
-					function synchronizeMainWindow() {
-
-						if( !silenced ) {
-							var indices = currentSlide.contentWindow.Reveal.getIndices();
-							window.opener.Reveal.slide( indices.h, indices.v, indices.f );
-						}
-
-					}
-
-					// Navigate the main window when the notes slide changes
-					currentSlide.contentWindow.Reveal.addEventListener( 'slidechanged', synchronizeMainWindow );
-					currentSlide.contentWindow.Reveal.addEventListener( 'fragmentshown', synchronizeMainWindow );
-					currentSlide.contentWindow.Reveal.addEventListener( 'fragmenthidden', synchronizeMainWindow );
-
-				}
-				else {
-
-					document.body.innerHTML =  '<p class="error">Unable to access <code>window.opener.location</code>.<br>Make sure the presentation is running on a web server.</p>';
-
-				}
-
-
-			}, false );
-
-			function zeroPadInteger( num ) {
-				var str = "00" + parseInt( num );
-				return str.substring( str.length - 2 );
-			}
-
-		</script>
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/notes/notes.js b/docs/slides/IHP14/_support/reveal.js/plugin/notes/notes.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/notes/notes.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Handles opening of and synchronization with the reveal.js
- * notes window.
- */
-var RevealNotes = (function() {
-
-	function openNotes() {
-		var jsFileLocation = document.querySelector('script[src$="notes.js"]').src;  // this js file path
-		jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, '');   // the js folder path
-		var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
-
-		// Fires when slide is changed
-		Reveal.addEventListener( 'slidechanged', post );
-
-		// Fires when a fragment is shown
-		Reveal.addEventListener( 'fragmentshown', post );
-
-		// Fires when a fragment is hidden
-		Reveal.addEventListener( 'fragmenthidden', post );
-
-		/**
-		 * Posts the current slide data to the notes window
-		 */
-		function post() {
-			var slideElement = Reveal.getCurrentSlide(),
-				slideIndices = Reveal.getIndices(),
-				messageData;
-
-			var notes = slideElement.querySelector( 'aside.notes' ),
-				nextindexh,
-				nextindexv;
-
-			if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
-				nextindexh = slideIndices.h;
-				nextindexv = slideIndices.v + 1;
-			} else {
-				nextindexh = slideIndices.h + 1;
-				nextindexv = 0;
-			}
-
-			messageData = {
-				notes : notes ? notes.innerHTML : '',
-				indexh : slideIndices.h,
-				indexv : slideIndices.v,
-				indexf : slideIndices.f,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
-			};
-
-			notesPopup.postMessage( JSON.stringify( messageData ), '*' );
-		}
-
-		// Navigate to the current slide when the notes are loaded
-		notesPopup.addEventListener( 'load', function( event ) {
-			post();
-		}, false );
-	}
-
-	// If the there's a 'notes' query set, open directly
-	if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
-		openNotes();
-	}
-
-	// Open the notes when the 's' key is hit
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openNotes();
-		}
-	}, false );
-
-	return { open: openNotes };
-})();
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/postmessage/example.html b/docs/slides/IHP14/_support/reveal.js/plugin/postmessage/example.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/postmessage/example.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<html>
-	<body>
-
-		<iframe id="reveal" src="../../index.html" style="border: 0;" width="500" height="500"></iframe>
-
-		<div>
-			<input id="back" type="button" value="go back"/>
-			<input id="ahead" type="button" value="go ahead"/>
-			<input id="slideto" type="button" value="slideto 2-2"/>
-		</div>
-
-		<script>
-
-			(function (){
-
-				var back = document.getElementById( 'back' ),
-						ahead = document.getElementById( 'ahead' ),
-						slideto = document.getElementById( 'slideto' ),
-						reveal =  window.frames[0];
-
-					back.addEventListener( 'click', function () {
-						
-					reveal.postMessage( JSON.stringify({method: 'prev', args: []}), '*' );
-				}, false );
-
-				ahead.addEventListener( 'click', function (){
-					reveal.postMessage( JSON.stringify({method: 'next', args: []}), '*' );
-				}, false );
-
-				slideto.addEventListener( 'click', function (){
-					reveal.postMessage( JSON.stringify({method: 'slide', args: [2,2]}), '*' );
-				}, false );
-
-			}());
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/postmessage/postmessage.js b/docs/slides/IHP14/_support/reveal.js/plugin/postmessage/postmessage.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/postmessage/postmessage.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-
-	simple postmessage plugin
-
-	Useful when a reveal slideshow is inside an iframe.
-	It allows to call reveal methods from outside.
-
-	Example:
-		 var reveal =  window.frames[0];
-
-		 // Reveal.prev(); 
-		 reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
-		 // Reveal.next(); 
-		 reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
-		 // Reveal.slide(2, 2); 
-		 reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
-
-	Add to the slideshow:
-
-		dependencies: [
-			...
-			{ src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
-		]
-
-*/
-
-(function (){
-
-	window.addEventListener( "message", function ( event ) {
-		var data = JSON.parse( event.data ),
-				method = data.method,
-				args = data.args;
-
-		if( typeof Reveal[method] === 'function' ) {
-			Reveal[method].apply( Reveal, data.args );
-		}
-	}, false);
-
-}());
-
-
-
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/print-pdf/print-pdf.js b/docs/slides/IHP14/_support/reveal.js/plugin/print-pdf/print-pdf.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/print-pdf/print-pdf.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * phantomjs script for printing presentations to PDF.
- *
- * Example:
- * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
- *
- * By Manuel Bieh (https://github.com/manuelbieh)
- */
-
-// html2pdf.js
-var page = new WebPage();
-var system = require( 'system' );
-
-page.viewportSize  = {
-	width: 1024,
-	height: 768
-};
-
-page.paperSize = {
-	format: 'letter',
-	orientation: 'landscape',
-	margin: {
-		left: '0',
-		right: '0',
-		top: '0',
-		bottom: '0'
-	}
-};
-
-var revealFile = system.args[1] || 'index.html?print-pdf';
-var slideFile = system.args[2] || 'slides.pdf';
-
-if( slideFile.match( /\.pdf$/gi ) === null ) {
-	slideFile += '.pdf';
-}
-
-console.log( 'Printing PDF...' );
-
-page.open( revealFile, function( status ) {
-	console.log( 'Printed succesfully' );
-	page.render( slideFile );
-	phantom.exit();
-} );
-
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/remotes/remotes.js b/docs/slides/IHP14/_support/reveal.js/plugin/remotes/remotes.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/remotes/remotes.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Touch-based remote controller for your presentation courtesy 
- * of the folks at http://remotes.io
- */
-
-(function(window){
-
-    /**
-     * Detects if we are dealing with a touch enabled device (with some false positives)
-     * Borrowed from modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touch.js   
-     */
-    var hasTouch  = (function(){
-        return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
-    })();
-
-    /**
-     * Detects if notes are enable and the current page is opened inside an /iframe
-     * this prevents loading Remotes.io several times
-     */
-    var isNotesAndIframe = (function(){
-        return window.RevealNotes && !(self == top);
-    })();
-
-    if(!hasTouch && !isNotesAndIframe){
-        head.ready( 'remotes.ne.min.js', function() {
-            new Remotes("preview")
-                .on("swipe-left", function(e){ Reveal.right(); })
-                .on("swipe-right", function(e){ Reveal.left(); })
-                .on("swipe-up", function(e){ Reveal.down(); })
-                .on("swipe-down", function(e){ Reveal.up(); })
-                .on("tap", function(e){ Reveal.next(); })
-                .on("zoom-out", function(e){ Reveal.toggleOverview(true); })
-                .on("zoom-in", function(e){ Reveal.toggleOverview(false); })
-            ;
-        } );
-
-        head.js('https://hakim-static.s3.amazonaws.com/reveal-js/remotes.ne.min.js');
-    }
-})(window);
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/search/search.js b/docs/slides/IHP14/_support/reveal.js/plugin/search/search.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/search/search.js
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
- * by navigatating to that slide and highlighting it.
- *
- * By Jon Snyder <snyder.jon@gmail.com>, February 2013
- */
-
-var RevealSearch = (function() {
-
-	var matchedSlides;
-	var currentMatchedIndex;
-	var searchboxDirty;
-	var myHilitor;
-
-// Original JavaScript code by Chirp Internet: www.chirp.com.au
-// Please acknowledge use of this code by including this header.
-// 2/2013 jon: modified regex to display any match, not restricted to word boundaries.
-
-function Hilitor(id, tag)
-{
-
-  var targetNode = document.getElementById(id) || document.body;
-  var hiliteTag = tag || "EM";
-  var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM|SPAN)$");
-  var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"];
-  var wordColor = [];
-  var colorIdx = 0;
-  var matchRegex = "";
-  var matchingSlides = [];
-
-  this.setRegex = function(input)
-  {
-    input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|");
-    matchRegex = new RegExp("(" + input + ")","i");
-  }
-
-  this.getRegex = function()
-  {
-    return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " ");
-  }
-
-  // recursively apply word highlighting
-  this.hiliteWords = function(node)
-  {
-    if(node == undefined || !node) return;
-    if(!matchRegex) return;
-    if(skipTags.test(node.nodeName)) return;
-
-    if(node.hasChildNodes()) {
-      for(var i=0; i < node.childNodes.length; i++)
-        this.hiliteWords(node.childNodes[i]);
-    }
-    if(node.nodeType == 3) { // NODE_TEXT
-      if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) {
-      	//find the slide's section element and save it in our list of matching slides
-      	var secnode = node.parentNode;
-      	while (secnode.nodeName != 'SECTION') {
-      		secnode = secnode.parentNode;
-      	}
-      	
-      	var slideIndex = Reveal.getIndices(secnode);
-      	var slidelen = matchingSlides.length;
-      	var alreadyAdded = false;
-      	for (var i=0; i < slidelen; i++) {
-      		if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) {
-      			alreadyAdded = true;
-      		}
-      	}
-      	if (! alreadyAdded) {
-      		matchingSlides.push(slideIndex);
-      	}
-      	
-        if(!wordColor[regs[0].toLowerCase()]) {
-          wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
-        }
-
-        var match = document.createElement(hiliteTag);
-        match.appendChild(document.createTextNode(regs[0]));
-        match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
-        match.style.fontStyle = "inherit";
-        match.style.color = "#000";
-
-        var after = node.splitText(regs.index);
-        after.nodeValue = after.nodeValue.substring(regs[0].length);
-        node.parentNode.insertBefore(match, after);
-      }
-    }
-  };
-
-  // remove highlighting
-  this.remove = function()
-  {
-    var arr = document.getElementsByTagName(hiliteTag);
-    while(arr.length && (el = arr[0])) {
-      el.parentNode.replaceChild(el.firstChild, el);
-    }
-  };
-
-  // start highlighting at target node
-  this.apply = function(input)
-  {
-    if(input == undefined || !input) return;
-    this.remove();
-    this.setRegex(input);
-    this.hiliteWords(targetNode);
-    return matchingSlides;
-  };
-
-}
-
-	function openSearch() {
-		//ensure the search term input dialog is visible and has focus:
-		var inputbox = document.getElementById("searchinput");
-		inputbox.style.display = "inline";
-		inputbox.focus();
-		inputbox.select();
-	}
-
-	function toggleSearch() {
-		var inputbox = document.getElementById("searchinput");
-		if (inputbox.style.display !== "inline") {
-			openSearch();
-		}
-		else {
-			inputbox.style.display = "none";
-			myHilitor.remove();
-		}
-	}
-
-	function doSearch() {
-		//if there's been a change in the search term, perform a new search:
-		if (searchboxDirty) {
-			var searchstring = document.getElementById("searchinput").value;
-
-			//find the keyword amongst the slides
-			myHilitor = new Hilitor("slidecontent");
-			matchedSlides = myHilitor.apply(searchstring);
-			currentMatchedIndex = 0;
-		}
-
-		//navigate to the next slide that has the keyword, wrapping to the first if necessary
-		if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) {
-			currentMatchedIndex = 0;
-		}
-		if (matchedSlides.length > currentMatchedIndex) {
-			Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v);
-			currentMatchedIndex++;
-		}
-	}
-
-	var dom = {};
-	dom.wrapper = document.querySelector( '.reveal' );
-
-	if( !dom.wrapper.querySelector( '.searchbox' ) ) {
-			var searchElement = document.createElement( 'div' );
-			searchElement.id = "searchinputdiv";
-			searchElement.classList.add( 'searchdiv' );
-      searchElement.style.position = 'absolute';
-      searchElement.style.top = '10px';
-      searchElement.style.left = '10px';
-      //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/:
-			searchElement.innerHTML = '<span><input type="search" id="searchinput" class="searchinput" style="vertical-align: top;"/><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJiSURBVHjatFZNaxNBGH5md+Mmu92NVdKDRipSAyqCghgQD4L4cRe86UUtAQ+eFCxoa4/25EXBFi8eBE+eRPoDhB6KgiiixdAPCEkx2pjvTXadd9yNsflwuyUDD/O+u8PzzDPvzOwyx3EwyCZhwG3gAkp7MnpjgbopjsltcD4gjuXZZKeAR348MYLYTm3LzOs/y3j3JTfZxgXWXmTuwPHIc4VmoOmv5IrI53+AO2DdHLjkDWQ3GoEEVFXtXQOvkSnPWcyUceviLhwbDYv8/XIVj97kse7TodLvZXxYxrPUHkQ1ufXs3FEdybEIxucySOesoNvUgWU1cP3MkCBfTFdw9fGaAMVmRELq7LBw2Q3/FaAxxWIRpw+ZIr/7IouPqzUBiqmdHAv7EuhRAwf1er2Vy4x1jW3b2d5Jfvu5IPp7l2LYbcgCFFNb+FoJ7oBqEAqFMPNqFcmEgVMJDfMT+1tvN0pNjERlMS6QA5pFOKxiKVPFhakPeL3It+WGJUDxt2wFR+JhzI7v5ctkd8DXOZAkCYYxhO+lKm4+Xfqz/rIixBuNBl7eOYzkQQNzqX249mRl6zUgEcYkaJrGhUwBinVdh6IouPzwE6/DL5w4oLkH8y981aDf+uq6hlKpJESiUdNfDZi7/ehG9K6KfiA3pml0PLcsq+cSMTj2NL9ukc4UOmz7AZ3+crkC4mHujFvXNaMFB3bEr8xPS6p5O+jXxq4VZtaen7/PwzrntjcLUE0iHPS1Ud1cdiEJl/8WivZk0wXd7zWOMkeF8s0CcAmkNrC2nvXZDbbbN73ccYnZoH9bfgswAFzAe9/h3dbKAAAAAElFTkSuQmCC" id="searchbutton" class="searchicon" style="vertical-align: top; margin-top: -1px;"/></span>';
-			dom.wrapper.appendChild( searchElement );
-	}
-
-	document.getElementById("searchbutton").addEventListener( 'click', function(event) {
-		doSearch();
-	}, false );
-
-	document.getElementById("searchinput").addEventListener( 'keyup', function( event ) {
-		switch (event.keyCode) {
-			case 13:
-				event.preventDefault();
-				doSearch();
-				searchboxDirty = false;
-				break;
-			default:
-				searchboxDirty = true;
-		}
-	}, false );
-
-	// Open the search when the 's' key is hit (yes, this conflicts with the notes plugin, disabling for now)
-	/*
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openSearch();
-		}
-	}, false );
-*/
-	return { open: openSearch };
-})();
diff --git a/docs/slides/IHP14/_support/reveal.js/plugin/zoom-js/zoom.js b/docs/slides/IHP14/_support/reveal.js/plugin/zoom-js/zoom.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/plugin/zoom-js/zoom.js
+++ /dev/null
@@ -1,258 +0,0 @@
-// Custom reveal.js integration
-(function(){
-	var isEnabled = true;
-
-	document.querySelector( '.reveal' ).addEventListener( 'mousedown', function( event ) {
-		var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : 'alt' ) + 'Key';
-
-		if( event[ modifier ] && isEnabled ) {
-			event.preventDefault();
-			zoom.to({ element: event.target, pan: false });
-		}
-	} );
-
-	Reveal.addEventListener( 'overviewshown', function() { isEnabled = false; } );
-	Reveal.addEventListener( 'overviewhidden', function() { isEnabled = true; } );
-})();
-
-/*!
- * zoom.js 0.2 (modified version for use with reveal.js)
- * http://lab.hakim.se/zoom-js
- * MIT licensed
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var zoom = (function(){
-
-	// The current zoom level (scale)
-	var level = 1;
-
-	// The current mouse position, used for panning
-	var mouseX = 0,
-		mouseY = 0;
-
-	// Timeout before pan is activated
-	var panEngageTimeout = -1,
-		panUpdateInterval = -1;
-
-	var currentOptions = null;
-
-	// Check for transform support so that we can fallback otherwise
-	var supportsTransforms = 	'WebkitTransform' in document.body.style ||
-								'MozTransform' in document.body.style ||
-								'msTransform' in document.body.style ||
-								'OTransform' in document.body.style ||
-								'transform' in document.body.style;
-
-	if( supportsTransforms ) {
-		// The easing that will be applied when we zoom in/out
-		document.body.style.transition = 'transform 0.8s ease';
-		document.body.style.OTransition = '-o-transform 0.8s ease';
-		document.body.style.msTransition = '-ms-transform 0.8s ease';
-		document.body.style.MozTransition = '-moz-transform 0.8s ease';
-		document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';
-	}
-
-	// Zoom out if the user hits escape
-	document.addEventListener( 'keyup', function( event ) {
-		if( level !== 1 && event.keyCode === 27 ) {
-			zoom.out();
-		}
-	}, false );
-
-	// Monitor mouse movement for panning
-	document.addEventListener( 'mousemove', function( event ) {
-		if( level !== 1 ) {
-			mouseX = event.clientX;
-			mouseY = event.clientY;
-		}
-	}, false );
-
-	/**
-	 * Applies the CSS required to zoom in, prioritizes use of CSS3
-	 * transforms but falls back on zoom for IE.
-	 *
-	 * @param {Number} pageOffsetX
-	 * @param {Number} pageOffsetY
-	 * @param {Number} elementOffsetX
-	 * @param {Number} elementOffsetY
-	 * @param {Number} scale
-	 */
-	function magnify( pageOffsetX, pageOffsetY, elementOffsetX, elementOffsetY, scale ) {
-
-		if( supportsTransforms ) {
-			var origin = pageOffsetX +'px '+ pageOffsetY +'px',
-				transform = 'translate('+ -elementOffsetX +'px,'+ -elementOffsetY +'px) scale('+ scale +')';
-
-			document.body.style.transformOrigin = origin;
-			document.body.style.OTransformOrigin = origin;
-			document.body.style.msTransformOrigin = origin;
-			document.body.style.MozTransformOrigin = origin;
-			document.body.style.WebkitTransformOrigin = origin;
-
-			document.body.style.transform = transform;
-			document.body.style.OTransform = transform;
-			document.body.style.msTransform = transform;
-			document.body.style.MozTransform = transform;
-			document.body.style.WebkitTransform = transform;
-		}
-		else {
-			// Reset all values
-			if( scale === 1 ) {
-				document.body.style.position = '';
-				document.body.style.left = '';
-				document.body.style.top = '';
-				document.body.style.width = '';
-				document.body.style.height = '';
-				document.body.style.zoom = '';
-			}
-			// Apply scale
-			else {
-				document.body.style.position = 'relative';
-				document.body.style.left = ( - ( pageOffsetX + elementOffsetX ) / scale ) + 'px';
-				document.body.style.top = ( - ( pageOffsetY + elementOffsetY ) / scale ) + 'px';
-				document.body.style.width = ( scale * 100 ) + '%';
-				document.body.style.height = ( scale * 100 ) + '%';
-				document.body.style.zoom = scale;
-			}
-		}
-
-		level = scale;
-
-		if( level !== 1 && document.documentElement.classList ) {
-			document.documentElement.classList.add( 'zoomed' );
-		}
-		else {
-			document.documentElement.classList.remove( 'zoomed' );
-		}
-	}
-
-	/**
-	 * Pan the document when the mosue cursor approaches the edges
-	 * of the window.
-	 */
-	function pan() {
-		var range = 0.12,
-			rangeX = window.innerWidth * range,
-			rangeY = window.innerHeight * range,
-			scrollOffset = getScrollOffset();
-
-		// Up
-		if( mouseY < rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
-		}
-		// Down
-		else if( mouseY > window.innerHeight - rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
-		}
-
-		// Left
-		if( mouseX < rangeX ) {
-			window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
-		}
-		// Right
-		else if( mouseX > window.innerWidth - rangeX ) {
-			window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
-		}
-	}
-
-	function getScrollOffset() {
-		return {
-			x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
-			y: window.scrollY !== undefined ? window.scrollY : window.pageXYffset
-		}
-	}
-
-	return {
-		/**
-		 * Zooms in on either a rectangle or HTML element.
-		 *
-		 * @param {Object} options
-		 *   - element: HTML element to zoom in on
-		 *   OR
-		 *   - x/y: coordinates in non-transformed space to zoom in on
-		 *   - width/height: the portion of the screen to zoom in on
-		 *   - scale: can be used instead of width/height to explicitly set scale
-		 */
-		to: function( options ) {
-			// Due to an implementation limitation we can't zoom in
-			// to another element without zooming out first
-			if( level !== 1 ) {
-				zoom.out();
-			}
-			else {
-				options.x = options.x || 0;
-				options.y = options.y || 0;
-
-				// If an element is set, that takes precedence
-				if( !!options.element ) {
-					// Space around the zoomed in element to leave on screen
-					var padding = 20;
-
-					options.width = options.element.getBoundingClientRect().width + ( padding * 2 );
-					options.height = options.element.getBoundingClientRect().height + ( padding * 2 );
-					options.x = options.element.getBoundingClientRect().left - padding;
-					options.y = options.element.getBoundingClientRect().top - padding;
-				}
-
-				// If width/height values are set, calculate scale from those values
-				if( options.width !== undefined && options.height !== undefined ) {
-					options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
-				}
-
-				if( options.scale > 1 ) {
-					options.x *= options.scale;
-					options.y *= options.scale;
-
-					var scrollOffset = getScrollOffset();
-
-					if( options.element ) {
-						scrollOffset.x -= ( window.innerWidth - ( options.width * options.scale ) ) / 2;
-					}
-
-					magnify( scrollOffset.x, scrollOffset.y, options.x, options.y, options.scale );
-
-					if( options.pan !== false ) {
-
-						// Wait with engaging panning as it may conflict with the
-						// zoom transition
-						panEngageTimeout = setTimeout( function() {
-							panUpdateInterval = setInterval( pan, 1000 / 60 );
-						}, 800 );
-
-					}
-				}
-
-				currentOptions = options;
-			}
-		},
-
-		/**
-		 * Resets the document zoom state to its default.
-		 */
-		out: function() {
-			clearTimeout( panEngageTimeout );
-			clearInterval( panUpdateInterval );
-
-			var scrollOffset = getScrollOffset();
-
-			if( currentOptions && currentOptions.element ) {
-				scrollOffset.x -= ( window.innerWidth - ( currentOptions.width * currentOptions.scale ) ) / 2;
-			}
-
-			magnify( scrollOffset.x, scrollOffset.y, 0, 0, 1 );
-
-			level = 1;
-		},
-
-		// Alias
-		magnify: function( options ) { this.to( options ) },
-		reset: function() { this.out() },
-
-		zoomLevel: function() {
-			return level;
-		}
-	}
-
-})();
-
diff --git a/docs/slides/IHP14/_support/reveal.js/test/examples/assets/image1.png b/docs/slides/IHP14/_support/reveal.js/test/examples/assets/image1.png
deleted file mode 100644
Binary files a/docs/slides/IHP14/_support/reveal.js/test/examples/assets/image1.png and /dev/null differ
diff --git a/docs/slides/IHP14/_support/reveal.js/test/examples/assets/image2.png b/docs/slides/IHP14/_support/reveal.js/test/examples/assets/image2.png
deleted file mode 100644
Binary files a/docs/slides/IHP14/_support/reveal.js/test/examples/assets/image2.png and /dev/null differ
diff --git a/docs/slides/IHP14/_support/reveal.js/test/examples/barebones.html b/docs/slides/IHP14/_support/reveal.js/test/examples/barebones.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/examples/barebones.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Barebones</title>
-
-		<link rel="stylesheet" href="../../css/reveal.min.css">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-				<section>
-					<h2>Barebones Presentation</h2>
-					<p>This example contains the bare minimum includes and markup required to run a reveal.js presentation.</p>
-				</section>
-
-				<section>
-					<h2>No Theme</h2>
-					<p>There's no theme included, so it will fall back on browser defaults.</p>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../../js/reveal.min.js"></script>
-
-		<script>
-
-			Reveal.initialize();
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/test/examples/embedded-media.html b/docs/slides/IHP14/_support/reveal.js/test/examples/embedded-media.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/examples/embedded-media.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Embedded Media</title>
-
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-		<link rel="stylesheet" href="../../css/reveal.min.css">
-		<link rel="stylesheet" href="../../css/theme/default.css" id="theme">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-				<section>
-					<h2>Embedded Media Test</h2>
-				</section>
-
-				<section>
-					<iframe data-autoplay width="420" height="345" src="http://www.youtube.com/embed/l3RQZ4mcr1c"></iframe>
-				</section>
-
-				<section>
-					<h2>Empty Slide</h2>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../../lib/js/head.min.js"></script>
-		<script src="../../js/reveal.min.js"></script>
-
-		<script>
-
-			Reveal.initialize({
-				transition: 'linear'
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/test/examples/math.html b/docs/slides/IHP14/_support/reveal.js/test/examples/math.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/examples/math.html
+++ /dev/null
@@ -1,185 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Math Plugin</title>
-
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-		<link rel="stylesheet" href="../../css/reveal.min.css">
-		<link rel="stylesheet" href="../../css/theme/night.css" id="theme">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-				<section>
-					<h2>reveal.js Math Plugin</h2>
-					<p>A thin wrapper for MathJax</p>
-				</section>
-
-				<section>
-					<h3>The Lorenz Equations</h3>
-
-					\[\begin{aligned}
-					\dot{x} &amp; = \sigma(y-x) \\
-					\dot{y} &amp; = \rho x - y - xz \\
-					\dot{z} &amp; = -\beta z + xy
-					\end{aligned} \]
-				</section>
-
-				<section>
-					<h3>The Cauchy-Schwarz Inequality</h3>
-
-					<script type="math/tex; mode=display">
-						\left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
-					</script>
-				</section>
-
-				<section>
-					<h3>A Cross Product Formula</h3>
-
-					\[\mathbf{V}_1 \times \mathbf{V}_2 =  \begin{vmatrix}
-					\mathbf{i} &amp; \mathbf{j} &amp; \mathbf{k} \\
-					\frac{\partial X}{\partial u} &amp;  \frac{\partial Y}{\partial u} &amp; 0 \\
-					\frac{\partial X}{\partial v} &amp;  \frac{\partial Y}{\partial v} &amp; 0
-					\end{vmatrix}  \]
-				</section>
-
-				<section>
-					<h3>The probability of getting \(k\) heads when flipping \(n\) coins is</h3>
-
-					\[P(E)   = {n \choose k} p^k (1-p)^{ n-k} \]
-				</section>
-
-				<section>
-					<h3>An Identity of Ramanujan</h3>
-
-					\[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} =
-					1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}}
-					{1+\frac{e^{-8\pi}} {1+\ldots} } } } \]
-				</section>
-
-				<section>
-					<h3>A Rogers-Ramanujan Identity</h3>
-
-					\[  1 +  \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots =
-					\prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\]
-				</section>
-
-				<section>
-					<h3>Maxwell&#8217;s Equations</h3>
-
-					\[  \begin{aligned}
-					\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &amp; = \frac{4\pi}{c}\vec{\mathbf{j}} \\   \nabla \cdot \vec{\mathbf{E}} &amp; = 4 \pi \rho \\
-					\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} &amp; = \vec{\mathbf{0}} \\
-					\nabla \cdot \vec{\mathbf{B}} &amp; = 0 \end{aligned}
-					\]
-				</section>
-
-				<section>
-					<section>
-						<h3>The Lorenz Equations</h3>
-
-						<div class="fragment">
-							\[\begin{aligned}
-							\dot{x} &amp; = \sigma(y-x) \\
-							\dot{y} &amp; = \rho x - y - xz \\
-							\dot{z} &amp; = -\beta z + xy
-							\end{aligned} \]
-						</div>
-					</section>
-
-					<section>
-						<h3>The Cauchy-Schwarz Inequality</h3>
-
-						<div class="fragment">
-							\[ \left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) \]
-						</div>
-					</section>
-
-					<section>
-						<h3>A Cross Product Formula</h3>
-
-						<div class="fragment">
-							\[\mathbf{V}_1 \times \mathbf{V}_2 =  \begin{vmatrix}
-							\mathbf{i} &amp; \mathbf{j} &amp; \mathbf{k} \\
-							\frac{\partial X}{\partial u} &amp;  \frac{\partial Y}{\partial u} &amp; 0 \\
-							\frac{\partial X}{\partial v} &amp;  \frac{\partial Y}{\partial v} &amp; 0
-							\end{vmatrix}  \]
-						</div>
-					</section>
-
-					<section>
-						<h3>The probability of getting \(k\) heads when flipping \(n\) coins is</h3>
-
-						<div class="fragment">
-							\[P(E)   = {n \choose k} p^k (1-p)^{ n-k} \]
-						</div>
-					</section>
-
-					<section>
-						<h3>An Identity of Ramanujan</h3>
-
-						<div class="fragment">
-							\[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} =
-							1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}}
-							{1+\frac{e^{-8\pi}} {1+\ldots} } } } \]
-						</div>
-					</section>
-
-					<section>
-						<h3>A Rogers-Ramanujan Identity</h3>
-
-						<div class="fragment">
-							\[  1 +  \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots =
-							\prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}\]
-						</div>
-					</section>
-
-					<section>
-						<h3>Maxwell&#8217;s Equations</h3>
-
-						<div class="fragment">
-							\[  \begin{aligned}
-							\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &amp; = \frac{4\pi}{c}\vec{\mathbf{j}} \\   \nabla \cdot \vec{\mathbf{E}} &amp; = 4 \pi \rho \\
-							\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} &amp; = \vec{\mathbf{0}} \\
-							\nabla \cdot \vec{\mathbf{B}} &amp; = 0 \end{aligned}
-							\]
-						</div>
-					</section>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../../lib/js/head.min.js"></script>
-		<script src="../../js/reveal.min.js"></script>
-
-		<script>
-
-			Reveal.initialize({
-				history: true,
-				transition: 'linear',
-
-				math: {
-					// mathjax: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js',
-					config: 'TeX-AMS_HTML-full'
-				},
-
-				dependencies: [
-					{ src: '../../lib/js/classList.js' },
-					{ src: '../../plugin/math/math.js', async: true }
-				]
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/test/examples/slide-backgrounds.html b/docs/slides/IHP14/_support/reveal.js/test/examples/slide-backgrounds.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/examples/slide-backgrounds.html
+++ /dev/null
@@ -1,122 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Slide Backgrounds</title>
-
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
-		<link rel="stylesheet" href="../../css/reveal.min.css">
-		<link rel="stylesheet" href="../../css/theme/serif.css" id="theme">
-	</head>
-
-	<body>
-
-		<div class="reveal">
-
-			<div class="slides">
-
-				<section data-background="#00ffff">
-					<h2>data-background: #00ffff</h2>
-				</section>
-
-				<section data-background="#bb00bb">
-					<h2>data-background: #bb00bb</h2>
-				</section>
-
-				<section>
-					<section data-background="#ff0000">
-						<h2>data-background: #ff0000</h2>
-					</section>
-					<section data-background="rgba(0, 0, 0, 0.2)">
-						<h2>data-background: rgba(0, 0, 0, 0.2)</h2>
-					</section>
-					<section data-background="salmon">
-						<h2>data-background: salmon</h2>
-					</section>
-				</section>
-
-				<section data-background="rgba(0, 100, 100, 0.2)">
-					<section>
-						<h2>Background applied to stack</h2>
-					</section>
-					<section>
-						<h2>Background applied to stack</h2>
-					</section>
-					<section data-background="rgba(100, 0, 0, 0.2)">
-						<h2>Background applied to slide inside of stack</h2>
-					</section>
-				</section>
-
-				<section data-background-transition="slide" data-background="assets/image1.png" style="background: rgba(255,255,255,0.9)">
-					<h2>Background image</h2>
-				</section>
-
-				<section>
-					<section data-background-transition="slide" data-background="assets/image1.png" style="background: rgba(255,255,255,0.9)">
-						<h2>Background image</h2>
-					</section>
-					<section data-background-transition="slide" data-background="assets/image1.png" style="background: rgba(255,255,255,0.9)">
-						<h2>Background image</h2>
-					</section>
-				</section>
-
-				<section data-background="assets/image2.png" data-background-size="100px" data-background-repeat="repeat" data-background-color="#111" style="background: rgba(255,255,255,0.9)">
-					<h2>Background image</h2>
-					<pre>data-background-size="100px" data-background-repeat="repeat" data-background-color="#111"</pre>
-				</section>
-
-				<section data-background="#888888">
-					<h2>Same background twice (1/2)</h2>
-				</section>
-				<section data-background="#888888">
-					<h2>Same background twice (2/2)</h2>
-				</section>
-
-				<section>
-					<section data-background="#417203">
-						<h2>Same background twice vertical (1/2)</h2>
-					</section>
-					<section data-background="#417203">
-						<h2>Same background twice vertical (2/2)</h2>
-					</section>
-				</section>
-
-				<section data-background="#934f4d">
-					<h2>Same background from horizontal to vertical (1/3)</h2>
-				</section>
-				<section>
-					<section data-background="#934f4d">
-						<h2>Same background from horizontal to vertical (2/3)</h2>
-					</section>
-					<section data-background="#934f4d">
-						<h2>Same background from horizontal to vertical (3/3)</h2>
-					</section>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../../lib/js/head.min.js"></script>
-		<script src="../../js/reveal.min.js"></script>
-
-		<script>
-
-			// Full list of configuration options available here:
-			// https://github.com/hakimel/reveal.js#configuration
-			Reveal.initialize({
-				center: true,
-				// rtl: true,
-
-				transition: 'linear',
-				// transitionSpeed: 'slow',
-				// backgroundTransition: 'slide'
-			});
-
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/test/qunit-1.12.0.css b/docs/slides/IHP14/_support/reveal.js/test/qunit-1.12.0.css
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/qunit-1.12.0.css
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-	margin: 0;
-	padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-	padding: 0.5em 0 0.5em 1em;
-
-	color: #8699a4;
-	background-color: #0d3349;
-
-	font-size: 1.5em;
-	line-height: 1em;
-	font-weight: normal;
-
-	border-radius: 5px 5px 0 0;
-	-moz-border-radius: 5px 5px 0 0;
-	-webkit-border-top-right-radius: 5px;
-	-webkit-border-top-left-radius: 5px;
-}
-
-#qunit-header a {
-	text-decoration: none;
-	color: #c2ccd1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-	color: #fff;
-}
-
-#qunit-testrunner-toolbar label {
-	display: inline-block;
-	padding: 0 .5em 0 .1em;
-}
-
-#qunit-banner {
-	height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-	padding: 0.5em 0 0.5em 2em;
-	color: #5E740B;
-	background-color: #eee;
-	overflow: hidden;
-}
-
-#qunit-userAgent {
-	padding: 0.5em 0 0.5em 2.5em;
-	background-color: #2b81af;
-	color: #fff;
-	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
-	float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-	list-style-position: inside;
-}
-
-#qunit-tests li {
-	padding: 0.4em 0.5em 0.4em 2.5em;
-	border-bottom: 1px solid #fff;
-	list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
-	display: none;
-}
-
-#qunit-tests li strong {
-	cursor: pointer;
-}
-
-#qunit-tests li a {
-	padding: 0.5em;
-	color: #c2ccd1;
-	text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-	color: #000;
-}
-
-#qunit-tests li .runtime {
-	float: right;
-	font-size: smaller;
-}
-
-.qunit-assert-list {
-	margin-top: 0.5em;
-	padding: 0.5em;
-
-	background-color: #fff;
-
-	border-radius: 5px;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-}
-
-.qunit-collapsed {
-	display: none;
-}
-
-#qunit-tests table {
-	border-collapse: collapse;
-	margin-top: .2em;
-}
-
-#qunit-tests th {
-	text-align: right;
-	vertical-align: top;
-	padding: 0 .5em 0 0;
-}
-
-#qunit-tests td {
-	vertical-align: top;
-}
-
-#qunit-tests pre {
-	margin: 0;
-	white-space: pre-wrap;
-	word-wrap: break-word;
-}
-
-#qunit-tests del {
-	background-color: #e0f2be;
-	color: #374e0c;
-	text-decoration: none;
-}
-
-#qunit-tests ins {
-	background-color: #ffcaca;
-	color: #500;
-	text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: black; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-	padding: 5px;
-	background-color: #fff;
-	border-bottom: none;
-	list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-	color: #3c510c;
-	background-color: #fff;
-	border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-	color: #710909;
-	background-color: #fff;
-	border-left: 10px solid #EE5757;
-	white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-	border-radius: 0 0 5px 5px;
-	-moz-border-radius: 0 0 5px 5px;
-	-webkit-border-bottom-right-radius: 5px;
-	-webkit-border-bottom-left-radius: 5px;
-}
-
-#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: green;   }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
-	padding: 0.5em 0.5em 0.5em 2.5em;
-
-	color: #2b81af;
-	background-color: #D2E0E6;
-
-	border-bottom: 1px solid white;
-}
-#qunit-testresult .module-name {
-	font-weight: bold;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-	position: absolute;
-	top: -10000px;
-	left: -10000px;
-	width: 1000px;
-	height: 1000px;
-}
diff --git a/docs/slides/IHP14/_support/reveal.js/test/qunit-1.12.0.js b/docs/slides/IHP14/_support/reveal.js/test/qunit-1.12.0.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/qunit-1.12.0.js
+++ /dev/null
@@ -1,2212 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * https://jquery.org/license/
- */
-
-(function( window ) {
-
-var QUnit,
-	assert,
-	config,
-	onErrorFnPrev,
-	testId = 0,
-	fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
-	toString = Object.prototype.toString,
-	hasOwn = Object.prototype.hasOwnProperty,
-	// Keep a local reference to Date (GH-283)
-	Date = window.Date,
-	setTimeout = window.setTimeout,
-	defined = {
-		setTimeout: typeof window.setTimeout !== "undefined",
-		sessionStorage: (function() {
-			var x = "qunit-test-string";
-			try {
-				sessionStorage.setItem( x, x );
-				sessionStorage.removeItem( x );
-				return true;
-			} catch( e ) {
-				return false;
-			}
-		}())
-	},
-	/**
-	 * Provides a normalized error string, correcting an issue
-	 * with IE 7 (and prior) where Error.prototype.toString is
-	 * not properly implemented
-	 *
-	 * Based on http://es5.github.com/#x15.11.4.4
-	 *
-	 * @param {String|Error} error
-	 * @return {String} error message
-	 */
-	errorString = function( error ) {
-		var name, message,
-			errorString = error.toString();
-		if ( errorString.substring( 0, 7 ) === "[object" ) {
-			name = error.name ? error.name.toString() : "Error";
-			message = error.message ? error.message.toString() : "";
-			if ( name && message ) {
-				return name + ": " + message;
-			} else if ( name ) {
-				return name;
-			} else if ( message ) {
-				return message;
-			} else {
-				return "Error";
-			}
-		} else {
-			return errorString;
-		}
-	},
-	/**
-	 * Makes a clone of an object using only Array or Object as base,
-	 * and copies over the own enumerable properties.
-	 *
-	 * @param {Object} obj
-	 * @return {Object} New object with only the own properties (recursively).
-	 */
-	objectValues = function( obj ) {
-		// Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
-		/*jshint newcap: false */
-		var key, val,
-			vals = QUnit.is( "array", obj ) ? [] : {};
-		for ( key in obj ) {
-			if ( hasOwn.call( obj, key ) ) {
-				val = obj[key];
-				vals[key] = val === Object(val) ? objectValues(val) : val;
-			}
-		}
-		return vals;
-	};
-
-function Test( settings ) {
-	extend( this, settings );
-	this.assertions = [];
-	this.testNumber = ++Test.count;
-}
-
-Test.count = 0;
-
-Test.prototype = {
-	init: function() {
-		var a, b, li,
-			tests = id( "qunit-tests" );
-
-		if ( tests ) {
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml;
-
-			// `a` initialized at top of scope
-			a = document.createElement( "a" );
-			a.innerHTML = "Rerun";
-			a.href = QUnit.url({ testNumber: this.testNumber });
-
-			li = document.createElement( "li" );
-			li.appendChild( b );
-			li.appendChild( a );
-			li.className = "running";
-			li.id = this.id = "qunit-test-output" + testId++;
-
-			tests.appendChild( li );
-		}
-	},
-	setup: function() {
-		if (
-			// Emit moduleStart when we're switching from one module to another
-			this.module !== config.previousModule ||
-				// They could be equal (both undefined) but if the previousModule property doesn't
-				// yet exist it means this is the first test in a suite that isn't wrapped in a
-				// module, in which case we'll just emit a moduleStart event for 'undefined'.
-				// Without this, reporters can get testStart before moduleStart  which is a problem.
-				!hasOwn.call( config, "previousModule" )
-		) {
-			if ( hasOwn.call( config, "previousModule" ) ) {
-				runLoggingCallbacks( "moduleDone", QUnit, {
-					name: config.previousModule,
-					failed: config.moduleStats.bad,
-					passed: config.moduleStats.all - config.moduleStats.bad,
-					total: config.moduleStats.all
-				});
-			}
-			config.previousModule = this.module;
-			config.moduleStats = { all: 0, bad: 0 };
-			runLoggingCallbacks( "moduleStart", QUnit, {
-				name: this.module
-			});
-		}
-
-		config.current = this;
-
-		this.testEnvironment = extend({
-			setup: function() {},
-			teardown: function() {}
-		}, this.moduleTestEnvironment );
-
-		this.started = +new Date();
-		runLoggingCallbacks( "testStart", QUnit, {
-			name: this.testName,
-			module: this.module
-		});
-
-		/*jshint camelcase:false */
-
-
-		/**
-		 * Expose the current test environment.
-		 *
-		 * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
-		 */
-		QUnit.current_testEnvironment = this.testEnvironment;
-
-		/*jshint camelcase:true */
-
-		if ( !config.pollution ) {
-			saveGlobal();
-		}
-		if ( config.notrycatch ) {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-			return;
-		}
-		try {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-		} catch( e ) {
-			QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-		}
-	},
-	run: function() {
-		config.current = this;
-
-		var running = id( "qunit-testresult" );
-
-		if ( running ) {
-			running.innerHTML = "Running: <br/>" + this.nameHtml;
-		}
-
-		if ( this.async ) {
-			QUnit.stop();
-		}
-
-		this.callbackStarted = +new Date();
-
-		if ( config.notrycatch ) {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-			return;
-		}
-
-		try {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-		} catch( e ) {
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-
-			QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
-			// else next test will carry the responsibility
-			saveGlobal();
-
-			// Restart the tests if they're blocking
-			if ( config.blocking ) {
-				QUnit.start();
-			}
-		}
-	},
-	teardown: function() {
-		config.current = this;
-		if ( config.notrycatch ) {
-			if ( typeof this.callbackRuntime === "undefined" ) {
-				this.callbackRuntime = +new Date() - this.callbackStarted;
-			}
-			this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			return;
-		} else {
-			try {
-				this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			} catch( e ) {
-				QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-			}
-		}
-		checkPollution();
-	},
-	finish: function() {
-		config.current = this;
-		if ( config.requireExpects && this.expected === null ) {
-			QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
-		} else if ( this.expected !== null && this.expected !== this.assertions.length ) {
-			QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
-		} else if ( this.expected === null && !this.assertions.length ) {
-			QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
-		}
-
-		var i, assertion, a, b, time, li, ol,
-			test = this,
-			good = 0,
-			bad = 0,
-			tests = id( "qunit-tests" );
-
-		this.runtime = +new Date() - this.started;
-		config.stats.all += this.assertions.length;
-		config.moduleStats.all += this.assertions.length;
-
-		if ( tests ) {
-			ol = document.createElement( "ol" );
-			ol.className = "qunit-assert-list";
-
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				assertion = this.assertions[i];
-
-				li = document.createElement( "li" );
-				li.className = assertion.result ? "pass" : "fail";
-				li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
-				ol.appendChild( li );
-
-				if ( assertion.result ) {
-					good++;
-				} else {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-
-			// store result when possible
-			if ( QUnit.config.reorder && defined.sessionStorage ) {
-				if ( bad ) {
-					sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
-				} else {
-					sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
-				}
-			}
-
-			if ( bad === 0 ) {
-				addClass( ol, "qunit-collapsed" );
-			}
-
-			// `b` initialized at top of scope
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-			addEvent(b, "click", function() {
-				var next = b.parentNode.lastChild,
-					collapsed = hasClass( next, "qunit-collapsed" );
-				( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
-			});
-
-			addEvent(b, "dblclick", function( e ) {
-				var target = e && e.target ? e.target : window.event.srcElement;
-				if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
-					target = target.parentNode;
-				}
-				if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-					window.location = QUnit.url({ testNumber: test.testNumber });
-				}
-			});
-
-			// `time` initialized at top of scope
-			time = document.createElement( "span" );
-			time.className = "runtime";
-			time.innerHTML = this.runtime + " ms";
-
-			// `li` initialized at top of scope
-			li = id( this.id );
-			li.className = bad ? "fail" : "pass";
-			li.removeChild( li.firstChild );
-			a = li.firstChild;
-			li.appendChild( b );
-			li.appendChild( a );
-			li.appendChild( time );
-			li.appendChild( ol );
-
-		} else {
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				if ( !this.assertions[i].result ) {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-		}
-
-		runLoggingCallbacks( "testDone", QUnit, {
-			name: this.testName,
-			module: this.module,
-			failed: bad,
-			passed: this.assertions.length - bad,
-			total: this.assertions.length,
-			duration: this.runtime
-		});
-
-		QUnit.reset();
-
-		config.current = undefined;
-	},
-
-	queue: function() {
-		var bad,
-			test = this;
-
-		synchronize(function() {
-			test.init();
-		});
-		function run() {
-			// each of these can by async
-			synchronize(function() {
-				test.setup();
-			});
-			synchronize(function() {
-				test.run();
-			});
-			synchronize(function() {
-				test.teardown();
-			});
-			synchronize(function() {
-				test.finish();
-			});
-		}
-
-		// `bad` initialized at top of scope
-		// defer when previous test run passed, if storage is available
-		bad = QUnit.config.reorder && defined.sessionStorage &&
-						+sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
-
-		if ( bad ) {
-			run();
-		} else {
-			synchronize( run, true );
-		}
-	}
-};
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
-	// call on start of module test to prepend name to all tests
-	module: function( name, testEnvironment ) {
-		config.currentModule = name;
-		config.currentModuleTestEnvironment = testEnvironment;
-		config.modules[name] = true;
-	},
-
-	asyncTest: function( testName, expected, callback ) {
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		QUnit.test( testName, expected, callback, true );
-	},
-
-	test: function( testName, expected, callback, async ) {
-		var test,
-			nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
-
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		if ( config.currentModule ) {
-			nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
-		}
-
-		test = new Test({
-			nameHtml: nameHtml,
-			testName: testName,
-			expected: expected,
-			async: async,
-			callback: callback,
-			module: config.currentModule,
-			moduleTestEnvironment: config.currentModuleTestEnvironment,
-			stack: sourceFromStacktrace( 2 )
-		});
-
-		if ( !validTest( test ) ) {
-			return;
-		}
-
-		test.queue();
-	},
-
-	// Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
-	expect: function( asserts ) {
-		if (arguments.length === 1) {
-			config.current.expected = asserts;
-		} else {
-			return config.current.expected;
-		}
-	},
-
-	start: function( count ) {
-		// QUnit hasn't been initialized yet.
-		// Note: RequireJS (et al) may delay onLoad
-		if ( config.semaphore === undefined ) {
-			QUnit.begin(function() {
-				// This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
-				setTimeout(function() {
-					QUnit.start( count );
-				});
-			});
-			return;
-		}
-
-		config.semaphore -= count || 1;
-		// don't start until equal number of stop-calls
-		if ( config.semaphore > 0 ) {
-			return;
-		}
-		// ignore if start is called more often then stop
-		if ( config.semaphore < 0 ) {
-			config.semaphore = 0;
-			QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
-			return;
-		}
-		// A slight delay, to avoid any current callbacks
-		if ( defined.setTimeout ) {
-			setTimeout(function() {
-				if ( config.semaphore > 0 ) {
-					return;
-				}
-				if ( config.timeout ) {
-					clearTimeout( config.timeout );
-				}
-
-				config.blocking = false;
-				process( true );
-			}, 13);
-		} else {
-			config.blocking = false;
-			process( true );
-		}
-	},
-
-	stop: function( count ) {
-		config.semaphore += count || 1;
-		config.blocking = true;
-
-		if ( config.testTimeout && defined.setTimeout ) {
-			clearTimeout( config.timeout );
-			config.timeout = setTimeout(function() {
-				QUnit.ok( false, "Test timed out" );
-				config.semaphore = 1;
-				QUnit.start();
-			}, config.testTimeout );
-		}
-	}
-};
-
-// `assert` initialized at top of scope
-// Assert helpers
-// All of these must either call QUnit.push() or manually do:
-// - runLoggingCallbacks( "log", .. );
-// - config.current.assertions.push({ .. });
-// We attach it to the QUnit object *after* we expose the public API,
-// otherwise `assert` will become a global variable in browsers (#341).
-assert = {
-	/**
-	 * Asserts rough true-ish result.
-	 * @name ok
-	 * @function
-	 * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-	 */
-	ok: function( result, msg ) {
-		if ( !config.current ) {
-			throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-		result = !!result;
-		msg = msg || (result ? "okay" : "failed" );
-
-		var source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: msg
-			};
-
-		msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
-
-		if ( !result ) {
-			source = sourceFromStacktrace( 2 );
-			if ( source ) {
-				details.source = source;
-				msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
-			}
-		}
-		runLoggingCallbacks( "log", QUnit, details );
-		config.current.assertions.push({
-			result: result,
-			message: msg
-		});
-	},
-
-	/**
-	 * Assert that the first two arguments are equal, with an optional message.
-	 * Prints out both actual and expected values.
-	 * @name equal
-	 * @function
-	 * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
-	 */
-	equal: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected == actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notEqual
-	 * @function
-	 */
-	notEqual: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected != actual, actual, expected, message );
-	},
-
-	/**
-	 * @name propEqual
-	 * @function
-	 */
-	propEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notPropEqual
-	 * @function
-	 */
-	notPropEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name deepEqual
-	 * @function
-	 */
-	deepEqual: function( actual, expected, message ) {
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notDeepEqual
-	 * @function
-	 */
-	notDeepEqual: function( actual, expected, message ) {
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name strictEqual
-	 * @function
-	 */
-	strictEqual: function( actual, expected, message ) {
-		QUnit.push( expected === actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notStrictEqual
-	 * @function
-	 */
-	notStrictEqual: function( actual, expected, message ) {
-		QUnit.push( expected !== actual, actual, expected, message );
-	},
-
-	"throws": function( block, expected, message ) {
-		var actual,
-			expectedOutput = expected,
-			ok = false;
-
-		// 'expected' is optional
-		if ( typeof expected === "string" ) {
-			message = expected;
-			expected = null;
-		}
-
-		config.current.ignoreGlobalErrors = true;
-		try {
-			block.call( config.current.testEnvironment );
-		} catch (e) {
-			actual = e;
-		}
-		config.current.ignoreGlobalErrors = false;
-
-		if ( actual ) {
-			// we don't want to validate thrown error
-			if ( !expected ) {
-				ok = true;
-				expectedOutput = null;
-			// expected is a regexp
-			} else if ( QUnit.objectType( expected ) === "regexp" ) {
-				ok = expected.test( errorString( actual ) );
-			// expected is a constructor
-			} else if ( actual instanceof expected ) {
-				ok = true;
-			// expected is a validation function which returns true is validation passed
-			} else if ( expected.call( {}, actual ) === true ) {
-				expectedOutput = null;
-				ok = true;
-			}
-
-			QUnit.push( ok, actual, expectedOutput, message );
-		} else {
-			QUnit.pushFailure( message, null, "No exception was thrown." );
-		}
-	}
-};
-
-/**
- * @deprecated since 1.8.0
- * Kept assertion helpers in root for backwards compatibility.
- */
-extend( QUnit, assert );
-
-/**
- * @deprecated since 1.9.0
- * Kept root "raises()" for backwards compatibility.
- * (Note that we don't introduce assert.raises).
- */
-QUnit.raises = assert[ "throws" ];
-
-/**
- * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.equals = function() {
-	QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
-};
-QUnit.same = function() {
-	QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
-};
-
-// We want access to the constructor's prototype
-(function() {
-	function F() {}
-	F.prototype = QUnit;
-	QUnit = new F();
-	// Make F QUnit's constructor so that we can add to the prototype later
-	QUnit.constructor = F;
-}());
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
-	// The queue of tests to run
-	queue: [],
-
-	// block until document ready
-	blocking: true,
-
-	// when enabled, show only failing tests
-	// gets persisted through sessionStorage and can be changed in UI via checkbox
-	hidepassed: false,
-
-	// by default, run previously failed tests first
-	// very useful in combination with "Hide passed tests" checked
-	reorder: true,
-
-	// by default, modify document.title when suite is done
-	altertitle: true,
-
-	// when enabled, all tests must call expect()
-	requireExpects: false,
-
-	// add checkboxes that are persisted in the query-string
-	// when enabled, the id is set to `true` as a `QUnit.config` property
-	urlConfig: [
-		{
-			id: "noglobals",
-			label: "Check for Globals",
-			tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
-		},
-		{
-			id: "notrycatch",
-			label: "No try-catch",
-			tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
-		}
-	],
-
-	// Set of all modules.
-	modules: {},
-
-	// logging callback queues
-	begin: [],
-	done: [],
-	log: [],
-	testStart: [],
-	testDone: [],
-	moduleStart: [],
-	moduleDone: []
-};
-
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
-	extend( window, QUnit.constructor.prototype );
-
-	// Expose QUnit object
-	window.QUnit = QUnit;
-}
-
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
-	var i,
-		location = window.location || { search: "", protocol: "file:" },
-		params = location.search.slice( 1 ).split( "&" ),
-		length = params.length,
-		urlParams = {},
-		current;
-
-	if ( params[ 0 ] ) {
-		for ( i = 0; i < length; i++ ) {
-			current = params[ i ].split( "=" );
-			current[ 0 ] = decodeURIComponent( current[ 0 ] );
-			// allow just a key to turn on a flag, e.g., test.html?noglobals
-			current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-			urlParams[ current[ 0 ] ] = current[ 1 ];
-		}
-	}
-
-	QUnit.urlParams = urlParams;
-
-	// String search anywhere in moduleName+testName
-	config.filter = urlParams.filter;
-
-	// Exact match of the module name
-	config.module = urlParams.module;
-
-	config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
-
-	// Figure out if we're running the tests from a server or not
-	QUnit.isLocal = location.protocol === "file:";
-}());
-
-// Extend QUnit object,
-// these after set here because they should not be exposed as global functions
-extend( QUnit, {
-	assert: assert,
-
-	config: config,
-
-	// Initialize the configuration options
-	init: function() {
-		extend( config, {
-			stats: { all: 0, bad: 0 },
-			moduleStats: { all: 0, bad: 0 },
-			started: +new Date(),
-			updateRate: 1000,
-			blocking: false,
-			autostart: true,
-			autorun: false,
-			filter: "",
-			queue: [],
-			semaphore: 1
-		});
-
-		var tests, banner, result,
-			qunit = id( "qunit" );
-
-		if ( qunit ) {
-			qunit.innerHTML =
-				"<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-				"<h2 id='qunit-banner'></h2>" +
-				"<div id='qunit-testrunner-toolbar'></div>" +
-				"<h2 id='qunit-userAgent'></h2>" +
-				"<ol id='qunit-tests'></ol>";
-		}
-
-		tests = id( "qunit-tests" );
-		banner = id( "qunit-banner" );
-		result = id( "qunit-testresult" );
-
-		if ( tests ) {
-			tests.innerHTML = "";
-		}
-
-		if ( banner ) {
-			banner.className = "";
-		}
-
-		if ( result ) {
-			result.parentNode.removeChild( result );
-		}
-
-		if ( tests ) {
-			result = document.createElement( "p" );
-			result.id = "qunit-testresult";
-			result.className = "result";
-			tests.parentNode.insertBefore( result, tests );
-			result.innerHTML = "Running...<br/>&nbsp;";
-		}
-	},
-
-	// Resets the test setup. Useful for tests that modify the DOM.
-	/*
-	DEPRECATED: Use multiple tests instead of resetting inside a test.
-	Use testStart or testDone for custom cleanup.
-	This method will throw an error in 2.0, and will be removed in 2.1
-	*/
-	reset: function() {
-		var fixture = id( "qunit-fixture" );
-		if ( fixture ) {
-			fixture.innerHTML = config.fixture;
-		}
-	},
-
-	// Trigger an event on an element.
-	// @example triggerEvent( document.body, "click" );
-	triggerEvent: function( elem, type, event ) {
-		if ( document.createEvent ) {
-			event = document.createEvent( "MouseEvents" );
-			event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
-				0, 0, 0, 0, 0, false, false, false, false, 0, null);
-
-			elem.dispatchEvent( event );
-		} else if ( elem.fireEvent ) {
-			elem.fireEvent( "on" + type );
-		}
-	},
-
-	// Safe object type checking
-	is: function( type, obj ) {
-		return QUnit.objectType( obj ) === type;
-	},
-
-	objectType: function( obj ) {
-		if ( typeof obj === "undefined" ) {
-				return "undefined";
-		// consider: typeof null === object
-		}
-		if ( obj === null ) {
-				return "null";
-		}
-
-		var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
-			type = match && match[1] || "";
-
-		switch ( type ) {
-			case "Number":
-				if ( isNaN(obj) ) {
-					return "nan";
-				}
-				return "number";
-			case "String":
-			case "Boolean":
-			case "Array":
-			case "Date":
-			case "RegExp":
-			case "Function":
-				return type.toLowerCase();
-		}
-		if ( typeof obj === "object" ) {
-			return "object";
-		}
-		return undefined;
-	},
-
-	push: function( result, actual, expected, message ) {
-		if ( !config.current ) {
-			throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
-		}
-
-		var output, source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: message,
-				actual: actual,
-				expected: expected
-			};
-
-		message = escapeText( message ) || ( result ? "okay" : "failed" );
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		if ( !result ) {
-			expected = escapeText( QUnit.jsDump.parse(expected) );
-			actual = escapeText( QUnit.jsDump.parse(actual) );
-			output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
-
-			if ( actual !== expected ) {
-				output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
-				output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
-			}
-
-			source = sourceFromStacktrace();
-
-			if ( source ) {
-				details.source = source;
-				output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-			}
-
-			output += "</table>";
-		}
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: !!result,
-			message: output
-		});
-	},
-
-	pushFailure: function( message, source, actual ) {
-		if ( !config.current ) {
-			throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-
-		var output,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: false,
-				message: message
-			};
-
-		message = escapeText( message ) || "error";
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		output += "<table>";
-
-		if ( actual ) {
-			output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
-		}
-
-		if ( source ) {
-			details.source = source;
-			output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-		}
-
-		output += "</table>";
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: false,
-			message: output
-		});
-	},
-
-	url: function( params ) {
-		params = extend( extend( {}, QUnit.urlParams ), params );
-		var key,
-			querystring = "?";
-
-		for ( key in params ) {
-			if ( hasOwn.call( params, key ) ) {
-				querystring += encodeURIComponent( key ) + "=" +
-					encodeURIComponent( params[ key ] ) + "&";
-			}
-		}
-		return window.location.protocol + "//" + window.location.host +
-			window.location.pathname + querystring.slice( 0, -1 );
-	},
-
-	extend: extend,
-	id: id,
-	addEvent: addEvent,
-	addClass: addClass,
-	hasClass: hasClass,
-	removeClass: removeClass
-	// load, equiv, jsDump, diff: Attached later
-});
-
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
-
-	// Logging callbacks; all receive a single argument with the listed properties
-	// run test/logs.html for any related changes
-	begin: registerLoggingCallback( "begin" ),
-
-	// done: { failed, passed, total, runtime }
-	done: registerLoggingCallback( "done" ),
-
-	// log: { result, actual, expected, message }
-	log: registerLoggingCallback( "log" ),
-
-	// testStart: { name }
-	testStart: registerLoggingCallback( "testStart" ),
-
-	// testDone: { name, failed, passed, total, duration }
-	testDone: registerLoggingCallback( "testDone" ),
-
-	// moduleStart: { name }
-	moduleStart: registerLoggingCallback( "moduleStart" ),
-
-	// moduleDone: { name, failed, passed, total }
-	moduleDone: registerLoggingCallback( "moduleDone" )
-});
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
-	config.autorun = true;
-}
-
-QUnit.load = function() {
-	runLoggingCallbacks( "begin", QUnit, {} );
-
-	// Initialize the config, saving the execution queue
-	var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
-		urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
-		numModules = 0,
-		moduleNames = [],
-		moduleFilterHtml = "",
-		urlConfigHtml = "",
-		oldconfig = extend( {}, config );
-
-	QUnit.init();
-	extend(config, oldconfig);
-
-	config.blocking = false;
-
-	len = config.urlConfig.length;
-
-	for ( i = 0; i < len; i++ ) {
-		val = config.urlConfig[i];
-		if ( typeof val === "string" ) {
-			val = {
-				id: val,
-				label: val,
-				tooltip: "[no tooltip available]"
-			};
-		}
-		config[ val.id ] = QUnit.urlParams[ val.id ];
-		urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
-			"' name='" + escapeText( val.id ) +
-			"' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
-			" title='" + escapeText( val.tooltip ) +
-			"'><label for='qunit-urlconfig-" + escapeText( val.id ) +
-			"' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
-	}
-	for ( i in config.modules ) {
-		if ( config.modules.hasOwnProperty( i ) ) {
-			moduleNames.push(i);
-		}
-	}
-	numModules = moduleNames.length;
-	moduleNames.sort( function( a, b ) {
-		return a.localeCompare( b );
-	});
-	moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-		( config.module === undefined  ? "selected='selected'" : "" ) +
-		">< All Modules ></option>";
-
-
-	for ( i = 0; i < numModules; i++) {
-			moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
-				( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
-				">" + escapeText(moduleNames[i]) + "</option>";
-	}
-	moduleFilterHtml += "</select>";
-
-	// `userAgent` initialized at top of scope
-	userAgent = id( "qunit-userAgent" );
-	if ( userAgent ) {
-		userAgent.innerHTML = navigator.userAgent;
-	}
-
-	// `banner` initialized at top of scope
-	banner = id( "qunit-header" );
-	if ( banner ) {
-		banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
-	}
-
-	// `toolbar` initialized at top of scope
-	toolbar = id( "qunit-testrunner-toolbar" );
-	if ( toolbar ) {
-		// `filter` initialized at top of scope
-		filter = document.createElement( "input" );
-		filter.type = "checkbox";
-		filter.id = "qunit-filter-pass";
-
-		addEvent( filter, "click", function() {
-			var tmp,
-				ol = document.getElementById( "qunit-tests" );
-
-			if ( filter.checked ) {
-				ol.className = ol.className + " hidepass";
-			} else {
-				tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-				ol.className = tmp.replace( / hidepass /, " " );
-			}
-			if ( defined.sessionStorage ) {
-				if (filter.checked) {
-					sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
-				} else {
-					sessionStorage.removeItem( "qunit-filter-passed-tests" );
-				}
-			}
-		});
-
-		if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
-			filter.checked = true;
-			// `ol` initialized at top of scope
-			ol = document.getElementById( "qunit-tests" );
-			ol.className = ol.className + " hidepass";
-		}
-		toolbar.appendChild( filter );
-
-		// `label` initialized at top of scope
-		label = document.createElement( "label" );
-		label.setAttribute( "for", "qunit-filter-pass" );
-		label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
-		label.innerHTML = "Hide passed tests";
-		toolbar.appendChild( label );
-
-		urlConfigCheckboxesContainer = document.createElement("span");
-		urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
-		urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
-		// For oldIE support:
-		// * Add handlers to the individual elements instead of the container
-		// * Use "click" instead of "change"
-		// * Fallback from event.target to event.srcElement
-		addEvents( urlConfigCheckboxes, "click", function( event ) {
-			var params = {},
-				target = event.target || event.srcElement;
-			params[ target.name ] = target.checked ? true : undefined;
-			window.location = QUnit.url( params );
-		});
-		toolbar.appendChild( urlConfigCheckboxesContainer );
-
-		if (numModules > 1) {
-			moduleFilter = document.createElement( "span" );
-			moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-			moduleFilter.innerHTML = moduleFilterHtml;
-			addEvent( moduleFilter.lastChild, "change", function() {
-				var selectBox = moduleFilter.getElementsByTagName("select")[0],
-					selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
-
-				window.location = QUnit.url({
-					module: ( selectedModule === "" ) ? undefined : selectedModule,
-					// Remove any existing filters
-					filter: undefined,
-					testNumber: undefined
-				});
-			});
-			toolbar.appendChild(moduleFilter);
-		}
-	}
-
-	// `main` initialized at top of scope
-	main = id( "qunit-fixture" );
-	if ( main ) {
-		config.fixture = main.innerHTML;
-	}
-
-	if ( config.autostart ) {
-		QUnit.start();
-	}
-};
-
-addEvent( window, "load", QUnit.load );
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function ( error, filePath, linerNr ) {
-	var ret = false;
-	if ( onErrorFnPrev ) {
-		ret = onErrorFnPrev( error, filePath, linerNr );
-	}
-
-	// Treat return value as window.onerror itself does,
-	// Only do our handling if not suppressed.
-	if ( ret !== true ) {
-		if ( QUnit.config.current ) {
-			if ( QUnit.config.current.ignoreGlobalErrors ) {
-				return true;
-			}
-			QUnit.pushFailure( error, filePath + ":" + linerNr );
-		} else {
-			QUnit.test( "global failure", extend( function() {
-				QUnit.pushFailure( error, filePath + ":" + linerNr );
-			}, { validTest: validTest } ) );
-		}
-		return false;
-	}
-
-	return ret;
-};
-
-function done() {
-	config.autorun = true;
-
-	// Log the last module results
-	if ( config.currentModule ) {
-		runLoggingCallbacks( "moduleDone", QUnit, {
-			name: config.currentModule,
-			failed: config.moduleStats.bad,
-			passed: config.moduleStats.all - config.moduleStats.bad,
-			total: config.moduleStats.all
-		});
-	}
-	delete config.previousModule;
-
-	var i, key,
-		banner = id( "qunit-banner" ),
-		tests = id( "qunit-tests" ),
-		runtime = +new Date() - config.started,
-		passed = config.stats.all - config.stats.bad,
-		html = [
-			"Tests completed in ",
-			runtime,
-			" milliseconds.<br/>",
-			"<span class='passed'>",
-			passed,
-			"</span> assertions of <span class='total'>",
-			config.stats.all,
-			"</span> passed, <span class='failed'>",
-			config.stats.bad,
-			"</span> failed."
-		].join( "" );
-
-	if ( banner ) {
-		banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
-	}
-
-	if ( tests ) {
-		id( "qunit-testresult" ).innerHTML = html;
-	}
-
-	if ( config.altertitle && typeof document !== "undefined" && document.title ) {
-		// show ✖ for good, ✔ for bad suite result in title
-		// use escape sequences in case file gets loaded with non-utf-8-charset
-		document.title = [
-			( config.stats.bad ? "\u2716" : "\u2714" ),
-			document.title.replace( /^[\u2714\u2716] /i, "" )
-		].join( " " );
-	}
-
-	// clear own sessionStorage items if all tests passed
-	if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-		// `key` & `i` initialized at top of scope
-		for ( i = 0; i < sessionStorage.length; i++ ) {
-			key = sessionStorage.key( i++ );
-			if ( key.indexOf( "qunit-test-" ) === 0 ) {
-				sessionStorage.removeItem( key );
-			}
-		}
-	}
-
-	// scroll back to top to show results
-	if ( window.scrollTo ) {
-		window.scrollTo(0, 0);
-	}
-
-	runLoggingCallbacks( "done", QUnit, {
-		failed: config.stats.bad,
-		passed: passed,
-		total: config.stats.all,
-		runtime: runtime
-	});
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
-	var include,
-		filter = config.filter && config.filter.toLowerCase(),
-		module = config.module && config.module.toLowerCase(),
-		fullName = (test.module + ": " + test.testName).toLowerCase();
-
-	// Internally-generated tests are always valid
-	if ( test.callback && test.callback.validTest === validTest ) {
-		delete test.callback.validTest;
-		return true;
-	}
-
-	if ( config.testNumber ) {
-		return test.testNumber === config.testNumber;
-	}
-
-	if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
-		return false;
-	}
-
-	if ( !filter ) {
-		return true;
-	}
-
-	include = filter.charAt( 0 ) !== "!";
-	if ( !include ) {
-		filter = filter.slice( 1 );
-	}
-
-	// If the filter matches, we need to honour include
-	if ( fullName.indexOf( filter ) !== -1 ) {
-		return include;
-	}
-
-	// Otherwise, do the opposite
-	return !include;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
-// Later Safari and IE10 are supposed to support error.stack as well
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-	offset = offset === undefined ? 3 : offset;
-
-	var stack, include, i;
-
-	if ( e.stacktrace ) {
-		// Opera
-		return e.stacktrace.split( "\n" )[ offset + 3 ];
-	} else if ( e.stack ) {
-		// Firefox, Chrome
-		stack = e.stack.split( "\n" );
-		if (/^error$/i.test( stack[0] ) ) {
-			stack.shift();
-		}
-		if ( fileName ) {
-			include = [];
-			for ( i = offset; i < stack.length; i++ ) {
-				if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-					break;
-				}
-				include.push( stack[ i ] );
-			}
-			if ( include.length ) {
-				return include.join( "\n" );
-			}
-		}
-		return stack[ offset ];
-	} else if ( e.sourceURL ) {
-		// Safari, PhantomJS
-		// hopefully one day Safari provides actual stacktraces
-		// exclude useless self-reference for generated Error objects
-		if ( /qunit.js$/.test( e.sourceURL ) ) {
-			return;
-		}
-		// for actual exceptions, this is useful
-		return e.sourceURL + ":" + e.line;
-	}
-}
-function sourceFromStacktrace( offset ) {
-	try {
-		throw new Error();
-	} catch ( e ) {
-		return extractStacktrace( e, offset );
-	}
-}
-
-/**
- * Escape text for attribute or text content.
- */
-function escapeText( s ) {
-	if ( !s ) {
-		return "";
-	}
-	s = s + "";
-	// Both single quotes and double quotes (for attributes)
-	return s.replace( /['"<>&]/g, function( s ) {
-		switch( s ) {
-			case "'":
-				return "&#039;";
-			case "\"":
-				return "&quot;";
-			case "<":
-				return "&lt;";
-			case ">":
-				return "&gt;";
-			case "&":
-				return "&amp;";
-		}
-	});
-}
-
-function synchronize( callback, last ) {
-	config.queue.push( callback );
-
-	if ( config.autorun && !config.blocking ) {
-		process( last );
-	}
-}
-
-function process( last ) {
-	function next() {
-		process( last );
-	}
-	var start = new Date().getTime();
-	config.depth = config.depth ? config.depth + 1 : 1;
-
-	while ( config.queue.length && !config.blocking ) {
-		if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
-			config.queue.shift()();
-		} else {
-			setTimeout( next, 13 );
-			break;
-		}
-	}
-	config.depth--;
-	if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-		done();
-	}
-}
-
-function saveGlobal() {
-	config.pollution = [];
-
-	if ( config.noglobals ) {
-		for ( var key in window ) {
-			if ( hasOwn.call( window, key ) ) {
-				// in Opera sometimes DOM element ids show up here, ignore them
-				if ( /^qunit-test-output/.test( key ) ) {
-					continue;
-				}
-				config.pollution.push( key );
-			}
-		}
-	}
-}
-
-function checkPollution() {
-	var newGlobals,
-		deletedGlobals,
-		old = config.pollution;
-
-	saveGlobal();
-
-	newGlobals = diff( config.pollution, old );
-	if ( newGlobals.length > 0 ) {
-		QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
-	}
-
-	deletedGlobals = diff( old, config.pollution );
-	if ( deletedGlobals.length > 0 ) {
-		QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
-	}
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-	var i, j,
-		result = a.slice();
-
-	for ( i = 0; i < result.length; i++ ) {
-		for ( j = 0; j < b.length; j++ ) {
-			if ( result[i] === b[j] ) {
-				result.splice( i, 1 );
-				i--;
-				break;
-			}
-		}
-	}
-	return result;
-}
-
-function extend( a, b ) {
-	for ( var prop in b ) {
-		if ( hasOwn.call( b, prop ) ) {
-			// Avoid "Member not found" error in IE8 caused by messing with window.constructor
-			if ( !( prop === "constructor" && a === window ) ) {
-				if ( b[ prop ] === undefined ) {
-					delete a[ prop ];
-				} else {
-					a[ prop ] = b[ prop ];
-				}
-			}
-		}
-	}
-
-	return a;
-}
-
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-	// Standards-based browsers
-	if ( elem.addEventListener ) {
-		elem.addEventListener( type, fn, false );
-	// IE
-	} else {
-		elem.attachEvent( "on" + type, fn );
-	}
-}
-
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-	var i = elems.length;
-	while ( i-- ) {
-		addEvent( elems[i], type, fn );
-	}
-}
-
-function hasClass( elem, name ) {
-	return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
-}
-
-function addClass( elem, name ) {
-	if ( !hasClass( elem, name ) ) {
-		elem.className += (elem.className ? " " : "") + name;
-	}
-}
-
-function removeClass( elem, name ) {
-	var set = " " + elem.className + " ";
-	// Class name may appear multiple times
-	while ( set.indexOf(" " + name + " ") > -1 ) {
-		set = set.replace(" " + name + " " , " ");
-	}
-	// If possible, trim it for prettiness, but not necessarily
-	elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
-}
-
-function id( name ) {
-	return !!( typeof document !== "undefined" && document && document.getElementById ) &&
-		document.getElementById( name );
-}
-
-function registerLoggingCallback( key ) {
-	return function( callback ) {
-		config[key].push( callback );
-	};
-}
-
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks( key, scope, args ) {
-	var i, callbacks;
-	if ( QUnit.hasOwnProperty( key ) ) {
-		QUnit[ key ].call(scope, args );
-	} else {
-		callbacks = config[ key ];
-		for ( i = 0; i < callbacks.length; i++ ) {
-			callbacks[ i ].call( scope, args );
-		}
-	}
-}
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
-
-	// Call the o related callback with the given arguments.
-	function bindCallbacks( o, callbacks, args ) {
-		var prop = QUnit.objectType( o );
-		if ( prop ) {
-			if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-				return callbacks[ prop ].apply( callbacks, args );
-			} else {
-				return callbacks[ prop ]; // or undefined
-			}
-		}
-	}
-
-	// the real equiv function
-	var innerEquiv,
-		// stack to decide between skip/abort functions
-		callers = [],
-		// stack to avoiding loops from circular referencing
-		parents = [],
-		parentsB = [],
-
-		getProto = Object.getPrototypeOf || function ( obj ) {
-			/*jshint camelcase:false */
-			return obj.__proto__;
-		},
-		callbacks = (function () {
-
-			// for string, boolean, number and null
-			function useStrictEquality( b, a ) {
-				/*jshint eqeqeq:false */
-				if ( b instanceof a.constructor || a instanceof b.constructor ) {
-					// to catch short annotation VS 'new' annotation of a
-					// declaration
-					// e.g. var i = 1;
-					// var j = new Number(1);
-					return a == b;
-				} else {
-					return a === b;
-				}
-			}
-
-			return {
-				"string": useStrictEquality,
-				"boolean": useStrictEquality,
-				"number": useStrictEquality,
-				"null": useStrictEquality,
-				"undefined": useStrictEquality,
-
-				"nan": function( b ) {
-					return isNaN( b );
-				},
-
-				"date": function( b, a ) {
-					return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-				},
-
-				"regexp": function( b, a ) {
-					return QUnit.objectType( b ) === "regexp" &&
-						// the regex itself
-						a.source === b.source &&
-						// and its modifiers
-						a.global === b.global &&
-						// (gmi) ...
-						a.ignoreCase === b.ignoreCase &&
-						a.multiline === b.multiline &&
-						a.sticky === b.sticky;
-				},
-
-				// - skip when the property is a method of an instance (OOP)
-				// - abort otherwise,
-				// initial === would have catch identical references anyway
-				"function": function() {
-					var caller = callers[callers.length - 1];
-					return caller !== Object && typeof caller !== "undefined";
-				},
-
-				"array": function( b, a ) {
-					var i, j, len, loop, aCircular, bCircular;
-
-					// b could be an object literal here
-					if ( QUnit.objectType( b ) !== "array" ) {
-						return false;
-					}
-
-					len = a.length;
-					if ( len !== b.length ) {
-						// safe and faster
-						return false;
-					}
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-					for ( i = 0; i < len; i++ ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									parents.pop();
-									parentsB.pop();
-									return false;
-								}
-							}
-						}
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							parents.pop();
-							parentsB.pop();
-							return false;
-						}
-					}
-					parents.pop();
-					parentsB.pop();
-					return true;
-				},
-
-				"object": function( b, a ) {
-					/*jshint forin:false */
-					var i, j, loop, aCircular, bCircular,
-						// Default to true
-						eq = true,
-						aProperties = [],
-						bProperties = [];
-
-					// comparing constructors is more strict than using
-					// instanceof
-					if ( a.constructor !== b.constructor ) {
-						// Allow objects with no prototype to be equivalent to
-						// objects with Object as their constructor.
-						if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
-							( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
-								return false;
-						}
-					}
-
-					// stack constructor before traversing properties
-					callers.push( a.constructor );
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-
-					// be strict: don't ensure hasOwnProperty and go deep
-					for ( i in a ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									eq = false;
-									break;
-								}
-							}
-						}
-						aProperties.push(i);
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							eq = false;
-							break;
-						}
-					}
-
-					parents.pop();
-					parentsB.pop();
-					callers.pop(); // unstack, we are done
-
-					for ( i in b ) {
-						bProperties.push( i ); // collect b's properties
-					}
-
-					// Ensures identical properties name
-					return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-				}
-			};
-		}());
-
-	innerEquiv = function() { // can take multiple arguments
-		var args = [].slice.apply( arguments );
-		if ( args.length < 2 ) {
-			return true; // end transition
-		}
-
-		return (function( a, b ) {
-			if ( a === b ) {
-				return true; // catch the most you can
-			} else if ( a === null || b === null || typeof a === "undefined" ||
-					typeof b === "undefined" ||
-					QUnit.objectType(a) !== QUnit.objectType(b) ) {
-				return false; // don't lose time with error prone cases
-			} else {
-				return bindCallbacks(a, callbacks, [ b, a ]);
-			}
-
-			// apply transition with (1..n) arguments
-		}( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
-	};
-
-	return innerEquiv;
-}());
-
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
-	function quote( str ) {
-		return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
-	}
-	function literal( o ) {
-		return o + "";
-	}
-	function join( pre, arr, post ) {
-		var s = jsDump.separator(),
-			base = jsDump.indent(),
-			inner = jsDump.indent(1);
-		if ( arr.join ) {
-			arr = arr.join( "," + s + inner );
-		}
-		if ( !arr ) {
-			return pre + post;
-		}
-		return [ pre, inner + arr, base + post ].join(s);
-	}
-	function array( arr, stack ) {
-		var i = arr.length, ret = new Array(i);
-		this.up();
-		while ( i-- ) {
-			ret[i] = this.parse( arr[i] , undefined , stack);
-		}
-		this.down();
-		return join( "[", ret, "]" );
-	}
-
-	var reName = /^function (\w+)/,
-		jsDump = {
-			// type is used mostly internally, you can fix a (custom)type in advance
-			parse: function( obj, type, stack ) {
-				stack = stack || [ ];
-				var inStack, res,
-					parser = this.parsers[ type || this.typeOf(obj) ];
-
-				type = typeof parser;
-				inStack = inArray( obj, stack );
-
-				if ( inStack !== -1 ) {
-					return "recursion(" + (inStack - stack.length) + ")";
-				}
-				if ( type === "function" )  {
-					stack.push( obj );
-					res = parser.call( this, obj, stack );
-					stack.pop();
-					return res;
-				}
-				return ( type === "string" ) ? parser : this.parsers.error;
-			},
-			typeOf: function( obj ) {
-				var type;
-				if ( obj === null ) {
-					type = "null";
-				} else if ( typeof obj === "undefined" ) {
-					type = "undefined";
-				} else if ( QUnit.is( "regexp", obj) ) {
-					type = "regexp";
-				} else if ( QUnit.is( "date", obj) ) {
-					type = "date";
-				} else if ( QUnit.is( "function", obj) ) {
-					type = "function";
-				} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
-					type = "window";
-				} else if ( obj.nodeType === 9 ) {
-					type = "document";
-				} else if ( obj.nodeType ) {
-					type = "node";
-				} else if (
-					// native arrays
-					toString.call( obj ) === "[object Array]" ||
-					// NodeList objects
-					( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-				) {
-					type = "array";
-				} else if ( obj.constructor === Error.prototype.constructor ) {
-					type = "error";
-				} else {
-					type = typeof obj;
-				}
-				return type;
-			},
-			separator: function() {
-				return this.multiline ?	this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
-			},
-			// extra can be a number, shortcut for increasing-calling-decreasing
-			indent: function( extra ) {
-				if ( !this.multiline ) {
-					return "";
-				}
-				var chr = this.indentChar;
-				if ( this.HTML ) {
-					chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
-				}
-				return new Array( this.depth + ( extra || 0 ) ).join(chr);
-			},
-			up: function( a ) {
-				this.depth += a || 1;
-			},
-			down: function( a ) {
-				this.depth -= a || 1;
-			},
-			setParser: function( name, parser ) {
-				this.parsers[name] = parser;
-			},
-			// The next 3 are exposed so you can use them
-			quote: quote,
-			literal: literal,
-			join: join,
-			//
-			depth: 1,
-			// This is the list of parsers, to modify them, use jsDump.setParser
-			parsers: {
-				window: "[Window]",
-				document: "[Document]",
-				error: function(error) {
-					return "Error(\"" + error.message + "\")";
-				},
-				unknown: "[Unknown]",
-				"null": "null",
-				"undefined": "undefined",
-				"function": function( fn ) {
-					var ret = "function",
-						// functions never have name in IE
-						name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
-
-					if ( name ) {
-						ret += " " + name;
-					}
-					ret += "( ";
-
-					ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
-					return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
-				},
-				array: array,
-				nodelist: array,
-				"arguments": array,
-				object: function( map, stack ) {
-					/*jshint forin:false */
-					var ret = [ ], keys, key, val, i;
-					QUnit.jsDump.up();
-					keys = [];
-					for ( key in map ) {
-						keys.push( key );
-					}
-					keys.sort();
-					for ( i = 0; i < keys.length; i++ ) {
-						key = keys[ i ];
-						val = map[ key ];
-						ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
-					}
-					QUnit.jsDump.down();
-					return join( "{", ret, "}" );
-				},
-				node: function( node ) {
-					var len, i, val,
-						open = QUnit.jsDump.HTML ? "&lt;" : "<",
-						close = QUnit.jsDump.HTML ? "&gt;" : ">",
-						tag = node.nodeName.toLowerCase(),
-						ret = open + tag,
-						attrs = node.attributes;
-
-					if ( attrs ) {
-						for ( i = 0, len = attrs.length; i < len; i++ ) {
-							val = attrs[i].nodeValue;
-							// IE6 includes all attributes in .attributes, even ones not explicitly set.
-							// Those have values like undefined, null, 0, false, "" or "inherit".
-							if ( val && val !== "inherit" ) {
-								ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
-							}
-						}
-					}
-					ret += close;
-
-					// Show content of TextNode or CDATASection
-					if ( node.nodeType === 3 || node.nodeType === 4 ) {
-						ret += node.nodeValue;
-					}
-
-					return ret + open + "/" + tag + close;
-				},
-				// function calls it internally, it's the arguments part of the function
-				functionArgs: function( fn ) {
-					var args,
-						l = fn.length;
-
-					if ( !l ) {
-						return "";
-					}
-
-					args = new Array(l);
-					while ( l-- ) {
-						// 97 is 'a'
-						args[l] = String.fromCharCode(97+l);
-					}
-					return " " + args.join( ", " ) + " ";
-				},
-				// object calls it internally, the key part of an item in a map
-				key: quote,
-				// function calls it internally, it's the content of the function
-				functionCode: "[code]",
-				// node calls it internally, it's an html attribute value
-				attribute: quote,
-				string: quote,
-				date: quote,
-				regexp: literal,
-				number: literal,
-				"boolean": literal
-			},
-			// if true, entities are escaped ( <, >, \t, space and \n )
-			HTML: false,
-			// indentation unit
-			indentChar: "  ",
-			// if true, items in a collection, are separated by a \n, else just a space.
-			multiline: true
-		};
-
-	return jsDump;
-}());
-
-// from jquery.js
-function inArray( elem, array ) {
-	if ( array.indexOf ) {
-		return array.indexOf( elem );
-	}
-
-	for ( var i = 0, length = array.length; i < length; i++ ) {
-		if ( array[ i ] === elem ) {
-			return i;
-		}
-	}
-
-	return -1;
-}
-
-/*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
-	/*jshint eqeqeq:false, eqnull:true */
-	function diff( o, n ) {
-		var i,
-			ns = {},
-			os = {};
-
-		for ( i = 0; i < n.length; i++ ) {
-			if ( !hasOwn.call( ns, n[i] ) ) {
-				ns[ n[i] ] = {
-					rows: [],
-					o: null
-				};
-			}
-			ns[ n[i] ].rows.push( i );
-		}
-
-		for ( i = 0; i < o.length; i++ ) {
-			if ( !hasOwn.call( os, o[i] ) ) {
-				os[ o[i] ] = {
-					rows: [],
-					n: null
-				};
-			}
-			os[ o[i] ].rows.push( i );
-		}
-
-		for ( i in ns ) {
-			if ( hasOwn.call( ns, i ) ) {
-				if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
-					n[ ns[i].rows[0] ] = {
-						text: n[ ns[i].rows[0] ],
-						row: os[i].rows[0]
-					};
-					o[ os[i].rows[0] ] = {
-						text: o[ os[i].rows[0] ],
-						row: ns[i].rows[0]
-					};
-				}
-			}
-		}
-
-		for ( i = 0; i < n.length - 1; i++ ) {
-			if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
-						n[ i + 1 ] == o[ n[i].row + 1 ] ) {
-
-				n[ i + 1 ] = {
-					text: n[ i + 1 ],
-					row: n[i].row + 1
-				};
-				o[ n[i].row + 1 ] = {
-					text: o[ n[i].row + 1 ],
-					row: i + 1
-				};
-			}
-		}
-
-		for ( i = n.length - 1; i > 0; i-- ) {
-			if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
-						n[ i - 1 ] == o[ n[i].row - 1 ]) {
-
-				n[ i - 1 ] = {
-					text: n[ i - 1 ],
-					row: n[i].row - 1
-				};
-				o[ n[i].row - 1 ] = {
-					text: o[ n[i].row - 1 ],
-					row: i - 1
-				};
-			}
-		}
-
-		return {
-			o: o,
-			n: n
-		};
-	}
-
-	return function( o, n ) {
-		o = o.replace( /\s+$/, "" );
-		n = n.replace( /\s+$/, "" );
-
-		var i, pre,
-			str = "",
-			out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
-			oSpace = o.match(/\s+/g),
-			nSpace = n.match(/\s+/g);
-
-		if ( oSpace == null ) {
-			oSpace = [ " " ];
-		}
-		else {
-			oSpace.push( " " );
-		}
-
-		if ( nSpace == null ) {
-			nSpace = [ " " ];
-		}
-		else {
-			nSpace.push( " " );
-		}
-
-		if ( out.n.length === 0 ) {
-			for ( i = 0; i < out.o.length; i++ ) {
-				str += "<del>" + out.o[i] + oSpace[i] + "</del>";
-			}
-		}
-		else {
-			if ( out.n[0].text == null ) {
-				for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
-					str += "<del>" + out.o[n] + oSpace[n] + "</del>";
-				}
-			}
-
-			for ( i = 0; i < out.n.length; i++ ) {
-				if (out.n[i].text == null) {
-					str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
-				}
-				else {
-					// `pre` initialized at top of scope
-					pre = "";
-
-					for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
-						pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
-					}
-					str += " " + out.n[i].text + nSpace[i] + pre;
-				}
-			}
-		}
-
-		return str;
-	};
-}());
-
-// for CommonJS environments, export everything
-if ( typeof exports !== "undefined" ) {
-	extend( exports, QUnit.constructor.prototype );
-}
-
-// get at whatever the global object is, like window in browsers
-}( (function() {return this;}.call()) ));
diff --git a/docs/slides/IHP14/_support/reveal.js/test/test-markdown-element-attributes.html b/docs/slides/IHP14/_support/reveal.js/test/test-markdown-element-attributes.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/test-markdown-element-attributes.html
+++ /dev/null
@@ -1,134 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Test Markdown Element Attributes</title>
-
-		<link rel="stylesheet" href="../css/reveal.min.css">
-		<link rel="stylesheet" href="qunit-1.12.0.css">
-	</head>
-
-	<body style="overflow: auto;">
-
-		<div id="qunit"></div>
-		<div id="qunit-fixture"></div>
-
-		<div class="reveal" style="display: none;">
-
-			<div class="slides">
-
-				<!-- <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section> -->
-
-				<!-- Slides are separated by newline + three dashes + newline, vertical slides identical but two dashes -->
-				<section data-markdown data-separator="^\n---\n$" data-vertical="^\n--\n$" data-element-attributes="{_\s*?([^}]+?)}">>
-					<script type="text/template">
-						## Slide 1.1
-						<!-- {_class="fragment fade-out" data-fragment-index="1"} -->
-
-						--
-
-						## Slide 1.2
-						<!-- {_class="fragment shrink"} -->
-
-						Paragraph 1
-						<!-- {_class="fragment grow"} -->
-
-						Paragraph 2
-						<!-- {_class="fragment grow"} -->
-
-						- list item 1 <!-- {_class="fragment roll-in"} -->
-						- list item 2 <!-- {_class="fragment roll-in"} -->
-						- list item 3 <!-- {_class="fragment roll-in"} -->
-
-
-						---
-
-						## Slide 2
-
-
-						Paragraph 1.2  
-						multi-line <!-- {_class="fragment highlight-red"} -->
-
-						Paragraph 2.2 <!-- {_class="fragment highlight-red"} -->
-
-						Paragraph 2.3 <!-- {_class="fragment highlight-red"} -->
-
-						Paragraph 2.4 <!-- {_class="fragment highlight-red"} -->
-
-						- list item 1 <!-- {_class="fragment highlight-green"} -->
-						- list item 2<!-- {_class="fragment highlight-green"} -->
-						- list item 3<!-- {_class="fragment highlight-green"} -->
-						- list item 4
-						<!-- {_class="fragment highlight-green"} -->
-						- list item 5<!-- {_class="fragment highlight-green"} -->
-
-						Test
-
-						![Example Picture](examples/assets/image2.png)
-						<!-- {_class="reveal stretch"} -->
-
-					</script>
-				</section>
-
-
-
-				<section 	data-markdown data-separator="^\n\n\n"
-									data-vertical="^\n\n"
-									data-notes="^Note:"
-									data-charset="utf-8">
-					<script type="text/template">
-						# Test attributes in Markdown with default separator
-						## Slide 1 Def <!-- .element: class="fragment highlight-red" data-fragment-index="1" -->
-
-
-						## Slide 2 Def
-						<!-- .element: class="fragment highlight-red" -->
-
-					</script>
-				</section>
-
-				<section data-markdown>
-				  <script type="text/template">
-					## Hello world
-					A paragraph
-					<!-- .element: class="fragment highlight-blue" -->
-				  </script>
-				</section>
-
-				<section data-markdown>
-				  <script type="text/template">
-					## Hello world
-
-					Multiple  
-					Line
-					<!-- .element: class="fragment highlight-blue" -->
-				  </script>
-				</section>
-
-				<section data-markdown>
-				  <script type="text/template">
-					## Hello world
-
-					Test<!-- .element: class="fragment highlight-blue" -->
-
-					More Test
-				  </script>
-				</section>
-
-
-			</div>
-
-		</div>
-
-		<script src="../lib/js/head.min.js"></script>
-		<script src="../js/reveal.min.js"></script>
-		<script src="../plugin/markdown/marked.js"></script>
-		<script src="../plugin/markdown/markdown.js"></script>
-		<script src="qunit-1.12.0.js"></script>
-
-		<script src="test-markdown-element-attributes.js"></script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/test/test-markdown-element-attributes.js b/docs/slides/IHP14/_support/reveal.js/test/test-markdown-element-attributes.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/test-markdown-element-attributes.js
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 4, 'found four slides' );
-	});
-
-
-	test( 'Attributes on element header in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.fade-out' ).length, 1, 'found one vertical slide with class fragment.fade-out on header' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.shrink' ).length, 1, 'found one vertical slide with class fragment.shrink on header' );
-	});
-
-	test( 'Attributes on element paragraphs in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section p.fragment.grow' ).length, 2, 'found a vertical slide with two paragraphs with class fragment.grow' );
-	});
-
-	test( 'Attributes on element list items in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section li.fragment.roll-in' ).length, 3, 'found a vertical slide with three list items with class fragment.roll-in' );
-	});
-
-	test( 'Attributes on element paragraphs in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-red' ).length, 4, 'found a horizontal slide with four paragraphs with class fragment.grow' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section li.fragment.highlight-green' ).length, 5, 'found a horizontal slide with five list items with class fragment.roll-in' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section img.reveal.stretch' ).length, 1, 'found a horizontal slide with stretched image, class img.reveal.stretch' );
-	});
-
-	test( 'Attributes on elements in vertical slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section h2.fragment.highlight-red' ).length, 2, 'found two h2 titles with fragment highlight-red in vertical slides with default element attribute separator' );
-	});
-
-	test( 'Attributes on elements in single slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-blue' ).length, 3, 'found three elements with fragment highlight-blue in single slide with default element attribute separator' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/IHP14/_support/reveal.js/test/test-markdown-slide-attributes.html b/docs/slides/IHP14/_support/reveal.js/test/test-markdown-slide-attributes.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/test-markdown-slide-attributes.html
+++ /dev/null
@@ -1,128 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Test Markdown Attributes</title>
-
-		<link rel="stylesheet" href="../css/reveal.min.css">
-		<link rel="stylesheet" href="qunit-1.12.0.css">
-	</head>
-
-	<body style="overflow: auto;">
-
-		<div id="qunit"></div>
-		<div id="qunit-fixture"></div>
-
-		<div class="reveal" style="display: none;">
-
-			<div class="slides">
-
-				<!-- <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section> -->
-
-				<!-- Slides are separated by three lines, vertical slides by two lines, attributes are one any line starting with (spaces and) two dashes -->
-				<section 	data-markdown data-separator="^\n\n\n"
-									data-vertical="^\n\n"
-									data-notes="^Note:"
-									data-attributes="--\s(.*?)$"
-									data-charset="utf-8">
-					<script type="text/template">
-						# Test attributes in Markdown
-						## Slide 1
-
-
-
-						## Slide 2
-						<!-- -- id="slide2" data-transition="zoom" data-background="#A0C66B" -->
-
-
-						## Slide 2.1
-						<!-- -- data-background="#ff0000" data-transition="fade" -->
-
-
-						## Slide 2.2
-						[Link to Slide2](#/slide2)
-
-
-
-						## Slide 3
-						<!-- -- data-transition="zoom" data-background="#C6916B" -->
-
-
-
-						## Slide 4
-					</script>
-				</section>
-
-				<section 	data-markdown data-separator="^\n\n\n"
-									data-vertical="^\n\n"
-									data-notes="^Note:"
-									data-charset="utf-8">
-					<script type="text/template">
-						# Test attributes in Markdown with default separator
-						## Slide 1 Def
-
-
-
-						## Slide 2 Def
-						<!-- .slide: id="slide2def" data-transition="concave" data-background="#A7C66B" -->
-
-
-						## Slide 2.1 Def
-						<!-- .slide: data-background="#f70000" data-transition="page" -->
-
-
-						## Slide 2.2 Def
-						[Link to Slide2](#/slide2def)
-
-
-
-						## Slide 3 Def
-						<!-- .slide: data-transition="concave" data-background="#C7916B" -->
-
-
-
-						## Slide 4
-					</script>
-				</section>
-
-				<section data-markdown>
-					<script type="text/template">
-						<!-- .slide: data-background="#ff0000" -->
-						## Hello world
-					</script>
-				</section>
-
-				<section data-markdown>
-					<script type="text/template">
-						## Hello world
-						<!-- .slide: data-background="#ff0000" -->
-					</script>
-				</section>
-
-				<section data-markdown>
-					<script type="text/template">
-						## Hello world
-
-						Test
-						<!-- .slide: data-background="#ff0000" -->
-
-						More Test
-					</script>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../lib/js/head.min.js"></script>
-		<script src="../js/reveal.min.js"></script>
-		<script src="../plugin/markdown/marked.js"></script>
-		<script src="../plugin/markdown/markdown.js"></script>
-		<script src="qunit-1.12.0.js"></script>
-
-		<script src="test-markdown-slide-attributes.js"></script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/test/test-markdown-slide-attributes.js b/docs/slides/IHP14/_support/reveal.js/test/test-markdown-slide-attributes.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/test-markdown-slide-attributes.js
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 6, 'found six vertical slides' );
-	});
-
-	test( 'Id on slide', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section#slide2' ).length, 1, 'found one slide with id slide2' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, 'found one slide with a link to slide2' );
-	});
-
-	test( 'data-background attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-background attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-transition attributes with inline content', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/IHP14/_support/reveal.js/test/test-markdown.html b/docs/slides/IHP14/_support/reveal.js/test/test-markdown.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/test-markdown.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Test Markdown</title>
-
-		<link rel="stylesheet" href="../css/reveal.min.css">
-		<link rel="stylesheet" href="qunit-1.12.0.css">
-	</head>
-
-	<body style="overflow: auto;">
-
-		<div id="qunit"></div>
-  		<div id="qunit-fixture"></div>
-
-		<div class="reveal" style="display: none;">
-
-			<div class="slides">
-
-				<!-- <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section> -->
-
-				<!-- Slides are separated by newline + three dashes + newline, vertical slides identical but two dashes -->
-				<section data-markdown data-separator="^\n---\n$" data-vertical="^\n--\n$">
-					<script type="text/template">
-						## Slide 1.1
-
-						--
-
-						## Slide 1.2
-
-						---
-
-						## Slide 2
-					</script>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../lib/js/head.min.js"></script>
-		<script src="../js/reveal.min.js"></script>
-		<script src="../plugin/markdown/marked.js"></script>
-		<script src="../plugin/markdown/markdown.js"></script>
-		<script src="qunit-1.12.0.js"></script>
-
-		<script src="test-markdown.js"></script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/test/test-markdown.js b/docs/slides/IHP14/_support/reveal.js/test/test-markdown.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/test-markdown.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/IHP14/_support/reveal.js/test/test.html b/docs/slides/IHP14/_support/reveal.js/test/test.html
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/test.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!doctype html>
-<html lang="en">
-
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Tests</title>
-
-		<link rel="stylesheet" href="../css/reveal.min.css">
-		<link rel="stylesheet" href="qunit-1.12.0.css">
-	</head>
-
-	<body style="overflow: auto;">
-
-		<div id="qunit"></div>
-  		<div id="qunit-fixture"></div>
-
-		<div class="reveal" style="display: none;">
-
-			<div class="slides">
-
-				<section>
-					<h1>1</h1>
-				</section>
-
-				<section>
-					<section>
-						<h1>2.1</h1>
-					</section>
-					<section>
-						<h1>2.2</h1>
-					</section>
-					<section>
-						<h1>2.3</h1>
-					</section>
-				</section>
-
-				<section id="fragment-slides">
-					<section>
-						<h1>3.1</h1>
-						<ul>
-							<li class="fragment">4.1</li>
-							<li class="fragment">4.2</li>
-							<li class="fragment">4.3</li>
-						</ul>
-					</section>
-
-					<section>
-						<h1>3.2</h1>
-						<ul>
-							<li class="fragment" data-fragment-index="0">4.1</li>
-							<li class="fragment" data-fragment-index="0">4.2</li>
-						</ul>
-					</section>
-
-					<section>
-						<h1>3.3</h1>
-						<ul>
-							<li class="fragment" data-fragment-index="1">3.3.1</li>
-							<li class="fragment" data-fragment-index="4">3.3.2</li>
-							<li class="fragment" data-fragment-index="4">3.3.3</li>
-						</ul>
-					</section>
-				</section>
-
-				<section>
-					<h1>4</h1>
-				</section>
-
-			</div>
-
-		</div>
-
-		<script src="../lib/js/head.min.js"></script>
-		<script src="../js/reveal.min.js"></script>
-		<script src="qunit-1.12.0.js"></script>
-
-		<script src="test.js"></script>
-
-	</body>
-</html>
diff --git a/docs/slides/IHP14/_support/reveal.js/test/test.js b/docs/slides/IHP14/_support/reveal.js/test/test.js
deleted file mode 100644
--- a/docs/slides/IHP14/_support/reveal.js/test/test.js
+++ /dev/null
@@ -1,438 +0,0 @@
-
-// These tests expect the DOM to contain a presentation
-// with the following slide structure:
-//
-// 1
-// 2 - Three sub-slides
-// 3 - Three fragment elements
-// 3 - Two fragments with same data-fragment-index
-// 4
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	// ---------------------------------------------------------------
-	// DOM TESTS
-
-	QUnit.module( 'DOM' );
-
-	test( 'Initial slides classes', function() {
-		var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' )
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' );
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' );
-
-		ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' );
-	});
-
-	// ---------------------------------------------------------------
-	// API TESTS
-
-	QUnit.module( 'API' );
-
-	test( 'Reveal.isReady', function() {
-		strictEqual( Reveal.isReady(), true, 'returns true' );
-	});
-
-	test( 'Reveal.isOverview', function() {
-		strictEqual( Reveal.isOverview(), false, 'false by default' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), true, 'true after toggling on' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), false, 'false after toggling off' );
-	});
-
-	test( 'Reveal.isPaused', function() {
-		strictEqual( Reveal.isPaused(), false, 'false by default' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), true, 'true after pausing' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), false, 'false after resuming' );
-	});
-
-	test( 'Reveal.isFirstSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-
-		Reveal.slide( 1, 0 );
-		strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.isLastSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-
-		var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1;
-
-		Reveal.slide( lastSlideIndex, 0 );
-		strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( ', 0+ lastSlideIndex +' )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.getIndices', function() {
-		var indices = Reveal.getIndices();
-
-		ok( typeof indices.hasOwnProperty( 'h' ), 'h exists' );
-		ok( typeof indices.hasOwnProperty( 'v' ), 'v exists' );
-		ok( typeof indices.hasOwnProperty( 'f' ), 'f exists' );
-
-		Reveal.slide( 1, 0 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 0, 'h 1, v 0' );
-
-		Reveal.slide( 1, 2 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 2, 'h 1, v 2' );
-
-		Reveal.slide( 0, 0 );
-	});
-
-	test( 'Reveal.getSlide', function() {
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-
-		equal( Reveal.getSlide( 0 ), firstSlide, 'gets correct first slide' );
-
-		strictEqual( Reveal.getSlide( 100 ), undefined, 'returns undefined when slide can\'t be found' );
-	});
-
-	test( 'Reveal.getPreviousSlide/getCurrentSlide', function() {
-		Reveal.slide( 0, 0 );
-		Reveal.slide( 1, 0 );
-
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-		var secondSlide = document.querySelector( '.reveal .slides>section:nth-child(2)>section' );
-
-		equal( Reveal.getPreviousSlide(), firstSlide, 'previous is slide #0' );
-		equal( Reveal.getCurrentSlide(), secondSlide, 'current is slide #1' );
-	});
-
-	test( 'Reveal.getScale', function() {
-		ok( typeof Reveal.getScale() === 'number', 'has scale' );
-	});
-
-	test( 'Reveal.getConfig', function() {
-		ok( typeof Reveal.getConfig() === 'object', 'has config' );
-	});
-
-	test( 'Reveal.configure', function() {
-		strictEqual( Reveal.getConfig().loop, false, '"loop" is false to start with' );
-
-		Reveal.configure({ loop: true });
-		strictEqual( Reveal.getConfig().loop, true, '"loop" has changed to true' );
-
-		Reveal.configure({ loop: false, customTestValue: 1 });
-		strictEqual( Reveal.getConfig().customTestValue, 1, 'supports custom values' );
-	});
-
-	test( 'Reveal.availableRoutes', function() {
-		Reveal.slide( 0, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: false, up: false, down: false, right: true }, 'correct for first slide' );
-
-		Reveal.slide( 1, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: true, up: false, down: true, right: true }, 'correct for vertical slide' );
-	});
-
-	test( 'Reveal.next', function() {
-		Reveal.slide( 0, 0 );
-
-		// Step through vertical child slides
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 1, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined } );
-
-		// Step through fragments
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 } );
-	});
-
-	test( 'Reveal.next at end', function() {
-		Reveal.slide( 3 );
-
-		// We're at the end, this should have no effect
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-	});
-
-
-	// ---------------------------------------------------------------
-	// FRAGMENT TESTS
-
-	QUnit.module( 'Fragments' );
-
-	test( 'Sliding to fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 }, 'Reveal.slide( 2, 0, -1 )' );
-
-		Reveal.slide( 2, 0, 0 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'Reveal.slide( 2, 0, 0 )' );
-
-		Reveal.slide( 2, 0, 2 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'Reveal.slide( 2, 0, 2 )' );
-
-		Reveal.slide( 2, 0, 1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'Reveal.slide( 2, 0, 1 )' );
-	});
-
-	test( 'Hiding all fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 1, 'one fragment visible when index is 0' );
-
-		Reveal.slide( 2, 0, -1 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when index is -1' );
-	});
-
-	test( 'Current fragment', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment at index -1' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 1, 'one current fragment at index 0' );
-
-		Reveal.slide( 1, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to next slide' );
-	});
-
-	test( 'Stepping through fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-
-		// forwards:
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'next() goes to next fragment' );
-
-		Reveal.right();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'right() goes to next fragment' );
-
-		Reveal.down();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'down() goes to next fragment' );
-
-		Reveal.down(); // moves to f #3
-
-		// backwards:
-
-		Reveal.prev();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'prev() goes to prev fragment' );
-
-		Reveal.left();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'left() goes to prev fragment' );
-
-		Reveal.up();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'up() goes to prev fragment' );
-	});
-
-	test( 'Stepping past fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 0, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when on previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 3, 'all fragments visible when on future slide' );
-	});
-
-	test( 'Fragment indices', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(2)' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 2, 'both fragments of same index are shown' );
-	});
-
-	test( 'Index generation', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		// These have no indices defined to start with
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '2' );
-	});
-
-	test( 'Index normalization', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(3)' );
-
-		// These start out as 1-4-4 and should normalize to 0-1-1
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '1' );
-	});
-
-	asyncTest( 'fragmentshown event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmentshown', _onEvent );
-
-		Reveal.slide( 2, 0 );
-		Reveal.slide( 2, 0 ); // should do nothing
-		Reveal.slide( 2, 0, 0 ); // should do nothing
-		Reveal.next();
-		Reveal.next();
-		Reveal.prev(); // shouldn't fire fragmentshown
-
-		start();
-
-		Reveal.removeEventListener( 'fragmentshown', _onEvent );
-	});
-
-	asyncTest( 'fragmenthidden event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmenthidden', _onEvent );
-
-		Reveal.slide( 2, 0, 2 );
-		Reveal.slide( 2, 0, 2 ); // should do nothing
-		Reveal.prev();
-		Reveal.prev();
-		Reveal.next(); // shouldn't fire fragmenthidden
-
-		start();
-
-		Reveal.removeEventListener( 'fragmenthidden', _onEvent );
-	});
-
-
-	// ---------------------------------------------------------------
-	// CONFIGURATION VALUES
-
-	QUnit.module( 'Configuration' );
-
-	test( 'Controls', function() {
-		var controlsElement = document.querySelector( '.reveal>.controls' );
-
-		Reveal.configure({ controls: false });
-		equal( controlsElement.style.display, 'none', 'controls are hidden' );
-
-		Reveal.configure({ controls: true });
-		equal( controlsElement.style.display, 'block', 'controls are visible' );
-	});
-
-	test( 'Progress', function() {
-		var progressElement = document.querySelector( '.reveal>.progress' );
-
-		Reveal.configure({ progress: false });
-		equal( progressElement.style.display, 'none', 'progress are hidden' );
-
-		Reveal.configure({ progress: true });
-		equal( progressElement.style.display, 'block', 'progress are visible' );
-	});
-
-	test( 'Loop', function() {
-		Reveal.configure({ loop: true });
-
-		Reveal.slide( 0, 0 );
-
-		Reveal.left();
-		notEqual( Reveal.getIndices().h, 0, 'looped from start to end' );
-
-		Reveal.right();
-		equal( Reveal.getIndices().h, 0, 'looped from end to start' );
-
-		Reveal.configure({ loop: false });
-	});
-
-
-	// ---------------------------------------------------------------
-	// EVENT TESTS
-
-	QUnit.module( 'Events' );
-
-	asyncTest( 'slidechanged', function() {
-		expect( 3 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'slidechanged', _onEvent );
-
-		Reveal.slide( 1, 0 ); // should trigger
-		Reveal.slide( 1, 0 ); // should do nothing
-		Reveal.next(); // should trigger
-		Reveal.slide( 3, 0 ); // should trigger
-		Reveal.next(); // should do nothing
-
-		start();
-
-		Reveal.removeEventListener( 'slidechanged', _onEvent );
-
-	});
-
-	asyncTest( 'paused', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'paused', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'paused', _onEvent );
-	});
-
-	asyncTest( 'resumed', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'resumed', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'resumed', _onEvent );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/IHP14/_support/template.reveal b/docs/slides/IHP14/_support/template.reveal
deleted file mode 100644
--- a/docs/slides/IHP14/_support/template.reveal
+++ /dev/null
@@ -1,122 +0,0 @@
-<!doctype html>  
-<html lang="en">
-	
-<head>
-<meta charset="utf-8">
-
-<title>Liquid Types</title>
-
-<meta name="description" content="Liquid Types IHP 2014">
-<meta name="author" content="Ranjit Jhala">
-
-<meta name="apple-mobile-web-app-capable" content="yes" />
-
-<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
-
-<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
-
-<link rel="stylesheet" href="$reveal$/css/reveal.css">
-<link rel="stylesheet" href="$reveal$/css/theme/seminar.css" id="theme">
-<!-- <link rel="stylesheet" href="$reveal$/css/print/pdf.css"> -->
-<link rel="stylesheet" href="../_support/liquidhaskell.css">
-
-<!-- For syntax highlighting -->
-<link rel="stylesheet" href="$reveal$/lib/css/zenburn.css">
-
-<script>
-	// If the query includes 'print-pdf' we'll use the PDF print sheet
-	document.write( '<link rel="stylesheet" href="$reveal$/css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
-</script>
-
-<!--[if lt IE 9]>
-<script src="lib/js/html5shiv.js"></script>
-<![endif]-->
-</head>
-<body>
-
-\(
-\require{color}
-\definecolor{kvcol}{RGB}{203,23,206}
-\definecolor{tycol}{RGB}{5,177,93}
-\definecolor{refcol}{RGB}{18,110,213}
-
-\newcommand{\quals}{\mathbb{Q}}
-\newcommand{\defeq}{\ \doteq\ }
-\newcommand{\subty}{\preceq}
-\newcommand{\True}{\mathit{True}}
-\newcommand{\Int}{\mathtt{Int}}
-\newcommand{\Nat}{\mathtt{Nat}}
-\newcommand{\Zero}{\mathtt{Zero}}
-\newcommand{\foo}[4]{{#1}^{#4} + {#2}^{#4} = {#3}^{#4}}
-\newcommand{\reft}[3]{\{\bindx{#1}{#2} \mid {#3}\}}
-\newcommand{\ereft}[3]{\bindx{#1}{\{#2 \mid #3\}}}
-\newcommand{\bindx}[2]{{#1}\!:\!{#2}}
-\newcommand{\reftx}[2]{\{{#1}\mid{#2}\}}
-\newcommand{\inferrule}[3][]{\frac{#2}{#3}\;{#1}}
-\newcommand{\kvar}[1]{\color{kvcol}{\mathbf{\kappa_{#1}}}}
-\newcommand{\llen}[1]{\mathtt{llen}(#1)}
-\)
-
-<div class="reveal">
-<!-- 
-Used to fade in a background when a specific slide state is reached
--->
-<div class="state-background"></div>
-
-<!-- Slides
-Any section element inside of this "slides" container is displayed as a slide
--->
-<div class="slides">
-<!-- Pandoc -->
-$if(title)$
-<section class="titlepage">
-<h1 class="title">$title$</h1>
-$for(author)$
-<h2 class="author">$author$</h2>
-$endfor$
-<h3 class="date">$date$</h3>
-</section>
-$endif$
-$body$
-<!-- End Pandoc -->
-
-</div>
-<!-- End Slides -->
-
-<!-- Presentation progress bar -->
-<div class="progress"><span></span></div>
-</div>
-
-<!-- Initialize reveal.js :: make settings changes here -->
-<script src="$reveal$/lib/js/head.min.js"></script>
-<script src="$reveal$/js/reveal.js"></script>
-
-<script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
-
-
-<script>		
-	// Full list of configuration options available here:
-	// https://github.com/hakimel/reveal.js#configuration
-	Reveal.initialize({
-		controls: true,
-		progress: true,
-		history: true,
-		center: false,
-        rollingLinks: false,
-        theme: Reveal.getQueryHash().theme || 'seminar', // available themes are in /css/theme
-		transition: Reveal.getQueryHash().transition || 'fade', // default/cube/page/concave/linear(2d)
-
-		// Optional libraries used to extend on reveal.js
-		dependencies: [
-			//{ src: '$reveal$/lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
-			{ src: '$reveal$/lib/js/classList.js', condition: function() { return !document.body.classList; } },
-			{ src: '$reveal$/lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-			{ src: '$reveal$/plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-		]
-	});
-</script>
-
-</body>
-</html>
diff --git a/docs/slides/IHP14/cleanup b/docs/slides/IHP14/cleanup
deleted file mode 100644
--- a/docs/slides/IHP14/cleanup
+++ /dev/null
@@ -1,1 +0,0 @@
-find . | grep -E -e '\.(smt2|bak|json|css|md|hi|out|fqout|fq|o|err|annot|log|html|cgi|liquid)$' | xargs rm -rf
diff --git a/docs/slides/IHP14/img/RedBlack.png b/docs/slides/IHP14/img/RedBlack.png
deleted file mode 100644
Binary files a/docs/slides/IHP14/img/RedBlack.png and /dev/null differ
diff --git a/docs/slides/IHP14/img/tension0.png b/docs/slides/IHP14/img/tension0.png
deleted file mode 100644
Binary files a/docs/slides/IHP14/img/tension0.png and /dev/null differ
diff --git a/docs/slides/IHP14/img/tension1.png b/docs/slides/IHP14/img/tension1.png
deleted file mode 100644
Binary files a/docs/slides/IHP14/img/tension1.png and /dev/null differ
diff --git a/docs/slides/IHP14/img/tension2.png b/docs/slides/IHP14/img/tension2.png
deleted file mode 100644
Binary files a/docs/slides/IHP14/img/tension2.png and /dev/null differ
diff --git a/docs/slides/IHP14/img/tension3.png b/docs/slides/IHP14/img/tension3.png
deleted file mode 100644
Binary files a/docs/slides/IHP14/img/tension3.png and /dev/null differ
diff --git a/docs/slides/IHP14/lhs/00_Motivation_GoWrong.lhs b/docs/slides/IHP14/lhs/00_Motivation_GoWrong.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/00_Motivation_GoWrong.lhs
+++ /dev/null
@@ -1,176 +0,0 @@
-Well-Typed Programs Can Go Wrong
-================================
-
- {#asd}
--------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-Division By Zero
-----------------
-
-
-
-
-<div class="fragment"> 
-\begin{code} <div/> 
-λ> let average xs = sum xs `div` length xs
-
-λ> average [1,2,3]
-2
-\end{code}
-</div>
-
-<div class="fragment"> 
-
-\begin{code} <br> 
-λ> average []
-*** Exception: divide by zero
-\end{code}
-
-</div>
-
-Missing Keys
-------------
-
-<div class="fragment"> 
-\begin{code} <div/> 
-λ> :m +Data.Map 
-λ> let m = fromList [ ("haskell", "lazy")
-                    , ("ocaml"  , "eager")]
-
-λ> m ! "haskell"
-"lazy"
-\end{code}
-</div>
-
-<div class="fragment"> 
-\begin{code} <br> 
-λ> m ! "javascript"
-"*** Exception: key is not in the map
-\end{code}
-</div>
-
-Segmentation Faults
--------------------
-
-<div class="fragment"> 
-\begin{code} <div/> 
-λ> :m +Data.Vector 
-λ> let v = fromList ["haskell", "ocaml"]
-λ> unsafeIndex v 0
-"haskell"
-\end{code}
-</div>
-
-<div class="fragment"> 
-\begin{code} <br> 
-λ> V.unsafeIndex v 3
-
-
-'ghci' terminated by signal SIGSEGV ...
-\end{code}
-</div>
-
-
-"HeartBleeds"
--------------
-
-\begin{code} <div/>
-λ> :m + Data.Text Data.Text.Unsafe 
-λ> let t = pack "Kanazawa"
-λ> takeWord16 5 t
-"Kanaz"
-\end{code}
-
-<br>
-
-<div class="fragment"> 
-Memory overflows **leaking secrets**...
-
-<br>
-
-\begin{code} <div/>
-λ> takeWord16 20 t
-"Kanazawa\1912\3148\SOH\NUL\15928\2486\SOH\NUL"
-\end{code}
-</div>
-
-Goal
-----
-
-Extend Hindley-Milner To Prevent More Errors
-
-Liquid Types for Haskell
-========================
-
-LiquidHaskell
--------------
-
-<br>
-<br>
-
-<div class="fragment">Refine **types** with **predicates**</div>
-
-<br>
-<br>
-
-<div class="fragment">**Expressive** specification & **Automatic** verification</div>
-
-
-Automatic
----------
-
-[Liquid Types, PLDI 08](http://goto.ucsd.edu/~rjhala/liquid/liquid_types.pdf)
-
-<br>
-
-+ Abstract Interpretation (covered briefly...) 
-
-+ SMT Solvers 
-
-Expressive
-----------
-
-<br>
-<br>
-
-This talk ...
-
-Try Yourself
-------------
-
-<br>
-
-**google: ** `"liquidhaskell demo"` 
-
- {#zog} 
---------
-
-<br>
-<br>
-<br>
-<br>
-
-[[continue]](01_SimpleRefinements.lhs.slides.html)
-
-
-Plan 
-----
-
-+ <a href="01_SimpleRefinements.lhs.slides.html" target="_blank">Refinements</a>
-+ <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-+ <div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target= "_blank">Higher-Order Functions</a></div>
-+ <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements:</a> <a href="06_Inductive.lhs.slides.html" target="_blank">Code</a>, <a href="08_Recursive.lhs.slides.html" target= "_blank">Data</a>,<a href="07_Array.lhs.slides.html" target= "_blank">...</a>,<a href="05_Composition.lhs.slides.html" target= "_blank">...</a></div>
-+ <div class="fragment"><a href="09_Laziness.lhs.slides.html" target="_blank">Lazy Evaluation</a></div>
-+ <div class="fragment"><a href="10_Termination.lhs.slides.html" target="_blank">Termination</a></div>
-+ <div class="fragment"><a href="11_Evaluation.lhs.slides.html" target="_blank">Evaluation</a></div>
-+ <div class="fragment"><a href="12_Conclusion.lhs.slides.html" target="_blank">Conclusion</a></div>
-
diff --git a/docs/slides/IHP14/lhs/00_Motivation_Logic.lhs b/docs/slides/IHP14/lhs/00_Motivation_Logic.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/00_Motivation_Logic.lhs
+++ /dev/null
@@ -1,136 +0,0 @@
- {#asds}
-========
-
-Algorithmic Verification 
-------------------------
-
-
-<br>
-<br>
-
-**Goal**
-
-<br>
-
-Proving program properties *without* writing proofs!
-
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-Algorithmic Verification
-========================
-
-Tension
--------
-
-<img src="../img/tension0.png" height=300px>
-
-Automation vs. Expressiveness
-
-Tension
--------
-
-<img src="../img/tension1.png" height=300px>
-
-Extremes: Hindley-Milner vs. CoC
-
-Tension
--------
-
-<img src="../img/tension2.png" height=300px>
-
-Trading off Automation for Expressiveness
-
-Tension
--------
-
-<img src="../img/tension3.png" height=300px>
-
-**Goal:** Find a sweet spot?
-
-Program Logics
---------------
-
-<br>
-
-**Floyd-Hoare** (ESC, Dafny, SLAM/BLAST,...)
-
-<br>
-
-+ **Properties:**   Assertions & Pre- and Post-conditions
-
-+ **Proofs:**       Verification Conditions proved by SMT
-
-+ **Inference:**    Abstract Interpretation
-
-<br>
-
-<div class="fragment"> Automatic but **not** Expressive </div>
-
-
-Program Logics
---------------
-
-<br>
-
-Automatic but **not** Expressive
-
-<br>
-
-+ Rich Data Types ?
-
-+ Higher-order functions ?
-
-+ Polymorphism ?
-
-
-Liquid Types
-------------
-
-<br>
-
-Generalize Floyd-Hoare Logic with Types
-
-<div class="fragment"> 
-<br>
-
-+ **Properties:**  Types + Predicates
-
-+ **Proofs:**      Subtyping + Verification Conditions
-
-+ **Inference:**   Hindley-Milner + Abstract Interpretation
-
-</div>
-
-<div class="fragment"> 
-  <br>
-  Towards reconciling Automation and Expressiveness
-</div>
-
-Liquid Types
-------------
-
-<br>
-<br>
-
-[[continue]](01_SimpleRefinements.lhs.slides.html)
-
-
-Plan 
-----
-
-+ <a href="01_SimpleRefinements.lhs.slides.html" target="_blank">Refinements</a>
-+ <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-+ <div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target= "_blank">Higher-Order Functions</a></div>
-+ <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements:</a> <a href="06_Inductive.lhs.slides.html" target="_blank">Code</a>, <a href="08_Recursive.lhs.slides.html" target= "_blank">Data</a>,<a href="07_Array.lhs.slides.html" target= "_blank">...</a>,<a href="05_Composition.lhs.slides.html" target= "_blank">...</a></div>
-+ <div class="fragment"><a href="09_Laziness.lhs.slides.html" target="_blank">Lazy Evaluation</a></div>
-+ <div class="fragment"><a href="10_Termination.lhs.slides.html" target="_blank">Termination</a></div>
-+ <div class="fragment"><a href="11_Evaluation.lhs.slides.html" target="_blank">Evaluation</a></div>
-+ <div class="fragment"><a href="12_Conclusion.lhs.slides.html" target="_blank">Conclusion</a></div>
-
diff --git a/docs/slides/IHP14/lhs/01_SimpleRefinements.lhs b/docs/slides/IHP14/lhs/01_SimpleRefinements.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/01_SimpleRefinements.lhs
+++ /dev/null
@@ -1,850 +0,0 @@
- {#simplerefinements}
-=======================
-
-Simple Refinement Types
------------------------
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-module SimpleRefinements where
-import Language.Haskell.Liquid.Prelude
-import Prelude hiding (abs, max)
-
--- boring haskell type sigs
-zero    :: Int
-zero'   :: Int
-safeDiv :: Int -> Int -> Int
-abs     :: Int -> Int
-nats    :: L Int
-evens   :: L Int
-odds    :: L Int
-range   :: Int -> Int -> L Int
-\end{code}
-
-</div>
-
-
-Simple Refinement Types
-=======================
-
-
-Types + Predicates 
-------------------
-
-
-Example: Integers equal to `0`
-------------------------------
-
-<br>
-
-\begin{code}
-{-@ type Zero = {v:Int | v = 0} @-}
-
-{-@ zero :: Zero @-}
-zero     =  0
-\end{code}
-
-<br>
-
-<div class="fragment">
-Refinement types via special comments `{-@ ... @-}` 
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo</a> 
-</div>
-
-
-
-Refinements Are Predicates
-==========================
-
-From A Decidable Logic
-----------------------
-
-<br> 
-
-1. Expressions
-
-2. Predicates
-
-<br>
-
-<div class="fragment">
-
-**Refinement Logic: QF-UFLIA**
-
-Quant.-Free. Uninterpreted Functions and Linear Arithmetic 
-
-</div>
-
-
-Expressions
------------
-
-<br>
-
-\begin{code} <div/> 
-e := x, y, z,...    -- variable
-   | 0, 1, 2,...    -- constant
-   | (e + e)        -- addition
-   | (e - e)        -- subtraction
-   | (c * e)        -- linear multiplication
-   | (f e1 ... en)  -- uninterpreted function
-\end{code}
-
-Predicates
-----------
-
-<br>
-
-\begin{code} <div/>
-p := e           -- atom 
-   | e1 == e2    -- equality
-   | e1 <  e2    -- ordering 
-   | (p && p)    -- and
-   | (p || p)    -- or
-   | (not p)     -- negation
-\end{code}
-
-<br>
-
-
-Refinement Types
-----------------
-
-
-<br>
-
-\begin{code}<div/>
-b := Int 
-   | Bool 
-   | ...         -- base types
-   | a, b, c     -- type variables
-
-t := {x:b | p}   -- refined base 
-   | x:t -> t    -- refined function  
-\end{code}
-
-
-Subtyping Judgment 
-------------------
-
-<br>
-
-$$\boxed{\Gamma \vdash t_1 \preceq t_2}$$
-
-<div class="fragment">
-
-<br>
-
-Where **environment** $\Gamma$ is a sequence of binders
-
-<br>
-
-$$\Gamma \defeq \overline{\bindx{x_i}{t_i}}$$
-
-</div>
-
-Subtyping is Implication
-------------------------
-
-[PVS' Predicate Subtyping](http://pvs.csl.sri.com/papers/subtypes98/tse98.pdf)
-
-<br>
-
-(For **Base** Types ...)
-
-
-
-
-Subtyping is Implication
-------------------------
-
-<br>
-
-$$
-\begin{array}{rl}
-{\mathbf{If\ VC\ is\ Valid}}   & \bigwedge_i P_i \Rightarrow  Q  \Rightarrow R \\
-                & \\
-{\mathbf{Then}} & \overline{\bindx{x_i}{P_i}} \vdash \reft{v}{b}{Q} \subty \reft{v}{v}{R} \\
-\end{array}
-$$ 
-
-
-Example: Natural Numbers
-------------------------
-
-<br>
-
-\begin{code} <div/>  
-        type Nat = {v:Int | 0 <= v}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-$$
-\begin{array}{rcrccll}
-\mathbf{VC\ is\ Valid:} & \True     & \Rightarrow &  v = 0   & \Rightarrow &  0 \leq v & \mbox{(by SMT)} \\
-%                &           &             &          &             &           \\
-\mathbf{So:}      & \emptyset & \vdash      & \Zero  & \subty      & \Nat   &   \\
-\end{array}
-$$
-</div>
-
-<br>
-
-<div class="fragment">
-
-Hence, we can type:
-
-\begin{code}
-{-@ zero' :: Nat @-}
-zero'     =  zero   -- zero :: Zero <: Nat
-\end{code}
-</div>
-
-Contracts: Function Types
-=========================
-
- {#as}
-------
-
-Pre-Conditions
---------------
-
-
-<br>
-
-\begin{code}
-safeDiv n d = n `div` d   -- crashes if d==0
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Requires** non-zero input divisor `d`
-
-\begin{code}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-\end{code}
-</div>
-
-<br>
-
-
-<div class="fragment">
-Specify pre-condition as **input type** 
-
-\begin{code}
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{code}
-
-</div>
-
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{code} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{code}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code}
-{-@ bad :: Nat -> Int @-}
-bad n   = 10 `safeDiv` n
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Rejected As** 
-
-$$\bindx{n}{\Nat} \vdash \reftx{v}{v = n} \not \subty \reftx{v}{v \not = 0}$$
-
-</div>
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{code} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{code}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code}
-{-@ ok  :: Nat -> Int @-}
-ok n    = 10 `safeDiv` (n+1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Verifies As** 
-
-$\bindx{n}{\Nat} \vdash \reftx{v}{v = n+1} \subty \reftx{v}{v \not = 0}$
-</div>
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{code} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{code}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code} <div/>
-{-@ ok  :: Nat -> Int @-}
-ok n    = 10 `safeDiv` (n+1)
-\end{code}
-
-<br>
-
-**Verifies As**
-
-$$(0 \leq n) \Rightarrow (v = n+1) \Rightarrow (v \not = 0)$$
-
-
-
-Post-Conditions
----------------
-
-**Ensures** output is a `Nat` greater than input `x`.
-
-\begin{code}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{code}
-
-<br>
-
-<div class="fragment">
-Specify post-condition as **output type**
-
-\begin{code}
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-**Dependent Function Types**
-
-Outputs *refer to* inputs
-</div>
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{code} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{code}
-
-<br>
-
-Postcondition is checked at **return-site**
-
-<br>
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{code} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{code}
-
-<br>
-
-**Verified As**
-
-<br>
-
-$$\begin{array}{rll}
-\bindx{x}{\Int},\bindx{\_}{0 \leq x}      & \vdash \reftx{v}{v = x}     & \subty \reftx{v}{0 \leq v \wedge x \leq v} \\
-\bindx{x}{\Int},\bindx{\_}{0 \not \leq x} & \vdash \reftx{v}{v = 0 - x} & \subty \reftx{v}{0 \leq v \wedge x \leq v} \\
-\end{array}$$
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{code} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{code}
-
-<br>
-
-**Verified As**
-
-<br>
-
-$$\begin{array}{rll}
-(0 \leq x)      & \Rightarrow (v = x)     & \Rightarrow (0 \leq v \wedge x \leq v) \\
-(0 \not \leq x) & \Rightarrow (v = 0 - x) & \Rightarrow (0 \leq v \wedge x \leq v) \\
-\end{array}$$
-
-
- {#inference}
-=============
-
-From Checking To Inference
---------------------------
-
-**So far**
-
-How to **check** code against given signature
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-How to **synthesize** signatures from code
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**2-Phase Process**
-
-1. H-M to synthesize *types*
-2. A-I to synthesize *refinements*  
-
-</div>
-
-<br>
-
-<div class="fragment">Lets quickly look at 2. </div>
-
-
-
-From Checking To Inference
-==========================
-
-
-Recipe
-------
-
-<br>
-
-<div class="fragment">
-
-**Step 1. Templates**
-
-Types with variables $\kvar{}$ for *unknown* refinements
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Step 2. Constraints**
-
-Typecheck templates: VCs $\rightarrow$ Horn constraints over $\kvar{}$
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Step 3. Solve**
-
-Via least-fixpoint over suitable abstract domain
-
-</div>
-
-Step 1. Templates (`abs`)
--------------------------
-
-<br>
-
-<div class="fragment">
-**Type**
-
-$$\bindx{x}{\Int} \rightarrow \Int$$
-</div>
-
-<br>
-
-<div class="fragment">
-**Template**
-
-$$\ereft{x}{\Int}{\kvar{1}} \rightarrow \reft{v}{\Int}{\kvar{2}}$$
-</div>
-
-Step 2. Constraints (`abs`)
--------------------------
-
-<br>
-
-Step 2. Constraints (`abs`)
--------------------------
-
-<br>
-
-**Subtyping Queries**
-
-<br>
-
-$$
-\begin{array}{rll}
-\bindx{x}{\kvar{1}},\bindx{\_}{0 \leq x}      & \vdash \reftx{v}{v = x}     & \subty \reftx{v}{\kvar{2}} \\
-\bindx{x}{\kvar{1}},\bindx{\_}{0 \not \leq x} & \vdash \reftx{v}{v = 0 - x} & \subty \reftx{v}{\kvar{2}} \\
-\end{array}
-$$
-
-Step 2. Constraints (`abs`)
--------------------------
-
-<br>
-
-**Verification Conditions**
-
-<br>
-
-$$\begin{array}{rll}
-{\kvar{1}} \wedge (0 \leq x)      & \Rightarrow (v = x)     & \Rightarrow \kvar{2} \\
-{\kvar{1}} \wedge (0 \not \leq x) & \Rightarrow (v = 0 - x) & \Rightarrow \kvar{2} \\
-\end{array}$$
-
-
-Step 2. Constraints (`abs`)
--------------------------
-
-<br>
-
-**Horn Constraints** over $\kvar{}$
-
-<br>
-
-$$\begin{array}{rll}
-{\kvar{1}} \wedge (0 \leq x)      & \Rightarrow (v = x)     & \Rightarrow \kvar{2} \\
-{\kvar{1}} \wedge (0 \not \leq x) & \Rightarrow (v = 0 - x) & \Rightarrow \kvar{2} \\
-\end{array}$$
-
-<br>
-<br>
-
-**Note:** $\kvar{}$ occur positively, hence constraints are monotone.
-
-Step 3. Solve (`abs`)
----------------------
-
-Least-fixpoint over abstract domain 
-
-<br>
-
-
-<div class="fragment">
-**Predicate Abstraction**
-
-Conjunction of predicates from (finite) ground set $\quals$
-</div>
-
-<br>
-
-<div class="fragment">
-$$\mbox{e.g.}\ \quals \defeq \{ c \sim X \}$$
-
-<br>
-
-$$\begin{array}{ccll}
-  c     & \in & \{0,1,\ldots   \}                & \mbox{program constants} \\
-  X     & \in & \{n,x,v,\ldots \}                & \mbox{program variables} \\
-  \sim  & \in & \{<, \leq, >, \geq, =, \not =\}  & \mbox{comparisons}       \\
-  \end{array}$$
-
-</div>
-
-Step 3. Solve (`abs`)
----------------------
-
-Least-fixpoint over abstract domain 
-
-<br>
-
-**Predicate Abstraction**
-
-Conjunction of predicates from (finite) ground set $\quals$
-
-<br>
-
-+ Obtain $\quals$ via CEGAR
-+ Or use other domains
-
-<br>
-
-[[Rybalchenko et al., CAV 2011]](http://goto.ucsd.edu/~rjhala/papers/hmc.html)
-
-
-Recipe Scales Up
-----------------
-
-<br>
-
-**1. Templates** $\rightarrow$ **2. Horn Constraints** $\rightarrow$ **3. Fixpoint**
-
-<br>
-
-<div class="fragment">
-+ Define type checker, get inference for free 
-
-+ Scales to Data types, HO functions, Polymorphism
-
-</div>
-<br>
-
-<div class="fragment">
-**Key Requirement** 
-
-Refinements belong in abstract domain, e.g. QF-UFLIA
-</div>
-
-
-
- {#universalinvariants}
-=======================
-
-Types = Universal Invariants
-----------------------------
-
-(Notoriously hard with *pure* SMT)
-
-Types Yield Universal Invariants
-================================
-
-Example: Lists
---------------
-
-
-<div class="hidden">
-\begin{code}
-infixr `C`
-\end{code}
-</div>
-
-
-<br>
-<br>
-<br>
-
-
-\begin{code}
-data L a = N          -- Empty 
-         | C a (L a)  -- Cons 
-\end{code}
-
-
-<br>
-
-<div class="fragment">
-
-How to **specify** every element in `nats` is non-negative?
-
-\begin{code}
-nats     =  0 `C` 1 `C` 3 `C` N
-\end{code}
-</div>
-
-
-Example: Lists
---------------
-
-How to **specify** every element in `nats` is non-negative?
-
-\begin{code} <div/>
-nats     =  0 `C` 1 `C` 2 `C` N
-\end{code}
-
-<br>
-
-**Logic**
-
-$$\forall x \in \mathtt{nats}. 0 \leq x$$
-
-<br>
-
-<div class="fragment">
-VCs over **quantified formulas** ... *terrible* for SMT
-</div>
-
-
-Example: Lists
---------------
-
-How to **specify** every element in `nats` is non-negative?
-
-\begin{code} <div/>
-nats     =  0 `C` 1 `C` 2 `C` N
-\end{code}
-
-<br>
-
-**Refinement Types**
-
-\begin{code}
-{-@ nats :: L Nat @-}
-\end{code}
-
-<br>
-
-+ <div class="fragment">Type *implicitly* has quantification</div>
-+ <div class="fragment">Sub-typing *eliminates* quantifiers</div>
-+ <div class="fragment">Robust verification via *quantifier-free* VCs</div>
-
-Example: Lists
---------------
-
-How to **verify** ? 
-
-\begin{code} <div/>
-{-@ nats :: L Nat @-}
-nats   = l0
-  where
-    l0 = 0 `C` l1  -- Nat `C` L Nat >>> L Nat
-    l1 = 1 `C` l2  -- Nat `C` L Nat >>> L Nat
-    l2 = 2 `C` l3  -- Nat `C` L Nat >>> L Nat
-    l3 = N         -- L Nat
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if `nats` contained `-2`? 
-
-</div>
-
-<!--
-
-Example: Even/Odd Lists
------------------------
-
-\begin{code}
-{-@ type Even = {v:Int | v mod 2 =  0} @-}
-{-@ type Odd  = {v:Int | v mod 2 /= 0} @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ evens :: L Even @-}
-evens     =  0 `C` 2 `C` 4 `C` N
-
-{-@ odds  :: L Odd  @-}
-odds      =  1 `C` 3 `C` 5 `C` N 
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if `evens` contained `1`? 
-</div>
-
--->
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s **between** `i` and `j`
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s **between** `i` and `j`
-
-<br>
-
-\begin{code}
-{-@ type Btwn I J = {v:_ | (I<=v && v<J)} @-}
-\end{code}
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-<br>
-
-\begin{code}
-{-@ range :: i:Int -> j:Int -> L (Btwn i j) @-}
-range i j            = go i
-  where
-    go n | n < j     = n `C` go (n + 1)  
-         | otherwise = N
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Note:** Type of `go` is automatically inferred
-</div>
-
-
-Example: Indexing Into List
----------------------------
-
-\begin{code} 
-(!)          :: L a -> Int -> a
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "Oops!"
-\end{code}
-
-<br>
-
-<div class="fragment">(Mouseover to view type of `liquidError`)</div>
-
-<br>
-
-<div class="fragment">To ensure safety, *require* `i` between `0` and list **length**</div>
-
-<br>
-
-<div class="fragment">Need way to **measure** the length of a list [[continue...]](02_Measures.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/IHP14/lhs/02_Measures.lhs b/docs/slides/IHP14/lhs/02_Measures.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/02_Measures.lhs
+++ /dev/null
@@ -1,470 +0,0 @@
-
- {#measures}
-============
-
-Measuring Data Types
---------------------
-
-<div class="hidden">
-
-\begin{code}
-module Measures where
-import Prelude hiding ((!!), length)
-import Language.Haskell.Liquid.Prelude
-
-length      :: L a -> Int
-(!)         :: L a -> Int -> a
-insert      :: Ord a => a -> L a -> L a
-insertSort  :: Ord a => [a] -> L a
-
-infixr `C`
-\end{code}
-
-</div>
-
-
-Measuring Data Types 
-====================
-
-Recap
------
-
-1. <div class="fragment">**Refinements:** Types + Predicates</div>
-2. <div class="fragment">**Subtyping:** SMT Implication</div>
-
-
-Example: Length of a List 
--------------------------
-
-Given a type for lists:
-
-<br>
-
-\begin{code}
-data L a = N | C a (L a)
-\end{code}
-
-<div class="fragment">
-<br>
-
-We can define the **length** as:
-
-<br>
-
-\begin{code}
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-\end{code}
-
-</div>
-
-Example: Length of a List 
--------------------------
-
-\begin{code} <div/>
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-\end{code}
-
-<br>
-
-We **strengthen** data constructor types
-
-<br>
-
-\begin{code} <div/>
-data L a where 
-  N :: {v: L a | (llen v) = 0}
-  C :: a -> t:_ -> {v:_| llen v = 1 + llen t}
-\end{code}
-
-Measures Are Uninterpreted
---------------------------
-
-\begin{code} <br>
-data L a where 
-  N :: {v: L a | (llen v) = 0}
-  C :: a -> t:_ -> {v:_| llen v = 1 + llen t}
-\end{code}
-
-<br>
-
-`llen` is an **uninterpreted function** in SMT logic
-
-Measures Are Uninterpreted
---------------------------
-
-<br>
-
-In SMT, [uninterpreted function](http://fm.csl.sri.com/SSFT12/smt-euf-arithmetic.pdf) $f$ obeys **congruence** axiom:
-
-<br>
-
-$$\forall \overline{x}, \overline{y}. \overline{x} = \overline{y} \Rightarrow
-f(\overline{x}) = f(\overline{y})$$
-
-<br>
-
-<div class="fragment">
-Other properties of `llen` asserted when typing **fold** & **unfold**
-</div>
-
-<br>
-
-<div class="fragment">
-Crucial for *efficient*, *decidable* and *predictable* verification.
-</div>
-
-Measures Are Uninterpreted
---------------------------
-
-Other properties of `llen` asserted when typing **fold** & **unfold**
-
-<br>
-
-<div class="fragment">
-\begin{code}**Fold**<br>
-z = C x y     -- z :: {v | llen v = 1 + llen y}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{code}**Unfold**<br>
-case z of 
-  N     -> e1 -- z :: {v | llen v = 0}
-  C x y -> e2 -- z :: {v | llen v = 1 + llen y}
-\end{code}
-</div>
-
-
-Measured Refinements
---------------------
-
-Now, we can verify:
-
-<br>
-
-\begin{code}
-{-@ length      :: xs:L a -> (EqLen xs) @-}
-length N        = 0
-length (C _ xs) = 1 + length xs
-\end{code}
-
-<div class="fragment">
-
-<br>
-
-Where `EqLen` is a type alias:
-
-\begin{code}
-{-@ type EqLen Xs = {v:Nat | v = (llen Xs)} @-}
-\end{code}
-
-</div>
-
-List Indexing Redux
--------------------
-
-We can type list lookup:
-
-\begin{code}
-{-@ (!)      :: xs:L a -> (LtLen xs) -> a @-}
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "never happens!"
-\end{code}
-
-<br>
-
-<div class="fragment">
-Where `LtLen` is a type alias:
-
-\begin{code}
-{-@ type LtLen Xs = {v:Nat | v < (llen Xs)} @-}
-\end{code}
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellMeasure.hs" target= "_blank">Demo:</a> 
-&nbsp; What if we *remove* the precondition?
-
-</div>
-
-Multiple Measures
------------------
-
-<br>
-
-Support **many** measures on a type ...
-
-<br>
-
-<div class="fragment">
-... by **conjoining** the constructor refinements.
-</div>
-
-[[Skip...]](#/refined-data-cons)
-
-
-<!--
-
-Multiple Measures
-=================
-
- {#adasd}
----------
-
-We allow *many* measures for a type
-
-Ex: List Emptiness 
-------------------
-
-Measure describing whether a `List` is empty 
-
-\begin{code}
-{-@ measure isNull :: (L a) -> Prop
-    isNull (N)      = true
-    isNull (C x xs) = false           @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-We **strengthen** data constructors
-
-\begin{code} <div/> 
-data L a where 
-  N :: {v : L a | (isNull v)}
-  C :: a -> L a -> {v:(L a) | not (isNull v)}
-\end{code}
-
-</div>
-
-Conjoining Refinements
-----------------------
-
-Data constructor refinements are **conjoined** 
-
-\begin{code} <br>
-data L a where 
-  N :: {v:L a |  (llen v) = 0 
-              && (isNull v) }
-  C :: a 
-    -> xs:L a 
-    -> {v:L a |  (llen v) = 1 + (llen xs) 
-              && not (isNull v)          }
-\end{code}
-
--->
-
-Multiple Measures: Red-Black Trees
-==================================
-
- {#rbtree}
-----------
-
-<img src="../img/RedBlack.png" height=300px>
-
-+ <div class="fragment">**Color:** `Red` nodes have `Black` children</div>
-+ <div class="fragment">**Height:** Number of `Black` nodes equal on *all paths*</div>
-<br>
-
-[[Skip...]](#/refined-data-cons)
-
-Basic Type 
-----------
-
-\begin{code} <br>
-data Tree a = Leaf 
-            | Node Color a (Tree a) (Tree a)
-
-data Color  = Red 
-            | Black
-\end{code}
-
-Color Invariant 
----------------
-
-`Red` nodes have `Black` children
-
-<div class="fragment">
-\begin{code} <br>
-measure isRB        :: Tree a -> Prop
-isRB (Leaf)         = true
-isRB (Node c x l r) = c=Red => (isB l && isB r)
-                      && isRB l && isRB r
-\end{code}
-</div>
-
-<div class="fragment">
-\begin{code} where <br>
-measure isB         :: Tree a -> Prop 
-isB (Leaf)          = true
-isB (Node c x l r)  = c == Black 
-\end{code}
-</div>
-
-*Almost* Color Invariant 
-------------------------
-
-<br>
-
-Color Invariant **except** at root. 
-
-<br>
-
-<div class="fragment">
-\begin{code} <br>
-measure isAlmost        :: Tree a -> Prop
-isAlmost (Leaf)         = true
-isAlmost (Node c x l r) = isRB l && isRB r
-\end{code}
-</div>
-
-
-Height Invariant
-----------------
-
-Number of `Black` nodes equal on **all paths**
-
-<div class="fragment">
-\begin{code} <br>
-measure isBH        :: RBTree a -> Prop
-isBH (Leaf)         =  true
-isBH (Node c x l r) =  bh l = bh r 
-                    && isBH l && isBH r 
-\end{code}
-</div>
-
-<div class="fragment">
-\begin{code} where <br>
-measure bh        :: RBTree a -> Int
-bh (Leaf)         = 0
-bh (Node c x l r) = bh l 
-                  + if c = Red then 0 else 1
-\end{code}
-</div>
-
-Refined Type 
-------------
-
-\begin{code} <br>
--- Red-Black Trees
-type RBT a  = {v:Tree a | isRB v && isBH v}
-
--- Almost Red-Black Trees
-type ARBT a = {v:Tree a | isAlmost v && isBH v}
-\end{code}
-
-<br>
-
-[Details](https://github.com/ucsd-progsys/liquidhaskell/blob/master/tests/pos/RBTree.hs)
-
-<!--
-
-Measures vs. Index Types
-========================
-
-Decouple Property & Type 
-------------------------
-
-Unlike [indexed types](http://dl.acm.org/citation.cfm?id=270793) ...
-
-<br>
-
-<div class="fragment">
-
-+ Measures **decouple** properties from structures
-
-+ Support **multiple** properties over structures 
-
-+ Enable  **reuse** of structures in different contexts                 
-
-</div>
-
-<br>
-
-<div class="fragment">Invaluable in practice!</div>
-
--->
-
-Refined Data Constructors
-=========================
-
- {#refined-data-cons}
----------------------
-
-Can encode invariants **inside constructors**
-
-<div class="fragment">
-
-<br>
-
-\begin{code}
-{-@ data L a = N
-             | C { x  :: a 
-                 , xs :: L {v:a| x <= v} } @-}
-\end{code}
-</div>
-<br>
-
-<div class="fragment">
-Head `x` is less than **every** element of tail `xs`
-</div>
-
-<br>
-
-<div class="fragment">
-i.e. specifies **increasing** Lists 
-</div>
-
-Increasing Lists 
-----------------
-
-\begin{code} <br>
-data L a where
-  N :: L a
-  C :: x:a -> xs: L {v:a | x <= v} -> L a
-\end{code}
-
-<br>
-
-- <div class="fragment">We **check** property when **folding** `C`</div>
-- <div class="fragment">We **assume** property when **unfolding** `C`</div>
-
-Increasing Lists 
-----------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellInsertSort.hs" target= "_blank">Demo: Insertion Sort</a> (hover for inferred types) 
-
-<br>
-
-\begin{code}
-insertSort = foldr insert N
-
-insert y (x `C` xs) 
-  | y <= x    = y `C` (x `C` xs)
-  | otherwise = x `C` insert y xs
-insert y N    = y `C` N    
-\end{code}
-
-<br>
-
-<div class="fragment">**Problem 1:** What if we need [increasing & decreasing lists](http://web.cecs.pdx.edu/~sheard/Code/QSort.html)?</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. **Measures:** Strengthened Constructors
-    - <div class="fragment">**Decouple** property from structure</div>
-    <!-- - <div class="fragment">**Reuse** structure across *different* properties</div> -->
-
-<br>
-
-<div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target="_blank">[continue]</a></div>
diff --git a/docs/slides/IHP14/lhs/03_HigherOrderFunctions.lhs b/docs/slides/IHP14/lhs/03_HigherOrderFunctions.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/03_HigherOrderFunctions.lhs
+++ /dev/null
@@ -1,233 +0,0 @@
-  {#hofs}
-=========
-
-<div class="hidden">
-\begin{code}
-module Loop (
-    listSum
-  , sumNats
-  ) where
-
-import Prelude
-
-{-@ LIQUID "--no-termination"@-}
-sumNats  :: [Int] -> Int
-add         :: Int -> Int -> Int
-\end{code}
-</div>
-
-Higher-Order Specifications
----------------------------
-
-Types scale to *Higher-Order* Specifications
-
-<br>
-
-<div class="fragment">
-
-+ map
-+ fold
-+ visitors
-+ callbacks
-+ ...
-
-</div>
-
-<br>
-
-<div class="fragment">Very difficult with *first-order program logics*</div>
-
-
-Higher Order Specifications
-===========================
-
-Example: Higher Order Loop
---------------------------
-
-<br>
-
-\begin{code}
-loop :: Int -> Int -> α -> (Int -> α -> α) -> α
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-By subtyping, we infer `f` called with values `(Btwn lo hi)`
-
-
-Example: Summing Lists
-----------------------
-
-\begin{code}
-listSum     :: [Int] -> Int
-listSum xs  = loop 0 n 0 body 
-  where 
-    body    = \i acc -> acc + (xs !! i)
-    n       = length xs
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Function Subtyping** 
-
-+ `body` called with `i :: Btwn 0 (llen xs)`
-
-+ Hence, indexing with `!!` is safe.
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Loop.hs" target= "_blank">Demo:</a> Tweak `loop` exit condition? 
-</div>
-
-Polymorphic Instantiation
-=========================
-
- {#poly}
---------
-
-Example: Summing `Nat`s
------------------------
-
-\begin{code}
-{-@ sumNats :: [Nat] -> Nat @-}
-sumNats xs  = foldl (+) 0 xs 
-\end{code}
-
-<br>
-
-<div class="fragment">
-\begin{code} Recall 
-foldl :: (α -> β -> α) -> α -> [β] -> α
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-How to **instantiate** `α` and `β` ?
-</div>
-
-Function Subtyping
-------------------
-
-\begin{code}<div/>
-(+) ::  x:Int -> y:Int -> {v:Int|v=x+y} 
-    <:  Nat   -> Nat   -> Nat
-\end{code}
-
-<br>
-
-<div class="fragment">
-Because,
-
-\begin{code}<div/>
-               |- Nat       <: Int  -- Contra
-  x:Nat, y:Nat |- {v = x+y} <: Nat  -- Co
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-Because,
-
-\begin{code}<div/>
-  0<=x && 0<=y && v = x+y   => 0 <= v
-\end{code}
-</div>
-
-Example: Summing `Nat`s
------------------------
-
-\begin{code} <div/> 
-{-@ sumNats :: [Nat] -> Nat @-}
-sumNats xs  = foldl (+) 0 xs 
-\end{code}
-
-<br>
-
-\begin{code} Where:
-foldl :: (α -> β -> α) -> α -> [β] -> α
-(+)   :: Nat -> Nat -> Nat
-\end{code}
-
-<br>
-
-<div class="fragment">
-Hence, `sumNats` verified by **instantiating** `α,β := Nat`
-</div>
-
-<br>
-
-<div class="fragment">
-`α` is **loop invariant**, instantiation is invariant **synthesis**
-</div>
-
-Instantiation And Inference
----------------------------
-
-Polymorphism ubiquitous, so inference is critical!
-
-<br>
-
-<div class="fragment">
-**Step 1. Templates** 
-Instantiate with unknown refinements
-
-$$
-\begin{array}{rcl}
-\alpha & \defeq & \reft{v}{\Int}{\kvar{\alpha}}\\
-\beta  & \defeq & \reft{v}{\Int}{\kvar{\beta}}\\
-\end{array}
-$$
-</div>
-
-<br>
-<div class="fragment">
-**Step 2. Horn-Constraints** 
-By type checking the templates
-</div>
-
-<br>
-<div class="fragment">
-**Step 3. Fixpoint** 
-Abstract interpretatn. to get solution for $\kvar{}$
-</div>
-
-
-Iteration Dependence
---------------------
-
-**Problem:** Cannot use parametric polymorphism to verify
-
-<br>
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-As property only holds after **last iteration** ...
-
-<br>
-
-... cannot instantiate $\alpha \defeq \reft{v}{\Int}{v = n + m}$
-</div>
-
-<br>
-
-<div class="fragment">
-**Problem:** *Iteration-dependent* invariants...? &nbsp; &nbsp; [[Continue]](04_AbstractRefinements.lhs.slides.html)
-</div>
-
diff --git a/docs/slides/IHP14/lhs/04_AbstractRefinements.lhs b/docs/slides/IHP14/lhs/04_AbstractRefinements.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/04_AbstractRefinements.lhs
+++ /dev/null
@@ -1,385 +0,0 @@
-  {#abstractrefinements}
-========================
-
-<div class="hidden">
-
-\begin{code}
-module AbstractRefinements where
-
-import Prelude 
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
-o, no        :: Int
-maxInt       :: Int -> Int -> Int
-\end{code}
-</div>
-
-
-
-Abstract Refinements
---------------------
-
-
-
-Abstract Refinements
-====================
-
-Two Problems
-------------
-
-<br>
-<br>
-
-<div class="fragment">
-
-**Problem 1:** 
-
-How to specify increasing *and* decreasing lists?
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Problem 2:** 
-
-How to specify *iteration-dependence* in higher-order functions?
-
-</div>
-
-
-Problem Is Pervasive
---------------------
-
-Lets distill it to a simple example...
-
-<div class="fragment">
-
-<br>
-
-(First, a few aliases)
-
-<br>
-
-\begin{code}
-{-@ type Odd  = {v:Int | (v mod 2) = 1} @-}
-{-@ type Even = {v:Int | (v mod 2) = 0} @-}
-\end{code}
-
-</div>
-
-
-Example: `maxInt` 
------------------
-
-Compute the larger of two `Int`s:
-
-\begin{code} <br> 
-maxInt     :: Int -> Int -> Int 
-maxInt x y = if y <= x then x else y
-\end{code}
-
-
-
-Example: `maxInt` 
------------------
-
-Has **many incomparable** refinement types
-
-\begin{code}<br>
-maxInt :: Nat  -> Nat  -> Nat
-maxInt :: Even -> Even -> Even
-maxInt :: Odd  -> Odd  -> Odd 
-\end{code}
-
-<br>
-
-<div class="fragment">Oh no! **Which** one should we use?</div>
-
-
-Refinement Polymorphism 
------------------------
-
-`maxInt` returns *one of* its two inputs `x` and `y` 
-
-<div class="fragment">
-
-<div align="center">
-
-<br>
-
----------   ---   -------------------------------------------
-   **If**    :    the *inputs* satisfy a property  
-
- **Then**    :    the *output* satisfies that property
----------   ---   -------------------------------------------
-
-<br>
-
-</div>
-</div>
-
-<div class="fragment">Above holds *for all properties*!</div>
-
-<br>
-
-<div class="fragment"> 
-
-**Need to abstract properties over types**
-
-</div>
-
-<!--
-
-By Type Polymorphism?
----------------------
-
-\begin{code} <br> 
-max     :: α -> α -> α 
-max x y = if y <= x then x else y
-\end{code}
-
-<div class="fragment"> 
-
-Instantiate `α` at callsites
-
-\begin{code}
-{-@ o :: Odd  @-}
-o = maxInt 3 7     -- α := Odd
-
-{-@ e :: Even @-}
-e = maxInt 2 8     -- α := Even
-\end{code}
-
-</div>
-
-By Type Polymorphism?
----------------------
-
-\begin{code} <br> 
-max     :: α -> α -> α 
-max x y = if y <= x then x else y
-\end{code}
-
-<br>
-
-But there is a fly in the ointment ...
-
-Polymorphic `max` in Haskell
-----------------------------
-
-\begin{code} In Haskell the type of max is
-max :: (Ord α) => α -> α -> α
-\end{code}
-
-<br>
-
-\begin{code} Could *ignore* the class constraints, instantiate as before...
-{-@ o :: Odd @-}
-o     = max 3 7  -- α := Odd 
-\end{code}
-
-
-Polymorphic `(+)` in Haskell
-----------------------------
-
-\begin{code} ... but this is *unsound*!
-max :: (Ord α) => α -> α -> α
-(+) :: (Num α) => α -> α -> α
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-*Ignoring* class constraints would let us "prove":
-
-\begin{code}
-{-@ no :: Odd @-}
-no     = 3 + 7    -- α := Odd !
-\end{code}
-
-</div>
-
-Type Polymorphism? No.
-----------------------
-
-<div class="fragment">Need to try a bit harder...</div>
-
--->
-
-Parametric Refinements 
-----------------------
-
-Enable *quantification over refinements* ...
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">Type says: **for any** `p` that is a property of `Int`, </div>
-
-- <div class="fragment">`max` **takes** two `Int`s that satisfy `p`,</div>
-
-- <div class="fragment">`max` **returns** an `Int` that satisfies `p`.</div>
-
-Parametric Refinements 
-----------------------
-
-Enable *quantification over refinements* ...
-
-<br>
-
-\begin{code}<div/>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-[Key idea: ](http://goto.ucsd.edu/~rjhala/papers/abstract_refinement_types.html)
-&nbsp; `Int<p>` &nbsp; is just  &nbsp; $\reft{v}{\Int}{p(v)}$ 
-
-<br>
-
-Abstract Refinement is **uninterpreted function** in SMT logic
-
-Parametric Refinements 
-----------------------
-
-\begin{code}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-**Check Implementation via SMT**
-
-Parametric Refinements 
-----------------------
-
-\begin{code}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-**Check Implementation via SMT**
-
-<br>
-
-$$\begin{array}{rll}
-\ereft{x}{\Int}{p(x)},\ereft{y}{\Int}{p(y)} & \vdash \reftx{v}{v = y} & \subty \reftx{v}{p(v)} \\
-\ereft{x}{\Int}{p(x)},\ereft{y}{\Int}{p(y)} & \vdash \reftx{v}{v = x} & \subty \reftx{v}{p(v)} \\
-\end{array}$$
-
-Parametric Refinements 
-----------------------
-
-\begin{code}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-**Check Implementation via SMT**
-
-<br>
-
-$$\begin{array}{rll}
-{p(x)} \wedge {p(y)} & \Rightarrow {v = y} & \Rightarrow {p(v)} \\
-{p(x)} \wedge {p(y)} & \Rightarrow {v = x} & \Rightarrow {p(v)} \\
-\end{array}$$
-
-
-Using Abstract Refinements
---------------------------
-
-- <div class="fragment">**When** we call `maxInt` with args with some refinement,</div>
-
-- <div class="fragment">**Then** `p` instantiated with *same* refinement,</div>
-
-- <div class="fragment">**Result** of call will also have *same* concrete refinement.</div>
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ o' :: Odd  @-}
-o' = maxInt 3 7     -- p := \v -> Odd v 
-
-{-@ e' :: Even @-}
-e' = maxInt 2 8     -- p := \v -> Even v 
-\end{code}
-
-</div>
-
-<br>
-
-<div class="fragment">
-Infer **Instantiation** by Liquid Typing 
-
-At call-site, instantiate `p` with unknown $\kvar{p}$ and solve!
-</div>
-
-
-<!--
-
-Using Abstract Refinements
---------------------------
-
-Or any other property ...
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type RGB = {v:_ | (0 <= v && v < 256)} @-}
-
-{-@ rgb :: RGB @-}
-rgb = maxInt 56 8   -- p := \v -> 0 <= v < 256
-\end{code}
-
-</div>
-
--->
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. **Abstract Refinements** over Types
-
-<br>
-<br>
-
-<div class="fragment">
-  Abstract Refinements are *very* expressive ... <a href="06_Inductive.lhs.slides.html" target="_blank">[continue]</a>
-</div>
-
diff --git a/docs/slides/IHP14/lhs/05_Composition.lhs b/docs/slides/IHP14/lhs/05_Composition.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/05_Composition.lhs
+++ /dev/null
@@ -1,161 +0,0 @@
-Abstract Refinements {#composition}
-===================================
-
-Very General Mechanism 
-----------------------
-
-**Next:** Lets add parameters...
-
-<div class="hidden">
-\begin{code}
-module Composition where
-
-import Prelude hiding ((.))
-
-plus     :: Int -> Int -> Int
-plus3'   :: Int -> Int
-\end{code}
-</div>
-
-
-Example: `plus`
----------------
-
-\begin{code}
-{-@ plus :: x:_ -> y:_ -> {v:_ | v=x+y} @-}
-plus x y = x + y
-\end{code}
-
-
-Example: `plus 3` 
------------------
-
-<br>
-
-\begin{code}
-{-@ plus3' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3'     = plus 3
-\end{code}
-
-<br>
-
-Easily verified by LiquidHaskell
-
-A Composed Variant
-------------------
-
-Lets define `plus3` by *composition*
-
-A Composition Operator 
-----------------------
-
-\begin{code}
-(#) :: (b -> c) -> (a -> b) -> a -> c
-(#) f g x = f (g x)
-\end{code}
-
-
-`plus3` By Composition
------------------------
-
-\begin{code}
-{-@ plus3'' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3''     = plus 1 # plus 2
-\end{code}
-
-<br>
-
-Yikes! Verification *fails*. But why?
-
-<br>
-
-<div class="fragment">(Hover mouse over `#` for a clue)</div>
-
-How to type compose (#) ? 
--------------------------
-
-This specification is *too weak* <br>
-
-\begin{code} <br>
-(#) :: (b -> c) -> (a -> b) -> (a -> c)
-\end{code}
-
-<br>
-
-Output type does not *relate* `c` with `a`!
-
-How to type compose (.) ?
--------------------------
-
-Write specification with abstract refinement type:
-
-<br>
-
-\begin{code}
-{-@ (.) :: forall <p :: b->c->Prop, 
-                   q :: a->b->Prop>.
-             f:(x:b -> c<p x>) 
-          -> g:(x:a -> b<q x>) 
-          -> y:a -> exists[z:b<q y>].c<p z>
- @-}
-(.) f g y = f (g y)
-\end{code}
-
-Using (.) Operator 
-------------------
-
-<br>
-
-\begin{code}
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br>
-
-<div class="fragment">*Verifies!*</div>
-
-
-Using (.) Operator 
-------------------
-
-\begin{code} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br>
-
-LiquidHaskell *instantiates*
-
-- `p` with `\x -> v = x + 1`
-- `q` with `\x -> v = x + 2`
-
-Using (.) Operator 
-------------------
-
-\begin{code} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br> To *infer* that output of `plus3` has type: 
-
-`exists [z:{v = y + 2}].{v = z + 1}`
-
-<div class="fragment">
-
-`<:`
-
-`{v:Int|v=3}`
-</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract:** Refinements over Type Signatures
-    + <div class="fragment">*Dependencies* using refinement parameters</div>
diff --git a/docs/slides/IHP14/lhs/06_Inductive.lhs b/docs/slides/IHP14/lhs/06_Inductive.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/06_Inductive.lhs
+++ /dev/null
@@ -1,459 +0,0 @@
-Abstract Refinements {#induction}
-=================================
-
-Induction
----------
-
-Encoding *induction* with Abstract refinements
-
-<div class="hidden">
-
-\begin{code}
-module Loop where
-import Prelude hiding ((!!), foldr, length, (++))
--- import Measures
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-
-size  :: L a -> Int
-add   :: Int -> Int -> Int
-loop  :: Int -> Int -> α -> (Int -> α -> α) -> α
-foldr :: (L a -> a -> b -> b) -> b -> L a -> b
-\end{code}
-</div>
-
-Induction
-=========
-
-Example: `loop` redux 
----------------------
-
-Recall the *higher-order* `loop` 
-
-<br>
-
-\begin{code}
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-**Problem**
-
-- As property only holds after *last* loop iteration...
-
-- ... cannot instantiate `α` with `{v:Int | v = n + m}`
-
-</div>
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-**Problem** 
-
-Need invariant relating *iteration* `i` with *accumulator* `acc`
-
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-**Solution** 
-
-- Abstract Refinement `p :: Int -> a -> Prop`
-
-- `(p i acc)` relates *iteration* `i` with *accumulator* `acc`
-
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-<div class="fragment">
-<div align="center">
-
-------------  ---   ----------------------------
-  **Assume**   :    `out = loop lo hi base f` 
-
-   **Prove**   :    `(p hi out)`
-------------  ---   ----------------------------
-
-</div>
-</div>
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**Base Case:** &nbsp; Initial accumulator `base` satisfies invariant
-
-
-`(p lo base)`   
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**Inductive Step:** &nbsp; `f` *preserves* invariant at `i`
-
-
-`(p i acc) => (p (i+1) (f i acc))`
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**"By Induction"** &nbsp; `out` satisfies invariant at `hi` 
-
-`(p hi out)`
-
-
-Induction in `loop` (by type)
------------------------------
-
-Induction is an **abstract refinement type** for `loop` 
-
-<br>
-
-\begin{code}
-{-@ loop :: forall a <p :: Int -> a -> Prop>.
-        lo:Int
-     -> hi:{Int | lo <= hi}
-     -> base:a<p lo>                      
-     -> f:(i:Int -> a<p i> -> a<p (i+1)>) 
-     -> a<p hi>                           @-}
-\end{code}
-
-<br>
-
-Induction in `loop` (by type)
------------------------------
-
-`p` is the *index dependent* invariant!
-
-
-\begin{code}<br> 
-p    :: Int -> a -> Prop             -- invt 
-base :: a<p lo>                      -- base 
-f    :: i:Int -> a<p i> -> a<p(i+1)> -- step
-out  :: a<p hi>                      -- goal
-\end{code}
-
-
-
-Using Induction
----------------
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br>
-
-**Verified** by *instantiating* the abstract refinement of `loop`
-
-`p := \i acc -> acc = i + n`
-
-
-<!--
-
-Using Induction
----------------
-
-\begin{code} <div/>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br>
-
-Verified by instantiating `p := \i acc -> acc = i + n`
-
-- <div class="fragment">**Base:**  `n = 0 + n`</div>
-
-- <div class="fragment">**Step:**  `acc = i + n  =>  acc + 1 = (i + 1) + n`</div>
-
-- <div class="fragment">**Goal:**  `out = m + n`</div>
-
--->
-
-Generalizes To Structures 
--------------------------
-
-Same idea applies for induction over *structures* ...
-
-
-Structural Induction
-====================
-
-Example: Lists
---------------
-
-<br>
-
-\begin{code}
-data L a = N 
-         | C a (L a)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets write a generic loop over such lists ...
-</div>
-
-Example: `foldr`
-----------------
-
-\begin{code} <br>
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets brace ourselves for the type...
-</div>
-
-Example: `foldr`
-----------------
-
-\begin{code}
-{-@ foldr :: 
-    forall a b <p :: L a -> b -> Prop>. 
-      (xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)>) 
-    -> b<p N> 
-    -> ys:L a
-    -> b<p ys>                            @-}
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets step through the type...
-</div>
-
-
-`foldr`: Abstract Refinement
-----------------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  ::  b<p ys>                            
-\end{code}
-
-<br>
-
-`(p xs b)` relates `b` with **folded** `xs`
-
-`p :: L a -> b -> Prop`
-
-
-`foldr`: Base Case
-------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-`base` is related to **empty** list `N`
-
-`base :: b<p N>` 
-
-
-
-`foldr`: Ind. Step 
-------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-`step` **extends** relation from `xs` to `C x xs`
-
-`step :: xs:_ -> x:_ -> b<p xs> -> b<p (C x xs)>`
-
-
-`foldr`: Output
----------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-Hence, relation holds between `out` and **entire input** list `ys`
-
-`out :: b<p ys>`
-
-Using `foldr`: Size
--------------------
-
-We can now verify <br>
-
-\begin{code}
-{-@ size :: xs:_ -> {v:Int| v = (llen xs)} @-}
-size     = foldr (\_ _ n -> n + 1) 0
-\end{code}
-
-<br>
-
-<div class="fragment">
-by *automatically instantiating*
-
-`p := \xs acc -> acc = (llen xs)`
-</div>
-
-Using `foldr`: Append
----------------------
-
-We can now verify <br>
-
-\begin{code}
-{-@ (++) :: xs:_ -> ys:_ -> (Cat a xs ys) @-} 
-xs ++ ys = foldr (\_ -> C) ys xs 
-\end{code}
-
-<br>
-
-<div class="fragment">
-where 
-
-\begin{code}
-{-@ type Cat a X Y = 
-    {v:_|(llen v) = (llen X) + (llen Y)} @-}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-By automatically instantiating 
-
-`p := \xs acc -> llen acc = llen xs + llen ys`
-
-</div>
-
-Recap
------
-
-Abstract refinements *decouple* **invariant** from **traversal**
-
-<br>
-
-<div class="fragment">**Reusable** specifications for higher-order functions.</div>
-
-<br>
-
-<div class="fragment">**Automatic** checking and instantiation by SMT.</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over Type Signatures
-    + <div class="fragment">**Functions**</div>
-    + <div class="fragment">**Data** <a href="08_Recursive.lhs.slides.html" target="_blank">[continue]</a></div>
-
diff --git a/docs/slides/IHP14/lhs/07_Array.lhs b/docs/slides/IHP14/lhs/07_Array.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/07_Array.lhs
+++ /dev/null
@@ -1,405 +0,0 @@
-Abstract Refinements {#data}
-============================
-
-Recap
------
-
-**So far**
-
-Decouple invariants from *functions*
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-Decouple invariants from *data structures*
-</div>
-
-Decouple Invariants From Data {#vector} 
-=======================================
-
-Example: Vectors 
-----------------
-
-<div class="hidden">
-\begin{code}
-module LiquidArray where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume, liquidError)
-
-{-@ LIQUID "--no-termination" @-}
-
-fibMemo   :: Vec Int -> Int -> (Vec Int, Int)
-fastFib   :: Int -> Int
-idv       :: Int -> Vec Int
-axiom_fib :: Int -> Bool
-axiom_fib = undefined
-
-{-@ predicate AxFib I = (fib I) == (if I <= 1 then 1 else fib(I-1) + fib(I-2)) @-}
-\end{code}
-</div>
-
-<div class="fragment">
-
-Implemented as maps from `Int` to `a` 
-
-<br>
-
-\begin{code}
-data Vec a = V (Int -> a)
-\end{code}
-
-</div>
-
-
-Abstract *Domain* and *Range*
------------------------------
-
-Parameterize type with *two* abstract refinements:
-
-<br>
-
-\begin{code}
-{-@ data Vec a < dom :: Int -> Prop,
-                 rng :: Int -> a -> Prop >
-      = V {a :: i:Int<dom> -> a <rng i>}  @-}
-\end{code}
-
-<br>
-
-- `dom`: *domain* on which `Vec` is *defined* 
-
-- `rng`: *range*  and relationship with *index*
-
-Abstract *Domain* and *Range*
------------------------------
-
-Diverse `Vec`tors by *instantiating* `dom` and `rng`
-
-<br>
-
-<div class="fragment">
-
-A quick alias for *segments* between `I` and `J`
-
-<br>
-
-\begin{code}
-{-@ predicate Seg V I J = (I <= V && V < J) @-}
-\end{code}
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type IdVec N = Vec <{\v -> (Seg v 0 N)}, 
-                        {\k v -> v=k}> 
-                       Int                  @-}
-\end{code}
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-\begin{code}
-{-@ idv :: n:Nat -> (IdVec n) @-}
-idv n   = V (\k -> if 0 < k && k < n 
-                     then k 
-                     else liquidError "eeks")
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>Whats the problem? How can we fix it?
-</div>
-
-Ex: Zero-Terminated Vectors
----------------------------
-
-Defined between `[0..N)`, with *last* element equal to `0`:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type ZeroTerm N = 
-     Vec <{\v -> (Seg v 0 N)}, 
-          {\k v -> (k = N-1 => v = 0)}> 
-          Int                             @-}
-\end{code}
-
-</div>
-
-
-Ex: Fibonacci Table 
--------------------
-
-A vector whose value at index `k` is either 
-
-- `0` (undefined), or, 
-
-- `k`th fibonacci number 
-
-\begin{code}
-{-@ type FibV =  
-     Vec <{\v -> true}, 
-          {\k v -> (v = 0 || v = (fib k))}> 
-          Int                               @-}
-\end{code}
-
-
-Accessing Vectors
------------------
-
-Next: lets *abstractly* type `Vec`tor operations, *e.g.* 
-
-<br>
-
-- `empty`
-
-- `set`
-
-- `get`
-
-
-Ex: Empty Vectors
------------------
-
-`empty` returns Vector whose domain is `false`
-
-<br>
-
-\begin{code}
-{-@ empty :: forall <p :: Int -> a -> Prop>. 
-               Vec <{v:Int|false}, p> a     @-}
-
-empty     = V $ \_ -> error "empty vector!"
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-What would happen if we changed `false` to `true`?
-</div>
-
-Ex: `get` Key's Value 
----------------------
-
-- *Input* `key` in *domain*
-
-- *Output* value in *range* related with `k`
-
-\begin{code}
-{-@ get :: forall a <d :: Int -> Prop,  
-                     r :: Int -> a -> Prop>.
-           key:Int <d>
-        -> vec:Vec <d, r> a
-        -> a<r key>                        @-}
-
-get k (V f) = f k
-\end{code}
-
-
-Ex: `set` Key's Value 
----------------------
-
-- <div class="fragment">Input `key` in *domain*</div>
-
-- <div class="fragment">Input `val` in *range* related with `key`</div>
-
-- <div class="fragment">Input `vec` defined at *domain except at* `key`</div>
-
-- <div class="fragment">Output domain *includes* `key`</div>
-
-Ex: `set` Key's Value 
----------------------
-
-\begin{code}
-{-@ set :: forall a <d :: Int -> Prop,
-                     r :: Int -> a -> Prop>.
-           key: Int<d> -> val: a<r key>
-        -> vec: Vec<{v:Int<d>| v /= key},r> a
-        -> Vec <d, r> a                     @-}
-set key val (V f) = V $ \k -> if k == key 
-                                then val 
-                                else f key
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-Help! Can you spot and fix the errors? 
-</div>
-
-<!-- INSERT tests/pos/vecloop.lhs here AFTER FIXED -->
-
-Using the Vector API
---------------------
-
-Memoized Fibonacci
-------------------
-
-Use `Vec` API to write a *memoized* fibonacci function
-
-<br>
-
-<div class="fragment">
-\begin{code} Using the fibonacci table:
-type FibV =  
-     Vec <{\v -> true}, 
-          {\k v -> (v = 0 || v = (fib k))}> 
-          Int                              
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-But wait, what is `fib` ?
-</div>
-
-
-Specifying Fibonacci
---------------------
-
-`fib` is *uninterpreted* in the refinement logic  
-
-<br>
-
-\begin{code}
-{-@ measure fib :: Int -> Int @-}
-\end{code}
-
-<br>
-
-Specifying Fibonacci
---------------------
-
-We *axiomatize* the definition of `fib` in SMT ...
-
-\begin{code}<br>
-predicate AxFib I = 
-  (fib I) == if I <= 1 
-               then 1 
-               else fib(I-1) + fib(I-2)
-\end{code}
-
-Specifying Fibonacci
---------------------
-
-Finally, lift axiom into LiquidHaskell as *ghost function*
-
-<br>
-
-\begin{code}
-{-@ axiom_fib :: 
-      i:_ -> {v:_|((Prop v) <=> (AxFib i))} @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Note:** Recipe for *escaping* SMT limitations
-
-1. *Prove* fact externally
-2. *Use* as ghost function call
-</div>
-
-
-Fast Fibonacci
---------------
-
-An efficient fibonacci function
-
-<br>
-
-\begin{code}
-{-@ fastFib :: n:Int -> {v:_ | v = (fib n)} @-}
-fastFib n   = snd $ fibMemo (V (\_ -> 0)) n
-\end{code}
-
-<br>
-
-<div class="fragment">
-- `fibMemo` *takes* a table initialized with `0`
-
-- `fibMemo` *returns* a table with `fib` values upto `n`.
-</div>
-
-
-Memoized Fibonacci 
-------------------
-
-\begin{code}
-fibMemo t i 
-  | i <= 1    
-  = (t, liquidAssume (axiom_fib i) 1)
-  | otherwise 
-  = case get i t of   
-     0 -> let (t1,n1) = fibMemo t  (i-1)
-              (t2,n2) = fibMemo t1 (i-2)
-              n       = liquidAssume 
-                        (axiom_fib i) (n1+n2)
-          in (set i n t2,  n)
-     n -> (t, n)
-\end{code}
-
-Memoized Fibonacci 
-------------------
-
-- `fibMemo` *takes* a table initialized with `0`
-- `fibMemo` *returns* a table with `fib` values upto `n`.
-
-<br>
-
-\begin{code}
-{-@ fibMemo :: FibV 
-            -> i:Int 
-            -> (FibV,{v:Int | v = (fib i)}) @-}
-\end{code}
-
-
-Recap
------
-
-Created a `Vec` container 
-
-Decoupled *domain* and *range* invariants from *data*
-
-<br>
-
-<div class="fragment">
-
-Previous, special purpose program analyses 
-
-- [Gopan-Reps-Sagiv, POPL 05](link)
-- [J.-McMillan, CAV 07](link)
-- [Logozzo-Cousot-Cousot, POPL 11](link)
-- [Dillig-Dillig, POPL 12](link) 
-- ...
-
-Encoded as instance of abstract refinement types!
-</div>
-
-
-
-
diff --git a/docs/slides/IHP14/lhs/08_Recursive.lhs b/docs/slides/IHP14/lhs/08_Recursive.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/08_Recursive.lhs
+++ /dev/null
@@ -1,546 +0,0 @@
-Decouple Invariants From Data {#recursive} 
-==========================================
-
- {#asd}
--------
-
-Recursive Structures 
---------------------
-
-Lets see another example of decoupling...
-
-<div class="hidden">
-\begin{code}
-{-# LANGUAGE NoMonomorphismRestriction #-}
-
-module List (insertSort) where
-
-{-@ LIQUID "--no-termination" @-}
-
-mergeSort     :: Ord a => [a] -> [a]
-insertSort :: (Ord a) => [a] -> L a 
-slist :: L Int
-slist' :: L Int
-iGoUp, iGoDn, iDiff :: [Int]
-infixr `C`
-\end{code}
-</div>
-
-Decouple Invariants From Recursive Data
-=======================================
-
-Recall: Lists
--------------
-
-\begin{code}
-data L a = N 
-         | C { hd :: a, tl :: L a }
-\end{code}
-
-
-Recall: Refined Constructors 
-----------------------------
-
-Define **increasing** Lists with strengthened constructors:
-
-\begin{code} <br>
-data L a where
-  N :: L a
-  C :: hd:a -> tl: L {v:a | hd <= v} -> L a
-\end{code}
-
-Problem: Decreasing Lists?
---------------------------
-
-What if we need *both* [increasing *and* decreasing lists?](http://hackage.haskell.org/package/base-4.7.0.0/docs/src/Data-List.html#sort)
-
-<br>
-
-<div class="fragment">
-[Separate (indexed) types](http://web.cecs.pdx.edu/~sheard/Code/QSort.html) get quite complicated ...
-</div>
-
-Abstract That Refinement!
--------------------------
-
-\begin{code}
-{-@ data L a <p :: a -> a -> Prop>
-      = N 
-      | C { hd :: a, tl :: L <p> a<p hd> } @-}
-\end{code}
-
-<br>
-
-<div class="fragment"> `p` is a **binary relation** between two `a` values</div>
-
-<br>
-
-<div class="fragment"> Definition relates `hd` with **all** the elements of `tl`</div>
-
-<br>
-
-<div class="fragment"> Recursive: `p` holds for **every pair** of elements!</div>
-
-Example
--------
-
-Consider a list with *three* or more elements 
-
-\begin{code} <br>
-x1 `C` x2 `C` x3 `C` rest :: L <p> a 
-\end{code}
-
-Example: Unfold Once
---------------------
-
-\begin{code} <br> 
-x1                 :: a
-x2 `C` x3 `C` rest :: L <p> a<p x1> 
-\end{code}
-
-Example: Unfold Twice
----------------------
-
-\begin{code} <br> 
-x1          :: a
-x2          :: a<p x1>  
-x3 `C` rest :: L <p> a<p x1 && p x2> 
-\end{code}
-
-Example: Unfold Thrice
-----------------------
-
-\begin{code} <br> 
-x1   :: a
-x2   :: a<p x1>  
-x3   :: a<p x1 && p x2>  
-rest :: L <p> a<p x1 && p x2 && p x3> 
-\end{code}
-
-<br>
-
-<div class="fragment">
-Note how `p` holds between **every pair** of elements in the list. 
-</div>
-
-A Concrete Example
-------------------
-
-That was a rather *abstract*!
-
-<br>
-
-How can we *use* fact that `p` holds between *every pair*?
-
-<br>
-
-<div class="fragment">**Instantiate** `p` with a *concrete* refinement</div>
-
-
-Example: Increasing Lists
--------------------------
-
-**Instantiate** `p` with a *concrete* refinement
-
-<br>
-
-\begin{code}
-{-@ type IncL a = L <{\hd v -> hd <= v}> a @-}
-\end{code}
-
-<br>
-
-<div class="fragment"> Refinement says: &nbsp; `hd` less than **every** `v` in tail,</div>
-
-<br>
-
-<div class="fragment"> i.e., `IncL` denotes **increasing** lists. </div>
-
-Example: Increasing Lists
--------------------------
-
-LiquidHaskell *verifies* that `slist` is indeed increasing...
-
-\begin{code}
-{-@ slist :: IncL Int @-}
-slist     = 1 `C` 6 `C` 12 `C` N
-\end{code}
-
-<br> 
-
-<div class="fragment">
-
-... and *protests* that `slist'` is not: 
-
-\begin{code}
-{-@ slist' :: IncL Int @-}
-slist' = 6 `C` 1 `C` 12 `C` N
-\end{code}
-</div>
-
-Insertion Sort
---------------
-
-\begin{code}
-{-@ insertSort :: (Ord a) => [a] -> IncL a @-}
-insertSort     = foldr insert N
-
-insert y N          = y `C` N
-insert y (x `C` xs) 
-  | y < x           = y `C` (x `C` xs)
-  | otherwise       = x `C` insert y xs
-\end{code}
-
-<br>
-
-(Mouseover `insert` to see inferred type.)
-
-Checking GHC Lists
-------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target= "_blank">Demo:</a> 
-Above applies to GHC's List definition:
-
-\begin{code} <br> 
-data [a] <p :: a -> a -> Prop>
-  = [] 
-  | (:) { h :: a, tl :: [a<p h>]<p> }
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Increasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Incs a = [a]<{\h v -> h <= v}> @-}
-
-{-@ iGoUp :: Incs Int @-}
-iGoUp     = [1,2,3]
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Decreasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Decs a = [a]<{\h v -> h >= v}> @-}
-
-{-@ iGoDn :: Decs Int @-}
-iGoDn     = [3,2,1]
-\end{code}
-
-
-Checking GHC Lists
-------------------
-
-Duplicate-free Lists
-
-<br>
-
-\begin{code}
-{-@ type Difs a = [a]<{\h v -> h /= v}> @-}
-
-{-@ iDiff :: Difs Int @-}
-iDiff     = [1,3,2]
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Now we can check all the usual list sorting algorithms 
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target="_blank">Demo:</a> List Sorting
-
-<!-- 
-
-Example: `mergeSort` [1/2]
---------------------------
-
-\begin{code}
-{-@ mergeSort  :: (Ord a) => [a] -> Incs a @-}
-mergeSort []   = []
-mergeSort [x]  = [x]
-mergeSort xs   = merge xs1' xs2' 
-  where 
-   (xs1, xs2)  = split xs
-   xs1'        = mergeSort xs1
-   xs2'        = mergeSort xs2
-\end{code}
-
-Example: `mergeSort` [2/2]
---------------------------
-
-\begin{code}
-split (x:y:zs) = (x:xs, y:ys) 
-  where 
-    (xs, ys)   = split zs
-split xs       = (xs, [])
-
-merge xs []    = xs
-merge [] ys    = ys
-merge (x:xs) (y:ys) 
-  | x <= y     = x : merge xs (y:ys)
-  | otherwise  = y : merge (x:xs) ys
-\end{code}
-
-
-
-Example: `Data.List.sort` 
--------------------------
-
-<br>
-
-GHC's "official" list sorting routine
-
-<br>
-
-Juggling lists of increasing & decreasing lists
-
-
-
-
-Ex: `Data.List.sort` [1/5]
---------------------------
-
-**Step 1.** Make sequences of increasing & decreasing lists
-
-<br>
-
-\begin{code}
-sequences (a:b:xs)
-  | a `compare` b == GT = descending b [a]  xs
-  | otherwise           = ascending  b (a:) xs
-sequences [x]           = [[x]]
-sequences []            = [[]]
-\end{code}
-
-Ex: `Data.List.sort` [2/5]
---------------------------
-
-**Step 1.** Make sequences of increasing & decreasing lists
-
-<br>
-
-\begin{code}
-descending a as (b:bs)
-  | a `compare` b == GT 
-  = descending b (a:as) bs
-descending a as bs      
-  = (a:as): sequences bs
-\end{code}
-
-Ex: `Data.List.sort` [3/5]
---------------------------
-
-**Step 1.** Make sequences of increasing & decreasing lists
-
-<br>
-
-
-\begin{code}
-ascending a as (b:bs)
-  | a `compare` b /= GT 
-  = ascending b (\ys -> as (a:ys)) bs
-ascending a as bs      
-  = as [a]: sequences bs
-\end{code}
-
-Ex: `Data.List.sort` [4/5]
---------------------------
-
-**Step 2.** Merge sequences
-
-<br>
-
-\begin{code}
-mergeAll [x]        = x
-mergeAll xs         = mergeAll (mergePairs xs)
-
-mergePairs (a:b:xs) = merge a b: mergePairs xs
-mergePairs [x]      = [x]
-mergePairs []       = []
-\end{code}
-
-
-Ex: `Data.List.sort` [5/5]
---------------------------
-
-Put it all together
-
-<br>
-
-\begin{code}
-{-@ sort :: (Ord a) => [a] -> Incs a  @-}
-sort = mergeAll . sequences
-\end{code}
-
-<br>
-
-<div class="fragment">No other hints or annotations required.</div>
-
--->
-
-Phew!
------
-
-Lets see one last example...
-
-<br>
-<br>
-<br>
-<br>
-
-[[Skip]](#/1/32)
-
-
-Example: Binary Trees
----------------------
-
-... `Map` from keys of type `k` to values of type `a` 
-
-<br>
-
-<div class="fragment">
-
-Implemented, in `Data.Map` as a binary tree:
-
-<br>
-
-\begin{code}
-data Map k a = Tip
-             | Bin Size k a (Map k a) (Map k a)
-
-type Size    = Int
-\end{code}
-</div>
-
-Two Abstract Refinements
-------------------------
-
-- `l` : relates root `key` with `left`-subtree keys
-- `r` : relates root `key` with `right`-subtree keys
-
-<br>
-
-\begin{code}
-{-@ data Map k a < l :: k -> k -> Prop
-                 , r :: k -> k -> Prop >
-    = Tip
-    | Bin (sz :: Size) (key :: k) (val :: a)
-          (left  :: Map <l,r> (k<l key>) a)
-          (right :: Map <l,r> (k<r key>) a) @-}
-\end{code}
-
-
-Ex: Binary Search Trees
------------------------
-
-Keys are *Binary-Search* Ordered
-
-<br>
-
-\begin{code}
-{-@ type BST k a = 
-      Map <{\r v -> v < r }, 
-           {\r v -> v > r }> 
-          k a                   @-}
-\end{code}
-
-Ex: Minimum Heaps 
------------------
-
-Root contains *minimum* value
-
-<br>
-
-\begin{code}
-{-@ type MinHeap k a = 
-      Map <{\r v -> r <= v}, 
-           {\r v -> r <= v}> 
-           k a               @-}
-\end{code}
-
-Ex: Maximum Heaps 
------------------
-
-Root contains *maximum* value
-
-<br>
-
-\begin{code}
-{-@ type MaxHeap k a = 
-      Map <{\r v -> r >= v}, 
-           {\r v -> r >= v}> 
-           k a               @-}
-\end{code}
-
-
-Example: Data.Map
------------------
-
-Standard Key-Value container
-
-<br>
-
-- <div class="fragment">1300+ non-comment lines</div>
-
-- <div class="fragment">`insert`, `split`, `merge`,...</div>
-
-- <div class="fragment">Rotation, Rebalance,...</div>
-
-<br>
-
-<div class="fragment">
-SMT & inference crucial for [verification](https://github.com/ucsd-progsys/liquidhaskell/blob/master/benchmarks/esop2013-submission/Base.hs)
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Map.hs" target="_blank">Demo:</a> Binary Search Maps
-</div>
-
-Recap: Abstract Refinements
----------------------------
-
-<div class="fragment">
-
-Decouple invariants from **functions**
-
-+ `max`
-+ `loop`
-+ `foldr`
-
-</div>
-
-<div class="fragment">
-Decouple invariants from **data**
-
-+ `Vector`
-+ `List`
-+ `Tree`
-
-</div>
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. **Abstract:** Refinements over functions and data
-5. <div class="fragment">Er, what about Haskell's **lazy evaluation**?</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](09_Laziness.lhs.slides.html)</div>
diff --git a/docs/slides/IHP14/lhs/09_Laziness.lhs b/docs/slides/IHP14/lhs/09_Laziness.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/09_Laziness.lhs
+++ /dev/null
@@ -1,272 +0,0 @@
- {#laziness}
-============
-
-<div class="hidden">
-\begin{code}
-module Laziness where
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short"          @-}
-
-
-safeDiv :: Int -> Int -> Int
-foo     :: Int -> Int
--- zero    :: Int 
--- diverge :: a -> b
-\end{code}
-</div>
-
-
-Lazy Evaluation?
-----------------
-
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-
-
-[[Skip]](11_Evaluation.lhs.slides.html)
-
-Lazy Evaluation
-===============
-
-SMT based Verification
-----------------------
-
-Techniques developed for **strict** languages
-
-<br>
-
-<div class="fragment">
-
------------------------   ---   ------------------------------------------
-        **Floyd-Hoare**    :    `ESCJava`, `SpecSharp` ...
-     **Model Checkers**    :    `Slam`, `Blast` ...
-   **Refinement Types**    :    `DML`, `Stardust`, `Sage`, `F7`, `F*`, ...
------------------------   ---   ------------------------------------------
-
-</div>
-
-<br>
-
-<div class="fragment">
-Surely soundness carries over to Haskell, right?
-</div>
-
-
-Back To the Beginning
----------------------
-
-\begin{code}
-{-@ safeDiv :: Int -> {v:Int|v /= 0} -> Int @-}
-safeDiv n 0 = liquidError "div-by-zero!"
-safeDiv n d = n `div` d
-\end{code}
-
-<br>
-
-<div class="fragment">
-Should only call `safeDiv` with **non-zero** values
-</div>
-
-An Innocent Function
---------------------
-
-`foo` returns a value **strictly less than** input.
-
-<br>
-
-\begin{code} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-\end{code}
-
-LiquidHaskell Lies! 
--------------------
-
-\begin{code}
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0    
-              a = foo z
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-<div class="fragment">
-Why is this program **deemed safe**?! 
-</div>
-
-
-*Safe* With Eager Eval
-----------------------
-
-\begin{code} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Safe** in Java, ML: program spins away, **never hits** divide-by-zero 
-</div>
-
-*Unsafe* With Lazy Eval
------------------------
-
-\begin{code} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-**Unsafe** in Haskell: program skips `foo z` and **hits** divide-by-zero!
-
-Problem: Divergence
--------------------
-
-What is denoted by:
-
-`e :: {v:Int | P}`
-
-
-<br>
-
-<div class="fragment">
-`e` evaluates to `Int` satisfying `P`  
-</div>
-
-<div class="fragment">
-or
-
-**diverges**! 
-</div>
-
-<div class="fragment">
-<br>
-
-Classical Floyd-Hoare notion of [partial correctness](http://en.wikipedia.org/wiki/Hoare_logic#Partial_and_total_correctness)
-
-</div>
-
-
-
-Problem: Divergence
--------------------
-
-\begin{code} **Consider** <div/> 
-        {-@ e :: {v : Int | P} @-}
-
-        let x = e in body 
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Eager Evaluation** 
-
-*Can* assume `P(x)` when checking `body`
-</div>
-
-<br>
-
-<div class="fragment">
-**Lazy Evaluation** 
-
-*Cannot* assume `P(x)` when checking `body`
-</div>
-
-Eager vs. Lazy Binders 
-----------------------
-
-\begin{code} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-Inconsistent refinement for `a` is sound for **eager**, unsound for **lazy**
-
-
-Panic! Now what?
----------------
-
-<div class="fragment">
-**Solution** 
-
-Assign *non-trivial* refinements to *non-diverging* terms!
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Require A Termination Analysis**
-
-Don't worry, its easy...
-
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=TellingLies.hs" target="_blank">Demo:</a> &nbsp; Disable `"--no-termination"` and see what happens!
-</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. **Lazy Evaluation:** Requires Termination
-6. <div class="fragment">**Termination:** via Refinements!</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](10_Termination.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/IHP14/lhs/10_Termination.lhs b/docs/slides/IHP14/lhs/10_Termination.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/10_Termination.lhs
+++ /dev/null
@@ -1,314 +0,0 @@
-Termination {#termination}
-==========================
-
-
-<div class="hidden">
-\begin{code}
-module Termination where
-
-import Prelude hiding (gcd, mod, map)
-fib :: Int -> Int
-gcd :: Int -> Int -> Int
-infixr `C`
-
-data L a = N | C a (L a)
-
-{-@ invariant {v: (L a) | 0 <= (llen v)} @-}
-
-mod :: Int -> Int -> Int
-mod a b | a - b >  b = mod (a - b) b
-        | a - b <  b = a - b
-        | a - b == b = 0
-
-merge :: Ord a => L a -> L a -> L a
-\end{code}
-</div>
-
-<!--
-
-Dependent != Refinement
------------------------
-
-<div class="fragment">**Dependent Types**</div>
-
-+ <div class="fragment">*Arbitrary terms* appear inside types</div> 
-+ <div class="fragment">Termination ensures well-defined</div>
-
-<br>
-
-<div class="fragment">**Refinement Types**</div>
-
-+ <div class="fragment">*Restricted refinements* appear in types</div>
-+ <div class="fragment">Termination *not* required ...</div> 
-+ <div class="fragment">... except, alas, with *lazy* evaluation!</div>
-
--->
-
-Refinements & Termination
--------------------------
-
-<div class="fragment">
-Fortunately, we can ensure termination **using refinements**
-</div>
-
-
-Main Idea
----------
-
-Recursive calls must be on **smaller** inputs
-
-<br>
-
-+ [Turing](http://classes.soe.ucsc.edu/cmps210/Winter11/Papers/turing-1936.pdf)
-+ [Sized Types](http://dl.acm.org/citation.cfm?id=240882)
-+ [DML](http://dl.acm.org/citation.cfm?id=609232)
-+ [Size Change Principle](http://dl.acm.org/citation.cfm?id=360210)
-
-Recur On *Smaller* `Nat` 
-------------------------
-
-<div class="fragment">
-
-**To ensure termination of**
-
-\begin{code} <div/>
-foo   :: Nat -> T
-foo x =  body
-\end{code}
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:Nat | v < x} -> T`
-
-<br>
-
-*i.e.* require recursive calls have `Nat` inputs *smaller than* `x`
-</div>
-
-
-
-Ex: Recur On *Smaller* `Nat` 
-----------------------------
-
-\begin{code}
-{-@ fib  :: Nat -> Nat @-}
-fib 0    = 1
-fib 1    = 1
-fib n    = fib (n-1) + fib (n-2)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Terminates, as both `n-1` and `n-2` are `< n`
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=GCD.hs" target="_blank">Demo:</a> &nbsp; What if we drop the `fib 1` equation? 
-</div>
-
-Refinements Are Essential!
---------------------------
-
-\begin{code}
-{-@ gcd :: a:Nat -> {b:Nat | b < a} -> Int @-}
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Need refinements to prove `(a mod b) < b` at *recursive* call!
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ mod :: a:Nat 
-        -> b:{v:Nat|(0 < v && v < a)} 
-        -> {v:Nat| v < b}                 @-}
-\end{code}
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{code}<div/>
-foo   :: S -> T
-foo x = body
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Reduce** to `Nat` case...
-</div>
-
-<br>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{code}<div/>
-foo   :: S -> T
-foo x = body
-\end{code}
-
-<br>
-
-Specify a **default measure** `mS :: S -> Int`
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:s | 0 <= (mS v) < (mS x)} -> T`
-</div>
-
-
-Ex: Recur on *smaller* `List`
------------------------------
-
-\begin{code} 
-map f N        = N
-map f (C x xs) = (f x) `C` (map f xs) 
-\end{code}
-
-<br>
-
-Terminates using **default** measure `llen` 
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ data L [llen] a = N 
-                    | C { x::a, xs :: L a} @-}
-
-{-@ measure llen :: L a -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)   @-}
-\end{code}
-</div>
-
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of smallness spread across **multiple inputs**?
-
-<br>
-
-\begin{code}
-merge xs@(x `C` xs') ys@(y `C` ys')
-  | x < y     = x `C` merge xs' ys
-  | otherwise = y `C` merge xs ys'
-\end{code}
-
-<br>
-
-<div class="fragment">
-Neither input decreases, but their **sum** does.
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-Neither input decreases, but their **sum** does.
-
-<br>
-
-\begin{code}
-{-@ merge :: Ord a => xs:_ -> ys:_ -> _ 
-          /  [(llen xs) + (llen ys)]     @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-Synthesize **ghost** parameter equal to `[...]`
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-... thereby reducing to decreasing **single parameter** case. 
-
-</div>
-
-Important Extensions 
---------------------
-
-<br>
-
-<div class="fragment">**Mutual** recursion</div>
-
-<br>
-
-<div class="fragment">**Lexicographic** ordering</div>
-
-<br>
-
-<div class="fragment">Fit easily into our framework ...</div>
-
-Recap
------
-
-Main idea: Recursive calls on **smaller** inputs
-
-<br>
-
-<div class="fragment">Use refinements to **check** smaller</div>
-
-<br>
-
-<div class="fragment">Use refinements to **establish** smaller</div>
-
-
-A Curious Circularity
----------------------
-
-<div class="fragment">Refinements require termination ...</div> 
-
-<br>
-
-<div class="fragment">... Termination requires refinements!</div>
-
-<br>
-
-<div class="fragment"> Meta-theory is tricky, but all ends well.</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. Lazy Evaluation: Requires Termination
-6. **Termination:** via Refinements!
-7. <div class="fragment">**Evaluation:** How good is this in practice?</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](11_Evaluation.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/IHP14/lhs/11_Evaluation.lhs b/docs/slides/IHP14/lhs/11_Evaluation.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/11_Evaluation.lhs
+++ /dev/null
@@ -1,92 +0,0 @@
- {#ASda}
-========
-
-Evaluation
-----------
-
-
-
-Evaluation
-==========
-
-LiquidHaskell Is For Real
--------------------------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-<br>
-
-Substantial code bases.
-
-<br>
-
-Complex properties.
-
-<br>
-
-<div class="fragment">Inference is crucial.</div>
-
-
-
-Numbers
--------
-
-<div align="center">
-
-**Library**                     **LOC**
----------------------------   ---------
-`Data.List`                         814
-`Data.Set.Splay`                    149
-`Data.Vector.Algorithms`           1219
-`Data.Map.Base`                    1396
-`Data.Text`                        3125
-`Data.Bytestring`                  3501 
-**Total**                     **10224**
----------------------------   ---------
-
-</div>
-
-Numbers
--------
-
-<div align="center">
-
-**Library**                     **LOC**     **Time**
----------------------------   ---------   ----------
-`Data.List`                         814          52s
-`Data.Set.Splay`                    149          26s
-`Data.Vector.Algorithms`           1219         196s 
-`Data.Map.Base`                    1396         247s
-`Data.Text`                        3125         809s
-`Data.Bytestring`                  3501         549s
-**Total**                     **10224**    **1880s**
----------------------------   ---------   ----------
-
-</div>
-
-
-Termination
------------
-
-Proving termination is **easy in practice**.
-
-<br>
-
-- <div class="fragment">`503` recursive functions</div>
-- <div class="fragment">`67%` automatically proved</div>
-- <div class="fragment">`30%` need *witnesses* `/[...]`</div>
-- <div class="fragment">`1`   witness per `100` lines of code</div>
-- <div class="fragment">`20`  *not proven* to terminate</div>
-- <div class="fragment">`12`  *do not* terminate (e.g. top-level `IO` loops)</div>
-- <div class="fragment">`8`   currently *outside scope* of LiquidHaskell</div>
-
-
-<div class="fragment">[[continue...]](12_Conclusion.lhs.slides.html)</div>
-
diff --git a/docs/slides/IHP14/lhs/12_Conclusion.lhs b/docs/slides/IHP14/lhs/12_Conclusion.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/12_Conclusion.lhs
+++ /dev/null
@@ -1,127 +0,0 @@
- {#ASda}
-========
-
-Conclusion
-----------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-Conclusion
-==========
-
-
-Liquid Types 
-------------
-
-Generalize Program **Logics** via **Types**
-
-<br>
-
-<div class="fragment">Expressive *and* Automatic</div>
-
-
-Liquid Types 
-------------
-
-Generalize Program **Logics** via **Types**
-
-<br>
-
-Expressive *and* Automatic
-
-<br>
-
-**Take Home 1: Inference**
-
-+ Typecheck "templates" 
-
-+ Abstract Interpretation
- 
-Liquid Types 
-------------
-
-Generalize Program **Logics** via **Types**
-
-<br>
-
-Expressive *and* Automatic
-
-<br>
-
-**Take Home 2: Uninterpreted Functions**
-
-+ Measures for Datatype properties
-
-+ Abstract Refinements 
- 
-Liquid Types 
-------------
-
-Generalize Program **Logics** via **Types**
-
-<br>
-
-Expressive *and* Automatic
-
-<br>
-
-**Take Home 3: Laziness breaks *partial* correctness**
- 
-+ Use refinements prove termination
-
-+ Use termination to prove refinements
-
-<!--
-
-Take Home Messages
-------------------
-
-1. <div class="fragment"> **Inference**
-    + Typecheck "templates" 
-    + Abstract Interpretation
-   </div>
-
-
-2. <div class="fragment">**Uninterpreted functions**
-    + Measures for Datatype properties
-    + Abstract Refinements 
-   </div>
-
-3. <div class="fragment">**Laziness breaks *partial* correctness**
-    + Use refinements prove termination
-    + Use termination to prove refinements
-   </div>
-
-
-Future Work
------------
-
-<br>
-<br>
-
-- <div class="fragment">Speed</div>
-
-- <div class="fragment">Case Studies</div>
-
-- <div class="fragment">**Error Feedback**</div>
-
--->
-
- {#asd}
-=======
-
-Thank You!
-----------
-
-<br>
-
-[`http://goto.ucsd.edu/liquid`](http://goto.ucsd.edu/liquid)
-
-<br>
-
diff --git a/docs/slides/IHP14/lhs/Index.lhs b/docs/slides/IHP14/lhs/Index.lhs
deleted file mode 100644
--- a/docs/slides/IHP14/lhs/Index.lhs
+++ /dev/null
@@ -1,51 +0,0 @@
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-
- {#ASD}
-=======
-
-Liquid Types For Haskell
-------------------------
-
-
-<br>
-<br>
-
-**Ranjit Jhala**
-
-University of California, San Diego
-
-<br>
-<br>
-
-Joint work with: 
-
-N. Vazou, E. Seidel, P. Rondon, D. Vytiniotis, S. Peyton-Jones
-
-<br>
-
-<div class="fragment">
-[[continue]](00_Motivation_Logic.lhs.slides.html)
-</div>
-
-
-Plan 
-----
-
-
-+ <a href="00_Motivation_Logic.lhs.slides.html" target="_blank">Motivation</a>
-+ <div class="fragment"><a href="01_SimpleRefinements.lhs.slides.html" target="_blank">Refinements</a></div>
-+ <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-+ <div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target= "_blank">Higher-Order Functions</a></div>
-+ <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements:</a> <a href="06_Inductive.lhs.slides.html" target="_blank">Code</a>, <a href="08_Recursive.lhs.slides.html" target= "_blank">Data</a>,<a href="07_Array.lhs.slides.html" target= "_blank">...</a>,<a href="05_Composition.lhs.slides.html" target= "_blank">...</a></div>
-+ <div class="fragment"><a href="09_Laziness.lhs.slides.html" target="_blank">Laziness</a> and <a href="10_Termination.lhs.slides.html" target="_blank">Termination</a></div>
-+ <div class="fragment"><a href="11_Evaluation.lhs.slides.html" target="_blank">Evaluation</a></div>
-+ <div class="fragment"><a href="12_Conclusion.lhs.slides.html" target="_blank">Conclusion</a></div>
-
diff --git a/docs/slides/LambdaConf15/lhs/01_SimpleRefinements.lhs b/docs/slides/LambdaConf15/lhs/01_SimpleRefinements.lhs
deleted file mode 100644
--- a/docs/slides/LambdaConf15/lhs/01_SimpleRefinements.lhs
+++ /dev/null
@@ -1,457 +0,0 @@
- {#simplerefinements}
-=======================
-
-Simple Refinement Types
------------------------
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-module SimpleRefinements where
-import Language.Haskell.Liquid.Prelude
-import Prelude hiding (abs, max)
-
--- boring haskell type sigs
-zero    :: Int
-zero'   :: Int
-safeDiv :: Int -> Int -> Int
-abs     :: Int -> Int
-\end{code}
-
-</div>
-
-
-Simple Refinement Types
-=======================
-
-
-Types + Predicates 
-------------------
-
-
-Example: Integers equal to `0`
-------------------------------
-
-<br>
-
-\begin{code}
-{-@ type Zero = {v:Int | v = 0} @-}
-
-{-@ zero :: Zero @-}
-zero     =  0
-\end{code}
-
-<br>
-
-<div class="fragment">
-Refinement types via special comments `{-@ ... @-}` 
-
-<br>
-
-<div class="fragment">
-[DEMO](../hs/000_Refinements.hs)
-
-
-<!-- BEGIN CUT
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo</a> 
--->
-
-</div>
-
-Refinements Are Predicates
-==========================
-
-From A Decidable Logic
-----------------------
-
-<br> 
-
-1. Expressions
-
-2. Predicates
-
-<br>
-
-<div class="fragment">
-
-**Refinement Logic: QF-UFLIA**
-
-Quant.-Free. Uninterpreted Functions and Linear Arithmetic 
-
-</div>
-
-
-Expressions
------------
-
-<br>
-
-\begin{spec} <div/> 
-e := x, y, z,...    -- variable
-   | 0, 1, 2,...    -- constant
-   | (e + e)        -- addition
-   | (e - e)        -- subtraction
-   | (c * e)        -- linear multiplication
-   | (f e1 ... en)  -- uninterpreted function
-\end{spec}
-
-Predicates
-----------
-
-<br>
-
-\begin{spec} <div/>
-p := e           -- atom 
-   | e1 == e2    -- equality
-   | e1 <  e2    -- ordering 
-   | (p && p)    -- and
-   | (p || p)    -- or
-   | (not p)     -- negation
-\end{spec}
-
-<br>
-
-
-Refinement Types
-----------------
-
-
-<br>
-
-\begin{spec}<div/>
-b := Int 
-   | Bool 
-   | ...         -- base types
-   | a, b, c     -- type variables
-
-t := {x:b | p}   -- refined base 
-   | x:t -> t    -- refined function  
-\end{spec}
-
-
-Subtyping Judgment 
-------------------
-
-<br>
-
-$$\boxed{\Gamma \vdash t_1 \preceq t_2}$$
-
-<div class="fragment">
-
-<br>
-
-Where **environment** $\Gamma$ is a sequence of binders
-
-<br>
-
-$$\Gamma \defeq \overline{\bindx{x_i}{t_i}}$$
-
-</div>
-
-Subtyping is Implication
-------------------------
-
-<br>
-
-$$\boxed{\Gamma \vdash t_1 \preceq t_2}$$
-
-
-<br>
-
-[PVS' Predicate Subtyping](http://pvs.csl.sri.com/papers/subtypes98/tse98.pdf)
-
-<br>
-
-(For **Base** Types ...)
-
-
-
-
-Subtyping is Implication
-------------------------
-
-<br>
-
-$$\boxed{\Gamma \vdash t_1 \preceq t_2}$$
-
-
-<br>
-
-$$
-\begin{array}{rl}
-{\mathbf{If\ VC\ is\ Valid}}   & \bigwedge_i P_i \Rightarrow  Q  \Rightarrow R \\
-                & \\
-{\mathbf{Then}} & \overline{\bindx{x_i}{P_i}} \vdash \reft{v}{b}{Q} \subty \reft{v}{b}{R} \\
-\end{array}
-$$ 
-
-
-Example: Natural Numbers
-------------------------
-
-<br>
-
-\begin{spec} <div/>  
-        type Nat = {v:Int | 0 <= v}
-\end{spec}
-
-<br>
-
-<div class="fragment">
-
-$$
-\begin{array}{rcrccll}
-\mathbf{VC\ is\ Valid:} & \True     & \Rightarrow &  v = 0   & \Rightarrow &  0 \leq v & \mbox{(by SMT)} \\
-%                &           &             &          &             &           \\
-\mathbf{So:}      & \emptyset & \vdash      & \Zero  & \subty      & \Nat   &   \\
-\end{array}
-$$
-</div>
-
-<br>
-
-<div class="fragment">
-
-Hence, we can type:
-
-\begin{code}
-{-@ zero' :: Nat @-}
-zero'     =  zero   -- zero :: Zero <: Nat
-\end{code}
-</div>
-
-Contracts: Function Types
-=========================
-
- {#as}
-------
-
-Pre-Conditions
---------------
-
-
-<br>
-
-\begin{code}
-safeDiv n d = n `div` d   -- crashes if d==0
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Requires** non-zero input divisor `d`
-
-\begin{code}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-\end{code}
-</div>
-
-<br>
-
-
-<div class="fragment">
-Specify pre-condition as **input type** 
-
-\begin{code}
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{code}
-
-</div>
-
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code}
-{-@ bad :: Nat -> Int @-}
-bad n   = 10 `safeDiv` n
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Rejected As** 
-
-$$\bindx{n}{\Nat} \vdash \reftx{v}{v = n} \not \subty \reftx{v}{v \not = 0}$$
-
-</div>
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{code}
-{-@ ok  :: Nat -> Int @-}
-ok n    = 10 `safeDiv` (n+1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Verifies As** 
-
-$\bindx{n}{\Nat} \vdash \reftx{v}{v = n+1} \subty \reftx{v}{v \not = 0}$
-</div>
-
-Precondition: `safeDiv`
------------------------
-
-Specify pre-condition as **input type** 
-
-\begin{spec} <div/>
-{-@ safeDiv :: n:Int -> d:NonZero -> Int @-}
-\end{spec}
-
-<br>
-
-Precondition is checked at **call-site**
-
-\begin{spec} <div/>
-{-@ ok  :: Nat -> Int @-}
-ok n    = 10 `safeDiv` (n+1)
-\end{spec}
-
-<br>
-
-**Verifies As**
-
-$$(0 \leq n) \Rightarrow (v = n+1) \Rightarrow (v \not = 0)$$
-
-
-
-Post-Conditions
----------------
-
-**Ensures** output is a `Nat` greater than input `x`.
-
-\begin{code}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{code}
-
-<br>
-
-<div class="fragment">
-Specify post-condition as **output type**
-
-\begin{code}
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-**Dependent Function Types**
-
-Outputs *refer to* inputs
-</div>
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-Postcondition is checked at **return-site**
-
-<br>
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-**Verified As**
-
-<br>
-
-$$\begin{array}{rll}
-\bindx{x}{\Int},\bindx{\_}{0 \leq x}      & \vdash \reftx{v}{v = x}     & \subty \reftx{v}{0 \leq v \wedge x \leq v} \\
-\bindx{x}{\Int},\bindx{\_}{0 \not \leq x} & \vdash \reftx{v}{v = 0 - x} & \subty \reftx{v}{0 \leq v \wedge x \leq v} \\
-\end{array}$$
-
-Postcondition: `abs`
---------------------
-
-Specify post-condition as **output type** 
-
-\begin{spec} <div/>
-{-@ abs :: x:Int -> {v:Nat | x <= v} @-}
-abs x | 0 <= x    = x 
-      | otherwise = 0 - x
-\end{spec}
-
-<br>
-
-**Verified As**
-
-<br>
-
-$$\begin{array}{rll}
-(0 \leq x)      & \Rightarrow (v = x)     & \Rightarrow (0 \leq v \wedge x \leq v) \\
-(0 \not \leq x) & \Rightarrow (v = 0 - x) & \Rightarrow (0 \leq v \wedge x \leq v) \\
-\end{array}$$
-
-
-Recipe Scales Up
-----------------
-
-<br>
-
-<div class="fragment">
-Define type *checker* and get *inference* for free [[PLDI 08]](http://goto.ucsd.edu/~rjhala/papers/liquid_types.pdf)
-</div>
-
-<br>
-
-<div class="fragment">
-Scales to Collections, HOFs, Polymorphism ...
-</div>
-
-<br>
-
-<div class="fragment">
-[DEMO](../hs/001_Refinements.hs)
-
-<br>
-
-[[continue...]](02_Measures.lhs.slides.html)
-
-</div>
diff --git a/docs/slides/NEU14/00_Refinements-blank.hs b/docs/slides/NEU14/00_Refinements-blank.hs
deleted file mode 100644
--- a/docs/slides/NEU14/00_Refinements-blank.hs
+++ /dev/null
@@ -1,182 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module Refinements where
-
-import Prelude hiding (map, foldr, foldr1)
-
-
------------------------------------------------------------------------
--- | 1. Simple Refinement Types
------------------------------------------------------------------------
-
--- Nat
-{-@ type Nat = {v: Int | v >= 0} @-}
-
--- Pos
-{-@ type Pos = {v: Int | v > 0} @-}
-
-
------------------------------------------------------------------------
--- | 2. Function Contracts: Preconditions & Dead Code 
------------------------------------------------------------------------
-
-
-{-@ dead :: {v:String | false} -> a @-}
-dead :: String -> a 
-dead = undefined
-
------------------------------------------------------------------------
--- | 3. Function Contracts: Safe Division 
------------------------------------------------------------------------
-
-{-@ divide :: Int -> Pos -> Int @-}
-divide :: Int -> Int -> Int
-divide n 0 = dead "dbz"
-divide n k = n `div` k
-
-
-
-
------------------------------------------------------------------------
--- | 4. Dividing Safely
------------------------------------------------------------------------
-
-{-@ foo :: Int -> Nat -> Int @-}
-foo     :: Int -> Int -> Int
-foo x y = if y == 0 then foo x y else divide x y
-
-
-
------------------------------------------------------------------------
--- | 4. Data Types
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
-
-
- 
------------------------------------------------------------------------
--- | 4. A few Higher-Order Functions
------------------------------------------------------------------------
-
-{-@ map :: (a -> b) -> xs:_ -> {v:_ | size v = size xs} @-}
-map f N = N
-map f (C x xs) = f x `C` (map f xs)
-
-
-
--- foldr
-foldr f b N        = b
-foldr f b (C x xs) = f x (foldr f b xs)
-
--- foldr1
-{-@ foldr1 :: (a -> a -> a) -> {v:List a | size v > 0} -> a @-}
-foldr1 f (C x xs) = foldr f x xs
-foldr1 _ N        = dead "EMPTY!!!"
-
-
-
-
-
------------------------------------------------------------------------
--- | 5. Measuring the Size of Data
------------------------------------------------------------------------
-
-{-@ measure size @-}
-size :: List a -> Int
-size N        = 0
-size (C x xs) = 1 + size xs 
-
-
-
--- measures = strengthened constructors
-
-
-
-
--- data List a where
---   N :: forall a. {List a | size v = 0}...
---   C :: forall a. x:a -> xs:List a -> {v:List a | size v = 1 + size xs}
-
-
-
-
------------------------------------------------------------------------
--- | 5. Weighted-Averages 
------------------------------------------------------------------------
-
-
-{-@ wtAverage :: {v:List (Pos, Int) | size v > 0} -> Int @-}
-wtAverage :: List (Int, Int) -> Int
-wtAverage wxs = total `divide` weights
-  where
-    total     = foldr1 (+) (map (\(w,x) -> w * x) wxs) 
-    weights   = foldr1 (+) (map (\(w,_) -> w)     wxs) 
-    
-
-
-
-
-
-
--- Exercise: How would you modify the types to get output `Pos` above? 
-
-
-
-
-
------------------------------------------------------------------------
--- | 5. Ordered Lists: Take 1
------------------------------------------------------------------------
-
--- You can do a lot with strengthened constructors
-
-
--- Ordered Lists
-
-
-{-@ data List a = N | C {x :: a, xs :: List {v:a | x <= v}} @-}
-okList = 1 `C` 2 `C` 4 `C` N
-
-
-
-
-
------------------------------------------------------------------------
--- | 6. Sorting Lists 
------------------------------------------------------------------------
-
-
-insert x N        = x `C` N
-insert x (C y ys)
-  | x < y         = x `C` (y `C` ys)
-  | otherwise     = y `C` (insert x ys)
-
-
-insertSort []     = N
-insertSort (x:xs) = insert x (insertSort xs)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
--- Note that adding ordering BREAKS `map`, but ...
-
-
diff --git a/docs/slides/NEU14/00_Refinements.hs b/docs/slides/NEU14/00_Refinements.hs
deleted file mode 100644
--- a/docs/slides/NEU14/00_Refinements.hs
+++ /dev/null
@@ -1,124 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--diffcheck"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module Refinements where
-
-import Prelude hiding (map, foldr, foldr1)
-
-
-wtAverage :: List (Int, Int) -> Int
-
-
------------------------------------------------------------------------
--- | 1. Simple Refinement Types
------------------------------------------------------------------------
-
-{-@ type Nat = {v:Int | v >= 0} @-}
-{-@ type Pos = {v:Int | v >  0} @-}
-
-
------------------------------------------------------------------------
--- | 2. Function Contracts: Preconditions & Dead Code 
------------------------------------------------------------------------
-
-{-@ dead :: {v:_ | false} -> a @-}
-dead msg = error msg
-
------------------------------------------------------------------------
--- | 3. Function Contracts: Safe Division 
------------------------------------------------------------------------
-
-
-
-{-@ divide :: _ -> {v:_ | v > 0 } -> Int @-}
-divide     :: Int -> Int -> Int
-divide x 0 = dead 12  -- "divide-by-zero"
-divide x n = x `div` n
-
-
-
------------------------------------------------------------------------
--- | 4. Dividing Safely
------------------------------------------------------------------------
-
-
-
------------------------------------------------------------------------
--- | 4. Data Types
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
- 
------------------------------------------------------------------------
--- | 4. Measuring the Size of Data
------------------------------------------------------------------------
-
-{-@ measure size @-}
-size          :: List a -> Int
-size (C x xs) = 1 + size xs 
-size N        = 0
-
--- data List a where
---   N :: forall a. {v: List a | size v = 0}
---   C :: forall a. x:a -> xs:List a -> {v: List a | size v = 1 + size xs}
-                
------------------------------------------------------------------------
--- | 5. A few Higher-Order Functions
------------------------------------------------------------------------
-
-{-@ map              :: (a -> b) -> xs:List a -> {v: List b | size v = size xs} @-}
-map f (N)            = N
-map f (C x xs)       = C (f x) (map f xs) 
-
-{-@ foldr1           :: (a -> a -> a) -> {v: List a | 0 < size v } -> a @-}
-foldr1 f (C x xs)    = foldr f x xs
-foldr1 f N           = dead "foldr1"
-
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
- 
-
------------------------------------------------------------------------
--- | 5. Weighted-Averages 
------------------------------------------------------------------------
-
-{-@ wtAverage :: {v : List (Pos, Pos) | size v > 0} -> Int @-}
-wtAverage wxs = total `divide` weights
-  where
-    total     = sum $ map (\(w, x) -> w * x) wxs
-    weights   = sum $ map (\(w, _) -> w    ) wxs
-    sum       = foldr1 (+)
-
-
--- | Exercise: How would you modify the types to get output `Pos` above? 
-
------------------------------------------------------------------------
--- | 5. Ordered Lists: Take 1
------------------------------------------------------------------------
-
-{- data List a = N | C {x :: a, xs :: List {v:a | x <= v}} @-}
-
-okList :: List Int
-okList = 1 `C` 2 `C` 4 `C` N
-
--- Note that adding ordering BREAKS `map`...
-
-
-
-{-@ insert         :: _ -> xs:_ -> {v:_ | size v = 1 + size xs} @-}
-insert x N         = x `C` N
-insert x (C y ys)
-  | x <= y         = x `C` y `C` ys
-  | otherwise      = y `C` insert x ys 
-
-
-
-
-{-@ insertSort     :: (Ord a) => xs:[a] -> {v:List a | size v = len xs} @-}
-insertSort []      = N
-insertSort (x:xs)  = insert x (insertSort xs)
diff --git a/docs/slides/NEU14/01_AbstractRefinements-blank.hs b/docs/slides/NEU14/01_AbstractRefinements-blank.hs
deleted file mode 100644
--- a/docs/slides/NEU14/01_AbstractRefinements-blank.hs
+++ /dev/null
@@ -1,212 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module AbstractRefinements (
-    listMax
-  , insertSort
-  , insertSort'
-  ) where
-
-
-import Data.Set hiding (insert, foldr,size) 
-import Prelude hiding (map, foldr)
-
-
-
------------------------------------------------------------------------
--- | 0. Abstract Refinements 
------------------------------------------------------------------------
-
-
--- Warmup: How shall we type listMax?
-
-{-@ listMax  :: forall <p :: Int -> Prop>. {v:[Int<p>] | len v > 0}
-             -> Int<p> @-}
-listMax     :: [Int] -> Int
-listMax xs  = foldr1 max xs 
-
-
-
--- Lets define a few different subsets of Int
-
-{-@ type Even = {v: Int | v mod 2 = 0} @-}
-{-@ type Odd  = {v: Int | v mod 2 /= 0} @-}
-{-@ type RGB  = {v: Int | 0 <= v && v <= 255}  @-}
-
-
--- compute the largest of some lists
-
-{-@ xE :: Even @-}
-xE = listMax [0, 1] 
-
-
-
-{-@ xO :: Odd @-}
-xO = listMax [1, 21, 4001, 961] 
-
-
-
-{-@ xR :: RGB @-}
-xR = listMax [1, 21, 41, 61] 
-
-
--- Why do we get the errors? How do we fix it?
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | 1. Abstract Refinement from List's Type 
------------------------------------------------------------------------
-
-{-@ data List a <p :: a -> a -> Prop> =
-        N
-      | C { x :: a, xs :: List<p> (a<p x>) }
-  @-}
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | 2. Instantiating Abstract Refinements 
------------------------------------------------------------------------
-
-
-{-@ type IncrList a = List <{\x1 x2 -> x1 <= x2}> a@-} 
-{-@ type DecrList a = List <{\x1 x2 -> x1 >= x2}> a@-} 
-{-@ type DiffList a = List <{\x1 x2 -> x1 /= x2}> a@-} 
-
-ups, downs  :: List Int
-
-{-@ ups :: IncrList Int @-}
-ups   = 1 `C` 2 `C` 3 `C` N
-
-{-@ downs :: DecrList Int @-}
-downs = 10 `C` 8 `C` 6 `C` N
-
-
-
-
------------------------------------------------------------------------
--- | 3. Insertion Sort: Revisited
------------------------------------------------------------------------
-
-{-@ insert         :: _ -> xs:_ -> {v:_ | size v = 1 + size xs} @-}
-insert x N         = x `C` N
-insert x (C y ys)
-  | x <= y         = x `C` y `C` ys
-  | otherwise      = y `C` insert x ys 
-
-
-
-{-@ insertSort      :: xs:List a -> {v:IncrList a | EqSize v xs} @-}
-insertSort N        = N
-insertSort (C x xs) = insert x (insertSort xs)
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | 3. Insertion Sort: using a `foldr` 
------------------------------------------------------------------------
-
-
-{-@ insertSort' :: xs:List a -> {v:IncrList a | true } @-}
-insertSort' xs = foldr insert N xs 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | 4. But, there are limits...
------------------------------------------------------------------------
-
--- how big is the list returned by insertSort' ?
-
-
--- Hmm. Thats a bummer... How do we type `foldr` to verify the above?
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | 5. Induction, as an Abstract Refinement 
------------------------------------------------------------------------
-
-
-ifoldr = undefined
-
-{- insertSort' :: xs:List a -> {v:IncrList a | size v = size xs} -}
-
-
-
-
-
-
-
------------------------------------------------------------------------
--- | 6. But can you prove that you've permuted the input?
------------------------------------------------------------------------
-
-
--- Lets reason about the set of elements in a container
-
--- measure elems
-
-{-@ predicate EqSize X Y = size X = size Y @-}
-
--- predicate EqElems
-
-
------------------------------------------------------------------------
--- | Old definitions from 00_Refinements.hs
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
-{-@ measure size @-}
-size          :: List a -> Int
-size (C x xs) = 1 + size xs 
-size N        = 0
-
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
- 
diff --git a/docs/slides/NEU14/01_AbstractRefinements.hs b/docs/slides/NEU14/01_AbstractRefinements.hs
deleted file mode 100644
--- a/docs/slides/NEU14/01_AbstractRefinements.hs
+++ /dev/null
@@ -1,169 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--no-warnings"    @-}
-{-@ LIQUID "--no-termination" @-}
-
-module AbstractRefinements (
-    listMax
-  , insertSort
-  , insertSort'
-  , insertSort''
-  , insertSort'''
-  ) where
-
-import Data.Set hiding (insert, foldr,size) 
-import Prelude hiding (map, foldr)
-
-listMax     :: [Int] -> Int
-
------------------------------------------------------------------------
--- | 0. Abstract Refinements 
------------------------------------------------------------------------
-
-{-@ listMax :: forall <p :: Int -> Prop>. {v:[Int<p>] | len v > 0} -> Int<p> @-} 
-listMax xs  = foldr1 max xs 
-
-
--- Lets define a few different subsets of Int
-
-{-@ type Even = {v:Int | v mod 2 == 0}      @-}
-{-@ type Odd  = {v:Int | v mod 2 /= 0}      @-}
-{-@ type RGB  = {v:Int | 0 <= v && v < 256} @-}
-
-
-
-{-@ xE :: Even @-}
-xE = listMax [0, 200, 4000, 60] 
-
-
-{-@ xO :: Odd @-}
-xO = listMax [1, 21, 4001, 961] 
-
-
-{-@ xR :: RGB @-}
-xR = listMax [1, 21, 41, 61] 
-
-
-
------------------------------------------------------------------------
--- | 1. Abstract Refinement from List's Type 
------------------------------------------------------------------------
-
-
-
-{-@ data List a <p :: a -> a -> Prop> 
-     = N | C {x :: a, xs :: List<p> a<p x>} @-}
-
-
-
------------------------------------------------------------------------
--- | 2. Instantiating Abstract Refinements 
------------------------------------------------------------------------
-
-
-
-
-{-@ type IncrList a = List <{\x y -> x <= y}> a @-} 
-{-@ type DecrList a = List <{\x y -> x >= y}> a @-} 
-{-@ type DiffList a = List <{\x y -> x /= y}> a @-} 
-
-{-@ ups   :: IncrList Integer @-}
-ups       = 1 `C` 2 `C` 4 `C` N
-
-{-@ downs :: DecrList Integer @-}
-downs     = 100 `C` 20 `C` 4 `C` N
-
-{-@ diffs :: DiffList Integer @-}
-diffs     = 100 `C` 1000 `C` 10 `C` 1 `C`  N
-
-
-
------------------------------------------------------------------------
--- | 3. Insertion Sort: Revisited
------------------------------------------------------------------------
-
-{-@ insert         :: x:_ -> xs:_ -> {v:_ | AddElt v x xs && size v = 1 + size xs} @-}
-insert x N         = x `C` N
-insert x (C y ys)
-  | x <= y         = x `C` y `C` ys
-  | otherwise      = y `C` insert x ys 
-
-
-
-{-@ insertSort      :: xs:List a -> {v:IncrList a | size v = size xs} @-}
-insertSort N        = N
-insertSort (C x xs) = insert x (insertSort xs)
-
-
-
------------------------------------------------------------------------
--- | 3. Insertion Sort: using a `foldr` 
------------------------------------------------------------------------
-
-
-
-{-@ insertSort' :: xs:List a -> IncrList a @-}
-insertSort' xs = foldr insert N xs
-
-
-
-
------------------------------------------------------------------------
--- | 4. But, there are limits...
------------------------------------------------------------------------
-
--- but why is this not ok?
-
-{-@ insertSort'' :: xs:List a -> {v:IncrList a | EqSize v xs && EqElem v xs} @-}
-insertSort'' xs   = foldr insert N xs
-
-
--- Hmm. Thats a bummer... How do we type `foldr` to verify the above?
-
-
------------------------------------------------------------------------
--- | 5. Induction, as an Abstract Refinement 
------------------------------------------------------------------------
-
-
-{-@ ifoldr :: forall a b <p :: List a -> b -> Prop>. 
-                 (xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)>) 
-               -> b<p N> 
-               -> ys:List a
-               -> b<p ys>                            @-}
-ifoldr :: (List a -> a -> b -> b) -> b -> List a -> b
-ifoldr f b N        = b
-ifoldr f b (C x xs) = f xs x (ifoldr f b xs)
-
-
-{-@ insertSort''' :: xs:List a -> {v:IncrList a | EqSize v xs && EqElem v xs} @-}
-insertSort''' xs = ifoldr (\_ -> insert) N xs
-
-
-
-
------------------------------------------------------------------------
--- | Old definitions from 00_Refinements.hs
------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-infixr 9 `C`
-
-{-@ measure size @-}
-size          :: List a -> Int
-size (C x xs) = 1 + size xs 
-size N        = 0
-
-foldr f acc N        = acc
-foldr f acc (C x xs) = f x (foldr f acc xs)
-
-
-{-@ predicate EqSize X Y = size X  = size Y @-}
-{-@ predicate EqElem X Y = elems X = elems Y @-}
-
-{-@ predicate AddElt V X Xs = elems V = Set_cup (Set_sng X) (elems Xs) @-}
- 
-{-@ measure elems ::List a -> (Set a)
-    elems (N)      = (Set_empty 0)
-    elems (C x xs) = (Set_cup (Set_sng x) (elems xs))
-  @-}
diff --git a/docs/slides/NEU14/02_Termination-blank.hs b/docs/slides/NEU14/02_Termination-blank.hs
deleted file mode 100644
--- a/docs/slides/NEU14/02_Termination-blank.hs
+++ /dev/null
@@ -1,187 +0,0 @@
-module Termination (fac, tailFac, map, merge) where
-
-import Prelude hiding (gcd, mod, map, repeat, take)
-import Language.Haskell.Liquid.Prelude
-
-
-
--------------------------------------------------------------------------
--- | Simple Termination
--------------------------------------------------------------------------
-
-fac   :: Int -> Int
-fac   = undefined
-
-
-
-
-
-
-
-
-
-
--------------------------------------------------------------------------
--- | Semantic Termination
--------------------------------------------------------------------------
-
-gcd :: Int -> Int -> Int
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-
-
-mod :: Int -> Int -> Int
-mod a b
-  | a - b >  b = mod (a - b) b
-  | a - b <  b = a - b
-  | a - b == b = 0
-
--------------------------------------------------------------------------
--- Explicit Metrics #1 
--------------------------------------------------------------------------
-
-tailFac   :: Int -> Int
-tailFac n = loop 1 n
-
-loop      :: Int -> Int -> Int
-loop      = undefined
-
-         
-
-
--------------------------------------------------------------------------
--- Explicit Metrics #2 
--------------------------------------------------------------------------
-
-range :: Int -> Int -> [Int]
-range lo hi = undefined
-
-
-
--------------------------------------------------------------------------
--- | Structural Recursion 
--------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-map :: (a -> b) -> List a -> List b
-map = undefined
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{-@ measure size :: List a -> Int
-    size (N)      = 0  
-    size (C x xs) = (1 + size xs)
-  @-}
-
-
-
-
--------------------------------------------------------------------------
--- | Default Metrics
--------------------------------------------------------------------------
-
-
-{-@ data List [size] a = N | C {x :: a, xs :: List a } @-}
-
-
-
--------------------------------------------------------------------------
--- | Termination Expressions Metrics
--------------------------------------------------------------------------
-
-merge :: (Ord a) => List a -> List a -> List a
-merge (C x xs) (C y ys)
-  | x < y      = x `C` merge xs (y `C` ys)
-  | otherwise  = y `C` merge (x `C` xs) ys
-merge _   ys   = ys
-
-
-
-
-
-
-
-
-
--------------------------------------------------------------------------
--- | Infinite Streams
--------------------------------------------------------------------------
-
-{- data List [sz] a <p :: List a -> Prop>
-      = N | C { x  :: a
-              , xs :: List <p> a <<p>>
-              }
-  -}
-
-
-{-@ measure emp  :: (List a) -> Prop
-    emp (N)      = true
-    emp (C x xs) = false
-  @-}
-
-{- type Stream a = {xs: List <{\v -> not (emp v)}> a | not (emp xs)} @-}
-
-{- Lazy repeat @-}
-                 
-{- repeat :: a -> Stream a @-}
--- repeat   :: a -> List a
--- repeat x = x `C` repeat x
-
-
-{- take :: Nat -> Stream a -> List a @-}
--- take  :: Int -> List a -> List a
--- take 0 _        = N
--- take n (C x xs) = x `C` take (n-1) xs
--- take _ N        = liquidError "never happens"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------
-
-
-{-@ invariant {v : List a | 0 <= size v} @-}
-
-
-
-
-
-
-
diff --git a/docs/slides/NEU14/02_Termination.hs b/docs/slides/NEU14/02_Termination.hs
deleted file mode 100644
--- a/docs/slides/NEU14/02_Termination.hs
+++ /dev/null
@@ -1,178 +0,0 @@
-module Termination where
-
-import Prelude hiding (gcd, mod, map, repeat, take)
-import Language.Haskell.Liquid.Prelude
-
-fac   :: Int -> Int
-tfac  :: Int -> Int -> Int
-map   :: (a -> b) -> List a -> List b
-merge :: (Ord a) => List a -> List a -> List a
-
-
--------------------------------------------------------------------------
--- | Simple Termination
--------------------------------------------------------------------------
-
-{-@ fac :: Nat -> Nat @-}
-fac 0 = 1
-fac 1 = 1
-fac n = n * fac (n-1)
-
-
-
-
--------------------------------------------------------------------------
--- | Semantic Termination
--------------------------------------------------------------------------
-
-{-@ gcd :: a:Nat -> b:{v:Nat | v < a} -> Int @-}
-gcd :: Int -> Int -> Int
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-
-
-{-@ mod :: a:Nat -> b:{v:Nat| ((v < a) && (v > 0))} -> {v:Nat | v < b} @-}
-mod :: Int -> Int -> Int
-mod a b | a - b >  b = mod (a - b) b
-        | a - b <  b = a - b
-        | a - b == b = 0
-
--------------------------------------------------------------------------
--- Explicit Metrics #1 
--------------------------------------------------------------------------
-
-{-@ tfac :: Nat -> n:Nat -> Nat / [n] @-}
-tfac acc 0 = acc
-tfac acc n = tfac (n * acc) (n-1)
-
-
-
-
--------------------------------------------------------------------------
--- Explicit Metrics #2 
--------------------------------------------------------------------------
-
-{-@ range :: lo:Nat -> hi:Nat -> [Nat] / [hi-lo] @-}
-range :: Int -> Int -> [Int]
-range lo hi
-  | lo < hi   = lo : range (lo + 1) hi
-  | otherwise = []
-
-
-
--------------------------------------------------------------------------
--- | Structural Recursion 
--------------------------------------------------------------------------
-
-data List a = N | C a (List a)
-
-{-@ measure sz  :: List a -> Int 
-    sz (C x xs) = 1 + (sz xs)
-    sz (N)      = 0
-  @-}
-
-{-@ map :: (a -> b) -> xs:List a -> (List b) / [sz xs] @-}
-map _ N        = N
-map f (C x xs) = f x `C` map f xs
-
-
-
--------------------------------------------------------------------------
--- | Default Metrics
--------------------------------------------------------------------------
-
-{-@ data List [sz] a = N | C {x :: a, xs :: List a } @-}
-
-map' _ N        = N
-map' f (C x xs) = f x `C` map' f xs
-
-
-
--------------------------------------------------------------------------
--- | Termination Expressions Metrics
--------------------------------------------------------------------------
-
-{-@ merge :: xs:_ -> ys:_ -> _ / [sz xs + sz ys] @-}
-
-merge (C x xs) (C y ys)
-  | x < y      = x `C` merge xs (y `C` ys)
-  | otherwise  = y `C` merge (x `C` xs) ys
-merge _   ys   = ys
-
-
-
-
-
-
-
-
-
--------------------------------------------------------------------------
--- | Infinite Streams
--------------------------------------------------------------------------
-
-{- data List [sz] a <p :: List a -> Prop>
-      = N | C { x  :: a
-              , xs :: List <p> a <<p>>
-              }
-  -}
-
-
-{-@ measure emp  :: (List a) -> Prop
-    emp (N)      = true
-    emp (C x xs) = false
-  @-}
-
-{- type Stream a = {xs: List <{\v -> not (emp v)}> a | not (emp xs)} @-}
-
-{- Lazy repeat @-}
-                 
-{- repeat :: a -> Stream a @-}
--- repeat   :: a -> List a
--- repeat x = x `C` repeat x
-
-
-{- take :: Nat -> Stream a -> List a @-}
--- take  :: Int -> List a -> List a
--- take 0 _        = N
--- take n (C x xs) = x `C` take (n-1) xs
--- take _ N        = liquidError "never happens"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------------------------------------
-
-
-{-@ invariant {v : List a | 0 <= sz v} @-}
-
-
-
-
-
-
-
-
diff --git a/docs/slides/NEU14/AlphaConvert.hs b/docs/slides/NEU14/AlphaConvert.hs
deleted file mode 100644
--- a/docs/slides/NEU14/AlphaConvert.hs
+++ /dev/null
@@ -1,145 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{-@ LIQUID "--fullcheck"      @-}
-{-@ LIQUID "--maxparams=3"    @-}
-
--- | An example from "A Relational Framework for Higher-Order Shape Analysis",
---   by Gowtham Kaki Suresh Jagannathan, ICFP 2014.
-
-module AlphaConvert (subst, alpha) where
-
-import Prelude hiding ((++), elem)
-import Data.Set (Set (..))
-import Language.Haskell.Liquid.Prelude   
-
-alpha  :: [Bndr] -> Expr -> Expr 
-subst  :: Expr -> Bndr -> Expr -> Expr
-maxs   :: [Int] -> Int 
-lemma1 :: Int -> [Int] -> Bool
-fresh  :: [Bndr] -> Bndr
-free   :: Expr -> [Bndr]
-
----------------------------------------------------------------------
--- | Datatype Definition --------------------------------------------
----------------------------------------------------------------------
-
-type Bndr 
-  = Int
-
-data Expr 
-  = Var Bndr  
-  | Abs Bndr Expr
-  | App Expr Expr
-
-{-@ measure fv       :: Expr -> (Set Bndr)
-    fv (Var x)       = (Set_sng x)
-    fv (Abs x e)     = (Set_dif (fv e) (Set_sng x))
-    fv (App e a)     = (Set_cup (fv e) (fv a)) 
-  @-}
-
-{-@ measure isAbs    :: Expr -> Prop
-    isAbs (Var v)    = false
-    isAbs (Abs v e)  = true
-    isAbs (App e a)  = false             
-  @-}
-
-{-@ predicate AddV E E2 X E1   = fv E = Set_cup (Set_dif (fv E2) (Set_sng X)) (fv E1) @-}
-{-@ predicate EqV E1 E2        = fv E1 = fv E2                                        @-}
-{-@ predicate Occ X E          = Set_mem X (fv E)                                     @-}
-{-@ predicate Subst E E1 X E2  = if (Occ X E2) then (AddV E E2 X E1) else (EqV E E2)  @-}
-
-----------------------------------------------------------------------------
--- | Part 5: Capture Avoiding Substitution ---------------------------------
-----------------------------------------------------------------------------
-{-@ subst :: e1:Expr -> x:Bndr -> e2:Expr -> {e:Expr | Subst e e1 x e2} @-} 
-----------------------------------------------------------------------------
-
-subst e1 x e2@(Var y)
-  | x == y                = e1
-  | otherwise             = e2
-
-subst e1 x (App ea eb)    = App ea' eb'
-  where
-    ea'                   = subst e1 x ea
-    eb'                   = subst e1 x eb
-
-subst e1 x e2@(Abs y e)  
-  | x == y                = e2
-  | y `elem` xs           = subst e1 x (alpha xs e2) 
-  | otherwise             = Abs y      (subst e1 x e)
-     where
-      xs                  = free e1 
-
-----------------------------------------------------------------------------
--- | Part 4: Alpha Conversion ----------------------------------------------
-----------------------------------------------------------------------------
-{-@ alpha :: ys:[Bndr] -> e:{Expr | isAbs e} -> {v:Expr | EqV v e} @-}
-----------------------------------------------------------------------------
-alpha ys (Abs x e) = Abs x' (subst (Var x') x e)
-  where 
-    xs             = free e
-    x'             = fresh (x : ys ++ xs)
-
-alpha _  _         = liquidError "never"
-
-
-----------------------------------------------------------------------------
--- | Part 3: Fresh Variables -----------------------------------------------
-----------------------------------------------------------------------------
-{-@ fresh :: xs:[Bndr] -> {v:Bndr | NotElem v xs} @-}
-----------------------------------------------------------------------------
-fresh bs = liquidAssert (lemma1 n bs) n
-  where 
-    n    = 1 + maxs bs
-
-{-@ maxs :: xs:_ -> {v:_ | v = maxs xs} @-}
-maxs ([])   = 0
-maxs (x:xs) = if (x > maxs xs) then x else (maxs xs) 
- 
- 
-{-@ measure maxs :: [Int] -> Int 
-    maxs ([])   = 0
-    maxs (x:xs) = if (x > maxs xs) then x else (maxs xs) 
-  @-}
-
-{-@ lemma1 :: x:Int -> xs:{[Int] | x > maxs xs} -> {v:Bool | Prop v && NotElem x xs} @-}
-lemma1 _ []     = True 
-lemma1 x (_:ys) = lemma1 x ys 
-
-
-----------------------------------------------------------------------------
--- | Part 2: Free Variables ------------------------------------------------
-----------------------------------------------------------------------------
-
-----------------------------------------------------------------------------
-{-@ free         :: e:Expr -> {v:[Bndr] | elts v = fv e} @-}
-----------------------------------------------------------------------------
-free (Var x)     = [x]
-free (App e e')  = free e ++ free e'
-free (Abs x e)   = free e \\ x
-
-
-----------------------------------------------------------------------------
--- | Part I: Sets with Lists -----------------------------------------------
-----------------------------------------------------------------------------
-
-{-@ predicate IsCup X Y Z  = elts X = Set_cup (elts Y) (elts Z)    @-}
-{-@ predicate IsDel X Y Z  = elts X = Set_dif (elts Y) (Set_sng Z) @-}
-{-@ predicate Elem  X Ys   = Set_mem X (elts Ys)                   @-}
-{-@ predicate NotElem X Ys = not (Elem X Ys)                       @-}
-
-{-@ (++)      :: xs:[a] -> ys:[a] -> {v:[a] | IsCup v xs ys}  @-}
-[]     ++ ys  = ys
-(x:xs) ++ ys  = x : (xs ++ ys)
-
-{-@ (\\)      :: (Eq a) => xs:[a] -> y:a -> {v:[a] | IsDel v xs y} @-}
-xs   \\ y     = [x | x <- xs, x /= y]
-
-{-@ elem      :: (Eq a) => x:a -> ys:[a] -> {v:Bool | Prop v <=> Elem x ys} @-}
-elem x []     = False
-elem x (y:ys) = x == y || elem x ys
- 
-{-@ measure elts :: [a] -> (Set a) 
-    elts ([])    = {v | Set_emp v}
-    elts (x:xs)  = {v | v = Set_cup (Set_sng x) (elts xs) }
-  @-}
diff --git a/docs/slides/NEU14/Eval.hs b/docs/slides/NEU14/Eval.hs
deleted file mode 100644
--- a/docs/slides/NEU14/Eval.hs
+++ /dev/null
@@ -1,51 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-
-module Eval (eval) where
-
-import Language.Haskell.Liquid.Prelude (liquidError)
-import Prelude hiding (lookup)
-import Data.Set (Set (..))
-
-type Val  = Int
-
-type Bndr = String 
-
-data Expr = Const Int
-          | Var   Bndr
-          | Plus  Expr Expr
-          | Let   Bndr Expr Expr
-
-type Env  = [(Bndr, Val)]
-
-------------------------------------------------------------------
-{-@ lookup :: x:Bndr -> {v:Env | Set_mem x (vars v)} -> Val @-}
-lookup :: Bndr -> Env -> Val
----------------------  -------------------------------------------
-lookup x ((y,v):env)   
-  | x == y             = v
-  | otherwise          = lookup x env
-lookup x []            = liquidError "Unbound Variable"
-
-------------------------------------------------------------------
-{-@ eval :: g:Env -> ClosedExpr g -> Val @-}
-------------------------------------------------------------------
-eval env (Const i)     = i
-eval env (Var x)       = lookup x env 
-eval env (Plus e1 e2)  = eval env e1 + eval env e2 
-eval env (Let x e1 e2) = eval env' e2 
-  where 
-    env'               = (x, eval env e1) : env
-
-{-@ type ClosedExpr G  = {v:Expr | Set_sub (free v) (vars G)} @-}
-
-{-@ measure vars :: Env -> (Set Bndr)
-    vars ([])    = (Set_empty 0)
-    vars (b:env) = (Set_cup (Set_sng (fst b)) (vars env))
-  @-}
-
-{-@ measure free       :: Expr -> (Set Bndr) 
-    free (Const i)     = (Set_empty 0)
-    free (Var x)       = (Set_sng x) 
-    free (Plus e1 e2)  = (Set_cup (free e1) (free e2))
-    free (Let x e1 e2) = (Set_cup (free e1) (Set_dif (free e2) (Set_sng x)))
-  @-}
diff --git a/docs/slides/NEU14/RBTree.hs b/docs/slides/NEU14/RBTree.hs
deleted file mode 100644
--- a/docs/slides/NEU14/RBTree.hs
+++ /dev/null
@@ -1,209 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--diff"           @-}
-
-module Foo where
-
-import Language.Haskell.Liquid.Prelude
-
-data RBTree a = Leaf 
-              | Node Color a !(RBTree a) !(RBTree a)
-              deriving (Show)
-
-data Color = B -- ^ Black
-           | R -- ^ Red
-           deriving (Eq,Show)
-
----------------------------------------------------------------------------
--- | Add an element -------------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ add :: (Ord a) => a -> RBT a -> RBT a @-}
-add x s = makeBlack (ins x s)
-
-{-@ ins :: (Ord a) => a -> t:RBT a -> {v: ARBTN a {bh t} | IsB t => isRB v} @-}
-ins kx Leaf             = Node R kx Leaf Leaf
-ins kx s@(Node B x l r) = case compare kx x of
-                            LT -> let t = lbal x (ins kx l) r in t 
-                            GT -> let t = rbal x l (ins kx r) in t 
-                            EQ -> s
-ins kx s@(Node R x l r) = case compare kx x of
-                            LT -> Node R x (ins kx l) r
-                            GT -> Node R x l (ins kx r)
-                            EQ -> s
-
----------------------------------------------------------------------------
--- | Delete an element ----------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ remove :: (Ord a) => a -> RBT a -> RBT a @-}
-remove x t = makeBlack (del x t)
-
-{-@ predicate HDel T V = bh V = if (isB T) then (bh T) - 1 else bh T @-}
-
-{-@ del              :: (Ord a) => a -> t:RBT a -> {v:ARBT a | HDel t v && (isB t || isRB v)} @-}
-del x Leaf           = Leaf
-del x (Node _ y a b) = case compare x y of
-   EQ -> append y a b 
-   LT -> case a of
-           Leaf         -> Node R y Leaf b
-           Node B _ _ _ -> lbalS y (del x a) b
-           _            -> let t = Node R y (del x a) b in t 
-   GT -> case b of
-           Leaf         -> Node R y a Leaf 
-           Node B _ _ _ -> rbalS y a (del x b)
-           _            -> Node R y a (del x b)
-
-{-@ append :: y:a -> l:RBT {v:a | v < y} -> r:RBTN {v:a | y < v} {bh l} -> ARBT2 a l r @-}
-append :: a -> RBTree a -> RBTree a -> RBTree a
-append _ Leaf r                               = r
-append _ l Leaf                               = l
-append piv (Node R lx ll lr) (Node R rx rl rr)  = case append piv lr rl of 
-                                                    Node R x lr' rl' -> Node R x (Node R lx ll lr') (Node R rx rl' rr)
-                                                    lrl              -> Node R lx ll (Node R rx lrl rr)
-append piv (Node B lx ll lr) (Node B rx rl rr)  = case append piv lr rl of 
-                                                    Node R x lr' rl' -> Node R x (Node B lx ll lr') (Node B rx rl' rr)
-                                                    lrl              -> lbalS lx ll (Node B rx lrl rr)
-append piv l@(Node B _ _ _) (Node R rx rl rr)   = Node R rx (append piv l rl) rr
-append piv l@(Node R lx ll lr) r@(Node B _ _ _) = Node R lx ll (append piv lr r)
-
----------------------------------------------------------------------------
--- | Delete Minimum Element -----------------------------------------------
----------------------------------------------------------------------------
-
-{-@ deleteMin            :: RBT a -> RBT a @-}
-deleteMin (Leaf)         = Leaf
-deleteMin (Node _ x l r) = makeBlack t
-  where 
-    (_, t)               = deleteMin' x l r
-
-
-{-@ deleteMin'                   :: k:a -> l:RBT {v:a | v < k} -> r:RBTN {v:a | k < v} {bh l} -> (a, ARBT2 a l r) @-}
-deleteMin' k Leaf r              = (k, r)
-deleteMin' x (Node R lx ll lr) r = (k, Node R x l' r)   where (k, l') = deleteMin' lx ll lr 
-deleteMin' x (Node B lx ll lr) r = (k, lbalS x l' r )   where (k, l') = deleteMin' lx ll lr 
-
----------------------------------------------------------------------------
--- | Rotations ------------------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ lbalS                             :: k:a -> l:ARBT {v:a | v < k} -> r:RBTN {v:a | k < v} {1 + bh l} -> {v: ARBTN a {1 + bh l} | IsB r => isRB v} @-}
-lbalS k (Node R x a b) r              = Node R k (Node B x a b) r
-lbalS k l (Node B y a b)              = let t = rbal k l (Node R y a b) in t 
-lbalS k l (Node R z (Node B y a b) c) = Node R y (Node B k l a) (rbal z b (makeRed c))
-lbalS k l r                           = liquidError "nein"
-
-{-@ rbalS                             :: k:a -> l:RBT {v:a | v < k} -> r:ARBTN {v:a | k < v} {bh l - 1} -> {v: ARBTN a {bh l} | IsB l => isRB v} @-}
-rbalS k l (Node R y b c)              = Node R k l (Node B y b c)
-rbalS k (Node B x a b) r              = let t = lbal k (Node R x a b) r  in t 
-rbalS k (Node R x a (Node B y b c)) r = Node R y (lbal x (makeRed a) b) (Node B k c r)
-rbalS k l r                           = liquidError "nein"
-
-{-@ lbal                              :: k:a -> l:ARBT {v:a | v < k} -> RBTN {v:a | k < v} {bh l} -> RBTN a {1 + bh l} @-}
-lbal k (Node R y (Node R x a b) c) r  = Node R y (Node B x a b) (Node B k c r)
-lbal k (Node R x a (Node R y b c)) r  = Node R y (Node B x a b) (Node B k c r)
-lbal k l r                            = Node B k l r
-
-{-@ rbal                              :: k:a -> l:RBT {v:a | v < k} -> ARBTN {v:a | k < v} {bh l} -> RBTN a {1 + bh l} @-}
-rbal x a (Node R y b (Node R z c d))  = Node R y (Node B x a b) (Node B z c d)
-rbal x a (Node R z (Node R y b c) d)  = Node R y (Node B x a b) (Node B z c d)
-rbal x l r                            = Node B x l r
-
----------------------------------------------------------------------------
----------------------------------------------------------------------------
----------------------------------------------------------------------------
-
-{-@ type BlackRBT a = {v: RBT a | IsB v && bh v > 0} @-}
-
-{-@ makeRed :: l:BlackRBT a -> ARBTN a {bh l - 1} @-}
-makeRed (Node B x l r) = Node R x l r
-makeRed _              = liquidError "nein"
-
-{-@ makeBlack :: ARBT a -> RBT a @-}
-makeBlack Leaf           = Leaf
-makeBlack (Node _ x l r) = Node B x l r
-
----------------------------------------------------------------------------
--- | Specifications -------------------------------------------------------
----------------------------------------------------------------------------
-
--- | Red-Black Trees
-
-{-@ type RBT a    = {v: ORBT a | isRB v && isBH v } @-}
-{-@ type RBTN a N = {v: RBT a  | bh v = N }         @-}
-
--- | Invariant 1: Binary Search Ordering 
-
-{-@ data RBTree a <l :: a -> a -> Prop, r :: a -> a -> Prop>
-            = Leaf
-            | Node (c    :: Color)
-                   (key  :: a)
-                   (left :: RBTree <l, r> (a <l key>))
-                   (left :: RBTree <l, r> (a <r key>))
-  @-}
-
-{-@ type ORBT a = RBTree <{\root v -> v < root }, {\root v -> v > root}> a @-}
-
--- | Invariant 2: Black Height Same on All Paths 
-
-{-@ measure isBH        :: RBTree a -> Prop
-    isBH (Leaf)         = true
-    isBH (Node c x l r) = (isBH l && isBH r && bh l = bh r)
-  @-}
-
-{-@ measure bh        :: RBTree a -> Int
-    bh (Leaf)         = 0
-    bh (Node c x l r) = bh l + if (c == R) then 0 else 1 
-  @-}
-
--- | Invariant 3: Red Nodes have Black Children
-
-{-@ measure isRB        :: RBTree a -> Prop
-    isRB (Leaf)         = true
-    isRB (Node c x l r) = isRB l && isRB r && (c == R => (IsB l && IsB r))
-  @-}
-
-{-@ measure col         :: RBTree a -> Color
-    col (Node c x l r)  = c
-    col (Leaf)          = B
-  @-}
-
-{-@ measure isB        :: RBTree a -> Prop
-    isB (Leaf)         = false
-    isB (Node c x l r) = c == B 
-  @-}
-
-{-@ predicate IsB T = not (col T == R) @-}
-
---------------------------------------------------------------------------
--- | Auxiliary Specifications --------------------------------------------
---------------------------------------------------------------------------
-
--- | Almost Red-Black Trees
-
-{-@ measure isARB        :: (RBTree a) -> Prop
-    isARB (Leaf)         = true 
-    isARB (Node c x l r) = (isRB l && isRB r)
-  @-}
-
-
--- | Conditionally Red-Black Tree
-
-{-@ type ARBT2 a L R = {v:ARBTN a {bh L} | (IsB L && IsB R) => isRB v} @-}
-{-@ type ARBT a      = {v: ORBT a | isARB v && isBH v} @-}
-{-@ type ARBTN a N   = {v: ARBT a | bh v = N }         @-}
-
-
--------------------------------------------------------------------------------
--- Auxiliary Invariants -------------------------------------------------------
--------------------------------------------------------------------------------
-
-{-@ predicate Invs V = Inv1 V && Inv2 V && Inv3 V   @-}
-{-@ predicate Inv1 V = (isARB V && IsB V) => isRB V @-}
-{-@ predicate Inv2 V = isRB v => isARB v            @-}
-{-@ predicate Inv3 V = 0 <= bh v                    @-}
-{-@ invariant {v: Color | v = R || v = B}           @-}
-{-@ invariant {v: RBTree a | Invs v}                @-}
-
-{-@ inv :: RBTree a -> {v:RBTree a | Invs v}        @-}
-inv Leaf           = Leaf
-inv (Node c x l r) = Node c x (inv l) (inv r)
diff --git a/docs/slides/flops14/Makefile b/docs/slides/flops14/Makefile
deleted file mode 100644
--- a/docs/slides/flops14/Makefile
+++ /dev/null
@@ -1,73 +0,0 @@
-####################################################################
-SERVERHOME=nvazou@goto.ucsd.edu:~/public_html/liquidtutorial/
-RJSERVER=rjhala@goto.ucsd.edu:~/public_html/liquid/haskell/plpv/lhs/
-####################################################################
-
-# REVEAL=$(PANDOC) -t revealjs -V revealjs-url=../_support/reveal -V theme=serif
-
-REVEAL=pandoc \
-	   --from=markdown\
-	   --to=html5                           \
-	   --standalone                         \
-	   --mathjax \
-	   --section-divs                       \
-	   --template=_support/template.reveal  \
-	   --variable reveal=../_support/reveal
-
-PANDOC=pandoc --columns=80  -s --mathjax --slide-level=2
-SLIDY=$(PANDOC) -t slidy
-DZSLIDES=$(PANDOC) --highlight-style tango --css=slides.css -w dzslides
-HANDOUT=$(PANDOC) --highlight-style tango --css=text.css -w html5
-WEBTEX=$(PANDOC) -s --webtex -i -t slidy
-BEAMER=pandoc -t beamer
-LIQUID=liquid --short-names 
-
-mdObjects   := $(patsubst %.lhs,%.lhs.markdown,$(wildcard lhs/*.lhs))
-htmlObjects := $(patsubst %.lhs,%.lhs.slides.html,$(wildcard lhs/*.lhs))
-pdfObjects  := $(patsubst %.lhs,%.lhs.slides.pdf,$(wildcard lhs/*.lhs))
-
-####################################################################
-
-
-all: slides 
-
-one: $(mdObjects)
-	$(REVEAL) lhs/.liquid/00_Index.lhs.markdown > lhs/index.html
-
-tut: $(mdObjects)
-	$(REVEAL) lhs/.liquid/*.markdown > lhs/tutorial.html 
-
-
-slides: $(htmlObjects)
-
-
-pdfslides: $(pdfObjects)
-
-plpv: slides
-	scp lhs/*.html $(RJSERVER)
-
-lhs/.liquid/%.lhs.markdown: lhs/%.lhs
-	-$(LIQUID) $?
-
-lhs/%.lhs.slides.html: lhs/.liquid/%.lhs.markdown
-	$(REVEAL) $? -o $@ 
-
-lhs/%.lhs.slides.pdf: lhs/.liquid/%.lhs.markdown
-	$(BEAMER) $? -o $@
-
-
-copy:
-	cp lhs/*lhs.html html/
-	cp lhs/*lhs.slides.html html/
-	cp css/*.css html/
-	cp -r fonts html/
-	cp index.html html/
-	cp Benchmarks.html html/
-
-clean:
-	cd lhs/ && ../cleanup && cd ../
-#	cd html/ && rm -rf * && cd ../
-#	cp index.html html/
-
-upload: 
-	scp -r html/* $(SERVERHOME)
diff --git a/docs/slides/flops14/TODO.md b/docs/slides/flops14/TODO.md
deleted file mode 100644
--- a/docs/slides/flops14/TODO.md
+++ /dev/null
@@ -1,21 +0,0 @@
-Timing
-------
-
-[4]  Motivation 
-                        <------------------ 4 
-[8]  Refinements
-                        <------------------ 12 
-[8]  Measures
-                        <------------------ 20 
-[8]  Higher-Order Functions
-                        <------------------ 28 
-[5] Abstract Refinements: 
-[8]   Code, 
-[8]   Data,...,...
-                        <------------------ 49
-[4] Lazy Evaluation
-[5] Termination
-                        <------------------ 58 
-[3] Evaluation
-                        <------------------ 61 
-
diff --git a/docs/slides/flops14/_support/liquid.css b/docs/slides/flops14/_support/liquid.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/flops14/_support/reveal/LICENSE b/docs/slides/flops14/_support/reveal/LICENSE
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
-
-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.
diff --git a/docs/slides/flops14/_support/reveal/README.md b/docs/slides/flops14/_support/reveal/README.md
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/README.md
+++ /dev/null
@@ -1,226 +0,0 @@
-# reveal.js
-
-A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://lab.hakim.se/reveal-js/).
-
-reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). It's best viewed in a browser with support for CSS 3D transforms but [fallbacks](https://github.com/hakimel/reveal.js/wiki/Browser-Support) are available to make sure your presentation can still be viewed elsewhere.
-
-
-#### More reading in the Wiki:
-- [Changelog](https://github.com/hakimel/reveal.js/wiki/Changelog): Up-to-date version history.
-- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own!
-- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Changelog): Explanation of browser support and fallbacks.
-
-
-The framework is and will remain free. Donations are available as an optional way of supporting the project. Proceeds go towards futher development, hosting and domain costs for the GUI editor which will be out shortly.
-
-[![Click here to lend your support to: reveal.js and make a donation at www.pledgie.com !](http://www.pledgie.com/campaigns/18182.png?skin_name=chrome)](http://www.pledgie.com/campaigns/18182)
-
-
-## Instructions
-
-### Markup
-
-Markup heirarchy needs to be ``<div class="reveal"> <div class="slides"> <section>`` where the ``<section>`` represents one slide and can be repeated indefinitely. If you place multiple ``<section>``'s inside of another ``<section>`` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and it will be included in the horizontal sequence. For example:
-
-```html
-<div class="reveal">
-	<div class="slides"> 
-		<section>Single Horizontal Slide</section>
-		<section>
-			<section>Vertical Slide 1</section>
-			<section>Vertical Slide 2</section>
-		</section>
-	</div>
-</div>
-```
-
-### Markdown
-
-It's possible to write your slides using Markdown. To enable Markdown simply add the ```data-markdown``` attribute to your ```<section>``` elements and reveal.js will automatically load the JavaScript parser. 
-
-This is based on [data-markdown](https://gist.github.com/1343518) from [Paul Irish](https://github.com/paulirish) which in turn uses [showdown](https://github.com/coreyti/showdown/). This is sensitive to indentation (avoid mixing tabs and spaces) and line breaks (avoid consecutive breaks). Updates to come.
-
-```html
-<section data-markdown>
-	## Page title
-	
-	A paragraph with some text and a [link](http://hakim.se).
-</section>
-```
-
-
-### Configuration
-
-At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below.
-
-```javascript
-Reveal.initialize({
-	// Display controls in the bottom right corner
-	controls: true,
-
-	// Display a presentation progress bar
-	progress: true,
-
-	// Push each slide change to the browser history
-	history: false,
-
-	// Enable keyboard shortcuts for navigation
-	keyboard: true,
-
-	// Loop the presentation
-	loop: false,
-
-	// Number of milliseconds between automatically proceeding to the 
-	// next slide, disabled when set to 0
-	autoSlide: 0,
-
-	// Enable slide navigation via mouse wheel
-	mouseWheel: true,
-
-	// Apply a 3D roll to links on hover
-	rollingLinks: true,
-
-	// Transition style
-	transition: 'default' // default/cube/page/concave/linear(2d)
-});
-```
-
-### Dependencies
-
-Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example:
-
-```javascript
-Reveal.initialize({
-	dependencies: [
-		// Syntax highlight for <code> elements
-		{ src: 'lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
-		// Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/
-		{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }
-		// Interpret Markdown in <section> elements
-		{ src: 'lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-		{ src: 'lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-		// Speaker notes support
-		{ src: 'plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-		{ src: '/socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-	]
-});
-```
-
-You can add your own extensions using the same syntax. The following properties are available for each dependency object:
-- **src**: Path to the script to load
-- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false
-- **callback**: [optional] Function to execute when the script has loaded
-- **condition**: [optional] Function which must return true for the script to be loaded
-
-
-### API
-
-The Reveal class provides a minimal JavaScript API for controlling navigation and reading state:
-
-```javascript
-// Navigation
-Reveal.navigateTo( indexh, indexv );
-Reveal.navigateLeft();
-Reveal.navigateRight();
-Reveal.navigateUp();
-Reveal.navigateDown();
-Reveal.navigatePrev();
-Reveal.navigateNext();
-Reveal.toggleOverview();
-
-// Retrieves the previous and current slide elements
-Reveal.getPreviousSlide();
-Reveal.getCurrentSlide();
-
-Reveal.getIndices(); // { h: 0, v: 0 } }
-```
-
-### States
-
-If you set ``data-state="somestate"`` on a slide ``<section>``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide.
-
-Furthermore you can also listen to these changes in state via JavaScript:
-
-```javascript
-Reveal.addEventListener( 'somestate', function() {
-	// TODO: Sprinkle magic
-}, false );
-```
-
-### Slide change event
-
-An 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes.
-
-```javascript
-Reveal.addEventListener( 'slidechanged', function( event ) {
-	// event.previousSlide, event.currentSlide, event.indexh, event.indexv
-} );
-```
-
-### Fragment events
-
-When a slide fragment is either shown or hidden reveal.js will dispatch an event.
-
-```javascript
-Reveal.addEventListener( 'fragmentshown', function( event ) {
-	// event.fragment = the fragment DOM element
-} );
-Reveal.addEventListener( 'fragmenthidden', function( event ) {
-	// event.fragment = the fragment DOM element
-} );
-```
-
-### Internal links
-
-It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```<section id="some-slide">```):
-
-```html
-<a href="#/2/2">Link</a>
-<a href="#/some-slide">Link</a>
-```
-
-## PDF Export
-
-Presentations can be exported to PDF via a special print stylesheet. This feature requires that you use [Google Chrome](http://google.com/chrome). 
-Here's an example of an exported presentation that's been uploaded to SlideShare: http://www.slideshare.net/hakimel/revealjs-13872948.
-
-1. Open the desired presentation with *print-pdf* anywhere in the query, for example: [lab.hakim.se/reveal-js?print-pdf](http://lab.hakim.se/reveal-js?print-pdf)
-2. Open the in-browser print dialog (CMD+P).
-3. Change the **Destination** setting to **Save as PDF**.
-4. Change the **Layout** to **Landscape**.
-5. Change the **Margins** to **None**.
-6. Click **Save**.
-
-![Chrome Print Settings](https://s3.amazonaws.com/hakim-static/reveal-js/pdf-print-settings.png)
-
-## Speaker Notes
-
-If you're interested in using speaker notes, reveal.js comes with a Node server that allows you to deliver your presentation in one browser while viewing speaker notes in another. 
-
-To include speaker notes in your presentation, simply add an `<aside class="notes">` element to any slide. These notes will be hidden in the main presentation view.
-
-You'll also need to [install Node.js](http://nodejs.org/); then, install the server dependencies by running `npm install`.
-
-Once Node.js and the dependencies are installed, run the following command from the root directory:
-
-		node plugin/speakernotes
-
-By default, the slides will be served at [localhost:1947](http://localhost:1947).
-
-You can change the appearance of the speaker notes by editing the file at `plugin/speakernotes/notes.html`.	
-
-### Known Issues
-
-- The notes page is supposed to show the current slide and the next slide, but when it first starts, it always shows the first slide in both positions. 
-
-## Folder Structure
-- **css/** Core styles without which the project does not function
-- **js/** Like above but for JavaScript
-- **plugin/** Components that have been developed as extensions to reveal.js
-- **lib/** All other third party assets (JavaScript, CSS, fonts)
-
-## License
-
-MIT licensed
-
-Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
diff --git a/docs/slides/flops14/_support/reveal/css/liquidhaskell.css b/docs/slides/flops14/_support/reveal/css/liquidhaskell.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/liquidhaskell.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/flops14/_support/reveal/css/main.css b/docs/slides/flops14/_support/reveal/css/main.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/main.css
+++ /dev/null
@@ -1,925 +0,0 @@
-@charset "UTF-8";
-
-/**
- * reveal.js
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-.reveal a {
-  color: #8b7c69;
-  text-decoration: none;
-}
-
-/*********************************************
- * RESET STYLES
- *********************************************/
-
-
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, canvas, details, embed, 
-figure, figcaption, footer, header, hgroup, 
-menu, nav, output, ruby, section, summary,
-time, mark, audio, video {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	font-size: 100%;
-	font: inherit;
-	vertical-align: baseline;
-}
-
-article, aside, details, figcaption, figure, 
-footer, header, hgroup, menu, nav, section {
-	display: block;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-html, 
-body {
-	padding: 0;
-	margin: 0;
-	width: 100%;
-	height: 100%;
-	min-height: 600px;
-	overflow: hidden;
-}
-
-body {
-	position: relative;
-	line-height: 1;
-}
-
-@media screen and (max-width: 1024px) {
-	body {
-		font-size: 30px;
-	}
-}
-
-::selection { 
-	background:#FF5E99; 
-	color:#fff; 
-	text-shadow: none; 
-}
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1 { font-size: 0.77em; }
-.reveal h2 { font-size: 2.11em;	}
-.reveal h3 { font-size: 1.55em;	}
-.reveal h4 { font-size: 1em;	}
-
-
-/*********************************************
- * VIEW FRAGMENTS
- *********************************************/
-
-.reveal .slides section .fragment {
-	opacity: 0;
-
-	-webkit-transition: all .2s ease;
-	   -moz-transition: all .2s ease;
-	    -ms-transition: all .2s ease;
-	     -o-transition: all .2s ease;
-	        transition: all .2s ease;
-}
-	.reveal .slides section .fragment.visible {
-		opacity: 1;
-	}
-
-
-/*********************************************
- * DEFAULT ELEMENT STYLES
- *********************************************/
-
-.reveal .slides section {
-	line-height: 1.2em;
-	font-weight: normal;
-}
-
-.reveal img {
-	/* preserve aspect ratio and scale image so it's bound within the section */
-	max-width: 100%;
-	max-height: 100%;
-} 
-
-.reveal strong, 
-.reveal b {
-	font-weight: bold;
-}
-
-.reveal em, 
-.reveal i {
-	font-style: italic;
-}
-
-.reveal ol, 
-.reveal ul {
-	display: inline-block;
-
-	text-align: left;
-	margin: 0 0 0 .7em;
-}
-
-.reveal ol {
-	list-style-type: decimal;
-}
-
-.reveal ul {
-	list-style-type: disc;
-	padding-bottom: 0.8em;
-}
-
-.reveal ul ul {
-	list-style-type: circle;
-}
-
-.reveal ul ul ul {
-	list-style-type: square;
-}
-
-.reveal ul ul,
-.reveal ul ol,
-.reveal ol ol,
-.reveal ol ul {
-	display: block;
-	margin-left: 0;
-}
-
-.reveal p {
-	margin-bottom: 10px;
-	line-height: 1.2em;
-}
-
-.reveal q,
-.reveal blockquote {
-	quotes: none;
-}
-
-
-.reveal blockquote {
-	display: block;
-	position: relative;
-	width: 70%;
-	margin: 5px auto;
-	padding: 5px;
-	
-	font-size: 80%;
-	font-style: italic;
-	background: rgba(255, 255, 255, 0.05);
-	box-shadow: 0px 0px 2px rgba(0,0,0,0.2);
-}
-
-
-
-/*--DW-- disable funky quote marks for blockquotes*/
-/*
-.reveal blockquote:before {
-	content: '“';
-}
-.reveal blockquote:after {
-	content: '”';
-}
-*/
-
-.reveal q {	
-	font-style: italic;
-}
-	.reveal q:before {
-		content: '“';
-	}
-	.reveal q:after {
-		content: '”';
-	}
-
-.reveal pre {
-	display: block;
-	position: relative;
-	width: 90%;
-	margin: 10px auto;
-
-	text-align: left;
-	font-size: 0.85em;
-	font-family: monospace;
-	line-height: 1.2em;
-
-	word-wrap: break-word;
-
-	box-shadow: 0px 0px 6px rgba(0,0,0,0.3);
-}
-
-.reveal code {
-	font-family: monospace;
-	overflow-x: auto;
-}
-
-.reveal table th, 
-.reveal table td {
-	text-align: left;
-	padding-right: .3em;
-}
-
-.reveal table th {
-	text-shadow: rgb(255,255,255) 1px 1px 2px;
-}
-
-.reveal sup { 
-	vertical-align: super;
-}
-.reveal sub { 
-	vertical-align: sub;
-}
-
-.reveal small {
-	display: inline-block;
-	font-size: 0.6em;
-	line-height: 1.2em;
-	vertical-align: top;
-}
-
-.reveal small * {
-	vertical-align: top;
-}
-
-
-/*********************************************
- * CONTROLS
- *********************************************/
-
-.reveal .controls {
-	display: none;
-	position: fixed;
-	width: 100px;
-	height: 100px;
-	z-index: 30;
-
-	right: 0;
-	bottom: 0;
-}
-	
-	.reveal .controls a {
-		font-family: Arial;
-		font-size: 0.83em;
-		position: absolute;
-		opacity: 0.1;
-	}
-		.reveal .controls a.enabled {
-			opacity: 0.6;
-		}
-		.reveal .controls a.enabled:active {
-			margin-top: 1px;
-		}
-
-	.reveal .controls .left {
-		top: 30px;
-	}
-
-	.reveal .controls .right {
-		left: 60px;
-		top: 30px;
-	}
-
-	.reveal .controls .up {
-		left: 30px;
-	}
-
-	.reveal .controls .down {
-		left: 30px;
-		top: 60px;
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	position: fixed;
-	display: none;
-	height: 3px;
-	width: 100%;
-	bottom: 0;
-	left: 0;
-}
-	
-	.reveal .progress span {
-		display: block;
-		height: 100%;
-		width: 0px;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-/*********************************************
- * ROLLING LINKS
- *********************************************/
-
-.reveal .roll {
-	display: inline-block;
-	line-height: 1.2;
-	overflow: hidden;
-
-	vertical-align: top;
-
-	-webkit-perspective: 400px;
-	   -moz-perspective: 400px;
-	    -ms-perspective: 400px;
-	        perspective: 400px;
-
-	-webkit-perspective-origin: 50% 50%;
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-	.reveal .roll:hover {
-		background: none;
-		text-shadow: none;
-	}
-.reveal .roll span {
-	display: block;
-	position: relative;
-	padding: 0 2px;
-
-	pointer-events: none;
-
-	-webkit-transition: all 400ms ease;
-	   -moz-transition: all 400ms ease;
-	    -ms-transition: all 400ms ease;
-	        transition: all 400ms ease;
-
-	-webkit-transform-origin: 50% 0%;
-	   -moz-transform-origin: 50% 0%;
-	    -ms-transform-origin: 50% 0%;
-	        transform-origin: 50% 0%;
-
-	-webkit-transform-style: preserve-3d;
-	   -moz-transform-style: preserve-3d;
-	    -ms-transform-style: preserve-3d;
-	        transform-style: preserve-3d;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	        backface-visibility: hidden;
-}
-	.reveal .roll:hover span {
-	    background: rgba(0,0,0,0.5);
-
-	    -webkit-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	       -moz-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	        -ms-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	            transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	}
-.reveal .roll span:after {
-	content: attr(data-title);
-
-	display: block;
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0 2px;
-
-	-webkit-transform-origin: 50% 0%;
-	   -moz-transform-origin: 50% 0%;
-	    -ms-transform-origin: 50% 0%;
-	        transform-origin: 50% 0%;
-
-	-webkit-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	   -moz-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	    -ms-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	        transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-}
-
-
-/*********************************************
- * SLIDES
- *********************************************/
-
-.reveal .slides {
-	position: absolute;
-	max-width: 1024px;
-	width: 100%;
-	height: 80%;
-	left: 50%;
-	top: 50%;
-	margin-top: -320px;
-	padding: 20px 0px;
-	overflow: visible;
-	
-	text-align: center;
-
-	-webkit-transition: -webkit-perspective .4s ease;
-	   -moz-transition: -moz-perspective .4s ease;
-	    -ms-transition: -ms-perspective .4s ease;
-	     -o-transition: -o-perspective .4s ease;
-	        transition: perspective .4s ease;
-	
-	-webkit-perspective: 600px;
-	   -moz-perspective: 600px;
-	    -ms-perspective: 600px;
-	        perspective: 600px;
-
-	-webkit-perspective-origin: 0% 25%;
-	   -moz-perspective-origin: 0% 25%;
-	    -ms-perspective-origin: 0% 25%;
-	        perspective-origin: 0% 25%;
-}
-
-.reveal .slides>section,
-.reveal .slides>section>section {
-	display: none;
-	position: absolute;
-	width: 100%;
-	min-height: 600px;
-
-	z-index: 10;
-	
-	-webkit-transform-style: preserve-3d;
-	   -moz-transform-style: preserve-3d;
-	    -ms-transform-style: preserve-3d;
-	        transform-style: preserve-3d;
-	
-	-webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	   -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	    -ms-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	     -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	        transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-}
-
-.reveal .slides>section.present {
-	display: block;
-	z-index: 11;
-	opacity: 1;
-}
-
-.reveal .slides>section {
-	margin-left: -50%;
-}
-
-
-/*********************************************
- * DEFAULT TRANSITION
- *********************************************/
-
-.reveal .slides>section.past {
-	display: block;
-	opacity: 0;
-	
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-}
-.reveal .slides>section.future {
-	display: block;
-	opacity: 0;
-	
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-}
-
-.reveal .slides>section>section.past {
-	display: block;
-	opacity: 0;
-	
-	-webkit-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
-	   -moz-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
-	    -ms-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
-	        transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
-}
-.reveal .slides>section>section.future {
-	display: block;
-	opacity: 0;
-	
-	-webkit-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
-	   -moz-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
-	    -ms-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
-	        transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
-}
-
-
-/*********************************************
- * CONCAVE TRANSITION
- *********************************************/
-
-.reveal.concave  .slides>section.past {
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-}
-.reveal.concave  .slides>section.future {
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-}
-
-.reveal.concave  .slides>section>section.past {
-	-webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	   -moz-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	    -ms-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	        transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-}
-.reveal.concave  .slides>section>section.future {
-	-webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	   -moz-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	    -ms-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	        transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-}
-
-
-/*********************************************
- * LINEAR TRANSITION
- *********************************************/
-
-.reveal.linear .slides>section.past {
-	-webkit-transform: translate(-150%, 0);
-	   -moz-transform: translate(-150%, 0);
-	    -ms-transform: translate(-150%, 0);
-	     -o-transform: translate(-150%, 0);
-	        transform: translate(-150%, 0);
-}
-.reveal.linear .slides>section.future {
-	-webkit-transform: translate(150%, 0);
-	   -moz-transform: translate(150%, 0);
-	    -ms-transform: translate(150%, 0);
-	     -o-transform: translate(150%, 0);
-	        transform: translate(150%, 0);
-}
-
-.reveal.linear .slides>section>section.past {
-	-webkit-transform: translate(0, -150%);
-	   -moz-transform: translate(0, -150%);
-	    -ms-transform: translate(0, -150%);
-	     -o-transform: translate(0, -150%);
-	        transform: translate(0, -150%);
-}
-.reveal.linear .slides>section>section.future {
-	-webkit-transform: translate(0, 150%);
-	   -moz-transform: translate(0, 150%);
-	    -ms-transform: translate(0, 150%);
-	     -o-transform: translate(0, 150%);
-	        transform: translate(0, 150%);
-}
-
-/*********************************************
- * BOX TRANSITION
- *********************************************/
-
-.reveal.cube .slides {
-	margin-top: -350px;
-
-	-webkit-perspective-origin: 50% 25%;
-	   -moz-perspective-origin: 50% 25%;
-	    -ms-perspective-origin: 50% 25%;
-	        perspective-origin: 50% 25%;
-
-	-webkit-perspective: 1300px;
-	   -moz-perspective: 1300px;
-	    -ms-perspective: 1300px;
-	        perspective: 1300px;
-}
-
-.reveal.cube .slides section {
-	padding: 30px;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	    -ms-backface-visibility: hidden;
-	        backface-visibility: hidden;
-	
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-	.reveal.cube .slides section:not(.stack):before {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		background: #232628;
-		border-radius: 4px;
-
-		-webkit-transform: translateZ( -20px );
-		   -moz-transform: translateZ( -20px );
-		    -ms-transform: translateZ( -20px );
-		     -o-transform: translateZ( -20px );
-		        transform: translateZ( -20px );
-	}
-	.reveal.cube .slides section:not(.stack):after {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 90%;
-		height: 30px;
-		left: 5%;
-		bottom: 0;
-		background: none;
-		z-index: 1;
-
-		border-radius: 4px;
-		box-shadow: 0px 95px 25px rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ(-90px) rotateX( 65deg );
-		   -moz-transform: translateZ(-90px) rotateX( 65deg );
-		    -ms-transform: translateZ(-90px) rotateX( 65deg );
-		     -o-transform: translateZ(-90px) rotateX( 65deg );
-		        transform: translateZ(-90px) rotateX( 65deg );
-	}
-
-.reveal.cube .slides>section.stack {
-	padding: 0;
-	background: none;
-}
-
-.reveal.cube .slides>section.past {
-	-webkit-transform-origin: 100% 0%;
-	   -moz-transform-origin: 100% 0%;
-	    -ms-transform-origin: 100% 0%;
-	        transform-origin: 100% 0%;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-}
-
-.reveal.cube .slides>section.future {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg);
-}
-
-.reveal.cube .slides>section>section.past {
-	-webkit-transform-origin: 0% 100%;
-	   -moz-transform-origin: 0% 100%;
-	    -ms-transform-origin: 0% 100%;
-	        transform-origin: 0% 100%;
-
-	-webkit-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	   -moz-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	    -ms-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	        transform: translate3d(0, -100%, 0) rotateX(90deg);
-}
-
-.reveal.cube .slides>section>section.future {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	   -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	    -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	        transform: translate3d(0, 100%, 0) rotateX(-90deg);
-}
-
-
-/*********************************************
- * PAGE TRANSITION
- *********************************************/
-
-.reveal.page .slides {
-	margin-top: -350px;
-
-	-webkit-perspective-origin: 50% 50%;
- 	   -moz-perspective-origin: 50% 50%;
- 	    -ms-perspective-origin: 50% 50%;
- 	        perspective-origin: 50% 50%;
-
-	-webkit-perspective: 3000px;
-	   -moz-perspective: 3000px;
-	    -ms-perspective: 3000px;
-	        perspective: 3000px;
-}
-
-.reveal.page .slides section {
-	padding: 30px;
-
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-	.reveal.page .slides section.past {
-		z-index: 12;
-	}
-	.reveal.page .slides section:not(.stack):before {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		background: rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ( -20px );
-		   -moz-transform: translateZ( -20px );
-		    -ms-transform: translateZ( -20px );
-		     -o-transform: translateZ( -20px );
-		        transform: translateZ( -20px );
-	}
-	.reveal.page .slides section:not(.stack):after {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 90%;
-		height: 30px;
-		left: 5%;
-		bottom: 0;
-		background: none;
-		z-index: 1;
-
-		border-radius: 4px;
-		box-shadow: 0px 95px 25px rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ(-90px) rotateX( 65deg );
-	}
-
-.reveal.page .slides>section.stack {
-	padding: 0;
-	background: none;
-}
-
-.reveal.page .slides>section.past {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	   -moz-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	    -ms-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	        transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-}
-
-.reveal.page .slides>section.future {
-	-webkit-transform-origin: 100% 0%;
-	   -moz-transform-origin: 100% 0%;
-	    -ms-transform-origin: 100% 0%;
-	        transform-origin: 100% 0%;
-
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-
-.reveal.page .slides>section>section.past {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	   -moz-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	    -ms-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	        transform: translate3d(0, -40%, 0) rotateX(80deg);
-}
-
-.reveal.page .slides>section>section.future {
-	-webkit-transform-origin: 0% 100%;
-	   -moz-transform-origin: 0% 100%;
-	    -ms-transform-origin: 0% 100%;
-	        transform-origin: 0% 100%;
-
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-
-
-/*********************************************
- * OVERVIEW
- *********************************************/
-
-.reveal.overview .slides {
-	-webkit-perspective: 700px;
-	   -moz-perspective: 700px;
-	    -ms-perspective: 700px;
-	        perspective: 700px;
-}
-
-.reveal.overview .slides section {
-	padding: 20px 0;
-	max-height: 600px;
-	overflow: hidden;	
-	opacity: 1;
-	cursor: pointer;
-	background: rgba(0,0,0,0.1);
-}
-.reveal.overview .slides section .fragment {
-	opacity: 1;
-}
-.reveal.overview .slides section:after,
-.reveal.overview .slides section:before {
-	display: none !important;
-}
-.reveal.overview .slides section>section {
-	opacity: 1;
-	cursor: pointer;
-}
-	.reveal.overview .slides section:hover {
-		background: rgba(0,0,0,0.3);
-	}
-
-	.reveal.overview .slides section.present {
-		background: rgba(0,0,0,0.3);
-	}
-.reveal.overview .slides>section.stack {
-	background: none;
-	padding: 0;
-	overflow: visible;
-}
-
-
-/*********************************************
- * FALLBACK
- *********************************************/
-
-.no-transforms {
-	overflow-y: auto;
-}
-
-.no-transforms .slides section {
-	display: block!important;
-	opacity: 1!important;
-	position: relative!important;
-	height: auto;
-	min-height: auto;
-	margin-bottom: 100px;
-
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	        transform: none;
-}
-
-
-/*********************************************
- * DEFAULT STATES
- *********************************************/
-
-.state-background {
-	position: absolute;
-	width: 100%;
-	height: 100%;
-	background: rgba( 0, 0, 0, 0 );
-
-	-webkit-transition: background 800ms ease;
-	   -moz-transition: background 800ms ease;
-	    -ms-transition: background 800ms ease;
-	     -o-transition: background 800ms ease;
-	        transition: background 800ms ease;
-}
-.alert .state-background {
-	background: rgba( 200, 50, 30, 0.6 );
-}
-.soothe .state-background {
-	background: rgba( 50, 200, 90, 0.4 );
-}
-.blackout .state-background {
-	background: rgba( 0, 0, 0, 0.6 );
-}
-
-
-/*********************************************
- * SPEAKER NOTES
- *********************************************/
-
-.reveal aside.notes {
-	display: none;
-}
-
diff --git a/docs/slides/flops14/_support/reveal/css/print/paper.css b/docs/slides/flops14/_support/reveal/css/print/paper.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/print/paper.css
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Default Print Stylesheet Template
-   by Rob Glazebrook of CSSnewbie.com
-   Last Updated: June 4, 2008
-
-   Feel free (nay, compelled) to edit, append, and 
-   manipulate this file as you see fit. */
-
-
-/* SECTION 1: Set default width, margin, float, and
-   background. This prevents elements from extending 
-   beyond the edge of the printed page, and prevents
-   unnecessary background images from printing */
-body {
-	background: #fff;
-	font-size: 13pt;
-	width: auto;
-	height: auto;
-	border: 0;
-	margin: 0 5%;
-	padding: 0;
-	float: none !important;
-	overflow: visible;
-}
-html {
-	background: #fff;
-	width: auto;
-	height: auto;
-	overflow: visible;
-}
-
-/* SECTION 2: Remove any elements not needed in print. 
-   This would include navigation, ads, sidebars, etc. */
-.nestedarrow, 
-.controls a, 
-.reveal .progress, 
-.reveal.overview,
-.fork-reveal,
-.share-reveal,
-.state-background {
-	display:none;
-}
-
-/* SECTION 3: Set body font face, size, and color.
-   Consider using a serif font for readability. */
-body, p, td, li, div, a {
-	font-size: 13pt;
-	font-family: Georgia, "Times New Roman", Times, serif !important;
-	color: #000; 
-}
-
-/* SECTION 4: Set heading font face, sizes, and color.
-   Diffrentiate your headings from your body text.
-   Perhaps use a large sans-serif for distinction. */
-h1,h2,h3,h4,h5,h6 {
-	color: #000!important;
-	height: auto;
-	line-height: normal;
-	font-family: Georgia, "Times New Roman", Times, serif !important;
-	text-shadow: 0 0 0 #000 !important;
-	text-align: left;
-	letter-spacing: normal;
-}
-/* Need to reduce the size of the fonts for printing */
-h1 { font-size: 26pt !important;  }
-h2 { font-size: 22pt !important; }
-h3 { font-size: 20pt !important; }
-h4 { font-size: 20pt !important; font-variant: small-caps; }
-h5 { font-size: 19pt !important; }
-h6 { font-size: 18pt !important; font-style: italic; }
-
-/* SECTION 5: Make hyperlinks more usable.
-   Ensure links are underlined, and consider appending
-   the URL to the end of the link for usability. */
-a:link, 
-a:visited {
-	color: #000 !important;
-	font-weight: bold;
-	text-decoration: underline;
-}
-.reveal a:link:after, 
-.reveal a:visited:after {
-	content: " (" attr(href) ") ";
-	color: #222 !important;
-	font-size: 90%;
-}
-
-
-/* SECTION 6: more reveal.js specific additions by @skypanther */
-ul, ol, div, p {
-	visibility: visible;
-	position: static;
-	width: auto;
-	height: auto;
-	display: block;
-	overflow: visible;
-	margin: auto;
-	text-align: left !important;
-}
-.reveal .slides {
-	position: static;
-	width: auto;
-	height: auto;
-
-	left: auto;
-	top: auto;
-	margin-left: auto;
-	margin-top: auto;
-	padding: auto;
-
-	overflow: visible;
-	display: block;
-
-	text-align: center;
-	-webkit-perspective: none;
-	   -moz-perspective: none;
-	    -ms-perspective: none;
-	        perspective: none;
-
-	-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-.reveal .slides>section, .reveal .slides>section>section, 
-.reveal .slides>section.past, .reveal .slides>section.future,
-.reveal.linear .slides>section, .reveal.linear .slides>section>section,
-.reveal.linear .slides>section.past, .reveal.linear .slides>section.future {
-	
-	visibility: visible;
-	position: static;
-	width: 90%;
-	height: auto;
-	display: block;
-	overflow: visible;
-
-	left: 0%;
-	top: 0%;
-	margin-left: 0px;
-	margin-top: 0px;
-	padding: 20px 0px;
-
-	opacity: 1;
-
-	-webkit-transform-style: flat;
-	   -moz-transform-style: flat;
-	    -ms-transform-style: flat;
-	        transform-style: flat;
-
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	        transform: none;
-}
-.reveal section {
-	page-break-after: always !important; 
-	display: block !important;
-}
-.reveal section.stack {
-	page-break-after: avoid !important; 
-}
-.reveal section .fragment {
-	opacity: 1 !important;
-}
-.reveal section img {
-	display: block;
-	margin: 15px 0px;
-	background: rgba(255,255,255,1);
-	border: 1px solid #666;
-	box-shadow: none;
-}
diff --git a/docs/slides/flops14/_support/reveal/css/print/pdf.css b/docs/slides/flops14/_support/reveal/css/print/pdf.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/print/pdf.css
+++ /dev/null
@@ -1,158 +0,0 @@
-/* Default Print Stylesheet Template
-   by Rob Glazebrook of CSSnewbie.com
-   Last Updated: June 4, 2008
-
-   Feel free (nay, compelled) to edit, append, and 
-   manipulate this file as you see fit. */
-
-
-/* SECTION 1: Set default width, margin, float, and
-   background. This prevents elements from extending 
-   beyond the edge of the printed page, and prevents
-   unnecessary background images from printing */
-* {
-	-webkit-print-color-adjust: exact; 
-}
-
-body {
-	font-size: 22pt;
-	width: auto;
-	height: auto;
-	border: 0;
-	margin: 0 5%;
-	padding: 0;
-	float: none !important;
-	overflow: visible;
-	background: #333;
-}
-
-html {
-	width: auto;
-	height: auto;
-	overflow: visible;
-}
-
-/* SECTION 2: Remove any elements not needed in print. 
-   This would include navigation, ads, sidebars, etc. */
-.nestedarrow, 
-.controls a, 
-.reveal .progress, 
-.reveal.overview,
-.fork-reveal,
-.share-reveal,
-.state-background {
-	display:none;
-}
-
-/* SECTION 3: Set body font face, size, and color.
-   Consider using a serif font for readability. */
-body, p, td, li, div, a {
-	font-size: 22pt;
-}
-
-/* SECTION 4: Set heading font face, sizes, and color.
-   Diffrentiate your headings from your body text.
-   Perhaps use a large sans-serif for distinction. */
-h1,h2,h3,h4,h5,h6 {
-	text-shadow: 0 0 0 #000 !important;
-}
-
-/* SECTION 5: Make hyperlinks more usable.
-   Ensure links are underlined, and consider appending
-   the URL to the end of the link for usability. */
-a:link, 
-a:visited {
-	font-weight: bold;
-	text-decoration: underline;
-}
-
-
-/* SECTION 6: more reveal.js specific additions by @skypanther */
-ul, ol, div, p {
-	visibility: visible;
-	position: static;
-	width: auto;
-	height: auto;
-	display: block;
-	overflow: visible;
-	margin: auto;
-}
-.reveal .slides {
-	position: static;
-	width: 100%;
-	height: auto;
-
-	left: auto;
-	top: auto;
-	margin-left: auto;
-	margin-top: auto;
-	padding: auto;
-
-	overflow: visible;
-	display: block;
-
-	text-align: center;
-	-webkit-perspective: none;
-	   -moz-perspective: none;
-	    -ms-perspective: none;
-	        perspective: none;
-
-	-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-.reveal .slides>section, .reveal .slides>section>section, 
-.reveal .slides>section.past, .reveal .slides>section.future,
-.reveal.linear .slides>section, .reveal.linear .slides>section>section,
-.reveal.linear .slides>section.past, .reveal.linear .slides>section.future {
-	
-	visibility: visible;
-	position: static;
-	width: 100%;
-	height: auto;
-	min-height: initial;
-	display: block;
-	overflow: visible;
-
-	left: 0%;
-	top: 0%;
-	margin-left: 0px;
-	margin-top: 50px;
-	padding: 20px 0px;
-
-	opacity: 1;
-
-	-webkit-transform-style: flat;
-	   -moz-transform-style: flat;
-	    -ms-transform-style: flat;
-	        transform-style: flat;
-
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	        transform: none;
-}
-.reveal section {
-	page-break-after: always !important; 
-	display: block !important;
-}
-.reveal section.stack {
-	margin: 0px !important;
-	padding: 0px !important;
-	page-break-after: avoid !important; 
-}
-.reveal section .fragment {
-	opacity: 1 !important;
-}
-.reveal img {
-	box-shadow: none;
-}
-.reveal .roll {
-	overflow: visible;
-	line-height: 1em;
-}
-
-.reveal small a {
-	font-size: 16pt !important;
-}
diff --git a/docs/slides/flops14/_support/reveal/css/theme/beige.css b/docs/slides/flops14/_support/reveal/css/theme/beige.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/theme/beige.css
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * A beige theme for reveal.js presentations, similar 
- * to the default theme.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'Lato', Times, 'Times New Roman', serif;
-	font-size: 36px;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #333;
-
-	background: #f7f3de;
-	background: -moz-radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%, rgba(247,242,211,1) 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(247,242,211,1)));
-	background: -webkit-radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%,rgba(247,242,211,1) 100%);
-	background: -o-radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%,rgba(247,242,211,1) 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%,rgba(247,242,211,1) 100%);
-	background: radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%,rgba(247,242,211,1) 100%);
-}
-
-::-moz-selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-::-webkit-selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-::selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2, 
-.reveal h3, 
-.reveal h4, 
-.reveal h5, 
-.reveal h6 {
-	margin: 0 0 20px 0;
-	color: #333;
-	font-family: 'League Gothic', Impact, sans-serif;
-	line-height: 0.9em;
-	letter-spacing: 0.02em;
-	
-	text-transform: uppercase;
-}
-
-.reveal h1 {
-	text-shadow: 	0 1px 0 #ccc,
-					0 2px 0 #c9c9c9,
-					0 3px 0 #bbb,
-					0 4px 0 #b9b9b9,
-					0 5px 0 #aaa,
-					0 6px 1px rgba(0,0,0,.1),
-					0 0 5px rgba(0,0,0,.1),
-					0 1px 3px rgba(0,0,0,.3),
-					0 3px 5px rgba(0,0,0,.2),
-					0 5px 10px rgba(0,0,0,.25),
-					0 20px 20px rgba(0,0,0,.15);
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: #8b743d;
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		text-shadow: none;
-		border: none;
-		border-radius: 2px;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: #8b743d;
-}
-
-
-/*********************************************
- * IMAGES
- *********************************************/
-
-.reveal section img {
-	margin: 30px 0 0 0;
-	background: rgba(255,255,255,0.12);
-	border: 4px solid #eee;
-	
-	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: #8b743d;
-		
-		-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		color: #8b743d;
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: #8b743d;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/flops14/_support/reveal/css/theme/default.css b/docs/slides/flops14/_support/reveal/css/theme/default.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/theme/default.css
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * The default theme for reveal.js presentations.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@font-face {
-		font-family: 'PTSansNarrow';
-        src: url('../../lib/font/PT_Sans-Narrow-Web-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-@font-face {
-		font-family: 'OpenSans';
-        src: url('../../lib/font/OpenSans-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'Lato', Times, 'Times New Roman', serif;
-	font-size: 36;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #eee;
-
-	background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiM1NTVhNWYiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMWMxZTIwIiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
-	background-color: #2b2b2b;
-	background: -moz-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%, rgba(28,30,32,1) 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(85,90,95,1)), color-stop(100%,rgba(28,30,32,1)));
-	background: -webkit-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -o-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-}
-
-
-/*********************************************
- * main.css OVERIDES
- *********************************************/
-
-
-/* Undo globally centered text from main.css*/
-.reveal .slides {
-	text-align: left;
-}
-
-.reveal li {
-	padding-bottom: 0.7em;
-	line-height: 1em;
-}
-
-.reveal p + ul {
-	padding-left: 4%
-}
-
-
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2 {
-	margin: 0 0 20px 0;
-	color: #eee;
-	font-family: 'League Gothic', Impact, sans-serif;
-	line-height: 0.9em;
-	letter-spacing: 0.02em;
-	
-	text-align: center;
-	text-transform: uppercase;
-	text-shadow: 0px 1px 0px rgba(0,0,0,1);
-}
-
-.reveal h1 {
-	padding-top: 3%%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	color: rgba(255,255,255,0.5);
-}
-
-.reveal h2 {
-	font-family: 'PTSansNarrow';
-	font-size: 130%;
-}
-
-.reveal .titlepage h1,
-.reveal h1.topic {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: hsl(185, 85%, 50%);
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		color: hsl(185, 85%, 70%);
-		
-		text-shadow: none;
-		border: none;
-		border-radius: 2px;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: hsl(185, 60%, 35%);
-}
-
-
-/*********************************************
- * IMAGES
- *********************************************/
-
-.reveal section img {
-	margin: 30px 0 0 0;
-	background: rgba(255,255,255,0.12);
-	border: 4px solid #eee;
-	
-	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: #13DAEC;
-		
-		-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		color: hsl(185, 85%, 70%);
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: hsl(185, 85%, 50%);
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/flops14/_support/reveal/css/theme/seminar.css b/docs/slides/flops14/_support/reveal/css/theme/seminar.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/theme/seminar.css
+++ /dev/null
@@ -1,196 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f0f1eb;
-  background-color: #f0f1eb; }
-
-.reveal {
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-::selection {
-  color: white;
-  background: #26351c;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 40px 0;
-  color: #383d3d;
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	// :color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.05em 0.05em 0.25em blue;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-/*
-.reveal a:not(.image) {
-  line-height: 1.3em; }
-
-
-.reveal a:not(.image) {
-  color: #51483d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #8b7c69;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #25211c; }
-
-*/
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #51483d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #51483d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #51483d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #51483d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #51483d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #8b7c69; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #8b7c69; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #8b7c69; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #8b7c69; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #51483d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #51483d; }
diff --git a/docs/slides/flops14/_support/reveal/css/theme/seminar.orig.css b/docs/slides/flops14/_support/reveal/css/theme/seminar.orig.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/theme/seminar.orig.css
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- * The default theme for reveal.js presentations.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.ttf') format('truetype');
-	font-weight: normal;
-	font-style: normal;
-}
-
-@font-face {
-		font-family: 'PTSansNarrow';
-        src: url('../../lib/font/PT_Sans-Narrow-Web-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-@font-face {
-		font-family: 'OpenSans';
-        src: url('../../lib/font/OpenSans-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'OpenSans', Times, 'Times New Roman', serif;
-	font-size: 36;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #eee;
-
-	background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiM1NTVhNWYiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMWMxZTIwIiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
-	background-color: #2b2b2b;
-	background: -moz-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%, rgba(28,30,32,1) 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(85,90,95,1)), color-stop(100%,rgba(28,30,32,1)));
-	background: -webkit-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -o-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-}
-
-
-/*********************************************
- * main.css OVERIDES
- *********************************************/
-
-
-/*--DW-- uncomment below to undo globally centered text from main.css*/
-
-/*.reveal .slides {
-	text-align: left;
-}
-
-.reveal li {
-	padding-bottom: 0.7em;
-	line-height: 1em;
-}
-.reveal ul ul {
-	padding-left: 8%;
-	padding-top: 0.7em;
-	font-size: 85%;
-}*/
-
-/*--DW--
-* override list width to make multiline list items
-* a bit more manageable
-*/
-.reveal ul {
-	max-width: 80%;
-}
-
-.reveal li {
-	padding-bottom: 0.3em;
-}
-
-/*--DW-- uncenter pararagraph blocks*/
-.reveal .slides p {
-	text-align: left
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2 {
-	margin: 0 0 20px 0;
-	color: #eee;
-	font-family: 'League Gothic', Impact, sans-serif;
-	line-height: 0.9em;
-	letter-spacing: 0.02em;
-	
-	text-align: center;
-	text-transform: uppercase;
-	text-shadow: 0px 1px 0px rgba(0,0,0,1);
-}
-
-.reveal h2 {
-	font-family: 'PTSansNarrow';
-	font-size: 130%;
-}
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-
-
-/*********************************************
- * BLOCKQUOTES
- *********************************************/
-
-/*--DW--*/
-.reveal blockquote
-{   background: rgba(255,255,255, .2);
-    font-size: 75%;
-    text-align: justify;
-    width: 70%;
-    padding: 0.5em 5% 0.2em;
-    margin: 0 10%;
-    border: 2px solid rgba(255, 255, 255, .1);
-    -webkit-box-shadow: .1em .1em .5em black inset;
-    -moz-box-shadow: .1em .1em .5em black inset;
-    box-shadow: .1em .1em .5em black inset;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: hsl(185, 85%, 50%);
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-.reveal a:not(.image):hover {
-	color: hsl(185, 85%, 70%);
-	
-	text-shadow: none;
-	border: none;
-	border-radius: 2px;
-}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: hsl(185, 60%, 35%);
-}
-
-
-/*********************************************
- * IMAGES AND FIGURES
- *********************************************/
-
-/*--DW-- added figures; changed img styling*/
-/*pandoc*/
-.reveal figure {
-	margin-left: auto;
-	margin-right: auto;
-}
-
-/*pandoc*/
-.reveal figcaption {
-	text-align: center;
-	font-size: 75%;
-	font-style: italic;
-}
-.reveal section img,
-.reveal section embed {
-/*	width: 80%;
-	height: 80%;
-*/	display: block;
-	margin-left: auto;
-	margin-right: auto;
-	padding: 15px;
-	background: rgba(255,255,255, .75);
-    border: 2px solid rgba(255, 255, 255, .1);
-    -webkit-box-shadow: .1em .1em .5em black inset;
-       -moz-box-shadow: .1em .1em .5em black inset;
-            box-shadow: .1em .1em .5em black inset;
-
-/*--DW-- original image box styling*/
-/*
--webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-
--webkit-transition: all .2s linear;
-   -moz-transition: all .2s linear;
-    -ms-transition: all .2s linear;
-     -o-transition: all .2s linear;
-        transition: all .2s linear;
-*/
-}
-
-.reveal a:hover img {
-	background: rgba(255,255,255,0.2);
-	border-color: #13DAEC;
-	
-	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		/*color: hsl(185, 85%, 70%);*/
-		color: rgba(138, 201, 85, 0.60);
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		/*background: hsl(185, 85%, 50%);*/
-		background: rgba(138, 201, 85, 0.60);
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/flops14/_support/reveal/css/theme/serif.css b/docs/slides/flops14/_support/reveal/css/theme/serif.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/theme/serif.css
+++ /dev/null
@@ -1,190 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-.reveal a:not(.image) {
-  line-height: 1.3em; 
-}
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f0f1eb;
-  background-color: #f0f1eb; }
-
-.reveal {
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-::selection {
-  color: white;
-  background: #26351c;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 40px 0;
-  color: #383d3d;
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.05em 0.05em 0.25em blue;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #51483d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #8b7c69;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #25211c; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #51483d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #51483d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #51483d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #51483d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #51483d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #8b7c69; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #8b7c69; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #8b7c69; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #8b7c69; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #51483d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #51483d; }
diff --git a/docs/slides/flops14/_support/reveal/css/theme/simple.css b/docs/slides/flops14/_support/reveal/css/theme/simple.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/theme/simple.css
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar 
- * to the default theme. The accent color is darkblue; 
- * do a find-replace to change it.
- * 
- * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
- * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se; so is the theme - beige.css - that this is based off of.
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@import url(http://fonts.googleapis.com/css?family=News+Cycle:400,700);
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'Lato', Times, 'Times New Roman', serif;
-	font-size: 36px;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: black !important;
-
-	background: white;
-}
-
-::-moz-selection {
-    background:rgba(0, 0, 0, 0.99);
-	color: white; 
-}
-::-webkit-selection {
-    background:rgba(0, 0, 0, 0.99);
-	color: white; 
-}
-::selection {
-    background:rgba(0, 0, 0, 0.99);
-	color: white; 
-}
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2, 
-.reveal h3, 
-.reveal h4, 
-.reveal h5, 
-.reveal h6 {
-	margin: 0 0 20px 0;
-	color: black;
-	font-family: 'News Cycle', Impact, sans-serif;
-	line-height: 0.9em;
-	
-	text-transform: uppercase;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: darkblue;
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		text-shadow: none;
-		border: none;
-		border-radius: 2px;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: darkblue;
-}
-
-
-/*********************************************
- * IMAGES
- *********************************************/
-
-.reveal section img {
-	margin: 30px 0 0 0;
-	background: rgba(255,255,255,0.12);
-	border: 4px solid #eee;
-	
-	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: darkblue;
-		
-		-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: black;
-}
-	.reveal .controls a.enabled {
-		color: darkblue;
-		opacity: 1;
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: darkblue;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/flops14/_support/reveal/css/theme/sky.css b/docs/slides/flops14/_support/reveal/css/theme/sky.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/css/theme/sky.css
+++ /dev/null
@@ -1,165 +0,0 @@
-/**
- * Sky theme for reveal.js presentations.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@import url(http://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
-@import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
-
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'Open Sans', sans-serif;
-	font-size: 36px;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #333;
-
-	background: #f7fbfc;
-	background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNmN2ZiZmMiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjYWRkOWU0IiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
-	background: -moz-radial-gradient(center, ellipse cover,  #f7fbfc 0%, #add9e4 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#f7fbfc), color-stop(100%,#add9e4));
-	background: -webkit-radial-gradient(center, ellipse cover,  #f7fbfc 0%,#add9e4 100%);
-	background: -o-radial-gradient(center, ellipse cover,  #f7fbfc 0%,#add9e4 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  #f7fbfc 0%,#add9e4 100%);
-	background: radial-gradient(ellipse at center,  #f7fbfc 0%,#add9e4 100%);
-}
-
-::-moz-selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-::-webkit-selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-::selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2, 
-.reveal h3, 
-.reveal h4, 
-.reveal h5, 
-.reveal h6 {
-	margin: 0 0 20px 0;
-	color: #333;
-	font-family: 'Quicksand', sans-serif;
-	line-height: 0.9em;
-	letter-spacing: -0.08em;
-	
-	text-transform: uppercase;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: #3b759e;
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		text-shadow: none;
-		border: none;
-		border-radius: 2px;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: #3b759e;
-}
-
-
-/*********************************************
- * MISC
- *********************************************/
-
-.reveal section img {
-	margin: 30px 0 0 0;
-	background: rgba(255,255,255,0.12);
-	border: 1px solid #ddd;
-	
-	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: #3b759e;
-		
-		-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-.reveal blockquote {
-	background: rgba(255, 255, 255, 0.4);
-}
-
-.reveal p {
-	margin-bottom: 20px;
-}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		color: #3b759e;
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: #3b759e;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/flops14/_support/reveal/js/.reveal.js.swo b/docs/slides/flops14/_support/reveal/js/.reveal.js.swo
deleted file mode 100644
Binary files a/docs/slides/flops14/_support/reveal/js/.reveal.js.swo and /dev/null differ
diff --git a/docs/slides/flops14/_support/reveal/js/.reveal.js.swp b/docs/slides/flops14/_support/reveal/js/.reveal.js.swp
deleted file mode 100644
Binary files a/docs/slides/flops14/_support/reveal/js/.reveal.js.swp and /dev/null differ
diff --git a/docs/slides/flops14/_support/reveal/js/.reveal.min.js.swo b/docs/slides/flops14/_support/reveal/js/.reveal.min.js.swo
deleted file mode 100644
Binary files a/docs/slides/flops14/_support/reveal/js/.reveal.min.js.swo and /dev/null differ
diff --git a/docs/slides/flops14/_support/reveal/js/.reveal.min.js.swp b/docs/slides/flops14/_support/reveal/js/.reveal.min.js.swp
deleted file mode 100644
Binary files a/docs/slides/flops14/_support/reveal/js/.reveal.min.js.swp and /dev/null differ
diff --git a/docs/slides/flops14/_support/reveal/js/reveal.js b/docs/slides/flops14/_support/reveal/js/reveal.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/js/reveal.js
+++ /dev/null
@@ -1,1149 +0,0 @@
-/*!
- * reveal.js 2.0 r22
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var Reveal = (function(){
-	
-	var HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section',
-		VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section',
-
-		IS_TOUCH_DEVICE = !!( 'ontouchstart' in window ),
-
-		// Configurations defaults, can be overridden at initialization time 
-		config = {
-			// Display controls in the bottom right corner
-			controls: true,
-
-			// Display a presentation progress bar
-			progress: true,
-
-			// Push each slide change to the browser history
-			history: false,
-
-			// Enable keyboard shortcuts for navigation
-			keyboard: true,
-
-			// Loop the presentation
-			loop: false,
-
-			// Number of milliseconds between automatically proceeding to the 
-			// next slide, disabled when set to 0
-			autoSlide: 0,
-
-			// Enable slide navigation via mouse wheel
-			mouseWheel: true,
-
-			// Apply a 3D roll to links on hover
-			rollingLinks: true,
-
-			// Transition style (see /css/theme)
-			theme: 'default', 
-
-			// Transition style
-			transition: 'default', // default/cube/page/concave/linear(2d),
-
-			// Script dependencies to load
-			dependencies: []
-		},
-
-		// The horizontal and verical index of the currently active slide
-		indexh = 0,
-		indexv = 0,
-
-		// The previous and current slide HTML elements
-		previousSlide,
-		currentSlide,
-
-		// Slides may hold a data-state attribute which we pick up and apply 
-		// as a class to the body. This list contains the combined state of 
-		// all current slides.
-		state = [],
-
-		// Cached references to DOM elements
-		dom = {},
-
-		// Detect support for CSS 3D transforms
-		supports3DTransforms =  'WebkitPerspective' in document.body.style ||
-                        		'MozPerspective' in document.body.style ||
-                        		'msPerspective' in document.body.style ||
-                        		'OPerspective' in document.body.style ||
-                        		'perspective' in document.body.style,
-        
-        supports2DTransforms =  'WebkitTransform' in document.body.style ||
-                        		'MozTransform' in document.body.style ||
-                        		'msTransform' in document.body.style ||
-                        		'OTransform' in document.body.style ||
-                        		'transform' in document.body.style,
-		
-		// Throttles mouse wheel navigation
-		mouseWheelTimeout = 0,
-
-		// An interval used to automatically move on to the next slide
-		autoSlideTimeout = 0,
-
-		// Delays updates to the URL due to a Chrome thumbnailer bug
-		writeURLTimeout = 0,
-
-		// Holds information about the currently ongoing touch input
-		touch = {
-			startX: 0,
-			startY: 0,
-			startSpan: 0,
-			startCount: 0,
-			handled: false,
-			threshold: 40
-		};
-	
-	
-	/**
-	 * Starts up the presentation if the client is capable.
-	 */
-	function initialize( options ) {
-		if( ( !supports2DTransforms && !supports3DTransforms ) ) {
-			document.body.setAttribute( 'class', 'no-transforms' );
-
-			// If the browser doesn't support core features we won't be 
-			// using JavaScript to control the presentation
-			return;
-		}
-
-		// Copy options over to our config object
-		extend( config, options );
-
-		// Cache references to DOM elements
-		dom.theme = document.querySelector( '#theme' );
-		dom.wrapper = document.querySelector( '.reveal' );
-		dom.progress = document.querySelector( '.reveal .progress' );
-		dom.progressbar = document.querySelector( '.reveal .progress span' );
-
-		if ( config.controls ) {
-			dom.controls = document.querySelector( '.reveal .controls' );
-			dom.controlsLeft = document.querySelector( '.reveal .controls .left' );
-			dom.controlsRight = document.querySelector( '.reveal .controls .right' );
-			dom.controlsUp = document.querySelector( '.reveal .controls .up' );
-			dom.controlsDown = document.querySelector( '.reveal .controls .down' );
-		}
-
-		// Loads the dependencies and continues to #start() once done
-		load();
-
-		// Set up hiding of the browser address bar
-		if( navigator.userAgent.match( /(iphone|ipod|android)/i ) ) {
-			// Give the page some scrollable overflow
-			document.documentElement.style.overflow = 'scroll';
-			document.body.style.height = '120%';
-
-			// Events that should trigger the address bar to hide
-			window.addEventListener( 'load', removeAddressBar, false );
-			window.addEventListener( 'orientationchange', removeAddressBar, false );
-		}
-		
-	}
-
-	/**
-	 * Loads the dependencies of reveal.js. Dependencies are 
-	 * defined via the configuration option 'dependencies' 
-	 * and will be loaded prior to starting/binding reveal.js. 
-	 * Some dependencies may have an 'async' flag, if so they 
-	 * will load after reveal.js has been started up.
-	 */
-	function load() {
-		var scripts = [],
-			scriptsAsync = [];
-
-		for( var i = 0, len = config.dependencies.length; i < len; i++ ) {
-			var s = config.dependencies[i];
-
-			// Load if there's no condition or the condition is truthy
-			if( !s.condition || s.condition() ) {
-				if( s.async ) {
-					scriptsAsync.push( s.src );
-				}
-				else {
-					scripts.push( s.src );
-				}
-
-				// Extension may contain callback functions
-				if( typeof s.callback === 'function' ) {
-					head.ready( s.src.match( /([\w\d_-]*)\.?[^\\\/]*$/i )[0], s.callback );
-				}
-			}
-		}
-
-		// Called once synchronous scritps finish loading
-		function proceed() {
-			// Load asynchronous scripts
-			head.js.apply( null, scriptsAsync );
-			
-			start();
-		}
-
-		if( scripts.length ) {
-			head.ready( proceed );
-
-			// Load synchronous scripts
-			head.js.apply( null, scripts );
-		}
-		else {
-			proceed();
-		}
-	}
-
-	/**
-	 * Starts up reveal.js by binding input events and navigating 
-	 * to the current URL deeplink if there is one.
-	 */
-	function start() {
-		// Subscribe to input
-		addEventListeners();
-
-		// Updates the presentation to match the current configuration values
-		configure();
-
-		// Read the initial hash
-		readURL();
-
-		// Start auto-sliding if it's enabled
-		cueAutoSlide();
-	}
-
-	/**
-	 * Applies the configuration settings from the config object.
-	 */
-	function configure() {
-		if( supports3DTransforms === false ) {
-			config.transition = 'linear';
-		}
-
-		if( config.controls && dom.controls ) {
-			dom.controls.style.display = 'block';
-		}
-
-		if( config.progress && dom.progress ) {
-			dom.progress.style.display = 'block';
-		}
-
-		// Load the theme in the config, if it's not already loaded
-		if( config.theme && dom.theme ) {
-			var themeURL = dom.theme.getAttribute( 'href' );
-			var themeFinder = /[^/]*?(?=\.css)/;
-			var themeName = themeURL.match(themeFinder)[0];
-			if(  config.theme !== themeName ) {
-				themeURL = themeURL.replace(themeFinder, config.theme);
-				dom.theme.setAttribute( 'href', themeURL );
-			}
-		}
-
-
-		if( config.transition !== 'default' ) {
-			dom.wrapper.classList.add( config.transition );
-		}
-
-		if( config.mouseWheel ) {
-			document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
-			document.addEventListener( 'mousewheel', onDocumentMouseScroll, false );
-		}
-
-		if( config.rollingLinks ) {
-			// Add some 3D magic to our anchors
-			linkify();
-		}
-	}
-
-	function addEventListeners() {
-		document.addEventListener( 'touchstart', onDocumentTouchStart, false );
-		document.addEventListener( 'touchmove', onDocumentTouchMove, false );
-		document.addEventListener( 'touchend', onDocumentTouchEnd, false );
-		window.addEventListener( 'hashchange', onWindowHashChange, false );
-
-		if( config.keyboard ) {
-			document.addEventListener( 'keydown', onDocumentKeyDown, false );
-		}
-
-		if ( config.controls && dom.controls ) {
-			dom.controlsLeft.addEventListener( 'click', preventAndForward( navigateLeft ), false );
-			dom.controlsRight.addEventListener( 'click', preventAndForward( navigateRight ), false );
-			dom.controlsUp.addEventListener( 'click', preventAndForward( navigateUp ), false );
-			dom.controlsDown.addEventListener( 'click', preventAndForward( navigateDown ), false );	
-		}
-	}
-
-	function removeEventListeners() {
-		document.removeEventListener( 'keydown', onDocumentKeyDown, false );
-		document.removeEventListener( 'touchstart', onDocumentTouchStart, false );
-		document.removeEventListener( 'touchmove', onDocumentTouchMove, false );
-		document.removeEventListener( 'touchend', onDocumentTouchEnd, false );
-		window.removeEventListener( 'hashchange', onWindowHashChange, false );
-		
-		if ( config.controls && dom.controls ) {
-			dom.controlsLeft.removeEventListener( 'click', preventAndForward( navigateLeft ), false );
-			dom.controlsRight.removeEventListener( 'click', preventAndForward( navigateRight ), false );
-			dom.controlsUp.removeEventListener( 'click', preventAndForward( navigateUp ), false );
-			dom.controlsDown.removeEventListener( 'click', preventAndForward( navigateDown ), false );
-		}
-	}
-
-	/**
-	 * Extend object a with the properties of object b. 
-	 * If there's a conflict, object b takes precedence.
-	 */
-	function extend( a, b ) {
-		for( var i in b ) {
-			a[ i ] = b[ i ];
-		}
-	}
-
-	/**
-	 * Measures the distance in pixels between point a
-	 * and point b. 
-	 * 
-	 * @param {Object} a point with x/y properties
-	 * @param {Object} b point with x/y properties
-	 */
-	function distanceBetween( a, b ) {
-		var dx = a.x - b.x,
-			dy = a.y - b.y;
-
-		return Math.sqrt( dx*dx + dy*dy );
-	}
-
-	/**
-	 * Prevents an events defaults behavior calls the 
-	 * specified delegate.
-	 * 
-	 * @param {Function} delegate The method to call 
-	 * after the wrapper has been executed
-	 */
-	function preventAndForward( delegate ) {
-		return function( event ) {
-			event.preventDefault();
-			delegate.call();
-		}
-	}
-
-	/**
-	 * Causes the address bar to hide on mobile devices, 
-	 * more vertical space ftw.
-	 */
-	function removeAddressBar() {
-		setTimeout( function() {
-			window.scrollTo( 0, 1 );
-		}, 0 );
-	}
-	
-	/**
-	 * Handler for the document level 'keydown' event.
-	 * 
-	 * @param {Object} event
-	 */
-	function onDocumentKeyDown( event ) {
-		// FFT: Use document.querySelector( ':focus' ) === null 
-		// instead of checking contentEditable?
-
-		// Disregard the event if the target is editable or a 
-		// modifier is present
-		if ( event.target.contentEditable != 'inherit' || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-				
-		var triggered = false;
-
-		switch( event.keyCode ) {
-			// p, page up
-			case 80: case 33: navigatePrev(); triggered = true; break; 
-			// n, page down
-			case 78: case 34: navigateNext(); triggered = true; break;
-			// h, left
-			case 72: case 37: navigateLeft(); triggered = true; break;
-			// l, right
-			case 76: case 39: navigateRight(); triggered = true; break;
-			// k, up
-			case 75: case 38: navigateUp(); triggered = true; break;
-			// j, down
-			case 74: case 40: navigateDown(); triggered = true; break;
-			// home
-			case 36: navigateTo( 0 ); triggered = true; break;
-			// end
-			case 35: navigateTo( Number.MAX_VALUE ); triggered = true; break;
-			// space
-			case 32: overviewIsActive() ? deactivateOverview() : navigateNext(); triggered = true; break;
-			// return
-			case 13: if( overviewIsActive() ) { deactivateOverview(); triggered = true; } break;
-		}
-
-		// If the input resulted in a triggered action we should prevent 
-		// the browsers default behavior
-		if( triggered ) {
-			event.preventDefault();
-		}
-		else if ( event.keyCode === 27 && supports3DTransforms ) {
-			toggleOverview();
-	
-			event.preventDefault();
-		}
-
-		// If auto-sliding is enabled we need to cue up 
-		// another timeout
-		cueAutoSlide();
-
-	}
-
-	/**
-	 * Handler for the document level 'touchstart' event,
-	 * enables support for swipe and pinch gestures.
-	 */
-	function onDocumentTouchStart( event ) {
-		touch.startX = event.touches[0].clientX;
-		touch.startY = event.touches[0].clientY;
-		touch.startCount = event.touches.length;
-
-		// If there's two touches we need to memorize the distance 
-		// between those two points to detect pinching
-		if( event.touches.length === 2 ) {
-			touch.startSpan = distanceBetween( {
-				x: event.touches[1].clientX,
-				y: event.touches[1].clientY
-			}, {
-				x: touch.startX,
-				y: touch.startY
-			} );
-		}
-	}
-	
-	/**
-	 * Handler for the document level 'touchmove' event.
-	 */
-	function onDocumentTouchMove( event ) {
-		// Each touch should only trigger one action
-		if( !touch.handled ) {
-			var currentX = event.touches[0].clientX;
-			var currentY = event.touches[0].clientY;
-
-			// If the touch started off with two points and still has 
-			// two active touches; test for the pinch gesture
-			if( event.touches.length === 2 && touch.startCount === 2 ) {
-
-				// The current distance in pixels between the two touch points
-				var currentSpan = distanceBetween( {
-					x: event.touches[1].clientX,
-					y: event.touches[1].clientY
-				}, {
-					x: touch.startX,
-					y: touch.startY
-				} );
-
-				// If the span is larger than the desire amount we've got 
-				// ourselves a pinch
-				if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) {
-					touch.handled = true;
-
-					if( currentSpan < touch.startSpan ) {
-						activateOverview();
-					}
-					else {
-						deactivateOverview();
-					}
-				}
-
-			}
-			// There was only one touch point, look for a swipe
-			else if( event.touches.length === 1 ) {
-				var deltaX = currentX - touch.startX,
-					deltaY = currentY - touch.startY;
-
-				if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
-					touch.handled = true;
-					navigateLeft();
-				} 
-				else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
-					touch.handled = true;
-					navigateRight();
-				} 
-				else if( deltaY > touch.threshold ) {
-					touch.handled = true;
-					navigateUp();
-				} 
-				else if( deltaY < -touch.threshold ) {
-					touch.handled = true;
-					navigateDown();
-				}
-			}
-
-			event.preventDefault();
-		}
-	}
-
-	/**
-	 * Handler for the document level 'touchend' event.
-	 */
-	function onDocumentTouchEnd( event ) {
-		touch.handled = false;
-	}
-
-	/**
-	 * Handles mouse wheel scrolling, throttled to avoid 
-	 * skipping multiple slides.
-	 */
-	function onDocumentMouseScroll( event ){
-		clearTimeout( mouseWheelTimeout );
-
-		mouseWheelTimeout = setTimeout( function() {
-			var delta = event.detail || -event.wheelDelta;
-			if( delta > 0 ) {
-				navigateNext();
-			}
-			else {
-				navigatePrev();
-			}
-		}, 100 );
-	}
-	
-	/**
-	 * Handler for the window level 'hashchange' event.
-	 * 
-	 * @param {Object} event
-	 */
-	function onWindowHashChange( event ) {
-		readURL();
-	}
-
-	/**
-	 * Wrap all links in 3D goodness.
-	 */
-	function linkify() {
-		if( supports3DTransforms && !( 'msPerspective' in document.body.style ) ) {
-        	var nodes = document.querySelectorAll( '.reveal .slides section a:not(.image)' );
-
-	        for( var i = 0, len = nodes.length; i < len; i++ ) {
-	            var node = nodes[i];
-	            
-	            if( node.textContent && !node.querySelector( 'img' ) && ( !node.className || !node.classList.contains( node, 'roll' ) ) ) {
-	                node.classList.add( 'roll' );
-	                node.innerHTML = '<span data-title="'+ node.text +'">' + node.innerHTML + '</span>';
-	            }
-	        };
-        }
-	}
-
-	/**
-	 * Displays the overview of slides (quick nav) by 
-	 * scaling down and arranging all slide elements.
-	 * 
-	 * Experimental feature, might be dropped if perf 
-	 * can't be improved.
-	 */
-	function activateOverview() {
-		
-		dom.wrapper.classList.add( 'overview' );
-
-		var horizontalSlides = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-
-		for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) {
-			var hslide = horizontalSlides[i],
-				htransform = 'translateZ(-2500px) translate(' + ( ( i - indexh ) * 105 ) + '%, 0%)';
-			
-			hslide.setAttribute( 'data-index-h', i );
-			hslide.style.display = 'block';
-			hslide.style.WebkitTransform = htransform;
-			hslide.style.MozTransform = htransform;
-			hslide.style.msTransform = htransform;
-			hslide.style.OTransform = htransform;
-			hslide.style.transform = htransform;
-		
-			if( !hslide.classList.contains( 'stack' ) ) {
-				// Navigate to this slide on click
-				hslide.addEventListener( 'click', onOverviewSlideClicked, true );
-			}
-	
-			var verticalSlides = Array.prototype.slice.call( hslide.querySelectorAll( 'section' ) );
-
-			for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) {
-				var vslide = verticalSlides[j],
-					vtransform = 'translate(0%, ' + ( ( j - ( i === indexh ? indexv : 0 ) ) * 105 ) + '%)';
-
-				vslide.setAttribute( 'data-index-h', i );
-				vslide.setAttribute( 'data-index-v', j );
-				vslide.style.display = 'block';
-				vslide.style.WebkitTransform = vtransform;
-				vslide.style.MozTransform = vtransform;
-				vslide.style.msTransform = vtransform;
-				vslide.style.OTransform = vtransform;
-				vslide.style.transform = vtransform;
-
-				// Navigate to this slide on click
-				vslide.addEventListener( 'click', onOverviewSlideClicked, true );
-			}
-			
-		}
-	}
-	
-	/**
-	 * Exits the slide overview and enters the currently
-	 * active slide.
-	 */
-	function deactivateOverview() {
-		dom.wrapper.classList.remove( 'overview' );
-
-		var slides = Array.prototype.slice.call( document.querySelectorAll( '.reveal .slides section' ) );
-
-		for( var i = 0, len = slides.length; i < len; i++ ) {
-			var element = slides[i];
-
-			// Resets all transforms to use the external styles
-			element.style.WebkitTransform = '';
-			element.style.MozTransform = '';
-			element.style.msTransform = '';
-			element.style.OTransform = '';
-			element.style.transform = '';
-
-			element.removeEventListener( 'click', onOverviewSlideClicked );
-		}
-
-		slide();
-	}
-
-	/**
-	 * Checks if the overview is currently active.
-	 * 
-	 * @return {Boolean} true if the overview is active,
-	 * false otherwise
-	 */
-	function overviewIsActive() {
-		return dom.wrapper.classList.contains( 'overview' );
-	}
-
-	/**
-	 * Invoked when a slide is and we're in the overview.
-	 */
-	function onOverviewSlideClicked( event ) {
-		// TODO There's a bug here where the event listeners are not 
-		// removed after deactivating the overview.
-		if( overviewIsActive() ) {
-			event.preventDefault();
-
-			deactivateOverview();
-
-			indexh = this.getAttribute( 'data-index-h' );
-			indexv = this.getAttribute( 'data-index-v' );
-
-			slide();
-		}
-	}
-
-	/**
-	 * Updates one dimension of slides by showing the slide
-	 * with the specified index.
-	 * 
-	 * @param {String} selector A CSS selector that will fetch
-	 * the group of slides we are working with
-	 * @param {Number} index The index of the slide that should be
-	 * shown
-	 * 
-	 * @return {Number} The index of the slide that is now shown,
-	 * might differ from the passed in index if it was out of 
-	 * bounds.
-	 */
-	function updateSlides( selector, index ) {
-		
-		// Select all slides and convert the NodeList result to
-		// an array
-		var slides = Array.prototype.slice.call( document.querySelectorAll( selector ) ),
-			slidesLength = slides.length;
-		
-		if( slidesLength ) {
-
-			// Should the index loop?
-			if( config.loop ) {
-				index %= slidesLength;
-
-				if( index < 0 ) {
-					index = slidesLength + index;
-				}
-			}
-			
-			// Enforce max and minimum index bounds
-			index = Math.max( Math.min( index, slidesLength - 1 ), 0 );
-			
-			for( var i = 0; i < slidesLength; i++ ) {
-				var slide = slides[i];
-
-				// Optimization; hide all slides that are three or more steps 
-				// away from the present slide
-				if( overviewIsActive() === false ) {
-					// The distance loops so that it measures 1 between the first
-					// and last slides
-					var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0;
-
-					slide.style.display = distance > 3 ? 'none' : 'block';
-				}
-
-				slides[i].classList.remove( 'past' );
-				slides[i].classList.remove( 'present' );
-				slides[i].classList.remove( 'future' );
-
-				if( i < index ) {
-					// Any element previous to index is given the 'past' class
-					slides[i].classList.add( 'past' );
-				}
-				else if( i > index ) {
-					// Any element subsequent to index is given the 'future' class
-					slides[i].classList.add( 'future' );
-				}
-
-				// If this element contains vertical slides
-				if( slide.querySelector( 'section' ) ) {
-					slides[i].classList.add( 'stack' );
-				}
-			}
-
-			// Mark the current slide as present
-			slides[index].classList.add( 'present' );
-
-			// If this slide has a state associated with it, add it
-			// onto the current state of the deck
-			var slideState = slides[index].getAttribute( 'data-state' );
-			if( slideState ) {
-				state = state.concat( slideState.split( ' ' ) );
-			}
-		}
-		else {
-			// Since there are no slides we can't be anywhere beyond the 
-			// zeroth index
-			index = 0;
-		}
-		
-		return index;
-		
-	}
-	
-	/**
-	 * Updates the visual slides to represent the currently
-	 * set indices. 
-	 */
-	function slide( h, v ) {
-		// Remember where we were at before
-		previousSlide = currentSlide;
-
-		// Remember the state before this slide
-		var stateBefore = state.concat();
-
-		// Reset the state array
-		state.length = 0;
-
-		var indexhBefore = indexh,
-			indexvBefore = indexv;
-
-		// Activate and transition to the new slide
-		indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );
-		indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );
-
-		// Apply the new state
-		stateLoop: for( var i = 0, len = state.length; i < len; i++ ) {
-			// Check if this state existed on the previous slide. If it 
-			// did, we will avoid adding it repeatedly.
-			for( var j = 0; j < stateBefore.length; j++ ) {
-				if( stateBefore[j] === state[i] ) {
-					stateBefore.splice( j, 1 );
-					continue stateLoop;
-				}
-			}
-
-			document.documentElement.classList.add( state[i] );
-
-			// Dispatch custom event matching the state's name
-			dispatchEvent( state[i] );
-		}
-
-		// Clean up the remaints of the previous state
-		while( stateBefore.length ) {
-			document.documentElement.classList.remove( stateBefore.pop() );
-		}
-
-		// Update progress if enabled
-		if( config.progress && dom.progress ) {
-			dom.progressbar.style.width = ( indexh / ( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ).length - 1 ) ) * window.innerWidth + 'px';
-		}
-
-		// Close the overview if it's active
-		if( overviewIsActive() ) {
-			activateOverview();
-		}
-
-		updateControls();
-		
-		clearTimeout( writeURLTimeout );
-		writeURLTimeout = setTimeout( writeURL, 1500 );
-
-		// Query all horizontal slides in the deck
-		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-
-		// Find the current horizontal slide and any possible vertical slides
-		// within it
-		var currentHorizontalSlide = horizontalSlides[ indexh ],
-			currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );
-
-		// Store references to the previous and current slides
-		currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;
-
-		// Dispatch an event if the slide changed
-		if( indexh !== indexhBefore || indexv !== indexvBefore ) {
-			dispatchEvent( 'slidechanged', {
-				'indexh': indexh, 
-				'indexv': indexv,
-				'previousSlide': previousSlide,
-				'currentSlide': currentSlide
-			} );
-		}
-		else {
-			// Ensure that the previous slide is never the same as the current
-			previousSlide = null;
-		}
-
-		// Solves an edge case where the previous slide maintains the 
-		// 'present' class when navigating between adjacent vertical 
-		// stacks
-		if( previousSlide ) {
-			previousSlide.classList.remove( 'present' );
-		}
-	}
-
-	/**
-	 * Updates the state and link pointers of the controls.
-	 */
-	function updateControls() {
-		if ( !config.controls || !dom.controls ) {
-			return;
-		}
-		
-		var routes = availableRoutes();
-
-		// Remove the 'enabled' class from all directions
-		[ dom.controlsLeft, dom.controlsRight, dom.controlsUp, dom.controlsDown ].forEach( function( node ) {
-			node.classList.remove( 'enabled' );
-		} )
-
-		if( routes.left ) dom.controlsLeft.classList.add( 'enabled' );
-		if( routes.right ) dom.controlsRight.classList.add( 'enabled' );
-		if( routes.up ) dom.controlsUp.classList.add( 'enabled' );
-		if( routes.down ) dom.controlsDown.classList.add( 'enabled' );
-	}
-
-	/**
-	 * Determine what available routes there are for navigation.
-	 * 
-	 * @return {Object} containing four booleans: left/right/up/down
-	 */
-	function availableRoutes() {
-		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-		var verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR );
-
-		return {
-			left: indexh > 0,
-			right: indexh < horizontalSlides.length - 1,
-			up: indexv > 0,
-			down: indexv < verticalSlides.length - 1
-		};
-	}
-	
-	/**
-	 * Reads the current URL (hash) and navigates accordingly.
-	 */
-	function readURL() {
-		var hash = window.location.hash;
-
-		// Attempt to parse the hash as either an index or name
-		var bits = hash.slice( 2 ).split( '/' ),
-			name = hash.replace( /#|\//gi, '' );
-
-		// If the first bit is invalid and there is a name we can 
-		// assume that this is a named link
-		if( isNaN( parseInt( bits[0] ) ) && name.length ) {
-			// Find the slide with the specified name
-			var slide = document.querySelector( '#' + name );
-
-			if( slide ) {
-				// Find the position of the named slide and navigate to it
-				var indices = Reveal.getIndices( slide );
-				navigateTo( indices.h, indices.v );
-			}
-			// If the slide doesn't exist, navigate to the current slide
-			else {
-				navigateTo( indexh, indexv );
-			}
-		}
-		else {
-			// Read the index components of the hash
-			var h = parseInt( bits[0] ) || 0,
-				v = parseInt( bits[1] ) || 0;
-
-			navigateTo( h, v );
-		}
-	}
-	
-	/**
-	 * Updates the page URL (hash) to reflect the current
-	 * state. 
-	 */
-	function writeURL() {
-		if( config.history ) {
-			var url = '/';
-			
-			// Only include the minimum possible number of components in
-			// the URL
-			if( indexh > 0 || indexv > 0 ) url += indexh;
-			if( indexv > 0 ) url += '/' + indexv;
-			
-			window.location.hash = url;
-		}
-	}
-
-	/**
-	 * Dispatches an event of the specified type from the 
-	 * reveal DOM element.
-	 */
-	function dispatchEvent( type, properties ) {
-		var event = document.createEvent( "HTMLEvents", 1, 2 );
-		event.initEvent( type, true, true );
-		extend( event, properties );
-		dom.wrapper.dispatchEvent( event );
-	}
-
-	/**
-	 * Navigate to the next slide fragment.
-	 * 
-	 * @return {Boolean} true if there was a next fragment,
-	 * false otherwise
-	 */
-	function nextFragment() {
-		// Vertical slides:
-		if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) {
-			var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' );
-			if( verticalFragments.length ) {
-				verticalFragments[0].classList.add( 'visible' );
-
-				// Notify subscribers of the change
-				dispatchEvent( 'fragmentshown', { fragment: verticalFragments[0] } );
-				return true;
-			}
-		}
-		// Horizontal slides:
-		else {
-			var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' );
-			if( horizontalFragments.length ) {
-				horizontalFragments[0].classList.add( 'visible' );
-
-				// Notify subscribers of the change
-				dispatchEvent( 'fragmentshown', { fragment: horizontalFragments[0] } );
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Navigate to the previous slide fragment.
-	 * 
-	 * @return {Boolean} true if there was a previous fragment,
-	 * false otherwise
-	 */
-	function previousFragment() {
-		// Vertical slides:
-		if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) {
-			var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment.visible' );
-			if( verticalFragments.length ) {
-				verticalFragments[ verticalFragments.length - 1 ].classList.remove( 'visible' );
-
-				// Notify subscribers of the change
-				dispatchEvent( 'fragmenthidden', { fragment: verticalFragments[ verticalFragments.length - 1 ] } );
-				return true;
-			}
-		}
-		// Horizontal slides:
-		else {
-			var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment.visible' );
-			if( horizontalFragments.length ) {
-				horizontalFragments[ horizontalFragments.length - 1 ].classList.remove( 'visible' );
-
-				// Notify subscribers of the change
-				dispatchEvent( 'fragmenthidden', { fragment: horizontalFragments[ horizontalFragments.length - 1 ] } );
-				return true;
-			}
-		}
-		
-		return false;
-	}
-
-	function cueAutoSlide() {
-		clearTimeout( autoSlideTimeout );
-
-		// Cue the next auto-slide if enabled
-		if( config.autoSlide ) {
-			autoSlideTimeout = setTimeout( navigateNext, config.autoSlide );
-		}
-	}
-	
-	/**
-	 * Triggers a navigation to the specified indices.
-	 * 
-	 * @param {Number} h The horizontal index of the slide to show
-	 * @param {Number} v The vertical index of the slide to show
-	 */
-	function navigateTo( h, v ) {
-		slide( h, v );
-	}
-	
-	function navigateLeft() {
-		// Prioritize hiding fragments
-		if( overviewIsActive() || previousFragment() === false ) {
-			slide( indexh - 1, 0 );
-		}
-	}
-	function navigateRight() {
-		// Prioritize revealing fragments
-		if( overviewIsActive() || nextFragment() === false ) {
-			slide( indexh + 1, 0 );
-		}
-	}
-	function navigateUp() {
-		// Prioritize hiding fragments
-		if( overviewIsActive() || previousFragment() === false ) {
-			slide( indexh, indexv - 1 );
-		}
-	}
-	function navigateDown() {
-		// Prioritize revealing fragments
-		if( overviewIsActive() || nextFragment() === false ) {
-			slide( indexh, indexv + 1 );
-		}
-	}
-
-	/**
-	 * Navigates backwards, prioritized in the following order:
-	 * 1) Previous fragment
-	 * 2) Previous vertical slide
-	 * 3) Previous horizontal slide
-	 */
-	function navigatePrev() {
-		// Prioritize revealing fragments
-		if( previousFragment() === false ) {
-			if( availableRoutes().up ) {
-				navigateUp();
-			}
-			else {
-				// Fetch the previous horizontal slide, if there is one
-				var previousSlide = document.querySelector( '.reveal .slides>section.past:nth-child(' + indexh + ')' );
-
-				if( previousSlide ) {
-					indexv = ( previousSlide.querySelectorAll('section').length + 1 ) || 0;
-					indexh --;
-					slide();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Same as #navigatePrev() but navigates forwards.
-	 */
-	function navigateNext() {
-		// Prioritize revealing fragments
-		if( nextFragment() === false ) {
-			availableRoutes().down ? navigateDown() : navigateRight();
-		}
-
-		// If auto-sliding is enabled we need to cue up 
-		// another timeout
-		cueAutoSlide();
-	}
-
-	/**
-	 * Toggles the slide overview mode on and off.
-	 */
-	function toggleOverview() {
-		if( overviewIsActive() ) {
-			deactivateOverview();
-		}
-		else {
-			activateOverview();
-		}
-	}
-	
-	// Expose some methods publicly
-	return {
-		initialize: initialize,
-		navigateTo: navigateTo,
-		navigateLeft: navigateLeft,
-		navigateRight: navigateRight,
-		navigateUp: navigateUp,
-		navigateDown: navigateDown,
-		navigatePrev: navigatePrev,
-		navigateNext: navigateNext,
-		toggleOverview: toggleOverview,
-
-		// Adds or removes all internal event listeners (such as keyboard)
-		addEventListeners: addEventListeners,
-		removeEventListeners: removeEventListeners,
-
-		// Returns the indices of the current, or specified, slide
-		getIndices: function( slide ) {
-			// By default, return the current indices
-			var h = indexh,
-				v = indexv;
-
-			// If a slide is specified, return the indices of that slide
-			if( slide ) {
-				var isVertical = !!slide.parentNode.nodeName.match( /section/gi );
-				var slideh = isVertical ? slide.parentNode : slide;
-
-				// Select all horizontal slides
-				var horizontalSlides = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-
-				// Now that we know which the horizontal slide is, get its index
-				h = Math.max( horizontalSlides.indexOf( slideh ), 0 );
-
-				// If this is a vertical slide, grab the vertical index
-				if( isVertical ) {
-					v = Math.max( Array.prototype.slice.call( slide.parentNode.children ).indexOf( slide ), 0 );
-				}
-			}
-
-			return { h: h, v: v };
-		},
-
-		// Returns the previous slide element, may be null
-		getPreviousSlide: function() {
-			return previousSlide
-		},
-
-		// Returns the current slide element
-		getCurrentSlide: function() {
-			return currentSlide
-		},
-
-		// Helper method, retrieves query string as a key/value hash
-		getQueryHash: function() {
-			var query = {};
-
-			location.search.replace( /[A-Z0-9]+?=(\w*)/gi, function(a) {
-				query[ a.split( '=' ).shift() ] = a.split( '=' ).pop();
-			} );
-
-			return query;
-		},
-
-		// Forward event binding to the reveal DOM element
-		addEventListener: function( type, listener, useCapture ) {
-			if( 'addEventListener' in window ) {
-				( dom.wrapper || document.querySelector( '.reveal' ) ).addEventListener( type, listener, useCapture );
-			}
-		},
-		removeEventListener: function( type, listener, useCapture ) {
-			if( 'addEventListener' in window ) {
-				( dom.wrapper || document.querySelector( '.reveal' ) ).removeEventListener( type, listener, useCapture );
-			}
-		}
-	};
-	
-})();
diff --git a/docs/slides/flops14/_support/reveal/js/reveal.min.js b/docs/slides/flops14/_support/reveal/js/reveal.min.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/js/reveal.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*!
- * reveal.js 2.0 r22
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var Reveal=(function(){var k=".reveal .slides>section",b=".reveal .slides>section.present>section",e=!!("ontouchstart" in window),N={controls:true,progress:true,history:false,keyboard:true,loop:false,autoSlide:0,mouseWheel:true,rollingLinks:true,theme:"default",transition:"default",dependencies:[]},l=0,c=0,w,E,ac=[],d={},P="WebkitPerspective" in document.body.style||"MozPerspective" in document.body.style||"msPerspective" in document.body.style||"OPerspective" in document.body.style||"perspective" in document.body.style,m="WebkitTransform" in document.body.style||"MozTransform" in document.body.style||"msTransform" in document.body.style||"OTransform" in document.body.style||"transform" in document.body.style,x=0,j=0,B=0,W={startX:0,startY:0,startSpan:0,startCount:0,handled:false,threshold:40};function h(ad){if((!m&&!P)){document.body.setAttribute("class","no-transforms");return}r(N,ad);d.theme=document.querySelector("#theme");d.wrapper=document.querySelector(".reveal");d.progress=document.querySelector(".reveal .progress");d.progressbar=document.querySelector(".reveal .progress span");if(N.controls){d.controls=document.querySelector(".reveal .controls");d.controlsLeft=document.querySelector(".reveal .controls .left");d.controlsRight=document.querySelector(".reveal .controls .right");d.controlsUp=document.querySelector(".reveal .controls .up");d.controlsDown=document.querySelector(".reveal .controls .down")}R();if(navigator.userAgent.match(/(iphone|ipod|android)/i)){document.documentElement.style.overflow="scroll";document.body.style.height="120%";window.addEventListener("load",X,false);window.addEventListener("orientationchange",X,false)}}function R(){var ae=[],ai=[];for(var af=0,ad=N.dependencies.length;af<ad;af++){var ag=N.dependencies[af];if(!ag.condition||ag.condition()){if(ag.async){ai.push(ag.src)}else{ae.push(ag.src)}if(typeof ag.callback==="function"){head.ready(ag.src.match(/([\w\d_-]*)\.?[^\\\/]*$/i)[0],ag.callback)}}}function ah(){head.js.apply(null,ai);F()}if(ae.length){head.ready(ah);head.js.apply(null,ae)}else{ah()}}function F(){C();I();H();K()}function I(){if(P===false){N.transition="linear"}if(N.controls&&d.controls){d.controls.style.display="block"}if(N.progress&&d.progress){d.progress.style.display="block"}if(N.theme&&d.theme){var af=d.theme.getAttribute("href");var ad=/[^/]*?(?=\.css)/;var ae=af.match(ad)[0];if(N.theme!==ae){af=af.replace(ad,N.theme);d.theme.setAttribute("href",af)}}if(N.transition!=="default"){d.wrapper.classList.add(N.transition)}if(N.mouseWheel){document.addEventListener("DOMMouseScroll",n,false);document.addEventListener("mousewheel",n,false)}if(N.rollingLinks){J()}}function C(){document.addEventListener("touchstart",y,false);document.addEventListener("touchmove",Z,false);document.addEventListener("touchend",S,false);window.addEventListener("hashchange",u,false);if(N.keyboard){document.addEventListener("keydown",aa,false)}if(N.controls&&d.controls){d.controlsLeft.addEventListener("click",o(z),false);d.controlsRight.addEventListener("click",o(i),false);d.controlsUp.addEventListener("click",o(s),false);d.controlsDown.addEventListener("click",o(D),false)}}function Q(){document.removeEventListener("keydown",aa,false);document.removeEventListener("touchstart",y,false);document.removeEventListener("touchmove",Z,false);document.removeEventListener("touchend",S,false);window.removeEventListener("hashchange",u,false);if(N.controls&&d.controls){d.controlsLeft.removeEventListener("click",o(z),false);d.controlsRight.removeEventListener("click",o(i),false);d.controlsUp.removeEventListener("click",o(s),false);d.controlsDown.removeEventListener("click",o(D),false)}}function r(ae,ad){for(var af in ad){ae[af]=ad[af]}}function O(af,ad){var ag=af.x-ad.x,ae=af.y-ad.y;return Math.sqrt(ag*ag+ae*ae)}function o(ad){return function(ae){ae.preventDefault();ad.call()}}function X(){setTimeout(function(){window.scrollTo(0,1)},0)}function aa(ae){if(ae.target.contentEditable!="inherit"||ae.shiftKey||ae.altKey||ae.ctrlKey||ae.metaKey){return}var ad=false;switch(ae.keyCode){case 80:case 33:U();ad=true;break;case 78:case 34:v();ad=true;break;case 72:case 37:z();ad=true;break;case 76:case 39:i();ad=true;break;case 75:case 38:s();ad=true;break;case 74:case 40:D();ad=true;break;case 36:L(0);ad=true;break;case 35:L(Number.MAX_VALUE);ad=true;break;case 32:V()?Y():v();ad=true;break;case 13:if(V()){Y();ad=true}break}if(ad){ae.preventDefault()}else{if(ae.keyCode===27&&P){T();ae.preventDefault()}}K()}function y(ad){W.startX=ad.touches[0].clientX;W.startY=ad.touches[0].clientY;W.startCount=ad.touches.length;if(ad.touches.length===2){W.startSpan=O({x:ad.touches[1].clientX,y:ad.touches[1].clientY},{x:W.startX,y:W.startY})}}function Z(ai){if(!W.handled){var ag=ai.touches[0].clientX;var af=ai.touches[0].clientY;if(ai.touches.length===2&&W.startCount===2){var ah=O({x:ai.touches[1].clientX,y:ai.touches[1].clientY},{x:W.startX,y:W.startY});if(Math.abs(W.startSpan-ah)>W.threshold){W.handled=true;if(ah<W.startSpan){G()}else{Y()}}}else{if(ai.touches.length===1){var ae=ag-W.startX,ad=af-W.startY;if(ae>W.threshold&&Math.abs(ae)>Math.abs(ad)){W.handled=true;z()}else{if(ae<-W.threshold&&Math.abs(ae)>Math.abs(ad)){W.handled=true;i()}else{if(ad>W.threshold){W.handled=true;s()}else{if(ad<-W.threshold){W.handled=true;D()}}}}}}ai.preventDefault()}}function S(ad){W.handled=false}function n(ad){clearTimeout(x);x=setTimeout(function(){var ae=ad.detail||-ad.wheelDelta;if(ae>0){v()}else{U()}},100)}function u(ad){H()}function J(){if(P&&!("msPerspective" in document.body.style)){var ae=document.querySelectorAll(".reveal .slides section a:not(.image)");for(var af=0,ad=ae.length;af<ad;af++){var ag=ae[af];if(ag.textContent&&!ag.querySelector("img")&&(!ag.className||!ag.classList.contains(ag,"roll"))){ag.classList.add("roll");ag.innerHTML='<span data-title="'+ag.text+'">'+ag.innerHTML+"</span>"}}}}function G(){d.wrapper.classList.add("overview");var ad=Array.prototype.slice.call(document.querySelectorAll(k));for(var ai=0,ag=ad.length;ai<ag;ai++){var af=ad[ai],am="translateZ(-2500px) translate("+((ai-l)*105)+"%, 0%)";af.setAttribute("data-index-h",ai);af.style.display="block";af.style.WebkitTransform=am;af.style.MozTransform=am;af.style.msTransform=am;af.style.OTransform=am;af.style.transform=am;if(!af.classList.contains("stack")){af.addEventListener("click",A,true)}var al=Array.prototype.slice.call(af.querySelectorAll("section"));for(var ah=0,ae=al.length;ah<ae;ah++){var ak=al[ah],aj="translate(0%, "+((ah-(ai===l?c:0))*105)+"%)";ak.setAttribute("data-index-h",ai);ak.setAttribute("data-index-v",ah);ak.style.display="block";ak.style.WebkitTransform=aj;ak.style.MozTransform=aj;ak.style.msTransform=aj;ak.style.OTransform=aj;ak.style.transform=aj;ak.addEventListener("click",A,true)}}}function Y(){d.wrapper.classList.remove("overview");var ag=Array.prototype.slice.call(document.querySelectorAll(".reveal .slides section"));for(var af=0,ad=ag.length;af<ad;af++){var ae=ag[af];ae.style.WebkitTransform="";ae.style.MozTransform="";ae.style.msTransform="";ae.style.OTransform="";ae.style.transform="";ae.removeEventListener("click",A)}a()}function V(){return d.wrapper.classList.contains("overview")}function A(ad){if(V()){ad.preventDefault();Y();l=this.getAttribute("data-index-h");c=this.getAttribute("data-index-v");a()}}function ab(ae,ag){var ai=Array.prototype.slice.call(document.querySelectorAll(ae)),aj=ai.length;if(aj){if(N.loop){ag%=aj;if(ag<0){ag=aj+ag}}ag=Math.max(Math.min(ag,aj-1),0);for(var ah=0;ah<aj;ah++){var ad=ai[ah];if(V()===false){var ak=Math.abs((ag-ah)%(aj-3))||0;ad.style.display=ak>3?"none":"block"}ai[ah].classList.remove("past");ai[ah].classList.remove("present");ai[ah].classList.remove("future");if(ah<ag){ai[ah].classList.add("past")}else{if(ah>ag){ai[ah].classList.add("future")}}if(ad.querySelector("section")){ai[ah].classList.add("stack")}}ai[ag].classList.add("present");var af=ai[ag].getAttribute("data-state");if(af){ac=ac.concat(af.split(" "))}}else{ag=0}return ag}function a(aj,an){w=E;var ag=ac.concat();ac.length=0;var am=l,ae=c;l=ab(k,aj===undefined?l:aj);c=ab(b,an===undefined?c:an);stateLoop:for(var ah=0,ak=ac.length;ah<ak;ah++){for(var af=0;af<ag.length;af++){if(ag[af]===ac[ah]){ag.splice(af,1);continue stateLoop}}document.documentElement.classList.add(ac[ah]);p(ac[ah])}while(ag.length){document.documentElement.classList.remove(ag.pop())}if(N.progress&&d.progress){d.progressbar.style.width=(l/(document.querySelectorAll(k).length-1))*window.innerWidth+"px"}if(V()){G()}q();clearTimeout(B);B=setTimeout(g,1500);var ad=document.querySelectorAll(k);var al=ad[l],ai=al.querySelectorAll("section");E=ai[c]||al;if(l!==am||c!==ae){p("slidechanged",{indexh:l,indexv:c,previousSlide:w,currentSlide:E})}else{w=null}if(w){w.classList.remove("present")}}function q(){if(!N.controls||!d.controls){return}var ad=f();[d.controlsLeft,d.controlsRight,d.controlsUp,d.controlsDown].forEach(function(ae){ae.classList.remove("enabled")});if(ad.left){d.controlsLeft.classList.add("enabled")}if(ad.right){d.controlsRight.classList.add("enabled")}if(ad.up){d.controlsUp.classList.add("enabled")}if(ad.down){d.controlsDown.classList.add("enabled")}}function f(){var ad=document.querySelectorAll(k);var ae=document.querySelectorAll(b);return{left:l>0,right:l<ad.length-1,up:c>0,down:c<ae.length-1}}function H(){var ai=window.location.hash;var ah=ai.slice(2).split("/"),af=ai.replace(/#|\//gi,"");if(isNaN(parseInt(ah[0]))&&af.length){var ad=document.querySelector("#"+af);if(ad){var aj=Reveal.getIndices(ad);L(aj.h,aj.v)}else{L(l,c)}}else{var ag=parseInt(ah[0])||0,ae=parseInt(ah[1])||0;L(ag,ae)}}function g(){if(N.history){var ad="/";if(l>0||c>0){ad+=l}if(c>0){ad+="/"+c}window.location.hash=ad}}function p(ae,ad){var af=document.createEvent("HTMLEvents",1,2);af.initEvent(ae,true,true);r(af,ad);d.wrapper.dispatchEvent(af)}function t(){if(document.querySelector(b+".present")){var ae=document.querySelectorAll(b+".present .fragment:not(.visible)");if(ae.length){ae[0].classList.add("visible");p("fragmentshown",{fragment:ae[0]});return true}}else{var ad=document.querySelectorAll(k+".present .fragment:not(.visible)");if(ad.length){ad[0].classList.add("visible");p("fragmentshown",{fragment:ad[0]});return true}}return false}function M(){if(document.querySelector(b+".present")){var ae=document.querySelectorAll(b+".present .fragment.visible");if(ae.length){ae[ae.length-1].classList.remove("visible");p("fragmenthidden",{fragment:ae[ae.length-1]});return true}}else{var ad=document.querySelectorAll(k+".present .fragment.visible");if(ad.length){ad[ad.length-1].classList.remove("visible");p("fragmenthidden",{fragment:ad[ad.length-1]});return true}}return false}function K(){clearTimeout(j);if(N.autoSlide){j=setTimeout(v,N.autoSlide)}}function L(ae,ad){a(ae,ad)}function z(){if(V()||M()===false){a(l-1,0)}}function i(){if(V()||t()===false){a(l+1,0)}}function s(){if(V()||M()===false){a(l,c-1)}}function D(){if(V()||t()===false){a(l,c+1)}}function U(){if(M()===false){if(f().up){s()}else{var ad=document.querySelector(".reveal .slides>section.past:nth-child("+l+")");if(ad){c=(ad.querySelectorAll("section").length+1)||0;l--;a()}}}}function v(){if(t()===false){f().down?D():i()}K()}function T(){if(V()){Y()}else{G()}}return{initialize:h,navigateTo:L,navigateLeft:z,navigateRight:i,navigateUp:s,navigateDown:D,navigatePrev:U,navigateNext:v,toggleOverview:T,addEventListeners:C,removeEventListeners:Q,getIndices:function(ad){var ah=l,af=c;if(ad){var ai=!!ad.parentNode.nodeName.match(/section/gi);var ag=ai?ad.parentNode:ad;var ae=Array.prototype.slice.call(document.querySelectorAll(k));ah=Math.max(ae.indexOf(ag),0);if(ai){af=Math.max(Array.prototype.slice.call(ad.parentNode.children).indexOf(ad),0)}}return{h:ah,v:af}},getPreviousSlide:function(){return w},getCurrentSlide:function(){return E},getQueryHash:function(){var ad={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(ae){ad[ae.split("=").shift()]=ae.split("=").pop()});return ad},addEventListener:function(ae,af,ad){if("addEventListener" in window){(d.wrapper||document.querySelector(".reveal")).addEventListener(ae,af,ad)}},removeEventListener:function(ae,af,ad){if("addEventListener" in window){(d.wrapper||document.querySelector(".reveal")).removeEventListener(ae,af,ad)}}}})();
diff --git a/docs/slides/flops14/_support/reveal/lib/css/zenburn.css b/docs/slides/flops14/_support/reveal/lib/css/zenburn.css
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/lib/css/zenburn.css
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-
-Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
-based on dark.css by Ivan Sagalaev
-
-*/
-
-pre code {
-  display: block; padding: 0.5em;
-  background: #3F3F3F;
-  color: #DCDCDC;
-}
-
-pre .keyword,
-pre .tag,
-pre .django .tag,
-pre .django .keyword,
-pre .css .class,
-pre .css .id,
-pre .lisp .title {
-  color: #E3CEAB;
-}
-
-pre .django .template_tag,
-pre .django .variable,
-pre .django .filter .argument {
-  color: #DCDCDC;
-}
-
-pre .number,
-pre .date {
-  color: #8CD0D3;
-}
-
-pre .dos .envvar,
-pre .dos .stream,
-pre .variable,
-pre .apache .sqbracket {
-  color: #EFDCBC;
-}
-
-pre .dos .flow,
-pre .diff .change,
-pre .python .exception,
-pre .python .built_in,
-pre .literal,
-pre .tex .special {
-  color: #EFEFAF;
-}
-
-pre .diff .chunk,
-pre .ruby .subst {
-  color: #8F8F8F;
-}
-
-pre .dos .keyword,
-pre .python .decorator,
-pre .class .title,
-pre .haskell .label,
-pre .function .title,
-pre .ini .title,
-pre .diff .header,
-pre .ruby .class .parent,
-pre .apache .tag,
-pre .nginx .built_in,
-pre .tex .command,
-pre .input_number {
-    color: #efef8f;
-}
-
-pre .dos .winutils,
-pre .ruby .symbol,
-pre .ruby .symbol .string,
-pre .ruby .symbol .keyword,
-pre .ruby .symbol .keymethods,
-pre .ruby .string,
-pre .ruby .instancevar {
-  color: #DCA3A3;
-}
-
-pre .diff .deletion,
-pre .string,
-pre .tag .value,
-pre .preprocessor,
-pre .built_in,
-pre .sql .aggregate,
-pre .javadoc,
-pre .smalltalk .class,
-pre .smalltalk .localvars,
-pre .smalltalk .array,
-pre .css .rules .value,
-pre .attr_selector,
-pre .pseudo,
-pre .apache .cbracket,
-pre .tex .formula {
-  color: #CC9393;
-}
-
-pre .shebang,
-pre .diff .addition,
-pre .comment,
-pre .java .annotation,
-pre .template_comment,
-pre .pi,
-pre .doctype {
-  color: #7F9F7F;
-}
-
-pre .xml .css,
-pre .xml .javascript,
-pre .xml .vbscript,
-pre .tex .formula {
-  opacity: 0.5;
-}
-
diff --git a/docs/slides/flops14/_support/reveal/lib/font/OpenSans-Regular.ttf b/docs/slides/flops14/_support/reveal/lib/font/OpenSans-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/flops14/_support/reveal/lib/font/OpenSans-Regular.ttf and /dev/null differ
diff --git a/docs/slides/flops14/_support/reveal/lib/font/PT_Sans-Narrow-Web-Regular.ttf b/docs/slides/flops14/_support/reveal/lib/font/PT_Sans-Narrow-Web-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/flops14/_support/reveal/lib/font/PT_Sans-Narrow-Web-Regular.ttf and /dev/null differ
diff --git a/docs/slides/flops14/_support/reveal/lib/font/league_gothic-webfont.ttf b/docs/slides/flops14/_support/reveal/lib/font/league_gothic-webfont.ttf
deleted file mode 100644
Binary files a/docs/slides/flops14/_support/reveal/lib/font/league_gothic-webfont.ttf and /dev/null differ
diff --git a/docs/slides/flops14/_support/reveal/lib/js/classList.js b/docs/slides/flops14/_support/reveal/lib/js/classList.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/lib/js/classList.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
-if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p<o;p++){if(p in this&&this[p]===q){return p}}return -1},n=function(o,p){this.name=o;this.code=DOMException[o];this.message=p},g=function(p,o){if(o===""){throw new n("SYNTAX_ERR","An invalid or illegal string was specified")}if(/\s/.test(o)){throw new n("INVALID_CHARACTER_ERR","String contains an invalid character")}return c.call(p,o)},d=function(s){var r=k.call(s.className),q=r?r.split(/\s+/):[],p=0,o=q.length;for(;p<o;p++){this.push(q[p])}this._updateClassName=function(){s.className=this.toString()}},e=d[f]=[],i=function(){return new d(this)};n[f]=Error[f];e.item=function(o){return this[o]||null};e.contains=function(o){o+="";return g(this,o)!==-1};e.add=function(o){o+="";if(g(this,o)===-1){this.push(o);this._updateClassName()}};e.remove=function(p){p+="";var o=g(this,p);if(o!==-1){this.splice(o,1);this._updateClassName()}};e.toggle=function(o){o+="";if(g(this,o)===-1){this.add(o)}else{this.remove(o)}};e.toString=function(){return this.join(" ")};if(b.defineProperty){var l={get:i,enumerable:true,configurable:true};try{b.defineProperty(m,a,l)}catch(h){if(h.number===-2146823252){l.enumerable=false;b.defineProperty(m,a,l)}}}else{if(b[f].__defineGetter__){m.__defineGetter__(a,i)}}}(self))};
diff --git a/docs/slides/flops14/_support/reveal/lib/js/data-markdown.js b/docs/slides/flops14/_support/reveal/lib/js/data-markdown.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/lib/js/data-markdown.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// From https://gist.github.com/1343518
-// Modified by Hakim to handle markdown indented with tabs
-(function(){
-
-    var slides = document.querySelectorAll('[data-markdown]');
-
-    for( var i = 0, len = slides.length; i < len; i++ ) {
-        var elem = slides[i];
-
-        // strip leading whitespace so it isn't evaluated as code
-        var text = elem.innerHTML;
-
-        var leadingWs = text.match(/^\n?(\s*)/)[1].length,
-            leadingTabs = text.match(/^\n?(\t*)/)[1].length;
-
-        if( leadingTabs > 0 ) {
-            text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
-        }
-        else if( leadingWs > 1 ) {
-            text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' );
-        }
-
-        // here, have sum HTML
-        elem.innerHTML = (new Showdown.converter()).makeHtml(text);
-    }
-
-})();
diff --git a/docs/slides/flops14/_support/reveal/lib/js/head.min.js b/docs/slides/flops14/_support/reveal/lib/js/head.min.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/lib/js/head.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
-    Head JS     The only script in your <HEAD>
-    Copyright   Tero Piirainen (tipiirai)
-    License     MIT / http://bit.ly/mit-license
-    Version     0.96
-
-    http://headjs.com
-*/(function(a){function z(){d||(d=!0,s(e,function(a){p(a)}))}function y(c,d){var e=a.createElement("script");e.type="text/"+(c.type||"javascript"),e.src=c.src||c,e.async=!1,e.onreadystatechange=e.onload=function(){var a=e.readyState;!d.done&&(!a||/loaded|complete/.test(a))&&(d.done=!0,d())},(a.body||b).appendChild(e)}function x(a,b){if(a.state==o)return b&&b();if(a.state==n)return k.ready(a.name,b);if(a.state==m)return a.onpreload.push(function(){x(a,b)});a.state=n,y(a.url,function(){a.state=o,b&&b(),s(g[a.name],function(a){p(a)}),u()&&d&&s(g.ALL,function(a){p(a)})})}function w(a,b){a.state===undefined&&(a.state=m,a.onpreload=[],y({src:a.url,type:"cache"},function(){v(a)}))}function v(a){a.state=l,s(a.onpreload,function(a){a.call()})}function u(a){a=a||h;var b;for(var c in a){if(a.hasOwnProperty(c)&&a[c].state!=o)return!1;b=!0}return b}function t(a){return Object.prototype.toString.call(a)=="[object Function]"}function s(a,b){if(!!a){typeof a=="object"&&(a=[].slice.call(a));for(var c=0;c<a.length;c++)b.call(a,a[c],c)}}function r(a){var b;if(typeof a=="object")for(var c in a)a[c]&&(b={name:c,url:a[c]});else b={name:q(a),url:a};var d=h[b.name];if(d&&d.url===b.url)return d;h[b.name]=b;return b}function q(a){var b=a.split("/"),c=b[b.length-1],d=c.indexOf("?");return d!=-1?c.substring(0,d):c}function p(a){a._done||(a(),a._done=1)}var b=a.documentElement,c,d,e=[],f=[],g={},h={},i=a.createElement("script").async===!0||"MozAppearance"in a.documentElement.style||window.opera,j=window.head_conf&&head_conf.head||"head",k=window[j]=window[j]||function(){k.ready.apply(null,arguments)},l=1,m=2,n=3,o=4;i?k.js=function(){var a=arguments,b=a[a.length-1],c={};t(b)||(b=null),s(a,function(d,e){d!=b&&(d=r(d),c[d.name]=d,x(d,b&&e==a.length-2?function(){u(c)&&p(b)}:null))});return k}:k.js=function(){var a=arguments,b=[].slice.call(a,1),d=b[0];if(!c){f.push(function(){k.js.apply(null,a)});return k}d?(s(b,function(a){t(a)||w(r(a))}),x(r(a[0]),t(d)?d:function(){k.js.apply(null,b)})):x(r(a[0]));return k},k.ready=function(b,c){if(b==a){d?p(c):e.push(c);return k}t(b)&&(c=b,b="ALL");if(typeof b!="string"||!t(c))return k;var f=h[b];if(f&&f.state==o||b=="ALL"&&u()&&d){p(c);return k}var i=g[b];i?i.push(c):i=g[b]=[c];return k},k.ready(a,function(){u()&&s(g.ALL,function(a){p(a)}),k.feature&&k.feature("domloaded",!0)});if(window.addEventListener)a.addEventListener("DOMContentLoaded",z,!1),window.addEventListener("load",z,!1);else if(window.attachEvent){a.attachEvent("onreadystatechange",function(){a.readyState==="complete"&&z()});var A=1;try{A=window.frameElement}catch(B){}!A&&b.doScroll&&function(){try{b.doScroll("left"),z()}catch(a){setTimeout(arguments.callee,1);return}}(),window.attachEvent("onload",z)}!a.readyState&&a.addEventListener&&(a.readyState="loading",a.addEventListener("DOMContentLoaded",handler=function(){a.removeEventListener("DOMContentLoaded",handler,!1),a.readyState="complete"},!1)),setTimeout(function(){c=!0,s(f,function(a){a()})},300)})(document)
diff --git a/docs/slides/flops14/_support/reveal/lib/js/highlight.js b/docs/slides/flops14/_support/reveal/lib/js/highlight.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/lib/js/highlight.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
-Syntax highlighting with language autodetection.
-http://softwaremaniacs.org/soft/highlight/
-*/
-var hljs=new function(){function m(p){return p.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function c(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function j(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function g(t,s){var r="";for(var q=0;q<t.childNodes.length;q++){if(t.childNodes[q].nodeType==3){var p=t.childNodes[q].nodeValue;if(s){p=p.replace(/\n/g,"")}r+=p}else{if(t.childNodes[q].nodeName=="BR"){r+="\n"}else{r+=g(t.childNodes[q])}}}if(/MSIE [678]/.test(navigator.userAgent)){r=r.replace(/\r/g,"\n")}return r}function a(s){var q=s.className.split(/\s+/);q=q.concat(s.parentNode.className.split(/\s+/));for(var p=0;p<q.length;p++){var r=q[p].replace(/^language-/,"");if(d[r]||r=="no-highlight"){return r}}}function b(p){var q=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{q.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);q.push({event:"stop",offset:t,node:s.childNodes[r]})}}}return t})(p,0);return q}function l(y,z,x){var r=0;var w="";var t=[];function u(){if(y.length&&z.length){if(y[0].offset!=z[0].offset){return(y[0].offset<z[0].offset)?y:z}else{return z[0].event=="start"?y:z}}else{return y.length?y:z}}function s(C){var D="<"+C.nodeName.toLowerCase();for(var A=0;A<C.attributes.length;A++){var B=C.attributes[A];D+=" "+B.nodeName.toLowerCase();if(B.nodeValue!=undefined&&B.nodeValue!=false&&B.nodeValue!=null){D+='="'+m(B.nodeValue)+'"'}}return D+">"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event=="start"){w+=s(v.node);t.push(v.node)}else{if(v.event=="stop"){var q=t.length;do{q--;var p=t[q];w+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);t.splice(q,1);while(q<t.length){w+=s(t[q]);q++}}}}w+=x.substr(r);return w}function i(){function p(u,t,v){if(u.compiled){return}if(!v){u.bR=c(t,u.b?u.b:"\\B|\\b");if(!u.e&&!u.eW){u.e="\\B|\\b"}if(u.e){u.eR=c(t,u.e)}}if(u.i){u.iR=c(t,u.i)}if(u.r==undefined){u.r=1}if(u.k){u.lR=c(t,u.l||hljs.IR,true)}for(var s in u.k){if(!u.k.hasOwnProperty(s)){continue}if(u.k[s] instanceof Object){u.kG=u.k}else{u.kG={keyword:u.k}}break}if(!u.c){u.c=[]}u.compiled=true;for(var r=0;r<u.c.length;r++){p(u.c[r],t,false)}if(u.starts){p(u.starts,t,false)}}for(var q in d){if(!d.hasOwnProperty(q)){continue}p(d[q].dM,d[q],true)}}function e(J,D){if(!i.called){i();i.called=true}function z(r,M){for(var L=0;L<M.c.length;L++){if(M.c[L].bR.test(r)){return M.c[L]}}}function w(L,r){if(C[L].e&&C[L].eR.test(r)){return 1}if(C[L].eW){var M=w(L-1,r);return M?M+1:0}return 0}function x(r,L){return L.iR&&L.iR.test(r)}function A(O,N){var M=[];for(var L=0;L<O.c.length;L++){M.push(O.c[L].b)}var r=C.length-1;do{if(C[r].e){M.push(C[r].e)}r--}while(C[r+1].eW);if(O.i){M.push(O.i)}return c(N,"("+M.join("|")+")",true)}function s(M,L){var N=C[C.length-1];if(!N.t){N.t=A(N,H)}N.t.lastIndex=L;var r=N.t.exec(M);if(r){return[M.substr(L,r.index-L),r[0],false]}else{return[M.substr(L),"",true]}}function p(O,r){var L=H.cI?r[0].toLowerCase():r[0];for(var N in O.kG){if(!O.kG.hasOwnProperty(N)){continue}var M=O.kG[N].hasOwnProperty(L);if(M){return[N,M]}}return false}function F(M,O){if(!O.k){return m(M)}var N="";var P=0;O.lR.lastIndex=0;var L=O.lR.exec(M);while(L){N+=m(M.substr(P,L.index-P));var r=p(O,L);if(r){t+=r[1];N+='<span class="'+r[0]+'">'+m(L[0])+"</span>"}else{N+=m(L[0])}P=O.lR.lastIndex;L=O.lR.exec(M)}N+=m(M.substr(P,M.length-P));return N}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){q+=L;M.buffer=""}else{if(M.eB){q+=m(r)+L;M.buffer=""}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?"</span>":"";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?"</span>":"";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer="";if(P.starts){I(P.starts,"")}return R.rE}if(x(L,R)){throw"Illegal"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q="";try{var v=0;H.dM.buffer="";do{var y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw"Illegal"}return{r:B,keyword_count:t,value:q}}catch(G){if(G=="Illegal"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"<br>")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);if(s=="no-highlight"){return}if(s){var w=e(s,y)}else{var w=f(y);s=w.language}var p=b(u);if(p.length){var r=document.createElement("pre");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match("(\\s|^)(language-)?"+s+"(\\s|$)")){t=t?(t+" "+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName=="CODE"&&u.parentNode.tagName=="PRE"){var r=u.parentNode;var v=document.createElement("div");v.innerHTML="<pre><code>"+w.value+"</code></pre>";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p<r.length;p++){var q=j(r[p]);if(q){o(q,hljs.tabReplace)}}}function n(){if(window.addEventListener){window.addEventListener("DOMContentLoaded",k,false);window.addEventListener("load",k,false)}else{if(window.attachEvent){window.attachEvent("onload",k)}else{window.onload=k}}}var d={};this.LANGUAGES=d;this.highlight=e;this.highlightAuto=f;this.fixMarkup=h;this.highlightBlock=o;this.initHighlighting=k;this.initHighlightingOnLoad=n;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.cs={dM:{k:{"abstract":1,as:1,base:1,bool:1,"break":1,"byte":1,"case":1,"catch":1,"char":1,checked:1,"class":1,"const":1,"continue":1,decimal:1,"default":1,delegate:1,"do":1,"do":1,"double":1,"else":1,"enum":1,event:1,explicit:1,extern:1,"false":1,"finally":1,fixed:1,"float":1,"for":1,foreach:1,"goto":1,"if":1,implicit:1,"in":1,"int":1,"interface":1,internal:1,is:1,lock:1,"long":1,namespace:1,"new":1,"null":1,object:1,operator:1,out:1,override:1,params:1,"private":1,"protected":1,"public":1,readonly:1,ref:1,"return":1,sbyte:1,sealed:1,"short":1,sizeof:1,stackalloc:1,"static":1,string:1,struct:1,"switch":1,"this":1,"throw":1,"true":1,"try":1,"typeof":1,uint:1,ulong:1,unchecked:1,unsafe:1,ushort:1,using:1,virtual:1,"volatile":1,"void":1,"while":1,ascending:1,descending:1,from:1,get:1,group:1,into:1,join:1,let:1,orderby:1,partial:1,select:1,set:1,value:1,"var":1,where:1,yield:1},c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},hljs.CLCM,hljs.CBLCLM,{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},hljs.ASM,hljs.QSM,hljs.CNM]}};hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:{"font-face":1,page:1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style",e:">",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script",e:">",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},a]}]}}}();hljs.LANGUAGES.java={dM:{k:{"false":1,"synchronized":1,"int":1,"abstract":1,"float":1,"private":1,"char":1,"interface":1,"boolean":1,"static":1,"null":1,"if":1,"const":1,"for":1,"true":1,"while":1,"long":1,"throw":1,strictfp:1,"finally":1,"protected":1,"extends":1,"import":1,"native":1,"final":1,"implements":1,"return":1,"void":1,"enum":1,"else":1,"break":1,"transient":1,"new":1,"catch":1,"instanceof":1,"byte":1,"super":1,"class":1,"volatile":1,"case":1,assert:1,"short":1,"package":1,"default":1,"double":1,"public":1,"try":1,"this":1,"switch":1,"continue":1,"throws":1},c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:"class",b:"(class |interface )",e:"{",k:{"class":1,"interface":1},i:":",c:[{b:"(implements|extends)",k:{"extends":1,"implements":1},r:10},{cN:"title",b:hljs.UIR}]},hljs.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}};hljs.LANGUAGES.php={cI:true,dM:{k:{and:1,include_once:1,list:1,"abstract":1,global:1,"private":1,echo:1,"interface":1,as:1,"static":1,endswitch:1,array:1,"null":1,"if":1,endwhile:1,or:1,"const":1,"for":1,endforeach:1,self:1,"var":1,"while":1,isset:1,"public":1,"protected":1,exit:1,foreach:1,"throw":1,elseif:1,"extends":1,include:1,__FILE__:1,empty:1,require_once:1,"function":1,"do":1,xor:1,"return":1,"implements":1,parent:1,clone:1,use:1,__CLASS__:1,__LINE__:1,"else":1,"break":1,print:1,"eval":1,"new":1,"catch":1,__METHOD__:1,"class":1,"case":1,exception:1,php_user_filter:1,"default":1,die:1,require:1,__FUNCTION__:1,enddeclare:1,"final":1,"try":1,"this":1,"switch":1,"continue":1,endfor:1,endif:1,declare:1,unset:1,"true":1,"false":1,namespace:1},c:[hljs.CLCM,hljs.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+",r:10}]},hljs.CNM,hljs.inherit(hljs.ASM,{i:null}),hljs.inherit(hljs.QSM,{i:null}),{cN:"variable",b:"\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"}]}};hljs.LANGUAGES.python=function(){var c={cN:"string",b:"(u|b)?r?'''",e:"'''",r:10};var b={cN:"string",b:'(u|b)?r?"""',e:'"""',r:10};var a={cN:"string",b:"(u|r|ur|b|br)'",e:"'",c:[hljs.BE],r:10};var f={cN:"string",b:'(u|r|ur|b|br)"',e:'"',c:[hljs.BE],r:10};var d={cN:"title",b:hljs.UIR};var e={cN:"params",b:"\\(",e:"\\)",c:[c,b,a,f,hljs.ASM,hljs.QSM]};return{dM:{k:{keyword:{and:1,elif:1,is:1,global:1,as:1,"in":1,"if":1,from:1,raise:1,"for":1,except:1,"finally":1,print:1,"import":1,pass:1,"return":1,exec:1,"else":1,"break":1,not:1,"with":1,"class":1,assert:1,yield:1,"try":1,"while":1,"continue":1,del:1,or:1,def:1,lambda:1,nonlocal:10},built_in:{None:1,True:1,False:1,Ellipsis:1,NotImplemented:1}},i:"(</|->|\\?)",c:[hljs.HCM,c,b,a,f,hljs.ASM,hljs.QSM,{cN:"function",b:"\\bdef ",e:":",i:"$",k:{def:1},c:[d,e],r:10},{cN:"class",b:"\\bclass ",e:":",i:"[${]",k:{"class":1},c:[d,e],r:10},hljs.CNM,{cN:"decorator",b:"@",e:"$"}]}}}();hljs.LANGUAGES.perl=function(){var c={getpwent:1,getservent:1,quotemeta:1,msgrcv:1,scalar:1,kill:1,dbmclose:1,undef:1,lc:1,ma:1,syswrite:1,tr:1,send:1,umask:1,sysopen:1,shmwrite:1,vec:1,qx:1,utime:1,local:1,oct:1,semctl:1,localtime:1,readpipe:1,"do":1,"return":1,format:1,read:1,sprintf:1,dbmopen:1,pop:1,getpgrp:1,not:1,getpwnam:1,rewinddir:1,qq:1,fileno:1,qw:1,endprotoent:1,wait:1,sethostent:1,bless:1,s:1,opendir:1,"continue":1,each:1,sleep:1,endgrent:1,shutdown:1,dump:1,chomp:1,connect:1,getsockname:1,die:1,socketpair:1,close:1,flock:1,exists:1,index:1,shmget:1,sub:1,"for":1,endpwent:1,redo:1,lstat:1,msgctl:1,setpgrp:1,abs:1,exit:1,select:1,print:1,ref:1,gethostbyaddr:1,unshift:1,fcntl:1,syscall:1,"goto":1,getnetbyaddr:1,join:1,gmtime:1,symlink:1,semget:1,splice:1,x:1,getpeername:1,recv:1,log:1,setsockopt:1,cos:1,last:1,reverse:1,gethostbyname:1,getgrnam:1,study:1,formline:1,endhostent:1,times:1,chop:1,length:1,gethostent:1,getnetent:1,pack:1,getprotoent:1,getservbyname:1,rand:1,mkdir:1,pos:1,chmod:1,y:1,substr:1,endnetent:1,printf:1,next:1,open:1,msgsnd:1,readdir:1,use:1,unlink:1,getsockopt:1,getpriority:1,rindex:1,wantarray:1,hex:1,system:1,getservbyport:1,endservent:1,"int":1,chr:1,untie:1,rmdir:1,prototype:1,tell:1,listen:1,fork:1,shmread:1,ucfirst:1,setprotoent:1,"else":1,sysseek:1,link:1,getgrgid:1,shmctl:1,waitpid:1,unpack:1,getnetbyname:1,reset:1,chdir:1,grep:1,split:1,require:1,caller:1,lcfirst:1,until:1,warn:1,"while":1,values:1,shift:1,telldir:1,getpwuid:1,my:1,getprotobynumber:1,"delete":1,and:1,sort:1,uc:1,defined:1,srand:1,accept:1,"package":1,seekdir:1,getprotobyname:1,semop:1,our:1,rename:1,seek:1,"if":1,q:1,chroot:1,sysread:1,setpwent:1,no:1,crypt:1,getc:1,chown:1,sqrt:1,write:1,setnetent:1,setpriority:1,foreach:1,tie:1,sin:1,msgget:1,map:1,stat:1,getlogin:1,unless:1,elsif:1,truncate:1,exec:1,keys:1,glob:1,tied:1,closedir:1,ioctl:1,socket:1,readlink:1,"eval":1,xor:1,readline:1,binmode:1,setservent:1,eof:1,ord:1,bind:1,alarm:1,pipe:1,atan2:1,getgrent:1,exp:1,time:1,push:1,setgrent:1,gt:1,lt:1,or:1,ne:1,m:1};var d={cN:"subst",b:"[$@]\\{",e:"}",k:c,r:10};var b={cN:"variable",b:"\\$\\d"};var a={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var g=[hljs.BE,d,b,a];var f={b:"->",c:[{b:hljs.IR},{b:"{",e:"}"}]};var e=[b,a,hljs.HCM,{cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5},f,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:g,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:g,r:5},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"string",b:'"',e:'"',c:g,r:0},{cN:"string",b:"`",e:"`",c:[hljs.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[hljs.BE],r:0},{cN:"sub",b:"\\bsub\\b",e:"(\\s*\\(.*?\\))?[;{]",k:{sub:1},r:5},{cN:"operator",b:"-\\w\\b",r:0},{cN:"pod",b:"\\=\\w",e:"\\=cut"}];d.c=e;f.c[1].c=e;return{dM:{k:c,c:e}}}();hljs.LANGUAGES.cpp=function(){var b={keyword:{"false":1,"int":1,"float":1,"while":1,"private":1,"char":1,"catch":1,"export":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,"const":1,struct:1,"for":1,static_cast:2,union:1,namespace:1,unsigned:1,"long":1,"throw":1,"volatile":2,"static":1,"protected":1,bool:1,template:1,mutable:1,"if":1,"public":1,friend:2,"do":1,"return":1,"goto":1,auto:1,"void":2,"enum":1,"else":1,"break":1,"new":1,extern:1,using:1,"true":1,"class":1,asm:1,"case":1,typeid:1,"short":1,reinterpret_cast:2,"default":1,"double":1,register:1,explicit:1,signed:1,typename:1,"try":1,"this":1,"switch":1,"continue":1,wchar_t:1,inline:1,"delete":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};var a={cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10};a.c=[a];return{dM:{k:b,i:"</",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},hljs.CNM,{cN:"preprocessor",b:"#",e:"$"},a]}}}();
diff --git a/docs/slides/flops14/_support/reveal/lib/js/html5shiv.js b/docs/slides/flops14/_support/reveal/lib/js/html5shiv.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/lib/js/html5shiv.js
+++ /dev/null
@@ -1,7 +0,0 @@
-document.createElement('header');
-document.createElement('nav');
-document.createElement('section');
-document.createElement('article');
-document.createElement('aside');
-document.createElement('footer');
-document.createElement('hgroup');
diff --git a/docs/slides/flops14/_support/reveal/lib/js/showdown.js b/docs/slides/flops14/_support/reveal/lib/js/showdown.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/lib/js/showdown.js
+++ /dev/null
@@ -1,1341 +0,0 @@
-//
-// showdown.js -- A javascript port of Markdown.
-//
-// Copyright (c) 2007 John Fraser.
-//
-// Original Markdown Copyright (c) 2004-2005 John Gruber
-//   <http://daringfireball.net/projects/markdown/>
-//
-// Redistributable under a BSD-style open source license.
-// See license.txt for more information.
-//
-// The full source distribution is at:
-//
-//				A A L
-//				T C A
-//				T K B
-//
-//   <http://www.attacklab.net/>
-//
-
-//
-// Wherever possible, Showdown is a straight, line-by-line port
-// of the Perl version of Markdown.
-//
-// This is not a normal parser design; it's basically just a
-// series of string substitutions.  It's hard to read and
-// maintain this way,  but keeping Showdown close to the original
-// design makes it easier to port new features.
-//
-// More importantly, Showdown behaves like markdown.pl in most
-// edge cases.  So web applications can do client-side preview
-// in Javascript, and then build identical HTML on the server.
-//
-// This port needs the new RegExp functionality of ECMA 262,
-// 3rd Edition (i.e. Javascript 1.5).  Most modern web browsers
-// should do fine.  Even with the new regular expression features,
-// We do a lot of work to emulate Perl's regex functionality.
-// The tricky changes in this file mostly have the "attacklab:"
-// label.  Major or self-explanatory changes don't.
-//
-// Smart diff tools like Araxis Merge will be able to match up
-// this file with markdown.pl in a useful way.  A little tweaking
-// helps: in a copy of markdown.pl, replace "#" with "//" and
-// replace "$text" with "text".  Be sure to ignore whitespace
-// and line endings.
-//
-
-
-//
-// Showdown usage:
-//
-//   var text = "Markdown *rocks*.";
-//
-//   var converter = new Showdown.converter();
-//   var html = converter.makeHtml(text);
-//
-//   alert(html);
-//
-// Note: move the sample code to the bottom of this
-// file before uncommenting it.
-//
-
-
-//
-// Showdown namespace
-//
-var Showdown = {};
-
-//
-// converter
-//
-// Wraps all "globals" so that the only thing
-// exposed is makeHtml().
-//
-Showdown.converter = function() {
-
-//
-// Globals:
-//
-
-// Global hashes, used by various utility routines
-var g_urls;
-var g_titles;
-var g_html_blocks;
-
-// Used to track when we're inside an ordered or unordered list
-// (see _ProcessListItems() for details):
-var g_list_level = 0;
-
-
-this.makeHtml = function(text) {
-//
-// Main function. The order in which other subs are called here is
-// essential. Link and image substitutions need to happen before
-// _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>
-// and <img> tags get encoded.
-//
-
-	// Clear the global hashes. If we don't clear these, you get conflicts
-	// from other articles when generating a page which contains more than
-	// one article (e.g. an index page that shows the N most recent
-	// articles):
-	g_urls = new Array();
-	g_titles = new Array();
-	g_html_blocks = new Array();
-
-	// attacklab: Replace ~ with ~T
-	// This lets us use tilde as an escape char to avoid md5 hashes
-	// The choice of character is arbitray; anything that isn't
-    // magic in Markdown will work.
-	text = text.replace(/~/g,"~T");
-
-	// attacklab: Replace $ with ~D
-	// RegExp interprets $ as a special character
-	// when it's in a replacement string
-	text = text.replace(/\$/g,"~D");
-
-	// Standardize line endings
-	text = text.replace(/\r\n/g,"\n"); // DOS to Unix
-	text = text.replace(/\r/g,"\n"); // Mac to Unix
-
-	// Make sure text begins and ends with a couple of newlines:
-	text = "\n\n" + text + "\n\n";
-
-	// Convert all tabs to spaces.
-	text = _Detab(text);
-
-	// Strip any lines consisting only of spaces and tabs.
-	// This makes subsequent regexen easier to write, because we can
-	// match consecutive blank lines with /\n+/ instead of something
-	// contorted like /[ \t]*\n+/ .
-	text = text.replace(/^[ \t]+$/mg,"");
-
-	// Handle github codeblocks prior to running HashHTML so that
-	// HTML contained within the codeblock gets escaped propertly
-	text = _DoGithubCodeBlocks(text);
-
-	// Turn block-level HTML blocks into hash entries
-	text = _HashHTMLBlocks(text);
-
-	// Strip link definitions, store in hashes.
-	text = _StripLinkDefinitions(text);
-
-	text = _RunBlockGamut(text);
-
-	text = _UnescapeSpecialChars(text);
-
-	// attacklab: Restore dollar signs
-	text = text.replace(/~D/g,"$$");
-
-	// attacklab: Restore tildes
-	text = text.replace(/~T/g,"~");
-
-	return text;
-};
-
-
-var _StripLinkDefinitions = function(text) {
-//
-// Strips link definitions from text, stores the URLs and titles in
-// hash references.
-//
-
-	// Link defs are in the form: ^[id]: url "optional title"
-
-	/*
-		var text = text.replace(/
-				^[ ]{0,3}\[(.+)\]:  // id = $1  attacklab: g_tab_width - 1
-				  [ \t]*
-				  \n?				// maybe *one* newline
-				  [ \t]*
-				<?(\S+?)>?			// url = $2
-				  [ \t]*
-				  \n?				// maybe one newline
-				  [ \t]*
-				(?:
-				  (\n*)				// any lines skipped = $3 attacklab: lookbehind removed
-				  ["(]
-				  (.+?)				// title = $4
-				  [")]
-				  [ \t]*
-				)?					// title is optional
-				(?:\n+|$)
-			  /gm,
-			  function(){...});
-	*/
-	var text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,
-		function (wholeMatch,m1,m2,m3,m4) {
-			m1 = m1.toLowerCase();
-			g_urls[m1] = _EncodeAmpsAndAngles(m2);  // Link IDs are case-insensitive
-			if (m3) {
-				// Oops, found blank lines, so it's not a title.
-				// Put back the parenthetical statement we stole.
-				return m3+m4;
-			} else if (m4) {
-				g_titles[m1] = m4.replace(/"/g,"&quot;");
-			}
-
-			// Completely remove the definition from the text
-			return "";
-		}
-	);
-
-	return text;
-}
-
-
-var _HashHTMLBlocks = function(text) {
-	// attacklab: Double up blank lines to reduce lookaround
-	text = text.replace(/\n/g,"\n\n");
-
-	// Hashify HTML blocks:
-	// We only want to do this for block-level HTML tags, such as headers,
-	// lists, and tables. That's because we still want to wrap <p>s around
-	// "paragraphs" that are wrapped in non-block-level tags, such as anchors,
-	// phrase emphasis, and spans. The list of tags we're looking for is
-	// hard-coded:
-	var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del|style|section|header|footer|nav|article|aside";
-	var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside";
-
-	// First, look for nested blocks, e.g.:
-	//   <div>
-	//     <div>
-	//     tags for inner block must be indented.
-	//     </div>
-	//   </div>
-	//
-	// The outermost tags must start at the left margin for this to match, and
-	// the inner nested divs must be indented.
-	// We need to do this before the next, more liberal match, because the next
-	// match will start at the first `<div>` and stop at the first `</div>`.
-
-	// attacklab: This regex can be expensive when it fails.
-	/*
-		var text = text.replace(/
-		(						// save in $1
-			^					// start of line  (with /m)
-			<($block_tags_a)	// start tag = $2
-			\b					// word break
-								// attacklab: hack around khtml/pcre bug...
-			[^\r]*?\n			// any number of lines, minimally matching
-			</\2>				// the matching end tag
-			[ \t]*				// trailing spaces/tabs
-			(?=\n+)				// followed by a newline
-		)						// attacklab: there are sentinel newlines at end of document
-		/gm,function(){...}};
-	*/
-	text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,hashElement);
-
-	//
-	// Now match more liberally, simply from `\n<tag>` to `</tag>\n`
-	//
-
-	/*
-		var text = text.replace(/
-		(						// save in $1
-			^					// start of line  (with /m)
-			<($block_tags_b)	// start tag = $2
-			\b					// word break
-								// attacklab: hack around khtml/pcre bug...
-			[^\r]*?				// any number of lines, minimally matching
-			.*</\2>				// the matching end tag
-			[ \t]*				// trailing spaces/tabs
-			(?=\n+)				// followed by a newline
-		)						// attacklab: there are sentinel newlines at end of document
-		/gm,function(){...}};
-	*/
-	text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,hashElement);
-
-	// Special case just for <hr />. It was easier to make a special case than
-	// to make the other regex more complicated.
-
-	/*
-		text = text.replace(/
-		(						// save in $1
-			\n\n				// Starting after a blank line
-			[ ]{0,3}
-			(<(hr)				// start tag = $2
-			\b					// word break
-			([^<>])*?			//
-			\/?>)				// the matching end tag
-			[ \t]*
-			(?=\n{2,})			// followed by a blank line
-		)
-		/g,hashElement);
-	*/
-	text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,hashElement);
-
-	// Special case for standalone HTML comments:
-
-	/*
-		text = text.replace(/
-		(						// save in $1
-			\n\n				// Starting after a blank line
-			[ ]{0,3}			// attacklab: g_tab_width - 1
-			<!
-			(--[^\r]*?--\s*)+
-			>
-			[ \t]*
-			(?=\n{2,})			// followed by a blank line
-		)
-		/g,hashElement);
-	*/
-	text = text.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g,hashElement);
-
-	// PHP and ASP-style processor instructions (<?...?> and <%...%>)
-
-	/*
-		text = text.replace(/
-		(?:
-			\n\n				// Starting after a blank line
-		)
-		(						// save in $1
-			[ ]{0,3}			// attacklab: g_tab_width - 1
-			(?:
-				<([?%])			// $2
-				[^\r]*?
-				\2>
-			)
-			[ \t]*
-			(?=\n{2,})			// followed by a blank line
-		)
-		/g,hashElement);
-	*/
-	text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,hashElement);
-
-	// attacklab: Undo double lines (see comment at top of this function)
-	text = text.replace(/\n\n/g,"\n");
-	return text;
-}
-
-var hashElement = function(wholeMatch,m1) {
-	var blockText = m1;
-
-	// Undo double lines
-	blockText = blockText.replace(/\n\n/g,"\n");
-	blockText = blockText.replace(/^\n/,"");
-
-	// strip trailing blank lines
-	blockText = blockText.replace(/\n+$/g,"");
-
-	// Replace the element text with a marker ("~KxK" where x is its key)
-	blockText = "\n\n~K" + (g_html_blocks.push(blockText)-1) + "K\n\n";
-
-	return blockText;
-};
-
-var _RunBlockGamut = function(text) {
-//
-// These are all the transformations that form block-level
-// tags like paragraphs, headers, and list items.
-//
-	text = _DoHeaders(text);
-
-	// Do Horizontal Rules:
-	var key = hashBlock("<hr />");
-	text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key);
-	text = text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key);
-	text = text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key);
-
-	text = _DoLists(text);
-	text = _DoCodeBlocks(text);
-	text = _DoBlockQuotes(text);
-
-	// We already ran _HashHTMLBlocks() before, in Markdown(), but that
-	// was to escape raw HTML in the original Markdown source. This time,
-	// we're escaping the markup we've just created, so that we don't wrap
-	// <p> tags around block-level tags.
-	text = _HashHTMLBlocks(text);
-	text = _FormParagraphs(text);
-
-	return text;
-};
-
-
-var _RunSpanGamut = function(text) {
-//
-// These are all the transformations that occur *within* block-level
-// tags like paragraphs, headers, and list items.
-//
-
-	text = _DoCodeSpans(text);
-	text = _EscapeSpecialCharsWithinTagAttributes(text);
-	text = _EncodeBackslashEscapes(text);
-
-	// Process anchor and image tags. Images must come first,
-	// because ![foo][f] looks like an anchor.
-	text = _DoImages(text);
-	text = _DoAnchors(text);
-
-	// Make links out of things like `<http://example.com/>`
-	// Must come after _DoAnchors(), because you can use < and >
-	// delimiters in inline links like [this](<url>).
-	text = _DoAutoLinks(text);
-	text = _EncodeAmpsAndAngles(text);
-	text = _DoItalicsAndBold(text);
-
-	// Do hard breaks:
-	text = text.replace(/  +\n/g," <br />\n");
-
-	return text;
-}
-
-var _EscapeSpecialCharsWithinTagAttributes = function(text) {
-//
-// Within tags -- meaning between < and > -- encode [\ ` * _] so they
-// don't conflict with their use in Markdown for code, italics and strong.
-//
-
-	// Build a regex to find HTML tags and comments.  See Friedl's
-	// "Mastering Regular Expressions", 2nd Ed., pp. 200-201.
-	var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--.*?--\s*)+>)/gi;
-
-	text = text.replace(regex, function(wholeMatch) {
-		var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g,"$1`");
-		tag = escapeCharacters(tag,"\\`*_");
-		return tag;
-	});
-
-	return text;
-}
-
-var _DoAnchors = function(text) {
-//
-// Turn Markdown link shortcuts into XHTML <a> tags.
-//
-	//
-	// First, handle reference-style links: [link text] [id]
-	//
-
-	/*
-		text = text.replace(/
-		(							// wrap whole match in $1
-			\[
-			(
-				(?:
-					\[[^\]]*\]		// allow brackets nested one level
-					|
-					[^\[]			// or anything else
-				)*
-			)
-			\]
-
-			[ ]?					// one optional space
-			(?:\n[ ]*)?				// one optional newline followed by spaces
-
-			\[
-			(.*?)					// id = $3
-			\]
-		)()()()()					// pad remaining backreferences
-		/g,_DoAnchors_callback);
-	*/
-	text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeAnchorTag);
-
-	//
-	// Next, inline-style links: [link text](url "optional title")
-	//
-
-	/*
-		text = text.replace(/
-			(						// wrap whole match in $1
-				\[
-				(
-					(?:
-						\[[^\]]*\]	// allow brackets nested one level
-					|
-					[^\[\]]			// or anything else
-				)
-			)
-			\]
-			\(						// literal paren
-			[ \t]*
-			()						// no id, so leave $3 empty
-			<?(.*?)>?				// href = $4
-			[ \t]*
-			(						// $5
-				(['"])				// quote char = $6
-				(.*?)				// Title = $7
-				\6					// matching quote
-				[ \t]*				// ignore any spaces/tabs between closing quote and )
-			)?						// title is optional
-			\)
-		)
-		/g,writeAnchorTag);
-	*/
-	text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeAnchorTag);
-
-	//
-	// Last, handle reference-style shortcuts: [link text]
-	// These must come last in case you've also got [link test][1]
-	// or [link test](/foo)
-	//
-
-	/*
-		text = text.replace(/
-		(		 					// wrap whole match in $1
-			\[
-			([^\[\]]+)				// link text = $2; can't contain '[' or ']'
-			\]
-		)()()()()()					// pad rest of backreferences
-		/g, writeAnchorTag);
-	*/
-	text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag);
-
-	return text;
-}
-
-var writeAnchorTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {
-	if (m7 == undefined) m7 = "";
-	var whole_match = m1;
-	var link_text   = m2;
-	var link_id	 = m3.toLowerCase();
-	var url		= m4;
-	var title	= m7;
-
-	if (url == "") {
-		if (link_id == "") {
-			// lower-case and turn embedded newlines into spaces
-			link_id = link_text.toLowerCase().replace(/ ?\n/g," ");
-		}
-		url = "#"+link_id;
-
-		if (g_urls[link_id] != undefined) {
-			url = g_urls[link_id];
-			if (g_titles[link_id] != undefined) {
-				title = g_titles[link_id];
-			}
-		}
-		else {
-			if (whole_match.search(/\(\s*\)$/m)>-1) {
-				// Special case for explicit empty url
-				url = "";
-			} else {
-				return whole_match;
-			}
-		}
-	}
-
-	url = escapeCharacters(url,"*_");
-	var result = "<a href=\"" + url + "\"";
-
-	if (title != "") {
-		title = title.replace(/"/g,"&quot;");
-		title = escapeCharacters(title,"*_");
-		result +=  " title=\"" + title + "\"";
-	}
-
-	result += ">" + link_text + "</a>";
-
-	return result;
-}
-
-
-var _DoImages = function(text) {
-//
-// Turn Markdown image shortcuts into <img> tags.
-//
-
-	//
-	// First, handle reference-style labeled images: ![alt text][id]
-	//
-
-	/*
-		text = text.replace(/
-		(						// wrap whole match in $1
-			!\[
-			(.*?)				// alt text = $2
-			\]
-
-			[ ]?				// one optional space
-			(?:\n[ ]*)?			// one optional newline followed by spaces
-
-			\[
-			(.*?)				// id = $3
-			\]
-		)()()()()				// pad rest of backreferences
-		/g,writeImageTag);
-	*/
-	text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeImageTag);
-
-	//
-	// Next, handle inline images:  ![alt text](url "optional title")
-	// Don't forget: encode * and _
-
-	/*
-		text = text.replace(/
-		(						// wrap whole match in $1
-			!\[
-			(.*?)				// alt text = $2
-			\]
-			\s?					// One optional whitespace character
-			\(					// literal paren
-			[ \t]*
-			()					// no id, so leave $3 empty
-			<?(\S+?)>?			// src url = $4
-			[ \t]*
-			(					// $5
-				(['"])			// quote char = $6
-				(.*?)			// title = $7
-				\6				// matching quote
-				[ \t]*
-			)?					// title is optional
-		\)
-		)
-		/g,writeImageTag);
-	*/
-	text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeImageTag);
-
-	return text;
-}
-
-var writeImageTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {
-	var whole_match = m1;
-	var alt_text   = m2;
-	var link_id	 = m3.toLowerCase();
-	var url		= m4;
-	var title	= m7;
-
-	if (!title) title = "";
-
-	if (url == "") {
-		if (link_id == "") {
-			// lower-case and turn embedded newlines into spaces
-			link_id = alt_text.toLowerCase().replace(/ ?\n/g," ");
-		}
-		url = "#"+link_id;
-
-		if (g_urls[link_id] != undefined) {
-			url = g_urls[link_id];
-			if (g_titles[link_id] != undefined) {
-				title = g_titles[link_id];
-			}
-		}
-		else {
-			return whole_match;
-		}
-	}
-
-	alt_text = alt_text.replace(/"/g,"&quot;");
-	url = escapeCharacters(url,"*_");
-	var result = "<img src=\"" + url + "\" alt=\"" + alt_text + "\"";
-
-	// attacklab: Markdown.pl adds empty title attributes to images.
-	// Replicate this bug.
-
-	//if (title != "") {
-		title = title.replace(/"/g,"&quot;");
-		title = escapeCharacters(title,"*_");
-		result +=  " title=\"" + title + "\"";
-	//}
-
-	result += " />";
-
-	return result;
-}
-
-
-var _DoHeaders = function(text) {
-
-	// Setext-style headers:
-	//	Header 1
-	//	========
-	//
-	//	Header 2
-	//	--------
-	//
-	text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,
-		function(wholeMatch,m1){return hashBlock('<h1 id="' + headerId(m1) + '">' + _RunSpanGamut(m1) + "</h1>");});
-
-	text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,
-		function(matchFound,m1){return hashBlock('<h2 id="' + headerId(m1) + '">' + _RunSpanGamut(m1) + "</h2>");});
-
-	// atx-style headers:
-	//  # Header 1
-	//  ## Header 2
-	//  ## Header 2 with closing hashes ##
-	//  ...
-	//  ###### Header 6
-	//
-
-	/*
-		text = text.replace(/
-			^(\#{1,6})				// $1 = string of #'s
-			[ \t]*
-			(.+?)					// $2 = Header text
-			[ \t]*
-			\#*						// optional closing #'s (not counted)
-			\n+
-		/gm, function() {...});
-	*/
-
-	text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,
-		function(wholeMatch,m1,m2) {
-			var h_level = m1.length;
-			return hashBlock("<h" + h_level + ' id="' + headerId(m2) + '">' + _RunSpanGamut(m2) + "</h" + h_level + ">");
-		});
-
-	function headerId(m) {
-		return m.replace(/[^\w]/g, '').toLowerCase();
-	}
-	return text;
-}
-
-// This declaration keeps Dojo compressor from outputting garbage:
-var _ProcessListItems;
-
-var _DoLists = function(text) {
-//
-// Form HTML ordered (numbered) and unordered (bulleted) lists.
-//
-
-	// attacklab: add sentinel to hack around khtml/safari bug:
-	// http://bugs.webkit.org/show_bug.cgi?id=11231
-	text += "~0";
-
-	// Re-usable pattern to match any entirel ul or ol list:
-
-	/*
-		var whole_list = /
-		(									// $1 = whole list
-			(								// $2
-				[ ]{0,3}					// attacklab: g_tab_width - 1
-				([*+-]|\d+[.])				// $3 = first list item marker
-				[ \t]+
-			)
-			[^\r]+?
-			(								// $4
-				~0							// sentinel for workaround; should be $
-			|
-				\n{2,}
-				(?=\S)
-				(?!							// Negative lookahead for another list item marker
-					[ \t]*
-					(?:[*+-]|\d+[.])[ \t]+
-				)
-			)
-		)/g
-	*/
-	var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
-
-	if (g_list_level) {
-		text = text.replace(whole_list,function(wholeMatch,m1,m2) {
-			var list = m1;
-			var list_type = (m2.search(/[*+-]/g)>-1) ? "ul" : "ol";
-
-			// Turn double returns into triple returns, so that we can make a
-			// paragraph for the last item in a list, if necessary:
-			list = list.replace(/\n{2,}/g,"\n\n\n");;
-			var result = _ProcessListItems(list);
-
-			// Trim any trailing whitespace, to put the closing `</$list_type>`
-			// up on the preceding line, to get it past the current stupid
-			// HTML block parser. This is a hack to work around the terrible
-			// hack that is the HTML block parser.
-			result = result.replace(/\s+$/,"");
-			result = "<"+list_type+">" + result + "</"+list_type+">\n";
-			return result;
-		});
-	} else {
-		whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g;
-		text = text.replace(whole_list,function(wholeMatch,m1,m2,m3) {
-			var runup = m1;
-			var list = m2;
-
-			var list_type = (m3.search(/[*+-]/g)>-1) ? "ul" : "ol";
-			// Turn double returns into triple returns, so that we can make a
-			// paragraph for the last item in a list, if necessary:
-			var list = list.replace(/\n{2,}/g,"\n\n\n");;
-			var result = _ProcessListItems(list);
-			result = runup + "<"+list_type+">\n" + result + "</"+list_type+">\n";
-			return result;
-		});
-	}
-
-	// attacklab: strip sentinel
-	text = text.replace(/~0/,"");
-
-	return text;
-}
-
-_ProcessListItems = function(list_str) {
-//
-//  Process the contents of a single ordered or unordered list, splitting it
-//  into individual list items.
-//
-	// The $g_list_level global keeps track of when we're inside a list.
-	// Each time we enter a list, we increment it; when we leave a list,
-	// we decrement. If it's zero, we're not in a list anymore.
-	//
-	// We do this because when we're not inside a list, we want to treat
-	// something like this:
-	//
-	//    I recommend upgrading to version
-	//    8. Oops, now this line is treated
-	//    as a sub-list.
-	//
-	// As a single paragraph, despite the fact that the second line starts
-	// with a digit-period-space sequence.
-	//
-	// Whereas when we're inside a list (or sub-list), that line will be
-	// treated as the start of a sub-list. What a kludge, huh? This is
-	// an aspect of Markdown's syntax that's hard to parse perfectly
-	// without resorting to mind-reading. Perhaps the solution is to
-	// change the syntax rules such that sub-lists must start with a
-	// starting cardinal number; e.g. "1." or "a.".
-
-	g_list_level++;
-
-	// trim trailing blank lines:
-	list_str = list_str.replace(/\n{2,}$/,"\n");
-
-	// attacklab: add sentinel to emulate \z
-	list_str += "~0";
-
-	/*
-		list_str = list_str.replace(/
-			(\n)?							// leading line = $1
-			(^[ \t]*)						// leading whitespace = $2
-			([*+-]|\d+[.]) [ \t]+			// list marker = $3
-			([^\r]+?						// list item text   = $4
-			(\n{1,2}))
-			(?= \n* (~0 | \2 ([*+-]|\d+[.]) [ \t]+))
-		/gm, function(){...});
-	*/
-	list_str = list_str.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,
-		function(wholeMatch,m1,m2,m3,m4){
-			var item = m4;
-			var leading_line = m1;
-			var leading_space = m2;
-
-			if (leading_line || (item.search(/\n{2,}/)>-1)) {
-				item = _RunBlockGamut(_Outdent(item));
-			}
-			else {
-				// Recursion for sub-lists:
-				item = _DoLists(_Outdent(item));
-				item = item.replace(/\n$/,""); // chomp(item)
-				item = _RunSpanGamut(item);
-			}
-
-			return  "<li>" + item + "</li>\n";
-		}
-	);
-
-	// attacklab: strip sentinel
-	list_str = list_str.replace(/~0/g,"");
-
-	g_list_level--;
-	return list_str;
-}
-
-
-var _DoCodeBlocks = function(text) {
-//
-//  Process Markdown `<pre><code>` blocks.
-//
-
-	/*
-		text = text.replace(text,
-			/(?:\n\n|^)
-			(								// $1 = the code block -- one or more lines, starting with a space/tab
-				(?:
-					(?:[ ]{4}|\t)			// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
-					.*\n+
-				)+
-			)
-			(\n*[ ]{0,3}[^ \t\n]|(?=~0))	// attacklab: g_tab_width
-		/g,function(){...});
-	*/
-
-	// attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
-	text += "~0";
-
-	text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
-		function(wholeMatch,m1,m2) {
-			var codeblock = m1;
-			var nextChar = m2;
-
-			codeblock = _EncodeCode( _Outdent(codeblock));
-			codeblock = _Detab(codeblock);
-			codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines
-			codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace
-
-			codeblock = "<pre><code>" + codeblock + "\n</code></pre>";
-
-			return hashBlock(codeblock) + nextChar;
-		}
-	);
-
-	// attacklab: strip sentinel
-	text = text.replace(/~0/,"");
-
-	return text;
-};
-
-var _DoGithubCodeBlocks = function(text) {
-//
-//  Process Github-style code blocks
-//  Example:
-//  ```ruby
-//  def hello_world(x)
-//    puts "Hello, #{x}"
-//  end
-//  ```
-//
-
-
-	// attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
-	text += "~0";
-
-	text = text.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g,
-		function(wholeMatch,m1,m2) {
-			var language = m1;
-			var codeblock = m2;
-
-			codeblock = _EncodeCode(codeblock);
-			codeblock = _Detab(codeblock);
-			codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines
-			codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace
-
-			codeblock = "<pre><code" + (language ? " class=\"" + language + '"' : "") + ">" + codeblock + "\n</code></pre>";
-
-			return hashBlock(codeblock);
-		}
-	);
-
-	// attacklab: strip sentinel
-	text = text.replace(/~0/,"");
-
-	return text;
-}
-
-var hashBlock = function(text) {
-	text = text.replace(/(^\n+|\n+$)/g,"");
-	return "\n\n~K" + (g_html_blocks.push(text)-1) + "K\n\n";
-}
-
-var _DoCodeSpans = function(text) {
-//
-//   *  Backtick quotes are used for <code></code> spans.
-//
-//   *  You can use multiple backticks as the delimiters if you want to
-//	 include literal backticks in the code span. So, this input:
-//
-//		 Just type ``foo `bar` baz`` at the prompt.
-//
-//	   Will translate to:
-//
-//		 <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
-//
-//	There's no arbitrary limit to the number of backticks you
-//	can use as delimters. If you need three consecutive backticks
-//	in your code, use four for delimiters, etc.
-//
-//  *  You can use spaces to get literal backticks at the edges:
-//
-//		 ... type `` `bar` `` ...
-//
-//	   Turns to:
-//
-//		 ... type <code>`bar`</code> ...
-//
-
-	/*
-		text = text.replace(/
-			(^|[^\\])					// Character before opening ` can't be a backslash
-			(`+)						// $2 = Opening run of `
-			(							// $3 = The code block
-				[^\r]*?
-				[^`]					// attacklab: work around lack of lookbehind
-			)
-			\2							// Matching closer
-			(?!`)
-		/gm, function(){...});
-	*/
-
-	text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,
-		function(wholeMatch,m1,m2,m3,m4) {
-			var c = m3;
-			c = c.replace(/^([ \t]*)/g,"");	// leading whitespace
-			c = c.replace(/[ \t]*$/g,"");	// trailing whitespace
-			c = _EncodeCode(c);
-			return m1+"<code>"+c+"</code>";
-		});
-
-	return text;
-}
-
-var _EncodeCode = function(text) {
-//
-// Encode/escape certain characters inside Markdown code runs.
-// The point is that in code, these characters are literals,
-// and lose their special Markdown meanings.
-//
-	// Encode all ampersands; HTML entities are not
-	// entities within a Markdown code span.
-	text = text.replace(/&/g,"&amp;");
-
-	// Do the angle bracket song and dance:
-	text = text.replace(/</g,"&lt;");
-	text = text.replace(/>/g,"&gt;");
-
-	// Now, escape characters that are magic in Markdown:
-	text = escapeCharacters(text,"\*_{}[]\\",false);
-
-// jj the line above breaks this:
-//---
-
-//* Item
-
-//   1. Subitem
-
-//            special char: *
-//---
-
-	return text;
-}
-
-
-var _DoItalicsAndBold = function(text) {
-
-	// <strong> must go first:
-	text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,
-		"<strong>$2</strong>");
-
-	text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,
-		"<em>$2</em>");
-
-	return text;
-}
-
-
-var _DoBlockQuotes = function(text) {
-
-	/*
-		text = text.replace(/
-		(								// Wrap whole match in $1
-			(
-				^[ \t]*>[ \t]?			// '>' at the start of a line
-				.+\n					// rest of the first line
-				(.+\n)*					// subsequent consecutive lines
-				\n*						// blanks
-			)+
-		)
-		/gm, function(){...});
-	*/
-
-	text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,
-		function(wholeMatch,m1) {
-			var bq = m1;
-
-			// attacklab: hack around Konqueror 3.5.4 bug:
-			// "----------bug".replace(/^-/g,"") == "bug"
-
-			bq = bq.replace(/^[ \t]*>[ \t]?/gm,"~0");	// trim one level of quoting
-
-			// attacklab: clean up hack
-			bq = bq.replace(/~0/g,"");
-
-			bq = bq.replace(/^[ \t]+$/gm,"");		// trim whitespace-only lines
-			bq = _RunBlockGamut(bq);				// recurse
-
-			bq = bq.replace(/(^|\n)/g,"$1  ");
-			// These leading spaces screw with <pre> content, so we need to fix that:
-			bq = bq.replace(
-					/(\s*<pre>[^\r]+?<\/pre>)/gm,
-				function(wholeMatch,m1) {
-					var pre = m1;
-					// attacklab: hack around Konqueror 3.5.4 bug:
-					pre = pre.replace(/^  /mg,"~0");
-					pre = pre.replace(/~0/g,"");
-					return pre;
-				});
-
-			return hashBlock("<blockquote>\n" + bq + "\n</blockquote>");
-		});
-	return text;
-}
-
-
-var _FormParagraphs = function(text) {
-//
-//  Params:
-//    $text - string to process with html <p> tags
-//
-
-	// Strip leading and trailing lines:
-	text = text.replace(/^\n+/g,"");
-	text = text.replace(/\n+$/g,"");
-
-	var grafs = text.split(/\n{2,}/g);
-	var grafsOut = new Array();
-
-	//
-	// Wrap <p> tags.
-	//
-	var end = grafs.length;
-	for (var i=0; i<end; i++) {
-		var str = grafs[i];
-
-		// if this is an HTML marker, copy it
-		if (str.search(/~K(\d+)K/g) >= 0) {
-			grafsOut.push(str);
-		}
-		else if (str.search(/\S/) >= 0) {
-			str = _RunSpanGamut(str);
-			str = str.replace(/^([ \t]*)/g,"<p>");
-			str += "</p>"
-			grafsOut.push(str);
-		}
-
-	}
-
-	//
-	// Unhashify HTML blocks
-	//
-	end = grafsOut.length;
-	for (var i=0; i<end; i++) {
-		// if this is a marker for an html block...
-		while (grafsOut[i].search(/~K(\d+)K/) >= 0) {
-			var blockText = g_html_blocks[RegExp.$1];
-			blockText = blockText.replace(/\$/g,"$$$$"); // Escape any dollar signs
-			grafsOut[i] = grafsOut[i].replace(/~K\d+K/,blockText);
-		}
-	}
-
-	return grafsOut.join("\n\n");
-}
-
-
-var _EncodeAmpsAndAngles = function(text) {
-// Smart processing for ampersands and angle brackets that need to be encoded.
-
-	// Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
-	//   http://bumppo.net/projects/amputator/
-	text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&amp;");
-
-	// Encode naked <'s
-	text = text.replace(/<(?![a-z\/?\$!])/gi,"&lt;");
-
-	return text;
-}
-
-
-var _EncodeBackslashEscapes = function(text) {
-//
-//   Parameter:  String.
-//   Returns:	The string, with after processing the following backslash
-//			   escape sequences.
-//
-
-	// attacklab: The polite way to do this is with the new
-	// escapeCharacters() function:
-	//
-	// 	text = escapeCharacters(text,"\\",true);
-	// 	text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
-	//
-	// ...but we're sidestepping its use of the (slow) RegExp constructor
-	// as an optimization for Firefox.  This function gets called a LOT.
-
-	text = text.replace(/\\(\\)/g,escapeCharacters_callback);
-	text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g,escapeCharacters_callback);
-	return text;
-}
-
-
-var _DoAutoLinks = function(text) {
-
-	text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"<a href=\"$1\">$1</a>");
-
-	// Email addresses: <address@domain.foo>
-
-	/*
-		text = text.replace(/
-			<
-			(?:mailto:)?
-			(
-				[-.\w]+
-				\@
-				[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
-			)
-			>
-		/gi, _DoAutoLinks_callback());
-	*/
-	text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
-		function(wholeMatch,m1) {
-			return _EncodeEmailAddress( _UnescapeSpecialChars(m1) );
-		}
-	);
-
-	return text;
-}
-
-
-var _EncodeEmailAddress = function(addr) {
-//
-//  Input: an email address, e.g. "foo@example.com"
-//
-//  Output: the email address as a mailto link, with each character
-//	of the address encoded as either a decimal or hex entity, in
-//	the hopes of foiling most address harvesting spam bots. E.g.:
-//
-//	<a href="&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101;
-//	   x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;">&#102;&#111;&#111;
-//	   &#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a>
-//
-//  Based on a filter by Matthew Wickline, posted to the BBEdit-Talk
-//  mailing list: <http://tinyurl.com/yu7ue>
-//
-
-	// attacklab: why can't javascript speak hex?
-	function char2hex(ch) {
-		var hexDigits = '0123456789ABCDEF';
-		var dec = ch.charCodeAt(0);
-		return(hexDigits.charAt(dec>>4) + hexDigits.charAt(dec&15));
-	}
-
-	var encode = [
-		function(ch){return "&#"+ch.charCodeAt(0)+";";},
-		function(ch){return "&#x"+char2hex(ch)+";";},
-		function(ch){return ch;}
-	];
-
-	addr = "mailto:" + addr;
-
-	addr = addr.replace(/./g, function(ch) {
-		if (ch == "@") {
-		   	// this *must* be encoded. I insist.
-			ch = encode[Math.floor(Math.random()*2)](ch);
-		} else if (ch !=":") {
-			// leave ':' alone (to spot mailto: later)
-			var r = Math.random();
-			// roughly 10% raw, 45% hex, 45% dec
-			ch =  (
-					r > .9  ?	encode[2](ch)   :
-					r > .45 ?	encode[1](ch)   :
-								encode[0](ch)
-				);
-		}
-		return ch;
-	});
-
-	addr = "<a href=\"" + addr + "\">" + addr + "</a>";
-	addr = addr.replace(/">.+:/g,"\">"); // strip the mailto: from the visible part
-
-	return addr;
-}
-
-
-var _UnescapeSpecialChars = function(text) {
-//
-// Swap back in all the special characters we've hidden.
-//
-	text = text.replace(/~E(\d+)E/g,
-		function(wholeMatch,m1) {
-			var charCodeToReplace = parseInt(m1);
-			return String.fromCharCode(charCodeToReplace);
-		}
-	);
-	return text;
-}
-
-
-var _Outdent = function(text) {
-//
-// Remove one level of line-leading tabs or spaces
-//
-
-	// attacklab: hack around Konqueror 3.5.4 bug:
-	// "----------bug".replace(/^-/g,"") == "bug"
-
-	text = text.replace(/^(\t|[ ]{1,4})/gm,"~0"); // attacklab: g_tab_width
-
-	// attacklab: clean up hack
-	text = text.replace(/~0/g,"")
-
-	return text;
-}
-
-var _Detab = function(text) {
-// attacklab: Detab's completely rewritten for speed.
-// In perl we could fix it by anchoring the regexp with \G.
-// In javascript we're less fortunate.
-
-	// expand first n-1 tabs
-	text = text.replace(/\t(?=\t)/g,"    "); // attacklab: g_tab_width
-
-	// replace the nth with two sentinels
-	text = text.replace(/\t/g,"~A~B");
-
-	// use the sentinel to anchor our regex so it doesn't explode
-	text = text.replace(/~B(.+?)~A/g,
-		function(wholeMatch,m1,m2) {
-			var leadingText = m1;
-			var numSpaces = 4 - leadingText.length % 4;  // attacklab: g_tab_width
-
-			// there *must* be a better way to do this:
-			for (var i=0; i<numSpaces; i++) leadingText+=" ";
-
-			return leadingText;
-		}
-	);
-
-	// clean up sentinels
-	text = text.replace(/~A/g,"    ");  // attacklab: g_tab_width
-	text = text.replace(/~B/g,"");
-
-	return text;
-}
-
-
-//
-//  attacklab: Utility functions
-//
-
-
-var escapeCharacters = function(text, charsToEscape, afterBackslash) {
-	// First we have to escape the escape characters so that
-	// we can build a character class out of them
-	var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g,"\\$1") + "])";
-
-	if (afterBackslash) {
-		regexString = "\\\\" + regexString;
-	}
-
-	var regex = new RegExp(regexString,"g");
-	text = text.replace(regex,escapeCharacters_callback);
-
-	return text;
-}
-
-
-var escapeCharacters_callback = function(wholeMatch,m1) {
-	var charCodeToEscape = m1.charCodeAt(0);
-	return "~E"+charCodeToEscape+"E";
-}
-
-} // end of Showdown.converter
-
-// export
-if (typeof module !== 'undefined') module.exports = Showdown;
diff --git a/docs/slides/flops14/_support/reveal/package.json b/docs/slides/flops14/_support/reveal/package.json
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-	"author": "Hakim El Hattab",
-	"name": "reveal.js",
-	"description": "HTML5 Slideware with Presenter Notes",
-	"version": "1.5.0",
-	"repository": {
-		"type": "git",
-		"url": "git://github.com/hakimel/reveal.js.git"
-	},
-	"engines": {
-		"node": "~0.6.8"
-	},
-	"dependencies": {
-		"underscore" : "1.3.3",
-		"express" : "2.5.9",
-		"socket.io" : "0.9.6",
-		"mustache" : "0.4.0"
-	},
-	"devDependencies": {}
-}
diff --git a/docs/slides/flops14/_support/reveal/plugin/speakernotes/client.js b/docs/slides/flops14/_support/reveal/plugin/speakernotes/client.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/plugin/speakernotes/client.js
+++ /dev/null
@@ -1,35 +0,0 @@
-(function() {
-	// don't emit events from inside the previews themselves
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var socket = io.connect(window.location.origin);
-	var socketId = Math.random().toString().slice(2);
-	
-	console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
-
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		var nextindexh;
-		var nextindexv;
-		var slideElement = event.currentSlide;
-
-		if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-			nextindexh = event.indexh;
-			nextindexv = event.indexv + 1;
-		} else {
-			nextindexh = event.indexh + 1;
-			nextindexv = 0;
-		}
-
-		var notes = slideElement.querySelector('aside.notes');
-		var slideData = {
-			notes : notes ? notes.innerHTML : '',
-			indexh : event.indexh,
-			indexv : event.indexv,
-			nextindexh : nextindexh,
-			nextindexv : nextindexv,
-			socketId : socketId
-		};
-
-		socket.emit('slidechanged', slideData);
-	} );
-}());
diff --git a/docs/slides/flops14/_support/reveal/plugin/speakernotes/index.js b/docs/slides/flops14/_support/reveal/plugin/speakernotes/index.js
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/plugin/speakernotes/index.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var express   = require('express');
-var fs        = require('fs');
-var io        = require('socket.io');
-var _         = require('underscore');
-var Mustache  = require('mustache');
-
-var app       = express.createServer();
-var staticDir = express.static;
-
-io            = io.listen(app);
-
-var opts = {
-	port :      1947,
-	baseDir :   __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		socket.broadcast.emit('slidedata', slideData);
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/notes/:socketId", function(req, res) {
-
-	fs.readFile(opts.baseDir + 'plugin/speakernotes/notes.html', function(err, data) {
-		res.send(Mustache.to_html(data.toString(), {
-			socketId : req.params.socketId
-		}));
-	});
-	// fs.createReadStream(opts.baseDir + 'speakernotes/notes.html').pipe(res);
-});
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m', 
-	green = '\033[32m', 
-	reset = '\033[0m';
-
-var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
-
-console.log( brown + "reveal.js - Speaker Notes" + reset );
-console.log( "1. Open the slides at " + green + slidesLocation + reset );
-console.log( "2. Click on the link your JS console to go to the notes page" );
-console.log( "3. Advance through your slides and your notes will advance automatically" );
diff --git a/docs/slides/flops14/_support/reveal/plugin/speakernotes/notes.html b/docs/slides/flops14/_support/reveal/plugin/speakernotes/notes.html
deleted file mode 100644
--- a/docs/slides/flops14/_support/reveal/plugin/speakernotes/notes.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!doctype html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Slide Notes</title>
-
-		<style>
-			body {
-				font-family: Helvetica;
-			}
-
-			#notes {
-				float: left;
-				font-size: 18px;
-				width: 640px;
-				margin-top: 10px;
-			}
-
-			#wrap-current-slide {
-				width: 400px;
-				height: 320px;
-				float: left;
-				overflow: hidden;
-			}
-
-			#current-slide {
-				width: 800px;
-				height: 600px;
-				border: none;
-				-moz-transform: scale(0.5);
-				-moz-transform-origin: 0 0;
-				-o-transform: scale(0.5);
-				-o-transform-origin: 0 0;
-				-webkit-transform: scale(0.5);
-				-webkit-transform-origin: 0 0;
-			}
-
-			#wrap-next-slide {
-				width: 320px;
-				height: 256px;
-				float: left;
-				margin: 0 0 0 10px;
-				overflow: hidden;
-			}
-
-			#next-slide {
-				width: 800px;
-				height: 600px;
-				border: none;
-				-moz-transform: scale(0.25);
-				-moz-transform-origin: 0 0;
-				-o-transform: scale(0.25);
-				-o-transform-origin: 0 0;
-				-webkit-transform: scale(0.25);
-				-webkit-transform-origin: 0 0;
-			}
-
-			.slides {
-				position: relative;
-				margin-bottom: 10px;
-				border: 1px solid black;
-				border-radius: 2px;
-				background: rgb(28, 30, 32);
-			}
-
-			.slides span {
-				position: absolute;
-				top: 3px;
-				left: 3px;
-				font-weight: bold;
-				font-size: 14px;
-				color: rgba( 255, 255, 255, 0.9 );
-			}
-		</style>
-	</head>
-
-	<body>
-
-		<div id="wrap-current-slide" class="slides">
-			<iframe src="/?receiver" width="800" height="600" id="current-slide"></iframe>
-		</div>
-
-		<div id="notes"></div>
-
-		<div id="wrap-next-slide" class="slides">
-			<iframe src="/?receiver" width="640" height="512" id="next-slide"></iframe>
-			<span>UPCOMING:</span>
-		</div>
-
-		<script src="/socket.io/socket.io.js"></script>
-
-		<script>
-		var socketId = '{{socketId}}';
-		var socket = io.connect(window.location.origin);
-		var notes = document.getElementById('notes');
-		var currentSlide = document.getElementById('current-slide');
-		var nextSlide = document.getElementById('next-slide');
-
-		socket.on('slidedata', function(data) {
-			// ignore data from sockets that aren't ours
-			if (data.socketId !== socketId) { return; }
-
-			notes.innerHTML = data.notes;
-			currentSlide.contentWindow.Reveal.navigateTo(data.indexh, data.indexv);
-			nextSlide.contentWindow.Reveal.navigateTo(data.nextindexh, data.nextindexv);
-		});
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/flops14/_support/template.reveal b/docs/slides/flops14/_support/template.reveal
deleted file mode 100644
--- a/docs/slides/flops14/_support/template.reveal
+++ /dev/null
@@ -1,103 +0,0 @@
-<!doctype html>  
-<html lang="en">
-	
-<head>
-<meta charset="utf-8">
-
-<title>LiquidHaskell FLOPS 2014</title>
-
-<meta name="description" content="LiquidHaskell FLOPS 2014">
-<meta name="author" content="Ranjit Jhala">
-
-<meta name="apple-mobile-web-app-capable" content="yes" />
-<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
-
-<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
-
-<link rel="stylesheet" href="$reveal$/css/main.css">
-<link rel="stylesheet" href="$reveal$/css/theme/seminar.css" id="theme">
-<link rel="stylesheet" href="$reveal$/css/liquidhaskell.css">
-
-<!-- For syntax highlighting -->
-<link rel="stylesheet" href="$reveal$/lib/css/zenburn.css">
-
-<script>
-	// If the query includes 'print-pdf' we'll use the PDF print sheet
-	document.write( '<link rel="stylesheet" href="../_support/reveal_01/css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
-</script>
-
-<!--[if lt IE 9]>
-<script src="lib/js/html5shiv.js"></script>
-<![endif]-->
-</head>
-<body>
-	
-<div class="reveal">
-<!-- 
-Used to fade in a background when a specific slide state is reached
--->
-<div class="state-background"></div>
-
-<!-- Slides
-Any section element inside of this "slides" container is displayed as a slide
--->
-<div class="slides">
-<!-- Pandoc -->
-$if(title)$
-<section class="titlepage">
-<h1 class="title">$title$</h1>
-$for(author)$
-<h2 class="author">$author$</h2>
-$endfor$
-<h3 class="date">$date$</h3>
-</section>
-$endif$
-$body$
-<!-- End Pandoc -->
-
-</div>
-<!-- End Slides -->
-
-<!-- The navigational controls UI -->
-<aside class="controls">
-<a class="left" href="#">&#x25C4;</a>
-<a class="right" href="#">&#x25BA;</a>
-<a class="up" href="#">&#x25B2;</a>
-<a class="down" href="#">&#x25BC;</a>
-</aside>
-
-<!-- Presentation progress bar -->
-<div class="progress"><span></span></div>
-</div>
-
-<!-- Initialize reveal.js :: make settings changes here -->
-<script src="$reveal$/lib/js/head.min.js"></script>
-<script src="$reveal$/js/reveal.js"></script>
-<script>		
-	// Full list of configuration options available here:
-	// https://github.com/hakimel/reveal.js#configuration
-	Reveal.initialize({
-		controls: true,
-		progress: true,
-		history: true,
-		center: false,
-        rollingLinks: false,
-        theme: Reveal.getQueryHash().theme || 'seminar', // available themes are in /css/theme
-		transition: Reveal.getQueryHash().transition || 'default', // default/cube/page/concave/linear(2d)
-
-		// Optional libraries used to extend on reveal.js
-		dependencies: [
-			{ src: '$reveal$/lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
-			{ src: '$reveal$/lib/js/classList.js', condition: function() { return !document.body.classList; } },
-			{ src: '$reveal$/lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-			{ src: '$reveal$/plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-		]
-	});
-</script>
-<!-- Script for LiveReload -->
-<script>document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')
-</script>
-</body>
-</html>
diff --git a/docs/slides/flops14/cleanup b/docs/slides/flops14/cleanup
deleted file mode 100644
--- a/docs/slides/flops14/cleanup
+++ /dev/null
@@ -1,1 +0,0 @@
-find . | grep -E -e '\.(smt2|bak|json|css|md|hi|out|fqout|fq|o|err|annot|log|html|cgi|liquid)$' | xargs rm -rf
diff --git a/docs/slides/flops14/img/RedBlack.png b/docs/slides/flops14/img/RedBlack.png
deleted file mode 100644
Binary files a/docs/slides/flops14/img/RedBlack.png and /dev/null differ
diff --git a/docs/slides/flops14/lhs/00_Index.lhs b/docs/slides/flops14/lhs/00_Index.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/00_Index.lhs
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
- {#ASD}
-=======
-
-Liquid Types For Haskell
-------------------------
-
-
-<br>
-<br>
-
-**Ranjit Jhala**
-
-University of California, San Diego
-
-<br>
-<br>
-
-
-Joint work with: 
-
-N. Vazou, E. Seidel, P. Rondon, D. Vytiniotis, S. Peyton-Jones
-
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-Well-Typed Programs Can Go Wrong
-================================
-
- {#asd}
--------
-
-Division By Zero
-----------------
-
-<div class="fragment"> 
-\begin{code} <div/> 
-λ> let average xs = sum xs `div` length xs
-
-λ> average [1,2,3]
-2
-\end{code}
-</div>
-
-<div class="fragment"> 
-
-\begin{code} <br> 
-λ> average []
-*** Exception: divide by zero
-\end{code}
-
-</div>
-
-Missing Keys
-------------
-
-<div class="fragment"> 
-\begin{code} <div/> 
-λ> :m +Data.Map 
-λ> let m = fromList [ ("haskell", "lazy")
-                    , ("ocaml"  , "eager")]
-
-λ> m ! "haskell"
-"lazy"
-\end{code}
-</div>
-
-<div class="fragment"> 
-\begin{code} <br> 
-λ> m ! "javascript"
-"*** Exception: key is not in the map
-\end{code}
-</div>
-
-Segmentation Faults
--------------------
-
-<div class="fragment"> 
-\begin{code} <div/> 
-λ> :m +Data.Vector 
-λ> let v = fromList ["haskell", "ocaml"]
-λ> unsafeIndex v 0
-"haskell"
-\end{code}
-</div>
-
-<div class="fragment"> 
-\begin{code} <br> 
-λ> V.unsafeIndex v 3
-
-
-'ghci' terminated by signal SIGSEGV ...
-\end{code}
-</div>
-
-
-"HeartBleeds"
--------------
-
-\begin{code} <div/>
-λ> :m + Data.Text Data.Text.Unsafe 
-λ> let t = pack "Kanazawa"
-λ> takeWord16 5 t
-"Kanaz"
-\end{code}
-
-<br>
-
-<div class="fragment"> 
-Memory overflows **leaking secrets**...
-
-<br>
-
-\begin{code} <div/>
-λ> takeWord16 20 t
-"kamakura\1912\3148\SOH\NUL\15928\2486\SOH\NUL"
-\end{code}
-</div>
-
-Goal
-----
-
-Extend Hindley-Milner To Prevent More Errors
-
-Liquid Types for Haskell
-========================
-
-LiquidHaskell
--------------
-
-<br>
-<br>
-
-<div class="fragment">Refine **types** with **predicates**</div>
-
-<br>
-<br>
-
-<div class="fragment">**Expressive** specification & **Automatic** verification</div>
-
-
-
-Automatic
----------
-
-[Liquid Types, PLDI 08](http://goto.ucsd.edu/~rjhala/liquid/liquid_types.pdf)
-
-<br>
-
-+ Abstract Interpretation 
-
-+ SMT Solvers 
-
-Expressive
-----------
-
-<br>
-<br>
-
-This talk ...
-
-Try Yourself
-------------
-
-<br>
-
-**google: ** `"liquidhaskell demo"` 
-
- {#zog} 
---------
-
-<br>
-<br>
-<br>
-<br>
-
-[[continue]](01_SimpleRefinements.lhs.slides.html)
-
-
-Plan 
-----
-
-1. <a href="01_SimpleRefinements.lhs.slides.html" target= "_blank">Refinements
-2. <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-3. <div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target= "_blank">Higher-Order Functions</a></div>
-4. <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements:</a> <a href="06_Inductive.lhs.slides.html" target="_blank">Code</a>, <a href="08_Recursive.lhs.slides.html" target= "_blank">Data</a>,<a href="07_Array.lhs.slides.html" target= "_blank">...</a>,<a href="05_Composition.lhs.slides.html" target= "_blank">...</a></div>
-5. <div class="fragment"><a href="09_Laziness.lhs.slides.html" target="_blank">Lazy Evaluation</a></div>
-6. <div class="fragment"><a href="10_Termination.lhs.slides.html" target="_blank">Termination</a></div>
-7. <div class="fragment"><a href="11_Evaluation.lhs.slides.html" target="_blank">Evaluation</a></div>
-
diff --git a/docs/slides/flops14/lhs/01_SimpleRefinements.lhs b/docs/slides/flops14/lhs/01_SimpleRefinements.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/01_SimpleRefinements.lhs
+++ /dev/null
@@ -1,391 +0,0 @@
- {#simplerefinements}
-=======================
-
-Simple Refinement Types
------------------------
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-module SimpleRefinements where
-import Language.Haskell.Liquid.Prelude
-import Prelude hiding (abs, max)
-
--- boring haskell type sigs
-zero    :: Int
-zero'   :: Int
-safeDiv :: Int -> Int -> Int
-abs     :: Int -> Int
-nats    :: L Int
-evens   :: L Int
-odds    :: L Int
-range   :: Int -> Int -> L Int
-\end{code}
-
-</div>
-
-
-Simple Refinement Types
-=======================
-
-
-Types + Predicates 
-------------------
-
-
-Ex: `Int`egers equal to `0`
----------------------------
-
-<br>
-
-\begin{code}
-{-@ type EqZero = {v:Int | v = 0} @-}
-
-{-@ zero :: EqZero @-}
-zero     =  0
-\end{code}
-
-<br>
-
-<div class="fragment">
-Refinement types via special comments `{-@ ... @-}` 
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo</a> 
-</div>
-
-
-
-Refinements Are Predicates
-==========================
-
-From A Decidable Logic
-----------------------
-
-1. Expressions
-
-2. Predicates
-
-
-Expressions
------------
-
-<br>
-
-\begin{code} <div/> 
-e := x, y, z,...      -- variable
-   | 0, 1, 2,...      -- constant
-   | (e + e)          -- addition
-   | (e - e)          -- subtraction
-   | (c * e)          -- linear multiplication
-   | (v e1 e2 ... en) -- uninterpreted function
-\end{code}
-
-Predicates
-----------
-
-<br>
-
-\begin{code} <div/>
-p := e           -- atom 
-   | e1 == e2    -- equality
-   | e1 <  e2    -- ordering 
-   | (p && p)    -- and
-   | (p || p)    -- or
-   | (not p)     -- negation
-\end{code}
-
-
-Subtyping is Implication
-------------------------
-
-[PVS' Predicate Subtyping](http://pvs.csl.sri.com/papers/subtypes98/tse98.pdf)
-
-
-<!--
-
-Subtyping is Implication
-------------------------
-
-<br>
-<br>
-
---------  ---  ------------------   ---------   ------------------
-  **If**   :   Refinement of `S`    *implies*   Refinement of `T` 
-
-**Then**   :   `S`                  *subtype*   `T`
---------  ---  ------------------   ---------   ------------------
-
-<br>
-
--->
-
-Subtyping is Implication
-------------------------
-
-
-<br>
-<br>
-
----------   ------------   --------------------------   
-  **If:**            `P`   `=> Q` 
-            
-**Then:**    `{v:t | P}`   `<: {v:t | Q}`
----------   ------------   --------------------------   
-
-
-Example: Natural Numbers
-------------------------
-
-\begin{code} <div/> 
-        type Nat = {v:Int | 0 <= v}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
--------------    ---------  ----------------
-  **By SMT:**      `v = 0`  `=>`  `0 <= v` 
-             
-      **So:**     `EqZero`  `<:`  `Nat`
--------------    ---------  ----------------
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-Hence, we can type:
-
-\begin{code}
-{-@ zero' :: Nat @-}
-zero'     =  zero   -- zero :: EqZero <: Nat
-\end{code}
-</div>
-
- {#universalinvariants}
-=======================
-
-Types = Universal Invariants
-----------------------------
-
-(Notoriously hard with *pure* SMT)
-
-Types Yield Universal Invariants
-================================
-
-Example: Lists
---------------
-
-<div class="hidden">
-\begin{code}
-infixr `C`
-\end{code}
-</div>
-
-\begin{code}
-data L a = N | C a (L a)
-\end{code}
-
-<br>
-
-<div class="fragment">
-*Every element* in `nats` is non-negative:
-
-<br>
-
-\begin{code}
-{-@ nats :: L Nat @-}
-nats     =  0 `C` 1 `C` 3 `C` N
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if `nats` contained `-2`? 
-
-</div>
-
-Example: Even/Odd Lists
------------------------
-
-\begin{code}
-{-@ type Even = {v:Int | v mod 2 =  0} @-}
-{-@ type Odd  = {v:Int | v mod 2 /= 0} @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ evens :: L Even @-}
-evens     =  0 `C` 2 `C` 4 `C` N
-
-{-@ odds  :: L Odd  @-}
-odds      =  1 `C` 3 `C` 5 `C` N 
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if `evens` contained `1`? 
-</div>
-
-
-
-Contracts: Function Types
-=========================
-
- {#as}
-------
-
-Example: `safeDiv`
-------------------
-
-<br>
-
-**Precondition** divisor is *non-zero*.
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-\end{code}
-
-</div>
-
-
-Example: `safeDiv`
-------------------
-
-<br>
-
-+ **Pre-condition** divisor is *non-zero*.
-+ **Input type** specifies *pre-condition*
-
-<br>
-
-\begin{code}
-{-@ safeDiv :: Int -> NonZero -> Int @-}
-safeDiv x y = x `div` y
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if precondition does not hold?
-
-</div>
-
-Example: `abs`
---------------
-
-<br>
-
-+ **Postcondition** result is non-negative
-+ **Output type** specifies *post-condition*
-
-<br>
-
-\begin{code}
-{-@ abs       :: x:Int -> Nat @-}
-abs x 
-  | 0 <= x    = x 
-  | otherwise = 0 - x
-\end{code}
-
-
- {#dependentfunctions}
-======================
-
-Dependent Function Types
-------------------------
-
-<br>
-
-Outputs **refer to** inputs
-
-<br>
-
-**Relational** invariants
-
-
-Dependent Function Types
-========================
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s **between** `i` and `j`
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s **between** `i` and `j`
-
-<br>
-
-\begin{code}
-{-@ type Btwn I J = {v:_ | (I<=v && v<J)} @-}
-\end{code}
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-<br>
-
-\begin{code}
-{-@ range :: i:Int -> j:Int -> L (Btwn i j) @-}
-range i j            = go i
-  where
-    go n | n < j     = n `C` go (n + 1)  
-         | otherwise =  N
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Note:** Type of `go` is automatically inferred
-</div>
-
-
-Example: Indexing Into List
----------------------------
-
-\begin{code} 
-(!)          :: L a -> Int -> a
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "Oops!"
-\end{code}
-
-<br>
-
-<div class="fragment">(Mouseover to view type of `liquidError`)</div>
-
-<br>
-
-<div class="fragment">To ensure safety, *require* `i` between `0` and list **length**</div>
-
-<br>
-
-<div class="fragment">Need way to **measure** the length of a list [[continue...]](02_Measures.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/flops14/lhs/02_Measures.lhs b/docs/slides/flops14/lhs/02_Measures.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/02_Measures.lhs
+++ /dev/null
@@ -1,441 +0,0 @@
-
- {#measures}
-============
-
-Measuring Data Types
---------------------
-
-<div class="hidden">
-
-\begin{code}
-module Measures where
-import Prelude hiding ((!!), length)
-import Language.Haskell.Liquid.Prelude
-
-length      :: L a -> Int
-(!)         :: L a -> Int -> a
-insert      :: Ord a => a -> L a -> L a
-insertSort  :: Ord a => [a] -> L a
-
-infixr `C`
-\end{code}
-
-</div>
-
-
-Measuring Data Types 
-====================
-
-Recap
------
-
-1. <div class="fragment">**Refinements:** Types + Predicates</div>
-2. <div class="fragment">**Subtyping:** SMT Implication</div>
-
-
-Example: Length of a List 
--------------------------
-
-Given a type for lists:
-
-<br>
-
-\begin{code}
-data L a = N | C a (L a)
-\end{code}
-
-<div class="fragment">
-<br>
-
-We can define the **length** as:
-
-<br>
-
-\begin{code}
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-\end{code}
-
-</div>
-
-Example: Length of a List 
--------------------------
-
-\begin{code} <div/>
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-\end{code}
-
-<br>
-
-LiquidHaskell **strengthens** data constructor types
-
-<br>
-
-\begin{code} <div/>
-data L a where 
-  N :: {v: L a | (llen v) = 0}
-  C :: a -> t:_ -> {v:_| llen v = 1 + llen t}
-\end{code}
-
-Measures Are Uninterpreted
---------------------------
-
-\begin{code} <br>
-data L a where 
-  N :: {v: L a | (llen v) = 0}
-  C :: a -> t:_ -> {v:_| llen v = 1 + llen t}
-\end{code}
-
-<br>
-
-`llen` is an **uninterpreted function** in SMT logic
-
-Measures Are Uninterpreted
---------------------------
-
-<br>
-
-In SMT, [uninterpreted function](http://fm.csl.sri.com/SSFT12/smt-euf-arithmetic.pdf) `f` obeys *congruence* axiom:
-
-<br>
-
-`forall x y. (x = y) => (f x) = (f y)`
-
-<br>
-
-<div class="fragment">
-All other facts about `llen` asserted at **fold** and **unfold**
-</div>
-
-Measures Are Uninterpreted
---------------------------
-
-Facts about `llen` asserted at *syntax-directed* **fold** and **unfold**
-
-<br>
-
-<div class="fragment">
-\begin{code}**Fold**<br>
-z = C x y     -- z :: {v | llen v = 1 + llen y}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{code}**Unfold**<br>
-case z of 
-  N     -> e1 -- z :: {v | llen v = 0}
-  C x y -> e2 -- z :: {v | llen v = 1 + llen y}
-\end{code}
-</div>
-
-
-Measured Refinements
---------------------
-
-Now, we can verify:
-
-<br>
-
-\begin{code}
-{-@ length      :: xs:L a -> (EqLen xs) @-}
-length N        = 0
-length (C _ xs) = 1 + length xs
-\end{code}
-
-<div class="fragment">
-
-<br>
-
-Where `EqLen` is a type alias:
-
-\begin{code}
-{-@ type EqLen Xs = {v:Nat | v = (llen Xs)} @-}
-\end{code}
-
-</div>
-
-List Indexing Redux
--------------------
-
-We can type list lookup:
-
-\begin{code}
-{-@ (!)      :: xs:L a -> (LtLen xs) -> a @-}
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "never happens!"
-\end{code}
-
-<br>
-
-<div class="fragment">
-Where `LtLen` is a type alias:
-
-\begin{code}
-{-@ type LtLen Xs = {v:Nat | v < (llen Xs)} @-}
-\end{code}
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellMeasure.hs" target= "_blank">Demo:</a> 
-&nbsp; What if we *remove* the precondition?
-
-</div>
-
-Multiple Measures
-=================
-
- {#adasd}
----------
-
-LiquidHaskell allows *many* measures for a type
-
-
-Ex: List Emptiness 
-------------------
-
-Measure describing whether a `List` is empty 
-
-\begin{code}
-{-@ measure isNull :: (L a) -> Prop
-    isNull (N)      = true
-    isNull (C x xs) = false           @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-LiquidHaskell **strengthens** data constructors
-
-\begin{code} <div/> 
-data L a where 
-  N :: {v : L a | (isNull v)}
-  C :: a -> L a -> {v:(L a) | not (isNull v)}
-\end{code}
-
-</div>
-
-Conjoining Refinements
-----------------------
-
-Data constructor refinements are **conjoined** 
-
-\begin{code} <br>
-data L a where 
-  N :: {v:L a |  (llen v) = 0 
-              && (isNull v) }
-  C :: a 
-    -> xs:L a 
-    -> {v:L a |  (llen v) = 1 + (llen xs) 
-              && not (isNull v)          }
-\end{code}
-
-Multiple Measures: Red-Black Trees
-==================================
-
- {#asdad}
----------
-
-<img src="../img/RedBlack.png" height=300px>
-
-+ <div class="fragment">**Color Invariant:** `Red` nodes have `Black` children</div>
-+ <div class="fragment">**Height Invariant:** Number of `Black` nodes equal on *all paths*</div>
-<br>
-
-[[Skip...]](#/4)
-
-Basic Type 
-----------
-
-\begin{code} <br>
-data Tree a = Leaf 
-            | Node Color a (Tree a) (Tree a)
-
-data Color  = Red 
-            | Black
-\end{code}
-
-Color Invariant 
----------------
-
-`Red` nodes have `Black` children
-
-<div class="fragment">
-\begin{code} <br>
-measure isRB        :: Tree a -> Prop
-isRB (Leaf)         = true
-isRB (Node c x l r) = c=Red => (isB l && isB r)
-                      && isRB l && isRB r
-\end{code}
-</div>
-
-<div class="fragment">
-\begin{code} where <br>
-measure isB         :: Tree a -> Prop 
-isB (Leaf)          = true
-isB (Node c x l r)  = c == Black 
-\end{code}
-</div>
-
-*Almost* Color Invariant 
-------------------------
-
-<br>
-
-Color Invariant **except** at root. 
-
-<br>
-
-<div class="fragment">
-\begin{code} <br>
-measure isAlmost        :: Tree a -> Prop
-isAlmost (Leaf)         = true
-isAlmost (Node c x l r) = isRB l && isRB r
-\end{code}
-</div>
-
-
-Height Invariant
-----------------
-
-Number of `Black` nodes equal on **all paths**
-
-<div class="fragment">
-\begin{code} <br>
-measure isBH        :: RBTree a -> Prop
-isBH (Leaf)         =  true
-isBH (Node c x l r) =  bh l = bh r 
-                    && isBH l && isBH r 
-\end{code}
-</div>
-
-<div class="fragment">
-\begin{code} where <br>
-measure bh        :: RBTree a -> Int
-bh (Leaf)         = 0
-bh (Node c x l r) = bh l 
-                  + if c = Red then 0 else 1
-\end{code}
-</div>
-
-Refined Type 
-------------
-
-\begin{code} <br>
--- Red-Black Trees
-type RBT a  = {v:Tree a | isRB v && isBH v}
-
--- Almost Red-Black Trees
-type ARBT a = {v:Tree a | isAlmost v && isBH v}
-\end{code}
-
-<br>
-
-[Details](https://github.com/ucsd-progsys/liquidhaskell/blob/master/tests/pos/RBTree.hs)
-
-
-Measures vs. Index Types
-========================
-
-Decouple Property & Type 
-------------------------
-
-Unlike [indexed types](http://dl.acm.org/citation.cfm?id=270793) ...
-
-<br>
-
-<div class="fragment">
-
-+ Measures **decouple** properties from structures
-
-+ Support **multiple** properties over structures 
-
-+ Enable  **reuse** of structures in different contexts                 
-
-</div>
-
-<br>
-
-<div class="fragment">Invaluable in practice!</div>
-
-Refined Data Constructors
-=========================
-
- {#asd}
--------
-
-Can encode invariants **inside constructors**
-
-<div class="fragment">
-
-<br>
-
-\begin{code}
-{-@ data L a = N
-             | C { x  :: a 
-                 , xs :: L {v:a| x <= v} } @-}
-\end{code}
-</div>
-<br>
-
-<div class="fragment">
-Head `x` is less than **every** element of tail `xs`
-</div>
-
-<br>
-
-<div class="fragment">
-i.e. specifies **increasing** Lists 
-</div>
-
-Increasing Lists 
-----------------
-
-\begin{code} <br>
-data L a where
-  N :: L a
-  C :: x:a -> xs: L {v:a | x <= v} -> L a
-\end{code}
-
-<br>
-
-- <div class="fragment">LiquidHaskell **checks** property when **folding** `C`</div>
-- <div class="fragment">LiquidHaskell **assumes** property when **unfolding** `C`</div>
-
-Increasing Lists 
-----------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellInsertSort.hs" target= "_blank">Demo: Insertion Sort</a> (hover for inferred types) 
-
-<br>
-
-\begin{code}
-insertSort = foldr insert N
-
-insert y (x `C` xs) 
-  | y <= x    = y `C` (x `C` xs)
-  | otherwise = x `C` insert y xs
-insert y N    = y `C` N    
-\end{code}
-
-<br>
-
-<div class="fragment">**Problem 1:** What if we need *both* [increasing and decreasing lists](http://web.cecs.pdx.edu/~sheard/Code/QSort.html)?</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. **Measures:** Strengthened Constructors
-    - <div class="fragment">**Decouple** property from structure</div>
-    - <div class="fragment">**Reuse** structure across *different* properties</div>
-
-<br>
-
-<div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target="_blank">[continue]</a></div>
diff --git a/docs/slides/flops14/lhs/03_HigherOrderFunctions.lhs b/docs/slides/flops14/lhs/03_HigherOrderFunctions.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/03_HigherOrderFunctions.lhs
+++ /dev/null
@@ -1,215 +0,0 @@
-  {#hofs}
-=========
-
-<div class="hidden">
-\begin{code}
-module Loop (
-    listSum
-  , sumNats
-  ) where
-
-import Prelude
-
-{-@ LIQUID "--no-termination"@-}
-sumNats  :: [Int] -> Int
-add         :: Int -> Int -> Int
-\end{code}
-</div>
-
-Higher-Order Specifications
----------------------------
-
-Types scale to *Higher-Order* Specifications
-
-<br>
-
-<div class="fragment">
-
-+ map
-+ fold
-+ visitors
-+ callbacks
-+ ...
-
-</div>
-
-<br>
-
-<div class="fragment">Very difficult with *first-order program logics*</div>
-
-
-Higher Order Specifications
-===========================
-
-Example: Higher Order Loop
---------------------------
-
-<br>
-
-\begin{code}
-loop :: Int -> Int -> α -> (Int -> α -> α) -> α
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-LiquidHaskell infers `f` called with values `(Btwn lo hi)`
-
-
-Example: Summing Lists
-----------------------
-
-\begin{code}
-listSum     :: [Int] -> Int
-listSum xs  = loop 0 n 0 body 
-  where 
-    body    = \i acc -> acc + (xs !! i)
-    n       = length xs
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Function Subtyping** 
-
-+ `body` called with `i :: Btwn 0 (llen xs)`
-
-+ Hence, indexing with `!!` is safe.
-</div>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Loop.hs" target= "_blank">Demo:</a> Tweak `loop` exit condition? 
-</div>
-
-Polymorphic Instantiation
-=========================
-
- {#poly}
---------
-
-Example: Summing `Nat`s
------------------------
-
-\begin{code}
-{-@ sumNats :: [Nat] -> Nat @-}
-sumNats xs  = foldl (+) 0 xs 
-\end{code}
-
-<br>
-
-<div class="fragment">
-\begin{code} Recall 
-foldl :: (α -> β -> α) -> α -> [β] -> α
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-How to **instantiate** `α` and `β` ?
-</div>
-
-Function Subtyping
-------------------
-
-\begin{code}<div/>
-(+) ::  x:Int -> y:Int -> {v:Int|v=x+y} 
-    <:  Nat   -> Nat   -> Nat
-\end{code}
-
-<br>
-
-<div class="fragment">
-Because,
-
-\begin{code}<div/>
-               |- Nat       <: Int  -- Contra
-  x:Nat, y:Nat |- {v = x+y} <: Nat  -- Co
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-Because,
-
-\begin{code}<div/>
-  0<=x && 0<=y && v = x+y   => 0 <= v
-\end{code}
-</div>
-
-Example: Summing `Nat`s
------------------------
-
-\begin{code} <div/> 
-{-@ sumNats :: [Nat] -> Nat @-}
-sumNats xs  = foldl (+) 0 xs 
-\end{code}
-
-<br>
-
-\begin{code} Where:
-foldl :: (α -> β -> α) -> α -> [β] -> α
-(+)   :: Nat -> Nat -> Nat
-\end{code}
-
-<br>
-
-<div class="fragment">
-`sumNats` verified by **instantiating** `α,β := Nat`
-</div>
-
-<br>
-
-<div class="fragment">
-`α` is **loop invariant**, instantiation is invariant **synthesis**
-</div>
-
-Instantiation And Inference
----------------------------
-
-Polymorphic instantiation happens *everywhere*...
-
-<br>
-
-... so *automatic inference* is crucial
-
-<br>
-
-Cannot use *unification* (unlike indexed approaches)
-
-<br>
-
-LiquidHaskell uses [SMT and Abstract Interpretation.](http://goto.ucsd.edu/~rjhala/papers/liquid_types.html)
-
-
-Iteration Dependence
---------------------
-
-**Problem:** Cannot use parametric polymorphism to verify
-
-<br>
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-As property only holds after **last iteration** ...
-
-... cannot instantiate `α := {v:Int | v = n + m}`
-</div>
-
-<br>
-
-<div class="fragment">
-**Problem:** Need *iteration-dependent* invariants...&nbsp; &nbsp; [[Continue]](04_AbstractRefinements.lhs.slides.html)
-</div>
-
diff --git a/docs/slides/flops14/lhs/04_AbstractRefinements.lhs b/docs/slides/flops14/lhs/04_AbstractRefinements.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/04_AbstractRefinements.lhs
+++ /dev/null
@@ -1,330 +0,0 @@
-  {#abstractrefinements}
-========================
-
-<div class="hidden">
-
-\begin{code}
-module AbstractRefinements where
-
-import Prelude 
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
-o, no        :: Int
-maxInt       :: Int -> Int -> Int
-\end{code}
-</div>
-
-
-
-Abstract Refinements
---------------------
-
-
-
-Abstract Refinements
-====================
-
-Two Problems
-------------
-
-<br>
-<br>
-
-<div class="fragment">
-
-**Problem 1:** 
-
-How do we specify *both* increasing and decreasing lists?
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Problem 2:** 
-
-How do we specify *iteration-dependence* in higher-order functions?
-
-</div>
-
-
-Problem Is Pervasive
---------------------
-
-Lets distill it to a simple example...
-
-<div class="fragment">
-
-<br>
-
-(First, a few aliases)
-
-<br>
-
-\begin{code}
-{-@ type Odd  = {v:Int | (v mod 2) = 1} @-}
-{-@ type Even = {v:Int | (v mod 2) = 0} @-}
-\end{code}
-
-</div>
-
-
-Example: `maxInt` 
------------------
-
-Compute the larger of two `Int`s:
-
-\begin{code} <br> 
-maxInt     :: Int -> Int -> Int 
-maxInt x y = if y <= x then x else y
-\end{code}
-
-
-
-Example: `maxInt` 
------------------
-
-Has **many incomparable** refinement types
-
-\begin{code}<br>
-maxInt :: Nat  -> Nat  -> Nat
-maxInt :: Even -> Even -> Even
-maxInt :: Odd  -> Odd  -> Odd 
-\end{code}
-
-<br>
-
-<div class="fragment">Oh no! **Which** one should we use?</div>
-
-
-Refinement Polymorphism 
------------------------
-
-`maxInt` returns *one of* its two inputs `x` and `y` 
-
-<div class="fragment">
-
-<div align="center">
-
-<br>
-
----------   ---   -------------------------------------------
-   **If**    :    the *inputs* satisfy a property  
-
- **Then**    :    the *output* satisfies that property
----------   ---   -------------------------------------------
-
-<br>
-
-</div>
-</div>
-
-<div class="fragment">Above holds *for all properties*!</div>
-
-<br>
-
-<div class="fragment"> 
-
-**Need to abstract properties over types**
-
-</div>
-
-<!--
-
-By Type Polymorphism?
----------------------
-
-\begin{code} <br> 
-max     :: α -> α -> α 
-max x y = if y <= x then x else y
-\end{code}
-
-<div class="fragment"> 
-
-Instantiate `α` at callsites
-
-\begin{code}
-{-@ o :: Odd  @-}
-o = maxInt 3 7     -- α := Odd
-
-{-@ e :: Even @-}
-e = maxInt 2 8     -- α := Even
-\end{code}
-
-</div>
-
-By Type Polymorphism?
----------------------
-
-\begin{code} <br> 
-max     :: α -> α -> α 
-max x y = if y <= x then x else y
-\end{code}
-
-<br>
-
-But there is a fly in the ointment ...
-
-Polymorphic `max` in Haskell
-----------------------------
-
-\begin{code} In Haskell the type of max is
-max :: (Ord α) => α -> α -> α
-\end{code}
-
-<br>
-
-\begin{code} Could *ignore* the class constraints, instantiate as before...
-{-@ o :: Odd @-}
-o     = max 3 7  -- α := Odd 
-\end{code}
-
-
-Polymorphic `(+)` in Haskell
-----------------------------
-
-\begin{code} ... but this is *unsound*!
-max :: (Ord α) => α -> α -> α
-(+) :: (Num α) => α -> α -> α
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-*Ignoring* class constraints would let us "prove":
-
-\begin{code}
-{-@ no :: Odd @-}
-no     = 3 + 7    -- α := Odd !
-\end{code}
-
-</div>
-
-Type Polymorphism? No.
-----------------------
-
-<div class="fragment">Need to try a bit harder...</div>
-
--->
-
-Parametric Refinements 
-----------------------
-
-Enable *quantification over refinements* ...
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">Type says: **for any** `p` that is a property of `Int`, </div>
-
-- <div class="fragment">`max` **takes** two `Int`s that satisfy `p`,</div>
-
-- <div class="fragment">`max` **returns** an `Int` that satisfies `p`.</div>
-
-Parametric Refinements 
-----------------------
-
-Enable *quantification over refinements* ...
-
-<br>
-
-\begin{code}<div/>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-[Key idea: ](http://goto.ucsd.edu/~rjhala/papers/abstract_refinement_types.html) &nbsp; `Int<p>`  &nbsp; is just  &nbsp; `{v:Int | (p v)}`
-
-<br>
-
-i.e., Abstract Refinement is an **uninterpreted function** in SMT logic
-
-Parametric Refinements 
-----------------------
-
-\begin{code}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-**Check** and **Instantiate** 
-
-Using [SMT and Abstract Interpretation.](http://goto.ucsd.edu/~rjhala/papers/liquid_types.html)
-
-
-Using Abstract Refinements
---------------------------
-
-- <div class="fragment">**When** we call `maxInt` with args with some refinement,</div>
-
-- <div class="fragment">**Then** `p` instantiated with *same* refinement,</div>
-
-- <div class="fragment">**Result** of call will also have *same* concrete refinement.</div>
-
-<div class="fragment">
-
-\begin{code}
-{-@ o' :: Odd  @-}
-o' = maxInt 3 7     -- p := \v -> Odd v 
-
-{-@ e' :: Even @-}
-e' = maxInt 2 8     -- p := \v -> Even v 
-\end{code}
-
-</div>
-
-Using Abstract Refinements
---------------------------
-
-Or any other property ...
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type RGB = {v:_ | (0 <= v && v < 256)} @-}
-
-{-@ rgb :: RGB @-}
-rgb = maxInt 56 8   -- p := \v -> 0 <= v < 256
-\end{code}
-
-</div>
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. **Abstract Refinements** over Types
-
-<br>
-<br>
-
-<div class="fragment">
-  Abstract Refinements are *very* expressive ... <a href="06_Inductive.lhs.slides.html" target="_blank">[continue]</a>
-</div>
-
diff --git a/docs/slides/flops14/lhs/05_Composition.lhs b/docs/slides/flops14/lhs/05_Composition.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/05_Composition.lhs
+++ /dev/null
@@ -1,161 +0,0 @@
-Abstract Refinements {#composition}
-===================================
-
-Very General Mechanism 
-----------------------
-
-**Next:** Lets add parameters...
-
-<div class="hidden">
-\begin{code}
-module Composition where
-
-import Prelude hiding ((.))
-
-plus     :: Int -> Int -> Int
-plus3'   :: Int -> Int
-\end{code}
-</div>
-
-
-Example: `plus`
----------------
-
-\begin{code}
-{-@ plus :: x:_ -> y:_ -> {v:_ | v=x+y} @-}
-plus x y = x + y
-\end{code}
-
-
-Example: `plus 3` 
------------------
-
-<br>
-
-\begin{code}
-{-@ plus3' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3'     = plus 3
-\end{code}
-
-<br>
-
-Easily verified by LiquidHaskell
-
-A Composed Variant
-------------------
-
-Lets define `plus3` by *composition*
-
-A Composition Operator 
-----------------------
-
-\begin{code}
-(#) :: (b -> c) -> (a -> b) -> a -> c
-(#) f g x = f (g x)
-\end{code}
-
-
-`plus3` By Composition
------------------------
-
-\begin{code}
-{-@ plus3'' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3''     = plus 1 # plus 2
-\end{code}
-
-<br>
-
-Yikes! Verification *fails*. But why?
-
-<br>
-
-<div class="fragment">(Hover mouse over `#` for a clue)</div>
-
-How to type compose (#) ? 
--------------------------
-
-This specification is *too weak* <br>
-
-\begin{code} <br>
-(#) :: (b -> c) -> (a -> b) -> (a -> c)
-\end{code}
-
-<br>
-
-Output type does not *relate* `c` with `a`!
-
-How to type compose (.) ?
--------------------------
-
-Write specification with abstract refinement type:
-
-<br>
-
-\begin{code}
-{-@ (.) :: forall <p :: b->c->Prop, 
-                   q :: a->b->Prop>.
-             f:(x:b -> c<p x>) 
-          -> g:(x:a -> b<q x>) 
-          -> y:a -> exists[z:b<q y>].c<p z>
- @-}
-(.) f g y = f (g y)
-\end{code}
-
-Using (.) Operator 
-------------------
-
-<br>
-
-\begin{code}
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br>
-
-<div class="fragment">*Verifies!*</div>
-
-
-Using (.) Operator 
-------------------
-
-\begin{code} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br>
-
-LiquidHaskell *instantiates*
-
-- `p` with `\x -> v = x + 1`
-- `q` with `\x -> v = x + 2`
-
-Using (.) Operator 
-------------------
-
-\begin{code} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br> To *infer* that output of `plus3` has type: 
-
-`exists [z:{v = y + 2}].{v = z + 1}`
-
-<div class="fragment">
-
-`<:`
-
-`{v:Int|v=3}`
-</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract:** Refinements over Type Signatures
-    + <div class="fragment">*Dependencies* using refinement parameters</div>
diff --git a/docs/slides/flops14/lhs/06_Inductive.lhs b/docs/slides/flops14/lhs/06_Inductive.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/06_Inductive.lhs
+++ /dev/null
@@ -1,457 +0,0 @@
-Abstract Refinements {#induction}
-=================================
-
-Induction
----------
-
-Encoding *induction* with Abstract refinements
-
-<div class="hidden">
-
-\begin{code}
-module Loop where
-import Prelude hiding ((!!), foldr, length, (++))
--- import Measures
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-
-size  :: L a -> Int
-add   :: Int -> Int -> Int
-loop  :: Int -> Int -> α -> (Int -> α -> α) -> α
-foldr :: (L a -> a -> b -> b) -> b -> L a -> b
-\end{code}
-</div>
-
-Induction
-=========
-
-Example: `loop` redux 
----------------------
-
-Recall the *higher-order* `loop` 
-
-<br>
-
-\begin{code}
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-**Problem**
-
-- As property only holds after *last* loop iteration...
-
-- ... cannot instantiate `α` with `{v:Int | v = n + m}`
-
-</div>
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-**Problem** 
-
-Need invariant relating *iteration* `i` with *accumulator* `acc`
-
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-**Solution** 
-
-- Abstract Refinement `p :: Int -> a -> Prop`
-
-- `(p i acc)` relates *iteration* `i` with *accumulator* `acc`
-
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-<div class="fragment">
-<div align="center">
-
-------------  ---   ----------------------------
-  **Assume**   :    `out = loop lo hi base f` 
-
-   **Prove**   :    `(p hi out)`
-------------  ---   ----------------------------
-
-</div>
-</div>
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**Base Case:** &nbsp; Initial accumulator `base` satisfies invariant
-
-
-`(p lo base)`   
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**Inductive Step:** &nbsp; `f` *preserves* invariant at `i`
-
-
-`(p i acc) => (p (i+1) (f i acc))`
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**"By Induction"** &nbsp; `out` satisfies invariant at `hi` 
-
-`(p hi out)`
-
-
-Induction in `loop` (by type)
------------------------------
-
-Induction is an **abstract refinement type** for `loop` 
-
-<br>
-
-\begin{code}
-{-@ loop :: forall a <p :: Int -> a -> Prop>.
-        lo:Int
-     -> hi:{Int | lo <= hi}
-     -> base:a<p lo>                      
-     -> f:(i:Int -> a<p i> -> a<p (i+1)>) 
-     -> a<p hi>                           @-}
-\end{code}
-
-<br>
-
-Induction in `loop` (by type)
------------------------------
-
-`p` is the *index dependent* invariant!
-
-
-\begin{code}<br> 
-p    :: Int -> a -> Prop             -- invt 
-base :: a<p lo>                      -- base 
-f    :: i:Int -> a<p i> -> a<p(i+1)> -- step
-out  :: a<p hi>                      -- goal
-\end{code}
-
-
-
-Using Induction
----------------
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br>
-
-**Verified** by *instantiating* the abstract refinement of `loop`
-
-`p := \i acc -> acc = i + n`
-
-
-<!--
-
-Using Induction
----------------
-
-\begin{code} <div/>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br>
-
-Verified by instantiating `p := \i acc -> acc = i + n`
-
-- <div class="fragment">**Base:**  `n = 0 + n`</div>
-
-- <div class="fragment">**Step:**  `acc = i + n  =>  acc + 1 = (i + 1) + n`</div>
-
-- <div class="fragment">**Goal:**  `out = m + n`</div>
-
--->
-
-Generalizes To Structures 
--------------------------
-
-Same idea applies for induction over *structures* ...
-
-
-Structural Induction
-====================
-
-Example: Lists
---------------
-
-<br>
-
-\begin{code}
-data L a = N 
-         | C a (L a)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets write a generic loop over such lists ...
-</div>
-
-Example: `foldr`
-----------------
-
-\begin{code} <br>
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets brace ourselves for the type...
-</div>
-
-Example: `foldr`
-----------------
-
-\begin{code}
-{-@ foldr :: 
-    forall a b <p :: L a -> b -> Prop>. 
-      (xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)>) 
-    -> b<p N> 
-    -> ys:L a
-    -> b<p ys>                            @-}
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets step through the type...
-</div>
-
-
-`foldr`: Abstract Refinement
-----------------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  ::  b<p ys>                            
-\end{code}
-
-<br>
-
-`(p xs b)` relates `b` with **folded** `xs`
-
-`p :: L a -> b -> Prop`
-
-
-`foldr`: Base Case
-------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-`base` is related to **empty** list `N`
-
-`base :: b<p N>` 
-
-
-
-`foldr`: Ind. Step 
-------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-`step` **extends** relation from `xs` to `C x xs`
-
-`step :: xs:_ -> x:_ -> b<p xs> -> b<p (C x xs)>`
-
-
-`foldr`: Output
----------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-Hence, relation holds between `out` and **entire input** list `ys`
-
-`out :: b<p ys>`
-
-Using `foldr`: Size
--------------------
-
-We can now verify <br>
-
-\begin{code}
-{-@ size :: xs:_ -> {v:Int| v = (llen xs)} @-}
-size     = foldr (\_ _ n -> n + 1) 0
-\end{code}
-
-<br>
-
-<div class="fragment">
-by *automatically instantiating*
-
-`p := \xs acc -> acc = (llen xs)`
-</div>
-
-Using `foldr`: Append
----------------------
-
-We can now verify <br>
-
-\begin{code}
-{-@ (++) :: xs:_ -> ys:_ -> (Cat a xs ys) @-} 
-xs ++ ys = foldr (\_ -> C) ys xs 
-\end{code}
-
-<div class="fragment">
-where 
-
-\begin{code}
-{-@ type Cat a X Y = 
-    {v:_|(llen v) = (llen X) + (llen Y)} @-}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-By automatically instantiating 
-
-`p := \xs acc -> llen acc = llen xs + llen ys`
-
-</div>
-
-Recap
------
-
-Abstract refinements *decouple* **invariant** from **traversal**
-
-<br>
-
-<div class="fragment">**Reusable** specifications for higher-order functions.</div>
-
-<br>
-
-<div class="fragment">**Automatic** checking and instantiation by SMT.</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over Type Signatures
-    + <div class="fragment">**Functions**</div>
-    + <div class="fragment">**Data** <a href="08_Recursive.lhs.slides.html" target="_blank">[continue]</a></div>
-
diff --git a/docs/slides/flops14/lhs/07_Array.lhs b/docs/slides/flops14/lhs/07_Array.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/07_Array.lhs
+++ /dev/null
@@ -1,405 +0,0 @@
-Abstract Refinements {#data}
-============================
-
-Recap
------
-
-**So far**
-
-Decouple invariants from *functions*
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-Decouple invariants from *data structures*
-</div>
-
-Decouple Invariants From Data {#vector} 
-=======================================
-
-Example: Vectors 
-----------------
-
-<div class="hidden">
-\begin{code}
-module LiquidArray where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume, liquidError)
-
-{-@ LIQUID "--no-termination" @-}
-
-fibMemo   :: Vec Int -> Int -> (Vec Int, Int)
-fastFib   :: Int -> Int
-idv       :: Int -> Vec Int
-axiom_fib :: Int -> Bool
-axiom_fib = undefined
-
-{-@ predicate AxFib I = (fib I) == (if I <= 1 then 1 else fib(I-1) + fib(I-2)) @-}
-\end{code}
-</div>
-
-<div class="fragment">
-
-Implemented as maps from `Int` to `a` 
-
-<br>
-
-\begin{code}
-data Vec a = V (Int -> a)
-\end{code}
-
-</div>
-
-
-Abstract *Domain* and *Range*
------------------------------
-
-Parameterize type with *two* abstract refinements:
-
-<br>
-
-\begin{code}
-{-@ data Vec a < dom :: Int -> Prop,
-                 rng :: Int -> a -> Prop >
-      = V {a :: i:Int<dom> -> a <rng i>}  @-}
-\end{code}
-
-<br>
-
-- `dom`: *domain* on which `Vec` is *defined* 
-
-- `rng`: *range*  and relationship with *index*
-
-Abstract *Domain* and *Range*
------------------------------
-
-Diverse `Vec`tors by *instantiating* `dom` and `rng`
-
-<br>
-
-<div class="fragment">
-
-A quick alias for *segments* between `I` and `J`
-
-<br>
-
-\begin{code}
-{-@ predicate Seg V I J = (I <= V && V < J) @-}
-\end{code}
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type IdVec N = Vec <{\v -> (Seg v 0 N)}, 
-                        {\k v -> v=k}> 
-                       Int                  @-}
-\end{code}
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-\begin{code}
-{-@ idv :: n:Nat -> (IdVec n) @-}
-idv n   = V (\k -> if 0 < k && k < n 
-                     then k 
-                     else liquidError "eeks")
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>Whats the problem? How can we fix it?
-</div>
-
-Ex: Zero-Terminated Vectors
----------------------------
-
-Defined between `[0..N)`, with *last* element equal to `0`:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type ZeroTerm N = 
-     Vec <{\v -> (Seg v 0 N)}, 
-          {\k v -> (k = N-1 => v = 0)}> 
-          Int                             @-}
-\end{code}
-
-</div>
-
-
-Ex: Fibonacci Table 
--------------------
-
-A vector whose value at index `k` is either 
-
-- `0` (undefined), or, 
-
-- `k`th fibonacci number 
-
-\begin{code}
-{-@ type FibV =  
-     Vec <{\v -> true}, 
-          {\k v -> (v = 0 || v = (fib k))}> 
-          Int                               @-}
-\end{code}
-
-
-Accessing Vectors
------------------
-
-Next: lets *abstractly* type `Vec`tor operations, *e.g.* 
-
-<br>
-
-- `empty`
-
-- `set`
-
-- `get`
-
-
-Ex: Empty Vectors
------------------
-
-`empty` returns Vector whose domain is `false`
-
-<br>
-
-\begin{code}
-{-@ empty :: forall <p :: Int -> a -> Prop>. 
-               Vec <{v:Int|false}, p> a     @-}
-
-empty     = V $ \_ -> error "empty vector!"
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-What would happen if we changed `false` to `true`?
-</div>
-
-Ex: `get` Key's Value 
----------------------
-
-- *Input* `key` in *domain*
-
-- *Output* value in *range* related with `k`
-
-\begin{code}
-{-@ get :: forall a <d :: Int -> Prop,  
-                     r :: Int -> a -> Prop>.
-           key:Int <d>
-        -> vec:Vec <d, r> a
-        -> a<r key>                        @-}
-
-get k (V f) = f k
-\end{code}
-
-
-Ex: `set` Key's Value 
----------------------
-
-- <div class="fragment">Input `key` in *domain*</div>
-
-- <div class="fragment">Input `val` in *range* related with `key`</div>
-
-- <div class="fragment">Input `vec` defined at *domain except at* `key`</div>
-
-- <div class="fragment">Output domain *includes* `key`</div>
-
-Ex: `set` Key's Value 
----------------------
-
-\begin{code}
-{-@ set :: forall a <d :: Int -> Prop,
-                     r :: Int -> a -> Prop>.
-           key: Int<d> -> val: a<r key>
-        -> vec: Vec<{v:Int<d>| v /= key},r> a
-        -> Vec <d, r> a                     @-}
-set key val (V f) = V $ \k -> if k == key 
-                                then val 
-                                else f key
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-Help! Can you spot and fix the errors? 
-</div>
-
-<!-- INSERT tests/pos/vecloop.lhs here AFTER FIXED -->
-
-Using the Vector API
---------------------
-
-Memoized Fibonacci
-------------------
-
-Use `Vec` API to write a *memoized* fibonacci function
-
-<br>
-
-<div class="fragment">
-\begin{code} Using the fibonacci table:
-type FibV =  
-     Vec <{\v -> true}, 
-          {\k v -> (v = 0 || v = (fib k))}> 
-          Int                              
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-But wait, what is `fib` ?
-</div>
-
-
-Specifying Fibonacci
---------------------
-
-`fib` is *uninterpreted* in the refinement logic  
-
-<br>
-
-\begin{code}
-{-@ measure fib :: Int -> Int @-}
-\end{code}
-
-<br>
-
-Specifying Fibonacci
---------------------
-
-We *axiomatize* the definition of `fib` in SMT ...
-
-\begin{code}<br>
-predicate AxFib I = 
-  (fib I) == if I <= 1 
-               then 1 
-               else fib(I-1) + fib(I-2)
-\end{code}
-
-Specifying Fibonacci
---------------------
-
-Finally, lift axiom into LiquidHaskell as *ghost function*
-
-<br>
-
-\begin{code}
-{-@ axiom_fib :: 
-      i:_ -> {v:_|((Prop v) <=> (AxFib i))} @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Note:** Recipe for *escaping* SMT limitations
-
-1. *Prove* fact externally
-2. *Use* as ghost function call
-</div>
-
-
-Fast Fibonacci
---------------
-
-An efficient fibonacci function
-
-<br>
-
-\begin{code}
-{-@ fastFib :: n:Int -> {v:_ | v = (fib n)} @-}
-fastFib n   = snd $ fibMemo (V (\_ -> 0)) n
-\end{code}
-
-<br>
-
-<div class="fragment">
-- `fibMemo` *takes* a table initialized with `0`
-
-- `fibMemo` *returns* a table with `fib` values upto `n`.
-</div>
-
-
-Memoized Fibonacci 
-------------------
-
-\begin{code}
-fibMemo t i 
-  | i <= 1    
-  = (t, liquidAssume (axiom_fib i) 1)
-  | otherwise 
-  = case get i t of   
-     0 -> let (t1,n1) = fibMemo t  (i-1)
-              (t2,n2) = fibMemo t1 (i-2)
-              n       = liquidAssume 
-                        (axiom_fib i) (n1+n2)
-          in (set i n t2,  n)
-     n -> (t, n)
-\end{code}
-
-Memoized Fibonacci 
-------------------
-
-- `fibMemo` *takes* a table initialized with `0`
-- `fibMemo` *returns* a table with `fib` values upto `n`.
-
-<br>
-
-\begin{code}
-{-@ fibMemo :: FibV 
-            -> i:Int 
-            -> (FibV,{v:Int | v = (fib i)}) @-}
-\end{code}
-
-
-Recap
------
-
-Created a `Vec` container 
-
-Decoupled *domain* and *range* invariants from *data*
-
-<br>
-
-<div class="fragment">
-
-Previous, special purpose program analyses 
-
-- [Gopan-Reps-Sagiv, POPL 05](link)
-- [J.-McMillan, CAV 07](link)
-- [Logozzo-Cousot-Cousot, POPL 11](link)
-- [Dillig-Dillig, POPL 12](link) 
-- ...
-
-Encoded as instance of abstract refinement types!
-</div>
-
-
-
-
diff --git a/docs/slides/flops14/lhs/08_Recursive.lhs b/docs/slides/flops14/lhs/08_Recursive.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/08_Recursive.lhs
+++ /dev/null
@@ -1,544 +0,0 @@
-Decouple Invariants From Data {#recursive} 
-==========================================
-
- {#asd}
--------
-
-Recursive Structures 
---------------------
-
-Lets see another example of decoupling...
-
-<div class="hidden">
-\begin{code}
-{-# LANGUAGE NoMonomorphismRestriction #-}
-
-module List (insertSort) where
-
-{-@ LIQUID "--no-termination" @-}
-
-mergeSort     :: Ord a => [a] -> [a]
-insertSort :: (Ord a) => [a] -> L a 
-slist :: L Int
-slist' :: L Int
-iGoUp, iGoDn, iDiff :: [Int]
-infixr `C`
-\end{code}
-</div>
-
-Decouple Invariants From Recursive Data
-=======================================
-
-Recall: Lists
--------------
-
-\begin{code}
-data L a = N 
-         | C { hd :: a, tl :: L a }
-\end{code}
-
-
-Recall: Refined Constructors 
-----------------------------
-
-Define **increasing** Lists with strengthened constructors:
-
-\begin{code} <br>
-data L a where
-  N :: L a
-  C :: hd:a -> tl: L {v:a | hd <= v} -> L a
-\end{code}
-
-Problem: Decreasing Lists?
---------------------------
-
-What if we need *both* [increasing *and* decreasing lists?](http://hackage.haskell.org/package/base-4.7.0.0/docs/src/Data-List.html#sort)
-
-<br>
-
-<div class="fragment">
-[Separate (indexed) types](http://web.cecs.pdx.edu/~sheard/Code/QSort.html) get quite complicated ...
-</div>
-
-Abstract That Refinement!
--------------------------
-
-\begin{code}
-{-@ data L a <p :: a -> a -> Prop>
-      = N 
-      | C { hd :: a, tl :: L <p> a<p hd> } @-}
-\end{code}
-
-<br>
-
-<div class="fragment"> `p` is a **binary relation** between two `a` values</div>
-
-<br>
-
-<div class="fragment"> Definition relates `hd` with **all** the elements of `tl`</div>
-
-<br>
-
-<div class="fragment"> Recursive: `p` holds for **every pair** of elements!</div>
-
-Example
--------
-
-Consider a list with *three* or more elements 
-
-\begin{code} <br>
-x1 `C` x2 `C` x3 `C` rest :: L <p> a 
-\end{code}
-
-Example: Unfold Once
---------------------
-
-\begin{code} <br> 
-x1                 :: a
-x2 `C` x3 `C` rest :: L <p> a<p x1> 
-\end{code}
-
-Example: Unfold Twice
----------------------
-
-\begin{code} <br> 
-x1          :: a
-x2          :: a<p x1>  
-x3 `C` rest :: L <p> a<p x1 && p x2> 
-\end{code}
-
-Example: Unfold Thrice
-----------------------
-
-\begin{code} <br> 
-x1   :: a
-x2   :: a<p x1>  
-x3   :: a<p x1 && p x2>  
-rest :: L <p> a<p x1 && p x2 && p x3> 
-\end{code}
-
-<br>
-
-<div class="fragment">
-Note how `p` holds between **every pair** of elements in the list. 
-</div>
-
-A Concrete Example
-------------------
-
-That was a rather *abstract*!
-
-<br>
-
-How can we *use* fact that `p` holds between *every pair*?
-
-<br>
-
-<div class="fragment">**Instantiate** `p` with a *concrete* refinement</div>
-
-
-Example: Increasing Lists
--------------------------
-
-**Instantiate** `p` with a *concrete* refinement
-
-<br>
-
-\begin{code}
-{-@ type IncL a = L <{\hd v -> hd <= v}> a @-}
-\end{code}
-
-<br>
-
-<div class="fragment"> Refinement says: &nbsp; `hd` less than **every** `v` in tail,</div>
-
-<br>
-
-<div class="fragment"> i.e., `IncL` denotes **increasing** lists. </div>
-
-Example: Increasing Lists
--------------------------
-
-LiquidHaskell *verifies* that `slist` is indeed increasing...
-
-\begin{code}
-{-@ slist :: IncL Int @-}
-slist     = 1 `C` 6 `C` 12 `C` N
-\end{code}
-
-<br> 
-
-<div class="fragment">
-
-... and *protests* that `slist'` is not: 
-
-\begin{code}
-{-@ slist' :: IncL Int @-}
-slist' = 6 `C` 1 `C` 12 `C` N
-\end{code}
-</div>
-
-Insertion Sort
---------------
-
-\begin{code}
-{-@ insertSort :: (Ord a) => [a] -> IncL a @-}
-insertSort     = foldr insert N
-
-insert y N          = y `C` N
-insert y (x `C` xs) 
-  | y < x           = y `C` (x `C` xs)
-  | otherwise       = x `C` insert y xs
-\end{code}
-
-<br>
-
-(Mouseover `insert` to see inferred type.)
-
-Checking GHC Lists
-------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target= "_blank">Demo:</a> 
-Above applies to GHC's List definition:
-
-\begin{code} <br> 
-data [a] <p :: a -> a -> Prop>
-  = [] 
-  | (:) { h :: a, tl :: [a<p h>]<p> }
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Increasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Incs a = [a]<{\h v -> h <= v}> @-}
-
-{-@ iGoUp :: Incs Int @-}
-iGoUp     = [1,2,3]
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Decreasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Decs a = [a]<{\h v -> h >= v}> @-}
-
-{-@ iGoDn :: Decs Int @-}
-iGoDn     = [3,2,1]
-\end{code}
-
-
-Checking GHC Lists
-------------------
-
-Duplicate-free Lists
-
-<br>
-
-\begin{code}
-{-@ type Difs a = [a]<{\h v -> h /= v}> @-}
-
-{-@ iDiff :: Difs Int @-}
-iDiff     = [1,3,2]
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Now we can check all the usual list sorting algorithms 
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target="_blank">Demo:</a> List Sorting
-
-<!-- 
-
-Example: `mergeSort` [1/2]
---------------------------
-
-\begin{code}
-{-@ mergeSort  :: (Ord a) => [a] -> Incs a @-}
-mergeSort []   = []
-mergeSort [x]  = [x]
-mergeSort xs   = merge xs1' xs2' 
-  where 
-   (xs1, xs2)  = split xs
-   xs1'        = mergeSort xs1
-   xs2'        = mergeSort xs2
-\end{code}
-
-Example: `mergeSort` [2/2]
---------------------------
-
-\begin{code}
-split (x:y:zs) = (x:xs, y:ys) 
-  where 
-    (xs, ys)   = split zs
-split xs       = (xs, [])
-
-merge xs []    = xs
-merge [] ys    = ys
-merge (x:xs) (y:ys) 
-  | x <= y     = x : merge xs (y:ys)
-  | otherwise  = y : merge (x:xs) ys
-\end{code}
-
-
-
-Example: `Data.List.sort` 
--------------------------
-
-<br>
-
-GHC's "official" list sorting routine
-
-<br>
-
-Juggling lists of increasing & decreasing lists
-
-
-
-
-Ex: `Data.List.sort` [1/5]
---------------------------
-
-**Step 1.** Make sequences of increasing & decreasing lists
-
-<br>
-
-\begin{code}
-sequences (a:b:xs)
-  | a `compare` b == GT = descending b [a]  xs
-  | otherwise           = ascending  b (a:) xs
-sequences [x]           = [[x]]
-sequences []            = [[]]
-\end{code}
-
-Ex: `Data.List.sort` [2/5]
---------------------------
-
-**Step 1.** Make sequences of increasing & decreasing lists
-
-<br>
-
-\begin{code}
-descending a as (b:bs)
-  | a `compare` b == GT 
-  = descending b (a:as) bs
-descending a as bs      
-  = (a:as): sequences bs
-\end{code}
-
-Ex: `Data.List.sort` [3/5]
---------------------------
-
-**Step 1.** Make sequences of increasing & decreasing lists
-
-<br>
-
-
-\begin{code}
-ascending a as (b:bs)
-  | a `compare` b /= GT 
-  = ascending b (\ys -> as (a:ys)) bs
-ascending a as bs      
-  = as [a]: sequences bs
-\end{code}
-
-Ex: `Data.List.sort` [4/5]
---------------------------
-
-**Step 2.** Merge sequences
-
-<br>
-
-\begin{code}
-mergeAll [x]        = x
-mergeAll xs         = mergeAll (mergePairs xs)
-
-mergePairs (a:b:xs) = merge a b: mergePairs xs
-mergePairs [x]      = [x]
-mergePairs []       = []
-\end{code}
-
-
-Ex: `Data.List.sort` [5/5]
---------------------------
-
-Put it all together
-
-<br>
-
-\begin{code}
-{-@ sort :: (Ord a) => [a] -> Incs a  @-}
-sort = mergeAll . sequences
-\end{code}
-
-<br>
-
-<div class="fragment">No other hints or annotations required.</div>
-
--->
-
-Phew!
------
-
-Lets see one last example...
-
-<br>
-<br>
-<br>
-<br>
-
-[[Skip]](#/1/32)
-
-
-Example: Binary Trees
----------------------
-
-... `Map` from keys of type `k` to values of type `a` 
-
-<br>
-
-<div class="fragment">
-
-Implemented, in `Data.Map` as a binary tree:
-
-<br>
-
-\begin{code}
-data Map k a = Tip
-             | Bin Size k a (Map k a) (Map k a)
-
-type Size    = Int
-\end{code}
-</div>
-
-Two Abstract Refinements
-------------------------
-
-- `l` : relates root `key` with `left`-subtree keys
-- `r` : relates root `key` with `right`-subtree keys
-
-\begin{code}
-{-@ data Map k a < l :: k -> k -> Prop
-                 , r :: k -> k -> Prop >
-    = Tip
-    | Bin (sz :: Size) (key :: k) (val :: a)
-          (left  :: Map <l,r> (k<l key>) a)
-          (right :: Map <l,r> (k<r key>) a) @-}
-\end{code}
-
-
-Ex: Binary Search Trees
------------------------
-
-Keys are *Binary-Search* Ordered
-
-<br>
-
-\begin{code}
-{-@ type BST k a = 
-      Map <{\r v -> v < r }, 
-           {\r v -> v > r }> 
-          k a                   @-}
-\end{code}
-
-Ex: Minimum Heaps 
------------------
-
-Root contains *minimum* value
-
-<br>
-
-\begin{code}
-{-@ type MinHeap k a = 
-      Map <{\r v -> r <= v}, 
-           {\r v -> r <= v}> 
-           k a               @-}
-\end{code}
-
-Ex: Maximum Heaps 
------------------
-
-Root contains *maximum* value
-
-<br>
-
-\begin{code}
-{-@ type MaxHeap k a = 
-      Map <{\r v -> r >= v}, 
-           {\r v -> r >= v}> 
-           k a               @-}
-\end{code}
-
-
-Example: Data.Map
------------------
-
-Standard Key-Value container
-
-<br>
-
-- <div class="fragment">1300+ non-comment lines</div>
-
-- <div class="fragment">`insert`, `split`, `merge`,...</div>
-
-- <div class="fragment">Rotation, Rebalance,...</div>
-
-<br>
-
-<div class="fragment">
-SMT & inference crucial for [verification](https://github.com/ucsd-progsys/liquidhaskell/blob/master/benchmarks/esop2013-submission/Base.hs)
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Map.hs" target="_blank">Demo:</a> Binary Search Maps
-</div>
-
-Recap: Abstract Refinements
----------------------------
-
-<div class="fragment">
-
-Decouple invariants from **functions**
-
-+ `max`
-+ `loop`
-+ `foldr`
-
-</div>
-
-<div class="fragment">
-Decouple invariants from **data**
-
-+ `Vector`
-+ `List`
-+ `Tree`
-
-</div>
-
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. **Abstract:** Refinements over functions and data
-5. <div class="fragment">Er, what about Haskell's **lazy evaluation**?</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](09_Laziness.lhs.slides.html)</div>
diff --git a/docs/slides/flops14/lhs/09_Laziness.lhs b/docs/slides/flops14/lhs/09_Laziness.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/09_Laziness.lhs
+++ /dev/null
@@ -1,272 +0,0 @@
- {#laziness}
-============
-
-<div class="hidden">
-\begin{code}
-module Laziness where
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short"          @-}
-
-
-safeDiv :: Int -> Int -> Int
-foo     :: Int -> Int
--- zero    :: Int 
--- diverge :: a -> b
-\end{code}
-</div>
-
-
-Lazy Evaluation?
-----------------
-
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-
-
-[[Skip]](11_Evaluation.lhs.slides.html)
-
-Lazy Evaluation
-===============
-
-SMT based Verification
-----------------------
-
-Techniques developed for **strict** languages
-
-<br>
-
-<div class="fragment">
-
------------------------   ---   ------------------------------------------
-        **Floyd-Hoare**    :    `ESCJava`, `SpecSharp` ...
-     **Model Checkers**    :    `Slam`, `Blast` ...
-   **Refinement Types**    :    `DML`, `Stardust`, `Sage`, `F7`, `F*`, ...
------------------------   ---   ------------------------------------------
-
-</div>
-
-<br>
-
-<div class="fragment">
-Surely soundness carries over to Haskell, right?
-</div>
-
-
-Back To the Beginning
----------------------
-
-\begin{code}
-{-@ safeDiv :: Int -> {v:Int|v /= 0} -> Int @-}
-safeDiv n 0 = liquidError "div-by-zero!"
-safeDiv n d = n `div` d
-\end{code}
-
-<br>
-
-<div class="fragment">
-Should only call `safeDiv` with **non-zero** values
-</div>
-
-An Innocent Function
---------------------
-
-`foo` returns a value **strictly less than** input.
-
-<br>
-
-\begin{code} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-\end{code}
-
-LiquidHaskell Lies! 
--------------------
-
-\begin{code}
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0    
-              a = foo z
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-<div class="fragment">
-Why is this program **deemed safe**?! 
-</div>
-
-
-*Safe* With Eager Eval
-----------------------
-
-\begin{code} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Safe** in Java, ML: program spins away, **never hits** divide-by-zero 
-</div>
-
-*Unsafe* With Lazy Eval
------------------------
-
-\begin{code} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-**Unsafe** in Haskell: program skips `foo z` and **hits** divide-by-zero!
-
-Problem: Divergence
--------------------
-
-What is denoted by:
-
-`e :: {v:Int | P}`
-
-
-<br>
-
-<div class="fragment">
-`e` evaluates to `Int` satisfying `P`  
-</div>
-
-<div class="fragment">
-or
-
-**diverges**! 
-</div>
-
-<div class="fragment">
-<br>
-
-Classical Floyd-Hoare notion of [partial correctness](http://en.wikipedia.org/wiki/Hoare_logic#Partial_and_total_correctness)
-
-</div>
-
-
-
-Problem: Divergence
--------------------
-
-\begin{code} **Consider** <div/> 
-        {-@ e :: {v : Int | P} @-}
-
-        let x = e in body 
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Eager Evaluation** 
-
-*Can* assume `P(x)` when checking `body`
-</div>
-
-<br>
-
-<div class="fragment">
-**Lazy Evaluation** 
-
-*Cannot* assume `P(x)` when checking `body`
-</div>
-
-Eager vs. Lazy Binders 
-----------------------
-
-\begin{code} <div/>
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0     -- :: {v:Int| v = 0}
-              a = foo z -- :: {v:Nat| v < z}
-          in  
-              (\x -> 2013 `safeDiv` z) a 
-\end{code}
-
-<br>
-
-Inconsistent refinement for `a` is sound for **eager**, unsound for **lazy**
-
-
-Panic! Now what?
----------------
-
-<div class="fragment">
-**Solution** 
-
-Assign *non-trivial* refinements to *non-diverging* terms!
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Require A Termination Analysis**
-
-Don't worry, its easy...
-
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=TellingLies.hs" target="_blank">Demo:</a> &nbsp; Disable `"--no-termination"` and see what happens!
-</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. **Lazy Evaluation:** Requires Termination
-6. <div class="fragment">**Termination:** via Refinements!</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](10_Termination.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/flops14/lhs/10_Termination.lhs b/docs/slides/flops14/lhs/10_Termination.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/10_Termination.lhs
+++ /dev/null
@@ -1,314 +0,0 @@
-Termination {#termination}
-==========================
-
-
-<div class="hidden">
-\begin{code}
-module Termination where
-
-import Prelude hiding (gcd, mod, map)
-fib :: Int -> Int
-gcd :: Int -> Int -> Int
-infixr `C`
-
-data L a = N | C a (L a)
-
-{-@ invariant {v: (L a) | 0 <= (llen v)} @-}
-
-mod :: Int -> Int -> Int
-mod a b | a - b >  b = mod (a - b) b
-        | a - b <  b = a - b
-        | a - b == b = 0
-
-merge :: Ord a => L a -> L a -> L a
-\end{code}
-</div>
-
-<!--
-
-Dependent != Refinement
------------------------
-
-<div class="fragment">**Dependent Types**</div>
-
-+ <div class="fragment">*Arbitrary terms* appear inside types</div> 
-+ <div class="fragment">Termination ensures well-defined</div>
-
-<br>
-
-<div class="fragment">**Refinement Types**</div>
-
-+ <div class="fragment">*Restricted refinements* appear in types</div>
-+ <div class="fragment">Termination *not* required ...</div> 
-+ <div class="fragment">... except, alas, with *lazy* evaluation!</div>
-
--->
-
-Refinements & Termination
--------------------------
-
-<div class="fragment">
-Fortunately, we can ensure termination **using refinements**
-</div>
-
-
-Main Idea
----------
-
-Recursive calls must be on **smaller** inputs
-
-<br>
-
-+ [Turing](http://classes.soe.ucsc.edu/cmps210/Winter11/Papers/turing-1936.pdf)
-+ [Sized Types](http://dl.acm.org/citation.cfm?id=240882)
-+ [DML](http://dl.acm.org/citation.cfm?id=609232)
-+ [Size Change Principle](http://dl.acm.org/citation.cfm?id=360210)
-
-Recur On *Smaller* `Nat` 
-------------------------
-
-<div class="fragment">
-
-**To ensure termination of**
-
-\begin{code} <div/>
-foo   :: Nat -> T
-foo x =  body
-\end{code}
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:Nat | v < x} -> T`
-
-<br>
-
-*i.e.* require recursive calls have `Nat` inputs *smaller than* `x`
-</div>
-
-
-
-Ex: Recur On *Smaller* `Nat` 
-----------------------------
-
-\begin{code}
-{-@ fib  :: Nat -> Nat @-}
-fib 0    = 1
-fib 1    = 1
-fib n    = fib (n-1) + fib (n-2)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Terminates, as both `n-1` and `n-2` are `< n`
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=GCD.hs" target="_blank">Demo:</a> &nbsp; What if we drop the `fib 1` equation? 
-</div>
-
-Refinements Are Essential!
---------------------------
-
-\begin{code}
-{-@ gcd :: a:Nat -> {b:Nat | b < a} -> Int @-}
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Need refinements to prove `(a mod b) < b` at *recursive* call!
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ mod :: a:Nat 
-        -> b:{v:Nat|(0 < v && v < a)} 
-        -> {v:Nat| v < b}                 @-}
-\end{code}
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{code}<div/>
-foo   :: S -> T
-foo x = body
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Reduce** to `Nat` case...
-</div>
-
-<br>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{code}<div/>
-foo   :: S -> T
-foo x = body
-\end{code}
-
-<br>
-
-Specify a **default measure** `mS :: S -> Int`
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:s | 0 <= (mS v) < (mS x)} -> T`
-</div>
-
-
-Ex: Recur on *smaller* `List`
------------------------------
-
-\begin{code} 
-map f N        = N
-map f (C x xs) = (f x) `C` (map f xs) 
-\end{code}
-
-<br>
-
-Terminates using **default** measure `llen` 
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ data L [llen] a = N 
-                    | C { x::a, xs :: L a} @-}
-
-{-@ measure llen :: L a -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)   @-}
-\end{code}
-</div>
-
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of smallness spread across **multiple inputs**?
-
-<br>
-
-\begin{code}
-merge xs@(x `C` xs') ys@(y `C` ys')
-  | x < y     = x `C` merge xs' ys
-  | otherwise = y `C` merge xs ys'
-\end{code}
-
-<br>
-
-<div class="fragment">
-Neither input decreases, but their **sum** does.
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-Neither input decreases, but their **sum** does.
-
-<br>
-
-\begin{code}
-{-@ merge :: Ord a => xs:_ -> ys:_ -> _ 
-          /  [(llen xs) + (llen ys)]     @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-Synthesize **ghost** parameter equal to `[...]`
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-... thereby reducing to decreasing **single parameter** case. 
-
-</div>
-
-Important Extensions 
---------------------
-
-<br>
-
-<div class="fragment">**Mutual** recursion</div>
-
-<br>
-
-<div class="fragment">**Lexicographic** ordering</div>
-
-<br>
-
-<div class="fragment">Fit easily into our framework ...</div>
-
-Recap
------
-
-Main idea: Recursive calls on **smaller** inputs
-
-<br>
-
-<div class="fragment">Use refinements to **check** smaller</div>
-
-<br>
-
-<div class="fragment">Use refinements to **establish** smaller</div>
-
-
-A Curious Circularity
----------------------
-
-<div class="fragment">Refinements require termination ...</div> 
-
-<br>
-
-<div class="fragment">... Termination requires refinements!</div>
-
-<br>
-
-<div class="fragment"> Meta-theory is tricky, but all ends well.</div>
-
-Recap
------
-
-1. Refinements: Types + Predicates
-2. Subtyping: SMT Implication
-3. Measures: Strengthened Constructors
-4. Abstract: Refinements over functions and data
-5. Lazy Evaluation: Requires Termination
-6. **Termination:** via Refinements!
-7. <div class="fragment">**Evaluation:** How good is this in practice?</div>
-
-<br>
-<br>
-
-<div class="fragment">[[continue...]](11_Evaluation.lhs.slides.html)</div>
-
-
diff --git a/docs/slides/flops14/lhs/11_Evaluation.lhs b/docs/slides/flops14/lhs/11_Evaluation.lhs
deleted file mode 100644
--- a/docs/slides/flops14/lhs/11_Evaluation.lhs
+++ /dev/null
@@ -1,118 +0,0 @@
- {#ASda}
-========
-
-Evaluation
-----------
-
-
-
-Evaluation
-==========
-
-LiquidHaskell Is For Real
--------------------------
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg: to force Makefile"
-\end{code}
-
-</div>
-
-
-<br>
-
-Substantial code bases.
-
-<br>
-
-Complex properties.
-
-<br>
-
-<div class="fragment">Inference is crucial.</div>
-
-
-
-Numbers
--------
-
-<div align="center">
-
-**Library**                     **LOC**
----------------------------   ---------
-`Data.List`                         814
-`Data.Set.Splay`                    149
-`Data.Vector.Algorithms`           1219
-`Data.Map.Base`                    1396
-`Data.Text`                        3125
-`Data.Bytestring`                  3501 
-**Total**                     **10224**
----------------------------   ---------
-
-</div>
-
-Numbers
--------
-
-<div align="center">
-
-**Library**                     **LOC**     **Time**
----------------------------   ---------   ----------
-`Data.List`                         814          52s
-`Data.Set.Splay`                    149          26s
-`Data.Vector.Algorithms`           1219         196s 
-`Data.Map.Base`                    1396         247s
-`Data.Text`                        3125         809s
-`Data.Bytestring`                  3501         549s
-**Total**                     **10224**    **1880s**
----------------------------   ---------   ----------
-
-</div>
-
-
-Termination
------------
-
-Proving termination is **easy in practice**.
-
-<br>
-
-- <div class="fragment">`503` recursive functions</div>
-- <div class="fragment">`67%` automatically proved</div>
-- <div class="fragment">`30%` need *witnesses* `/[...]`</div>
-- <div class="fragment">`1`   witness per `100` lines of code</div>
-- <div class="fragment">`20`  *not proven* to terminate</div>
-- <div class="fragment">`12`  *do not* terminate (e.g. top-level `IO` loops)</div>
-- <div class="fragment">`8`   currently *outside scope* of LiquidHaskell</div>
-
-
-Future Work
------------
-
-<br>
-<br>
-
-- <div class="fragment">Speed</div>
-
-- <div class="fragment">Case Studies</div>
-
-- <div class="fragment">**Error Messages**</div>
-
- {#asd}
-=======
-
-
-Thank You!
-----------
-
-<br>
-
-`cabal install liquidhaskell`
-
-<br>
-
-`https://github.com/ucsd-progsys/liquidhaskell`
-
-<br>
diff --git a/docs/slides/flops14/reveal.js/.gitignore b/docs/slides/flops14/reveal.js/.gitignore
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.DS_Store
-.svn
-log/*.log
-tmp/**
-node_modules/
-.sass-cache
diff --git a/docs/slides/flops14/reveal.js/.travis.yml b/docs/slides/flops14/reveal.js/.travis.yml
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - 0.8
-before_script:
-  - npm install -g grunt-cli
diff --git a/docs/slides/flops14/reveal.js/Gruntfile.js b/docs/slides/flops14/reveal.js/Gruntfile.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/Gruntfile.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/* global module:false */
-module.exports = function(grunt) {
-	var port = grunt.option('port') || 8000;
-	// Project configuration
-	grunt.initConfig({
-		pkg: grunt.file.readJSON('package.json'),
-		meta: {
-			banner:
-				'/*!\n' +
-				' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
-				' * http://lab.hakim.se/reveal-js\n' +
-				' * MIT licensed\n' +
-				' *\n' +
-				' * Copyright (C) 2013 Hakim El Hattab, http://hakim.se\n' +
-				' */'
-		},
-
-		qunit: {
-			files: [ 'test/*.html' ]
-		},
-
-		uglify: {
-			options: {
-				banner: '<%= meta.banner %>\n'
-			},
-			build: {
-				src: 'js/reveal.js',
-				dest: 'js/reveal.min.js'
-			}
-		},
-
-		cssmin: {
-			compress: {
-				files: {
-					'css/reveal.min.css': [ 'css/reveal.css' ]
-				}
-			}
-		},
-
-		sass: {
-			main: {
-				files: {
-					'css/theme/default.css': 'css/theme/source/default.scss',
-					'css/theme/beige.css': 'css/theme/source/beige.scss',
-					'css/theme/night.css': 'css/theme/source/night.scss',
-					'css/theme/serif.css': 'css/theme/source/serif.scss',
-					'css/theme/simple.css': 'css/theme/source/simple.scss',
-					'css/theme/sky.css': 'css/theme/source/sky.scss',
-					'css/theme/moon.css': 'css/theme/source/moon.scss',
-					'css/theme/solarized.css': 'css/theme/source/solarized.scss',
-					'css/theme/blood.css': 'css/theme/source/blood.scss'
-				}
-			}
-		},
-
-		jshint: {
-			options: {
-				curly: false,
-				eqeqeq: true,
-				immed: true,
-				latedef: true,
-				newcap: true,
-				noarg: true,
-				sub: true,
-				undef: true,
-				eqnull: true,
-				browser: true,
-				expr: true,
-				globals: {
-					head: false,
-					module: false,
-					console: false,
-					unescape: false
-				}
-			},
-			files: [ 'Gruntfile.js', 'js/reveal.js' ]
-		},
-
-		connect: {
-			server: {
-				options: {
-					port: port,
-					base: '.'
-				}
-			}
-		},
-
-		zip: {
-			'reveal-js-presentation.zip': [
-				'index.html',
-				'css/**',
-				'js/**',
-				'lib/**',
-				'images/**',
-				'plugin/**'
-			]
-		},
-
-		watch: {
-			main: {
-				files: [ 'Gruntfile.js', 'js/reveal.js', 'css/reveal.css' ],
-				tasks: 'default'
-			},
-			theme: {
-				files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ],
-				tasks: 'themes'
-			}
-		}
-
-	});
-
-	// Dependencies
-	grunt.loadNpmTasks( 'grunt-contrib-qunit' );
-	grunt.loadNpmTasks( 'grunt-contrib-jshint' );
-	grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
-	grunt.loadNpmTasks( 'grunt-contrib-uglify' );
-	grunt.loadNpmTasks( 'grunt-contrib-watch' );
-	grunt.loadNpmTasks( 'grunt-contrib-sass' );
-	grunt.loadNpmTasks( 'grunt-contrib-connect' );
-	grunt.loadNpmTasks( 'grunt-zip' );
-
-	// Default task
-	grunt.registerTask( 'default', [ 'jshint', 'cssmin', 'uglify', 'qunit' ] );
-
-	// Theme task
-	grunt.registerTask( 'themes', [ 'sass' ] );
-
-	// Package presentation to archive
-	grunt.registerTask( 'package', [ 'default', 'zip' ] );
-
-	// Serve presentation locally
-	grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
-
-	// Run tests
-	grunt.registerTask( 'test', [ 'jshint', 'qunit' ] );
-
-};
diff --git a/docs/slides/flops14/reveal.js/LICENSE b/docs/slides/flops14/reveal.js/LICENSE
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2013 Hakim El Hattab, http://hakim.se
-
-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.
diff --git a/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.eot b/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.eot
deleted file mode 100644
Binary files a/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.eot and /dev/null differ
diff --git a/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.svg b/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.svg
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.svg
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="LeagueGothicRegular" horiz-adv-x="724" >
-<font-face units-per-em="2048" ascent="1505" descent="-543" />
-<missing-glyph horiz-adv-x="315" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="2048" />
-<glyph unicode="&#xd;" horiz-adv-x="682" />
-<glyph unicode=" "  horiz-adv-x="315" />
-<glyph unicode="&#x09;" horiz-adv-x="315" />
-<glyph unicode="&#xa0;" horiz-adv-x="315" />
-<glyph unicode="!" horiz-adv-x="387" d="M74 1505h239l-55 -1099h-129zM86 0v227h215v-227h-215z" />
-<glyph unicode="&#x22;" horiz-adv-x="329" d="M57 1505h215l-30 -551h-154z" />
-<glyph unicode="#" horiz-adv-x="1232" d="M49 438l27 195h198l37 258h-196l26 194h197l57 420h197l-57 -420h260l57 420h197l-58 -420h193l-27 -194h-192l-37 -258h190l-26 -195h-191l-59 -438h-197l60 438h-261l-59 -438h-197l60 438h-199zM471 633h260l37 258h-260z" />
-<glyph unicode="$" horiz-adv-x="692" d="M37 358l192 13q12 -186 129 -187q88 0 93 185q0 74 -61 175q-21 36 -34 53l-40 55q-28 38 -65.5 90t-70.5 101.5t-70.5 141.5t-37.5 170q4 293 215 342v131h123v-125q201 -23 235 -282l-192 -25q-14 129 -93 125q-80 -2 -84 -162q0 -102 94 -227l41 -59q30 -42 37 -52 t33 -48l37 -52q41 -57 68 -109l26 -55q43 -94 43 -186q-4 -338 -245 -369v-217h-123v221q-236 41 -250 352z" />
-<glyph unicode="%" horiz-adv-x="1001" d="M55 911v437q0 110 82 156q33 18 90.5 18t97.5 -44t44 -87l4 -43v-437q0 -107 -81 -157q-32 -19 -77 -19q-129 0 -156 135zM158 0l553 1505h131l-547 -1505h-137zM178 911q-4 -55 37 -55q16 0 25.5 14.5t9.5 26.5v451q2 55 -35 55q-18 0 -27.5 -13.5t-9.5 -27.5v-451z M631 158v436q0 108 81 156q33 20 79 20q125 0 153 -135l4 -41v-436q0 -110 -80 -156q-32 -18 -90.5 -18t-98.5 43t-44 88zM754 158q-4 -57 37 -58q37 0 34 58v436q2 55 -34 55q-18 0 -27.5 -13t-9.5 -28v-450z" />
-<glyph unicode="&#x26;" horiz-adv-x="854" d="M49 304q0 126 44 225.5t126 222.5q-106 225 -106 442v18q0 94 47 180q70 130 223 130q203 0 252 -215q14 -61 12 -113q0 -162 -205 -434q76 -174 148 -285q33 96 47 211l176 -33q-16 -213 -92 -358q55 -63 92 -76v-235q-23 0 -86 37.5t-123 101.5q-123 -139 -252 -139 t-216 97t-87 223zM263 325.5q1 -65.5 28.5 -107.5t78.5 -42t117 86q-88 139 -174 295q-18 -30 -34.5 -98t-15.5 -133.5zM305 1194q0 -111 55 -246q101 156 101 252q-2 2 0 15.5t-2 36t-11 42.5q-19 52 -61.5 52t-62 -38t-19.5 -75v-39z" />
-<glyph unicode="'" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="(" horiz-adv-x="561" d="M66 645q0 143 29.5 292.5t73.5 261.5q92 235 159 343l30 47l162 -84q-38 -53 -86.5 -148t-82.5 -189.5t-61.5 -238t-27.5 -284.5t26.5 -282.5t64.5 -240.5q80 -207 141 -296l26 -39l-162 -84q-41 61 -96 173t-94 217.5t-70.5 257t-31.5 294.5z" />
-<glyph unicode=")" horiz-adv-x="561" d="M41 -213q36 50 85.5 147t83.5 190t61.5 236.5t27.5 284.5t-26.5 282.5t-64.5 240.5q-78 205 -140 298l-27 39l162 84q41 -61 96 -173.5t94 -217t71 -257.5t32 -296t-30 -292.5t-74 -260.5q-92 -233 -159 -342l-30 -47z" />
-<glyph unicode="*" horiz-adv-x="677" d="M74 1251l43 148l164 -70l-19 176h154l-19 -176l164 70l43 -148l-172 -34l115 -138l-131 -80l-78 152l-76 -152l-131 80l115 138z" />
-<glyph unicode="+" horiz-adv-x="1060" d="M74 649v172h370v346h172v-346h371v-172h-371v-346h-172v346h-370z" />
-<glyph unicode="," horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="-" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="." horiz-adv-x="321" d="M53 0v227h215v-227h-215z" />
-<glyph unicode="/" horiz-adv-x="720" d="M8 -147l543 1652h162l-537 -1652h-168z" />
-<glyph unicode="0" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="1" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="2" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="3" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="4" horiz-adv-x="684" d="M25 328v194l323 983h221v-983h103v-194h-103v-328h-202v328h-342zM213 522h154v516h-13z" />
-<glyph unicode="5" horiz-adv-x="704" d="M74 438h221v-59q0 -115 14.5 -159t52 -44t53 45t15.5 156v336q0 111 -70 110q-33 0 -59.5 -40t-26.5 -70h-186v792h535v-219h-344v-313q74 55 127 51q78 0 133 -40t77 -100q35 -98 35 -171v-336q0 -393 -289 -393q-78 0 -133 29.5t-84.5 71.5t-46.5 109q-24 98 -24 244z " />
-<glyph unicode="6" horiz-adv-x="700" d="M66 309v856q0 356 288.5 356.5t288.5 -356.5v-94h-221q0 162 -11.5 210t-53.5 48t-56 -37t-14 -127v-268q59 37 124.5 37t119 -36t75.5 -93q37 -92 37 -189v-307q0 -90 -42 -187q-26 -61 -89 -99.5t-157.5 -38.5t-158 38.5t-88.5 99.5q-42 98 -42 187zM287 244 q0 -20 17.5 -44t49 -24t50 24.5t18.5 43.5v450q0 18 -18.5 43t-49 25t-48 -20.5t-19.5 -41.5v-456z" />
-<glyph unicode="7" horiz-adv-x="589" d="M8 1286v219h557v-221l-221 -1284h-229l225 1286h-332z" />
-<glyph unicode="8" horiz-adv-x="696" d="M53 322v176q0 188 115 297q-102 102 -102 276v127q0 213 147 293q57 31 135 31t135.5 -31t84 -71t42.5 -93q21 -66 21 -129v-127q0 -174 -103 -276q115 -109 115 -297v-176q0 -222 -153 -306q-60 -32 -142 -32t-141.5 32.5t-88 73.5t-44.5 96q-21 69 -21 136zM269 422 q1 -139 16.5 -187.5t57.5 -48.5t59.5 30t21.5 71t4 158t-13.5 174t-66.5 57t-66.5 -57.5t-12.5 -196.5zM284 1116q-1 -123 11 -173t53 -50t53.5 50t12.5 170t-12.5 167t-51.5 47t-52 -44t-14 -167z" />
-<glyph unicode="9" horiz-adv-x="700" d="M57 340v94h222q0 -162 11 -210t53 -48t56.5 37t14.5 127v283q-59 -37 -125 -37t-119 35.5t-76 92.5q-37 96 -37 189v293q0 87 43 188q25 60 88.5 99t157.5 39t157.5 -39t88.5 -99q43 -101 43 -188v-856q0 -356 -289 -356t-289 356zM279 825q0 -18 18 -42.5t49 -24.5 t48.5 20.5t19.5 40.5v443q0 20 -17.5 43.5t-49.5 23.5t-50 -24.5t-18 -42.5v-437z" />
-<glyph unicode=":" horiz-adv-x="362" d="M74 0v227h215v-227h-215zM74 893v227h215v-227h-215z" />
-<glyph unicode=";" horiz-adv-x="362" d="M74 0v227h215v-227l-113 -266h-102l71 266h-71zM74 893v227h215v-227h-215z" />
-<glyph unicode="&#x3c;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="=" horiz-adv-x="1058" d="M74 477v172h911v-172h-911zM74 864v172h911v-172h-911z" />
-<glyph unicode="&#x3e;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="?" horiz-adv-x="645" d="M25 1260q24 67 78 131q105 128 235 122q82 -2 138 -33.5t82 -81.5q46 -88 46 -170.5t-80 -219.5l-57 -96q-18 -32 -42 -106.5t-24 -143.5v-256h-190v256q0 102 24.5 195t48 140t65.5 118t50 105t-9 67.5t-60 34.5t-78 -48t-49 -98zM199 0h215v227h-215v-227z" />
-<glyph unicode="@" horiz-adv-x="872" d="M66 303v889q0 97 73 200q39 56 117 93t184.5 37t184 -37t116.5 -93q74 -105 74 -200v-793h-164l-20 56q-14 -28 -46 -48t-67 -20q-145 0 -145 172v485q0 170 145 170q71 0 113 -67v45q0 51 -45 104.5t-145.5 53.5t-145.5 -53.5t-45 -104.5v-889q0 -53 44 -103t153.5 -50 t160.5 63l152 -86q-109 -143 -320 -143q-106 0 -184 35.5t-117 90.5q-73 102 -73 193zM535 573q0 -53 48 -53t48 53v455q0 53 -48 53t-48 -53v-455z" />
-<glyph unicode="A" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="B" horiz-adv-x="745" d="M82 0v1505h194q205 0 304.5 -91t99.5 -308q0 -106 -29.5 -175t-107.5 -136q14 -5 47 -38.5t54 -71.5q52 -97 52 -259q0 -414 -342 -426h-272zM303 219q74 0 109 31q55 56 55 211t-63 195q-42 26 -93 26h-8v-463zM303 885q87 0 119 39q45 55 45 138t-14.5 124t-30.5 60.5 t-45 28.5q-35 11 -74 11v-401z" />
-<glyph unicode="C" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175z" />
-<glyph unicode="D" horiz-adv-x="761" d="M82 0v1505h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174zM303 221q117 0 140.5 78t23.5 399v111q0 322 -23.5 398.5t-140.5 76.5v-1063z" />
-<glyph unicode="E" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506z" />
-<glyph unicode="F" horiz-adv-x="616" d="M82 0v1505h526v-227h-305v-395h205v-228h-205v-655h-221z" />
-<glyph unicode="G" horiz-adv-x="737" d="M67 271.5q0 26.5 1 37.5v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-231h-221v231q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-905q0 -46 19.5 -78.5t54 -32.5t53 28t18.5 54l2 29v272h-88v187h309v-750h-131l-26 72 q-70 -88 -172 -88q-203 0 -250 213q-11 48 -11 74.5z" />
-<glyph unicode="H" horiz-adv-x="778" d="M82 0v1505h221v-622h172v622h221v-1505h-221v655h-172v-655h-221z" />
-<glyph unicode="I" horiz-adv-x="385" d="M82 0v1505h221v-1505h-221z" />
-<glyph unicode="J" horiz-adv-x="423" d="M12 -14v217q4 0 12.5 -1t29 2t35.5 12t28.5 34.5t13.5 62.5v1192h221v-1226q0 -137 -74 -216q-74 -78 -223 -78h-4q-19 0 -39 1z" />
-<glyph unicode="K" horiz-adv-x="768" d="M82 0v1505h221v-526h8l195 526h215l-203 -495l230 -1010h-216l-153 655l-6 31h-6l-64 -154v-532h-221z" />
-<glyph unicode="L" horiz-adv-x="604" d="M82 0v1505h221v-1300h293v-205h-514z" />
-<glyph unicode="M" horiz-adv-x="991" d="M82 0v1505h270l131 -688l11 -80h4l10 80l131 688h270v-1505h-204v1010h-13l-149 -1010h-94l-142 946l-8 64h-12v-1010h-205z" />
-<glyph unicode="N" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203z" />
-<glyph unicode="O" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="P" horiz-adv-x="720" d="M82 0v1505h221q166 0 277.5 -105.5t111.5 -345t-111.5 -346t-277.5 -106.5v-602h-221zM303 827q102 0 134 45.5t32 175.5t-33 181t-133 51v-453z" />
-<glyph unicode="Q" horiz-adv-x="729" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -94 -45 -182q33 -43 88 -53v-189q-160 0 -227 117q-55 -18 -125 -18t-130 33.5t-88 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887 q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="R" horiz-adv-x="739" d="M82 0v1505h221q377 0 377 -434q0 -258 -123 -342l141 -729h-221l-115 635h-59v-635h-221zM303 840q117 0 149 98q15 49 15 125t-15.5 125t-45.5 68q-44 30 -103 30v-446z" />
-<glyph unicode="S" horiz-adv-x="702" d="M37 422l217 20q0 -256 104 -256q90 0 91 166q0 59 -32 117.5t-45 79.5l-54 79q-40 58 -77 113t-73.5 117t-68 148.5t-31.5 162.5q0 139 71.5 245t216.5 108h10q88 0 152 -36t94 -100q54 -120 54 -264l-217 -20q0 217 -89 217q-75 -2 -75 -146q0 -59 23 -105 q32 -66 58 -104l197 -296q31 -49 67 -139.5t36 -166.5q0 -378 -306 -378h-2q-229 0 -290 188q-31 99 -31 250z" />
-<glyph unicode="T" horiz-adv-x="647" d="M4 1278v227h639v-227h-209v-1278h-221v1278h-209z" />
-<glyph unicode="U" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175z" />
-<glyph unicode="V" horiz-adv-x="716" d="M18 1505h215l111 -827l8 -64h13l118 891h215l-229 -1505h-221z" />
-<glyph unicode="W" horiz-adv-x="1036" d="M25 1505h204l88 -782l5 -49h16l100 831h160l100 -831h17l92 831h205l-203 -1505h-172l-115 801h-8l-115 -801h-172z" />
-<glyph unicode="X" horiz-adv-x="737" d="M16 0l244 791l-240 714h218l120 -381l7 -18h8l127 399h217l-240 -714l244 -791h-217l-127 449l-4 18h-8l-132 -467h-217z" />
-<glyph unicode="Y" horiz-adv-x="700" d="M14 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641z" />
-<glyph unicode="Z" horiz-adv-x="626" d="M20 0v238l347 1048h-297v219h536v-219l-352 -1067h352v-219h-586z" />
-<glyph unicode="[" horiz-adv-x="538" d="M82 -213v1718h399v-196h-202v-1325h202v-197h-399z" />
-<glyph unicode="\" horiz-adv-x="792" d="M8 1692h162l614 -1872h-168z" />
-<glyph unicode="]" horiz-adv-x="538" d="M57 -16h203v1325h-203v196h400v-1718h-400v197z" />
-<glyph unicode="^" horiz-adv-x="1101" d="M53 809l381 696h234l381 -696h-199l-299 543l-299 -543h-199z" />
-<glyph unicode="_" horiz-adv-x="1210" d="M74 -154h1063v-172h-1063v172z" />
-<glyph unicode="`" horiz-adv-x="1024" d="M293 1489h215l106 -184h-159z" />
-<glyph unicode="a" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="b" horiz-adv-x="686" d="M82 0v1505h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-74h-207zM289 246q0 -29 19.5 -48.5t42 -19.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -21.5t-19.5 -46.5v-628z" />
-<glyph unicode="c" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331z" />
-<glyph unicode="d" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v458h207v-1505h-207v74q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 19.5t19.5 48.5v628q0 25 -19.5 46.5t-42 21.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="e" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="f" horiz-adv-x="475" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-65 0 -65 -175v-5v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="g" horiz-adv-x="700" d="M12 -184q0 94 162 170q-125 35 -125 149q0 45 40 93t89 75q-51 35 -80.5 95.5t-34.5 105.5l-4 43v305q0 35 16.5 91t41 94t79 69t126.5 31q135 0 206 -103q102 102 170 103v-185q-72 0 -120 -24l10 -70v-317q0 -37 -17.5 -90.5t-42 -90t-79 -66.5t-104.5 -30t-62 2 q-29 -25 -29 -46t11 -33.5t42 -20.5t45.5 -10t65.5 -10.5t95 -21.5t89 -41q96 -60 96 -205t-103 -212q-100 -65 -250 -65h-9q-156 2 -240 50t-84 165zM213 -150q0 -77 132 -77h3q59 0 108.5 19t49.5 54t-20.5 52.5t-90.5 29.5l-106 21q-76 -43 -76 -99zM262 509 q0 -17 15.5 -45t44.5 -28q63 6 63 101v307q-2 0 0 10q1 3 1 7q0 8 -3 19q-4 15 -9 30q-11 36 -46 36t-50.5 -25.5t-15.5 -52.5v-359z" />
-<glyph unicode="h" horiz-adv-x="690" d="M82 0v1505h207v-479l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="i" horiz-adv-x="370" d="M82 0v1120h207v-1120h-207zM82 1298v207h207v-207h-207z" />
-<glyph unicode="j" horiz-adv-x="364" d="M-45 -182q29 -8 57 -8q64 0 64 142v1168h207v-1149q0 -186 -51 -266q-23 -35 -71 -62.5t-115 -27.5t-91 12v191zM76 1298v207h207v-207h-207z" />
-<glyph unicode="k" horiz-adv-x="641" d="M82 0v1505h207v-714h10l113 329h186l-149 -364l188 -756h-199l-102 453l-4 16h-10l-33 -82v-387h-207z" />
-<glyph unicode="l" horiz-adv-x="370" d="M82 0v1505h207v-1505h-207z" />
-<glyph unicode="m" horiz-adv-x="1021" d="M82 0v1120h207v-94q2 0 33 30q80 81 139 81q100 0 139 -125q125 125 194.5 125t109.5 -69t40 -150v-918h-194v887q-1 49 -56 49q-41 0 -78 -53v-883h-194v887q0 49 -55 49q-41 0 -78 -53v-883h-207z" />
-<glyph unicode="n" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="o" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="p" horiz-adv-x="686" d="M82 -385v1505h207v-73q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="q" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v73h207v-1505h-207v459q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 21.5t19.5 46.5v628q0 29 -19.5 48.5t-42 19.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="r" horiz-adv-x="503" d="M82 0v1120h207v-125q8 41 58.5 91.5t148.5 50.5v-230q-34 11 -77 11t-86.5 -39t-43.5 -101v-778h-207z" />
-<glyph unicode="s" horiz-adv-x="630" d="M37 326h192q0 -170 97 -170q71 0 71 131q0 78 -129 202q-68 66 -98.5 99t-64 101.5t-33.5 134t12 114.5t39 95q59 100 201 104h11q161 0 211 -105q42 -86 42 -198h-193q0 131 -67 131q-63 -2 -64 -131q0 -33 23.5 -73t45 -62.5t66.5 -65.5q190 -182 191 -342 q0 -123 -64.5 -215t-199.5 -92q-197 0 -260 170q-29 76 -29 172z" />
-<glyph unicode="t" horiz-adv-x="501" d="M20 934v186h105v277h207v-277h141v-186h-141v-557q0 -184 65 -184l76 8v-203q-45 -14 -112 -14t-114.5 28.5t-70 64.5t-34.5 96q-17 79 -17 187v574h-105z" />
-<glyph unicode="u" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5z" />
-<glyph unicode="v" horiz-adv-x="602" d="M16 1120h201l68 -649l8 -72h16l76 721h201l-183 -1120h-204z" />
-<glyph unicode="w" horiz-adv-x="905" d="M20 1120h189l65 -585l9 -64h12l96 649h123l86 -585l10 -64h13l73 649h189l-166 -1120h-172l-80 535l-10 63h-8l-91 -598h-172z" />
-<glyph unicode="x" horiz-adv-x="618" d="M16 0l193 578l-176 542h194l74 -262l6 -31h4l6 31l74 262h195l-176 -542l192 -578h-201l-84 283l-6 30h-4l-6 -30l-84 -283h-201z" />
-<glyph unicode="y" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5z" />
-<glyph unicode="z" horiz-adv-x="532" d="M12 0v168l285 764h-240v188h459v-168l-285 -764h285v-188h-504z" />
-<glyph unicode="{" horiz-adv-x="688" d="M61 453v163q72 0 102 49.5t30 90.5v397q0 223 96 298t342 71v-172q-135 2 -188.5 -38t-53.5 -159v-397q0 -143 -127 -221q127 -82 127 -222v-397q0 -119 53.5 -159t188.5 -38v-172q-246 -4 -342 71t-96 298v397q0 57 -41 97.5t-91 42.5z" />
-<glyph unicode="|" horiz-adv-x="356" d="M82 -512v2204h192v-2204h-192z" />
-<glyph unicode="}" horiz-adv-x="688" d="M57 -281q135 -2 188.5 38t53.5 159v397q0 139 127 222q-127 78 -127 221v397q0 119 -53 159t-189 38v172q246 4 342.5 -71t96.5 -298v-397q0 -63 41 -101.5t90 -38.5v-163q-72 -4 -101.5 -52.5t-29.5 -87.5v-397q0 -223 -96.5 -298t-342.5 -71v172z" />
-<glyph unicode="~" horiz-adv-x="1280" d="M113 1352q35 106 115 200q34 41 94.5 74t121 33t116.5 -18.5t82 -33t83 -51.5q106 -72 174 -71q109 0 178 153l13 29l135 -57q-63 -189 -206 -276q-56 -34 -120 -34q-121 0 -272 101q-115 74 -178.5 74t-113.5 -45.5t-69 -90.5l-18 -45z" />
-<glyph unicode="&#xa1;" horiz-adv-x="387" d="M74 -385l55 1100h129l55 -1100h-239zM86 893v227h215v-227h-215z" />
-<glyph unicode="&#xa2;" horiz-adv-x="636" d="M66 508v489q0 297 208 328v242h123v-244q98 -16 144.5 -88t46.5 -227v-88h-189v135q0 90 -72.5 90t-72.5 -90v-604q0 -90 72 -91q74 0 73 91v155h189v-108q0 -156 -46 -228.5t-145 -89.5v-303h-123v301q-209 31 -208 330z" />
-<glyph unicode="&#xa3;" horiz-adv-x="817" d="M4 63q8 20 23.5 53.5t70 91.5t117.5 68q37 111 37 189t-31 184h-188v137h147l-6 21q-78 254 -78 333t15.5 140t48.5 116q72 122 231 126q190 4 267 -126q65 -108 65 -276h-213q0 201 -115 197q-47 -2 -68.5 -51t-21.5 -139.5t70 -315.5l6 -25h211v-137h-174 q25 -100 24.5 -189t-57.5 -204q16 -8 44 -24q59 -35 89 -35q74 4 82 190l188 -22q-12 -182 -81.5 -281.5t-169.5 -99.5q-51 0 -143.5 51t-127.5 51t-63.5 -25.5t-40.5 -52.5l-12 -24z" />
-<glyph unicode="&#xa5;" horiz-adv-x="720" d="M25 1505h217l110 -481l6 -14h4l7 14l110 481h217l-196 -753h147v-138h-176v-137h176v-137h-176v-340h-221v340h-176v137h176v137h-176v138h147z" />
-<glyph unicode="&#xa8;" horiz-adv-x="1024" d="M272 1305v200h191v-200h-191zM561 1305v200h191v-200h-191z" />
-<glyph unicode="&#xa9;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM627 487v531q0 122 97 174q40 22 95 22 q147 0 182 -147l7 -49v-125h-138v142q0 11 -12 28.5t-37 17.5q-47 -2 -49 -63v-531q0 -63 49 -63q53 2 49 63v125h138v-125q0 -68 -40 -127q-18 -26 -57 -47.5t-108.5 -21.5t-117.5 49t-54 98z" />
-<glyph unicode="&#xaa;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xad;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#xae;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM625 313v879h196q231 0 232 -258 q0 -76 -16.5 -125t-71.5 -96l106 -400h-151l-95 365h-55v-365h-145zM770 805h45q43 0 65.5 21.5t27.5 45t5 61.5t-5 62.5t-27.5 46t-65.5 21.5h-45v-258z" />
-<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M313 1315v162h398v-162h-398z" />
-<glyph unicode="&#xb2;" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="&#xb3;" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="&#xb4;" horiz-adv-x="1024" d="M410 1305l106 184h215l-162 -184h-159z" />
-<glyph unicode="&#xb7;" horiz-adv-x="215" d="M0 649v228h215v-228h-215z" />
-<glyph unicode="&#xb8;" horiz-adv-x="1024" d="M426 -111h172v-141l-45 -133h-104l40 133h-63v141z" />
-<glyph unicode="&#xb9;" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="&#xba;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="&#xbf;" horiz-adv-x="645" d="M41 -106q0 82 80 219l57 95q18 32 42 106.5t24 144.5v256h190v-256q0 -102 -24.5 -195.5t-48 -140.5t-65.5 -118t-50 -104.5t9 -67.5t60 -35t78 48.5t49 98.5l179 -84q-24 -66 -78 -132q-104 -126 -236 -122q-163 4 -220 115q-46 90 -46 172zM231 893v227h215v-227h-215z " />
-<glyph unicode="&#xc0;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM141 1823h215l107 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc1;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM293 1638l106 185h215l-161 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc2;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM133 1638l141 185h220l141 -185h-189l-63 72l-61 -72h-189zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc3;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM184 1632v152q49 39 95.5 39t104.5 -18.5t100.5 -19.5t97.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-98 19.5t-102 -33zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc4;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM143 1638v201h191v-201h-191zM307 541h152l-64 475l-6 39h-12zM432 1638v201h191v-201h-191z" />
-<glyph unicode="&#xc5;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM231 1761.5q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM307 541h152l-64 475l-6 39h-12zM309 1761.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50 t-23.5 50t-52.5 21.5t-52.5 -21.5t-23.5 -50z" />
-<glyph unicode="&#xc6;" horiz-adv-x="1099" d="M16 0l420 1505h623v-227h-285v-395h205v-242h-205v-414h285v-227h-506v307h-227l-90 -307h-220zM393 541h160v514h-10z" />
-<glyph unicode="&#xc7;" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM268 -111v-141h64l-41 -133h104l45 133v141h-172z" />
-<glyph unicode="&#xc8;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM111 1823h215l106 -185h-160z" />
-<glyph unicode="&#xc9;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM236 1638l106 185h215l-162 -185h-159z" />
-<glyph unicode="&#xca;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM84 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xcb;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM94 1638v201h191v-201h-191zM383 1638v201h190v-201h-190z" />
-<glyph unicode="&#xcc;" horiz-adv-x="401" d="M-6 1823h215l106 -185h-159zM98 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcd;" horiz-adv-x="401" d="M82 0v1505h221v-1505h-221zM86 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xce;" horiz-adv-x="370" d="M-66 1638l142 185h219l141 -185h-188l-64 72l-61 -72h-189zM74 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcf;" horiz-adv-x="372" d="M-53 1638v201h190v-201h-190zM76 0v1505h221v-1505h-221zM236 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd0;" horiz-adv-x="761" d="M20 655v228h62v622h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174v655h-62zM303 221q117 0 141.5 81t22.5 452q2 371 -22.5 450.5t-141.5 79.5v-401h84v-228h-84v-434z " />
-<glyph unicode="&#xd1;" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203zM207 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39t-102.5 19.5t-100 19.5t-99.5 -33z" />
-<glyph unicode="&#xd2;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM121 1823h215l106 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd3;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM285 1638l106 185h215l-162 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5 t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd4;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM113 1638l141 185h219l141 -185h-188l-64 72l-61 -72h-188zM289 309q0 -46 19.5 -78 t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd5;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM164 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39 t-102.5 19.5t-100 19.5t-99.5 -33zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd6;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM123 1638v201h190v-201h-190zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887zM412 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd8;" d="M59 -20l47 157q-36 74 -36 148l-2 24v887q0 42 17 106t45 107t88.5 78t148 35t153.5 -43l15 47h122l-45 -150q43 -84 43 -155l2 -25v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-150.5 -34.5t-153 43l-15 -47h-129zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v488zM289 727l147 479q-8 100 -74 101q-35 0 -53 -28t-18 -54l-2 -29v-469z" />
-<glyph unicode="&#xd9;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM145 1823h215l107 -185h-160z" />
-<glyph unicode="&#xda;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM307 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xdb;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM125 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xdc;" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175zM135 1638v201h191v-201h-191zM424 1638v201h190v-201h-190z" />
-<glyph unicode="&#xdd;" horiz-adv-x="704" d="M16 1505l226 -864v-641h221v641l225 864h-217l-111 -481l-6 -14h-4l-6 14l-111 481h-217zM254 1638l106 185h215l-161 -185h-160z" />
-<glyph unicode="&#xde;" d="M82 0v1505h219v-241h2q166 0 277.5 -105.5t111.5 -345.5t-111.5 -346.5t-277.5 -106.5v-360h-221zM303 586q102 0 134 45t32 175t-33 181t-133 51v-452z" />
-<glyph unicode="&#xdf;" horiz-adv-x="733" d="M66 0v1235q0 123 70.5 205t206.5 82t204.5 -81t68.5 -197t-88 -181q152 -88 152 -488q0 -362 -87 -475q-46 -59 -102.5 -79.5t-144.5 -20.5v193q45 0 70 25q57 57 57 357q0 316 -57 377q-25 27 -70 27v141q35 0 60.5 33t25.5 84q0 100 -86 100q-74 0 -74 -102v-1235h-206 z" />
-<glyph unicode="&#xe0;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1489h215 l107 -184h-160zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe1;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xe2;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM90 1305 l141 184h220l141 -184h-189l-63 71l-61 -71h-189zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe3;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM143 1305v151 q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe4;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1305v200 h191v-200h-191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM391 1305v200h191v-200h-191z" />
-<glyph unicode="&#xe5;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM188 1421.5 q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM266 1421.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50t-23.5 50t-52.5 21.5t-52.5 -21.5 t-23.5 -50z" />
-<glyph unicode="&#xe6;" horiz-adv-x="989" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t197.5 88q84 0 152 -52q66 51 162 52q199 0 251 -197q14 -51 15 -92v-326h-342v-256q0 -60 38 -88q17 -12 38 -12q70 10 73 113v122h193v-129 q0 -37 -16.5 -93t-41 -95t-80 -69.5t-130.5 -30.5q-158 0 -226 131q-102 -131 -221 -131q-59 0 -112.5 60t-53.5 191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM588 684h149v158q0 48 -19.5 81t-53 33t-53 -28.5t-21.5 -57.5l-2 -28v-158z " />
-<glyph unicode="&#xe7;" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331zM238 -111v-141h63l-41 -133h105l45 133v141h-172z " />
-<glyph unicode="&#xe8;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM102 1489h215l107 -184 h-160zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xe9;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xea;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM80 1305l141 184h219 l142 -184h-189l-63 71l-62 -71h-188zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xeb;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM90 1305v200h191v-200 h-191zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xec;" horiz-adv-x="370" d="M-33 1489h215l107 -184h-160zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xed;" horiz-adv-x="370" d="M82 0h207v1120h-207v-1120zM82 1305l106 184h215l-161 -184h-160z" />
-<glyph unicode="&#xee;" horiz-adv-x="370" d="M-66 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xef;" horiz-adv-x="372" d="M-53 1305v200h190v-200h-190zM82 0v1120h207v-1120h-207zM236 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf0;" horiz-adv-x="673" d="M76 279v579q0 279 172 279q63 0 155 -78q-12 109 -51 203l-82 -72l-55 63l100 88l-45 66l109 100q25 -27 53 -61l94 82l56 -66l-101 -88q125 -201 125 -446v-656q0 -102 -56 -188q-26 -39 -80 -69.5t-129 -30.5t-130 30.5t-80 73.5q-53 91 -53 160zM270 267.5 q-2 -11.5 2 -29t10 -34.5q16 -38 58 -38q70 10 72 113v563q-2 0 0 11t-2 28.5t-10 34.5q-16 40 -60 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf1;" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207zM147 1305v151q49 39 95.5 39t105 -18.5t97 -19.5t100.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#xf2;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM98 1489h215l107 -184h-160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf3;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5 t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM260 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xf4;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM78 1305l141 184h219l142 -184h-189l-63 71l-62 -71h-188zM258 267.5q-2 -11.5 2 -29 t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf5;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM131 1305v151q49 39 95.5 39t104.5 -18.5t98.5 -19.5t98.5 32v-152q-51 -39 -95 -39 t-102 19.5t-101 19.5t-99 -32zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf6;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM90 1305v200h191v-200h-191zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf8;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t118 32t117.5 -19l21 80h75l-30 -121q88 -84 94 -229v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-120.5 -30.5t-112 16l-20 -78h-80l31 121q-41 39 -64.5 97.5t-25.5 97.5zM258 436l125 486q-18 35 -55 34q-68 -10 -70 -114 v-406zM274 197q17 -31 54 -31q70 10 71 113v403z" />
-<glyph unicode="&#xf9;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM113 1489h215l106 -184h-160z" />
-<glyph unicode="&#xfa;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM274 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfb;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM94 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189z" />
-<glyph unicode="&#xfc;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM106 1305v200h191v-200h-191zM395 1305v200h191v-200h-191z" />
-<glyph unicode="&#xfd;" horiz-adv-x="634" d="M25 1120l190 -1153q0 -68 -36 -123t-97 -61l-49 4v-184q70 -4 92 -4q115 0 192.5 95t94.5 222l198 1204h-202l-82 -688l-4 -57h-9l-4 57l-82 688h-202zM231 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfe;" horiz-adv-x="686" d="M82 -385v1890h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="&#xff;" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5zM78 1305v200h190v-200h-190zM367 1305v200h190v-200h-190z" />
-<glyph unicode="&#x152;" horiz-adv-x="983" d="M68 309v887q0 41 17 101.5t45 100.5t88.5 73.5t143.5 33.5h580v-227h-285v-395h205v-242h-205v-414h285v-227h-580q-84 0 -144 31.5t-88 78.5q-55 91 -60 169zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v901q-6 96 -74 97q-35 0 -53 -28t-18 -54l-2 -29 v-887z" />
-<glyph unicode="&#x153;" horiz-adv-x="995" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t145.5 32t156 -60q66 59 170 60q199 0 252 -197q14 -51 14 -92v-326h-342v-250q0 -46 22.5 -76t53.5 -30q70 10 73 113v122h193v-129q0 -37 -16.5 -93t-41 -95t-80 -69.5t-146 -30.5t-154.5 57q-68 -57 -156 -57t-143.5 30.5 t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM594 684h149v158q0 48 -19 81t-58 33t-55.5 -37.5t-16.5 -70.5v-164z" />
-<glyph unicode="&#x178;" horiz-adv-x="704" d="M16 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641zM113 1638v201h190v-201h-190zM401 1638v201h191v-201h-191z" />
-<glyph unicode="&#x2c6;" horiz-adv-x="1021" d="M260 1305l141 184h220l141 -184h-189l-63 71l-61 -71h-189z" />
-<glyph unicode="&#x2dc;" horiz-adv-x="1024" d="M313 1305v151q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#x2000;" horiz-adv-x="952" />
-<glyph unicode="&#x2001;" horiz-adv-x="1905" />
-<glyph unicode="&#x2002;" horiz-adv-x="952" />
-<glyph unicode="&#x2003;" horiz-adv-x="1905" />
-<glyph unicode="&#x2004;" horiz-adv-x="635" />
-<glyph unicode="&#x2005;" horiz-adv-x="476" />
-<glyph unicode="&#x2006;" horiz-adv-x="317" />
-<glyph unicode="&#x2007;" horiz-adv-x="317" />
-<glyph unicode="&#x2008;" horiz-adv-x="238" />
-<glyph unicode="&#x2009;" horiz-adv-x="381" />
-<glyph unicode="&#x200a;" horiz-adv-x="105" />
-<glyph unicode="&#x2010;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2011;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2012;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2013;" horiz-adv-x="806" d="M74 649v195h659v-195h-659z" />
-<glyph unicode="&#x2014;" horiz-adv-x="972" d="M74 649v195h825v-195h-825z" />
-<glyph unicode="&#x2018;" horiz-adv-x="309" d="M49 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x2019;" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="&#x201a;" horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="&#x201c;" horiz-adv-x="624" d="M53 1012v227l113 266h102l-71 -266h71v-227h-215zM356 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x201d;" horiz-adv-x="624" d="M53 1012l72 266h-72v227h215v-227l-112 -266h-103zM356 1012l72 266h-72v227h215v-227l-112 -266h-103z" />
-<glyph unicode="&#x201e;" horiz-adv-x="624" d="M53 0v227h215v-227l-112 -266h-103l72 266h-72zM356 0v227h215v-227l-112 -266h-103l72 266h-72z" />
-<glyph unicode="&#x2022;" horiz-adv-x="663" d="M82 815q0 104 72.5 177t177 73t177.5 -72.5t73 -177t-73 -177.5t-177 -73t-177 73t-73 177z" />
-<glyph unicode="&#x2026;" horiz-adv-x="964" d="M53 0v227h215v-227h-215zM375 0v227h215v-227h-215zM696 0v227h215v-227h-215z" />
-<glyph unicode="&#x202f;" horiz-adv-x="381" />
-<glyph unicode="&#x2039;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="&#x203a;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="&#x205f;" horiz-adv-x="476" />
-<glyph unicode="&#x20ac;" horiz-adv-x="813" d="M53 547v137h107v137h-107v137h107v238q0 42 17.5 106t45 107t88 78t144.5 35t144 -34t88 -81q53 -90 61 -178l2 -33v-84h-207v84q-2 0 0 11.5t-3 27.5t-12 33q-18 39 -69 39q-70 -10 -78 -111v-238h233v-137h-233v-137h233v-137h-233v-238q0 -43 21.5 -76.5t59.5 -33.5 t58.5 27.5t20.5 56.5l2 26v84h207v-84q0 -38 -17.5 -104t-45.5 -109t-88 -77.5t-144 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175l-2 35v238h-107z" />
-<glyph unicode="&#x2122;" horiz-adv-x="937" d="M74 1401v104h321v-104h-104v-580h-113v580h-104zM440 821v684h138l67 -319h6l68 319h137v-684h-104v449l-78 -449h-51l-80 449v-449h-103z" />
-<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 0v1120h1120v-1120h-1120z" />
-<glyph unicode="&#xfb01;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2v-184q-41 12 -91 12t-69.5 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h358v-1120h-207v934h-151v-934h-207v934h-105z" />
-<glyph unicode="&#xfb02;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2h164v-1505h-207v1329q-37 4 -67.5 4t-50 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="&#xfb03;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1120h207v-1120h-207zM1032 1298v207h207v-207h-207z" />
-<glyph unicode="&#xfb04;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1505h207v-1505h-207z" />
-</font>
-</defs></svg> 
diff --git a/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.ttf b/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.ttf
deleted file mode 100644
Binary files a/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.ttf and /dev/null differ
diff --git a/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.woff b/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.woff
deleted file mode 100644
Binary files a/docs/slides/flops14/reveal.js/lib/font/league_gothic-webfont.woff and /dev/null differ
diff --git a/docs/slides/flops14/reveal.js/lib/font/league_gothic_license b/docs/slides/flops14/reveal.js/lib/font/league_gothic_license
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/lib/font/league_gothic_license
+++ /dev/null
@@ -1,2 +0,0 @@
-SIL Open Font License (OFL)
-http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
diff --git a/docs/slides/flops14/reveal.js/plugin/highlight/highlight.js b/docs/slides/flops14/reveal.js/plugin/highlight/highlight.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/highlight/highlight.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// START CUSTOM REVEAL.JS INTEGRATION
-(function() {
-	if( typeof window.addEventListener === 'function' ) {
-		var hljs_nodes = document.querySelectorAll( 'pre code' );
-
-		for( var i = 0, len = hljs_nodes.length; i < len; i++ ) {
-			var element = hljs_nodes[i];
-
-			// trim whitespace if data-trim attribute is present
-			if( element.hasAttribute( 'data-trim' ) && typeof element.innerHTML.trim === 'function' ) {
-				element.innerHTML = element.innerHTML.trim();
-			}
-
-			// Now escape html unless prevented by author
-			if( ! element.hasAttribute( 'data-noescape' )) {
-				element.innerHTML = element.innerHTML.replace(/</g,"&lt;").replace(/>/g,"&gt;");
-			}
-
-			// re-highlight when focus is lost (for edited code)
-			element.addEventListener( 'focusout', function( event ) {
-				hljs.highlightBlock( event.currentTarget );
-			}, false );
-		}
-	}
-})();
-// END CUSTOM REVEAL.JS INTEGRATION
-
-// highlight.js build includes support for:
-// All languages in master + fsharp
-
-
-var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+(q.parentNode?q.parentNode.className:"")).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(r){function o(s){return(s&&s.source)||s}function p(t,s){return RegExp(o(t),"m"+(r.cI?"i":"")+(s?"g":""))}function q(z,x){if(z.compiled){return}z.compiled=true;var u=[];if(z.k){var s={};function A(B,t){t.split(" ").forEach(function(C){var D=C.split("|");s[D[0]]=[B,D[1]?Number(D[1]):1];u.push(D[0])})}z.lR=p(z.l||hljs.IR+"(?!\\.)",true);if(typeof z.k=="string"){A("keyword",z.k)}else{for(var y in z.k){if(!z.k.hasOwnProperty(y)){continue}A(y,z.k[y])}}z.k=s}if(x){if(z.bWK){z.b="\\b("+u.join("|")+")\\b(?!\\.)\\s*"}z.bR=p(z.b?z.b:"\\B|\\b");if(!z.e&&!z.eW){z.e="\\B|\\b"}if(z.e){z.eR=p(z.e)}z.tE=o(z.e)||"";if(z.eW&&x.tE){z.tE+=(z.e?"|":"")+x.tE}}if(z.i){z.iR=p(z.i)}if(z.r===undefined){z.r=1}if(!z.c){z.c=[]}for(var w=0;w<z.c.length;w++){if(z.c[w]=="self"){z.c[w]=z}q(z.c[w],z)}if(z.starts){q(z.starts,x)}var v=[];for(var w=0;w<z.c.length;w++){v.push(o(z.c[w].b))}if(z.tE){v.push(o(z.tE))}if(z.i){v.push(o(z.i))}z.t=v.length?p(v.join("|"),true):{exec:function(t){return null}}}q(r)}function d(E,F,C){function o(r,N){for(var M=0;M<N.c.length;M++){var L=N.c[M].bR.exec(r);if(L&&L.index==0){return N.c[M]}}}function s(L,r){if(L.e&&L.eR.test(r)){return L}if(L.eW){return s(L.parent,r)}}function t(r,L){return !C&&L.i&&L.iR.test(r)}function y(M,r){var L=G.cI?r[0].toLowerCase():r[0];return M.k.hasOwnProperty(L)&&M.k[L]}function H(){var L=l(w);if(!A.k){return L}var r="";var O=0;A.lR.lastIndex=0;var M=A.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=y(A,M);if(N){v+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=A.lR.lastIndex;M=A.lR.exec(L)}return r+L.substr(O)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function K(){return A.sL!==undefined?z():H()}function J(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){x+=L;w=""}else{if(M.eB){x+=l(r)+L;w=""}else{x+=L;w=r}}A=Object.create(M,{parent:{value:A}})}function D(L,r){w+=L;if(r===undefined){x+=K();return 0}var N=o(r,A);if(N){x+=K();J(N,r);return N.rB?0:r.length}var O=s(A,r);if(O){var M=A;if(!(M.rE||M.eE)){w+=r}x+=K();do{if(A.cN){x+="</span>"}B+=A.r;A=A.parent}while(A!=O.parent);if(M.eE){x+=l(r)}w="";if(O.starts){J(O.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw new Error('Illegal lexem "'+r+'" for mode "'+(A.cN||"<unnamed>")+'"')}w+=r;return r.length||1}var G=e[E];f(G);var A=G;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(F);if(!u){break}q=D(F.substr(p,u.index-p),u[0]);p=u.index+q}D(F.substr(p));return{r:B,keyword_count:v,value:x,language:E}}catch(I){if(I.message.indexOf("Illegal")!=-1){return{r:0,keyword_count:0,value:l(F)}}else{throw I}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s,false);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v,true):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES["1c"]=function(b){var f="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";var c="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";var e="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a],r:0};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функция)",e:"$",l:f,k:"процедура функция",c:[{cN:"title",b:f},{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"экспорт",eW:true,l:f,k:"экспорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}}(hljs);hljs.LANGUAGES.actionscript=function(a){var d="[a-zA-Z_$][a-zA-Z0-9_$]*";var c="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var e={cN:"rest_arg",b:"[.]{3}",e:d,r:10};var b={cN:"title",b:d};return{k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:"package",bWK:true,e:"{",k:"package",c:[b]},{cN:"class",bWK:true,e:"{",k:"class interface",c:[{bWK:true,k:"extends implements"},b]},{cN:"preprocessor",bWK:true,e:";",k:"import include"},{cN:"function",bWK:true,e:"[{;]",k:"function",i:"\\S",c:[b,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,e]},{cN:"type",b:":",e:c,r:10}]}]}}(hljs);hljs.LANGUAGES.apache=function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,k:{keyword:"acceptfilter acceptmutex acceptpathinfo accessfilename action addalt addaltbyencoding addaltbytype addcharset adddefaultcharset adddescription addencoding addhandler addicon addiconbyencoding addiconbytype addinputfilter addlanguage addmoduleinfo addoutputfilter addoutputfilterbytype addtype alias aliasmatch allow allowconnect allowencodedslashes allowoverride anonymous anonymous_logemail anonymous_mustgiveemail anonymous_nouserid anonymous_verifyemail authbasicauthoritative authbasicprovider authdbduserpwquery authdbduserrealmquery authdbmgroupfile authdbmtype authdbmuserfile authdefaultauthoritative authdigestalgorithm authdigestdomain authdigestnccheck authdigestnonceformat authdigestnoncelifetime authdigestprovider authdigestqop authdigestshmemsize authgroupfile authldapbinddn authldapbindpassword authldapcharsetconfig authldapcomparednonserver authldapdereferencealiases authldapgroupattribute authldapgroupattributeisdn authldapremoteuserattribute authldapremoteuserisdn authldapurl authname authnprovideralias authtype authuserfile authzdbmauthoritative authzdbmtype authzdefaultauthoritative authzgroupfileauthoritative authzldapauthoritative authzownerauthoritative authzuserauthoritative balancermember browsermatch browsermatchnocase bufferedlogs cachedefaultexpire cachedirlength cachedirlevels cachedisable cacheenable cachefile cacheignorecachecontrol cacheignoreheaders cacheignorenolastmod cacheignorequerystring cachelastmodifiedfactor cachemaxexpire cachemaxfilesize cacheminfilesize cachenegotiateddocs cacheroot cachestorenostore cachestoreprivate cgimapextension charsetdefault charsetoptions charsetsourceenc checkcaseonly checkspelling chrootdir contentdigest cookiedomain cookieexpires cookielog cookiename cookiestyle cookietracking coredumpdirectory customlog dav davdepthinfinity davgenericlockdb davlockdb davmintimeout dbdexptime dbdkeep dbdmax dbdmin dbdparams dbdpersist dbdpreparesql dbdriver defaulticon defaultlanguage defaulttype deflatebuffersize deflatecompressionlevel deflatefilternote deflatememlevel deflatewindowsize deny directoryindex directorymatch directoryslash documentroot dumpioinput dumpiologlevel dumpiooutput enableexceptionhook enablemmap enablesendfile errordocument errorlog example expiresactive expiresbytype expiresdefault extendedstatus extfilterdefine extfilteroptions fileetag filterchain filterdeclare filterprotocol filterprovider filtertrace forcelanguagepriority forcetype forensiclog gracefulshutdowntimeout group header headername hostnamelookups identitycheck identitychecktimeout imapbase imapdefault imapmenu include indexheadinsert indexignore indexoptions indexorderdefault indexstylesheet isapiappendlogtoerrors isapiappendlogtoquery isapicachefile isapifakeasync isapilognotsupported isapireadaheadbuffer keepalive keepalivetimeout languagepriority ldapcacheentries ldapcachettl ldapconnectiontimeout ldapopcacheentries ldapopcachettl ldapsharedcachefile ldapsharedcachesize ldaptrustedclientcert ldaptrustedglobalcert ldaptrustedmode ldapverifyservercert limitinternalrecursion limitrequestbody limitrequestfields limitrequestfieldsize limitrequestline limitxmlrequestbody listen listenbacklog loadfile loadmodule lockfile logformat loglevel maxclients maxkeepaliverequests maxmemfree maxrequestsperchild maxrequestsperthread maxspareservers maxsparethreads maxthreads mcachemaxobjectcount mcachemaxobjectsize mcachemaxstreamingbuffer mcacheminobjectsize mcacheremovalalgorithm mcachesize metadir metafiles metasuffix mimemagicfile minspareservers minsparethreads mmapfile mod_gzip_on mod_gzip_add_header_count mod_gzip_keep_workfiles mod_gzip_dechunk mod_gzip_min_http mod_gzip_minimum_file_size mod_gzip_maximum_file_size mod_gzip_maximum_inmem_size mod_gzip_temp_dir mod_gzip_item_include mod_gzip_item_exclude mod_gzip_command_version mod_gzip_can_negotiate mod_gzip_handle_methods mod_gzip_static_suffix mod_gzip_send_vary mod_gzip_update_static modmimeusepathinfo multiviewsmatch namevirtualhost noproxy nwssltrustedcerts nwsslupgradeable options order passenv pidfile protocolecho proxybadheader proxyblock proxydomain proxyerroroverride proxyftpdircharset proxyiobuffersize proxymaxforwards proxypass proxypassinterpolateenv proxypassmatch proxypassreverse proxypassreversecookiedomain proxypassreversecookiepath proxypreservehost proxyreceivebuffersize proxyremote proxyremotematch proxyrequests proxyset proxystatus proxytimeout proxyvia readmename receivebuffersize redirect redirectmatch redirectpermanent redirecttemp removecharset removeencoding removehandler removeinputfilter removelanguage removeoutputfilter removetype requestheader require rewritebase rewritecond rewriteengine rewritelock rewritelog rewriteloglevel rewritemap rewriteoptions rewriterule rlimitcpu rlimitmem rlimitnproc satisfy scoreboardfile script scriptalias scriptaliasmatch scriptinterpretersource scriptlog scriptlogbuffer scriptloglength scriptsock securelisten seerequesttail sendbuffersize serveradmin serveralias serverlimit servername serverpath serverroot serversignature servertokens setenv setenvif setenvifnocase sethandler setinputfilter setoutputfilter ssienableaccess ssiendtag ssierrormsg ssistarttag ssitimeformat ssiundefinedecho sslcacertificatefile sslcacertificatepath sslcadnrequestfile sslcadnrequestpath sslcarevocationfile sslcarevocationpath sslcertificatechainfile sslcertificatefile sslcertificatekeyfile sslciphersuite sslcryptodevice sslengine sslhonorciperorder sslmutex ssloptions sslpassphrasedialog sslprotocol sslproxycacertificatefile sslproxycacertificatepath sslproxycarevocationfile sslproxycarevocationpath sslproxyciphersuite sslproxyengine sslproxymachinecertificatefile sslproxymachinecertificatepath sslproxyprotocol sslproxyverify sslproxyverifydepth sslrandomseed sslrequire sslrequiressl sslsessioncache sslsessioncachetimeout sslusername sslverifyclient sslverifydepth startservers startthreads substitute suexecusergroup threadlimit threadsperchild threadstacksize timeout traceenable transferlog typesconfig unsetenv usecanonicalname usecanonicalphysicalport user userdir virtualdocumentroot virtualdocumentrootip virtualscriptalias virtualscriptaliasip win32disableacceptex xbithack",literal:"on off"},c:[a.HCM,{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,{cN:"tag",b:"</?",e:">"},a.QSM]}}(hljs);hljs.LANGUAGES.applescript=function(a){var b=a.inherit(a.QSM,{i:""});var e={cN:"title",b:a.UIR};var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bWK:true,k:"on",i:"[${=;\\n]",c:[e,d]}].concat(c),i:"//"}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);hljs.LANGUAGES.asciidoc=function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{4,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}}(hljs);hljs.LANGUAGES.avrasm=function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$"},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}}(hljs);hljs.LANGUAGES.axapta=function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"{",i:":",k:"class interface",c:[{cN:"inheritance",bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]}]}}(hljs);hljs.LANGUAGES.bash=function(a){var c={cN:"variable",b:/\$[\w\d#@][\w\d_]*/};var b={cN:"variable",b:/\$\{(.*?)\}/};var e={cN:"string",b:/"/,e:/"/,c:[a.BE,c,b,{cN:"variable",b:/\$\(/,e:/\)/,c:a.BE}],r:0};var d={cN:"string",b:/'/,e:/'/,r:0};return{l:/-?[a-z]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[{cN:"title",b:/\w[\w\d_]*/}],r:0},a.HCM,a.NM,e,d,c,b]}}(hljs);hljs.LANGUAGES.brainfuck=function(a){return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",eE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]"},{cN:"literal",b:"[\\+\\-]"}]}}(hljs);hljs.LANGUAGES.clojure=function(l){var e={built_in:"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for doseq dosync dotimes and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import intern refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! import use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if throw printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time ns assert re-find re-groups rand-int rand mod locking assert-valid-fdecl alias namespace resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! memfn to-array future future-call into-array aset gen-class reduce merge map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j={cN:"string",b:'"',e:'"',c:[l.BE],r:0};var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:"\\S",c:[o,m]}}(hljs);hljs.LANGUAGES.cmake=function(a){return{cI:true,k:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file",c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}}(hljs);hljs.LANGUAGES.coffeescript=function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f={cN:"title",b:a};var e={cN:"subst",b:"#\\{",e:"}",k:b,};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",b:"'''",e:"'''",c:[c.BE]},{cN:"string",b:"'",e:"'",c:[c.BE],r:0},{cN:"string",b:'"""',e:'"""',c:[c.BE,e]},{cN:"string",b:'"',e:'"',c:[c.BE,e],r:0},{cN:"regexp",b:"///",e:"///",c:[c.HCM]},{cN:"regexp",b:"//[gim]*",r:0},{cN:"regexp",b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bWK:true,k:"class",e:"$",i:"[:\\[\\]]",c:[{bWK:true,k:"extends",eW:true,i:":",c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true}])}}(hljs);hljs.LANGUAGES.cpp=function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.css=function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.d=function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?',r:0};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}}(hljs);hljs.LANGUAGES.delphi=function(b){var f="and safecall cdecl then string exports library not pascal set virtual file in array label packed end. index while const raise for to implementation with except overload destructor downto finally program exit unit inherited override if type until function do begin repeat goto nil far initialization object else var uses external resourcestring interface end finalization class asm mod case on shr shl of register xorwrite threadvar try record near stored constructor stdcall inline div out or procedure";var e="safecall stdcall pascal stored const implementation finalization except to finally program inherited override then exports string read not mod shr try div shl set library message packed index for near overload label downto exit public goto interface asm on of constructor or private array unit raise destructor var type until function else external with case default record while protected property procedure published and cdecl do threadvar file in if end virtual write far out begin repeat nil initialization object uses resourcestring class register xorwrite inline static";var a={cN:"comment",b:"{",e:"}",r:0};var g={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}],r:0};var d={cN:"string",b:"(#\\d+)+"};var h={cN:"function",bWK:true,e:"[:;]",k:"function constructor|10 destructor|10 procedure|10",c:[{cN:"title",b:b.IR},{cN:"params",b:"\\(",e:"\\)",k:f,c:[c,d]},a,g]};return{cI:true,k:f,i:'("|\\$[G-Zg-z]|\\/\\*|</)',c:[a,g,b.CLCM,c,d,b.NM,h,{cN:"class",b:"=\\bclass\\b",e:"end;",k:e,c:[c,d,a,g,b.CLCM,h]}]}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.django=function(c){function e(h,g){return(g==undefined||(!h.cN&&g.cN=="tag")||h.cN=="value")}function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}if(e(l,k)){m=b.concat(m)}if(m.length){g.c=m}}return g}var d={cN:"filter",b:"\\|[A-Za-z]+\\:?",k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:'"',e:'"'}]};var b=[{cN:"template_comment",b:"{%\\s*comment\\s*%}",e:"{%\\s*endcomment\\s*%}"},{cN:"template_comment",b:"{#",e:"#}"},{cN:"template_tag",b:"{%",e:"%}",k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[d]},{cN:"variable",b:"{{",e:"}}",c:[d]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.dos=function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}}(hljs);hljs.LANGUAGES["erlang-repl"]=function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}}(hljs);hljs.LANGUAGES.erlang=function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#",e:"}",i:".",r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",eW:true,r:0}]};var k={k:f,b:"(fun|receive|if|try|case)",e:"end"};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(</|\\*=|\\+=|-=|/=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+c+"\\s*\\(",e:"->",rB:true,i:"\\(|#|//|/\\*|\\\\|:",c:[d,{cN:"title",b:c}],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}}(hljs);hljs.LANGUAGES.fsharp=function(a){var b="'[a-zA-Z0-9_]+";return{k:"yield! return! let! do!abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun|10 function global if in inherit inline interface internal lazy let match member module mutable|10 namespace new null of open or override private public rec|10 return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"//",e:"$",rB:true},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bWK:true,e:"\\(|=|$",k:"type",c:[{cN:"title",b:a.UIR}]},{cN:"annotation",b:"\\[<",e:">\\]",r:10},{cN:"typeparam",b:"<",e:">",c:[{cN:"title",b:b}]},a.CLCM,a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}}(hljs);hljs.LANGUAGES.glsl=function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}}(hljs);hljs.LANGUAGES.go=function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"string",b:"`",e:"`"},{cN:"number",b:"[^a-zA-Z_0-9](\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?",r:0},a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.haml=function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(-#|/).*$",r:0},{b:"^\\s*-(?!#)",starts:{e:"\\n",sL:"ruby"},r:0},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+",r:0},{cN:"value",b:"[#\\.]\\w+",r:0},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,r:0,c:[{cN:"symbol",b:":\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,r:0,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0}],r:10},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"},r:0}]}}(hljs);hljs.LANGUAGES.handlebars=function(c){function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}m=d.concat(m);if(m.length){g.c=m}}return g}var b="each in with if else unless bindattr action collection debugger log outlet template unbound view yield";var e={cN:"variable",b:"[a-zA-Z.]+",k:b};var d=[{cN:"expression",b:"{{",e:"}}",c:[{cN:"begin-block",b:"#[a-zA-Z .]+",k:b},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z .]+",k:b},{cN:"variable",b:"[a-zA-Z.]+",k:b}]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.haskell=function(a){var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},{cN:"title",b:"[_a-z][\\w']*"}]};var b={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance not as foreign ccall safe unsafe",c:[{cN:"comment",b:"--",e:"$"},{cN:"preprocessor",b:"{-#",e:"#-}"},{cN:"comment",c:["self"],b:"{-",e:"-}"},{cN:"string",b:"\\s+'",e:"'",c:[a.BE],r:0},a.QSM,{cN:"import",b:"\\bimport",e:"$",k:"import qualified as hiding",c:[c],i:"\\W\\.|;"},{cN:"module",b:"\\bmodule",e:"where",k:"module where",c:[c],i:"\\W\\.|;"},{cN:"class",b:"\\b(class|instance)",e:"where",k:"class where instance",c:[d]},{cN:"typedef",b:"\\b(data|(new)?type)",e:"$",k:"data type newtype deriving",c:[d,c,b]},a.CNM,{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},d,{cN:"title",b:"^[_a-z][\\w']*"},{b:"->|<-"}]}}(hljs);hljs.LANGUAGES.http=function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}}(hljs);hljs.LANGUAGES.ini=function(a){return{cI:true,i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}}(hljs);hljs.LANGUAGES.java=function(a){return{k:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,{cN:"class",bWK:true,e:"{",k:"class interface",eE:true,i:":",c:[{bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,sL:"xml"}],r:0},{cN:"function",bWK:true,e:/{/,k:"function",c:[{cN:"title",b:/[A-Za-z$_][0-9A-Za-z$_]*/},{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);hljs.LANGUAGES.lasso=function(b){var a="[a-zA-Z_][a-zA-Z0-9_.]*|&[lg]t;";var c="<\\?(lasso(script)?|=)";return{cI:true,l:a,k:{literal:"true false none minimal full all infinity nan and or not bw ew cn lt lte gt gte eq neq ft rx nrx",built_in:"array date decimal duration integer map pair string tag xml null list queue set stack staticarray local var variable data global self inherited void",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require skip split_thread sum take thread to trait type where with yield"},c:[{cN:"preprocessor",b:"\\]|\\?>",r:0,starts:{cN:"markup",e:"\\[|"+c,rE:true}},{cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true}},{cN:"preprocessor",b:"\\[no_square_brackets|\\[/noprocess|"+c},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10},b.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},b.CBLCLM,b.CNM,b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",b:"#\\d+|[#$]"+a},{cN:"tag",b:"::",e:a},{cN:"attribute",b:"\\.\\.\\.|-"+b.UIR},{cN:"class",bWK:true,k:"define",eE:true,e:"\\(|=>",c:[{cN:"title",b:b.UIR+"=?"}]}]}}(hljs);hljs.LANGUAGES.lisp=function(i){var l="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var m="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var k={cN:"shebang",b:"^#!",e:"$"};var a={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d=[{cN:"number",b:m},{cN:"number",b:"#b[0-1]+(/[0-1]+)?"},{cN:"number",b:"#o[0-7]+(/[0-7]+)?"},{cN:"number",b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{cN:"number",b:"#c\\("+m+" +"+m,e:"\\)"}];var h={cN:"string",b:'"',e:'"',c:[i.BE],r:0};var n={cN:"comment",b:";",e:"$"};var g={cN:"variable",b:"\\*",e:"\\*"};var o={cN:"keyword",b:"[:&]"+l};var b={b:"\\(",e:"\\)",c:["self",a,h].concat(d)};var e={cN:"quoted",b:"['`]\\(",e:"\\)",c:d.concat([h,g,o,b])};var c={cN:"quoted",b:"\\(quote ",e:"\\)",k:{title:"quote"},c:d.concat([h,g,o,b])};var j={cN:"list",b:"\\(",e:"\\)"};var f={eW:true,r:0};j.c=[{cN:"title",b:l},f];f.c=[e,c,j,a].concat(d).concat([h,n,g,o]);return{i:"[^\\s]",c:d.concat([k,a,h,n,e,c,j])}}(hljs);hljs.LANGUAGES.lua=function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bWK:true,e:"\\)",k:"function",c:[{cN:"title",b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"},{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}}(hljs);hljs.LANGUAGES.markdown=function(a){return{c:[{cN:"header",b:"^#{1,3}",e:"$"},{cN:"header",b:"^.+?\\n[=-]{2,}$"},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",b:"\\*.+?\\*"},{cN:"emphasis",b:"_.+?_",r:0},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",b:"`.+?`"},{cN:"code",b:"^    ",e:"$",r:0},{cN:"horizontal_rule",b:"^-{3,}",e:"$"},{b:"\\[.+?\\]\\(.+?\\)",rB:true,c:[{cN:"link_label",b:"\\[.+\\]"},{cN:"link_url",b:"\\(",e:"\\)",eB:true,eE:true}]}]}}(hljs);hljs.LANGUAGES.matlab=function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bWK:true,e:"$",k:"function",c:[{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:""},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b},{cN:"comment",b:"\\%",e:"$"}].concat(b)}}(hljs);hljs.LANGUAGES.mel=function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:"</",c:[a.CNM,a.ASM,a.QSM,{cN:"string",b:"`",e:"`",c:[a.BE]},{cN:"variable",b:"\\$\\d",r:5},{cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)"},a.CLCM,a.CBLCLM]}}(hljs);hljs.LANGUAGES.mizar=function(a){return{k:["environ vocabularies notations constructors definitions registrations theorems schemes requirements","begin end definition registration cluster existence pred func defpred deffunc theorem proof","let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from","be being by means equals implies iff redefine define now not or attr is mode suppose per cases set","thesis contradiction scheme reserve struct","correctness compatibility coherence symmetry assymetry reflexivity irreflexivity","connectedness uniqueness commutativity idempotence involutiveness projectivity"].join(" "),c:[{cN:"comment",b:"::",e:"$"}]}}(hljs);hljs.LANGUAGES.nginx=function(b){var c=[{cN:"variable",b:"\\$\\d+"},{cN:"variable",b:"\\${",e:"}"},{cN:"variable",b:"[\\$\\@]"+b.UIR}];var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[b.HCM,{cN:"string",b:'"',e:'"',c:[b.BE].concat(c),r:0},{cN:"string",b:"'",e:"'",c:[b.BE].concat(c),r:0},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",b:"\\s\\^",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"~\\*?\\s+",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"\\*(\\.[a-z\\-]+)+",c:[b.BE].concat(c)},{cN:"regexp",b:"([a-z\\-]+\\.)+\\*",c:[b.BE].concat(c)},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0}].concat(c)};return{c:[b.HCM,{b:b.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:b.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}}(hljs);hljs.LANGUAGES.objectivec=function(a){var b={keyword:"int float while private char catch export sizeof typedef const struct for union unsigned long volatile static protected bool mutable if public do return goto void enum else break extern asm case short default double throw register explicit signed typename try this switch continue wchar_t inline readonly assign property self synchronized end synthesize id optional required nonatomic super unichar finally dynamic IBOutlet IBAction selector strong weak readonly",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"({|$)",k:"interface class protocol implementation",c:[{cN:"id",b:a.UIR}]},{cN:"variable",b:"\\."+a.UIR,r:0}]}}(hljs);hljs.LANGUAGES.parser3=function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}}(hljs);hljs.LANGUAGES.perl=function(e){var a="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var d={cN:"subst",b:"[$@]\\{",e:"\\}",k:a,r:10};var b={cN:"variable",b:"\\$\\d"};var i={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var f=[e.BE,d,b,i];var h={b:"->",c:[{b:e.IR},{b:"{",e:"}"}]};var g={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var c=[b,i,e.HCM,g,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},h,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:f,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:f,r:5},{cN:"string",b:"'",e:"'",c:[e.BE],r:0},{cN:"string",b:'"',e:'"',c:f,r:0},{cN:"string",b:"`",e:"`",c:[e.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"("+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,g,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bWK:true,e:"(\\s*\\(.*?\\))?[;{]",k:"sub",r:5},{cN:"operator",b:"-\\w\\b",r:0}];d.c=c;h.c[1].c=c;return{k:a,c:c}}(hljs);hljs.LANGUAGES.php=function(a){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var b=[a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),{cN:"string",b:'b"',e:'"',c:[a.BE]},{cN:"string",b:"b'",e:"'",c:[a.BE]}];var c=[a.BNM,a.CNM];var d={cN:"title",b:a.UIR};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return implements parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception php_user_filter default die require __FUNCTION__ enddeclare final try this switch continue endfor endif declare unset true false namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ __halt_compiler",c:[a.CLCM,a.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"}]},{cN:"comment",eB:true,b:"__halt_compiler.+?;",eW:true},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[a.BE]},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"},e,{cN:"function",bWK:true,e:"{",k:"function",i:"\\$|\\[|%",c:[d,{cN:"params",b:"\\(",e:"\\)",c:["self",e,a.CBLCLM].concat(b).concat(c)}]},{cN:"class",bWK:true,e:"{",k:"class",i:"[:\\(\\$]",c:[{bWK:true,eW:true,k:"extends",c:[d]},d]},{b:"=>"}].concat(b).concat(c)}}(hljs);hljs.LANGUAGES.profile=function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[{cN:"title",b:a.UIR,r:0}],r:0}]}}(hljs);hljs.LANGUAGES.python=function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var c=[{cN:"string",b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{cN:"string",b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{cN:"string",b:/(u|r|ur)'/,e:/'/,c:[a.BE],r:10},{cN:"string",b:/(u|r|ur)"/,e:/"/,c:[a.BE],r:10},{cN:"string",b:/(b|br)'/,e:/'/,c:[a.BE]},{cN:"string",b:/(b|br)"/,e:/"/,c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:/\(/,e:/\)/,c:["self",a.CNM,f].concat(c)};var b={bWK:true,e:/:/,i:/[${=;\n]/,c:[e,d],r:10};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10",built_in:"None True False Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:c.concat([f,a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}])}}(hljs);hljs.LANGUAGES.r=function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[a.BE],r:0},{cN:"string",b:"'",e:"'",c:[a.BE],r:0}]}}(hljs);hljs.LANGUAGES.rib=function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"</",c:[a.HCM,a.CNM,a.ASM,a.QSM]}}(hljs);hljs.LANGUAGES.rsl=function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"shader",bWK:true,e:"\\(",k:"surface displacement light volume imager"},{cN:"shading",bWK:true,e:"\\(",k:"illuminate illuminance gather"}]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.ruleslanguage=function(a){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEMASK|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN DELETE SAVE SAVE_UPDATE CLEAR DETERMINANT LABEL REPORT REVENUE ABORT CALL DONE LEAVE EACH IN LIST NOVALUE FROM TOTAL CHARGE BLOCK AND OR CSV_FILE BILL_PERIOD RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM ABORT WARN NUMDAYS RATE_CODE READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"array",b:"#[a-zA-Z .]+"}]}}(hljs);hljs.LANGUAGES.rust=function(b){var d={cN:"title",b:b.UIR};var c={cN:"number",b:"\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\.[0-9_]+)?([uif](8|16|32|64)?)?)",r:0};var a="assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while";return{k:a,i:"</",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:"function",bWK:true,e:"(\\(|<)",k:"fn",c:[d]},{cN:"preprocessor",b:"#\\[",e:"\\]"},{bWK:true,e:"(=|<)",k:"type",c:[d],i:"\\S"},{bWK:true,e:"({|<)",k:"trait enum",c:[d],i:"\\S"}]}}(hljs);hljs.LANGUAGES.scala=function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,b,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bWK:true,k:"extends with",r:10},{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}}(hljs);hljs.LANGUAGES.scss=function(a){var c="[a-zA-Z-][a-zA-Z0-9_-]*";var d={cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};var b={cN:"hexcolor",b:"#[0-9A-Fa-f]+"};var e={cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"important",b:"!important"}]}};return{cI:true,i:"[=/|']",c:[a.CLCM,a.CBLCLM,{cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]},{cN:"id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{cN:"pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{cN:"value",b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{cN:"value",b:":",e:";",c:[b,a.NM,a.QSM,a.ASM,{cN:"important",b:"!important"}]},{cN:"at_rule",b:"@",e:"[{;]",k:"mixin include for extend charset import media page font-face namespace",c:[d,a.QSM,a.ASM,b,a.NM,{cN:"preprocessor",b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}}(hljs);hljs.LANGUAGES.smalltalk=function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"',r:0},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":"},a.CNM,c,d,{cN:"localvars",b:"\\|\\s*"+b+"(\\s+"+b+")*\\s*\\|"},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}}(hljs);hljs.LANGUAGES.sql=function(a){return{cI:true,c:[{cN:"operator",b:"(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}],r:0},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}}(hljs);hljs.LANGUAGES.tex=function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}}(hljs);hljs.LANGUAGES.vala=function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bWK:true,e:"{",k:"class interface delegate namespace",i:"[^,:\\n\\s\\.]",c:[{cN:"title",b:a.UIR}]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}}(hljs);hljs.LANGUAGES.vbnet=function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"(//|endif|gosub|variant|wend)",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}}(hljs);hljs.LANGUAGES.vbscript=function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$"},a.CNM]}}(hljs);hljs.LANGUAGES.vhdl=function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);
diff --git a/docs/slides/flops14/reveal.js/plugin/leap/leap.js b/docs/slides/flops14/reveal.js/plugin/leap/leap.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/leap/leap.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2013, Leap Motion, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Version 0.2.0 - http://js.leapmotion.com/0.2.0/leap.min.js
- * Grab latest versions from http://js.leapmotion.com/
- */
-
-!function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i}({1:[function(require,module,exports){var chooseProtocol=require("./protocol").chooseProtocol,EventEmitter=require("events").EventEmitter,_=require("underscore");var BaseConnection=module.exports=function(opts){this.opts=_.defaults(opts||{},{host:"127.0.0.1",enableGestures:false,port:6437,enableHeartbeat:true,heartbeatInterval:100,requestProtocolVersion:3});this.host=opts.host;this.port=opts.port;this.on("ready",function(){this.enableGestures(this.opts.enableGestures);if(this.opts.enableHeartbeat)this.startHeartbeat()});this.on("disconnect",function(){if(this.opts.enableHeartbeat)this.stopHeartbeat()});this.heartbeatTimer=null};BaseConnection.prototype.getUrl=function(){return"ws://"+this.host+":"+this.port+"/v"+this.opts.requestProtocolVersion+".json"};BaseConnection.prototype.sendHeartbeat=function(){if(this.protocol){this.setHeartbeatState(true);this.protocol.sendHeartbeat(this)}};BaseConnection.prototype.handleOpen=function(){this.emit("connect")};BaseConnection.prototype.enableGestures=function(enabled){this.gesturesEnabled=enabled?true:false;this.send(this.protocol.encode({enableGestures:this.gesturesEnabled}))};BaseConnection.prototype.handleClose=function(){this.disconnect();this.startReconnection()};BaseConnection.prototype.startReconnection=function(){var connection=this;setTimeout(function(){connection.connect()},1e3)};BaseConnection.prototype.disconnect=function(){if(!this.socket)return;this.socket.close();delete this.socket;delete this.protocol;this.emit("disconnect")};BaseConnection.prototype.handleData=function(data){var message=JSON.parse(data);var messageEvent;if(this.protocol===undefined){messageEvent=this.protocol=chooseProtocol(message);this.emit("ready")}else{messageEvent=this.protocol(message)}this.emit(messageEvent.type,messageEvent)};BaseConnection.prototype.connect=function(){if(this.socket)return;this.socket=this.setupSocket();return true};BaseConnection.prototype.send=function(data){this.socket.send(data)};BaseConnection.prototype.stopHeartbeat=function(){if(!this.heartbeatTimer)return;clearInterval(this.heartbeatTimer);delete this.heartbeatTimer;this.setHeartbeatState(false)};BaseConnection.prototype.setHeartbeatState=function(state){if(this.heartbeatState===state)return;this.heartbeatState=state;this.emit(this.heartbeatState?"focus":"blur")};_.extend(BaseConnection.prototype,EventEmitter.prototype)},{"./protocol":12,events:17,underscore:20}],2:[function(require,module,exports){var CircularBuffer=module.exports=function(size){this.pos=0;this._buf=[];this.size=size};CircularBuffer.prototype.get=function(i){if(i==undefined)i=0;if(i>=this.size)return undefined;if(i>=this._buf.length)return undefined;return this._buf[(this.pos-i-1)%this.size]};CircularBuffer.prototype.push=function(o){this._buf[this.pos%this.size]=o;return this.pos++}},{}],3:[function(require,module,exports){var Connection=module.exports=require("./base_connection");Connection.prototype.setupSocket=function(){var connection=this;var socket=new WebSocket(this.getUrl());socket.onopen=function(){connection.handleOpen()};socket.onmessage=function(message){connection.handleData(message.data)};socket.onclose=function(){connection.handleClose()};return socket};Connection.prototype.startHeartbeat=function(){if(!this.protocol.sendHeartbeat||this.heartbeatTimer)return;var connection=this;var propertyName=null;if(typeof document.hidden!=="undefined"){propertyName="hidden"}else if(typeof document.mozHidden!=="undefined"){propertyName="mozHidden"}else if(typeof document.msHidden!=="undefined"){propertyName="msHidden"}else if(typeof document.webkitHidden!=="undefined"){propertyName="webkitHidden"}else{propertyName=undefined}var windowVisible=true;var focusListener=window.addEventListener("focus",function(e){windowVisible=true});var blurListener=window.addEventListener("blur",function(e){windowVisible=false});this.on("disconnect",function(){if(connection.heartbeatTimer){clearTimeout(connection.heartbeatTimer);delete connection.heartbeatTimer}window.removeEventListener(focusListener);window.removeEventListener(blurListener)});this.heartbeatTimer=setInterval(function(){var isVisible=propertyName===undefined?true:document[propertyName]===false;if(isVisible&&windowVisible){connection.sendHeartbeat()}else{connection.setHeartbeatState(false)}},this.opts.heartbeatInterval)}},{"./base_connection":1}],4:[function(require,module,exports){!function(process){var Frame=require("./frame"),CircularBuffer=require("./circular_buffer"),Pipeline=require("./pipeline"),EventEmitter=require("events").EventEmitter,gestureListener=require("./gesture").gestureListener,_=require("underscore");var Controller=module.exports=function(opts){var inNode=typeof process!=="undefined"&&process.title==="node";opts=_.defaults(opts||{},{inNode:inNode});this.inNode=opts.inNode;opts=_.defaults(opts||{},{frameEventName:this.useAnimationLoop()?"animationFrame":"deviceFrame",supressAnimationLoop:false});this.supressAnimationLoop=opts.supressAnimationLoop;this.frameEventName=opts.frameEventName;this.history=new CircularBuffer(200);this.lastFrame=Frame.Invalid;this.lastValidFrame=Frame.Invalid;this.lastConnectionFrame=Frame.Invalid;this.accumulatedGestures=[];if(opts.connectionType===undefined){this.connectionType=this.inBrowser()?require("./connection"):require("./node_connection")}else{this.connectionType=opts.connectionType}this.connection=new this.connectionType(opts);this.setupConnectionEvents()};Controller.prototype.gesture=function(type,cb){var creator=gestureListener(this,type);if(cb!==undefined){creator.stop(cb)}return creator};Controller.prototype.inBrowser=function(){return!this.inNode};Controller.prototype.useAnimationLoop=function(){return this.inBrowser()&&typeof chrome==="undefined"};Controller.prototype.connect=function(){var controller=this;if(this.connection.connect()&&this.inBrowser()&&!controller.supressAnimationLoop){var callback=function(){controller.emit("animationFrame",controller.lastConnectionFrame);window.requestAnimFrame(callback)};window.requestAnimFrame(callback)}};Controller.prototype.disconnect=function(){this.connection.disconnect()};Controller.prototype.frame=function(num){return this.history.get(num)||Frame.Invalid};Controller.prototype.loop=function(callback){switch(callback.length){case 1:this.on(this.frameEventName,callback);break;case 2:var controller=this;var scheduler=null;var immediateRunnerCallback=function(frame){callback(frame,function(){if(controller.lastFrame!=frame){immediateRunnerCallback(controller.lastFrame)}else{controller.once(controller.frameEventName,immediateRunnerCallback)}})};this.once(this.frameEventName,immediateRunnerCallback);break}this.connect()};Controller.prototype.addStep=function(step){if(!this.pipeline)this.pipeline=new Pipeline(this);this.pipeline.addStep(step)};Controller.prototype.processFrame=function(frame){if(frame.gestures){this.accumulatedGestures=this.accumulatedGestures.concat(frame.gestures)}if(this.pipeline){frame=this.pipeline.run(frame);if(!frame)frame=Frame.Invalid}this.lastConnectionFrame=frame;this.emit("deviceFrame",frame)};Controller.prototype.processFinishedFrame=function(frame){this.lastFrame=frame;if(frame.valid){this.lastValidFrame=frame}frame.controller=this;frame.historyIdx=this.history.push(frame);if(frame.gestures){frame.gestures=this.accumulatedGestures;this.accumulatedGestures=[];for(var gestureIdx=0;gestureIdx!=frame.gestures.length;gestureIdx++){this.emit("gesture",frame.gestures[gestureIdx],frame)}}this.emit("frame",frame)};Controller.prototype.setupConnectionEvents=function(){var controller=this;this.connection.on("frame",function(frame){controller.processFrame(frame)});this.on(this.frameEventName,function(frame){controller.processFinishedFrame(frame)});this.connection.on("disconnect",function(){controller.emit("disconnect")});this.connection.on("ready",function(){controller.emit("ready")});this.connection.on("connect",function(){controller.emit("connect")});this.connection.on("focus",function(){controller.emit("focus")});this.connection.on("blur",function(){controller.emit("blur")});this.connection.on("protocol",function(protocol){controller.emit("protocol",protocol)});this.connection.on("deviceConnect",function(evt){controller.emit(evt.state?"deviceConnected":"deviceDisconnected")})};_.extend(Controller.prototype,EventEmitter.prototype)}(require("__browserify_process"))},{"./circular_buffer":2,"./connection":3,"./frame":5,"./gesture":6,"./node_connection":16,"./pipeline":10,__browserify_process:18,events:17,underscore:20}],5:[function(require,module,exports){var Hand=require("./hand"),Pointable=require("./pointable"),createGesture=require("./gesture").createGesture,glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,InteractionBox=require("./interaction_box"),_=require("underscore");var Frame=module.exports=function(data){this.valid=true;this.id=data.id;this.timestamp=data.timestamp;this.hands=[];this.handsMap={};this.pointables=[];this.tools=[];this.fingers=[];if(data.interactionBox){this.interactionBox=new InteractionBox(data.interactionBox)}this.gestures=[];this.pointablesMap={};this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.data=data;this.type="frame";this.currentFrameRate=data.currentFrameRate;var handMap={};for(var handIdx=0,handCount=data.hands.length;handIdx!=handCount;handIdx++){var hand=new Hand(data.hands[handIdx]);hand.frame=this;this.hands.push(hand);this.handsMap[hand.id]=hand;handMap[hand.id]=handIdx}for(var pointableIdx=0,pointableCount=data.pointables.length;pointableIdx!=pointableCount;pointableIdx++){var pointable=new Pointable(data.pointables[pointableIdx]);pointable.frame=this;this.pointables.push(pointable);this.pointablesMap[pointable.id]=pointable;(pointable.tool?this.tools:this.fingers).push(pointable);if(pointable.handId!==undefined&&handMap.hasOwnProperty(pointable.handId)){var hand=this.hands[handMap[pointable.handId]];hand.pointables.push(pointable);(pointable.tool?hand.tools:hand.fingers).push(pointable)}}if(data.gestures){for(var gestureIdx=0,gestureCount=data.gestures.length;gestureIdx!=gestureCount;gestureIdx++){this.gestures.push(createGesture(data.gestures[gestureIdx]))}}};Frame.prototype.tool=function(id){var pointable=this.pointable(id);return pointable.tool?pointable:Pointable.Invalid};Frame.prototype.pointable=function(id){return this.pointablesMap[id]||Pointable.Invalid};Frame.prototype.finger=function(id){var pointable=this.pointable(id);return!pointable.tool?pointable:Pointable.Invalid};Frame.prototype.hand=function(id){return this.handsMap[id]||Hand.Invalid};Frame.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Frame.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceFrame._rotation[5],this._rotation[2]-sinceFrame._rotation[6],this._rotation[3]-sinceFrame._rotation[1]])};Frame.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);return mat3.multiply(mat3.create(),sinceFrame._rotation,transpose)};Frame.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;return Math.exp(this._scaleFactor-sinceFrame._scaleFactor)};Frame.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.subtract(vec3.create(),this._translation,sinceFrame._translation)};Frame.prototype.toString=function(){var str="Frame [ id:"+this.id+" | timestamp:"+this.timestamp+" | Hand count:("+this.hands.length+") | Pointable count:("+this.pointables.length+")";if(this.gestures)str+=" | Gesture count:("+this.gestures.length+")";str+=" ]";return str};Frame.prototype.dump=function(){var out="";out+="Frame Info:<br/>";out+=this.toString();out+="<br/><br/>Hands:<br/>";for(var handIdx=0,handCount=this.hands.length;handIdx!=handCount;handIdx++){out+="  "+this.hands[handIdx].toString()+"<br/>"}out+="<br/><br/>Pointables:<br/>";for(var pointableIdx=0,pointableCount=this.pointables.length;pointableIdx!=pointableCount;pointableIdx++){out+="  "+this.pointables[pointableIdx].toString()+"<br/>"}if(this.gestures){out+="<br/><br/>Gestures:<br/>";for(var gestureIdx=0,gestureCount=this.gestures.length;gestureIdx!=gestureCount;gestureIdx++){out+="  "+this.gestures[gestureIdx].toString()+"<br/>"}}out+="<br/><br/>Raw JSON:<br/>";out+=JSON.stringify(this.data);return out};Frame.Invalid={valid:false,hands:[],fingers:[],tools:[],gestures:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},hand:function(){return Hand.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"gl-matrix":19,underscore:20}],6:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3,EventEmitter=require("events").EventEmitter,_=require("underscore");var createGesture=exports.createGesture=function(data){var gesture;switch(data.type){case"circle":gesture=new CircleGesture(data);break;case"swipe":gesture=new SwipeGesture(data);break;case"screenTap":gesture=new ScreenTapGesture(data);break;case"keyTap":gesture=new KeyTapGesture(data);break;default:throw"unkown gesture type"}gesture.id=data.id;gesture.handIds=data.handIds;gesture.pointableIds=data.pointableIds;gesture.duration=data.duration;gesture.state=data.state;gesture.type=data.type;return gesture};var gestureListener=exports.gestureListener=function(controller,type){var handlers={};var gestureMap={};var gestureCreator=function(){var candidateGesture=gestureMap[gesture.id];if(candidateGesture!==undefined)gesture.update(gesture,frame);if(gesture.state=="start"||gesture.state=="stop"){if(type==gesture.type&&gestureMap[gesture.id]===undefined){gestureMap[gesture.id]=new Gesture(gesture,frame);gesture.update(gesture,frame)}if(gesture.state=="stop"){delete gestureMap[gesture.id]}}};controller.on("gesture",function(gesture,frame){if(gesture.type==type){if(gesture.state=="start"||gesture.state=="stop"){if(gestureMap[gesture.id]===undefined){var gestureTracker=new Gesture(gesture,frame);gestureMap[gesture.id]=gestureTracker;_.each(handlers,function(cb,name){gestureTracker.on(name,cb)})}}gestureMap[gesture.id].update(gesture,frame);if(gesture.state=="stop"){delete gestureMap[gesture.id]}}});var builder={start:function(cb){handlers["start"]=cb;return builder},stop:function(cb){handlers["stop"]=cb;return builder},complete:function(cb){handlers["stop"]=cb;return builder},update:function(cb){handlers["update"]=cb;return builder}};return builder};var Gesture=exports.Gesture=function(gesture,frame){this.gestures=[gesture];this.frames=[frame]};Gesture.prototype.update=function(gesture,frame){this.gestures.push(gesture);this.frames.push(frame);this.emit(gesture.state,this)};_.extend(Gesture.prototype,EventEmitter.prototype);var CircleGesture=function(data){this.center=data.center;this.normal=data.normal;this.progress=data.progress;this.radius=data.radius};CircleGesture.prototype.toString=function(){return"CircleGesture ["+JSON.stringify(this)+"]"};var SwipeGesture=function(data){this.startPosition=data.startPosition;this.position=data.position;this.direction=data.direction;this.speed=data.speed};SwipeGesture.prototype.toString=function(){return"SwipeGesture ["+JSON.stringify(this)+"]"};var ScreenTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};ScreenTapGesture.prototype.toString=function(){return"ScreenTapGesture ["+JSON.stringify(this)+"]"};var KeyTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};KeyTapGesture.prototype.toString=function(){return"KeyTapGesture ["+JSON.stringify(this)+"]"}},{events:17,"gl-matrix":19,underscore:20}],7:[function(require,module,exports){var Pointable=require("./pointable"),glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,_=require("underscore");var Hand=module.exports=function(data){this.id=data.id;this.palmPosition=data.palmPosition;this.direction=data.direction;this.palmVelocity=data.palmVelocity;this.palmNormal=data.palmNormal;this.sphereCenter=data.sphereCenter;this.sphereRadius=data.sphereRadius;this.valid=true;this.pointables=[];this.fingers=[];this.tools=[];this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.timeVisible=data.timeVisible;this.stabilizedPalmPosition=data.stabilizedPalmPosition};Hand.prototype.finger=function(id){var finger=this.frame.finger(id);return finger&&finger.handId==this.id?finger:Pointable.Invalid};Hand.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Hand.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceHand._rotation[5],this._rotation[2]-sinceHand._rotation[6],this._rotation[3]-sinceHand._rotation[1]])};Hand.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);var m=mat3.multiply(mat3.create(),sinceHand._rotation,transpose);return m};Hand.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 1;return Math.exp(this._scaleFactor-sinceHand._scaleFactor)};Hand.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return[this._translation[0]-sinceHand._translation[0],this._translation[1]-sinceHand._translation[1],this._translation[2]-sinceHand._translation[2]]};Hand.prototype.toString=function(){return"Hand [ id: "+this.id+" | palm velocity:"+this.palmVelocity+" | sphere center:"+this.sphereCenter+" ] "};Hand.Invalid={valid:false,fingers:[],tools:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./pointable":11,"gl-matrix":19,underscore:20}],8:[function(require,module,exports){!function(){module.exports={Controller:require("./controller"),Frame:require("./frame"),Gesture:require("./gesture"),Hand:require("./hand"),Pointable:require("./pointable"),InteractionBox:require("./interaction_box"),Connection:require("./connection"),CircularBuffer:require("./circular_buffer"),UI:require("./ui"),glMatrix:require("gl-matrix"),mat3:require("gl-matrix").mat3,vec3:require("gl-matrix").vec3,loopController:undefined,loop:function(opts,callback){if(callback===undefined){callback=opts;opts={}}if(!this.loopController)this.loopController=new this.Controller(opts);this.loopController.loop(callback)}}}()},{"./circular_buffer":2,"./connection":3,"./controller":4,"./frame":5,"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"./ui":13,"gl-matrix":19}],9:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var InteractionBox=module.exports=function(data){this.valid=true;this.center=data.center;this.size=data.size;this.width=data.size[0];this.height=data.size[1];this.depth=data.size[2]};InteractionBox.prototype.denormalizePoint=function(normalizedPosition){return vec3.fromValues((normalizedPosition[0]-.5)*this.size[0]+this.center[0],(normalizedPosition[1]-.5)*this.size[1]+this.center[1],(normalizedPosition[2]-.5)*this.size[2]+this.center[2])};InteractionBox.prototype.normalizePoint=function(position,clamp){var vec=vec3.fromValues((position[0]-this.center[0])/this.size[0]+.5,(position[1]-this.center[1])/this.size[1]+.5,(position[2]-this.center[2])/this.size[2]+.5);if(clamp){vec[0]=Math.min(Math.max(vec[0],0),1);vec[1]=Math.min(Math.max(vec[1],0),1);vec[2]=Math.min(Math.max(vec[2],0),1)}return vec};InteractionBox.prototype.toString=function(){return"InteractionBox [ width:"+this.width+" | height:"+this.height+" | depth:"+this.depth+" ]"};InteractionBox.Invalid={valid:false}},{"gl-matrix":19}],10:[function(require,module,exports){var Pipeline=module.exports=function(){this.steps=[]};Pipeline.prototype.addStep=function(step){this.steps.push(step)};Pipeline.prototype.run=function(frame){var stepsLength=this.steps.length;for(var i=0;i!=stepsLength;i++){if(!frame)break;frame=this.steps[i](frame)}return frame}},{}],11:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var Pointable=module.exports=function(data){this.valid=true;this.id=data.id;this.handId=data.handId;this.length=data.length;this.tool=data.tool;this.width=data.width;this.direction=data.direction;this.stabilizedTipPosition=data.stabilizedTipPosition;this.tipPosition=data.tipPosition;this.tipVelocity=data.tipVelocity;this.touchZone=data.touchZone;this.touchDistance=data.touchDistance;this.timeVisible=data.timeVisible};Pointable.prototype.toString=function(){if(this.tool==true){return"Pointable [ id:"+this.id+" "+this.length+"mmx | with:"+this.width+"mm | direction:"+this.direction+" ]"}else{return"Pointable [ id:"+this.id+" "+this.length+"mmx | direction: "+this.direction+" ]"}};Pointable.Invalid={valid:false}},{"gl-matrix":19}],12:[function(require,module,exports){var Frame=require("./frame");var Event=function(data){this.type=data.type;this.state=data.state};var chooseProtocol=exports.chooseProtocol=function(header){var protocol;switch(header.version){case 1:protocol=JSONProtocol(1,function(data){return new Frame(data)});break;case 2:protocol=JSONProtocol(2,function(data){return new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;case 3:protocol=JSONProtocol(3,function(data){return data.event?new Event(data.event):new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;default:throw"unrecognized version"}return protocol};var JSONProtocol=function(version,cb){var protocol=cb;protocol.encode=function(message){return JSON.stringify(message)};protocol.version=version;protocol.versionLong="Version "+version;protocol.type="protocol";return protocol}},{"./frame":5}],13:[function(require,module,exports){exports.UI={Region:require("./ui/region"),Cursor:require("./ui/cursor")}},{"./ui/cursor":14,"./ui/region":15}],14:[function(require,module,exports){var Cursor=module.exports=function(){return function(frame){var pointable=frame.pointables.sort(function(a,b){return a.z-b.z})[0];if(pointable&&pointable.valid){frame.cursorPosition=pointable.tipPosition}return frame}}},{}],15:[function(require,module,exports){var EventEmitter=require("events").EventEmitter,_=require("underscore");var Region=module.exports=function(start,end){this.start=new Vector(start);this.end=new Vector(end);this.enteredFrame=null};Region.prototype.hasPointables=function(frame){for(var i=0;i!=frame.pointables.length;i++){var position=frame.pointables[i].tipPosition;if(position.x>=this.start.x&&position.x<=this.end.x&&position.y>=this.start.y&&position.y<=this.end.y&&position.z>=this.start.z&&position.z<=this.end.z){return true}}return false};Region.prototype.listener=function(opts){var region=this;if(opts&&opts.nearThreshold)this.setupNearRegion(opts.nearThreshold);return function(frame){return region.updatePosition(frame)}};Region.prototype.clipper=function(){var region=this;return function(frame){region.updatePosition(frame);return region.enteredFrame?frame:null}};Region.prototype.setupNearRegion=function(distance){var nearRegion=this.nearRegion=new Region([this.start.x-distance,this.start.y-distance,this.start.z-distance],[this.end.x+distance,this.end.y+distance,this.end.z+distance]);var region=this;nearRegion.on("enter",function(frame){region.emit("near",frame)});nearRegion.on("exit",function(frame){region.emit("far",frame)});region.on("exit",function(frame){region.emit("near",frame)})};Region.prototype.updatePosition=function(frame){if(this.nearRegion)this.nearRegion.updatePosition(frame);if(this.hasPointables(frame)&&this.enteredFrame==null){this.enteredFrame=frame;this.emit("enter",this.enteredFrame)}else if(!this.hasPointables(frame)&&this.enteredFrame!=null){this.enteredFrame=null;this.emit("exit",this.enteredFrame)}return frame};Region.prototype.normalize=function(position){return new Vector([(position.x-this.start.x)/(this.end.x-this.start.x),(position.y-this.start.y)/(this.end.y-this.start.y),(position.z-this.start.z)/(this.end.z-this.start.z)])};Region.prototype.mapToXY=function(position,width,height){var normalized=this.normalize(position);var x=normalized.x,y=normalized.y;if(x>1)x=1;else if(x<-1)x=-1;if(y>1)y=1;else if(y<-1)y=-1;return[(x+1)/2*width,(1-y)/2*height,normalized.z]};_.extend(Region.prototype,EventEmitter.prototype)},{events:17,underscore:20}],16:[function(require,module,exports){},{}],17:[function(require,module,exports){!function(process){if(!process.EventEmitter)process.EventEmitter=function(){};var EventEmitter=exports.EventEmitter=process.EventEmitter;var isArray=typeof Array.isArray==="function"?Array.isArray:function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function indexOf(xs,x){if(xs.indexOf)return xs.indexOf(x);for(var i=0;i<xs.length;i++){if(x===xs[i])return i}return-1}var defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!this._events)this._events={};this._events.maxListeners=n};EventEmitter.prototype.emit=function(type){if(type==="error"){if(!this._events||!this._events.error||isArray(this._events.error)&&!this._events.error.length){if(arguments[1]instanceof Error){throw arguments[1]}else{throw new Error("Uncaught, unspecified 'error' event.")}return false}}if(!this._events)return false;var handler=this._events[type];if(!handler)return false;if(typeof handler=="function"){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:var args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}return true}else if(isArray(handler)){var args=Array.prototype.slice.call(arguments,1);var listeners=handler.slice();for(var i=0,l=listeners.length;i<l;i++){listeners[i].apply(this,args)}return true}else{return false}};EventEmitter.prototype.addListener=function(type,listener){if("function"!==typeof listener){throw new Error("addListener only takes instances of Function")}if(!this._events)this._events={};this.emit("newListener",type,listener);if(!this._events[type]){this._events[type]=listener}else if(isArray(this._events[type])){if(!this._events[type].warned){var m;if(this._events.maxListeners!==undefined){m=this._events.maxListeners}else{m=defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);console.trace()}}this._events[type].push(listener)}else{this._events[type]=[this._events[type],listener]}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){var self=this;self.on(type,function g(){self.removeListener(type,g);listener.apply(this,arguments)});return this};EventEmitter.prototype.removeListener=function(type,listener){if("function"!==typeof listener){throw new Error("removeListener only takes instances of Function")}if(!this._events||!this._events[type])return this;var list=this._events[type];if(isArray(list)){var i=indexOf(list,listener);if(i<0)return this;list.splice(i,1);if(list.length==0)delete this._events[type]}else if(this._events[type]===listener){delete this._events[type]}return this};EventEmitter.prototype.removeAllListeners=function(type){if(arguments.length===0){this._events={};return this}if(type&&this._events&&this._events[type])this._events[type]=null;return this};EventEmitter.prototype.listeners=function(type){if(!this._events)this._events={};if(!this._events[type])this._events[type]=[];if(!isArray(this._events[type])){this._events[type]=[this._events[type]]}return this._events[type]}}(require("__browserify_process"))},{__browserify_process:18}],18:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){if(ev.source===window&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],19:[function(require,module,exports){!function(){!function(){"use strict";var shim={};if(typeof exports==="undefined"){if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){shim.exports={};define(function(){return shim.exports})}else{shim.exports=window}}else{shim.exports=exports}!function(exports){var vec2={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec2.create=function(){return new Float32Array(2)};vec2.clone=function(a){var out=new Float32Array(2);out[0]=a[0];out[1]=a[1];return out};vec2.fromValues=function(x,y){var out=new Float32Array(2);out[0]=x;out[1]=y;return out};vec2.copy=function(out,a){out[0]=a[0];out[1]=a[1];return out};vec2.set=function(out,x,y){out[0]=x;out[1]=y;return out};vec2.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];return out};vec2.sub=vec2.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];return out};vec2.mul=vec2.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];return out};vec2.div=vec2.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];return out};vec2.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);
-out[1]=Math.min(a[1],b[1]);return out};vec2.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);return out};vec2.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;return out};vec2.dist=vec2.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return Math.sqrt(x*x+y*y)};vec2.sqrDist=vec2.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return x*x+y*y};vec2.len=vec2.length=function(a){var x=a[0],y=a[1];return Math.sqrt(x*x+y*y)};vec2.sqrLen=vec2.squaredLength=function(a){var x=a[0],y=a[1];return x*x+y*y};vec2.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];return out};vec2.normalize=function(out,a){var x=a[0],y=a[1];var len=x*x+y*y;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len}return out};vec2.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]};vec2.cross=function(out,a,b){var z=a[0]*b[1]-a[1]*b[0];out[0]=out[1]=0;out[2]=z;return out};vec2.lerp=function(out,a,b,t){var ax=a[0],ay=a[1];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);return out};vec2.transformMat2=function(out,a,m){var x=a[0],y=a[1];out[0]=x*m[0]+y*m[1];out[1]=x*m[2]+y*m[3];return out};vec2.forEach=function(){var vec=new Float32Array(2);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=2}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1]}return a}}();vec2.str=function(a){return"vec2("+a[0]+", "+a[1]+")"};if(typeof exports!=="undefined"){exports.vec2=vec2}var vec3={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec3.create=function(){return new Float32Array(3)};vec3.clone=function(a){var out=new Float32Array(3);out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.fromValues=function(x,y,z){var out=new Float32Array(3);out[0]=x;out[1]=y;out[2]=z;return out};vec3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.set=function(out,x,y,z){out[0]=x;out[1]=y;out[2]=z;return out};vec3.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];return out};vec3.sub=vec3.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];return out};vec3.mul=vec3.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];return out};vec3.div=vec3.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];return out};vec3.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);return out};vec3.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);return out};vec3.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;return out};vec3.dist=vec3.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrDist=vec3.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return x*x+y*y+z*z};vec3.len=vec3.length=function(a){var x=a[0],y=a[1],z=a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrLen=vec3.squaredLength=function(a){var x=a[0],y=a[1],z=a[2];return x*x+y*y+z*z};vec3.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];return out};vec3.normalize=function(out,a){var x=a[0],y=a[1],z=a[2];var len=x*x+y*y+z*z;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len}return out};vec3.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]};vec3.cross=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2];out[0]=ay*bz-az*by;out[1]=az*bx-ax*bz;out[2]=ax*by-ay*bx;return out};vec3.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);return out};vec3.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12];out[1]=m[1]*x+m[5]*y+m[9]*z+m[13];out[2]=m[2]*x+m[6]*y+m[10]*z+m[14];return out};vec3.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec3.forEach=function(){var vec=new Float32Array(3);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=3}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2]}return a}}();vec3.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};if(typeof exports!=="undefined"){exports.vec3=vec3}var vec4={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec4.create=function(){return new Float32Array(4)};vec4.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.fromValues=function(x,y,z,w){var out=new Float32Array(4);out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.set=function(out,x,y,z,w){out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];out[3]=a[3]+b[3];return out};vec4.sub=vec4.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];out[3]=a[3]-b[3];return out};vec4.mul=vec4.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];out[3]=a[3]*b[3];return out};vec4.div=vec4.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];out[3]=a[3]/b[3];return out};vec4.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);out[3]=Math.min(a[3],b[3]);return out};vec4.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);out[3]=Math.max(a[3],b[3]);return out};vec4.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;out[3]=a[3]*b;return out};vec4.dist=vec4.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrDist=vec4.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return x*x+y*y+z*z+w*w};vec4.len=vec4.length=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrLen=vec4.squaredLength=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return x*x+y*y+z*z+w*w};vec4.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=-a[3];return out};vec4.normalize=function(out,a){var x=a[0],y=a[1],z=a[2],w=a[3];var len=x*x+y*y+z*z+w*w;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;out[3]=a[3]*len}return out};vec4.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]};vec4.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);out[3]=aw+t*(b[3]-aw);return out};vec4.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2],w=a[3];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12]*w;out[1]=m[1]*x+m[5]*y+m[9]*z+m[13]*w;out[2]=m[2]*x+m[6]*y+m[10]*z+m[14]*w;out[3]=m[3]*x+m[7]*y+m[11]*z+m[15]*w;return out};vec4.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec4.forEach=function(){var vec=new Float32Array(4);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=4}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];vec[3]=a[i+3];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2];a[i+3]=vec[3]}return a}}();vec4.str=function(a){return"vec4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.vec4=vec4}var mat2={};var mat2Identity=new Float32Array([1,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat2.create=function(){return new Float32Array(mat2Identity)};mat2.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=1;return out};mat2.transpose=function(out,a){if(out===a){var a1=a[1];out[1]=a[2];out[2]=a1}else{out[0]=a[0];out[1]=a[2];out[2]=a[1];out[3]=a[3]}return out};mat2.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],det=a0*a3-a2*a1;if(!det){return null}det=1/det;out[0]=a3*det;out[1]=-a1*det;out[2]=-a2*det;out[3]=a0*det;return out};mat2.adjoint=function(out,a){var a0=a[0];out[0]=a[3];out[1]=-a[1];out[2]=-a[2];out[3]=a0;return out};mat2.determinant=function(a){return a[0]*a[3]-a[2]*a[1]};mat2.mul=mat2.multiply=function(out,a,b){var a0=a[0],a1=a[1],a2=a[2],a3=a[3];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=a0*b0+a1*b2;out[1]=a0*b1+a1*b3;out[2]=a2*b0+a3*b2;out[3]=a2*b1+a3*b3;return out};mat2.rotate=function(out,a,rad){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],s=Math.sin(rad),c=Math.cos(rad);out[0]=a0*c+a1*s;out[1]=a0*-s+a1*c;out[2]=a2*c+a3*s;out[3]=a2*-s+a3*c;return out};mat2.scale=function(out,a,v){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],v0=v[0],v1=v[1];out[0]=a0*v0;out[1]=a1*v1;out[2]=a2*v0;out[3]=a3*v1;return out};mat2.str=function(a){return"mat2("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.mat2=mat2}var mat3={};var mat3Identity=new Float32Array([1,0,0,0,1,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat3.create=function(){return new Float32Array(mat3Identity)};mat3.clone=function(a){var out=new Float32Array(9);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=1;out[5]=0;out[6]=0;out[7]=0;out[8]=1;return out};mat3.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a12=a[5];out[1]=a[3];out[2]=a[6];out[3]=a01;out[5]=a[7];out[6]=a02;out[7]=a12}else{out[0]=a[0];out[1]=a[3];out[2]=a[6];out[3]=a[1];out[4]=a[4];out[5]=a[7];out[6]=a[2];out[7]=a[5];out[8]=a[8]}return out};mat3.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b01=a22*a11-a12*a21,b11=-a22*a10+a12*a20,b21=a21*a10-a11*a20,det=a00*b01+a01*b11+a02*b21;if(!det){return null}det=1/det;out[0]=b01*det;out[1]=(-a22*a01+a02*a21)*det;out[2]=(a12*a01-a02*a11)*det;out[3]=b11*det;out[4]=(a22*a00-a02*a20)*det;out[5]=(-a12*a00+a02*a10)*det;out[6]=b21*det;out[7]=(-a21*a00+a01*a20)*det;out[8]=(a11*a00-a01*a10)*det;return out};mat3.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];out[0]=a11*a22-a12*a21;out[1]=a02*a21-a01*a22;out[2]=a01*a12-a02*a11;out[3]=a12*a20-a10*a22;out[4]=a00*a22-a02*a20;out[5]=a02*a10-a00*a12;out[6]=a10*a21-a11*a20;out[7]=a01*a20-a00*a21;out[8]=a00*a11-a01*a10;return out};mat3.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];return a00*(a22*a11-a12*a21)+a01*(-a22*a10+a12*a20)+a02*(a21*a10-a11*a20)};mat3.mul=mat3.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b00=b[0],b01=b[1],b02=b[2],b10=b[3],b11=b[4],b12=b[5],b20=b[6],b21=b[7],b22=b[8];out[0]=b00*a00+b01*a10+b02*a20;out[1]=b00*a01+b01*a11+b02*a21;out[2]=b00*a02+b01*a12+b02*a22;out[3]=b10*a00+b11*a10+b12*a20;out[4]=b10*a01+b11*a11+b12*a21;out[5]=b10*a02+b11*a12+b12*a22;out[6]=b20*a00+b21*a10+b22*a20;out[7]=b20*a01+b21*a11+b22*a21;out[8]=b20*a02+b21*a12+b22*a22;return out};mat3.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"};if(typeof exports!=="undefined"){exports.mat3=mat3}var mat4={};var mat4Identity=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat4.create=function(){return new Float32Array(mat4Identity)};mat4.clone=function(a){var out=new Float32Array(16);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=1;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=1;out[11]=0;out[12]=0;out[13]=0;out[14]=0;out[15]=1;return out};mat4.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a03=a[3],a12=a[6],a13=a[7],a23=a[11];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a01;out[6]=a[9];out[7]=a[13];out[8]=a02;out[9]=a12;out[11]=a[14];out[12]=a03;out[13]=a13;out[14]=a23}else{out[0]=a[0];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a[1];out[5]=a[5];out[6]=a[9];out[7]=a[13];out[8]=a[2];out[9]=a[6];out[10]=a[10];out[11]=a[14];out[12]=a[3];out[13]=a[7];out[14]=a[11];out[15]=a[15]}return out};mat4.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32,det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(!det){return null}det=1/det;out[0]=(a11*b11-a12*b10+a13*b09)*det;out[1]=(a02*b10-a01*b11-a03*b09)*det;out[2]=(a31*b05-a32*b04+a33*b03)*det;out[3]=(a22*b04-a21*b05-a23*b03)*det;out[4]=(a12*b08-a10*b11-a13*b07)*det;out[5]=(a00*b11-a02*b08+a03*b07)*det;out[6]=(a32*b02-a30*b05-a33*b01)*det;out[7]=(a20*b05-a22*b02+a23*b01)*det;out[8]=(a10*b10-a11*b08+a13*b06)*det;out[9]=(a01*b08-a00*b10-a03*b06)*det;out[10]=(a30*b04-a31*b02+a33*b00)*det;out[11]=(a21*b02-a20*b04-a23*b00)*det;out[12]=(a11*b07-a10*b09-a12*b06)*det;out[13]=(a00*b09-a01*b07+a02*b06)*det;out[14]=(a31*b01-a30*b03-a32*b00)*det;out[15]=(a20*b03-a21*b01+a22*b00)*det;return out};mat4.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];out[0]=a11*(a22*a33-a23*a32)-a21*(a12*a33-a13*a32)+a31*(a12*a23-a13*a22);out[1]=-(a01*(a22*a33-a23*a32)-a21*(a02*a33-a03*a32)+a31*(a02*a23-a03*a22));out[2]=a01*(a12*a33-a13*a32)-a11*(a02*a33-a03*a32)+a31*(a02*a13-a03*a12);out[3]=-(a01*(a12*a23-a13*a22)-a11*(a02*a23-a03*a22)+a21*(a02*a13-a03*a12));out[4]=-(a10*(a22*a33-a23*a32)-a20*(a12*a33-a13*a32)+a30*(a12*a23-a13*a22));out[5]=a00*(a22*a33-a23*a32)-a20*(a02*a33-a03*a32)+a30*(a02*a23-a03*a22);out[6]=-(a00*(a12*a33-a13*a32)-a10*(a02*a33-a03*a32)+a30*(a02*a13-a03*a12));out[7]=a00*(a12*a23-a13*a22)-a10*(a02*a23-a03*a22)+a20*(a02*a13-a03*a12);out[8]=a10*(a21*a33-a23*a31)-a20*(a11*a33-a13*a31)+a30*(a11*a23-a13*a21);out[9]=-(a00*(a21*a33-a23*a31)-a20*(a01*a33-a03*a31)+a30*(a01*a23-a03*a21));out[10]=a00*(a11*a33-a13*a31)-a10*(a01*a33-a03*a31)+a30*(a01*a13-a03*a11);out[11]=-(a00*(a11*a23-a13*a21)-a10*(a01*a23-a03*a21)+a20*(a01*a13-a03*a11));out[12]=-(a10*(a21*a32-a22*a31)-a20*(a11*a32-a12*a31)+a30*(a11*a22-a12*a21));out[13]=a00*(a21*a32-a22*a31)-a20*(a01*a32-a02*a31)+a30*(a01*a22-a02*a21);out[14]=-(a00*(a11*a32-a12*a31)-a10*(a01*a32-a02*a31)+a30*(a01*a12-a02*a11));out[15]=a00*(a11*a22-a12*a21)-a10*(a01*a22-a02*a21)+a20*(a01*a12-a02*a11);return out};mat4.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32;return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06};mat4.mul=mat4.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=b0*a00+b1*a10+b2*a20+b3*a30;out[1]=b0*a01+b1*a11+b2*a21+b3*a31;out[2]=b0*a02+b1*a12+b2*a22+b3*a32;out[3]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[4];b1=b[5];b2=b[6];b3=b[7];out[4]=b0*a00+b1*a10+b2*a20+b3*a30;out[5]=b0*a01+b1*a11+b2*a21+b3*a31;out[6]=b0*a02+b1*a12+b2*a22+b3*a32;out[7]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[8];b1=b[9];b2=b[10];b3=b[11];out[8]=b0*a00+b1*a10+b2*a20+b3*a30;out[9]=b0*a01+b1*a11+b2*a21+b3*a31;out[10]=b0*a02+b1*a12+b2*a22+b3*a32;out[11]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[12];b1=b[13];b2=b[14];b3=b[15];out[12]=b0*a00+b1*a10+b2*a20+b3*a30;out[13]=b0*a01+b1*a11+b2*a21+b3*a31;out[14]=b0*a02+b1*a12+b2*a22+b3*a32;out[15]=b0*a03+b1*a13+b2*a23+b3*a33;return out};mat4.translate=function(out,a,v){var x=v[0],y=v[1],z=v[2],a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;if(a===out){out[12]=a[0]*x+a[4]*y+a[8]*z+a[12];out[13]=a[1]*x+a[5]*y+a[9]*z+a[13];out[14]=a[2]*x+a[6]*y+a[10]*z+a[14];out[15]=a[3]*x+a[7]*y+a[11]*z+a[15]}else{a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a03;out[4]=a10;out[5]=a11;out[6]=a12;out[7]=a13;out[8]=a20;out[9]=a21;out[10]=a22;out[11]=a23;out[12]=a00*x+a10*y+a20*z+a[12];out[13]=a01*x+a11*y+a21*z+a[13];out[14]=a02*x+a12*y+a22*z+a[14];out[15]=a03*x+a13*y+a23*z+a[15]}return out};mat4.scale=function(out,a,v){var x=v[0],y=v[1],z=v[2];out[0]=a[0]*x;out[1]=a[1]*x;out[2]=a[2]*x;out[3]=a[3]*x;out[4]=a[4]*y;out[5]=a[5]*y;out[6]=a[6]*y;out[7]=a[7]*y;out[8]=a[8]*z;out[9]=a[9]*z;out[10]=a[10]*z;out[11]=a[11]*z;out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.rotate=function(out,a,rad,axis){var x=axis[0],y=axis[1],z=axis[2],len=Math.sqrt(x*x+y*y+z*z),s,c,t,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,b00,b01,b02,b10,b11,b12,b20,b21,b22;if(Math.abs(len)<GLMAT_EPSILON){return null}len=1/len;x*=len;y*=len;z*=len;s=Math.sin(rad);c=Math.cos(rad);t=1-c;a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];b00=x*x*t+c;b01=y*x*t+z*s;b02=z*x*t-y*s;b10=x*y*t-z*s;b11=y*y*t+c;b12=z*y*t+x*s;b20=x*z*t+y*s;b21=y*z*t-x*s;b22=z*z*t+c;out[0]=a00*b00+a10*b01+a20*b02;out[1]=a01*b00+a11*b01+a21*b02;out[2]=a02*b00+a12*b01+a22*b02;out[3]=a03*b00+a13*b01+a23*b02;out[4]=a00*b10+a10*b11+a20*b12;out[5]=a01*b10+a11*b11+a21*b12;out[6]=a02*b10+a12*b11+a22*b12;out[7]=a03*b10+a13*b11+a23*b12;out[8]=a00*b20+a10*b21+a20*b22;out[9]=a01*b20+a11*b21+a21*b22;out[10]=a02*b20+a12*b21+a22*b22;out[11]=a03*b20+a13*b21+a23*b22;if(a!==out){out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}return out};mat4.rotateX=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[4]=a10*c+a20*s;out[5]=a11*c+a21*s;out[6]=a12*c+a22*s;out[7]=a13*c+a23*s;out[8]=a20*c-a10*s;out[9]=a21*c-a11*s;out[10]=a22*c-a12*s;out[11]=a23*c-a13*s;return out};mat4.rotateY=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c-a20*s;out[1]=a01*c-a21*s;out[2]=a02*c-a22*s;out[3]=a03*c-a23*s;out[8]=a00*s+a20*c;out[9]=a01*s+a21*c;out[10]=a02*s+a22*c;out[11]=a03*s+a23*c;return out};mat4.rotateZ=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7];if(a!==out){out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c+a10*s;out[1]=a01*c+a11*s;out[2]=a02*c+a12*s;out[3]=a03*c+a13*s;out[4]=a10*c-a00*s;out[5]=a11*c-a01*s;out[6]=a12*c-a02*s;out[7]=a13*c-a03*s;return out};mat4.fromRotationTranslation=function(out,q,v){var x=q[0],y=q[1],z=q[2],w=q[3],x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;out[0]=1-(yy+zz);out[1]=xy+wz;out[2]=xz-wy;out[3]=0;out[4]=xy-wz;out[5]=1-(xx+zz);out[6]=yz+wx;out[7]=0;out[8]=xz+wy;out[9]=yz-wx;out[10]=1-(xx+yy);out[11]=0;out[12]=v[0];out[13]=v[1];out[14]=v[2];out[15]=1;return out};mat4.frustum=function(out,left,right,bottom,top,near,far){var rl=1/(right-left),tb=1/(top-bottom),nf=1/(near-far);out[0]=near*2*rl;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=near*2*tb;out[6]=0;out[7]=0;out[8]=(right+left)*rl;out[9]=(top+bottom)*tb;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=far*near*2*nf;out[15]=0;return out};mat4.perspective=function(out,fovy,aspect,near,far){var f=1/Math.tan(fovy/2),nf=1/(near-far);out[0]=f/aspect;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=f;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=2*far*near*nf;out[15]=0;return out};mat4.ortho=function(out,left,right,bottom,top,near,far){var lr=1/(left-right),bt=1/(bottom-top),nf=1/(near-far);out[0]=-2*lr;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=-2*bt;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=2*nf;out[11]=0;out[12]=(left+right)*lr;out[13]=(top+bottom)*bt;out[14]=(far+near)*nf;out[15]=1;return out};mat4.lookAt=function(out,eye,center,up){var x0,x1,x2,y0,y1,y2,z0,z1,z2,len,eyex=eye[0],eyey=eye[1],eyez=eye[2],upx=up[0],upy=up[1],upz=up[2],centerx=center[0],centery=center[1],centerz=center[2];if(Math.abs(eyex-centerx)<GLMAT_EPSILON&&Math.abs(eyey-centery)<GLMAT_EPSILON&&Math.abs(eyez-centerz)<GLMAT_EPSILON){return mat4.identity(out)}z0=eyex-centerx;z1=eyey-centery;z2=eyez-centerz;len=1/Math.sqrt(z0*z0+z1*z1+z2*z2);z0*=len;z1*=len;z2*=len;x0=upy*z2-upz*z1;x1=upz*z0-upx*z2;x2=upx*z1-upy*z0;len=Math.sqrt(x0*x0+x1*x1+x2*x2);if(!len){x0=0;x1=0;x2=0}else{len=1/len;x0*=len;x1*=len;x2*=len}y0=z1*x2-z2*x1;y1=z2*x0-z0*x2;y2=z0*x1-z1*x0;len=Math.sqrt(y0*y0+y1*y1+y2*y2);if(!len){y0=0;y1=0;y2=0}else{len=1/len;y0*=len;y1*=len;y2*=len}out[0]=x0;out[1]=y0;out[2]=z0;out[3]=0;out[4]=x1;out[5]=y1;out[6]=z1;out[7]=0;out[8]=x2;out[9]=y2;out[10]=z2;out[11]=0;out[12]=-(x0*eyex+x1*eyey+x2*eyez);out[13]=-(y0*eyex+y1*eyey+y2*eyez);out[14]=-(z0*eyex+z1*eyey+z2*eyez);out[15]=1;return out};mat4.str=function(a){return"mat4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+")"};if(typeof exports!=="undefined"){exports.mat4=mat4}var quat={};var quatIdentity=new Float32Array([0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}quat.create=function(){return new Float32Array(quatIdentity)};quat.clone=vec4.clone;quat.fromValues=vec4.fromValues;quat.copy=vec4.copy;quat.set=vec4.set;quat.identity=function(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out};quat.setAxisAngle=function(out,axis,rad){rad=rad*.5;var s=Math.sin(rad);out[0]=s*axis[0];out[1]=s*axis[1];out[2]=s*axis[2];out[3]=Math.cos(rad);return out};quat.add=vec4.add;quat.mul=quat.multiply=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=b[3];out[0]=ax*bw+aw*bx+ay*bz-az*by;out[1]=ay*bw+aw*by+az*bx-ax*bz;out[2]=az*bw+aw*bz+ax*by-ay*bx;out[3]=aw*bw-ax*bx-ay*by-az*bz;return out};quat.scale=vec4.scale;quat.rotateX=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+aw*bx;out[1]=ay*bw+az*bx;out[2]=az*bw-ay*bx;out[3]=aw*bw-ax*bx;return out};quat.rotateY=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],by=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw-az*by;out[1]=ay*bw+aw*by;out[2]=az*bw+ax*by;out[3]=aw*bw-ay*by;return out};quat.rotateZ=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bz=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+ay*bz;out[1]=ay*bw-ax*bz;out[2]=az*bw+aw*bz;out[3]=aw*bw-az*bz;return out};quat.calculateW=function(out,a){var x=a[0],y=a[1],z=a[2];out[0]=x;out[1]=y;out[2]=z;out[3]=-Math.sqrt(Math.abs(1-x*x-y*y-z*z));return out};quat.dot=vec4.dot;quat.lerp=vec4.lerp;quat.slerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=a[3];var cosHalfTheta=ax*bx+ay*by+az*bz+aw*bw,halfTheta,sinHalfTheta,ratioA,ratioB;if(Math.abs(cosHalfTheta)>=1){if(out!==a){out[0]=ax;out[1]=ay;out[2]=az;out[3]=aw}return out}halfTheta=Math.acos(cosHalfTheta);sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001){out[0]=ax*.5+bx*.5;out[1]=ay*.5+by*.5;out[2]=az*.5+bz*.5;out[3]=aw*.5+bw*.5;return out}ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta;ratioB=Math.sin(t*halfTheta)/sinHalfTheta;out[0]=ax*ratioA+bx*ratioB;out[1]=ay*ratioA+by*ratioB;out[2]=az*ratioA+bz*ratioB;out[3]=aw*ratioA+bw*ratioB;return out};quat.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],dot=a0*a0+a1*a1+a2*a2+a3*a3,invDot=dot?1/dot:0;out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out};quat.conjugate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out};quat.len=quat.length=vec4.length;quat.sqrLen=quat.squaredLength=vec4.squaredLength;quat.normalize=vec4.normalize;quat.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.quat=quat}}(shim.exports)}()}()},{}],20:[function(require,module,exports){!function(){!function(){var root=this;var previousUnderscore=root._;var breaker={};var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var push=ArrayProto.push,slice=ArrayProto.slice,concat=ArrayProto.concat,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeForEach=ArrayProto.forEach,nativeMap=ArrayProto.map,nativeReduce=ArrayProto.reduce,nativeReduceRight=ArrayProto.reduceRight,nativeFilter=ArrayProto.filter,nativeEvery=ArrayProto.every,nativeSome=ArrayProto.some,nativeIndexOf=ArrayProto.indexOf,nativeLastIndexOf=ArrayProto.lastIndexOf,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){if(obj instanceof _)return obj;if(!(this instanceof _))return new _(obj);this._wrapped=obj};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=_}exports._=_}else{root._=_}_.VERSION="1.4.4";var each=_.each=_.forEach=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i<l;i++){if(iterator.call(context,obj[i],i,obj)===breaker)return}}else{for(var key in obj){if(_.has(obj,key)){if(iterator.call(context,obj[key],key,obj)===breaker)return}}}};_.map=_.collect=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeMap&&obj.map===nativeMap)return obj.map(iterator,context);each(obj,function(value,index,list){results[results.length]=iterator.call(context,value,index,list)});return results};var reduceError="Reduce of empty array with no initial value";_.reduce=_.foldl=_.inject=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduce&&obj.reduce===nativeReduce){if(context)iterator=_.bind(iterator,context);return initial?obj.reduce(iterator,memo):obj.reduce(iterator)}each(obj,function(value,index,list){if(!initial){memo=value;initial=true}else{memo=iterator.call(context,memo,value,index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.reduceRight=_.foldr=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduceRight&&obj.reduceRight===nativeReduceRight){if(context)iterator=_.bind(iterator,context);return initial?obj.reduceRight(iterator,memo):obj.reduceRight(iterator)}var length=obj.length;if(length!==+length){var keys=_.keys(obj);length=keys.length}each(obj,function(value,index,list){index=keys?keys[--length]:--length;if(!initial){memo=obj[index];initial=true}else{memo=iterator.call(context,memo,obj[index],index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.find=_.detect=function(obj,iterator,context){var result;any(obj,function(value,index,list){if(iterator.call(context,value,index,list)){result=value;return true}});return result};_.filter=_.select=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeFilter&&obj.filter===nativeFilter)return obj.filter(iterator,context);each(obj,function(value,index,list){if(iterator.call(context,value,index,list))results[results.length]=value});return results};_.reject=function(obj,iterator,context){return _.filter(obj,function(value,index,list){return!iterator.call(context,value,index,list)},context)};_.every=_.all=function(obj,iterator,context){iterator||(iterator=_.identity);var result=true;if(obj==null)return result;if(nativeEvery&&obj.every===nativeEvery)return obj.every(iterator,context);each(obj,function(value,index,list){if(!(result=result&&iterator.call(context,value,index,list)))return breaker});return!!result};var any=_.some=_.any=function(obj,iterator,context){iterator||(iterator=_.identity);var result=false;if(obj==null)return result;if(nativeSome&&obj.some===nativeSome)return obj.some(iterator,context);each(obj,function(value,index,list){if(result||(result=iterator.call(context,value,index,list)))return breaker});return!!result};_.contains=_.include=function(obj,target){if(obj==null)return false;if(nativeIndexOf&&obj.indexOf===nativeIndexOf)return obj.indexOf(target)!=-1;return any(obj,function(value){return value===target})};_.invoke=function(obj,method){var args=slice.call(arguments,2);var isFunc=_.isFunction(method);return _.map(obj,function(value){return(isFunc?method:value[method]).apply(value,args)})};_.pluck=function(obj,key){return _.map(obj,function(value){return value[key]})};_.where=function(obj,attrs,first){if(_.isEmpty(attrs))return first?null:[];return _[first?"find":"filter"](obj,function(value){for(var key in attrs){if(attrs[key]!==value[key])return false}return true})};_.findWhere=function(obj,attrs){return _.where(obj,attrs,true)};_.max=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.max.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return-Infinity;var result={computed:-Infinity,value:-Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed>=result.computed&&(result={value:value,computed:computed})});return result.value};_.min=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.min.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return Infinity;var result={computed:Infinity,value:Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed<result.computed&&(result={value:value,computed:computed})});return result.value};_.shuffle=function(obj){var rand;var index=0;var shuffled=[];each(obj,function(value){rand=_.random(index++);shuffled[index-1]=shuffled[rand];shuffled[rand]=value});return shuffled};var lookupIterator=function(value){return _.isFunction(value)?value:function(obj){return obj[value]}};_.sortBy=function(obj,value,context){var iterator=lookupIterator(value);return _.pluck(_.map(obj,function(value,index,list){return{value:value,index:index,criteria:iterator.call(context,value,index,list)}}).sort(function(left,right){var a=left.criteria;
-var b=right.criteria;if(a!==b){if(a>b||a===void 0)return 1;if(a<b||b===void 0)return-1}return left.index<right.index?-1:1}),"value")};var group=function(obj,value,context,behavior){var result={};var iterator=lookupIterator(value||_.identity);each(obj,function(value,index){var key=iterator.call(context,value,index,obj);behavior(result,key,value)});return result};_.groupBy=function(obj,value,context){return group(obj,value,context,function(result,key,value){(_.has(result,key)?result[key]:result[key]=[]).push(value)})};_.countBy=function(obj,value,context){return group(obj,value,context,function(result,key){if(!_.has(result,key))result[key]=0;result[key]++})};_.sortedIndex=function(array,obj,iterator,context){iterator=iterator==null?_.identity:lookupIterator(iterator);var value=iterator.call(context,obj);var low=0,high=array.length;while(low<high){var mid=low+high>>>1;iterator.call(context,array[mid])<value?low=mid+1:high=mid}return low};_.toArray=function(obj){if(!obj)return[];if(_.isArray(obj))return slice.call(obj);if(obj.length===+obj.length)return _.map(obj,_.identity);return _.values(obj)};_.size=function(obj){if(obj==null)return 0;return obj.length===+obj.length?obj.length:_.keys(obj).length};_.first=_.head=_.take=function(array,n,guard){if(array==null)return void 0;return n!=null&&!guard?slice.call(array,0,n):array[0]};_.initial=function(array,n,guard){return slice.call(array,0,array.length-(n==null||guard?1:n))};_.last=function(array,n,guard){if(array==null)return void 0;if(n!=null&&!guard){return slice.call(array,Math.max(array.length-n,0))}else{return array[array.length-1]}};_.rest=_.tail=_.drop=function(array,n,guard){return slice.call(array,n==null||guard?1:n)};_.compact=function(array){return _.filter(array,_.identity)};var flatten=function(input,shallow,output){each(input,function(value){if(_.isArray(value)){shallow?push.apply(output,value):flatten(value,shallow,output)}else{output.push(value)}});return output};_.flatten=function(array,shallow){return flatten(array,shallow,[])};_.without=function(array){return _.difference(array,slice.call(arguments,1))};_.uniq=_.unique=function(array,isSorted,iterator,context){if(_.isFunction(isSorted)){context=iterator;iterator=isSorted;isSorted=false}var initial=iterator?_.map(array,iterator,context):array;var results=[];var seen=[];each(initial,function(value,index){if(isSorted?!index||seen[seen.length-1]!==value:!_.contains(seen,value)){seen.push(value);results.push(array[index])}});return results};_.union=function(){return _.uniq(concat.apply(ArrayProto,arguments))};_.intersection=function(array){var rest=slice.call(arguments,1);return _.filter(_.uniq(array),function(item){return _.every(rest,function(other){return _.indexOf(other,item)>=0})})};_.difference=function(array){var rest=concat.apply(ArrayProto,slice.call(arguments,1));return _.filter(array,function(value){return!_.contains(rest,value)})};_.zip=function(){var args=slice.call(arguments);var length=_.max(_.pluck(args,"length"));var results=new Array(length);for(var i=0;i<length;i++){results[i]=_.pluck(args,""+i)}return results};_.object=function(list,values){if(list==null)return{};var result={};for(var i=0,l=list.length;i<l;i++){if(values){result[list[i]]=values[i]}else{result[list[i][0]]=list[i][1]}}return result};_.indexOf=function(array,item,isSorted){if(array==null)return-1;var i=0,l=array.length;if(isSorted){if(typeof isSorted=="number"){i=isSorted<0?Math.max(0,l+isSorted):isSorted}else{i=_.sortedIndex(array,item);return array[i]===item?i:-1}}if(nativeIndexOf&&array.indexOf===nativeIndexOf)return array.indexOf(item,isSorted);for(;i<l;i++)if(array[i]===item)return i;return-1};_.lastIndexOf=function(array,item,from){if(array==null)return-1;var hasIndex=from!=null;if(nativeLastIndexOf&&array.lastIndexOf===nativeLastIndexOf){return hasIndex?array.lastIndexOf(item,from):array.lastIndexOf(item)}var i=hasIndex?from:array.length;while(i--)if(array[i]===item)return i;return-1};_.range=function(start,stop,step){if(arguments.length<=1){stop=start||0;start=0}step=arguments[2]||1;var len=Math.max(Math.ceil((stop-start)/step),0);var idx=0;var range=new Array(len);while(idx<len){range[idx++]=start;start+=step}return range};_.bind=function(func,context){if(func.bind===nativeBind&&nativeBind)return nativeBind.apply(func,slice.call(arguments,1));var args=slice.call(arguments,2);return function(){return func.apply(context,args.concat(slice.call(arguments)))}};_.partial=function(func){var args=slice.call(arguments,1);return function(){return func.apply(this,args.concat(slice.call(arguments)))}};_.bindAll=function(obj){var funcs=slice.call(arguments,1);if(funcs.length===0)funcs=_.functions(obj);each(funcs,function(f){obj[f]=_.bind(obj[f],obj)});return obj};_.memoize=function(func,hasher){var memo={};hasher||(hasher=_.identity);return function(){var key=hasher.apply(this,arguments);return _.has(memo,key)?memo[key]:memo[key]=func.apply(this,arguments)}};_.delay=function(func,wait){var args=slice.call(arguments,2);return setTimeout(function(){return func.apply(null,args)},wait)};_.defer=function(func){return _.delay.apply(_,[func,1].concat(slice.call(arguments,1)))};_.throttle=function(func,wait){var context,args,timeout,result;var previous=0;var later=function(){previous=new Date;timeout=null;result=func.apply(context,args)};return function(){var now=new Date;var remaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0){clearTimeout(timeout);timeout=null;previous=now;result=func.apply(context,args)}else if(!timeout){timeout=setTimeout(later,remaining)}return result}};_.debounce=function(func,wait,immediate){var timeout,result;return function(){var context=this,args=arguments;var later=function(){timeout=null;if(!immediate)result=func.apply(context,args)};var callNow=immediate&&!timeout;clearTimeout(timeout);timeout=setTimeout(later,wait);if(callNow)result=func.apply(context,args);return result}};_.once=function(func){var ran=false,memo;return function(){if(ran)return memo;ran=true;memo=func.apply(this,arguments);func=null;return memo}};_.wrap=function(func,wrapper){return function(){var args=[func];push.apply(args,arguments);return wrapper.apply(this,args)}};_.compose=function(){var funcs=arguments;return function(){var args=arguments;for(var i=funcs.length-1;i>=0;i--){args=[funcs[i].apply(this,args)]}return args[0]}};_.after=function(times,func){if(times<=0)return func();return function(){if(--times<1){return func.apply(this,arguments)}}};_.keys=nativeKeys||function(obj){if(obj!==Object(obj))throw new TypeError("Invalid object");var keys=[];for(var key in obj)if(_.has(obj,key))keys[keys.length]=key;return keys};_.values=function(obj){var values=[];for(var key in obj)if(_.has(obj,key))values.push(obj[key]);return values};_.pairs=function(obj){var pairs=[];for(var key in obj)if(_.has(obj,key))pairs.push([key,obj[key]]);return pairs};_.invert=function(obj){var result={};for(var key in obj)if(_.has(obj,key))result[obj[key]]=key;return result};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key)}return names.sort()};_.extend=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){obj[prop]=source[prop]}}});return obj};_.pick=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));each(keys,function(key){if(key in obj)copy[key]=obj[key]});return copy};_.omit=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));for(var key in obj){if(!_.contains(keys,key))copy[key]=obj[key]}return copy};_.defaults=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){if(obj[prop]==null)obj[prop]=source[prop]}}});return obj};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj)};_.tap=function(obj,interceptor){interceptor(obj);return obj};var eq=function(a,b,aStack,bStack){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a instanceof _)a=a._wrapped;if(b instanceof _)b=b._wrapped;var className=toString.call(a);if(className!=toString.call(b))return false;switch(className){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return false;var length=aStack.length;while(length--){if(aStack[length]==a)return bStack[length]==b}aStack.push(a);bStack.push(b);var size=0,result=true;if(className=="[object Array]"){size=a.length;result=size==b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack)))break}}}else{var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(_.isFunction(aCtor)&&aCtor instanceof aCtor&&_.isFunction(bCtor)&&bCtor instanceof bCtor)){return false}for(var key in a){if(_.has(a,key)){size++;if(!(result=_.has(b,key)&&eq(a[key],b[key],aStack,bStack)))break}}if(result){for(key in b){if(_.has(b,key)&&!size--)break}result=!size}}aStack.pop();bStack.pop();return result};_.isEqual=function(a,b){return eq(a,b,[],[])};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true};_.isElement=function(obj){return!!(obj&&obj.nodeType===1)};_.isArray=nativeIsArray||function(obj){return toString.call(obj)=="[object Array]"};_.isObject=function(obj){return obj===Object(obj)};each(["Arguments","Function","String","Number","Date","RegExp"],function(name){_["is"+name]=function(obj){return toString.call(obj)=="[object "+name+"]"}});if(!_.isArguments(arguments)){_.isArguments=function(obj){return!!(obj&&_.has(obj,"callee"))}}if(typeof/./!=="function"){_.isFunction=function(obj){return typeof obj==="function"}}_.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj))};_.isNaN=function(obj){return _.isNumber(obj)&&obj!=+obj};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)=="[object Boolean]"};_.isNull=function(obj){return obj===null};_.isUndefined=function(obj){return obj===void 0};_.has=function(obj,key){return hasOwnProperty.call(obj,key)};_.noConflict=function(){root._=previousUnderscore;return this};_.identity=function(value){return value};_.times=function(n,iterator,context){var accum=Array(n);for(var i=0;i<n;i++)accum[i]=iterator.call(context,i);return accum};_.random=function(min,max){if(max==null){max=min;min=0}return min+Math.floor(Math.random()*(max-min+1))};var entityMap={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};entityMap.unescape=_.invert(entityMap.escape);var entityRegexes={escape:new RegExp("["+_.keys(entityMap.escape).join("")+"]","g"),unescape:new RegExp("("+_.keys(entityMap.unescape).join("|")+")","g")};_.each(["escape","unescape"],function(method){_[method]=function(string){if(string==null)return"";return(""+string).replace(entityRegexes[method],function(match){return entityMap[method][match]})}});_.result=function(object,property){if(object==null)return null;var value=object[property];return _.isFunction(value)?value.call(object):value};_.mixin=function(obj){each(_.functions(obj),function(name){var func=_[name]=obj[name];_.prototype[name]=function(){var args=[this._wrapped];push.apply(args,arguments);return result.call(this,func.apply(_,args))}})};var idCounter=0;_.uniqueId=function(prefix){var id=++idCounter+"";return prefix?prefix+id:id};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/(.)^/;var escapes={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"};var escaper=/\\|'|\r|\n|\t|\u2028|\u2029/g;_.template=function(text,data,settings){var render;settings=_.defaults({},settings,_.templateSettings);var matcher=new RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join("|")+"|$","g");var index=0;var source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,function(match){return"\\"+escapes[match]});if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'"}if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'"}if(evaluate){source+="';\n"+evaluate+"\n__p+='"}index=offset+match.length;return match});source+="';\n";if(!settings.variable)source="with(obj||{}){\n"+source+"}\n";source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+"return __p;\n";try{render=new Function(settings.variable||"obj","_",source)}catch(e){e.source=source;throw e}if(data)return render(data,_);var template=function(data){return render.call(this,data,_)};template.source="function("+(settings.variable||"obj")+"){\n"+source+"}";return template};_.chain=function(obj){return _(obj).chain()};var result=function(obj){return this._chain?_(obj).chain():obj};_.mixin(_);each(["pop","push","reverse","shift","sort","splice","unshift"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){var obj=this._wrapped;method.apply(obj,arguments);if((name=="shift"||name=="splice")&&obj.length===0)delete obj[0];return result.call(this,obj)}});each(["concat","join","slice"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){return result.call(this,method.apply(this._wrapped,arguments))}});_.extend(_.prototype,{chain:function(){this._chain=true;return this},value:function(){return this._wrapped}})}.call(this)}()},{}],21:[function(require,module,exports){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}();Leap=require("../lib/index")},{"../lib/index":8}]},{},[21]);
-
-/*
- * Leap Motion integration for Reveal.js.
- * James Sun  [sun16]
- * Rory Hardy [gneatgeek]
- */
-
-(function () {
-  var body        = document.body,
-      controller  = new Leap.Controller({ enableGestures: true }),
-      lastGesture = 0,
-      leapConfig  = Reveal.getConfig().leap,
-      pointer     = document.createElement( 'div' ),
-      config      = {
-        autoCenter       : true,      // Center pointer around detected position.
-        gestureDelay     : 500,       // How long to delay between gestures.
-        naturalSwipe     : true,      // Swipe as if it were a touch screen.
-        pointerColor     : '#00aaff', // Default color of the pointer.
-        pointerOpacity   : 0.7,       // Default opacity of the pointer.
-        pointerSize      : 15,        // Default minimum height/width of the pointer.
-        pointerTolerance : 120        // Bigger = slower pointer.
-      },
-      entered, enteredPosition, now, size, tipPosition; // Other vars we need later, but don't need to redeclare.
-
-      // Merge user defined settings with defaults
-      if( leapConfig ) {
-        for( key in leapConfig ) {
-          config[key] = leapConfig[key];
-        }
-      }
-
-      pointer.id = 'leap';
-
-      pointer.style.position        = 'absolute';
-      pointer.style.visibility      = 'hidden';
-      pointer.style.zIndex          = 50;
-      pointer.style.opacity         = config.pointerOpacity;
-      pointer.style.backgroundColor = config.pointerColor;
-
-      body.appendChild( pointer );
-
-  // Leap's loop
-  controller.on( 'frame', function ( frame ) {
-    // Timing code to rate limit gesture execution
-    now = new Date().getTime();
-
-    // Pointer: 1 to 2 fingers. Strictly one finger works but may cause innaccuracies.
-    // The innaccuracies were observed on a development model and may not be an issue with consumer models.
-    if( frame.fingers.length > 0 && frame.fingers.length < 3 ) {
-      // Invert direction and multiply by 3 for greater effect.
-      size = -3 * frame.fingers[0].tipPosition[2];
-
-      if( size < config.pointerSize ) {
-        size = config.pointerSize;
-      }
-
-      pointer.style.width        = size     + 'px';
-      pointer.style.height       = size     + 'px';
-      pointer.style.borderRadius = size - 5 + 'px';
-      pointer.style.visibility   = 'visible';
-
-      if( config.autoCenter ) {
-        tipPosition = frame.fingers[0].tipPosition;
-
-        // Check whether the finger has entered the z range of the Leap Motion. Used for the autoCenter option.
-        if( !entered ) {
-          entered         = true;
-          enteredPosition = frame.fingers[0].tipPosition;
-        }
-
-        pointer.style.top =
-          (-1 * (( tipPosition[1] - enteredPosition[1] ) * body.offsetHeight / config.pointerTolerance )) +
-            ( body.offsetHeight / 2 ) + 'px';
-
-        pointer.style.left =
-          (( tipPosition[0] - enteredPosition[0] ) * body.offsetWidth / config.pointerTolerance ) +
-            ( body.offsetWidth / 2 ) + 'px';
-      }
-      else {
-        pointer.style.top  = ( 1 - (( tipPosition[1] - 50) / config.pointerTolerance )) *
-          body.offsetHeight + 'px';
-
-        pointer.style.left = ( tipPosition[0] * body.offsetWidth / config.pointerTolerance ) +
-          ( body.offsetWidth / 2 ) + 'px';
-      }
-    }
-    else {
-      // Hide pointer on exit
-      entered                  = false;
-      pointer.style.visibility = 'hidden';
-    }
-
-    // Gestures
-    if( frame.gestures.length > 0 && (now - lastGesture) > config.gestureDelay ) {
-      var gesture = frame.gestures[0];
-
-      // One hand gestures
-      if( frame.hands.length === 1 ) {
-        // Swipe gestures. 3+ fingers.
-        if( frame.fingers.length > 2 && gesture.type === 'swipe' ) {
-          // Define here since some gestures will throw undefined for these.
-          var x = gesture.direction[0],
-              y = gesture.direction[1];
-
-          // Left/right swipe gestures
-          if( Math.abs( x ) > Math.abs( y )) {
-            if( x > 0 ) {
-              config.naturalSwipe ? Reveal.left() : Reveal.right();
-            }
-            else {
-              config.naturalSwipe ? Reveal.right() : Reveal.left();
-            }
-          }
-          // Up/down swipe gestures
-          else {
-            if( y > 0 ) {
-              config.naturalSwipe ? Reveal.down() : Reveal.up();
-            }
-            else {
-              config.naturalSwipe ? Reveal.up() : Reveal.down();
-            }
-          }
-
-          lastGesture = now;
-        }
-      }
-      // Two hand gestures
-      else if( frame.hands.length === 2 ) {
-        // Upward two hand swipe gesture
-        if( gesture.direction[1] > 0 && gesture.type === 'swipe' ) {
-          Reveal.toggleOverview();
-        }
-
-        lastGesture = now;
-      }
-    }
-  });
-
-  controller.connect();
-})();
diff --git a/docs/slides/flops14/reveal.js/plugin/markdown/markdown.js b/docs/slides/flops14/reveal.js/plugin/markdown/markdown.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/markdown/markdown.js
+++ /dev/null
@@ -1,392 +0,0 @@
-/**
- * The reveal.js markdown plugin. Handles parsing of
- * markdown inside of presentations as well as loading
- * of external markdown documents.
- */
-(function( root, factory ) {
-	if( typeof exports === 'object' ) {
-		module.exports = factory( require( './marked' ) );
-	}
-	else {
-		// Browser globals (root is window)
-		root.RevealMarkdown = factory( root.marked );
-		root.RevealMarkdown.initialize();
-	}
-}( this, function( marked ) {
-
-	if( typeof marked === 'undefined' ) {
-		throw 'The reveal.js Markdown plugin requires marked to be loaded';
-	}
-
-	if( typeof hljs !== 'undefined' ) {
-		marked.setOptions({
-			highlight: function( lang, code ) {
-				return hljs.highlightAuto( lang, code ).value;
-			}
-		});
-	}
-
-	var DEFAULT_SLIDE_SEPARATOR = '^\n---\n$',
-		DEFAULT_NOTES_SEPARATOR = 'note:',
-		DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
-		DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
-
-
-	/**
-	 * Retrieves the markdown contents of a slide section
-	 * element. Normalizes leading tabs/whitespace.
-	 */
-	function getMarkdownFromSlide( section ) {
-
-		var template = section.querySelector( 'script' );
-
-		// strip leading whitespace so it isn't evaluated as code
-		var text = ( template || section ).textContent;
-
-		var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
-			leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
-
-		if( leadingTabs > 0 ) {
-			text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
-		}
-		else if( leadingWs > 1 ) {
-			text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' );
-		}
-
-		return text;
-
-	}
-
-	/**
-	 * Given a markdown slide section element, this will
-	 * return all arguments that aren't related to markdown
-	 * parsing. Used to forward any other user-defined arguments
-	 * to the output markdown slide.
-	 */
-	function getForwardedAttributes( section ) {
-
-		var attributes = section.attributes;
-		var result = [];
-
-		for( var i = 0, len = attributes.length; i < len; i++ ) {
-			var name = attributes[i].name,
-				value = attributes[i].value;
-
-			// disregard attributes that are used for markdown loading/parsing
-			if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
-
-			if( value ) {
-				result.push( name + '=' + value );
-			}
-			else {
-				result.push( name );
-			}
-		}
-
-		return result.join( ' ' );
-
-	}
-
-	/**
-	 * Inspects the given options and fills out default
-	 * values for what's not defined.
-	 */
-	function getSlidifyOptions( options ) {
-
-		options = options || {};
-		options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
-		options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
-		options.attributes = options.attributes || '';
-
-		return options;
-
-	}
-
-	/**
-	 * Helper function for constructing a markdown slide.
-	 */
-	function createMarkdownSlide( content, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
-
-		if( notesMatch.length === 2 ) {
-			content = notesMatch[0] + '<aside class="notes" data-markdown>' + notesMatch[1].trim() + '</aside>';
-		}
-
-		return '<script type="text/template">' + content + '</script>';
-
-	}
-
-	/**
-	 * Parses a data string into multiple slides based
-	 * on the passed in separator arguments.
-	 */
-	function slidify( markdown, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
-			horizontalSeparatorRegex = new RegExp( options.separator );
-
-		var matches,
-			lastIndex = 0,
-			isHorizontal,
-			wasHorizontal = true,
-			content,
-			sectionStack = [];
-
-		// iterate until all blocks between separators are stacked up
-		while( matches = separatorRegex.exec( markdown ) ) {
-			notes = null;
-
-			// determine direction (horizontal by default)
-			isHorizontal = horizontalSeparatorRegex.test( matches[0] );
-
-			if( !isHorizontal && wasHorizontal ) {
-				// create vertical stack
-				sectionStack.push( [] );
-			}
-
-			// pluck slide content from markdown input
-			content = markdown.substring( lastIndex, matches.index );
-
-			if( isHorizontal && wasHorizontal ) {
-				// add to horizontal stack
-				sectionStack.push( content );
-			}
-			else {
-				// add to vertical stack
-				sectionStack[sectionStack.length-1].push( content );
-			}
-
-			lastIndex = separatorRegex.lastIndex;
-			wasHorizontal = isHorizontal;
-		}
-
-		// add the remaining slide
-		( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
-
-		var markdownSections = '';
-
-		// flatten the hierarchical stack, and insert <section data-markdown> tags
-		for( var i = 0, len = sectionStack.length; i < len; i++ ) {
-			// vertical
-			if( sectionStack[i] instanceof Array ) {
-				markdownSections += '<section '+ options.attributes +'>';
-
-				sectionStack[i].forEach( function( child ) {
-					markdownSections += '<section data-markdown>' +  createMarkdownSlide( child, options ) + '</section>';
-				} );
-
-				markdownSections += '</section>';
-			}
-			else {
-				markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
-			}
-		}
-
-		return markdownSections;
-
-	}
-
-	/**
-	 * Parses any current data-markdown slides, splits
-	 * multi-slide markdown into separate sections and
-	 * handles loading of external markdown.
-	 */
-	function processSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]'),
-			section;
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			section = sections[i];
-
-			if( section.getAttribute( 'data-markdown' ).length ) {
-
-				var xhr = new XMLHttpRequest(),
-					url = section.getAttribute( 'data-markdown' );
-
-				datacharset = section.getAttribute( 'data-charset' );
-
-				// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
-				if( datacharset != null && datacharset != '' ) {
-					xhr.overrideMimeType( 'text/html; charset=' + datacharset );
-				}
-
-				xhr.onreadystatechange = function() {
-					if( xhr.readyState === 4 ) {
-						if ( xhr.status >= 200 && xhr.status < 300 ) {
-
-							section.outerHTML = slidify( xhr.responseText, {
-								separator: section.getAttribute( 'data-separator' ),
-								verticalSeparator: section.getAttribute( 'data-vertical' ),
-								notesSeparator: section.getAttribute( 'data-notes' ),
-								attributes: getForwardedAttributes( section )
-							});
-
-						}
-						else {
-
-							section.outerHTML = '<section data-state="alert">' +
-								'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
-								'Check your browser\'s JavaScript console for more details.' +
-								'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
-								'</section>';
-
-						}
-					}
-				};
-
-				xhr.open( 'GET', url, false );
-
-				try {
-					xhr.send();
-				}
-				catch ( e ) {
-					alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
-				}
-
-			}
-			else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-vertical' ) || section.getAttribute( 'data-notes' ) ) {
-
-				section.outerHTML = slidify( getMarkdownFromSlide( section ), {
-					separator: section.getAttribute( 'data-separator' ),
-					verticalSeparator: section.getAttribute( 'data-vertical' ),
-					notesSeparator: section.getAttribute( 'data-notes' ),
-					attributes: getForwardedAttributes( section )
-				});
-
-			}
-			else {
-				section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
-			}
-		}
-
-	}
-
-	/**
-	 * Check if a node value has the attributes pattern.
-	 * If yes, extract it and add that value as one or several attributes
-	 * the the terget element.
-	 *
-	 * You need Cache Killer on Chrome to see the effect on any FOM transformation
-	 * directly on refresh (F5)
-	 * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
-	 */
-	function addAttributeInElement( node, elementTarget, separator ) {
-
-		var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
-		var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' );
-		var nodeValue = node.nodeValue;
-		if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
-
-			var classes = matches[1];
-			nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
-			node.nodeValue = nodeValue;
-			while( matchesClass = mardownClassRegex.exec( classes ) ) {
-				elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Add attributes to the parent element of a text node,
-	 * or the element of an attribute node.
-	 */
-	function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
-
-		if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
-			previousParentElement = element;
-			for( var i = 0; i < element.childNodes.length; i++ ) {
-				childElement = element.childNodes[i];
-				if ( i > 0 ) {
-					j = i - 1;
-					while ( j >= 0 ) {
-						aPreviousChildElement = element.childNodes[j];
-						if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
-							previousParentElement = aPreviousChildElement;
-							break;
-						}
-						j = j - 1;
-					}
-				}
-				parentSection = section;
-				if( childElement.nodeName ==  "section" ) {
-					parentSection = childElement ;
-					previousParentElement = childElement ;
-				}
-				if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
-					addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
-				}
-			}
-		}
-
-		if ( element.nodeType == Node.COMMENT_NODE ) {
-			if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
-				addAttributeInElement( element, section, separatorSectionAttributes );
-			}
-		}
-	}
-
-	/**
-	 * Converts any current data-markdown slides in the
-	 * DOM to HTML.
-	 */
-	function convertSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]');
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			var section = sections[i];
-
-			// Only parse the same slide once
-			if( !section.getAttribute( 'data-markdown-parsed' ) ) {
-
-				section.setAttribute( 'data-markdown-parsed', true )
-
-				var notes = section.querySelector( 'aside.notes' );
-				var markdown = getMarkdownFromSlide( section );
-
-				section.innerHTML = marked( markdown );
-				addAttributes( 	section, section, null, section.getAttribute( 'data-element-attributes' ) ||
-								section.parentNode.getAttribute( 'data-element-attributes' ) ||
-								DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
-								section.getAttribute( 'data-attributes' ) ||
-								section.parentNode.getAttribute( 'data-attributes' ) ||
-								DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
-
-				// If there were notes, we need to re-add them after
-				// having overwritten the section's HTML
-				if( notes ) {
-					section.appendChild( notes );
-				}
-
-			}
-
-		}
-
-	}
-
-	// API
-	return {
-
-		initialize: function() {
-			processSlides();
-			convertSlides();
-		},
-
-		// TODO: Do these belong in the API?
-		processSlides: processSlides,
-		convertSlides: convertSlides,
-		slidify: slidify
-
-	};
-
-}));
diff --git a/docs/slides/flops14/reveal.js/plugin/markdown/marked.js b/docs/slides/flops14/reveal.js/plugin/markdown/marked.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/markdown/marked.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
- */
-
-(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
-text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";block.html=replace(block.html)("comment",/\x3c!--[\s\S]*?--\x3e/)("closed",
-/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1",
-"\\2")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm)if(this.options.tables)this.rules=block.tables;else this.rules=block.gfm}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};
-Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1)this.tokens.push({type:"space"})}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,
-"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,
-"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]="center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].split(/ *\| */);this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=
-src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);
-bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+
-1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item[item.length-1]==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script",text:cap[0]});continue}if(top&&
-(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]=
-"center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */);this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1][cap[1].length-1]==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",
-text:cap[0]});continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^\x3c!--[\s\S]*?--\x3e|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
-code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([^\s]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
-em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;
-if(!this.links)throw new Error("Tokens array requires a `links` property.");if(this.options.gfm)if(this.options.breaks)this.rules=inline.breaks;else this.rules=inline.gfm;else if(this.options.pedantic)this.rules=inline.pedantic}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);
-out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1][6]===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.url.exec(src)){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.tag.exec(src)){src=src.substring(cap[0].length);
-out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);out+=this.outputLink(cap,{href:cap[2],title:cap[3]});continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0][0];src=cap[0].substring(1)+src;continue}out+=this.outputLink(cap,link);continue}if(cap=this.rules.strong.exec(src)){src=
-src.substring(cap[0].length);out+="<strong>"+this.output(cap[2]||cap[1])+"</strong>";continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+="<em>"+this.output(cap[2]||cap[1])+"</em>";continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+="<code>"+escape(cap[2],true)+"</code>";continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+="<br>";continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+="<del>"+
-this.output(cap[1])+"</del>";continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(cap[0]);continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return out};InlineLexer.prototype.outputLink=function(cap,link){if(cap[0][0]!=="!")return'<a href="'+escape(link.href)+'"'+(link.title?' title="'+escape(link.title)+'"':"")+">"+this.output(cap[1])+"</a>";else return'<img src="'+escape(link.href)+'" alt="'+escape(cap[1])+'"'+(link.title?' title="'+
-escape(link.title)+'"':"")+">"};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,"\u2014").replace(/'([^']*)'/g,"\u2018$1\u2019").replace(/"([^"]*)"/g,"\u201c$1\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>0.5)ch="x"+ch.toString(16);out+="&#"+ch+";"}return out};function Parser(options){this.tokens=[];this.token=null;
-this.options=options||marked.defaults}Parser.parse=function(src,options){var parser=new Parser(options);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options);this.tokens=src.reverse();var out="";while(this.next())out+=this.tok();return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;
-while(this.peek().type==="text")body+="\n"+this.next().text;return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case "space":return"";case "hr":return"<hr>\n";case "heading":return"<h"+this.token.depth+">"+this.inline.output(this.token.text)+"</h"+this.token.depth+">\n";case "code":if(this.options.highlight){var code=this.options.highlight(this.token.text,this.token.lang);if(code!=null&&code!==this.token.text){this.token.escaped=true;this.token.text=code}}if(!this.token.escaped)this.token.text=
-escape(this.token.text,true);return"<pre><code"+(this.token.lang?' class="'+this.options.langPrefix+this.token.lang+'"':"")+">"+this.token.text+"</code></pre>\n";case "table":var body="",heading,i,row,cell,j;body+="<thead>\n<tr>\n";for(i=0;i<this.token.header.length;i++){heading=this.inline.output(this.token.header[i]);body+=this.token.align[i]?'<th align="'+this.token.align[i]+'">'+heading+"</th>\n":"<th>"+heading+"</th>\n"}body+="</tr>\n</thead>\n";body+="<tbody>\n";for(i=0;i<this.token.cells.length;i++){row=
-this.token.cells[i];body+="<tr>\n";for(j=0;j<row.length;j++){cell=this.inline.output(row[j]);body+=this.token.align[j]?'<td align="'+this.token.align[j]+'">'+cell+"</td>\n":"<td>"+cell+"</td>\n"}body+="</tr>\n"}body+="</tbody>\n";return"<table>\n"+body+"</table>\n";case "blockquote_start":var body="";while(this.next().type!=="blockquote_end")body+=this.tok();return"<blockquote>\n"+body+"</blockquote>\n";case "list_start":var type=this.token.ordered?"ol":"ul",body="";while(this.next().type!=="list_end")body+=
-this.tok();return"<"+type+">\n"+body+"</"+type+">\n";case "list_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.token.type==="text"?this.parseText():this.tok();return"<li>"+body+"</li>\n";case "loose_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.tok();return"<li>"+body+"</li>\n";case "html":return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;case "paragraph":return"<p>"+this.inline.output(this.token.text)+
-"</p>\n";case "text":return"<p>"+this.parseText()+"</p>\n"}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=
-1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target)if(Object.prototype.hasOwnProperty.call(target,key))obj[key]=target[key]}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}if(opt)opt=merge({},marked.defaults,opt);var tokens=Lexer.lex(tokens,opt),highlight=opt.highlight,pending=0,l=tokens.length,i=0;if(!highlight||highlight.length<3)return callback(null,Parser.parse(tokens,opt));var done=function(){delete opt.highlight;
-var out=Parser.parse(tokens,opt);opt.highlight=highlight;return callback(null,out)};for(;i<l;i++)(function(token){if(token.type!=="code")return;pending++;return highlight(token.text,token.lang,function(err,code){if(code==null||code===token.text)return--pending||done();token.text=code;token.escaped=true;--pending||done()})})(tokens[i]);return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";
-if((opt||marked.defaults).silent)return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>";throw e;}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:""};marked.Parser=Parser;marked.parser=Parser.parse;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;
-marked.parse=marked;if(typeof exports==="object")module.exports=marked;else if(typeof define==="function"&&define.amd)define(function(){return marked});else this.marked=marked}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
diff --git a/docs/slides/flops14/reveal.js/plugin/math/math.js b/docs/slides/flops14/reveal.js/plugin/math/math.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/math/math.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * A plugin which enables rendering of math equations inside
- * of reveal.js slides. Essentially a thin wrapper for MathJax.
- *
- * @author Hakim El Hattab
- */
-var RevealMath = window.RevealMath || (function(){
-
-	var options = Reveal.getConfig().math || {};
-	options.mathjax = options.mathjax || 'http://cdn.mathjax.org/mathjax/latest/MathJax.js';
-	options.config = options.config || 'TeX-AMS_HTML-full';
-
-	loadScript( options.mathjax + '?config=' + options.config, function() {
-
-		MathJax.Hub.Config({
-			messageStyle: 'none',
-			tex2jax: { inlineMath: [['$','$'],['\\(','\\)']] },
-			skipStartupTypeset: true
-		});
-
-		// Typeset followed by an immediate reveal.js layout since
-		// the typesetting process could affect slide height
-		MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] );
-		MathJax.Hub.Queue( Reveal.layout );
-
-		// Reprocess equations in slides when they turn visible
-		Reveal.addEventListener( 'slidechanged', function( event ) {
-
-			MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] );
-
-		} );
-
-	} );
-
-	function loadScript( url, callback ) {
-
-		var head = document.querySelector( 'head' );
-		var script = document.createElement( 'script' );
-		script.type = 'text/javascript';
-		script.src = url;
-
-		// Wrapper for callback to make sure it only fires once
-		var finish = function() {
-			if( typeof callback === 'function' ) {
-				callback.call();
-				callback = null;
-			}
-		}
-
-		script.onload = finish;
-
-		// IE
-		script.onreadystatechange = function() {
-			if ( this.readyState === 'loaded' ) {
-				finish();
-			}
-		}
-
-		// Normal browsers
-		head.appendChild( script );
-
-	}
-
-})();
diff --git a/docs/slides/flops14/reveal.js/plugin/multiplex/client.js b/docs/slides/flops14/reveal.js/plugin/multiplex/client.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/multiplex/client.js
+++ /dev/null
@@ -1,13 +0,0 @@
-(function() {
-	var multiplex = Reveal.getConfig().multiplex;
-	var socketId = multiplex.id;
-	var socket = io.connect(multiplex.url);
-
-	socket.on(multiplex.id, function(data) {
-		// ignore data from sockets that aren't ours
-		if (data.socketId !== socketId) { return; }
-		if( window.location.host === 'localhost:1947' ) return;
-
-		Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote');
-	});
-}());
diff --git a/docs/slides/flops14/reveal.js/plugin/multiplex/index.js b/docs/slides/flops14/reveal.js/plugin/multiplex/index.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/multiplex/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var express		= require('express');
-var fs			= require('fs');
-var io			= require('socket.io');
-var crypto		= require('crypto');
-
-var app			= express.createServer();
-var staticDir	= express.static;
-
-io				= io.listen(app);
-
-var opts = {
-	port: 1948,
-	baseDir : __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		if (typeof slideData.secret == 'undefined' || slideData.secret == null || slideData.secret === '') return;
-		if (createHash(slideData.secret) === slideData.socketId) {
-			slideData.secret = null;
-			socket.broadcast.emit(slideData.socketId, slideData);
-		};
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/token", function(req,res) {
-	var ts = new Date().getTime();
-	var rand = Math.floor(Math.random()*9999999);
-	var secret = ts.toString() + rand.toString();
-	res.send({secret: secret, socketId: createHash(secret)});
-});
-
-var createHash = function(secret) {
-	var cipher = crypto.createCipher('blowfish', secret);
-	return(cipher.final('hex'));
-};
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset );
diff --git a/docs/slides/flops14/reveal.js/plugin/multiplex/master.js b/docs/slides/flops14/reveal.js/plugin/multiplex/master.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/multiplex/master.js
+++ /dev/null
@@ -1,51 +0,0 @@
-(function() {
-	// Don't emit events from inside of notes windows
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var multiplex = Reveal.getConfig().multiplex;
-
-	var socket = io.connect(multiplex.url);
-
-	var notify = function( slideElement, indexh, indexv, origin ) {
-		if( typeof origin === 'undefined' && origin !== 'remote' ) {
-			var nextindexh;
-			var nextindexv;
-
-			var fragmentindex = Reveal.getIndices().f;
-			if (typeof fragmentindex == 'undefined') {
-				fragmentindex = 0;
-			}
-
-			if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-				nextindexh = indexh;
-				nextindexv = indexv + 1;
-			} else {
-				nextindexh = indexh + 1;
-				nextindexv = 0;
-			}
-
-			var slideData = {
-				indexh : indexh,
-				indexv : indexv,
-				indexf : fragmentindex,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				secret: multiplex.secret,
-				socketId : multiplex.id
-			};
-
-			socket.emit('slidechanged', slideData);
-		}
-	}
-
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		notify( event.currentSlide, event.indexh, event.indexv, event.origin );
-	} );
-
-	var fragmentNotify = function( event ) {
-		notify( Reveal.getCurrentSlide(), Reveal.getIndices().h, Reveal.getIndices().v, event.origin );
-	};
-
-	Reveal.addEventListener( 'fragmentshown', fragmentNotify );
-	Reveal.addEventListener( 'fragmenthidden', fragmentNotify );
-}());
diff --git a/docs/slides/flops14/reveal.js/plugin/notes-server/client.js b/docs/slides/flops14/reveal.js/plugin/notes-server/client.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/notes-server/client.js
+++ /dev/null
@@ -1,57 +0,0 @@
-(function() {
-	// don't emit events from inside the previews themselves
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var socket = io.connect(window.location.origin);
-	var socketId = Math.random().toString().slice(2);
-	
-	console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
-	window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);
-
-	// Fires when a fragment is shown
-	Reveal.addEventListener( 'fragmentshown', function( event ) {
-		var fragmentData = {
-			fragment : 'next',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when a fragment is hidden
-	Reveal.addEventListener( 'fragmenthidden', function( event ) {
-		var fragmentData = {
-			fragment : 'previous',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when slide is changed
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		var nextindexh;
-		var nextindexv;
-		var slideElement = event.currentSlide;
-
-		if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-			nextindexh = event.indexh;
-			nextindexv = event.indexv + 1;
-		} else {
-			nextindexh = event.indexh + 1;
-			nextindexv = 0;
-		}
-
-		var notes = slideElement.querySelector('aside.notes');
-		var slideData = {
-			notes : notes ? notes.innerHTML : '',
-			indexh : event.indexh,
-			indexv : event.indexv,
-			nextindexh : nextindexh,
-			nextindexv : nextindexv,
-			socketId : socketId,
-			markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false
-
-		};
-
-		socket.emit('slidechanged', slideData);
-	} );
-}());
diff --git a/docs/slides/flops14/reveal.js/plugin/notes-server/index.js b/docs/slides/flops14/reveal.js/plugin/notes-server/index.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/notes-server/index.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var express   = require('express');
-var fs        = require('fs');
-var io        = require('socket.io');
-var _         = require('underscore');
-var Mustache  = require('mustache');
-
-var app       = express.createServer();
-var staticDir = express.static;
-
-io            = io.listen(app);
-
-var opts = {
-	port :      1947,
-	baseDir :   __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		socket.broadcast.emit('slidedata', slideData);
-	});
-	socket.on('fragmentchanged', function(fragmentData) {
-		socket.broadcast.emit('fragmentdata', fragmentData);
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/notes/:socketId", function(req, res) {
-
-	fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
-		res.send(Mustache.to_html(data.toString(), {
-			socketId : req.params.socketId
-		}));
-	});
-	// fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
-});
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
-
-console.log( brown + "reveal.js - Speaker Notes" + reset );
-console.log( "1. Open the slides at " + green + slidesLocation + reset );
-console.log( "2. Click on the link your JS console to go to the notes page" );
-console.log( "3. Advance through your slides and your notes will advance automatically" );
diff --git a/docs/slides/flops14/reveal.js/plugin/notes/notes.js b/docs/slides/flops14/reveal.js/plugin/notes/notes.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/notes/notes.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Handles opening of and synchronization with the reveal.js
- * notes window.
- */
-var RevealNotes = (function() {
-
-	function openNotes() {
-		var jsFileLocation = document.querySelector('script[src$="notes.js"]').src;  // this js file path
-		jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, '');   // the js folder path
-		var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
-
-		// Fires when slide is changed
-		Reveal.addEventListener( 'slidechanged', post );
-
-		// Fires when a fragment is shown
-		Reveal.addEventListener( 'fragmentshown', post );
-
-		// Fires when a fragment is hidden
-		Reveal.addEventListener( 'fragmenthidden', post );
-
-		/**
-		 * Posts the current slide data to the notes window
-		 */
-		function post() {
-			var slideElement = Reveal.getCurrentSlide(),
-				slideIndices = Reveal.getIndices(),
-				messageData;
-
-			var notes = slideElement.querySelector( 'aside.notes' ),
-				nextindexh,
-				nextindexv;
-
-			if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
-				nextindexh = slideIndices.h;
-				nextindexv = slideIndices.v + 1;
-			} else {
-				nextindexh = slideIndices.h + 1;
-				nextindexv = 0;
-			}
-
-			messageData = {
-				notes : notes ? notes.innerHTML : '',
-				indexh : slideIndices.h,
-				indexv : slideIndices.v,
-				indexf : slideIndices.f,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
-			};
-
-			notesPopup.postMessage( JSON.stringify( messageData ), '*' );
-		}
-
-		// Navigate to the current slide when the notes are loaded
-		notesPopup.addEventListener( 'load', function( event ) {
-			post();
-		}, false );
-	}
-
-	// If the there's a 'notes' query set, open directly
-	if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
-		openNotes();
-	}
-
-	// Open the notes when the 's' key is hit
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openNotes();
-		}
-	}, false );
-
-	return { open: openNotes };
-})();
diff --git a/docs/slides/flops14/reveal.js/plugin/postmessage/postmessage.js b/docs/slides/flops14/reveal.js/plugin/postmessage/postmessage.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/postmessage/postmessage.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-
-	simple postmessage plugin
-
-	Useful when a reveal slideshow is inside an iframe.
-	It allows to call reveal methods from outside.
-
-	Example:
-		 var reveal =  window.frames[0];
-
-		 // Reveal.prev(); 
-		 reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
-		 // Reveal.next(); 
-		 reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
-		 // Reveal.slide(2, 2); 
-		 reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
-
-	Add to the slideshow:
-
-		dependencies: [
-			...
-			{ src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
-		]
-
-*/
-
-(function (){
-
-	window.addEventListener( "message", function ( event ) {
-		var data = JSON.parse( event.data ),
-				method = data.method,
-				args = data.args;
-
-		if( typeof Reveal[method] === 'function' ) {
-			Reveal[method].apply( Reveal, data.args );
-		}
-	}, false);
-
-}());
-
-
-
diff --git a/docs/slides/flops14/reveal.js/plugin/print-pdf/print-pdf.js b/docs/slides/flops14/reveal.js/plugin/print-pdf/print-pdf.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/print-pdf/print-pdf.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * phantomjs script for printing presentations to PDF.
- *
- * Example:
- * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
- *
- * By Manuel Bieh (https://github.com/manuelbieh)
- */
-
-// html2pdf.js
-var page = new WebPage();
-var system = require( 'system' );
-
-page.viewportSize  = {
-	width: 1024,
-	height: 768
-};
-
-page.paperSize = {
-	format: 'letter',
-	orientation: 'landscape',
-	margin: {
-		left: '0',
-		right: '0',
-		top: '0',
-		bottom: '0'
-	}
-};
-
-var revealFile = system.args[1] || 'index.html?print-pdf';
-var slideFile = system.args[2] || 'slides.pdf';
-
-if( slideFile.match( /\.pdf$/gi ) === null ) {
-	slideFile += '.pdf';
-}
-
-console.log( 'Printing PDF...' );
-
-page.open( revealFile, function( status ) {
-	console.log( 'Printed succesfully' );
-	page.render( slideFile );
-	phantom.exit();
-} );
-
diff --git a/docs/slides/flops14/reveal.js/plugin/remotes/remotes.js b/docs/slides/flops14/reveal.js/plugin/remotes/remotes.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/remotes/remotes.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Touch-based remote controller for your presentation courtesy 
- * of the folks at http://remotes.io
- */
-
-(function(window){
-
-    /**
-     * Detects if we are dealing with a touch enabled device (with some false positives)
-     * Borrowed from modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touch.js   
-     */
-    var hasTouch  = (function(){
-        return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
-    })();
-
-    /**
-     * Detects if notes are enable and the current page is opened inside an /iframe
-     * this prevents loading Remotes.io several times
-     */
-    var isNotesAndIframe = (function(){
-        return window.RevealNotes && !(self == top);
-    })();
-
-    if(!hasTouch && !isNotesAndIframe){
-        head.ready( 'remotes.ne.min.js', function() {
-            new Remotes("preview")
-                .on("swipe-left", function(e){ Reveal.right(); })
-                .on("swipe-right", function(e){ Reveal.left(); })
-                .on("swipe-up", function(e){ Reveal.down(); })
-                .on("swipe-down", function(e){ Reveal.up(); })
-                .on("tap", function(e){ Reveal.next(); })
-                .on("zoom-out", function(e){ Reveal.toggleOverview(true); })
-                .on("zoom-in", function(e){ Reveal.toggleOverview(false); })
-            ;
-        } );
-
-        head.js('https://hakim-static.s3.amazonaws.com/reveal-js/remotes.ne.min.js');
-    }
-})(window);
diff --git a/docs/slides/flops14/reveal.js/plugin/search/search.js b/docs/slides/flops14/reveal.js/plugin/search/search.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/search/search.js
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
- * by navigatating to that slide and highlighting it.
- *
- * By Jon Snyder <snyder.jon@gmail.com>, February 2013
- */
-
-var RevealSearch = (function() {
-
-	var matchedSlides;
-	var currentMatchedIndex;
-	var searchboxDirty;
-	var myHilitor;
-
-// Original JavaScript code by Chirp Internet: www.chirp.com.au
-// Please acknowledge use of this code by including this header.
-// 2/2013 jon: modified regex to display any match, not restricted to word boundaries.
-
-function Hilitor(id, tag)
-{
-
-  var targetNode = document.getElementById(id) || document.body;
-  var hiliteTag = tag || "EM";
-  var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM|SPAN)$");
-  var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"];
-  var wordColor = [];
-  var colorIdx = 0;
-  var matchRegex = "";
-  var matchingSlides = [];
-
-  this.setRegex = function(input)
-  {
-    input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|");
-    matchRegex = new RegExp("(" + input + ")","i");
-  }
-
-  this.getRegex = function()
-  {
-    return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " ");
-  }
-
-  // recursively apply word highlighting
-  this.hiliteWords = function(node)
-  {
-    if(node == undefined || !node) return;
-    if(!matchRegex) return;
-    if(skipTags.test(node.nodeName)) return;
-
-    if(node.hasChildNodes()) {
-      for(var i=0; i < node.childNodes.length; i++)
-        this.hiliteWords(node.childNodes[i]);
-    }
-    if(node.nodeType == 3) { // NODE_TEXT
-      if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) {
-      	//find the slide's section element and save it in our list of matching slides
-      	var secnode = node.parentNode;
-      	while (secnode.nodeName != 'SECTION') {
-      		secnode = secnode.parentNode;
-      	}
-      	
-      	var slideIndex = Reveal.getIndices(secnode);
-      	var slidelen = matchingSlides.length;
-      	var alreadyAdded = false;
-      	for (var i=0; i < slidelen; i++) {
-      		if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) {
-      			alreadyAdded = true;
-      		}
-      	}
-      	if (! alreadyAdded) {
-      		matchingSlides.push(slideIndex);
-      	}
-      	
-        if(!wordColor[regs[0].toLowerCase()]) {
-          wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
-        }
-
-        var match = document.createElement(hiliteTag);
-        match.appendChild(document.createTextNode(regs[0]));
-        match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
-        match.style.fontStyle = "inherit";
-        match.style.color = "#000";
-
-        var after = node.splitText(regs.index);
-        after.nodeValue = after.nodeValue.substring(regs[0].length);
-        node.parentNode.insertBefore(match, after);
-      }
-    }
-  };
-
-  // remove highlighting
-  this.remove = function()
-  {
-    var arr = document.getElementsByTagName(hiliteTag);
-    while(arr.length && (el = arr[0])) {
-      el.parentNode.replaceChild(el.firstChild, el);
-    }
-  };
-
-  // start highlighting at target node
-  this.apply = function(input)
-  {
-    if(input == undefined || !input) return;
-    this.remove();
-    this.setRegex(input);
-    this.hiliteWords(targetNode);
-    return matchingSlides;
-  };
-
-}
-
-	function openSearch() {
-		//ensure the search term input dialog is visible and has focus:
-		var inputbox = document.getElementById("searchinput");
-		inputbox.style.display = "inline";
-		inputbox.focus();
-		inputbox.select();
-	}
-
-	function toggleSearch() {
-		var inputbox = document.getElementById("searchinput");
-		if (inputbox.style.display !== "inline") {
-			openSearch();
-		}
-		else {
-			inputbox.style.display = "none";
-			myHilitor.remove();
-		}
-	}
-
-	function doSearch() {
-		//if there's been a change in the search term, perform a new search:
-		if (searchboxDirty) {
-			var searchstring = document.getElementById("searchinput").value;
-
-			//find the keyword amongst the slides
-			myHilitor = new Hilitor("slidecontent");
-			matchedSlides = myHilitor.apply(searchstring);
-			currentMatchedIndex = 0;
-		}
-
-		//navigate to the next slide that has the keyword, wrapping to the first if necessary
-		if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) {
-			currentMatchedIndex = 0;
-		}
-		if (matchedSlides.length > currentMatchedIndex) {
-			Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v);
-			currentMatchedIndex++;
-		}
-	}
-
-	var dom = {};
-	dom.wrapper = document.querySelector( '.reveal' );
-
-	if( !dom.wrapper.querySelector( '.searchbox' ) ) {
-			var searchElement = document.createElement( 'div' );
-			searchElement.id = "searchinputdiv";
-			searchElement.classList.add( 'searchdiv' );
-      searchElement.style.position = 'absolute';
-      searchElement.style.top = '10px';
-      searchElement.style.left = '10px';
-      //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/:
-			searchElement.innerHTML = '<span><input type="search" id="searchinput" class="searchinput" style="vertical-align: top;"/><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJiSURBVHjatFZNaxNBGH5md+Mmu92NVdKDRipSAyqCghgQD4L4cRe86UUtAQ+eFCxoa4/25EXBFi8eBE+eRPoDhB6KgiiixdAPCEkx2pjvTXadd9yNsflwuyUDD/O+u8PzzDPvzOwyx3EwyCZhwG3gAkp7MnpjgbopjsltcD4gjuXZZKeAR348MYLYTm3LzOs/y3j3JTfZxgXWXmTuwPHIc4VmoOmv5IrI53+AO2DdHLjkDWQ3GoEEVFXtXQOvkSnPWcyUceviLhwbDYv8/XIVj97kse7TodLvZXxYxrPUHkQ1ufXs3FEdybEIxucySOesoNvUgWU1cP3MkCBfTFdw9fGaAMVmRELq7LBw2Q3/FaAxxWIRpw+ZIr/7IouPqzUBiqmdHAv7EuhRAwf1er2Vy4x1jW3b2d5Jfvu5IPp7l2LYbcgCFFNb+FoJ7oBqEAqFMPNqFcmEgVMJDfMT+1tvN0pNjERlMS6QA5pFOKxiKVPFhakPeL3It+WGJUDxt2wFR+JhzI7v5ctkd8DXOZAkCYYxhO+lKm4+Xfqz/rIixBuNBl7eOYzkQQNzqX249mRl6zUgEcYkaJrGhUwBinVdh6IouPzwE6/DL5w4oLkH8y981aDf+uq6hlKpJESiUdNfDZi7/ehG9K6KfiA3pml0PLcsq+cSMTj2NL9ukc4UOmz7AZ3+crkC4mHujFvXNaMFB3bEr8xPS6p5O+jXxq4VZtaen7/PwzrntjcLUE0iHPS1Ud1cdiEJl/8WivZk0wXd7zWOMkeF8s0CcAmkNrC2nvXZDbbbN73ccYnZoH9bfgswAFzAe9/h3dbKAAAAAElFTkSuQmCC" id="searchbutton" class="searchicon" style="vertical-align: top; margin-top: -1px;"/></span>';
-			dom.wrapper.appendChild( searchElement );
-	}
-
-	document.getElementById("searchbutton").addEventListener( 'click', function(event) {
-		doSearch();
-	}, false );
-
-	document.getElementById("searchinput").addEventListener( 'keyup', function( event ) {
-		switch (event.keyCode) {
-			case 13:
-				event.preventDefault();
-				doSearch();
-				searchboxDirty = false;
-				break;
-			default:
-				searchboxDirty = true;
-		}
-	}, false );
-
-	// Open the search when the 's' key is hit (yes, this conflicts with the notes plugin, disabling for now)
-	/*
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openSearch();
-		}
-	}, false );
-*/
-	return { open: openSearch };
-})();
diff --git a/docs/slides/flops14/reveal.js/plugin/zoom-js/zoom.js b/docs/slides/flops14/reveal.js/plugin/zoom-js/zoom.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/plugin/zoom-js/zoom.js
+++ /dev/null
@@ -1,258 +0,0 @@
-// Custom reveal.js integration
-(function(){
-	var isEnabled = true;
-
-	document.querySelector( '.reveal' ).addEventListener( 'mousedown', function( event ) {
-		var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : 'alt' ) + 'Key';
-
-		if( event[ modifier ] && isEnabled ) {
-			event.preventDefault();
-			zoom.to({ element: event.target, pan: false });
-		}
-	} );
-
-	Reveal.addEventListener( 'overviewshown', function() { isEnabled = false; } );
-	Reveal.addEventListener( 'overviewhidden', function() { isEnabled = true; } );
-})();
-
-/*!
- * zoom.js 0.2 (modified version for use with reveal.js)
- * http://lab.hakim.se/zoom-js
- * MIT licensed
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var zoom = (function(){
-
-	// The current zoom level (scale)
-	var level = 1;
-
-	// The current mouse position, used for panning
-	var mouseX = 0,
-		mouseY = 0;
-
-	// Timeout before pan is activated
-	var panEngageTimeout = -1,
-		panUpdateInterval = -1;
-
-	var currentOptions = null;
-
-	// Check for transform support so that we can fallback otherwise
-	var supportsTransforms = 	'WebkitTransform' in document.body.style ||
-								'MozTransform' in document.body.style ||
-								'msTransform' in document.body.style ||
-								'OTransform' in document.body.style ||
-								'transform' in document.body.style;
-
-	if( supportsTransforms ) {
-		// The easing that will be applied when we zoom in/out
-		document.body.style.transition = 'transform 0.8s ease';
-		document.body.style.OTransition = '-o-transform 0.8s ease';
-		document.body.style.msTransition = '-ms-transform 0.8s ease';
-		document.body.style.MozTransition = '-moz-transform 0.8s ease';
-		document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';
-	}
-
-	// Zoom out if the user hits escape
-	document.addEventListener( 'keyup', function( event ) {
-		if( level !== 1 && event.keyCode === 27 ) {
-			zoom.out();
-		}
-	}, false );
-
-	// Monitor mouse movement for panning
-	document.addEventListener( 'mousemove', function( event ) {
-		if( level !== 1 ) {
-			mouseX = event.clientX;
-			mouseY = event.clientY;
-		}
-	}, false );
-
-	/**
-	 * Applies the CSS required to zoom in, prioritizes use of CSS3
-	 * transforms but falls back on zoom for IE.
-	 *
-	 * @param {Number} pageOffsetX
-	 * @param {Number} pageOffsetY
-	 * @param {Number} elementOffsetX
-	 * @param {Number} elementOffsetY
-	 * @param {Number} scale
-	 */
-	function magnify( pageOffsetX, pageOffsetY, elementOffsetX, elementOffsetY, scale ) {
-
-		if( supportsTransforms ) {
-			var origin = pageOffsetX +'px '+ pageOffsetY +'px',
-				transform = 'translate('+ -elementOffsetX +'px,'+ -elementOffsetY +'px) scale('+ scale +')';
-
-			document.body.style.transformOrigin = origin;
-			document.body.style.OTransformOrigin = origin;
-			document.body.style.msTransformOrigin = origin;
-			document.body.style.MozTransformOrigin = origin;
-			document.body.style.WebkitTransformOrigin = origin;
-
-			document.body.style.transform = transform;
-			document.body.style.OTransform = transform;
-			document.body.style.msTransform = transform;
-			document.body.style.MozTransform = transform;
-			document.body.style.WebkitTransform = transform;
-		}
-		else {
-			// Reset all values
-			if( scale === 1 ) {
-				document.body.style.position = '';
-				document.body.style.left = '';
-				document.body.style.top = '';
-				document.body.style.width = '';
-				document.body.style.height = '';
-				document.body.style.zoom = '';
-			}
-			// Apply scale
-			else {
-				document.body.style.position = 'relative';
-				document.body.style.left = ( - ( pageOffsetX + elementOffsetX ) / scale ) + 'px';
-				document.body.style.top = ( - ( pageOffsetY + elementOffsetY ) / scale ) + 'px';
-				document.body.style.width = ( scale * 100 ) + '%';
-				document.body.style.height = ( scale * 100 ) + '%';
-				document.body.style.zoom = scale;
-			}
-		}
-
-		level = scale;
-
-		if( level !== 1 && document.documentElement.classList ) {
-			document.documentElement.classList.add( 'zoomed' );
-		}
-		else {
-			document.documentElement.classList.remove( 'zoomed' );
-		}
-	}
-
-	/**
-	 * Pan the document when the mosue cursor approaches the edges
-	 * of the window.
-	 */
-	function pan() {
-		var range = 0.12,
-			rangeX = window.innerWidth * range,
-			rangeY = window.innerHeight * range,
-			scrollOffset = getScrollOffset();
-
-		// Up
-		if( mouseY < rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
-		}
-		// Down
-		else if( mouseY > window.innerHeight - rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
-		}
-
-		// Left
-		if( mouseX < rangeX ) {
-			window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
-		}
-		// Right
-		else if( mouseX > window.innerWidth - rangeX ) {
-			window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
-		}
-	}
-
-	function getScrollOffset() {
-		return {
-			x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
-			y: window.scrollY !== undefined ? window.scrollY : window.pageXYffset
-		}
-	}
-
-	return {
-		/**
-		 * Zooms in on either a rectangle or HTML element.
-		 *
-		 * @param {Object} options
-		 *   - element: HTML element to zoom in on
-		 *   OR
-		 *   - x/y: coordinates in non-transformed space to zoom in on
-		 *   - width/height: the portion of the screen to zoom in on
-		 *   - scale: can be used instead of width/height to explicitly set scale
-		 */
-		to: function( options ) {
-			// Due to an implementation limitation we can't zoom in
-			// to another element without zooming out first
-			if( level !== 1 ) {
-				zoom.out();
-			}
-			else {
-				options.x = options.x || 0;
-				options.y = options.y || 0;
-
-				// If an element is set, that takes precedence
-				if( !!options.element ) {
-					// Space around the zoomed in element to leave on screen
-					var padding = 20;
-
-					options.width = options.element.getBoundingClientRect().width + ( padding * 2 );
-					options.height = options.element.getBoundingClientRect().height + ( padding * 2 );
-					options.x = options.element.getBoundingClientRect().left - padding;
-					options.y = options.element.getBoundingClientRect().top - padding;
-				}
-
-				// If width/height values are set, calculate scale from those values
-				if( options.width !== undefined && options.height !== undefined ) {
-					options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
-				}
-
-				if( options.scale > 1 ) {
-					options.x *= options.scale;
-					options.y *= options.scale;
-
-					var scrollOffset = getScrollOffset();
-
-					if( options.element ) {
-						scrollOffset.x -= ( window.innerWidth - ( options.width * options.scale ) ) / 2;
-					}
-
-					magnify( scrollOffset.x, scrollOffset.y, options.x, options.y, options.scale );
-
-					if( options.pan !== false ) {
-
-						// Wait with engaging panning as it may conflict with the
-						// zoom transition
-						panEngageTimeout = setTimeout( function() {
-							panUpdateInterval = setInterval( pan, 1000 / 60 );
-						}, 800 );
-
-					}
-				}
-
-				currentOptions = options;
-			}
-		},
-
-		/**
-		 * Resets the document zoom state to its default.
-		 */
-		out: function() {
-			clearTimeout( panEngageTimeout );
-			clearInterval( panUpdateInterval );
-
-			var scrollOffset = getScrollOffset();
-
-			if( currentOptions && currentOptions.element ) {
-				scrollOffset.x -= ( window.innerWidth - ( currentOptions.width * currentOptions.scale ) ) / 2;
-			}
-
-			magnify( scrollOffset.x, scrollOffset.y, 0, 0, 1 );
-
-			level = 1;
-		},
-
-		// Alias
-		magnify: function( options ) { this.to( options ) },
-		reset: function() { this.out() },
-
-		zoomLevel: function() {
-			return level;
-		}
-	}
-
-})();
-
diff --git a/docs/slides/flops14/reveal.js/test/examples/assets/image1.png b/docs/slides/flops14/reveal.js/test/examples/assets/image1.png
deleted file mode 100644
Binary files a/docs/slides/flops14/reveal.js/test/examples/assets/image1.png and /dev/null differ
diff --git a/docs/slides/flops14/reveal.js/test/examples/assets/image2.png b/docs/slides/flops14/reveal.js/test/examples/assets/image2.png
deleted file mode 100644
Binary files a/docs/slides/flops14/reveal.js/test/examples/assets/image2.png and /dev/null differ
diff --git a/docs/slides/flops14/reveal.js/test/qunit-1.12.0.css b/docs/slides/flops14/reveal.js/test/qunit-1.12.0.css
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/test/qunit-1.12.0.css
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-	margin: 0;
-	padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-	padding: 0.5em 0 0.5em 1em;
-
-	color: #8699a4;
-	background-color: #0d3349;
-
-	font-size: 1.5em;
-	line-height: 1em;
-	font-weight: normal;
-
-	border-radius: 5px 5px 0 0;
-	-moz-border-radius: 5px 5px 0 0;
-	-webkit-border-top-right-radius: 5px;
-	-webkit-border-top-left-radius: 5px;
-}
-
-#qunit-header a {
-	text-decoration: none;
-	color: #c2ccd1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-	color: #fff;
-}
-
-#qunit-testrunner-toolbar label {
-	display: inline-block;
-	padding: 0 .5em 0 .1em;
-}
-
-#qunit-banner {
-	height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-	padding: 0.5em 0 0.5em 2em;
-	color: #5E740B;
-	background-color: #eee;
-	overflow: hidden;
-}
-
-#qunit-userAgent {
-	padding: 0.5em 0 0.5em 2.5em;
-	background-color: #2b81af;
-	color: #fff;
-	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
-	float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-	list-style-position: inside;
-}
-
-#qunit-tests li {
-	padding: 0.4em 0.5em 0.4em 2.5em;
-	border-bottom: 1px solid #fff;
-	list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
-	display: none;
-}
-
-#qunit-tests li strong {
-	cursor: pointer;
-}
-
-#qunit-tests li a {
-	padding: 0.5em;
-	color: #c2ccd1;
-	text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-	color: #000;
-}
-
-#qunit-tests li .runtime {
-	float: right;
-	font-size: smaller;
-}
-
-.qunit-assert-list {
-	margin-top: 0.5em;
-	padding: 0.5em;
-
-	background-color: #fff;
-
-	border-radius: 5px;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-}
-
-.qunit-collapsed {
-	display: none;
-}
-
-#qunit-tests table {
-	border-collapse: collapse;
-	margin-top: .2em;
-}
-
-#qunit-tests th {
-	text-align: right;
-	vertical-align: top;
-	padding: 0 .5em 0 0;
-}
-
-#qunit-tests td {
-	vertical-align: top;
-}
-
-#qunit-tests pre {
-	margin: 0;
-	white-space: pre-wrap;
-	word-wrap: break-word;
-}
-
-#qunit-tests del {
-	background-color: #e0f2be;
-	color: #374e0c;
-	text-decoration: none;
-}
-
-#qunit-tests ins {
-	background-color: #ffcaca;
-	color: #500;
-	text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: black; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-	padding: 5px;
-	background-color: #fff;
-	border-bottom: none;
-	list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-	color: #3c510c;
-	background-color: #fff;
-	border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-	color: #710909;
-	background-color: #fff;
-	border-left: 10px solid #EE5757;
-	white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-	border-radius: 0 0 5px 5px;
-	-moz-border-radius: 0 0 5px 5px;
-	-webkit-border-bottom-right-radius: 5px;
-	-webkit-border-bottom-left-radius: 5px;
-}
-
-#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: green;   }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
-	padding: 0.5em 0.5em 0.5em 2.5em;
-
-	color: #2b81af;
-	background-color: #D2E0E6;
-
-	border-bottom: 1px solid white;
-}
-#qunit-testresult .module-name {
-	font-weight: bold;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-	position: absolute;
-	top: -10000px;
-	left: -10000px;
-	width: 1000px;
-	height: 1000px;
-}
diff --git a/docs/slides/flops14/reveal.js/test/qunit-1.12.0.js b/docs/slides/flops14/reveal.js/test/qunit-1.12.0.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/test/qunit-1.12.0.js
+++ /dev/null
@@ -1,2212 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * https://jquery.org/license/
- */
-
-(function( window ) {
-
-var QUnit,
-	assert,
-	config,
-	onErrorFnPrev,
-	testId = 0,
-	fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
-	toString = Object.prototype.toString,
-	hasOwn = Object.prototype.hasOwnProperty,
-	// Keep a local reference to Date (GH-283)
-	Date = window.Date,
-	setTimeout = window.setTimeout,
-	defined = {
-		setTimeout: typeof window.setTimeout !== "undefined",
-		sessionStorage: (function() {
-			var x = "qunit-test-string";
-			try {
-				sessionStorage.setItem( x, x );
-				sessionStorage.removeItem( x );
-				return true;
-			} catch( e ) {
-				return false;
-			}
-		}())
-	},
-	/**
-	 * Provides a normalized error string, correcting an issue
-	 * with IE 7 (and prior) where Error.prototype.toString is
-	 * not properly implemented
-	 *
-	 * Based on http://es5.github.com/#x15.11.4.4
-	 *
-	 * @param {String|Error} error
-	 * @return {String} error message
-	 */
-	errorString = function( error ) {
-		var name, message,
-			errorString = error.toString();
-		if ( errorString.substring( 0, 7 ) === "[object" ) {
-			name = error.name ? error.name.toString() : "Error";
-			message = error.message ? error.message.toString() : "";
-			if ( name && message ) {
-				return name + ": " + message;
-			} else if ( name ) {
-				return name;
-			} else if ( message ) {
-				return message;
-			} else {
-				return "Error";
-			}
-		} else {
-			return errorString;
-		}
-	},
-	/**
-	 * Makes a clone of an object using only Array or Object as base,
-	 * and copies over the own enumerable properties.
-	 *
-	 * @param {Object} obj
-	 * @return {Object} New object with only the own properties (recursively).
-	 */
-	objectValues = function( obj ) {
-		// Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
-		/*jshint newcap: false */
-		var key, val,
-			vals = QUnit.is( "array", obj ) ? [] : {};
-		for ( key in obj ) {
-			if ( hasOwn.call( obj, key ) ) {
-				val = obj[key];
-				vals[key] = val === Object(val) ? objectValues(val) : val;
-			}
-		}
-		return vals;
-	};
-
-function Test( settings ) {
-	extend( this, settings );
-	this.assertions = [];
-	this.testNumber = ++Test.count;
-}
-
-Test.count = 0;
-
-Test.prototype = {
-	init: function() {
-		var a, b, li,
-			tests = id( "qunit-tests" );
-
-		if ( tests ) {
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml;
-
-			// `a` initialized at top of scope
-			a = document.createElement( "a" );
-			a.innerHTML = "Rerun";
-			a.href = QUnit.url({ testNumber: this.testNumber });
-
-			li = document.createElement( "li" );
-			li.appendChild( b );
-			li.appendChild( a );
-			li.className = "running";
-			li.id = this.id = "qunit-test-output" + testId++;
-
-			tests.appendChild( li );
-		}
-	},
-	setup: function() {
-		if (
-			// Emit moduleStart when we're switching from one module to another
-			this.module !== config.previousModule ||
-				// They could be equal (both undefined) but if the previousModule property doesn't
-				// yet exist it means this is the first test in a suite that isn't wrapped in a
-				// module, in which case we'll just emit a moduleStart event for 'undefined'.
-				// Without this, reporters can get testStart before moduleStart  which is a problem.
-				!hasOwn.call( config, "previousModule" )
-		) {
-			if ( hasOwn.call( config, "previousModule" ) ) {
-				runLoggingCallbacks( "moduleDone", QUnit, {
-					name: config.previousModule,
-					failed: config.moduleStats.bad,
-					passed: config.moduleStats.all - config.moduleStats.bad,
-					total: config.moduleStats.all
-				});
-			}
-			config.previousModule = this.module;
-			config.moduleStats = { all: 0, bad: 0 };
-			runLoggingCallbacks( "moduleStart", QUnit, {
-				name: this.module
-			});
-		}
-
-		config.current = this;
-
-		this.testEnvironment = extend({
-			setup: function() {},
-			teardown: function() {}
-		}, this.moduleTestEnvironment );
-
-		this.started = +new Date();
-		runLoggingCallbacks( "testStart", QUnit, {
-			name: this.testName,
-			module: this.module
-		});
-
-		/*jshint camelcase:false */
-
-
-		/**
-		 * Expose the current test environment.
-		 *
-		 * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
-		 */
-		QUnit.current_testEnvironment = this.testEnvironment;
-
-		/*jshint camelcase:true */
-
-		if ( !config.pollution ) {
-			saveGlobal();
-		}
-		if ( config.notrycatch ) {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-			return;
-		}
-		try {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-		} catch( e ) {
-			QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-		}
-	},
-	run: function() {
-		config.current = this;
-
-		var running = id( "qunit-testresult" );
-
-		if ( running ) {
-			running.innerHTML = "Running: <br/>" + this.nameHtml;
-		}
-
-		if ( this.async ) {
-			QUnit.stop();
-		}
-
-		this.callbackStarted = +new Date();
-
-		if ( config.notrycatch ) {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-			return;
-		}
-
-		try {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-		} catch( e ) {
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-
-			QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
-			// else next test will carry the responsibility
-			saveGlobal();
-
-			// Restart the tests if they're blocking
-			if ( config.blocking ) {
-				QUnit.start();
-			}
-		}
-	},
-	teardown: function() {
-		config.current = this;
-		if ( config.notrycatch ) {
-			if ( typeof this.callbackRuntime === "undefined" ) {
-				this.callbackRuntime = +new Date() - this.callbackStarted;
-			}
-			this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			return;
-		} else {
-			try {
-				this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			} catch( e ) {
-				QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-			}
-		}
-		checkPollution();
-	},
-	finish: function() {
-		config.current = this;
-		if ( config.requireExpects && this.expected === null ) {
-			QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
-		} else if ( this.expected !== null && this.expected !== this.assertions.length ) {
-			QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
-		} else if ( this.expected === null && !this.assertions.length ) {
-			QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
-		}
-
-		var i, assertion, a, b, time, li, ol,
-			test = this,
-			good = 0,
-			bad = 0,
-			tests = id( "qunit-tests" );
-
-		this.runtime = +new Date() - this.started;
-		config.stats.all += this.assertions.length;
-		config.moduleStats.all += this.assertions.length;
-
-		if ( tests ) {
-			ol = document.createElement( "ol" );
-			ol.className = "qunit-assert-list";
-
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				assertion = this.assertions[i];
-
-				li = document.createElement( "li" );
-				li.className = assertion.result ? "pass" : "fail";
-				li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
-				ol.appendChild( li );
-
-				if ( assertion.result ) {
-					good++;
-				} else {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-
-			// store result when possible
-			if ( QUnit.config.reorder && defined.sessionStorage ) {
-				if ( bad ) {
-					sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
-				} else {
-					sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
-				}
-			}
-
-			if ( bad === 0 ) {
-				addClass( ol, "qunit-collapsed" );
-			}
-
-			// `b` initialized at top of scope
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-			addEvent(b, "click", function() {
-				var next = b.parentNode.lastChild,
-					collapsed = hasClass( next, "qunit-collapsed" );
-				( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
-			});
-
-			addEvent(b, "dblclick", function( e ) {
-				var target = e && e.target ? e.target : window.event.srcElement;
-				if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
-					target = target.parentNode;
-				}
-				if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-					window.location = QUnit.url({ testNumber: test.testNumber });
-				}
-			});
-
-			// `time` initialized at top of scope
-			time = document.createElement( "span" );
-			time.className = "runtime";
-			time.innerHTML = this.runtime + " ms";
-
-			// `li` initialized at top of scope
-			li = id( this.id );
-			li.className = bad ? "fail" : "pass";
-			li.removeChild( li.firstChild );
-			a = li.firstChild;
-			li.appendChild( b );
-			li.appendChild( a );
-			li.appendChild( time );
-			li.appendChild( ol );
-
-		} else {
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				if ( !this.assertions[i].result ) {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-		}
-
-		runLoggingCallbacks( "testDone", QUnit, {
-			name: this.testName,
-			module: this.module,
-			failed: bad,
-			passed: this.assertions.length - bad,
-			total: this.assertions.length,
-			duration: this.runtime
-		});
-
-		QUnit.reset();
-
-		config.current = undefined;
-	},
-
-	queue: function() {
-		var bad,
-			test = this;
-
-		synchronize(function() {
-			test.init();
-		});
-		function run() {
-			// each of these can by async
-			synchronize(function() {
-				test.setup();
-			});
-			synchronize(function() {
-				test.run();
-			});
-			synchronize(function() {
-				test.teardown();
-			});
-			synchronize(function() {
-				test.finish();
-			});
-		}
-
-		// `bad` initialized at top of scope
-		// defer when previous test run passed, if storage is available
-		bad = QUnit.config.reorder && defined.sessionStorage &&
-						+sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
-
-		if ( bad ) {
-			run();
-		} else {
-			synchronize( run, true );
-		}
-	}
-};
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
-	// call on start of module test to prepend name to all tests
-	module: function( name, testEnvironment ) {
-		config.currentModule = name;
-		config.currentModuleTestEnvironment = testEnvironment;
-		config.modules[name] = true;
-	},
-
-	asyncTest: function( testName, expected, callback ) {
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		QUnit.test( testName, expected, callback, true );
-	},
-
-	test: function( testName, expected, callback, async ) {
-		var test,
-			nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
-
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		if ( config.currentModule ) {
-			nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
-		}
-
-		test = new Test({
-			nameHtml: nameHtml,
-			testName: testName,
-			expected: expected,
-			async: async,
-			callback: callback,
-			module: config.currentModule,
-			moduleTestEnvironment: config.currentModuleTestEnvironment,
-			stack: sourceFromStacktrace( 2 )
-		});
-
-		if ( !validTest( test ) ) {
-			return;
-		}
-
-		test.queue();
-	},
-
-	// Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
-	expect: function( asserts ) {
-		if (arguments.length === 1) {
-			config.current.expected = asserts;
-		} else {
-			return config.current.expected;
-		}
-	},
-
-	start: function( count ) {
-		// QUnit hasn't been initialized yet.
-		// Note: RequireJS (et al) may delay onLoad
-		if ( config.semaphore === undefined ) {
-			QUnit.begin(function() {
-				// This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
-				setTimeout(function() {
-					QUnit.start( count );
-				});
-			});
-			return;
-		}
-
-		config.semaphore -= count || 1;
-		// don't start until equal number of stop-calls
-		if ( config.semaphore > 0 ) {
-			return;
-		}
-		// ignore if start is called more often then stop
-		if ( config.semaphore < 0 ) {
-			config.semaphore = 0;
-			QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
-			return;
-		}
-		// A slight delay, to avoid any current callbacks
-		if ( defined.setTimeout ) {
-			setTimeout(function() {
-				if ( config.semaphore > 0 ) {
-					return;
-				}
-				if ( config.timeout ) {
-					clearTimeout( config.timeout );
-				}
-
-				config.blocking = false;
-				process( true );
-			}, 13);
-		} else {
-			config.blocking = false;
-			process( true );
-		}
-	},
-
-	stop: function( count ) {
-		config.semaphore += count || 1;
-		config.blocking = true;
-
-		if ( config.testTimeout && defined.setTimeout ) {
-			clearTimeout( config.timeout );
-			config.timeout = setTimeout(function() {
-				QUnit.ok( false, "Test timed out" );
-				config.semaphore = 1;
-				QUnit.start();
-			}, config.testTimeout );
-		}
-	}
-};
-
-// `assert` initialized at top of scope
-// Assert helpers
-// All of these must either call QUnit.push() or manually do:
-// - runLoggingCallbacks( "log", .. );
-// - config.current.assertions.push({ .. });
-// We attach it to the QUnit object *after* we expose the public API,
-// otherwise `assert` will become a global variable in browsers (#341).
-assert = {
-	/**
-	 * Asserts rough true-ish result.
-	 * @name ok
-	 * @function
-	 * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-	 */
-	ok: function( result, msg ) {
-		if ( !config.current ) {
-			throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-		result = !!result;
-		msg = msg || (result ? "okay" : "failed" );
-
-		var source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: msg
-			};
-
-		msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
-
-		if ( !result ) {
-			source = sourceFromStacktrace( 2 );
-			if ( source ) {
-				details.source = source;
-				msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
-			}
-		}
-		runLoggingCallbacks( "log", QUnit, details );
-		config.current.assertions.push({
-			result: result,
-			message: msg
-		});
-	},
-
-	/**
-	 * Assert that the first two arguments are equal, with an optional message.
-	 * Prints out both actual and expected values.
-	 * @name equal
-	 * @function
-	 * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
-	 */
-	equal: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected == actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notEqual
-	 * @function
-	 */
-	notEqual: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected != actual, actual, expected, message );
-	},
-
-	/**
-	 * @name propEqual
-	 * @function
-	 */
-	propEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notPropEqual
-	 * @function
-	 */
-	notPropEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name deepEqual
-	 * @function
-	 */
-	deepEqual: function( actual, expected, message ) {
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notDeepEqual
-	 * @function
-	 */
-	notDeepEqual: function( actual, expected, message ) {
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name strictEqual
-	 * @function
-	 */
-	strictEqual: function( actual, expected, message ) {
-		QUnit.push( expected === actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notStrictEqual
-	 * @function
-	 */
-	notStrictEqual: function( actual, expected, message ) {
-		QUnit.push( expected !== actual, actual, expected, message );
-	},
-
-	"throws": function( block, expected, message ) {
-		var actual,
-			expectedOutput = expected,
-			ok = false;
-
-		// 'expected' is optional
-		if ( typeof expected === "string" ) {
-			message = expected;
-			expected = null;
-		}
-
-		config.current.ignoreGlobalErrors = true;
-		try {
-			block.call( config.current.testEnvironment );
-		} catch (e) {
-			actual = e;
-		}
-		config.current.ignoreGlobalErrors = false;
-
-		if ( actual ) {
-			// we don't want to validate thrown error
-			if ( !expected ) {
-				ok = true;
-				expectedOutput = null;
-			// expected is a regexp
-			} else if ( QUnit.objectType( expected ) === "regexp" ) {
-				ok = expected.test( errorString( actual ) );
-			// expected is a constructor
-			} else if ( actual instanceof expected ) {
-				ok = true;
-			// expected is a validation function which returns true is validation passed
-			} else if ( expected.call( {}, actual ) === true ) {
-				expectedOutput = null;
-				ok = true;
-			}
-
-			QUnit.push( ok, actual, expectedOutput, message );
-		} else {
-			QUnit.pushFailure( message, null, "No exception was thrown." );
-		}
-	}
-};
-
-/**
- * @deprecated since 1.8.0
- * Kept assertion helpers in root for backwards compatibility.
- */
-extend( QUnit, assert );
-
-/**
- * @deprecated since 1.9.0
- * Kept root "raises()" for backwards compatibility.
- * (Note that we don't introduce assert.raises).
- */
-QUnit.raises = assert[ "throws" ];
-
-/**
- * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.equals = function() {
-	QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
-};
-QUnit.same = function() {
-	QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
-};
-
-// We want access to the constructor's prototype
-(function() {
-	function F() {}
-	F.prototype = QUnit;
-	QUnit = new F();
-	// Make F QUnit's constructor so that we can add to the prototype later
-	QUnit.constructor = F;
-}());
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
-	// The queue of tests to run
-	queue: [],
-
-	// block until document ready
-	blocking: true,
-
-	// when enabled, show only failing tests
-	// gets persisted through sessionStorage and can be changed in UI via checkbox
-	hidepassed: false,
-
-	// by default, run previously failed tests first
-	// very useful in combination with "Hide passed tests" checked
-	reorder: true,
-
-	// by default, modify document.title when suite is done
-	altertitle: true,
-
-	// when enabled, all tests must call expect()
-	requireExpects: false,
-
-	// add checkboxes that are persisted in the query-string
-	// when enabled, the id is set to `true` as a `QUnit.config` property
-	urlConfig: [
-		{
-			id: "noglobals",
-			label: "Check for Globals",
-			tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
-		},
-		{
-			id: "notrycatch",
-			label: "No try-catch",
-			tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
-		}
-	],
-
-	// Set of all modules.
-	modules: {},
-
-	// logging callback queues
-	begin: [],
-	done: [],
-	log: [],
-	testStart: [],
-	testDone: [],
-	moduleStart: [],
-	moduleDone: []
-};
-
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
-	extend( window, QUnit.constructor.prototype );
-
-	// Expose QUnit object
-	window.QUnit = QUnit;
-}
-
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
-	var i,
-		location = window.location || { search: "", protocol: "file:" },
-		params = location.search.slice( 1 ).split( "&" ),
-		length = params.length,
-		urlParams = {},
-		current;
-
-	if ( params[ 0 ] ) {
-		for ( i = 0; i < length; i++ ) {
-			current = params[ i ].split( "=" );
-			current[ 0 ] = decodeURIComponent( current[ 0 ] );
-			// allow just a key to turn on a flag, e.g., test.html?noglobals
-			current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-			urlParams[ current[ 0 ] ] = current[ 1 ];
-		}
-	}
-
-	QUnit.urlParams = urlParams;
-
-	// String search anywhere in moduleName+testName
-	config.filter = urlParams.filter;
-
-	// Exact match of the module name
-	config.module = urlParams.module;
-
-	config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
-
-	// Figure out if we're running the tests from a server or not
-	QUnit.isLocal = location.protocol === "file:";
-}());
-
-// Extend QUnit object,
-// these after set here because they should not be exposed as global functions
-extend( QUnit, {
-	assert: assert,
-
-	config: config,
-
-	// Initialize the configuration options
-	init: function() {
-		extend( config, {
-			stats: { all: 0, bad: 0 },
-			moduleStats: { all: 0, bad: 0 },
-			started: +new Date(),
-			updateRate: 1000,
-			blocking: false,
-			autostart: true,
-			autorun: false,
-			filter: "",
-			queue: [],
-			semaphore: 1
-		});
-
-		var tests, banner, result,
-			qunit = id( "qunit" );
-
-		if ( qunit ) {
-			qunit.innerHTML =
-				"<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-				"<h2 id='qunit-banner'></h2>" +
-				"<div id='qunit-testrunner-toolbar'></div>" +
-				"<h2 id='qunit-userAgent'></h2>" +
-				"<ol id='qunit-tests'></ol>";
-		}
-
-		tests = id( "qunit-tests" );
-		banner = id( "qunit-banner" );
-		result = id( "qunit-testresult" );
-
-		if ( tests ) {
-			tests.innerHTML = "";
-		}
-
-		if ( banner ) {
-			banner.className = "";
-		}
-
-		if ( result ) {
-			result.parentNode.removeChild( result );
-		}
-
-		if ( tests ) {
-			result = document.createElement( "p" );
-			result.id = "qunit-testresult";
-			result.className = "result";
-			tests.parentNode.insertBefore( result, tests );
-			result.innerHTML = "Running...<br/>&nbsp;";
-		}
-	},
-
-	// Resets the test setup. Useful for tests that modify the DOM.
-	/*
-	DEPRECATED: Use multiple tests instead of resetting inside a test.
-	Use testStart or testDone for custom cleanup.
-	This method will throw an error in 2.0, and will be removed in 2.1
-	*/
-	reset: function() {
-		var fixture = id( "qunit-fixture" );
-		if ( fixture ) {
-			fixture.innerHTML = config.fixture;
-		}
-	},
-
-	// Trigger an event on an element.
-	// @example triggerEvent( document.body, "click" );
-	triggerEvent: function( elem, type, event ) {
-		if ( document.createEvent ) {
-			event = document.createEvent( "MouseEvents" );
-			event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
-				0, 0, 0, 0, 0, false, false, false, false, 0, null);
-
-			elem.dispatchEvent( event );
-		} else if ( elem.fireEvent ) {
-			elem.fireEvent( "on" + type );
-		}
-	},
-
-	// Safe object type checking
-	is: function( type, obj ) {
-		return QUnit.objectType( obj ) === type;
-	},
-
-	objectType: function( obj ) {
-		if ( typeof obj === "undefined" ) {
-				return "undefined";
-		// consider: typeof null === object
-		}
-		if ( obj === null ) {
-				return "null";
-		}
-
-		var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
-			type = match && match[1] || "";
-
-		switch ( type ) {
-			case "Number":
-				if ( isNaN(obj) ) {
-					return "nan";
-				}
-				return "number";
-			case "String":
-			case "Boolean":
-			case "Array":
-			case "Date":
-			case "RegExp":
-			case "Function":
-				return type.toLowerCase();
-		}
-		if ( typeof obj === "object" ) {
-			return "object";
-		}
-		return undefined;
-	},
-
-	push: function( result, actual, expected, message ) {
-		if ( !config.current ) {
-			throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
-		}
-
-		var output, source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: message,
-				actual: actual,
-				expected: expected
-			};
-
-		message = escapeText( message ) || ( result ? "okay" : "failed" );
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		if ( !result ) {
-			expected = escapeText( QUnit.jsDump.parse(expected) );
-			actual = escapeText( QUnit.jsDump.parse(actual) );
-			output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
-
-			if ( actual !== expected ) {
-				output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
-				output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
-			}
-
-			source = sourceFromStacktrace();
-
-			if ( source ) {
-				details.source = source;
-				output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-			}
-
-			output += "</table>";
-		}
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: !!result,
-			message: output
-		});
-	},
-
-	pushFailure: function( message, source, actual ) {
-		if ( !config.current ) {
-			throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-
-		var output,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: false,
-				message: message
-			};
-
-		message = escapeText( message ) || "error";
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		output += "<table>";
-
-		if ( actual ) {
-			output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
-		}
-
-		if ( source ) {
-			details.source = source;
-			output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-		}
-
-		output += "</table>";
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: false,
-			message: output
-		});
-	},
-
-	url: function( params ) {
-		params = extend( extend( {}, QUnit.urlParams ), params );
-		var key,
-			querystring = "?";
-
-		for ( key in params ) {
-			if ( hasOwn.call( params, key ) ) {
-				querystring += encodeURIComponent( key ) + "=" +
-					encodeURIComponent( params[ key ] ) + "&";
-			}
-		}
-		return window.location.protocol + "//" + window.location.host +
-			window.location.pathname + querystring.slice( 0, -1 );
-	},
-
-	extend: extend,
-	id: id,
-	addEvent: addEvent,
-	addClass: addClass,
-	hasClass: hasClass,
-	removeClass: removeClass
-	// load, equiv, jsDump, diff: Attached later
-});
-
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
-
-	// Logging callbacks; all receive a single argument with the listed properties
-	// run test/logs.html for any related changes
-	begin: registerLoggingCallback( "begin" ),
-
-	// done: { failed, passed, total, runtime }
-	done: registerLoggingCallback( "done" ),
-
-	// log: { result, actual, expected, message }
-	log: registerLoggingCallback( "log" ),
-
-	// testStart: { name }
-	testStart: registerLoggingCallback( "testStart" ),
-
-	// testDone: { name, failed, passed, total, duration }
-	testDone: registerLoggingCallback( "testDone" ),
-
-	// moduleStart: { name }
-	moduleStart: registerLoggingCallback( "moduleStart" ),
-
-	// moduleDone: { name, failed, passed, total }
-	moduleDone: registerLoggingCallback( "moduleDone" )
-});
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
-	config.autorun = true;
-}
-
-QUnit.load = function() {
-	runLoggingCallbacks( "begin", QUnit, {} );
-
-	// Initialize the config, saving the execution queue
-	var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
-		urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
-		numModules = 0,
-		moduleNames = [],
-		moduleFilterHtml = "",
-		urlConfigHtml = "",
-		oldconfig = extend( {}, config );
-
-	QUnit.init();
-	extend(config, oldconfig);
-
-	config.blocking = false;
-
-	len = config.urlConfig.length;
-
-	for ( i = 0; i < len; i++ ) {
-		val = config.urlConfig[i];
-		if ( typeof val === "string" ) {
-			val = {
-				id: val,
-				label: val,
-				tooltip: "[no tooltip available]"
-			};
-		}
-		config[ val.id ] = QUnit.urlParams[ val.id ];
-		urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
-			"' name='" + escapeText( val.id ) +
-			"' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
-			" title='" + escapeText( val.tooltip ) +
-			"'><label for='qunit-urlconfig-" + escapeText( val.id ) +
-			"' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
-	}
-	for ( i in config.modules ) {
-		if ( config.modules.hasOwnProperty( i ) ) {
-			moduleNames.push(i);
-		}
-	}
-	numModules = moduleNames.length;
-	moduleNames.sort( function( a, b ) {
-		return a.localeCompare( b );
-	});
-	moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-		( config.module === undefined  ? "selected='selected'" : "" ) +
-		">< All Modules ></option>";
-
-
-	for ( i = 0; i < numModules; i++) {
-			moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
-				( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
-				">" + escapeText(moduleNames[i]) + "</option>";
-	}
-	moduleFilterHtml += "</select>";
-
-	// `userAgent` initialized at top of scope
-	userAgent = id( "qunit-userAgent" );
-	if ( userAgent ) {
-		userAgent.innerHTML = navigator.userAgent;
-	}
-
-	// `banner` initialized at top of scope
-	banner = id( "qunit-header" );
-	if ( banner ) {
-		banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
-	}
-
-	// `toolbar` initialized at top of scope
-	toolbar = id( "qunit-testrunner-toolbar" );
-	if ( toolbar ) {
-		// `filter` initialized at top of scope
-		filter = document.createElement( "input" );
-		filter.type = "checkbox";
-		filter.id = "qunit-filter-pass";
-
-		addEvent( filter, "click", function() {
-			var tmp,
-				ol = document.getElementById( "qunit-tests" );
-
-			if ( filter.checked ) {
-				ol.className = ol.className + " hidepass";
-			} else {
-				tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-				ol.className = tmp.replace( / hidepass /, " " );
-			}
-			if ( defined.sessionStorage ) {
-				if (filter.checked) {
-					sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
-				} else {
-					sessionStorage.removeItem( "qunit-filter-passed-tests" );
-				}
-			}
-		});
-
-		if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
-			filter.checked = true;
-			// `ol` initialized at top of scope
-			ol = document.getElementById( "qunit-tests" );
-			ol.className = ol.className + " hidepass";
-		}
-		toolbar.appendChild( filter );
-
-		// `label` initialized at top of scope
-		label = document.createElement( "label" );
-		label.setAttribute( "for", "qunit-filter-pass" );
-		label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
-		label.innerHTML = "Hide passed tests";
-		toolbar.appendChild( label );
-
-		urlConfigCheckboxesContainer = document.createElement("span");
-		urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
-		urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
-		// For oldIE support:
-		// * Add handlers to the individual elements instead of the container
-		// * Use "click" instead of "change"
-		// * Fallback from event.target to event.srcElement
-		addEvents( urlConfigCheckboxes, "click", function( event ) {
-			var params = {},
-				target = event.target || event.srcElement;
-			params[ target.name ] = target.checked ? true : undefined;
-			window.location = QUnit.url( params );
-		});
-		toolbar.appendChild( urlConfigCheckboxesContainer );
-
-		if (numModules > 1) {
-			moduleFilter = document.createElement( "span" );
-			moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-			moduleFilter.innerHTML = moduleFilterHtml;
-			addEvent( moduleFilter.lastChild, "change", function() {
-				var selectBox = moduleFilter.getElementsByTagName("select")[0],
-					selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
-
-				window.location = QUnit.url({
-					module: ( selectedModule === "" ) ? undefined : selectedModule,
-					// Remove any existing filters
-					filter: undefined,
-					testNumber: undefined
-				});
-			});
-			toolbar.appendChild(moduleFilter);
-		}
-	}
-
-	// `main` initialized at top of scope
-	main = id( "qunit-fixture" );
-	if ( main ) {
-		config.fixture = main.innerHTML;
-	}
-
-	if ( config.autostart ) {
-		QUnit.start();
-	}
-};
-
-addEvent( window, "load", QUnit.load );
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function ( error, filePath, linerNr ) {
-	var ret = false;
-	if ( onErrorFnPrev ) {
-		ret = onErrorFnPrev( error, filePath, linerNr );
-	}
-
-	// Treat return value as window.onerror itself does,
-	// Only do our handling if not suppressed.
-	if ( ret !== true ) {
-		if ( QUnit.config.current ) {
-			if ( QUnit.config.current.ignoreGlobalErrors ) {
-				return true;
-			}
-			QUnit.pushFailure( error, filePath + ":" + linerNr );
-		} else {
-			QUnit.test( "global failure", extend( function() {
-				QUnit.pushFailure( error, filePath + ":" + linerNr );
-			}, { validTest: validTest } ) );
-		}
-		return false;
-	}
-
-	return ret;
-};
-
-function done() {
-	config.autorun = true;
-
-	// Log the last module results
-	if ( config.currentModule ) {
-		runLoggingCallbacks( "moduleDone", QUnit, {
-			name: config.currentModule,
-			failed: config.moduleStats.bad,
-			passed: config.moduleStats.all - config.moduleStats.bad,
-			total: config.moduleStats.all
-		});
-	}
-	delete config.previousModule;
-
-	var i, key,
-		banner = id( "qunit-banner" ),
-		tests = id( "qunit-tests" ),
-		runtime = +new Date() - config.started,
-		passed = config.stats.all - config.stats.bad,
-		html = [
-			"Tests completed in ",
-			runtime,
-			" milliseconds.<br/>",
-			"<span class='passed'>",
-			passed,
-			"</span> assertions of <span class='total'>",
-			config.stats.all,
-			"</span> passed, <span class='failed'>",
-			config.stats.bad,
-			"</span> failed."
-		].join( "" );
-
-	if ( banner ) {
-		banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
-	}
-
-	if ( tests ) {
-		id( "qunit-testresult" ).innerHTML = html;
-	}
-
-	if ( config.altertitle && typeof document !== "undefined" && document.title ) {
-		// show ✖ for good, ✔ for bad suite result in title
-		// use escape sequences in case file gets loaded with non-utf-8-charset
-		document.title = [
-			( config.stats.bad ? "\u2716" : "\u2714" ),
-			document.title.replace( /^[\u2714\u2716] /i, "" )
-		].join( " " );
-	}
-
-	// clear own sessionStorage items if all tests passed
-	if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-		// `key` & `i` initialized at top of scope
-		for ( i = 0; i < sessionStorage.length; i++ ) {
-			key = sessionStorage.key( i++ );
-			if ( key.indexOf( "qunit-test-" ) === 0 ) {
-				sessionStorage.removeItem( key );
-			}
-		}
-	}
-
-	// scroll back to top to show results
-	if ( window.scrollTo ) {
-		window.scrollTo(0, 0);
-	}
-
-	runLoggingCallbacks( "done", QUnit, {
-		failed: config.stats.bad,
-		passed: passed,
-		total: config.stats.all,
-		runtime: runtime
-	});
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
-	var include,
-		filter = config.filter && config.filter.toLowerCase(),
-		module = config.module && config.module.toLowerCase(),
-		fullName = (test.module + ": " + test.testName).toLowerCase();
-
-	// Internally-generated tests are always valid
-	if ( test.callback && test.callback.validTest === validTest ) {
-		delete test.callback.validTest;
-		return true;
-	}
-
-	if ( config.testNumber ) {
-		return test.testNumber === config.testNumber;
-	}
-
-	if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
-		return false;
-	}
-
-	if ( !filter ) {
-		return true;
-	}
-
-	include = filter.charAt( 0 ) !== "!";
-	if ( !include ) {
-		filter = filter.slice( 1 );
-	}
-
-	// If the filter matches, we need to honour include
-	if ( fullName.indexOf( filter ) !== -1 ) {
-		return include;
-	}
-
-	// Otherwise, do the opposite
-	return !include;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
-// Later Safari and IE10 are supposed to support error.stack as well
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-	offset = offset === undefined ? 3 : offset;
-
-	var stack, include, i;
-
-	if ( e.stacktrace ) {
-		// Opera
-		return e.stacktrace.split( "\n" )[ offset + 3 ];
-	} else if ( e.stack ) {
-		// Firefox, Chrome
-		stack = e.stack.split( "\n" );
-		if (/^error$/i.test( stack[0] ) ) {
-			stack.shift();
-		}
-		if ( fileName ) {
-			include = [];
-			for ( i = offset; i < stack.length; i++ ) {
-				if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-					break;
-				}
-				include.push( stack[ i ] );
-			}
-			if ( include.length ) {
-				return include.join( "\n" );
-			}
-		}
-		return stack[ offset ];
-	} else if ( e.sourceURL ) {
-		// Safari, PhantomJS
-		// hopefully one day Safari provides actual stacktraces
-		// exclude useless self-reference for generated Error objects
-		if ( /qunit.js$/.test( e.sourceURL ) ) {
-			return;
-		}
-		// for actual exceptions, this is useful
-		return e.sourceURL + ":" + e.line;
-	}
-}
-function sourceFromStacktrace( offset ) {
-	try {
-		throw new Error();
-	} catch ( e ) {
-		return extractStacktrace( e, offset );
-	}
-}
-
-/**
- * Escape text for attribute or text content.
- */
-function escapeText( s ) {
-	if ( !s ) {
-		return "";
-	}
-	s = s + "";
-	// Both single quotes and double quotes (for attributes)
-	return s.replace( /['"<>&]/g, function( s ) {
-		switch( s ) {
-			case "'":
-				return "&#039;";
-			case "\"":
-				return "&quot;";
-			case "<":
-				return "&lt;";
-			case ">":
-				return "&gt;";
-			case "&":
-				return "&amp;";
-		}
-	});
-}
-
-function synchronize( callback, last ) {
-	config.queue.push( callback );
-
-	if ( config.autorun && !config.blocking ) {
-		process( last );
-	}
-}
-
-function process( last ) {
-	function next() {
-		process( last );
-	}
-	var start = new Date().getTime();
-	config.depth = config.depth ? config.depth + 1 : 1;
-
-	while ( config.queue.length && !config.blocking ) {
-		if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
-			config.queue.shift()();
-		} else {
-			setTimeout( next, 13 );
-			break;
-		}
-	}
-	config.depth--;
-	if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-		done();
-	}
-}
-
-function saveGlobal() {
-	config.pollution = [];
-
-	if ( config.noglobals ) {
-		for ( var key in window ) {
-			if ( hasOwn.call( window, key ) ) {
-				// in Opera sometimes DOM element ids show up here, ignore them
-				if ( /^qunit-test-output/.test( key ) ) {
-					continue;
-				}
-				config.pollution.push( key );
-			}
-		}
-	}
-}
-
-function checkPollution() {
-	var newGlobals,
-		deletedGlobals,
-		old = config.pollution;
-
-	saveGlobal();
-
-	newGlobals = diff( config.pollution, old );
-	if ( newGlobals.length > 0 ) {
-		QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
-	}
-
-	deletedGlobals = diff( old, config.pollution );
-	if ( deletedGlobals.length > 0 ) {
-		QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
-	}
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-	var i, j,
-		result = a.slice();
-
-	for ( i = 0; i < result.length; i++ ) {
-		for ( j = 0; j < b.length; j++ ) {
-			if ( result[i] === b[j] ) {
-				result.splice( i, 1 );
-				i--;
-				break;
-			}
-		}
-	}
-	return result;
-}
-
-function extend( a, b ) {
-	for ( var prop in b ) {
-		if ( hasOwn.call( b, prop ) ) {
-			// Avoid "Member not found" error in IE8 caused by messing with window.constructor
-			if ( !( prop === "constructor" && a === window ) ) {
-				if ( b[ prop ] === undefined ) {
-					delete a[ prop ];
-				} else {
-					a[ prop ] = b[ prop ];
-				}
-			}
-		}
-	}
-
-	return a;
-}
-
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-	// Standards-based browsers
-	if ( elem.addEventListener ) {
-		elem.addEventListener( type, fn, false );
-	// IE
-	} else {
-		elem.attachEvent( "on" + type, fn );
-	}
-}
-
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-	var i = elems.length;
-	while ( i-- ) {
-		addEvent( elems[i], type, fn );
-	}
-}
-
-function hasClass( elem, name ) {
-	return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
-}
-
-function addClass( elem, name ) {
-	if ( !hasClass( elem, name ) ) {
-		elem.className += (elem.className ? " " : "") + name;
-	}
-}
-
-function removeClass( elem, name ) {
-	var set = " " + elem.className + " ";
-	// Class name may appear multiple times
-	while ( set.indexOf(" " + name + " ") > -1 ) {
-		set = set.replace(" " + name + " " , " ");
-	}
-	// If possible, trim it for prettiness, but not necessarily
-	elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
-}
-
-function id( name ) {
-	return !!( typeof document !== "undefined" && document && document.getElementById ) &&
-		document.getElementById( name );
-}
-
-function registerLoggingCallback( key ) {
-	return function( callback ) {
-		config[key].push( callback );
-	};
-}
-
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks( key, scope, args ) {
-	var i, callbacks;
-	if ( QUnit.hasOwnProperty( key ) ) {
-		QUnit[ key ].call(scope, args );
-	} else {
-		callbacks = config[ key ];
-		for ( i = 0; i < callbacks.length; i++ ) {
-			callbacks[ i ].call( scope, args );
-		}
-	}
-}
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
-
-	// Call the o related callback with the given arguments.
-	function bindCallbacks( o, callbacks, args ) {
-		var prop = QUnit.objectType( o );
-		if ( prop ) {
-			if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-				return callbacks[ prop ].apply( callbacks, args );
-			} else {
-				return callbacks[ prop ]; // or undefined
-			}
-		}
-	}
-
-	// the real equiv function
-	var innerEquiv,
-		// stack to decide between skip/abort functions
-		callers = [],
-		// stack to avoiding loops from circular referencing
-		parents = [],
-		parentsB = [],
-
-		getProto = Object.getPrototypeOf || function ( obj ) {
-			/*jshint camelcase:false */
-			return obj.__proto__;
-		},
-		callbacks = (function () {
-
-			// for string, boolean, number and null
-			function useStrictEquality( b, a ) {
-				/*jshint eqeqeq:false */
-				if ( b instanceof a.constructor || a instanceof b.constructor ) {
-					// to catch short annotation VS 'new' annotation of a
-					// declaration
-					// e.g. var i = 1;
-					// var j = new Number(1);
-					return a == b;
-				} else {
-					return a === b;
-				}
-			}
-
-			return {
-				"string": useStrictEquality,
-				"boolean": useStrictEquality,
-				"number": useStrictEquality,
-				"null": useStrictEquality,
-				"undefined": useStrictEquality,
-
-				"nan": function( b ) {
-					return isNaN( b );
-				},
-
-				"date": function( b, a ) {
-					return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-				},
-
-				"regexp": function( b, a ) {
-					return QUnit.objectType( b ) === "regexp" &&
-						// the regex itself
-						a.source === b.source &&
-						// and its modifiers
-						a.global === b.global &&
-						// (gmi) ...
-						a.ignoreCase === b.ignoreCase &&
-						a.multiline === b.multiline &&
-						a.sticky === b.sticky;
-				},
-
-				// - skip when the property is a method of an instance (OOP)
-				// - abort otherwise,
-				// initial === would have catch identical references anyway
-				"function": function() {
-					var caller = callers[callers.length - 1];
-					return caller !== Object && typeof caller !== "undefined";
-				},
-
-				"array": function( b, a ) {
-					var i, j, len, loop, aCircular, bCircular;
-
-					// b could be an object literal here
-					if ( QUnit.objectType( b ) !== "array" ) {
-						return false;
-					}
-
-					len = a.length;
-					if ( len !== b.length ) {
-						// safe and faster
-						return false;
-					}
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-					for ( i = 0; i < len; i++ ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									parents.pop();
-									parentsB.pop();
-									return false;
-								}
-							}
-						}
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							parents.pop();
-							parentsB.pop();
-							return false;
-						}
-					}
-					parents.pop();
-					parentsB.pop();
-					return true;
-				},
-
-				"object": function( b, a ) {
-					/*jshint forin:false */
-					var i, j, loop, aCircular, bCircular,
-						// Default to true
-						eq = true,
-						aProperties = [],
-						bProperties = [];
-
-					// comparing constructors is more strict than using
-					// instanceof
-					if ( a.constructor !== b.constructor ) {
-						// Allow objects with no prototype to be equivalent to
-						// objects with Object as their constructor.
-						if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
-							( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
-								return false;
-						}
-					}
-
-					// stack constructor before traversing properties
-					callers.push( a.constructor );
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-
-					// be strict: don't ensure hasOwnProperty and go deep
-					for ( i in a ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									eq = false;
-									break;
-								}
-							}
-						}
-						aProperties.push(i);
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							eq = false;
-							break;
-						}
-					}
-
-					parents.pop();
-					parentsB.pop();
-					callers.pop(); // unstack, we are done
-
-					for ( i in b ) {
-						bProperties.push( i ); // collect b's properties
-					}
-
-					// Ensures identical properties name
-					return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-				}
-			};
-		}());
-
-	innerEquiv = function() { // can take multiple arguments
-		var args = [].slice.apply( arguments );
-		if ( args.length < 2 ) {
-			return true; // end transition
-		}
-
-		return (function( a, b ) {
-			if ( a === b ) {
-				return true; // catch the most you can
-			} else if ( a === null || b === null || typeof a === "undefined" ||
-					typeof b === "undefined" ||
-					QUnit.objectType(a) !== QUnit.objectType(b) ) {
-				return false; // don't lose time with error prone cases
-			} else {
-				return bindCallbacks(a, callbacks, [ b, a ]);
-			}
-
-			// apply transition with (1..n) arguments
-		}( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
-	};
-
-	return innerEquiv;
-}());
-
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
-	function quote( str ) {
-		return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
-	}
-	function literal( o ) {
-		return o + "";
-	}
-	function join( pre, arr, post ) {
-		var s = jsDump.separator(),
-			base = jsDump.indent(),
-			inner = jsDump.indent(1);
-		if ( arr.join ) {
-			arr = arr.join( "," + s + inner );
-		}
-		if ( !arr ) {
-			return pre + post;
-		}
-		return [ pre, inner + arr, base + post ].join(s);
-	}
-	function array( arr, stack ) {
-		var i = arr.length, ret = new Array(i);
-		this.up();
-		while ( i-- ) {
-			ret[i] = this.parse( arr[i] , undefined , stack);
-		}
-		this.down();
-		return join( "[", ret, "]" );
-	}
-
-	var reName = /^function (\w+)/,
-		jsDump = {
-			// type is used mostly internally, you can fix a (custom)type in advance
-			parse: function( obj, type, stack ) {
-				stack = stack || [ ];
-				var inStack, res,
-					parser = this.parsers[ type || this.typeOf(obj) ];
-
-				type = typeof parser;
-				inStack = inArray( obj, stack );
-
-				if ( inStack !== -1 ) {
-					return "recursion(" + (inStack - stack.length) + ")";
-				}
-				if ( type === "function" )  {
-					stack.push( obj );
-					res = parser.call( this, obj, stack );
-					stack.pop();
-					return res;
-				}
-				return ( type === "string" ) ? parser : this.parsers.error;
-			},
-			typeOf: function( obj ) {
-				var type;
-				if ( obj === null ) {
-					type = "null";
-				} else if ( typeof obj === "undefined" ) {
-					type = "undefined";
-				} else if ( QUnit.is( "regexp", obj) ) {
-					type = "regexp";
-				} else if ( QUnit.is( "date", obj) ) {
-					type = "date";
-				} else if ( QUnit.is( "function", obj) ) {
-					type = "function";
-				} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
-					type = "window";
-				} else if ( obj.nodeType === 9 ) {
-					type = "document";
-				} else if ( obj.nodeType ) {
-					type = "node";
-				} else if (
-					// native arrays
-					toString.call( obj ) === "[object Array]" ||
-					// NodeList objects
-					( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-				) {
-					type = "array";
-				} else if ( obj.constructor === Error.prototype.constructor ) {
-					type = "error";
-				} else {
-					type = typeof obj;
-				}
-				return type;
-			},
-			separator: function() {
-				return this.multiline ?	this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
-			},
-			// extra can be a number, shortcut for increasing-calling-decreasing
-			indent: function( extra ) {
-				if ( !this.multiline ) {
-					return "";
-				}
-				var chr = this.indentChar;
-				if ( this.HTML ) {
-					chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
-				}
-				return new Array( this.depth + ( extra || 0 ) ).join(chr);
-			},
-			up: function( a ) {
-				this.depth += a || 1;
-			},
-			down: function( a ) {
-				this.depth -= a || 1;
-			},
-			setParser: function( name, parser ) {
-				this.parsers[name] = parser;
-			},
-			// The next 3 are exposed so you can use them
-			quote: quote,
-			literal: literal,
-			join: join,
-			//
-			depth: 1,
-			// This is the list of parsers, to modify them, use jsDump.setParser
-			parsers: {
-				window: "[Window]",
-				document: "[Document]",
-				error: function(error) {
-					return "Error(\"" + error.message + "\")";
-				},
-				unknown: "[Unknown]",
-				"null": "null",
-				"undefined": "undefined",
-				"function": function( fn ) {
-					var ret = "function",
-						// functions never have name in IE
-						name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
-
-					if ( name ) {
-						ret += " " + name;
-					}
-					ret += "( ";
-
-					ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
-					return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
-				},
-				array: array,
-				nodelist: array,
-				"arguments": array,
-				object: function( map, stack ) {
-					/*jshint forin:false */
-					var ret = [ ], keys, key, val, i;
-					QUnit.jsDump.up();
-					keys = [];
-					for ( key in map ) {
-						keys.push( key );
-					}
-					keys.sort();
-					for ( i = 0; i < keys.length; i++ ) {
-						key = keys[ i ];
-						val = map[ key ];
-						ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
-					}
-					QUnit.jsDump.down();
-					return join( "{", ret, "}" );
-				},
-				node: function( node ) {
-					var len, i, val,
-						open = QUnit.jsDump.HTML ? "&lt;" : "<",
-						close = QUnit.jsDump.HTML ? "&gt;" : ">",
-						tag = node.nodeName.toLowerCase(),
-						ret = open + tag,
-						attrs = node.attributes;
-
-					if ( attrs ) {
-						for ( i = 0, len = attrs.length; i < len; i++ ) {
-							val = attrs[i].nodeValue;
-							// IE6 includes all attributes in .attributes, even ones not explicitly set.
-							// Those have values like undefined, null, 0, false, "" or "inherit".
-							if ( val && val !== "inherit" ) {
-								ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
-							}
-						}
-					}
-					ret += close;
-
-					// Show content of TextNode or CDATASection
-					if ( node.nodeType === 3 || node.nodeType === 4 ) {
-						ret += node.nodeValue;
-					}
-
-					return ret + open + "/" + tag + close;
-				},
-				// function calls it internally, it's the arguments part of the function
-				functionArgs: function( fn ) {
-					var args,
-						l = fn.length;
-
-					if ( !l ) {
-						return "";
-					}
-
-					args = new Array(l);
-					while ( l-- ) {
-						// 97 is 'a'
-						args[l] = String.fromCharCode(97+l);
-					}
-					return " " + args.join( ", " ) + " ";
-				},
-				// object calls it internally, the key part of an item in a map
-				key: quote,
-				// function calls it internally, it's the content of the function
-				functionCode: "[code]",
-				// node calls it internally, it's an html attribute value
-				attribute: quote,
-				string: quote,
-				date: quote,
-				regexp: literal,
-				number: literal,
-				"boolean": literal
-			},
-			// if true, entities are escaped ( <, >, \t, space and \n )
-			HTML: false,
-			// indentation unit
-			indentChar: "  ",
-			// if true, items in a collection, are separated by a \n, else just a space.
-			multiline: true
-		};
-
-	return jsDump;
-}());
-
-// from jquery.js
-function inArray( elem, array ) {
-	if ( array.indexOf ) {
-		return array.indexOf( elem );
-	}
-
-	for ( var i = 0, length = array.length; i < length; i++ ) {
-		if ( array[ i ] === elem ) {
-			return i;
-		}
-	}
-
-	return -1;
-}
-
-/*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
-	/*jshint eqeqeq:false, eqnull:true */
-	function diff( o, n ) {
-		var i,
-			ns = {},
-			os = {};
-
-		for ( i = 0; i < n.length; i++ ) {
-			if ( !hasOwn.call( ns, n[i] ) ) {
-				ns[ n[i] ] = {
-					rows: [],
-					o: null
-				};
-			}
-			ns[ n[i] ].rows.push( i );
-		}
-
-		for ( i = 0; i < o.length; i++ ) {
-			if ( !hasOwn.call( os, o[i] ) ) {
-				os[ o[i] ] = {
-					rows: [],
-					n: null
-				};
-			}
-			os[ o[i] ].rows.push( i );
-		}
-
-		for ( i in ns ) {
-			if ( hasOwn.call( ns, i ) ) {
-				if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
-					n[ ns[i].rows[0] ] = {
-						text: n[ ns[i].rows[0] ],
-						row: os[i].rows[0]
-					};
-					o[ os[i].rows[0] ] = {
-						text: o[ os[i].rows[0] ],
-						row: ns[i].rows[0]
-					};
-				}
-			}
-		}
-
-		for ( i = 0; i < n.length - 1; i++ ) {
-			if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
-						n[ i + 1 ] == o[ n[i].row + 1 ] ) {
-
-				n[ i + 1 ] = {
-					text: n[ i + 1 ],
-					row: n[i].row + 1
-				};
-				o[ n[i].row + 1 ] = {
-					text: o[ n[i].row + 1 ],
-					row: i + 1
-				};
-			}
-		}
-
-		for ( i = n.length - 1; i > 0; i-- ) {
-			if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
-						n[ i - 1 ] == o[ n[i].row - 1 ]) {
-
-				n[ i - 1 ] = {
-					text: n[ i - 1 ],
-					row: n[i].row - 1
-				};
-				o[ n[i].row - 1 ] = {
-					text: o[ n[i].row - 1 ],
-					row: i - 1
-				};
-			}
-		}
-
-		return {
-			o: o,
-			n: n
-		};
-	}
-
-	return function( o, n ) {
-		o = o.replace( /\s+$/, "" );
-		n = n.replace( /\s+$/, "" );
-
-		var i, pre,
-			str = "",
-			out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
-			oSpace = o.match(/\s+/g),
-			nSpace = n.match(/\s+/g);
-
-		if ( oSpace == null ) {
-			oSpace = [ " " ];
-		}
-		else {
-			oSpace.push( " " );
-		}
-
-		if ( nSpace == null ) {
-			nSpace = [ " " ];
-		}
-		else {
-			nSpace.push( " " );
-		}
-
-		if ( out.n.length === 0 ) {
-			for ( i = 0; i < out.o.length; i++ ) {
-				str += "<del>" + out.o[i] + oSpace[i] + "</del>";
-			}
-		}
-		else {
-			if ( out.n[0].text == null ) {
-				for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
-					str += "<del>" + out.o[n] + oSpace[n] + "</del>";
-				}
-			}
-
-			for ( i = 0; i < out.n.length; i++ ) {
-				if (out.n[i].text == null) {
-					str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
-				}
-				else {
-					// `pre` initialized at top of scope
-					pre = "";
-
-					for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
-						pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
-					}
-					str += " " + out.n[i].text + nSpace[i] + pre;
-				}
-			}
-		}
-
-		return str;
-	};
-}());
-
-// for CommonJS environments, export everything
-if ( typeof exports !== "undefined" ) {
-	extend( exports, QUnit.constructor.prototype );
-}
-
-// get at whatever the global object is, like window in browsers
-}( (function() {return this;}.call()) ));
diff --git a/docs/slides/flops14/reveal.js/test/test-markdown-element-attributes.js b/docs/slides/flops14/reveal.js/test/test-markdown-element-attributes.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/test/test-markdown-element-attributes.js
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 4, 'found four slides' );
-	});
-
-
-	test( 'Attributes on element header in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.fade-out' ).length, 1, 'found one vertical slide with class fragment.fade-out on header' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.shrink' ).length, 1, 'found one vertical slide with class fragment.shrink on header' );
-	});
-
-	test( 'Attributes on element paragraphs in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section p.fragment.grow' ).length, 2, 'found a vertical slide with two paragraphs with class fragment.grow' );
-	});
-
-	test( 'Attributes on element list items in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section li.fragment.roll-in' ).length, 3, 'found a vertical slide with three list items with class fragment.roll-in' );
-	});
-
-	test( 'Attributes on element paragraphs in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-red' ).length, 4, 'found a horizontal slide with four paragraphs with class fragment.grow' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section li.fragment.highlight-green' ).length, 5, 'found a horizontal slide with five list items with class fragment.roll-in' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section img.reveal.stretch' ).length, 1, 'found a horizontal slide with stretched image, class img.reveal.stretch' );
-	});
-
-	test( 'Attributes on elements in vertical slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section h2.fragment.highlight-red' ).length, 2, 'found two h2 titles with fragment highlight-red in vertical slides with default element attribute separator' );
-	});
-
-	test( 'Attributes on elements in single slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-blue' ).length, 3, 'found three elements with fragment highlight-blue in single slide with default element attribute separator' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/flops14/reveal.js/test/test-markdown-slide-attributes.js b/docs/slides/flops14/reveal.js/test/test-markdown-slide-attributes.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/test/test-markdown-slide-attributes.js
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 6, 'found six vertical slides' );
-	});
-
-	test( 'Id on slide', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section#slide2' ).length, 1, 'found one slide with id slide2' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, 'found one slide with a link to slide2' );
-	});
-
-	test( 'data-background attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-background attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-transition attributes with inline content', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/flops14/reveal.js/test/test-markdown.js b/docs/slides/flops14/reveal.js/test/test-markdown.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/test/test-markdown.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/flops14/reveal.js/test/test.js b/docs/slides/flops14/reveal.js/test/test.js
deleted file mode 100644
--- a/docs/slides/flops14/reveal.js/test/test.js
+++ /dev/null
@@ -1,438 +0,0 @@
-
-// These tests expect the DOM to contain a presentation
-// with the following slide structure:
-//
-// 1
-// 2 - Three sub-slides
-// 3 - Three fragment elements
-// 3 - Two fragments with same data-fragment-index
-// 4
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	// ---------------------------------------------------------------
-	// DOM TESTS
-
-	QUnit.module( 'DOM' );
-
-	test( 'Initial slides classes', function() {
-		var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' )
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' );
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' );
-
-		ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' );
-	});
-
-	// ---------------------------------------------------------------
-	// API TESTS
-
-	QUnit.module( 'API' );
-
-	test( 'Reveal.isReady', function() {
-		strictEqual( Reveal.isReady(), true, 'returns true' );
-	});
-
-	test( 'Reveal.isOverview', function() {
-		strictEqual( Reveal.isOverview(), false, 'false by default' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), true, 'true after toggling on' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), false, 'false after toggling off' );
-	});
-
-	test( 'Reveal.isPaused', function() {
-		strictEqual( Reveal.isPaused(), false, 'false by default' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), true, 'true after pausing' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), false, 'false after resuming' );
-	});
-
-	test( 'Reveal.isFirstSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-
-		Reveal.slide( 1, 0 );
-		strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.isLastSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-
-		var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1;
-
-		Reveal.slide( lastSlideIndex, 0 );
-		strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( ', 0+ lastSlideIndex +' )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.getIndices', function() {
-		var indices = Reveal.getIndices();
-
-		ok( typeof indices.hasOwnProperty( 'h' ), 'h exists' );
-		ok( typeof indices.hasOwnProperty( 'v' ), 'v exists' );
-		ok( typeof indices.hasOwnProperty( 'f' ), 'f exists' );
-
-		Reveal.slide( 1, 0 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 0, 'h 1, v 0' );
-
-		Reveal.slide( 1, 2 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 2, 'h 1, v 2' );
-
-		Reveal.slide( 0, 0 );
-	});
-
-	test( 'Reveal.getSlide', function() {
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-
-		equal( Reveal.getSlide( 0 ), firstSlide, 'gets correct first slide' );
-
-		strictEqual( Reveal.getSlide( 100 ), undefined, 'returns undefined when slide can\'t be found' );
-	});
-
-	test( 'Reveal.getPreviousSlide/getCurrentSlide', function() {
-		Reveal.slide( 0, 0 );
-		Reveal.slide( 1, 0 );
-
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-		var secondSlide = document.querySelector( '.reveal .slides>section:nth-child(2)>section' );
-
-		equal( Reveal.getPreviousSlide(), firstSlide, 'previous is slide #0' );
-		equal( Reveal.getCurrentSlide(), secondSlide, 'current is slide #1' );
-	});
-
-	test( 'Reveal.getScale', function() {
-		ok( typeof Reveal.getScale() === 'number', 'has scale' );
-	});
-
-	test( 'Reveal.getConfig', function() {
-		ok( typeof Reveal.getConfig() === 'object', 'has config' );
-	});
-
-	test( 'Reveal.configure', function() {
-		strictEqual( Reveal.getConfig().loop, false, '"loop" is false to start with' );
-
-		Reveal.configure({ loop: true });
-		strictEqual( Reveal.getConfig().loop, true, '"loop" has changed to true' );
-
-		Reveal.configure({ loop: false, customTestValue: 1 });
-		strictEqual( Reveal.getConfig().customTestValue, 1, 'supports custom values' );
-	});
-
-	test( 'Reveal.availableRoutes', function() {
-		Reveal.slide( 0, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: false, up: false, down: false, right: true }, 'correct for first slide' );
-
-		Reveal.slide( 1, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: true, up: false, down: true, right: true }, 'correct for vertical slide' );
-	});
-
-	test( 'Reveal.next', function() {
-		Reveal.slide( 0, 0 );
-
-		// Step through vertical child slides
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 1, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined } );
-
-		// Step through fragments
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 } );
-	});
-
-	test( 'Reveal.next at end', function() {
-		Reveal.slide( 3 );
-
-		// We're at the end, this should have no effect
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-	});
-
-
-	// ---------------------------------------------------------------
-	// FRAGMENT TESTS
-
-	QUnit.module( 'Fragments' );
-
-	test( 'Sliding to fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 }, 'Reveal.slide( 2, 0, -1 )' );
-
-		Reveal.slide( 2, 0, 0 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'Reveal.slide( 2, 0, 0 )' );
-
-		Reveal.slide( 2, 0, 2 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'Reveal.slide( 2, 0, 2 )' );
-
-		Reveal.slide( 2, 0, 1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'Reveal.slide( 2, 0, 1 )' );
-	});
-
-	test( 'Hiding all fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 1, 'one fragment visible when index is 0' );
-
-		Reveal.slide( 2, 0, -1 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when index is -1' );
-	});
-
-	test( 'Current fragment', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment at index -1' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 1, 'one current fragment at index 0' );
-
-		Reveal.slide( 1, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to next slide' );
-	});
-
-	test( 'Stepping through fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-
-		// forwards:
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'next() goes to next fragment' );
-
-		Reveal.right();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'right() goes to next fragment' );
-
-		Reveal.down();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'down() goes to next fragment' );
-
-		Reveal.down(); // moves to f #3
-
-		// backwards:
-
-		Reveal.prev();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'prev() goes to prev fragment' );
-
-		Reveal.left();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'left() goes to prev fragment' );
-
-		Reveal.up();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'up() goes to prev fragment' );
-	});
-
-	test( 'Stepping past fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 0, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when on previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 3, 'all fragments visible when on future slide' );
-	});
-
-	test( 'Fragment indices', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(2)' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 2, 'both fragments of same index are shown' );
-	});
-
-	test( 'Index generation', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		// These have no indices defined to start with
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '2' );
-	});
-
-	test( 'Index normalization', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(3)' );
-
-		// These start out as 1-4-4 and should normalize to 0-1-1
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '1' );
-	});
-
-	asyncTest( 'fragmentshown event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmentshown', _onEvent );
-
-		Reveal.slide( 2, 0 );
-		Reveal.slide( 2, 0 ); // should do nothing
-		Reveal.slide( 2, 0, 0 ); // should do nothing
-		Reveal.next();
-		Reveal.next();
-		Reveal.prev(); // shouldn't fire fragmentshown
-
-		start();
-
-		Reveal.removeEventListener( 'fragmentshown', _onEvent );
-	});
-
-	asyncTest( 'fragmenthidden event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmenthidden', _onEvent );
-
-		Reveal.slide( 2, 0, 2 );
-		Reveal.slide( 2, 0, 2 ); // should do nothing
-		Reveal.prev();
-		Reveal.prev();
-		Reveal.next(); // shouldn't fire fragmenthidden
-
-		start();
-
-		Reveal.removeEventListener( 'fragmenthidden', _onEvent );
-	});
-
-
-	// ---------------------------------------------------------------
-	// CONFIGURATION VALUES
-
-	QUnit.module( 'Configuration' );
-
-	test( 'Controls', function() {
-		var controlsElement = document.querySelector( '.reveal>.controls' );
-
-		Reveal.configure({ controls: false });
-		equal( controlsElement.style.display, 'none', 'controls are hidden' );
-
-		Reveal.configure({ controls: true });
-		equal( controlsElement.style.display, 'block', 'controls are visible' );
-	});
-
-	test( 'Progress', function() {
-		var progressElement = document.querySelector( '.reveal>.progress' );
-
-		Reveal.configure({ progress: false });
-		equal( progressElement.style.display, 'none', 'progress are hidden' );
-
-		Reveal.configure({ progress: true });
-		equal( progressElement.style.display, 'block', 'progress are visible' );
-	});
-
-	test( 'Loop', function() {
-		Reveal.configure({ loop: true });
-
-		Reveal.slide( 0, 0 );
-
-		Reveal.left();
-		notEqual( Reveal.getIndices().h, 0, 'looped from start to end' );
-
-		Reveal.right();
-		equal( Reveal.getIndices().h, 0, 'looped from end to start' );
-
-		Reveal.configure({ loop: false });
-	});
-
-
-	// ---------------------------------------------------------------
-	// EVENT TESTS
-
-	QUnit.module( 'Events' );
-
-	asyncTest( 'slidechanged', function() {
-		expect( 3 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'slidechanged', _onEvent );
-
-		Reveal.slide( 1, 0 ); // should trigger
-		Reveal.slide( 1, 0 ); // should do nothing
-		Reveal.next(); // should trigger
-		Reveal.slide( 3, 0 ); // should trigger
-		Reveal.next(); // should do nothing
-
-		start();
-
-		Reveal.removeEventListener( 'slidechanged', _onEvent );
-
-	});
-
-	asyncTest( 'paused', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'paused', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'paused', _onEvent );
-	});
-
-	asyncTest( 'resumed', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'resumed', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'resumed', _onEvent );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/niki/Makefile b/docs/slides/niki/Makefile
deleted file mode 100644
--- a/docs/slides/niki/Makefile
+++ /dev/null
@@ -1,45 +0,0 @@
-####################################################################
-SERVERHOME=nvazou@goto.ucsd.edu:~/public_html/liquidtutorial/
-####################################################################
-
-
-PANDOC=pandoc --columns=80  -s  --mathjax --slide-level=2
-SLIDY=$(PANDOC) -t slidy
-DZSLIDES=$(PANDOC) --highlight-style tango --css=slides.css -w dzslides
-HANDOUT=$(PANDOC) --highlight-style tango --css=text.css -w html5
-WEBTEX=$(PANDOC) -s --webtex -i -t slidy
-BEAMER=pandoc -t beamer
-LIQUID=liquid
-objects := $(patsubst %.lhs,%.lhs.slides.html,$(wildcard lhs/*.lhs))
-
-
-####################################################################
-
-all: slides copy
-
-slides: $(objects)
-
-lhs/%.lhs.markdown: lhs/%.lhs
-	-$(LIQUID) $?
-
-lhs/%.lhs.slides.html: lhs/%.lhs.markdown
-	$(DZSLIDES) $? -o $@ 
-
-lhs/%.lhs.slides.pdf: lhs/%.lhs.markdown
-	$(BEAMER) $? -o $@ 
-
-copy:
-	cp lhs/*lhs.html html/
-	cp lhs/*lhs.slides.html html/
-	cp css/*.css html/
-	cp -r fonts html/
-	cp index.html html/
-	cp Benchmarks.html html/
-
-clean:
-#	cd lhs/ && ../cleanup && cd ../
-#	cd html/ && rm -rf * && cd ../
-#	cp index.html html/
-
-upload: 
-	scp -r html/* $(SERVERHOME)
diff --git a/docs/slides/niki/fonts/OFT.txt b/docs/slides/niki/fonts/OFT.txt
deleted file mode 100644
--- a/docs/slides/niki/fonts/OFT.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-﻿Copyright (c) 2011, ParaType Ltd. (http://www.paratype.com/public),
-with Reserved Font Names "PT Sans", "PT Serif", "PT Mono" and "ParaType".
-
-This Font Software is licensed under the Open Font License, Version 1.1 
-This license is copied below, and is also available with a FAQ at: 
-http://scripts.sil.org/OFL
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded, 
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/slides/niki/fonts/PT_Mono-Regular.ttf b/docs/slides/niki/fonts/PT_Mono-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/fonts/PT_Mono-Regular.ttf and /dev/null differ
diff --git a/docs/slides/niki/fonts/PT_Sans-Narrow-Web-Bold.ttf b/docs/slides/niki/fonts/PT_Sans-Narrow-Web-Bold.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/fonts/PT_Sans-Narrow-Web-Bold.ttf and /dev/null differ
diff --git a/docs/slides/niki/fonts/PT_Sans-Narrow-Web-Regular.ttf b/docs/slides/niki/fonts/PT_Sans-Narrow-Web-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/fonts/PT_Sans-Narrow-Web-Regular.ttf and /dev/null differ
diff --git a/docs/slides/niki/fonts/PT_Sans-Web-Bold.ttf b/docs/slides/niki/fonts/PT_Sans-Web-Bold.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/fonts/PT_Sans-Web-Bold.ttf and /dev/null differ
diff --git a/docs/slides/niki/fonts/PT_Sans-Web-BoldItalic.ttf b/docs/slides/niki/fonts/PT_Sans-Web-BoldItalic.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/fonts/PT_Sans-Web-BoldItalic.ttf and /dev/null differ
diff --git a/docs/slides/niki/fonts/PT_Sans-Web-Italic.ttf b/docs/slides/niki/fonts/PT_Sans-Web-Italic.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/fonts/PT_Sans-Web-Italic.ttf and /dev/null differ
diff --git a/docs/slides/niki/fonts/PT_Sans-Web-Regular.ttf b/docs/slides/niki/fonts/PT_Sans-Web-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/fonts/PT_Sans-Web-Regular.ttf and /dev/null differ
diff --git a/docs/slides/niki/html/benchmarks.png b/docs/slides/niki/html/benchmarks.png
deleted file mode 100644
Binary files a/docs/slides/niki/html/benchmarks.png and /dev/null differ
diff --git a/docs/slides/niki/html/fonts/OFT.txt b/docs/slides/niki/html/fonts/OFT.txt
deleted file mode 100644
--- a/docs/slides/niki/html/fonts/OFT.txt
+++ /dev/null
@@ -1,93 +0,0 @@
-﻿Copyright (c) 2011, ParaType Ltd. (http://www.paratype.com/public),
-with Reserved Font Names "PT Sans", "PT Serif", "PT Mono" and "ParaType".
-
-This Font Software is licensed under the Open Font License, Version 1.1 
-This license is copied below, and is also available with a FAQ at: 
-http://scripts.sil.org/OFL
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded, 
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/docs/slides/niki/html/fonts/PT_Mono-Regular.ttf b/docs/slides/niki/html/fonts/PT_Mono-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/html/fonts/PT_Mono-Regular.ttf and /dev/null differ
diff --git a/docs/slides/niki/html/fonts/PT_Sans-Narrow-Web-Bold.ttf b/docs/slides/niki/html/fonts/PT_Sans-Narrow-Web-Bold.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/html/fonts/PT_Sans-Narrow-Web-Bold.ttf and /dev/null differ
diff --git a/docs/slides/niki/html/fonts/PT_Sans-Narrow-Web-Regular.ttf b/docs/slides/niki/html/fonts/PT_Sans-Narrow-Web-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/html/fonts/PT_Sans-Narrow-Web-Regular.ttf and /dev/null differ
diff --git a/docs/slides/niki/html/fonts/PT_Sans-Web-Bold.ttf b/docs/slides/niki/html/fonts/PT_Sans-Web-Bold.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/html/fonts/PT_Sans-Web-Bold.ttf and /dev/null differ
diff --git a/docs/slides/niki/html/fonts/PT_Sans-Web-BoldItalic.ttf b/docs/slides/niki/html/fonts/PT_Sans-Web-BoldItalic.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/html/fonts/PT_Sans-Web-BoldItalic.ttf and /dev/null differ
diff --git a/docs/slides/niki/html/fonts/PT_Sans-Web-Italic.ttf b/docs/slides/niki/html/fonts/PT_Sans-Web-Italic.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/html/fonts/PT_Sans-Web-Italic.ttf and /dev/null differ
diff --git a/docs/slides/niki/html/fonts/PT_Sans-Web-Regular.ttf b/docs/slides/niki/html/fonts/PT_Sans-Web-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/niki/html/fonts/PT_Sans-Web-Regular.ttf and /dev/null differ
diff --git a/docs/slides/niki/html/liquid.css b/docs/slides/niki/html/liquid.css
deleted file mode 100644
--- a/docs/slides/niki/html/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-.hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-  // font-weight: bold;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   /* color: #00FFFF; color: #0E84B5; */
-  //font-weight: bold;  
-}
-
-.hs-definition { 
-  color: #06287E 
-  /* font-weight: bold; */ 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  // font-size: 120%;
-  // font-family: Bitstream Vera Sans Mono,monospace;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/niki/html/slides.css b/docs/slides/niki/html/slides.css
deleted file mode 100644
--- a/docs/slides/niki/html/slides.css
+++ /dev/null
@@ -1,258 +0,0 @@
-@font-face {
-	font-family: 'PT Mono';
-    font-style: normal;
-	font-weight: normal;
-	src: local("☺"), url('fonts/PT_Mono-Regular.ttf') format('truetype');
-}
-@font-face {
-	font-family: 'PT Sans';
-    font-style: normal; 
-	font-weight: bold;
-	src: local("☺"), url('fonts/PT_Sans-Web-Bold.ttf') format('truetype');
-}@font-face {
-	font-family: 'PT Sans';
-    font-style: italic;
-	font-weight: normal;
-	src: local("☺"), url('fonts/PT_Sans-Web-Italic.ttf') format('truetype');
-}@font-face {
-	font-family: 'PT Sans';
-    font-style: normal;
-	font-weight: normal;
-	src: local("☺"), url('fonts/PT_Sans-Web-Regular.ttf') format('truetype');
-}
-@font-face {
-	font-family: 'PT Sans Narrow';
-    font-style: normal;
-	font-weight: bold;
-	src: local("☺"), url('fonts/PT_Sans-Narrow-Web-Bold.ttf') format('truetype');
-}
-@font-face {
-	font-family: 'PT Sans Narrow';
-    font-style: normal;
-	font-weight: normal;
-	src: local("☺"), url('fonts/PT_Sans-Narrow-Web-Regular.ttf') format('truetype');
-}
-html {
-    height: 100%;
-	background-color: #fefffe;
-}
-body {
-	width: 1024px !important;
-    height: 600px !important;
-	margin-left: -512px !important;
-	margin-top: -300px !important;
-}
-section {
-	background: transparent;
-	color: #000;
-	width: 100%  !important;
-	/* width: 800px !important; */
-	height: 600px !important;
-    padding: 50px 112px 0;	
-	font-family: 'PT Sans', sans-serif;
-	font-size: 16pt;
-}
-
-body :first-child {
-}
-address, blockquote, dl, fieldset, form, h1, h2, h3, h4, h5, h6, hr, ol, p, pre, table, ul, dl { padding: 10px 20px 10px 20px; }
-h1, h2, h3 {
-	text-align: left;
-	color: #666; 
-	font-family: 'PT Sans Narrow', sans-serif;
-	font-weight: bold;
-}
-input, select {
-border 0.5pt solid black;
-font-size: 16pt;
-line-height: 10pt;
-padding: 0 0 -2.5pt 0;
-z-index:1;
-}
-ul, ol {
-	margin: 10px 10px 10px 50px;
-}
-a { color: #205CB3; }
-section.titleslide h1 { margin-top: 200px; }
-h1.title { margin-top: 150px; font-size:200%; margin-bottom: 20px; text-align: center; text-shadow:0px 2px 1px #444; 
--webkit-transition: color 1s ease-in-out;
--moz-transition: color 1s ease-in-out;
- }
-h1.title:hover {
-color: #C43628;
-}
-h2.author { font-size: 120%; margin-top: 0px; margin-bottom: 0px; text-align:center; color: #555; font-family: 'PT Sans Narrow'; font-weight: normal;}
-h3.date { font-size: 80%; margin-top: 0px; text-align: center; color: #555; font-family: 'PT Mono'; font-weight: normal;}
-h1 { font-size: 180%; margin: 0 0 10px; text-shadow:0px 2px 1px #fff;}
-h2 { font-size: 140%; } 
-h3 { font-size: 100%; }
-blockquote { font-style: italic }
-q {
-	display: inline-block;
-	width: 700px;
-	height: 600px;
-	background-color: black;
-	color: white;
-	font-size: 60px;
-	padding: 50px;
-}
-footer {
-	position: absolute;
-	bottom: 10px;
-	right: 20px;
-	text-shadow: white 0px 1px 0px, rgba(0, 0, 0, 0.2) 0 2px 5px;
-}
-/* JHALA: pre, code { background: transparent; } */
-pre, code {background-color:#E6F0FA;}
-
-pre { padding: 10px 50px; }
-td > pre { padding: 0px; }
-td { padding: 5px; }
-::-moz-selection { background-color: khaki; }
-code { font-family: 'PT Mono'; font-size: 90%; }
-code > span.co { font-style: normal; }
-code > span.kw { font-weight: normal; }
-code > span.er { font-weight: normal; }
-
-/* Transition effect */
-/* Feel free to change the transition effect for original
-animations. See here:
-https://developer.mozilla.org/en/CSS/CSS_transitions
-How to use CSS3 Transitions: */
-section {
-	-moz-transition: left 400ms ease-in-out 0s;
-	-webkit-transition: left 400ms ease-in-out 0s;
-	-ms-transition: left 400ms ease-in-out 0s;
-	transition: left 400ms ease-in-out 0s;
-}
-
-/* Before */
-section { left: -150%; }
-/* Now */
-section[aria-selected] { left: 0; }
-/* After */
-section[aria-selected] ~ section { left: +150%; }
-
-/* Incremental elements */
-
-/* By default, visible */
-.incremental > * { opacity: 1; }
-
-/* The current item */
-.incremental > *[aria-selected] { color: red; opacity: 1; }
-
-/* The items to-be-selected */
-.incremental > *[aria-selected] ~ * { opacity: 0.2; }
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-a { color: #205CB3; }
-
-.hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-  // font-weight: bold;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   /* color: #00FFFF; color: #0E84B5; */
-  //font-weight: bold;  
-}
-
-.hs-definition { 
-  color: #06287E 
-  /* font-weight: bold; */ 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 60%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 80%;
-  // font-family: Bitstream Vera Sans Mono,monospace;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/niki/lhs/AbstractRefinements.lhs b/docs/slides/niki/lhs/AbstractRefinements.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/AbstractRefinements.lhs
+++ /dev/null
@@ -1,254 +0,0 @@
-Abstract Refinements
----------------------
-
-\begin{code}
-module AbstractRefinements where
-
-import Prelude hiding (max)
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-\end{code}
-
-Polymorphic Max Function
------------------------
-\begin{code} Consinder a polymorphic max function:
-max     :: a -> a -> a
-max x y = if x >= y then x else y
-\end{code}
-
-<br>
-
-\begin{code} We can instantiate `a` with `Odd`
-max     :: Odd -> Odd -> Odd
-
-maxOdd :: Odd
-maxOdd = max 3 7
-\end{code}
-
-
-Polymorphic Max in Haskell
------------------------
-\begin{code} In Haskell the type of max is
-max     :: Ord a => a -> a -> a
-\end{code}
-
-
-<br>
-
-We could **ignore** the class constraints, and procced as before:
-
-\begin{code} Instantiate `a` with `Odd`
-max     :: Odd -> Odd -> Odd
-
-maxOdd :: Odd
-maxOdd = max 3 7
-\end{code}
-
-
-Polymorphic Add in Haskell
------------------------
-
-\begin{code} But this can lead to **unsoundness**:
-max     :: Ord a => a -> a -> a
-(+)     :: Num a => a -> a -> a
-\end{code}
-
-<br>
-
-So, **ignoring** class constraints allows us to: 
-\begin{code} instantiate `a` with `Odd`
-(+)     :: Odd -> Odd -> Odd
-
-addOdd :: Odd
-addOdd = 3 + 7
-\end{code}
-
-
-Polymorphism via Parametric Invariants 
---------------------------------------
-
-`max` returns *one of* its two inputs `x` and `y`. 
-
-- **If** *both inputs* satisfy a property  
-
-- **Then** *output* must satisfy that property
-
-This holds, **regardless of what that property was!**
- 
-- That  is, we can **abstract over refinements**
-
-- Or,  **parameterize** a type over its refinements.
-
-Parametric Invariants
---------------------- 
-
-\begin{code}
-{-@ max :: forall <p :: a -> Prop>. Ord a => a<p> -> a<p> -> a<p> @-}
-max     :: Ord a => a -> a -> a
-max x y = if x <= y then y else x 
-\end{code}
-
-
-
-Where
-
-- `a<p>` is just an abbreviation for `{v:a | (p v)}`
-
-
-This type states explicitly:
-
-- **For any property** `p`, that is a property of `a`, 
-
-- `max` takes two **inputs** of which satisfy `p`,
-
-- `max` returns an **output** that satisfies `p`. 
-
-
-
-Using Abstract Refinements
---------------------------
-
-- **If** we call `max` with two arguments with the same concrete refinement,
-
-- **Then** the `p` will be instantiated with that concrete refinement,
-
-- **The output** of the call will also enjoy the concrete refinement.
-
-
-
-\begin{code}
-{-@ type Odd = {v:Int | (v mod 2) = 1} @-}
-
-{-@ maxOdd :: Odd @-}
-maxOdd     :: Int
-maxOdd     = max 3 5
-\end{code}
-
-
-Abstract Refinements in Type Constructors
------------------------------------------
-
-Types cannot track information of monomorphic arguments:
-
-\begin{code}
-data F = F {w::Int}
-\end{code}
-
-<br>
-
-The type `F` cannot give us information about the field `x`.
-
-\begin{code}
-foo = let f = F 0 in -- :: f :: F
-      case f of 
-      F x -> liquidAssert (x >= 0)
-\end{code}
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=AbstractRefinements.hs" target= "_blank">Demo:</a> 
-Lets solve this error using Abstract Refinements
-
-Abstract Refinements in Type Constructors
------------------------------------------
-
-- Abstract over the refinement you care
-\begin{code}
-data G = G {y::Int{- <p> -}}
-\end{code}
-
-- Move it to the left-hand side
-\begin{code}
-{-@ data G <p :: Int -> Prop> = G (y::Int<p>) @-}
-\end{code}
-
-- The type `G <p>` now describes the field `x`.
-
-\begin{code}
-bar = let f = G 0 in -- :: f :: G <{v = 0}>
-      case f of 
-      G x -> liquidAssert (x >= 0)
-\end{code}
-
-Abstract Refinements in Lists
------------------------------------------
-
-\begin{code} Remember increasing Lists?
-data IL a = N | C (x :: a) (xs :: L {v:a | x <= v})
-\end{code}
-
-- Abstract over the refinement you care
-\begin{code}
-data L a = N | C {x :: a, xs :: L a {- v:a | p v x -}}
-\end{code}
-
-- Move it to the left-hand side
-\begin{code}
-{-@ data L a <p :: a -> a -> Prop> = 
-      N 
-    | C (x :: a) (xs :: L <p> a<p x>)  @-}
-\end{code}
-
-<br>
-
-We can get back increasing Lists:
-\begin{code}
-{-@ type IncrL a = L <{\x v -> x <= v}> a @-}
-\end{code}
-
-
-Multiple Instantiations
------------------------
-
-\begin{code} Now increasing lists 
-type IncrL a = L <{\x v -> x <= v}> a
-\end{code}
-
-<br>
-
-\begin{code} Co-exist with decreasing ones
-type DecrL a = L <{\x v -> x >= v}> a
-\end{code}
-
-Ghc Sort
---------
-
-We can now verify algorithms that use **both** increasing and decreasing lists
-
-\begin{code}
-{-@ type OList a = [a]<{\hd v -> hd <= v}> @-}
-
-{-@ sort :: (Ord a) => [a] -> OList a  @-}
-sort :: (Ord a) => [a] -> [a]
-sort = mergeAll . sequences
-  where
-    sequences (a:b:xs)
-      | a `compare` b == GT = descending b [a]  xs
-      | otherwise           = ascending  b (a:) xs
-    sequences [x] = [[x]]
-    sequences []  = [[]]
-
-    descending a as (b:bs)
-      | a `compare` b == GT = descending b (a:as) bs
-    descending a as bs      = (a:as): sequences bs
-
-    ascending a as (b:bs)
-      | a `compare` b /= GT = ascending b (\ys -> as (a:ys)) bs
-    ascending a as bs       = as [a]: sequences bs
-\end{code}
-
-Ghc Sort : Helper Functions
----------------------------
-
-\begin{code}
-mergeAll [x] = x
-mergeAll xs  = mergeAll (mergePairs xs)
-
-mergePairs (a:b:xs) = merge1 a b: mergePairs xs
-mergePairs [x]      = [x]
-mergePairs []       = []
-
-merge1 (a:as') (b:bs')
-  | a `compare` b == GT = b:merge1 (a:as')  bs'
-  | otherwise           = a:merge1 as' (b:bs')
-merge1 [] bs            = bs
-merge1 as []            = as
-\end{code}
diff --git a/docs/slides/niki/lhs/Array.lhs b/docs/slides/niki/lhs/Array.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/Array.lhs
+++ /dev/null
@@ -1,226 +0,0 @@
-%Indexed-Dependent Refinements
-
-Indexed-Dependent Refinements
------------------------------
-
-\begin{code}
-module LiquidArray where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume)
-
-{-@ LIQUID "--no-termination" @-}
-\end{code}
-
-Indexed-Dependent Refinements
------------------------------
-
-We define a Vector of `a`s 
-implemented as a function from `Int` to `a`s <br>
-<br>
-
-\begin{code}
-data Vec a = V (Int -> a)
-\end{code}
-
-Abstract Over the Domain and Range
-----------------------------------
-
-We parameterize the definition with two abstract refinements:
-<br>
-<br>
-
-\begin{code}
-{-@ data Vec a <dom :: Int -> Prop, rng :: Int -> a -> Prop>
-      = V {a :: i:Int<dom> -> a <rng i>}
-  @-}
-\end{code}
-
-
-- `dom`: describes the *domain* 
-
-- `rng`: describes each value with respect to its index
-
-Describing Vectors
-------------------
-
-\begin{code}By instantiating these two predicates, we describe Vector's *domain* and *range*
-{-@ data Vec a <dom :: Int -> Prop, rng :: Int -> a -> Prop>
-      = V {a :: i:Int<dom> -> a <rng i>}
-  @-}
-\end{code}
-<br>
-
-A vector of `Int` *defined on* values less than `42`
-*containing values* equal to their index:
-<br>
-<br>
-
-\begin{code}
-{-@ type IdVec = 
-      Vec <{\v -> (v < 42)}, {\j v -> (v = j)}> Int
-  @-}
-\end{code}
-
-Describing Vectors
-------------------
-\begin{code}By instantiating these two predicates, we describe Vector's *domain* and *range*
-{-@ data Vec a <dom :: Int -> Prop, rng :: Int -> a -> Prop>
-      = V {a :: i:Int<dom> -> a <rng i>}
-  @-}
-\end{code}
-<br>
-
-A vector *defined on* the range `[0..n)` with its *last element* equal to `0`:
-<br>
-<br>
-
-\begin{code}
-{-@ type ZeroTerm N = 
-     Vec <{\v -> (0 <= v && v < N)}, {\j v -> (j = N - 1 => v = 0)}> Int
-  @-}
-\end{code}
-
-Describing Vectors
-------------------
-\begin{code}By instantiating these two predicates, we describe Vector's *domain* and *range*
-{-@ data Vec a <dom :: Int -> Prop, rng :: Int -> a -> Prop>
-      = V {a :: i:Int<dom> -> a <rng i>}
-  @-}
-\end{code}
-<br>
-
-
-A vector *defined on* integers whose *value at index `j`* is either 
-`0` or the `j`th fibonacci:
-<br>
-<br>
-
-\begin{code}
-{-@ type FibV =  
-     Vec <{\v -> 0=0}, {\j v -> ((v != 0) => (v = (fib j)))}> Int 
-  @-}
-\end{code}
-
-
-Operations on Vectors
----------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target= "_blank">Demo:</a> 
-
-We give appropriate types to vector operations (empty, set, get...)
-
-- This means *abstracting* over the domain and range
-
-
-Empty
------
-
-`empty` returns a Vector whose domain is always false
-<br>
-<br>
-
-\begin{code}
-{-@ empty :: forall <p :: Int -> a -> Prop>. Vec < {v:Int | 0=1}, p> a @-}
-
-empty     :: Vec  a
-empty     = V $ \_ -> (error "Empty array!")
-\end{code}
-
-Typing Get
-----------
-
-If `i` satisfies the domain then
-if we `get` the `i`th element of an array, 
-the result should satisfy the range at `i`
-<br>
-<br>
-
-\begin{code}
-{-@ get :: forall a <r :: Int -> a -> Prop, d :: Int -> Prop>.
-           i: Int<d>
-        -> a: Vec<d, r> a
-        -> a<r i> @-}
-
-get :: Int -> Vec a -> a
-get i (V f) = f i
-\end{code}
-
-Typing Set
-----------
-
-If `i` satisfies the domain then
-if we `set` the `i`th element of a Vector to a value
-that satisfies range at `i`, 
-then Vector's domain will be extended with `i`
-<br>
-<br>
-
-\begin{code}
-{-@ set :: forall a <r :: Int -> a -> Prop, d :: Int -> Prop>.
-           i: Int<d>
-        -> x: a<r i>
-        -> a: Vec < {v:Int<d> | v != i}, r> a
-        -> Vec <d, r> a @-}
-
-set :: Int -> a -> Vec a -> Vec a
-set i v (V f) = V $ \k -> if k == i then v else f k
-\end{code}
-
-Using Vectors
--------------
-
-\begin{code}Remember the fibonacci memoization Vector:
-type FibV = 
-     Vec <{\v -> 0=0}, {\j v -> ((v != 0) => (v = (fib j)))}> Int
-\end{code}
-<br>
-
-Where `fib` is an *uninterprented function* 
-\begin{code}
-{-@ measure fib :: Int -> Int @-}
-\end{code}
-<br>
-
-We used `fib` to define the `axiom_fib`
-
-\begin{code}
-{-@ predicate Fib I = 
-  (fib i) = (if (i <= 1) then 1 else ((fib (i-1)) + (fib (i-2))))
-  @-}
-
-{-@ assume axiom_fib :: i:Int -> {v: Bool | ((Prop v) <=> (Fib i))} @-}
-
-axiom_fib :: Int -> Bool
-axiom_fib i = undefined
-\end{code}
-
-
-Fast Fibonacci
---------------
-Now we can efficiently compute the `i`th fibonacci number
-
-\begin{code}
-{-@ fastFib :: x:Int -> {v:Int | v = fib(x)} @-}
-fastFib     :: Int -> Int
-fastFib n   = snd $ fibMemo (V (\_ -> 0)) n
-\end{code}
-
-Fibonacci Memo
---------------
-
-\begin{code}
-{-@ fibMemo :: FibV -> i:Int -> (FibV, {v: Int | v = (fib i)}) @-}
-
-fibMemo :: Vec Int -> Int -> (Vec Int, Int)
-fibMemo t i 
-  | i <= 1    
-  = (t, liquidAssume (axiom_fib i) (1 :: Int))
-  
-  | otherwise 
-  = case get i t of   
-      0 -> let (t1, n1) = fibMemo t  (i-1)
-               (t2, n2) = fibMemo t1 (i-2)
-               n        = liquidAssume (axiom_fib i) (n1 + n2)
-            in (set i n t2,  n)
-      n -> (t, n)
-\end{code}
diff --git a/docs/slides/niki/lhs/Composition.lhs b/docs/slides/niki/lhs/Composition.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/Composition.lhs
+++ /dev/null
@@ -1,103 +0,0 @@
-% Function Composition
-
-Function Composition
---------------------
-
-\begin{code}
-module Composition where
-\end{code}
-
-A Plus Function
----------------
-
-Consider a simple `plus` function 
-
-\begin{code}
-{-@ plus :: x:Int -> y:Int -> {v:Int | v = x + y} @-}
-plus     :: Int -> Int -> Int
-plus x y = x + y
-\end{code}
-
-A Simple Addition 
------------------
-
-Consider a simple use of `plus` a function that adds `3` to its input:
-
-\begin{code}
-{-@ plus3' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3'     :: Int -> Int
-plus3' x   = x + 3
-\end{code}
-
-- The refinement type captures its behaviour...
-
-- ... and LiquidHaskell easily verifies this type.
-
-A Composed Variant
-------------------
-
-Instead, suppose we defined the previous function by composition 
-
-We first add `2` to the argument and then add `1` to the intermediate result...
-
-\begin{code}
-{-@ plus3'' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3''     :: Int -> Int
-plus3''     = (plus 1) . (plus 2)
-\end{code}
-
-but verification **fails** as we need a way to **compose** the refinements!
-
-**Problem** What is a suitable description of the compose operator
-
-\begin{code} _ 
-(.) :: (b -> c) -> (a -> b) -> (a -> c)
-\end{code}
-
-that lets us **relate** `a` and `c` via `b` ?
-
-
-
-Composing Refinements, Abstractly
----------------------------------
-
-- We can analyze the *composition* operator
-
-- With a very *descriptive* abstract refinement type!
-
-\begin{code}
-
-{-@ cc :: forall < p :: b -> c -> Prop
-                , q :: a -> b -> Prop>.
-         f:(x:b -> c<p x>) 
-      -> g:(x:a -> b<q x>) 
-      -> y:a 
-      -> exists[z:b<q y>].c<p z>
- @-}
-
-cc :: (b -> c) -> (a -> b) -> a -> c
-cc f g x = f (g x)
-\end{code}
-
-Using Composition
------------------
-
-We can verify the desired `plus3` function:
-
-\begin{code}
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     :: Int -> Int
-plus3     = (+ 1) `cc` (+ 2)
-\end{code}
-
-LiquidHaskell verifies the above, by **instantiating**
-
-- `p` with `v = x + 1`
-- `q` with `v = x + 2`
-
-which lets it infer that the output of `plus3` has type:
-
-- `exists [z:{v=y+2}]. {v = z + 1}`
-
-which is a subtype of `{v:Int | v = 3}`
-
diff --git a/docs/slides/niki/lhs/Inductive.lhs b/docs/slides/niki/lhs/Inductive.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/Inductive.lhs
+++ /dev/null
@@ -1,178 +0,0 @@
-% Inductive Refinements
-
-Inductive Refinements
----------------------
-
-\begin{code}
-module Loop where
-import Prelude hiding ((!!), foldr, length, (++))
-import Measures
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-\end{code}
-
-
-`loop` Revisited
-----------------
-
-Recall the **higher-order** `loop` function <br>
-
-\begin{code}
-loop :: Int -> Int -> a -> (Int -> a -> a) -> a
-loop lo hi base f            = go lo base
-  where go i acc | i < hi    = go (i+1) (f i acc)
-                 | otherwise = acc
-\end{code}
-
-We used `loop` to write <br>
-
-\begin{code}
-
-{-@ add :: n:Nat -> m:{v:Int| v >= 0} -> {v:Int| v = m + n} @-}
-add :: Int -> Int -> Int
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-**Problem:** Verification requires an **index dependent loop invariant** `p` 
-
-- Which relates index `i` with accumulator `acc`: formally `(p acc i)`
-
-Loop Invariants and Induction
------------------------------
-\begin{code} Recall the **higher-order** `loop` function
-loop :: Int -> Int -> a -> (Int -> a -> a) -> a
-loop lo hi base f            = go lo base
-  where go i acc | i < hi    = go (i+1) (f i acc)
-                 | otherwise = acc
-\end{code}
-
-To verify output satisfies relation at `hi` we prove that **if**
-
-- **base case** initial accumulator `base` satisfies invariant at `lo`
-    - `(p base lo)`
-
-- **induction step** `f` **preserves** the invariant at `i`
-    - **if** `(p acc i)` <b>then</b> `(p (f i acc) (i+1))`
-
-- **then** "by induction" result satisfies invariant at `hi`
-    - `(p (loop lo hi base f) hi)`
-
-
-Encoding Induction With Abstract Refinements
---------------------------------------------
-
-We capture induction with an **abstract refinement type** for `loop` <br>
-
-\begin{code}
-{-@ loop :: forall a <p :: Int -> a -> Prop>.
-             lo:Int 
-          -> hi:{v:Int|lo <= v}
-          -> base:a<p lo> 
-          -> f:(i:Int -> a<p i> -> a<p (i+1)>) 
-          -> a<p hi>
-  @-}
-\end{code}
-
-<br>
-
-\begin{code} `p` is the index dependent invariant!
-p     :: Int -> a -> Prop>                  -- ind  hyp 
-base  :: a<p lo>                            -- base case 
-f     :: (i:Int -> a<p i> -> a <p (i+1)>)   -- ind. step
-out   :: a<p hi>                            -- output holds at hi         
-\end{code}
-
-
-Encoding Induction With Abstract Refinements
---------------------------------------------
-
-\begin{code} Lets revisit 
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br> The invariant is: `p` instantiated with `\i acc -> acc = i + n`
-
-**base case:**  `(p 0 n)` holds as `n = 0 + n`
-
-**ind. step**  `\_ z -> z + 1` preserves invariant
-
-- `acc =  i + n` *implies* `acc + 1 = (i + 1) + n`
-
-**output** hence, `loop 0 m n (\_ z -> z + 1) = m + n`
-
-Which lets us verify that
-
-\begin{code}.
-add :: n:Nat -> m:Nat -> {v:Int| v = m + n}
-\end{code}
-
-Structural Induction With Abstract Refinements
-----------------------------------------------
-
-Same idea applies for induction over *structures*
-
-We define a `foldr` function that resembles loop.
-\begin{code}
-\end{code}
-\begin{code}
-{-@ foldr :: forall a b <p :: L a -> b -> Prop>. 
-                (xs:L a -> x:a -> b <p xs> -> b <p (Measures.C x xs)>) 
-              -> b <p Measures.N> 
-              -> ys: L a
-              -> b <p ys>
-  @-}
-foldr :: (L a -> a -> b -> b) -> b -> L a -> b
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{code}
-
-<br>
-
-- **base case** `b` is related to nil `N`
-- **ind. step** `f` extends relation over cons `C`
-- **output** relation holds over entire list `ys`
-
-
-
-Structural Induction With Abstract Refinements
-----------------------------------------------
-
-We can now verify <br>
-
-\begin{code}
-{-@ size :: xs:L a -> {v: Int | v = (llen xs)} @-}
-size :: L a -> Int
-size = foldr (\_ _ n -> n + 1) 0
-\end{code}
-
-<br>
-
-Here, the relation 
-
-- `(p xs acc)` 
-
-is **automatically instantiated** with
-
-- `acc = (llen xs)`
-
-Structural Induction With Abstract Refinements
-----------------------------------------------
-
-Similarly we can now verify <br>
-
-\begin{code}_
-{-@ ++ :: xs:L a -> ys:L a -> {v:L a | (llen v) = (llen xs) + (llen ys)} @-} 
-xs ++ ys = foldr (\_ z zs -> C z zs) ys xs 
-\end{code}
-
-<br>
-
-Here, the relation 
-
-- `(p xs acc)` 
-
-is **automatically instantiated** with
-
-- `(llen acc) = (llen xs) + (llen ys)`
-
-
diff --git a/docs/slides/niki/lhs/Laziness.lhs b/docs/slides/niki/lhs/Laziness.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/Laziness.lhs
+++ /dev/null
@@ -1,99 +0,0 @@
-% Laziness
-
-Laziness
---------
-
-
-\begin{code}
-module Laziness where
-import Language.Haskell.Liquid.Prelude
-\end{code}
-
-
-Infinite Computations can lead to Unsoundness
-----------------------------------------------
-
-Infinite Computations can be refined with **false**
-\begin{code}
-{-@ foo :: n:Nat -> {v:Nat | v < n} @-}
-foo     :: Int -> Int
-foo n   | n > 0     = n - 1
-        | otherwise = foo n
-\end{code}
-
-<br>
-
-Under **false** anything can be proven
-\begin{code}
-prop = liquidAssert ((\x -> 0==1) (foo 0))
-\end{code}
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=TellingLies.hs" target=
-"_blank">Demo:</a> Check a real property here! 
-
-Our solution (Current Work)
----------------------------
-
-- Use **termination analysis** to track infinite computations
-
-- Use **true** refinements for infinite computations
-
-
-Size-based Termination Analysis
--------------------------------
-
-- Use refinement types to force the recursive argument to **decrease**
-\begin{code}
-{-@ unsafeFoo :: n:Nat -> {v:Nat | v < n} @-}
-unsafeFoo     :: Int -> Int
-  -- unsafeFoo :: n'{v:Nat | v < n} -> {v:Nat | v < n'}
-unsafeFoo n   | n > 0     = n - 1
-              | otherwise = unsafeFoo n
-\end{code}
-
-<br>
-
-- `prop` is safe, but the program is decided unsafe
-\begin{code}
-prop1 = liquidAssert ((\x -> 0==1) inf)
-  where inf = unsafeFoo 0
-\end{code}
-
-Refinements of infinite Computations
-------------------------------------
-If you need a non-terminating function, use `Lazy` to declare
-
- - We know that `foo` may not terminate
-
- - Its return type is refined with **true**
-
-\begin{code}
-{-@ Lazy safeFoo @-}
-{-@ safeFoo :: n:Nat -> {v:Int | true} @-}
-safeFoo    :: Int   -> Int
-safeFoo n   | n > 0     = n - 1
-            | otherwise = safeFoo n
-\end{code}
-
-<br>
-
-Now, `prop` is unsafe
-
-\begin{code}
-prop2 = liquidAssert ((\x -> 0==1) inf)
-  where inf = safeFoo 0
-\end{code}
-
-Restore Soundness
------------------
-
-- Use **termination analysis** to track infinite objects
-
-- Use **true** refinements for infinite objects
-
-`Foo` was declared `Lazy`
--------------------------
-\begin{code}
-{-@ Lazy foo @-}
-\end{code}
-
diff --git a/docs/slides/niki/lhs/List.lhs b/docs/slides/niki/lhs/List.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/List.lhs
+++ /dev/null
@@ -1,484 +0,0 @@
-% Recursive Invariants
-
-Recursive Invariants
---------------------
-
-\begin{code}
-module List where
-
-{-@ LIQUID "--no-termination" @-}
-\end{code}
-
-
-Recursive Invariants
---------------------
-
-Recall the definition of lists <br>
-
-\begin{code}
-infixr `C`
-data L a = N | C a (L a)
-\end{code}
-
-Lets parameterize the definition with an abstract refinement `p` <br>
-
-\begin{code}
-{-@ data L a <p :: a -> a -> Prop>
-      = N 
-      | C (h :: a) (tl :: (L <p> a<p h>))
-  @-}
-\end{code}
-
-- `p` is a binary relation between two `a` values
-
-- definition relates *head* with all the *tail* elements 
-
-**Recursive** : So `p` holds between **every pair** of list elements!
-
-Recursive Invariants: Example
------------------------------
-
-Consider a list with three elements <br>
-
-\begin{code} _ 
-h1 `C` h2 `C` h3 `C` N :: L <p> a 
-\end{code}
-
-Recursive Invariants: Example
------------------------------
-
-If we unfold the list **once** we get <br>
-
-\begin{code} _
-h1              :: a
-h2 `C` h3 `C` N :: L <p> a<p h1> 
-\end{code}
-
-Recursive Invariants: Example
------------------------------
-
-If we unfold the list a **second** time we get <br>
-
-\begin{code} _ 
-h1       :: a
-h2       :: a<p h1>  
-h3 `C` N :: L <p> a<p h1 && p h2> 
-\end{code}
-
-Recursive Invariants: Example
------------------------------
-
-Finally, with a **third** unfold we get <br>
-
-\begin{code} _ 
-h1 :: a
-h2 :: a<p h1>  
-h3 :: a<p h1 && p h2>  
-N  :: L <p> a<p h1 && p h2 && p h3> 
-\end{code}
-
-<br>
-
-Note how `p` holds between **every pair** of elements in the list. 
-
-Using Recursive Invariants
---------------------------
-
-That was a rather *abstract*.
-
-How would we **use** the fact that `p` holds between **every pair** ?
-
-
-Using Recursive Invariants
---------------------------
-
-That was a rather *abstract*.
-
-How would we **use** the fact that `p` holds between **every pair** ?
-
-<br>
-
-Lets *instantiate* `p` with a concrete refinement 
-
-<br>
-
-\begin{code}
-{-@ type SL a = L <{\hd v -> hd <= v}> a @-}
-\end{code}
-
-- The refinement says `hd` is less than the arbitrary tail element `v`.
-
-- Thus `SL` denotes lists sorted in **increasing order**!
-
-Using Recursive Invariants
---------------------------
-
-LiquidHaskell verifies that the following list is indeed increasing...
-
-<br>
-
-\begin{code}
-{-@ slist :: SL Int @-}
-slist :: L Int
-slist = 1 `C` 6 `C` 12 `C` N
-\end{code}
-
-<br> ... and complains that the following is not: <br>
-
-
-\begin{code}
-{-@ slist' :: SL Int @-}
-slist' :: L Int
-slist' = 6 `C` 1 `C` 12 `C` N
-\end{code}
-
-
-InsertSort
-----------
-
-More interestingly, we can verify that various sorting algorithms return sorted lists.
-
-<br>
-
-\begin{code}
-{-@ insertSort' :: (Ord a) => [a] -> SL a @-}
-insertSort'     :: (Ord a) => [a] -> L a 
-insertSort'     = foldr insert' N
-\end{code}
-
-<br> The hard work is done by `insert` defined as <br>
-
-\begin{code}
-insert' y N                      = y `C` N                           
-insert' y (x `C` xs) | y <= x    = y `C` x `C` xs
-                     | otherwise = x `C` insert' y xs
-\end{code}
-
-<br>
-
-**Hover** the mouse over `insert'` to see what type was inferred for it.
-
-Analyzing Plain Lists
----------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target= "_blank">Demo:</a> 
-
-
-We can easily modify GHC's List definition to abstract over a refinement:
-
-<br>
-
-\begin{code} _
-data [a] <p :: a -> a -> Prop>
-  = [] 
-  | (:) (h :: a) (tl :: ([a<p h>]<p>))
-\end{code}
-
-<br>
-
-So, we can define and use **ordered** versions of GHC Lists
-
-<br>
-
-\begin{code}
-{-@ type OList a = [a]<{\hd v -> (hd <= v)}> @-}
-\end{code}
-
-Insertion Sort
---------------
-
-Now we can verify the usual sorting algorithms: 
-
-<br>
-
-\begin{code}
-{-@ insertSort :: (Ord a) => xs:[a] -> OList a @-}
-insertSort xs  = foldr insert [] xs
-\end{code}
-
-<br> 
-
-where the helper does the work
-
-<br>
-
-\begin{code}
-insert y []                   = [y]
-insert y (x : xs) | y <= x    = y : x : xs 
-                  | otherwise = x : insert y xs
-\end{code}
-
-Merge Sort
-----------
-
-Now we can verify the usual sorting algorithms: 
-
-
-\begin{code}
-{-@ mergeSort :: (Ord a) => [a] -> OList a @-}
-mergeSort     :: Ord a => [a] -> [a]
-mergeSort []  = []
-mergeSort [x] = [x]
-mergeSort xs  = merge (mergeSort xs1) (mergeSort xs2) 
-  where 
-   (xs1, xs2) = split xs
-
-split :: [a]    -> ([a], [a])
-split (x:(y:zs)) = (x:xs, y:ys) where (xs, ys) = split zs
-split xs         = (xs, [])
-
-merge :: Ord a => [a] -> [a] -> [a]
-merge xs [] = xs
-merge [] ys = ys
-merge (x:xs) (y:ys) | x <= y    = x:(merge xs (y:ys))
-                    | otherwise = y:(merge (x:xs) ys)
-\end{code}
-
-<br> A significant amount of inference happens above. See the types.
-
-QuickSort
----------
-
-Now we can verify the usual sorting algorithms: <br>
-
-\begin{code}
-{-@ quickSort    :: (Ord a) => [a] -> OList a @-}
-quickSort []     = []
-quickSort (x:xs) = append x lts gts 
-  where 
-    lts          = quickSort [y | y <- xs, y < x]
-    gts          = quickSort [z | z <- xs, z >= x]
-\end{code}
-
-<br> We require a special `append` parameterized by the **pivot** <br>
-
-\begin{code}
-append k []     ys  = k : ys
-append k (x:xs) ys  = x : append k xs ys
-\end{code}
-
-Look at the inferred type to understand why!
-
-
-Other Instantiations: Decreasing Lists
---------------------------------------
-
-We may *instantiate* `p` with many different concrete relations
-
-<br> **Decreasing Lists** <br>
-
-\begin{code}
-{-@ type DecrList a = [a]<{\hd v -> (hd >= v)}> @-}
-\end{code}
-
-<br> After which we can check that <br>
-
-\begin{code}
-{-@ decList :: DecrList Int @-}
-decList :: [Int]
-decList = [3, 2, 1, 0]
-\end{code}
-
-Multiple Instantiations: Distinct Lists 
----------------------------------------
-
-We may *instantiate* `p` with many different concrete relations
-
-<br> **Distinct Lists**: Lists not containing any duplicate values <br>
-
-\begin{code}
-{-@ type DiffList a = [a]<{\hd v -> (hd /= v)}> @-}
-\end{code}
-
-<br> After which we can check that <br>
-
-\begin{code}
-{-@ diffList :: DiffList Int @-}
-diffList :: [Int]
-diffList = [2, 3, 1, 0]
-\end{code}
-
-Binary Trees 
-------------
-
-
-- Consider a `Map` from keys of type `k` to values of type `a` 
-
-- Implemented as a binary tree:
-
-\begin{code}
-data Map k a = Tip
-             | Bin Size k a (Map k a) (Map k a)
-
-type Size    = Int
-\end{code}
-
-Binary Trees 
-------------
-
-We abstract from the structure two refinements `l` and `r` 
-
-- `l` relates root `key` with **left**-subtree keys
-
-- `r` relates root `key` with **right**-subtree keys
-
-\begin{code}
-{-@
-  data Map k a <l :: k -> k -> Prop, r :: k -> k -> Prop>
-      = Tip
-      | Bin (sz    :: Size)
-            (key   :: k)
-            (value :: a)
-            (left  :: Map <l, r> (k <l key>) a)
-            (right :: Map <l, r> (k <r key>) a)
-  @-}
-\end{code}
-
-
-Ordered Trees
--------------
-
-Thus, if we instantiate the refinements thus: 
-
-<br>
-
-\begin{code}
-{-@ type BST k a     = Map <{\r v -> v < r }, {\r v -> v > r }> k a @-}
-{-@ type MinHeap k a = Map <{\r v -> r <= v}, {\r v -> r <= v}> k a @-}
-{-@ type MaxHeap k a = Map <{\r v -> r >= v}, {\r v -> r >= v}> k a @-}
-\end{code}
-
-- `BST k v` denotes **binary-search** ordered trees
-
-- `MinHeap k v` denotes **min-heap** ordered trees
-
-- `MaxHeap k v` denotes **max-heap** ordered trees.
-
-Binary Search Ordering
-----------------------
-
-We can use the `BST` type to automatically verify that tricky functions
-ensure and preserve binary-search ordering.
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Map.hs" target= "_blank">Demo:</a> 
-
-\begin{code}So, we can have
-empty :: BST k a
-
-insert :: Ord k => k:k -> a:a -> t:BST k a -> BST k a
-
-delete :: (Ord k) => k:k -> t:BST k a -> BST k a
-\end{code}
-
-Binary Search Ordering: Empty
------------------------------
-
-\begin{code}
-{-@ empty :: BST k a @-}
-empty     :: Map k a
-empty     = Tip
-\end{code}
-
-Binary Search Ordering: Insert
-------------------------------
-
-\begin{code}
-{-@ insertBST :: Ord k => k:k -> a:a -> t:BST k a -> BST k a @-}
-insertBST     :: Ord k => k -> a -> Map k a -> Map k a
-insertBST kx x t
-  = case t of
-     Tip -> singleton kx x
-     Bin sz ky y l r
-         -> case compare kx ky of
-              LT -> balance ky y (insertBST kx x l) r
-              GT -> balance ky y l (insertBST kx x r)
-              EQ -> Bin sz kx x l r
-\end{code}
-
-Binary Search Ordering: Delete 
-------------------------------
-
-\begin{code}
-{-@ delete :: (Ord k) => k:k -> t:BST k a -> BST k a @-}
-delete :: Ord k => k -> Map k a -> Map k a
-delete k t
-  = case t of
-      Tip -> Tip
-      Bin _ kx x l r
-          -> case compare k kx of
-               LT -> balance kx x (delete k l) r
-               GT -> balance kx x l (delete k r)
-               EQ -> glue kx l r
-\end{code}
-
-
-Helper Functions: Constructors
-------------------------------
-
-Below are the helper functions used by `insert` and `delete`:
-
-\begin{code}
-singleton :: k -> a -> Map k a
-singleton k x
-  = Bin 1 k x Tip Tip
-
-bin :: k -> a -> Map k a -> Map k a -> Map k a
-bin k x l r
-  = Bin (size l + size r + 1) k x l r
-
-size :: Map k a -> Int
-size t
-  = case t of
-      Tip            -> 0
-      Bin sz _ _ _ _ -> sz
-\end{code}
-
-Helper Functions: Extractors 
-----------------------------
-
-\begin{code}
-deleteFindMax t
-  = case t of
-      Bin _ k x l Tip -> (k, x, l)
-      Bin _ k x l r -> let (km3, vm, rm) = deleteFindMax r in
-                       (km3, vm, (balance k x l rm))
-      Tip           -> (error ms, error ms, Tip)
-  where 
-    ms = "Map.deleteFindMax : empty Map"
-
-deleteFindMin t
-  = case t of
-      Bin _ k x Tip r -> (k, x, r)
-      Bin _ k x l r -> let (km4, vm, lm) = deleteFindMin l in
-                       (km4, vm, (balance k x lm r))
-      Tip             -> (error ms, error ms, Tip)
-  where 
-    ms = "Map.deleteFindMin : empty Map"
-\end{code}
-
-Helper Functions: Connectors 
-----------------------------
-
-Below are the helper functions used by `insert` and `delete`:
-
-\begin{code}
-glue :: k -> Map k a -> Map k a -> Map k a
-glue k Tip r = r
-glue k l Tip = l
-glue k l r
-  | size l > size r = let (km1, vm, lm) = deleteFindMax l 
-                      in balance km1 vm lm r
-
-  | otherwise       = let (km2, vm, rm) = deleteFindMin r 
-                      in balance km2 vm l rm
-
-{-@ balance :: key:k 
-            -> a 
-            -> (BST {v:k | v < key} a) 
-            -> (BST {v:k| key < v} a) -> (BST k a) @-}
-balance :: k -> a -> Map k a -> Map k a -> Map k a
-balance k x l r = undefined
-\end{code}
-
-
-
diff --git a/docs/slides/niki/lhs/Loop.lhs b/docs/slides/niki/lhs/Loop.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/Loop.lhs
+++ /dev/null
@@ -1,121 +0,0 @@
-% Higher Order Specifications
-
-
-Higher Order Specifications
----------------------------
-
-\begin{code}
-module Loop where
-
-{-@ LIQUID "--no-termination"@-}
-\end{code}
-
-
-Higher Order Specifications
----------------------------
-
-Consider a `loop` function: <br>
-
-\begin{code}
-loop :: Int -> Int -> a -> (Int -> a -> a) -> a
-loop lo hi base f        = go lo base
-  where 
-    go i acc | i < hi    = go (i+1) (f i acc)
-             | otherwise = acc
-\end{code}
-
-<br>
-
-LiquidHaskell **infers**
-
-- if `lo <= hi` then `f` called with `lo <= i < hi`
-
-
-Higher Order Specifications
----------------------------
-
-Lets use `(!!)` to write a function that sums an `Int` list
-
-\begin{code}
-{-@ listSum :: [Int] -> Int @-}
-listSum     :: [Int] -> Int
-listSum xs  = loop 0 n 0 body 
-  where 
-    body    = \i acc -> acc + (xs !! i)
-    n       = length xs
-\end{code}
-
-By **function subtyping** LiquidHaskell **infers**
-
-- `body` called with `0 <= i < llen xs` 
-- hence, indexing safe.
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Loop.hs" target= "_blank">Demo:</a> 
-Let's change the `0` to `-1` and see what happens!
-
-Higher Order Specifications
----------------------------
-
-We can give this function a better type:
-
-\begin{code}
-{-@ listNatSum :: [Nat] -> Nat @-}
-listNatSum     :: [Int] -> Int
-listNatSum xs  = loop 0 n 0 body 
-  where 
-    body       = \i acc -> acc + (xs !! i)
-    n          = length xs
-\end{code}
-
-To verify this type, note: `(+) :: Nat -> Nat -> Nat` 
-
-LiquidHaskell **instantiates** `a` in `loop` with `Nat` 
-
-- `loop :: Int -> Int -> Nat -> (Int -> Nat -> Nat) -> Nat`
-
-Yielding the output.
-
-Higher Order Specifications
----------------------------
-
-By the same analysis, LiquidHaskell verifies that <br>
-
-\begin{code}
-{-@ listEvenSum :: [Even] -> Even @-}
-listEvenSum     :: [Int] -> Int
-listEvenSum xs  = loop 0 n 0 body 
-  where body   = \i acc -> acc + (xs !! i)
-        n      = length xs
-\end{code}
-
-Here, the system deduces that `(+)` has type
-
-- `x:Int-> y:Int -> {v:Int| v=x+y} <: Even -> Even -> Even`
-
-Hence, verification proceeds by *instantiating* `a` with `Even`
-
-- `loop :: Int -> Int -> Even -> (Int -> Even -> Even) -> Even`
-
-
-
-Another Example
----------------
-
-Consider a simpler example:<br>
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Int| v = m + n} @-}
-add     :: Int -> Int -> Int
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-Cannot use parametric polymorphism as before! 
-
-- Cannot instantiate `a` with `{v:Int|v = n + m}` ... 
-- ... as this only holds after **last iteration** of loop!
-
-Require Higher Order Invariants
-
-- On values computed in **intermediate** iterations...
-- ... i.e. invariants that **depend on the iteration index**.
-
diff --git a/docs/slides/niki/lhs/Measures.lhs b/docs/slides/niki/lhs/Measures.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/Measures.lhs
+++ /dev/null
@@ -1,176 +0,0 @@
-% Measures
-
-Measures
------------------------
-
-\begin{code}
-module Measures where
-import Prelude hiding ((!!), length)
-import Language.Haskell.Liquid.Prelude
-\end{code}
-
-
-Measuring A List's length in logic
-----------------------------------
-
-On `List` data type
-\begin{code}
-infixr `C`
-data L a = N | C a (L a)
-\end{code}
-
-We define a **measure** for the length of a `List` <br>
-
-\begin{code}
-{-@ measure llen :: (L a) -> Int
-    llen(N)      = 0
-    llen(C x xs) = 1 + (llen xs)
-  @-}
-\end{code}
-
-<br>
-
-\begin{code} LiquidHaskell then **automatically strengthens** the types of data constructors
-data L a where 
-  N :: {v : L a | (llen v) = 0}
-  C :: x:a -> xs:(L a) -> {v:(L a) |(llen v) = 1 + (llen xs)}
-\end{code}
-
-Measuring A List's length in logic
-----------------------------------
-
-Now we can verify
-
-<br>
-
-\begin{code}
-{-@ length :: xs:(L a) -> {v:Int | v = (llen xs)} @-}
-length     :: L a -> Int
-length N        = 0
-length (C _ xs) = 1 + (length xs)
-\end{code}
-
-Measuring A List's length in logic
-----------------------------------
-
-And we can type `(!!)` as
-
-
-<br>
-
-\begin{code}
-{-@ (!!)     :: ls:(L a) -> i:{v:Nat | v < (llen ls)} -> a @-}
-(!!)         :: L a -> Int -> a
-(C x _) !! 0 = x
-(C _ xs)!! n = xs!!(n-1)
-_       !! _ = liquidError "This should not happen!"
-\end{code}
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellMeasure.hs" target= "_blank">Demo:</a> 
-Lets see what happens if we **change** the precondition
-
-
-Another measure for List
---------------------------
-
-We define a new **measure** to check nullity of a `List` <br>
-
-\begin{code}
-{-@ measure isNull :: (L a) -> Prop
-    isNull(N)      = true
-    isNull(C x xs) = false
-  @-}
-\end{code}
-
-<br>
-
-\begin{code} LiquidHaskell then **automatically strengthens** the types of data constructors
-data L a where 
-  N :: {v : L a | isNull v}
-  C :: x:a -> xs:(L a) -> {v:(L a) | not (isNull v)}
-\end{code}
-
-
-
-Multiple measures for List
---------------------------
-
-The types of data constructors will be the **conjuction** of all the inferred types:
-
-
-\begin{code} The types from `llen` definition
-data L a where 
-  N :: {v : L a | (llen v) = 0}
-  C :: a -> xs: L a -> {v:L a |(llen v) = 1 + (llen xs)}
-\end{code}
-
-<br>
-\begin{code} and the types from `isNull`
-data L a where 
-  N :: {v : L a | isNull v}
-  C :: a -> xs: L a -> {v:L a | not (isNull v)}
-\end{code}
-
-
-<br>
-\begin{code} So, the final types will be
-data L a where 
-  N :: {v : L a | (llen v) = 0 && (isNull v)}
-  C :: a -> xs: L a -> {v:L a |(llen v) = 1 + (llen xs) && not (isNull v)}
-\end{code}
-
-
-Invariants in Data Constructors
-------------------------------
-
-We can refine the definition of data types setting **invariants**
-\begin{code}
-{-@ data L a = N
-             | C (x :: a) (xs :: L {v:a | x <= v})  @-}
-\end{code}
-
-<br>
-
-\begin{code} As before,the types of data constuctors are strengthened to
-data L a where
-  N :: L a
-  C :: x:a -> xs: L {v:a | x <= v} -> L a
-\end{code}
-
-LiquidHaskell
-
-- **Proves** the property when `C` is called
-
-- **Assumes** the property when `C` is opened
-
-
-
-Increasing Lists
------------------
-
-This invariant constrains all Lists to **increasing**
-\begin{code}
-{-@ data L a = N
-             | C (x :: a) (xs :: L {v:a | x <= v})  @-}
-\end{code}
-
-<br>
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellInsertSort.hs"
-target= "_blank">Insert sort</a> 
-\begin{code}
-{-@ insert :: Ord a => a -> L a -> L a @-}
-insert :: Ord a => a -> L a -> L a
-insert y (x `C` xs) | x <= y    = x `C` insert y xs
-                    | otherwise = y `C` insert x xs
-
-{-@ insertSort  :: Ord a => [a] -> L a @-}
-insertSort  :: Ord a => [a] -> L a
-insertSort = foldr insert N
-\end{code}
-
-<br>
-What if increasing and decreasing lists should co-exist?
-
-We use **abstract refinements** to allow it!
diff --git a/docs/slides/niki/lhs/SimpleRefinements.lhs b/docs/slides/niki/lhs/SimpleRefinements.lhs
deleted file mode 100644
--- a/docs/slides/niki/lhs/SimpleRefinements.lhs
+++ /dev/null
@@ -1,138 +0,0 @@
-% Simple Refinement Types
-
-Simple Refinement Types
------------------------
-
-\begin{code}
-module SimpleRefinements where
-import Language.Haskell.Liquid.Prelude
-\end{code}
-
-
-Simple Refinement Types
------------------------
-
-We use special comments to give specifications, 
-as *refinement types*.
-
-This type describes `Int` values that equal `0`.
-
-
-\begin{code}
-{-@ zero :: {v:Int | v = 0} @-}
-zero     :: Int
-zero     =  0
-\end{code}
-
-Refinements are *logical formulas*
-----------------------------------
-
-If 
-
-- refinement of `T1` **implies** refinement of `T2` 
-
-- `p1 => p2`
-
-Then
-
-- `T1` is a **subtype** of `T2`
-
-- `{v:t | p1} <: {v:t | p2}`
-
-Refinements are *logical formulas*
-----------------------------------
-
-For example, since
-
-- `v = 0` *implies* `v >= 0`
-
-Therefore
- 
-- `{v:Int | v = 0} <: {v:Int | v >= 0}`
-
-
-Refinements are *logical formulas*
-----------------------------------
-
-\begin{code} So we can have a type for natural numbers: <br>
-type Nat = {v:Int | v >= 0}
-\end{code}
-
-<br>
-
-And, via SMT based subtyping LiquidHaskell verifies:
-
-<br>
-
-\begin{code}
-{-@ zero' :: Nat @-}
-zero'     :: Int
-zero'     =  0
-\end{code}
-
-
-Lists: Universal Invariants 
----------------------------
-
-Constructors enable *universally quantified* invariants.
-
-For example, we define a list:
-
-\begin{code}
-infixr `C`
-data L a = N | C a (L a)
-\end{code}
-
-<br>
-
-And specify that, *every element* in a list is non-negative:
-
-\begin{code}
-{-@ natList :: L Nat @-}
-natList     :: L Int
-natList     =  0 `C` 1 `C` 3 `C` N
-\end{code}
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-Lets see what happens if `natList` contained a negative number. 
-
-Refinement Function Types
--------------------------
-
-Consider a `safeDiv` operator: <br>
-
-\begin{code}
-safeDiv    :: Int -> Int -> Int
-safeDiv x y = x `div` y
-\end{code}
-
-<br>
-We can use refinements to specify a **precondition**: divisor is **non-zero** <br>
-
-\begin{code}
-{-@ safeDiv :: Int -> {v:Int | v != 0} -> Int @-}
-\end{code}
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-Lets see what happens if the preconditions cannot be
-proven. 
-
-Dependent Function Types
-------------------------
-
-\begin{code} Consider a list indexing function:
-(!!)         :: L a -> Int -> a
-(C x _) !! 0 = x
-(C _ xs)!! n = xs!!(n-1)
-_       !! _ = liquidError "This should not happen!"
-\end{code}
-
-<br>
-
-We desire a **precondition** that index `i` be between `0` and **list length**.
-
-We use **measures** to talk about the length of a list in **logic**.
-
-
diff --git a/docs/slides/niki/lhs/liquid.css b/docs/slides/niki/lhs/liquid.css
deleted file mode 100644
--- a/docs/slides/niki/lhs/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-.hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-  // font-weight: bold;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   /* color: #00FFFF; color: #0E84B5; */
-  //font-weight: bold;  
-}
-
-.hs-definition { 
-  color: #06287E 
-  /* font-weight: bold; */ 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  // font-size: 120%;
-  // font-family: Bitstream Vera Sans Mono,monospace;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/niki/lhs/slides.css b/docs/slides/niki/lhs/slides.css
deleted file mode 100644
--- a/docs/slides/niki/lhs/slides.css
+++ /dev/null
@@ -1,258 +0,0 @@
-@font-face {
-	font-family: 'PT Mono';
-    font-style: normal;
-	font-weight: normal;
-	src: local("☺"), url('fonts/PT_Mono-Regular.ttf') format('truetype');
-}
-@font-face {
-	font-family: 'PT Sans';
-    font-style: normal; 
-	font-weight: bold;
-	src: local("☺"), url('fonts/PT_Sans-Web-Bold.ttf') format('truetype');
-}@font-face {
-	font-family: 'PT Sans';
-    font-style: italic;
-	font-weight: normal;
-	src: local("☺"), url('fonts/PT_Sans-Web-Italic.ttf') format('truetype');
-}@font-face {
-	font-family: 'PT Sans';
-    font-style: normal;
-	font-weight: normal;
-	src: local("☺"), url('fonts/PT_Sans-Web-Regular.ttf') format('truetype');
-}
-@font-face {
-	font-family: 'PT Sans Narrow';
-    font-style: normal;
-	font-weight: bold;
-	src: local("☺"), url('fonts/PT_Sans-Narrow-Web-Bold.ttf') format('truetype');
-}
-@font-face {
-	font-family: 'PT Sans Narrow';
-    font-style: normal;
-	font-weight: normal;
-	src: local("☺"), url('fonts/PT_Sans-Narrow-Web-Regular.ttf') format('truetype');
-}
-html {
-    height: 100%;
-	background-color: #fefffe;
-}
-body {
-	width: 1024px !important;
-    height: 600px !important;
-	margin-left: -512px !important;
-	margin-top: -300px !important;
-}
-section {
-	background: transparent;
-	color: #000;
-	width: 100%  !important;
-	/* width: 800px !important; */
-	height: 600px !important;
-    padding: 50px 112px 0;	
-	font-family: 'PT Sans', sans-serif;
-	font-size: 16pt;
-}
-
-body :first-child {
-}
-address, blockquote, dl, fieldset, form, h1, h2, h3, h4, h5, h6, hr, ol, p, pre, table, ul, dl { padding: 10px 20px 10px 20px; }
-h1, h2, h3 {
-	text-align: left;
-	color: #666; 
-	font-family: 'PT Sans Narrow', sans-serif;
-	font-weight: bold;
-}
-input, select {
-border 0.5pt solid black;
-font-size: 16pt;
-line-height: 10pt;
-padding: 0 0 -2.5pt 0;
-z-index:1;
-}
-ul, ol {
-	margin: 10px 10px 10px 50px;
-}
-a { color: #205CB3; }
-section.titleslide h1 { margin-top: 200px; }
-h1.title { margin-top: 150px; font-size:200%; margin-bottom: 20px; text-align: center; text-shadow:0px 2px 1px #444; 
--webkit-transition: color 1s ease-in-out;
--moz-transition: color 1s ease-in-out;
- }
-h1.title:hover {
-color: #C43628;
-}
-h2.author { font-size: 120%; margin-top: 0px; margin-bottom: 0px; text-align:center; color: #555; font-family: 'PT Sans Narrow'; font-weight: normal;}
-h3.date { font-size: 80%; margin-top: 0px; text-align: center; color: #555; font-family: 'PT Mono'; font-weight: normal;}
-h1 { font-size: 180%; margin: 0 0 10px; text-shadow:0px 2px 1px #fff;}
-h2 { font-size: 140%; } 
-h3 { font-size: 100%; }
-blockquote { font-style: italic }
-q {
-	display: inline-block;
-	width: 700px;
-	height: 600px;
-	background-color: black;
-	color: white;
-	font-size: 60px;
-	padding: 50px;
-}
-footer {
-	position: absolute;
-	bottom: 10px;
-	right: 20px;
-	text-shadow: white 0px 1px 0px, rgba(0, 0, 0, 0.2) 0 2px 5px;
-}
-/* JHALA: pre, code { background: transparent; } */
-pre, code {background-color:#E6F0FA;}
-
-pre { padding: 10px 50px; }
-td > pre { padding: 0px; }
-td { padding: 5px; }
-::-moz-selection { background-color: khaki; }
-code { font-family: 'PT Mono'; font-size: 90%; }
-code > span.co { font-style: normal; }
-code > span.kw { font-weight: normal; }
-code > span.er { font-weight: normal; }
-
-/* Transition effect */
-/* Feel free to change the transition effect for original
-animations. See here:
-https://developer.mozilla.org/en/CSS/CSS_transitions
-How to use CSS3 Transitions: */
-section {
-	-moz-transition: left 400ms ease-in-out 0s;
-	-webkit-transition: left 400ms ease-in-out 0s;
-	-ms-transition: left 400ms ease-in-out 0s;
-	transition: left 400ms ease-in-out 0s;
-}
-
-/* Before */
-section { left: -150%; }
-/* Now */
-section[aria-selected] { left: 0; }
-/* After */
-section[aria-selected] ~ section { left: +150%; }
-
-/* Incremental elements */
-
-/* By default, visible */
-.incremental > * { opacity: 1; }
-
-/* The current item */
-.incremental > *[aria-selected] { color: red; opacity: 1; }
-
-/* The items to-be-selected */
-.incremental > *[aria-selected] ~ * { opacity: 0.2; }
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-a { color: #205CB3; }
-
-.hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-  // font-weight: bold;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   /* color: #00FFFF; color: #0E84B5; */
-  //font-weight: bold;  
-}
-
-.hs-definition { 
-  color: #06287E 
-  /* font-weight: bold; */ 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 60%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 80%;
-  // font-family: Bitstream Vera Sans Mono,monospace;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/plpv14/Makefile b/docs/slides/plpv14/Makefile
deleted file mode 100644
--- a/docs/slides/plpv14/Makefile
+++ /dev/null
@@ -1,70 +0,0 @@
-####################################################################
-SERVERHOME=nvazou@goto.ucsd.edu:~/public_html/liquidtutorial/
-RJSERVER=rjhala@goto.ucsd.edu:~/public_html/liquid/haskell/plpv/lhs/
-####################################################################
-
-# REVEAL=$(PANDOC) -t revealjs -V revealjs-url=../_support/reveal -V theme=serif
-
-REVEAL=pandoc \
-	   --from=markdown+simple_tables 		\
-	   --to=html5                           \
-	   --standalone                         \
-	   --mathjax \
-	   --section-divs                       \
-	   --template=_support/template.reveal  \
-	   --variable reveal=../_support/reveal
-
-PANDOC=pandoc --columns=80  -s --mathjax --slide-level=2
-SLIDY=$(PANDOC) -t slidy
-DZSLIDES=$(PANDOC) --highlight-style tango --css=slides.css -w dzslides
-HANDOUT=$(PANDOC) --highlight-style tango --css=text.css -w html5
-WEBTEX=$(PANDOC) -s --webtex -i -t slidy
-BEAMER=pandoc -t beamer
-LIQUID=liquid --short-names 
-
-mdObjects   := $(patsubst %.lhs,%.lhs.markdown,$(wildcard lhs/*.lhs))
-htmlObjects := $(patsubst %.lhs,%.lhs.slides.html,$(wildcard lhs/*.lhs))
-
-####################################################################
-
-one: $(mdObjects)
-	$(REVEAL) lhs/00_Index.lhs.markdown > lhs/index.html
-
-tut: $(mdObjects)
-	$(REVEAL) lhs/*.markdown > lhs/tutorial.html 
-
-all: slides copy
-
-slides: $(htmlObjects)
-
-plpv: slides
-	scp lhs/*.html $(RJSERVER)
-
-lhs/%.lhs.markdown: lhs/%.lhs
-	-$(LIQUID) $?
-
-lhs/%.lhs.slides.html: lhs/%.lhs.markdown
-	$(REVEAL) $? -o $@ 
-
-lhs/%.lhs.slides.pdf: lhs/%.lhs.markdown
-	$(BEAMER) $? -o $@ 
-
-foo:
-	$(LIQUID) lhs/Foo.lhs
-	$(REVEAL) lhs/Foo.lhs.markdown -o lhs/Foo.lhs.html
-
-copy:
-	cp lhs/*lhs.html html/
-	cp lhs/*lhs.slides.html html/
-	cp css/*.css html/
-	cp -r fonts html/
-	cp index.html html/
-	cp Benchmarks.html html/
-
-clean:
-#	cd lhs/ && ../cleanup && cd ../
-#	cd html/ && rm -rf * && cd ../
-#	cp index.html html/
-
-upload: 
-	scp -r html/* $(SERVERHOME)
diff --git a/docs/slides/plpv14/_support/liquid.css b/docs/slides/plpv14/_support/liquid.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/plpv14/_support/reveal/LICENSE b/docs/slides/plpv14/_support/reveal/LICENSE
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
-
-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.
diff --git a/docs/slides/plpv14/_support/reveal/README.md b/docs/slides/plpv14/_support/reveal/README.md
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/README.md
+++ /dev/null
@@ -1,226 +0,0 @@
-# reveal.js
-
-A framework for easily creating beautiful presentations using HTML. [Check out the live demo](http://lab.hakim.se/reveal-js/).
-
-reveal.js comes with a broad range of features including [nested slides](https://github.com/hakimel/reveal.js#markup), [markdown contents](https://github.com/hakimel/reveal.js#markdown), [PDF export](https://github.com/hakimel/reveal.js#pdf-export), [speaker notes](https://github.com/hakimel/reveal.js#speaker-notes) and a [JavaScript API](https://github.com/hakimel/reveal.js#api). It's best viewed in a browser with support for CSS 3D transforms but [fallbacks](https://github.com/hakimel/reveal.js/wiki/Browser-Support) are available to make sure your presentation can still be viewed elsewhere.
-
-
-#### More reading in the Wiki:
-- [Changelog](https://github.com/hakimel/reveal.js/wiki/Changelog): Up-to-date version history.
-- [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own!
-- [Browser Support](https://github.com/hakimel/reveal.js/wiki/Changelog): Explanation of browser support and fallbacks.
-
-
-The framework is and will remain free. Donations are available as an optional way of supporting the project. Proceeds go towards futher development, hosting and domain costs for the GUI editor which will be out shortly.
-
-[![Click here to lend your support to: reveal.js and make a donation at www.pledgie.com !](http://www.pledgie.com/campaigns/18182.png?skin_name=chrome)](http://www.pledgie.com/campaigns/18182)
-
-
-## Instructions
-
-### Markup
-
-Markup heirarchy needs to be ``<div class="reveal"> <div class="slides"> <section>`` where the ``<section>`` represents one slide and can be repeated indefinitely. If you place multiple ``<section>``'s inside of another ``<section>`` they will be shown as vertical slides. The first of the vertical slides is the "root" of the others (at the top), and it will be included in the horizontal sequence. For example:
-
-```html
-<div class="reveal">
-	<div class="slides"> 
-		<section>Single Horizontal Slide</section>
-		<section>
-			<section>Vertical Slide 1</section>
-			<section>Vertical Slide 2</section>
-		</section>
-	</div>
-</div>
-```
-
-### Markdown
-
-It's possible to write your slides using Markdown. To enable Markdown simply add the ```data-markdown``` attribute to your ```<section>``` elements and reveal.js will automatically load the JavaScript parser. 
-
-This is based on [data-markdown](https://gist.github.com/1343518) from [Paul Irish](https://github.com/paulirish) which in turn uses [showdown](https://github.com/coreyti/showdown/). This is sensitive to indentation (avoid mixing tabs and spaces) and line breaks (avoid consecutive breaks). Updates to come.
-
-```html
-<section data-markdown>
-	## Page title
-	
-	A paragraph with some text and a [link](http://hakim.se).
-</section>
-```
-
-
-### Configuration
-
-At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below.
-
-```javascript
-Reveal.initialize({
-	// Display controls in the bottom right corner
-	controls: true,
-
-	// Display a presentation progress bar
-	progress: true,
-
-	// Push each slide change to the browser history
-	history: false,
-
-	// Enable keyboard shortcuts for navigation
-	keyboard: true,
-
-	// Loop the presentation
-	loop: false,
-
-	// Number of milliseconds between automatically proceeding to the 
-	// next slide, disabled when set to 0
-	autoSlide: 0,
-
-	// Enable slide navigation via mouse wheel
-	mouseWheel: true,
-
-	// Apply a 3D roll to links on hover
-	rollingLinks: true,
-
-	// Transition style
-	transition: 'default' // default/cube/page/concave/linear(2d)
-});
-```
-
-### Dependencies
-
-Reveal.js doesn't _rely_ on any third party scripts to work but a few optional libraries are included by default. These libraries are loaded as dependencies in the order they appear, for example:
-
-```javascript
-Reveal.initialize({
-	dependencies: [
-		// Syntax highlight for <code> elements
-		{ src: 'lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
-		// Cross-browser shim that fully implements classList - https://github.com/eligrey/classList.js/
-		{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }
-		// Interpret Markdown in <section> elements
-		{ src: 'lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-		{ src: 'lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-		// Speaker notes support
-		{ src: 'plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-		{ src: '/socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-	]
-});
-```
-
-You can add your own extensions using the same syntax. The following properties are available for each dependency object:
-- **src**: Path to the script to load
-- **async**: [optional] Flags if the script should load after reveal.js has started, defaults to false
-- **callback**: [optional] Function to execute when the script has loaded
-- **condition**: [optional] Function which must return true for the script to be loaded
-
-
-### API
-
-The Reveal class provides a minimal JavaScript API for controlling navigation and reading state:
-
-```javascript
-// Navigation
-Reveal.navigateTo( indexh, indexv );
-Reveal.navigateLeft();
-Reveal.navigateRight();
-Reveal.navigateUp();
-Reveal.navigateDown();
-Reveal.navigatePrev();
-Reveal.navigateNext();
-Reveal.toggleOverview();
-
-// Retrieves the previous and current slide elements
-Reveal.getPreviousSlide();
-Reveal.getCurrentSlide();
-
-Reveal.getIndices(); // { h: 0, v: 0 } }
-```
-
-### States
-
-If you set ``data-state="somestate"`` on a slide ``<section>``, "somestate" will be applied as a class on the document element when that slide is opened. This allows you to apply broad style changes to the page based on the active slide.
-
-Furthermore you can also listen to these changes in state via JavaScript:
-
-```javascript
-Reveal.addEventListener( 'somestate', function() {
-	// TODO: Sprinkle magic
-}, false );
-```
-
-### Slide change event
-
-An 'slidechanged' event is fired each time the slide is changed (regardless of state). The event object holds the index values of the current slide as well as a reference to the previous and current slide HTML nodes.
-
-```javascript
-Reveal.addEventListener( 'slidechanged', function( event ) {
-	// event.previousSlide, event.currentSlide, event.indexh, event.indexv
-} );
-```
-
-### Fragment events
-
-When a slide fragment is either shown or hidden reveal.js will dispatch an event.
-
-```javascript
-Reveal.addEventListener( 'fragmentshown', function( event ) {
-	// event.fragment = the fragment DOM element
-} );
-Reveal.addEventListener( 'fragmenthidden', function( event ) {
-	// event.fragment = the fragment DOM element
-} );
-```
-
-### Internal links
-
-It's easy to link between slides. The first example below targets the index of another slide whereas the second targets a slide with an ID attribute (```<section id="some-slide">```):
-
-```html
-<a href="#/2/2">Link</a>
-<a href="#/some-slide">Link</a>
-```
-
-## PDF Export
-
-Presentations can be exported to PDF via a special print stylesheet. This feature requires that you use [Google Chrome](http://google.com/chrome). 
-Here's an example of an exported presentation that's been uploaded to SlideShare: http://www.slideshare.net/hakimel/revealjs-13872948.
-
-1. Open the desired presentation with *print-pdf* anywhere in the query, for example: [lab.hakim.se/reveal-js?print-pdf](http://lab.hakim.se/reveal-js?print-pdf)
-2. Open the in-browser print dialog (CMD+P).
-3. Change the **Destination** setting to **Save as PDF**.
-4. Change the **Layout** to **Landscape**.
-5. Change the **Margins** to **None**.
-6. Click **Save**.
-
-![Chrome Print Settings](https://s3.amazonaws.com/hakim-static/reveal-js/pdf-print-settings.png)
-
-## Speaker Notes
-
-If you're interested in using speaker notes, reveal.js comes with a Node server that allows you to deliver your presentation in one browser while viewing speaker notes in another. 
-
-To include speaker notes in your presentation, simply add an `<aside class="notes">` element to any slide. These notes will be hidden in the main presentation view.
-
-You'll also need to [install Node.js](http://nodejs.org/); then, install the server dependencies by running `npm install`.
-
-Once Node.js and the dependencies are installed, run the following command from the root directory:
-
-		node plugin/speakernotes
-
-By default, the slides will be served at [localhost:1947](http://localhost:1947).
-
-You can change the appearance of the speaker notes by editing the file at `plugin/speakernotes/notes.html`.	
-
-### Known Issues
-
-- The notes page is supposed to show the current slide and the next slide, but when it first starts, it always shows the first slide in both positions. 
-
-## Folder Structure
-- **css/** Core styles without which the project does not function
-- **js/** Like above but for JavaScript
-- **plugin/** Components that have been developed as extensions to reveal.js
-- **lib/** All other third party assets (JavaScript, CSS, fonts)
-
-## License
-
-MIT licensed
-
-Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
diff --git a/docs/slides/plpv14/_support/reveal/css/liquidhaskell.css b/docs/slides/plpv14/_support/reveal/css/liquidhaskell.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/liquidhaskell.css
+++ /dev/null
@@ -1,105 +0,0 @@
-
-/******************************************************************/
-/* LIQUID: Hacking the Background *********************************/
-/******************************************************************/
-
-.hidden {
-  display: none;
-}
-
-.reveal .hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-  font-size:70%
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   
-}
-
-.hs-definition { 
-  color: #06287E 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext {display: none}
-
-a.annot:hover span.annottext { 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  font-size: 75%;
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-  color:black;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 100%;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/plpv14/_support/reveal/css/main.css b/docs/slides/plpv14/_support/reveal/css/main.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/main.css
+++ /dev/null
@@ -1,925 +0,0 @@
-@charset "UTF-8";
-
-/**
- * reveal.js
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-.reveal a {
-  color: #8b7c69;
-  text-decoration: none;
-}
-
-/*********************************************
- * RESET STYLES
- *********************************************/
-
-
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, canvas, details, embed, 
-figure, figcaption, footer, header, hgroup, 
-menu, nav, output, ruby, section, summary,
-time, mark, audio, video {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	font-size: 100%;
-	font: inherit;
-	vertical-align: baseline;
-}
-
-article, aside, details, figcaption, figure, 
-footer, header, hgroup, menu, nav, section {
-	display: block;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-html, 
-body {
-	padding: 0;
-	margin: 0;
-	width: 100%;
-	height: 100%;
-	min-height: 600px;
-	overflow: hidden;
-}
-
-body {
-	position: relative;
-	line-height: 1;
-}
-
-@media screen and (max-width: 1024px) {
-	body {
-		font-size: 30px;
-	}
-}
-
-::selection { 
-	background:#FF5E99; 
-	color:#fff; 
-	text-shadow: none; 
-}
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1 { font-size: 0.77em; }
-.reveal h2 { font-size: 2.11em;	}
-.reveal h3 { font-size: 1.55em;	}
-.reveal h4 { font-size: 1em;	}
-
-
-/*********************************************
- * VIEW FRAGMENTS
- *********************************************/
-
-.reveal .slides section .fragment {
-	opacity: 0;
-
-	-webkit-transition: all .2s ease;
-	   -moz-transition: all .2s ease;
-	    -ms-transition: all .2s ease;
-	     -o-transition: all .2s ease;
-	        transition: all .2s ease;
-}
-	.reveal .slides section .fragment.visible {
-		opacity: 1;
-	}
-
-
-/*********************************************
- * DEFAULT ELEMENT STYLES
- *********************************************/
-
-.reveal .slides section {
-	line-height: 1.2em;
-	font-weight: normal;
-}
-
-.reveal img {
-	/* preserve aspect ratio and scale image so it's bound within the section */
-	max-width: 100%;
-	max-height: 100%;
-} 
-
-.reveal strong, 
-.reveal b {
-	font-weight: bold;
-}
-
-.reveal em, 
-.reveal i {
-	font-style: italic;
-}
-
-.reveal ol, 
-.reveal ul {
-	display: inline-block;
-
-	text-align: left;
-	margin: 0 0 0 .7em;
-}
-
-.reveal ol {
-	list-style-type: decimal;
-}
-
-.reveal ul {
-	list-style-type: disc;
-	padding-bottom: 0.8em;
-}
-
-.reveal ul ul {
-	list-style-type: circle;
-}
-
-.reveal ul ul ul {
-	list-style-type: square;
-}
-
-.reveal ul ul,
-.reveal ul ol,
-.reveal ol ol,
-.reveal ol ul {
-	display: block;
-	margin-left: 0;
-}
-
-.reveal p {
-	margin-bottom: 10px;
-	line-height: 1.2em;
-}
-
-.reveal q,
-.reveal blockquote {
-	quotes: none;
-}
-
-
-.reveal blockquote {
-	display: block;
-	position: relative;
-	width: 70%;
-	margin: 5px auto;
-	padding: 5px;
-	
-	font-size: 80%;
-	font-style: italic;
-	background: rgba(255, 255, 255, 0.05);
-	box-shadow: 0px 0px 2px rgba(0,0,0,0.2);
-}
-
-
-
-/*--DW-- disable funky quote marks for blockquotes*/
-/*
-.reveal blockquote:before {
-	content: '“';
-}
-.reveal blockquote:after {
-	content: '”';
-}
-*/
-
-.reveal q {	
-	font-style: italic;
-}
-	.reveal q:before {
-		content: '“';
-	}
-	.reveal q:after {
-		content: '”';
-	}
-
-.reveal pre {
-	display: block;
-	position: relative;
-	width: 90%;
-	margin: 10px auto;
-
-	text-align: left;
-	font-size: 0.85em;
-	font-family: monospace;
-	line-height: 1.2em;
-
-	word-wrap: break-word;
-
-	box-shadow: 0px 0px 6px rgba(0,0,0,0.3);
-}
-
-.reveal code {
-	font-family: monospace;
-	overflow-x: auto;
-}
-
-.reveal table th, 
-.reveal table td {
-	text-align: left;
-	padding-right: .3em;
-}
-
-.reveal table th {
-	text-shadow: rgb(255,255,255) 1px 1px 2px;
-}
-
-.reveal sup { 
-	vertical-align: super;
-}
-.reveal sub { 
-	vertical-align: sub;
-}
-
-.reveal small {
-	display: inline-block;
-	font-size: 0.6em;
-	line-height: 1.2em;
-	vertical-align: top;
-}
-
-.reveal small * {
-	vertical-align: top;
-}
-
-
-/*********************************************
- * CONTROLS
- *********************************************/
-
-.reveal .controls {
-	display: none;
-	position: fixed;
-	width: 100px;
-	height: 100px;
-	z-index: 30;
-
-	right: 0;
-	bottom: 0;
-}
-	
-	.reveal .controls a {
-		font-family: Arial;
-		font-size: 0.83em;
-		position: absolute;
-		opacity: 0.1;
-	}
-		.reveal .controls a.enabled {
-			opacity: 0.6;
-		}
-		.reveal .controls a.enabled:active {
-			margin-top: 1px;
-		}
-
-	.reveal .controls .left {
-		top: 30px;
-	}
-
-	.reveal .controls .right {
-		left: 60px;
-		top: 30px;
-	}
-
-	.reveal .controls .up {
-		left: 30px;
-	}
-
-	.reveal .controls .down {
-		left: 30px;
-		top: 60px;
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	position: fixed;
-	display: none;
-	height: 3px;
-	width: 100%;
-	bottom: 0;
-	left: 0;
-}
-	
-	.reveal .progress span {
-		display: block;
-		height: 100%;
-		width: 0px;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-/*********************************************
- * ROLLING LINKS
- *********************************************/
-
-.reveal .roll {
-	display: inline-block;
-	line-height: 1.2;
-	overflow: hidden;
-
-	vertical-align: top;
-
-	-webkit-perspective: 400px;
-	   -moz-perspective: 400px;
-	    -ms-perspective: 400px;
-	        perspective: 400px;
-
-	-webkit-perspective-origin: 50% 50%;
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-	.reveal .roll:hover {
-		background: none;
-		text-shadow: none;
-	}
-.reveal .roll span {
-	display: block;
-	position: relative;
-	padding: 0 2px;
-
-	pointer-events: none;
-
-	-webkit-transition: all 400ms ease;
-	   -moz-transition: all 400ms ease;
-	    -ms-transition: all 400ms ease;
-	        transition: all 400ms ease;
-
-	-webkit-transform-origin: 50% 0%;
-	   -moz-transform-origin: 50% 0%;
-	    -ms-transform-origin: 50% 0%;
-	        transform-origin: 50% 0%;
-
-	-webkit-transform-style: preserve-3d;
-	   -moz-transform-style: preserve-3d;
-	    -ms-transform-style: preserve-3d;
-	        transform-style: preserve-3d;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	        backface-visibility: hidden;
-}
-	.reveal .roll:hover span {
-	    background: rgba(0,0,0,0.5);
-
-	    -webkit-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	       -moz-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	        -ms-transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	            transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg );
-	}
-.reveal .roll span:after {
-	content: attr(data-title);
-
-	display: block;
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0 2px;
-
-	-webkit-transform-origin: 50% 0%;
-	   -moz-transform-origin: 50% 0%;
-	    -ms-transform-origin: 50% 0%;
-	        transform-origin: 50% 0%;
-
-	-webkit-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	   -moz-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	    -ms-transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-	        transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg );
-}
-
-
-/*********************************************
- * SLIDES
- *********************************************/
-
-.reveal .slides {
-	position: absolute;
-	max-width: 1024px;
-	width: 100%;
-	height: 80%;
-	left: 50%;
-	top: 50%;
-	margin-top: -320px;
-	padding: 20px 0px;
-	overflow: visible;
-	
-	text-align: center;
-
-	-webkit-transition: -webkit-perspective .4s ease;
-	   -moz-transition: -moz-perspective .4s ease;
-	    -ms-transition: -ms-perspective .4s ease;
-	     -o-transition: -o-perspective .4s ease;
-	        transition: perspective .4s ease;
-	
-	-webkit-perspective: 600px;
-	   -moz-perspective: 600px;
-	    -ms-perspective: 600px;
-	        perspective: 600px;
-
-	-webkit-perspective-origin: 0% 25%;
-	   -moz-perspective-origin: 0% 25%;
-	    -ms-perspective-origin: 0% 25%;
-	        perspective-origin: 0% 25%;
-}
-
-.reveal .slides>section,
-.reveal .slides>section>section {
-	display: none;
-	position: absolute;
-	width: 100%;
-	min-height: 600px;
-
-	z-index: 10;
-	
-	-webkit-transform-style: preserve-3d;
-	   -moz-transform-style: preserve-3d;
-	    -ms-transform-style: preserve-3d;
-	        transform-style: preserve-3d;
-	
-	-webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	   -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	    -ms-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	     -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	        transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-}
-
-.reveal .slides>section.present {
-	display: block;
-	z-index: 11;
-	opacity: 1;
-}
-
-.reveal .slides>section {
-	margin-left: -50%;
-}
-
-
-/*********************************************
- * DEFAULT TRANSITION
- *********************************************/
-
-.reveal .slides>section.past {
-	display: block;
-	opacity: 0;
-	
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
-}
-.reveal .slides>section.future {
-	display: block;
-	opacity: 0;
-	
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
-}
-
-.reveal .slides>section>section.past {
-	display: block;
-	opacity: 0;
-	
-	-webkit-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
-	   -moz-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
-	    -ms-transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
-	        transform: translate3d(0, -50%, 0) rotateX(70deg) translate3d(0, -50%, 0);
-}
-.reveal .slides>section>section.future {
-	display: block;
-	opacity: 0;
-	
-	-webkit-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
-	   -moz-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
-	    -ms-transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
-	        transform: translate3d(0, 50%, 0) rotateX(-70deg) translate3d(0, 50%, 0);
-}
-
-
-/*********************************************
- * CONCAVE TRANSITION
- *********************************************/
-
-.reveal.concave  .slides>section.past {
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-	        transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
-}
-.reveal.concave  .slides>section.future {
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-	        transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
-}
-
-.reveal.concave  .slides>section>section.past {
-	-webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	   -moz-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	    -ms-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-	        transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
-}
-.reveal.concave  .slides>section>section.future {
-	-webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	   -moz-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	    -ms-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-	        transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
-}
-
-
-/*********************************************
- * LINEAR TRANSITION
- *********************************************/
-
-.reveal.linear .slides>section.past {
-	-webkit-transform: translate(-150%, 0);
-	   -moz-transform: translate(-150%, 0);
-	    -ms-transform: translate(-150%, 0);
-	     -o-transform: translate(-150%, 0);
-	        transform: translate(-150%, 0);
-}
-.reveal.linear .slides>section.future {
-	-webkit-transform: translate(150%, 0);
-	   -moz-transform: translate(150%, 0);
-	    -ms-transform: translate(150%, 0);
-	     -o-transform: translate(150%, 0);
-	        transform: translate(150%, 0);
-}
-
-.reveal.linear .slides>section>section.past {
-	-webkit-transform: translate(0, -150%);
-	   -moz-transform: translate(0, -150%);
-	    -ms-transform: translate(0, -150%);
-	     -o-transform: translate(0, -150%);
-	        transform: translate(0, -150%);
-}
-.reveal.linear .slides>section>section.future {
-	-webkit-transform: translate(0, 150%);
-	   -moz-transform: translate(0, 150%);
-	    -ms-transform: translate(0, 150%);
-	     -o-transform: translate(0, 150%);
-	        transform: translate(0, 150%);
-}
-
-/*********************************************
- * BOX TRANSITION
- *********************************************/
-
-.reveal.cube .slides {
-	margin-top: -350px;
-
-	-webkit-perspective-origin: 50% 25%;
-	   -moz-perspective-origin: 50% 25%;
-	    -ms-perspective-origin: 50% 25%;
-	        perspective-origin: 50% 25%;
-
-	-webkit-perspective: 1300px;
-	   -moz-perspective: 1300px;
-	    -ms-perspective: 1300px;
-	        perspective: 1300px;
-}
-
-.reveal.cube .slides section {
-	padding: 30px;
-
-	-webkit-backface-visibility: hidden;
-	   -moz-backface-visibility: hidden;
-	    -ms-backface-visibility: hidden;
-	        backface-visibility: hidden;
-	
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-	.reveal.cube .slides section:not(.stack):before {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		background: #232628;
-		border-radius: 4px;
-
-		-webkit-transform: translateZ( -20px );
-		   -moz-transform: translateZ( -20px );
-		    -ms-transform: translateZ( -20px );
-		     -o-transform: translateZ( -20px );
-		        transform: translateZ( -20px );
-	}
-	.reveal.cube .slides section:not(.stack):after {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 90%;
-		height: 30px;
-		left: 5%;
-		bottom: 0;
-		background: none;
-		z-index: 1;
-
-		border-radius: 4px;
-		box-shadow: 0px 95px 25px rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ(-90px) rotateX( 65deg );
-		   -moz-transform: translateZ(-90px) rotateX( 65deg );
-		    -ms-transform: translateZ(-90px) rotateX( 65deg );
-		     -o-transform: translateZ(-90px) rotateX( 65deg );
-		        transform: translateZ(-90px) rotateX( 65deg );
-	}
-
-.reveal.cube .slides>section.stack {
-	padding: 0;
-	background: none;
-}
-
-.reveal.cube .slides>section.past {
-	-webkit-transform-origin: 100% 0%;
-	   -moz-transform-origin: 100% 0%;
-	    -ms-transform-origin: 100% 0%;
-	        transform-origin: 100% 0%;
-
-	-webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	   -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	    -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-	        transform: translate3d(-100%, 0, 0) rotateY(-90deg);
-}
-
-.reveal.cube .slides>section.future {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	   -moz-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	    -ms-transform: translate3d(100%, 0, 0) rotateY(90deg);
-	        transform: translate3d(100%, 0, 0) rotateY(90deg);
-}
-
-.reveal.cube .slides>section>section.past {
-	-webkit-transform-origin: 0% 100%;
-	   -moz-transform-origin: 0% 100%;
-	    -ms-transform-origin: 0% 100%;
-	        transform-origin: 0% 100%;
-
-	-webkit-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	   -moz-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	    -ms-transform: translate3d(0, -100%, 0) rotateX(90deg);
-	        transform: translate3d(0, -100%, 0) rotateX(90deg);
-}
-
-.reveal.cube .slides>section>section.future {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	   -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	    -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg);
-	        transform: translate3d(0, 100%, 0) rotateX(-90deg);
-}
-
-
-/*********************************************
- * PAGE TRANSITION
- *********************************************/
-
-.reveal.page .slides {
-	margin-top: -350px;
-
-	-webkit-perspective-origin: 50% 50%;
- 	   -moz-perspective-origin: 50% 50%;
- 	    -ms-perspective-origin: 50% 50%;
- 	        perspective-origin: 50% 50%;
-
-	-webkit-perspective: 3000px;
-	   -moz-perspective: 3000px;
-	    -ms-perspective: 3000px;
-	        perspective: 3000px;
-}
-
-.reveal.page .slides section {
-	padding: 30px;
-
-	-webkit-box-sizing: border-box;
-	   -moz-box-sizing: border-box;
-	        box-sizing: border-box;
-}
-	.reveal.page .slides section.past {
-		z-index: 12;
-	}
-	.reveal.page .slides section:not(.stack):before {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 100%;
-		height: 100%;
-		left: 0;
-		top: 0;
-		background: rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ( -20px );
-		   -moz-transform: translateZ( -20px );
-		    -ms-transform: translateZ( -20px );
-		     -o-transform: translateZ( -20px );
-		        transform: translateZ( -20px );
-	}
-	.reveal.page .slides section:not(.stack):after {
-		content: '';
-		position: absolute;
-		display: block;
-		width: 90%;
-		height: 30px;
-		left: 5%;
-		bottom: 0;
-		background: none;
-		z-index: 1;
-
-		border-radius: 4px;
-		box-shadow: 0px 95px 25px rgba(0,0,0,0.2);
-
-		-webkit-transform: translateZ(-90px) rotateX( 65deg );
-	}
-
-.reveal.page .slides>section.stack {
-	padding: 0;
-	background: none;
-}
-
-.reveal.page .slides>section.past {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	   -moz-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	    -ms-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-	        transform: translate3d(-40%, 0, 0) rotateY(-80deg);
-}
-
-.reveal.page .slides>section.future {
-	-webkit-transform-origin: 100% 0%;
-	   -moz-transform-origin: 100% 0%;
-	    -ms-transform-origin: 100% 0%;
-	        transform-origin: 100% 0%;
-
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-
-.reveal.page .slides>section>section.past {
-	-webkit-transform-origin: 0% 0%;
-	   -moz-transform-origin: 0% 0%;
-	    -ms-transform-origin: 0% 0%;
-	        transform-origin: 0% 0%;
-
-	-webkit-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	   -moz-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	    -ms-transform: translate3d(0, -40%, 0) rotateX(80deg);
-	        transform: translate3d(0, -40%, 0) rotateX(80deg);
-}
-
-.reveal.page .slides>section>section.future {
-	-webkit-transform-origin: 0% 100%;
-	   -moz-transform-origin: 0% 100%;
-	    -ms-transform-origin: 0% 100%;
-	        transform-origin: 0% 100%;
-
-	-webkit-transform: translate3d(0, 0, 0);
-	   -moz-transform: translate3d(0, 0, 0);
-	    -ms-transform: translate3d(0, 0, 0);
-	        transform: translate3d(0, 0, 0);
-}
-
-
-/*********************************************
- * OVERVIEW
- *********************************************/
-
-.reveal.overview .slides {
-	-webkit-perspective: 700px;
-	   -moz-perspective: 700px;
-	    -ms-perspective: 700px;
-	        perspective: 700px;
-}
-
-.reveal.overview .slides section {
-	padding: 20px 0;
-	max-height: 600px;
-	overflow: hidden;	
-	opacity: 1;
-	cursor: pointer;
-	background: rgba(0,0,0,0.1);
-}
-.reveal.overview .slides section .fragment {
-	opacity: 1;
-}
-.reveal.overview .slides section:after,
-.reveal.overview .slides section:before {
-	display: none !important;
-}
-.reveal.overview .slides section>section {
-	opacity: 1;
-	cursor: pointer;
-}
-	.reveal.overview .slides section:hover {
-		background: rgba(0,0,0,0.3);
-	}
-
-	.reveal.overview .slides section.present {
-		background: rgba(0,0,0,0.3);
-	}
-.reveal.overview .slides>section.stack {
-	background: none;
-	padding: 0;
-	overflow: visible;
-}
-
-
-/*********************************************
- * FALLBACK
- *********************************************/
-
-.no-transforms {
-	overflow-y: auto;
-}
-
-.no-transforms .slides section {
-	display: block!important;
-	opacity: 1!important;
-	position: relative!important;
-	height: auto;
-	min-height: auto;
-	margin-bottom: 100px;
-
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	        transform: none;
-}
-
-
-/*********************************************
- * DEFAULT STATES
- *********************************************/
-
-.state-background {
-	position: absolute;
-	width: 100%;
-	height: 100%;
-	background: rgba( 0, 0, 0, 0 );
-
-	-webkit-transition: background 800ms ease;
-	   -moz-transition: background 800ms ease;
-	    -ms-transition: background 800ms ease;
-	     -o-transition: background 800ms ease;
-	        transition: background 800ms ease;
-}
-.alert .state-background {
-	background: rgba( 200, 50, 30, 0.6 );
-}
-.soothe .state-background {
-	background: rgba( 50, 200, 90, 0.4 );
-}
-.blackout .state-background {
-	background: rgba( 0, 0, 0, 0.6 );
-}
-
-
-/*********************************************
- * SPEAKER NOTES
- *********************************************/
-
-.reveal aside.notes {
-	display: none;
-}
-
diff --git a/docs/slides/plpv14/_support/reveal/css/print/paper.css b/docs/slides/plpv14/_support/reveal/css/print/paper.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/print/paper.css
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Default Print Stylesheet Template
-   by Rob Glazebrook of CSSnewbie.com
-   Last Updated: June 4, 2008
-
-   Feel free (nay, compelled) to edit, append, and 
-   manipulate this file as you see fit. */
-
-
-/* SECTION 1: Set default width, margin, float, and
-   background. This prevents elements from extending 
-   beyond the edge of the printed page, and prevents
-   unnecessary background images from printing */
-body {
-	background: #fff;
-	font-size: 13pt;
-	width: auto;
-	height: auto;
-	border: 0;
-	margin: 0 5%;
-	padding: 0;
-	float: none !important;
-	overflow: visible;
-}
-html {
-	background: #fff;
-	width: auto;
-	height: auto;
-	overflow: visible;
-}
-
-/* SECTION 2: Remove any elements not needed in print. 
-   This would include navigation, ads, sidebars, etc. */
-.nestedarrow, 
-.controls a, 
-.reveal .progress, 
-.reveal.overview,
-.fork-reveal,
-.share-reveal,
-.state-background {
-	display:none;
-}
-
-/* SECTION 3: Set body font face, size, and color.
-   Consider using a serif font for readability. */
-body, p, td, li, div, a {
-	font-size: 13pt;
-	font-family: Georgia, "Times New Roman", Times, serif !important;
-	color: #000; 
-}
-
-/* SECTION 4: Set heading font face, sizes, and color.
-   Diffrentiate your headings from your body text.
-   Perhaps use a large sans-serif for distinction. */
-h1,h2,h3,h4,h5,h6 {
-	color: #000!important;
-	height: auto;
-	line-height: normal;
-	font-family: Georgia, "Times New Roman", Times, serif !important;
-	text-shadow: 0 0 0 #000 !important;
-	text-align: left;
-	letter-spacing: normal;
-}
-/* Need to reduce the size of the fonts for printing */
-h1 { font-size: 26pt !important;  }
-h2 { font-size: 22pt !important; }
-h3 { font-size: 20pt !important; }
-h4 { font-size: 20pt !important; font-variant: small-caps; }
-h5 { font-size: 19pt !important; }
-h6 { font-size: 18pt !important; font-style: italic; }
-
-/* SECTION 5: Make hyperlinks more usable.
-   Ensure links are underlined, and consider appending
-   the URL to the end of the link for usability. */
-a:link, 
-a:visited {
-	color: #000 !important;
-	font-weight: bold;
-	text-decoration: underline;
-}
-.reveal a:link:after, 
-.reveal a:visited:after {
-	content: " (" attr(href) ") ";
-	color: #222 !important;
-	font-size: 90%;
-}
-
-
-/* SECTION 6: more reveal.js specific additions by @skypanther */
-ul, ol, div, p {
-	visibility: visible;
-	position: static;
-	width: auto;
-	height: auto;
-	display: block;
-	overflow: visible;
-	margin: auto;
-	text-align: left !important;
-}
-.reveal .slides {
-	position: static;
-	width: auto;
-	height: auto;
-
-	left: auto;
-	top: auto;
-	margin-left: auto;
-	margin-top: auto;
-	padding: auto;
-
-	overflow: visible;
-	display: block;
-
-	text-align: center;
-	-webkit-perspective: none;
-	   -moz-perspective: none;
-	    -ms-perspective: none;
-	        perspective: none;
-
-	-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-.reveal .slides>section, .reveal .slides>section>section, 
-.reveal .slides>section.past, .reveal .slides>section.future,
-.reveal.linear .slides>section, .reveal.linear .slides>section>section,
-.reveal.linear .slides>section.past, .reveal.linear .slides>section.future {
-	
-	visibility: visible;
-	position: static;
-	width: 90%;
-	height: auto;
-	display: block;
-	overflow: visible;
-
-	left: 0%;
-	top: 0%;
-	margin-left: 0px;
-	margin-top: 0px;
-	padding: 20px 0px;
-
-	opacity: 1;
-
-	-webkit-transform-style: flat;
-	   -moz-transform-style: flat;
-	    -ms-transform-style: flat;
-	        transform-style: flat;
-
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	        transform: none;
-}
-.reveal section {
-	page-break-after: always !important; 
-	display: block !important;
-}
-.reveal section.stack {
-	page-break-after: avoid !important; 
-}
-.reveal section .fragment {
-	opacity: 1 !important;
-}
-.reveal section img {
-	display: block;
-	margin: 15px 0px;
-	background: rgba(255,255,255,1);
-	border: 1px solid #666;
-	box-shadow: none;
-}
diff --git a/docs/slides/plpv14/_support/reveal/css/print/pdf.css b/docs/slides/plpv14/_support/reveal/css/print/pdf.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/print/pdf.css
+++ /dev/null
@@ -1,158 +0,0 @@
-/* Default Print Stylesheet Template
-   by Rob Glazebrook of CSSnewbie.com
-   Last Updated: June 4, 2008
-
-   Feel free (nay, compelled) to edit, append, and 
-   manipulate this file as you see fit. */
-
-
-/* SECTION 1: Set default width, margin, float, and
-   background. This prevents elements from extending 
-   beyond the edge of the printed page, and prevents
-   unnecessary background images from printing */
-* {
-	-webkit-print-color-adjust: exact; 
-}
-
-body {
-	font-size: 22pt;
-	width: auto;
-	height: auto;
-	border: 0;
-	margin: 0 5%;
-	padding: 0;
-	float: none !important;
-	overflow: visible;
-	background: #333;
-}
-
-html {
-	width: auto;
-	height: auto;
-	overflow: visible;
-}
-
-/* SECTION 2: Remove any elements not needed in print. 
-   This would include navigation, ads, sidebars, etc. */
-.nestedarrow, 
-.controls a, 
-.reveal .progress, 
-.reveal.overview,
-.fork-reveal,
-.share-reveal,
-.state-background {
-	display:none;
-}
-
-/* SECTION 3: Set body font face, size, and color.
-   Consider using a serif font for readability. */
-body, p, td, li, div, a {
-	font-size: 22pt;
-}
-
-/* SECTION 4: Set heading font face, sizes, and color.
-   Diffrentiate your headings from your body text.
-   Perhaps use a large sans-serif for distinction. */
-h1,h2,h3,h4,h5,h6 {
-	text-shadow: 0 0 0 #000 !important;
-}
-
-/* SECTION 5: Make hyperlinks more usable.
-   Ensure links are underlined, and consider appending
-   the URL to the end of the link for usability. */
-a:link, 
-a:visited {
-	font-weight: bold;
-	text-decoration: underline;
-}
-
-
-/* SECTION 6: more reveal.js specific additions by @skypanther */
-ul, ol, div, p {
-	visibility: visible;
-	position: static;
-	width: auto;
-	height: auto;
-	display: block;
-	overflow: visible;
-	margin: auto;
-}
-.reveal .slides {
-	position: static;
-	width: 100%;
-	height: auto;
-
-	left: auto;
-	top: auto;
-	margin-left: auto;
-	margin-top: auto;
-	padding: auto;
-
-	overflow: visible;
-	display: block;
-
-	text-align: center;
-	-webkit-perspective: none;
-	   -moz-perspective: none;
-	    -ms-perspective: none;
-	        perspective: none;
-
-	-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-	   -moz-perspective-origin: 50% 50%;
-	    -ms-perspective-origin: 50% 50%;
-	        perspective-origin: 50% 50%;
-}
-.reveal .slides>section, .reveal .slides>section>section, 
-.reveal .slides>section.past, .reveal .slides>section.future,
-.reveal.linear .slides>section, .reveal.linear .slides>section>section,
-.reveal.linear .slides>section.past, .reveal.linear .slides>section.future {
-	
-	visibility: visible;
-	position: static;
-	width: 100%;
-	height: auto;
-	min-height: initial;
-	display: block;
-	overflow: visible;
-
-	left: 0%;
-	top: 0%;
-	margin-left: 0px;
-	margin-top: 50px;
-	padding: 20px 0px;
-
-	opacity: 1;
-
-	-webkit-transform-style: flat;
-	   -moz-transform-style: flat;
-	    -ms-transform-style: flat;
-	        transform-style: flat;
-
-	-webkit-transform: none;
-	   -moz-transform: none;
-	    -ms-transform: none;
-	        transform: none;
-}
-.reveal section {
-	page-break-after: always !important; 
-	display: block !important;
-}
-.reveal section.stack {
-	margin: 0px !important;
-	padding: 0px !important;
-	page-break-after: avoid !important; 
-}
-.reveal section .fragment {
-	opacity: 1 !important;
-}
-.reveal img {
-	box-shadow: none;
-}
-.reveal .roll {
-	overflow: visible;
-	line-height: 1em;
-}
-
-.reveal small a {
-	font-size: 16pt !important;
-}
diff --git a/docs/slides/plpv14/_support/reveal/css/theme/beige.css b/docs/slides/plpv14/_support/reveal/css/theme/beige.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/theme/beige.css
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * A beige theme for reveal.js presentations, similar 
- * to the default theme.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'Lato', Times, 'Times New Roman', serif;
-	font-size: 36px;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #333;
-
-	background: #f7f3de;
-	background: -moz-radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%, rgba(247,242,211,1) 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(247,242,211,1)));
-	background: -webkit-radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%,rgba(247,242,211,1) 100%);
-	background: -o-radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%,rgba(247,242,211,1) 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%,rgba(247,242,211,1) 100%);
-	background: radial-gradient(center, ellipse cover,  rgba(255,255,255,1) 0%,rgba(247,242,211,1) 100%);
-}
-
-::-moz-selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-::-webkit-selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-::selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2, 
-.reveal h3, 
-.reveal h4, 
-.reveal h5, 
-.reveal h6 {
-	margin: 0 0 20px 0;
-	color: #333;
-	font-family: 'League Gothic', Impact, sans-serif;
-	line-height: 0.9em;
-	letter-spacing: 0.02em;
-	
-	text-transform: uppercase;
-}
-
-.reveal h1 {
-	text-shadow: 	0 1px 0 #ccc,
-					0 2px 0 #c9c9c9,
-					0 3px 0 #bbb,
-					0 4px 0 #b9b9b9,
-					0 5px 0 #aaa,
-					0 6px 1px rgba(0,0,0,.1),
-					0 0 5px rgba(0,0,0,.1),
-					0 1px 3px rgba(0,0,0,.3),
-					0 3px 5px rgba(0,0,0,.2),
-					0 5px 10px rgba(0,0,0,.25),
-					0 20px 20px rgba(0,0,0,.15);
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: #8b743d;
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		text-shadow: none;
-		border: none;
-		border-radius: 2px;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: #8b743d;
-}
-
-
-/*********************************************
- * IMAGES
- *********************************************/
-
-.reveal section img {
-	margin: 30px 0 0 0;
-	background: rgba(255,255,255,0.12);
-	border: 4px solid #eee;
-	
-	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: #8b743d;
-		
-		-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		color: #8b743d;
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: #8b743d;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/plpv14/_support/reveal/css/theme/default.css b/docs/slides/plpv14/_support/reveal/css/theme/default.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/theme/default.css
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * The default theme for reveal.js presentations.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.eot');
-	src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
-		 url('../../lib/font/league_gothic-webfont.woff') format('woff'),
-		 url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
-		 url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
-
-	font-weight: normal;
-	font-style: normal;
-}
-
-@font-face {
-		font-family: 'PTSansNarrow';
-        src: url('../../lib/font/PT_Sans-Narrow-Web-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-@font-face {
-		font-family: 'OpenSans';
-        src: url('../../lib/font/OpenSans-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'Lato', Times, 'Times New Roman', serif;
-	font-size: 36;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #eee;
-
-	background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiM1NTVhNWYiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMWMxZTIwIiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
-	background-color: #2b2b2b;
-	background: -moz-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%, rgba(28,30,32,1) 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(85,90,95,1)), color-stop(100%,rgba(28,30,32,1)));
-	background: -webkit-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -o-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-}
-
-
-/*********************************************
- * main.css OVERIDES
- *********************************************/
-
-
-/* Undo globally centered text from main.css*/
-.reveal .slides {
-	text-align: left;
-}
-
-.reveal li {
-	padding-bottom: 0.7em;
-	line-height: 1em;
-}
-
-.reveal p + ul {
-	padding-left: 4%
-}
-
-
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2 {
-	margin: 0 0 20px 0;
-	color: #eee;
-	font-family: 'League Gothic', Impact, sans-serif;
-	line-height: 0.9em;
-	letter-spacing: 0.02em;
-	
-	text-align: center;
-	text-transform: uppercase;
-	text-shadow: 0px 1px 0px rgba(0,0,0,1);
-}
-
-.reveal h1 {
-	padding-top: 3%%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	color: rgba(255,255,255,0.5);
-}
-
-.reveal h2 {
-	font-family: 'PTSansNarrow';
-	font-size: 130%;
-}
-
-.reveal .titlepage h1,
-.reveal h1.topic {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: hsl(185, 85%, 50%);
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		color: hsl(185, 85%, 70%);
-		
-		text-shadow: none;
-		border: none;
-		border-radius: 2px;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: hsl(185, 60%, 35%);
-}
-
-
-/*********************************************
- * IMAGES
- *********************************************/
-
-.reveal section img {
-	margin: 30px 0 0 0;
-	background: rgba(255,255,255,0.12);
-	border: 4px solid #eee;
-	
-	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: #13DAEC;
-		
-		-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		color: hsl(185, 85%, 70%);
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: hsl(185, 85%, 50%);
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/plpv14/_support/reveal/css/theme/seminar.css b/docs/slides/plpv14/_support/reveal/css/theme/seminar.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/theme/seminar.css
+++ /dev/null
@@ -1,196 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f0f1eb;
-  background-color: #f0f1eb; }
-
-.reveal {
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-::selection {
-  color: white;
-  background: #26351c;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 40px 0;
-  color: #383d3d;
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	// :color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.05em 0.05em 0.25em blue;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-/*
-.reveal a:not(.image) {
-  line-height: 1.3em; }
-
-
-.reveal a:not(.image) {
-  color: #51483d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #8b7c69;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #25211c; }
-
-*/
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #51483d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #51483d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #51483d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #51483d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #51483d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #8b7c69; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #8b7c69; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #8b7c69; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #8b7c69; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #51483d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #51483d; }
diff --git a/docs/slides/plpv14/_support/reveal/css/theme/seminar.orig.css b/docs/slides/plpv14/_support/reveal/css/theme/seminar.orig.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/theme/seminar.orig.css
+++ /dev/null
@@ -1,301 +0,0 @@
-/**
- * The default theme for reveal.js presentations.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@font-face {
-	font-family: 'League Gothic';
-	src: url('../../lib/font/league_gothic-webfont.ttf') format('truetype');
-	font-weight: normal;
-	font-style: normal;
-}
-
-@font-face {
-		font-family: 'PTSansNarrow';
-        src: url('../../lib/font/PT_Sans-Narrow-Web-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-@font-face {
-		font-family: 'OpenSans';
-        src: url('../../lib/font/OpenSans-Regular.ttf') format('truetype');
-        font-weight: normal;
-        font-style: normal;
-}
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'OpenSans', Times, 'Times New Roman', serif;
-	font-size: 36;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #eee;
-
-	background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiM1NTVhNWYiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMWMxZTIwIiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
-	background-color: #2b2b2b;
-	background: -moz-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%, rgba(28,30,32,1) 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(85,90,95,1)), color-stop(100%,rgba(28,30,32,1)));
-	background: -webkit-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -o-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-	background: radial-gradient(center, ellipse cover,  rgba(85,90,95,1) 0%,rgba(28,30,32,1) 100%);
-}
-
-
-/*********************************************
- * main.css OVERIDES
- *********************************************/
-
-
-/*--DW-- uncomment below to undo globally centered text from main.css*/
-
-/*.reveal .slides {
-	text-align: left;
-}
-
-.reveal li {
-	padding-bottom: 0.7em;
-	line-height: 1em;
-}
-.reveal ul ul {
-	padding-left: 8%;
-	padding-top: 0.7em;
-	font-size: 85%;
-}*/
-
-/*--DW--
-* override list width to make multiline list items
-* a bit more manageable
-*/
-.reveal ul {
-	max-width: 80%;
-}
-
-.reveal li {
-	padding-bottom: 0.3em;
-}
-
-/*--DW-- uncenter pararagraph blocks*/
-.reveal .slides p {
-	text-align: left
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2 {
-	margin: 0 0 20px 0;
-	color: #eee;
-	font-family: 'League Gothic', Impact, sans-serif;
-	line-height: 0.9em;
-	letter-spacing: 0.02em;
-	
-	text-align: center;
-	text-transform: uppercase;
-	text-shadow: 0px 1px 0px rgba(0,0,0,1);
-}
-
-.reveal h2 {
-	font-family: 'PTSansNarrow';
-	font-size: 130%;
-}
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-
-
-/*********************************************
- * BLOCKQUOTES
- *********************************************/
-
-/*--DW--*/
-.reveal blockquote
-{   background: rgba(255,255,255, .2);
-    font-size: 75%;
-    text-align: justify;
-    width: 70%;
-    padding: 0.5em 5% 0.2em;
-    margin: 0 10%;
-    border: 2px solid rgba(255, 255, 255, .1);
-    -webkit-box-shadow: .1em .1em .5em black inset;
-    -moz-box-shadow: .1em .1em .5em black inset;
-    box-shadow: .1em .1em .5em black inset;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: hsl(185, 85%, 50%);
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-.reveal a:not(.image):hover {
-	color: hsl(185, 85%, 70%);
-	
-	text-shadow: none;
-	border: none;
-	border-radius: 2px;
-}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: hsl(185, 60%, 35%);
-}
-
-
-/*********************************************
- * IMAGES AND FIGURES
- *********************************************/
-
-/*--DW-- added figures; changed img styling*/
-/*pandoc*/
-.reveal figure {
-	margin-left: auto;
-	margin-right: auto;
-}
-
-/*pandoc*/
-.reveal figcaption {
-	text-align: center;
-	font-size: 75%;
-	font-style: italic;
-}
-.reveal section img,
-.reveal section embed {
-/*	width: 80%;
-	height: 80%;
-*/	display: block;
-	margin-left: auto;
-	margin-right: auto;
-	padding: 15px;
-	background: rgba(255,255,255, .75);
-    border: 2px solid rgba(255, 255, 255, .1);
-    -webkit-box-shadow: .1em .1em .5em black inset;
-       -moz-box-shadow: .1em .1em .5em black inset;
-            box-shadow: .1em .1em .5em black inset;
-
-/*--DW-- original image box styling*/
-/*
--webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-
--webkit-transition: all .2s linear;
-   -moz-transition: all .2s linear;
-    -ms-transition: all .2s linear;
-     -o-transition: all .2s linear;
-        transition: all .2s linear;
-*/
-}
-
-.reveal a:hover img {
-	background: rgba(255,255,255,0.2);
-	border-color: #13DAEC;
-	
-	-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		/*color: hsl(185, 85%, 70%);*/
-		color: rgba(138, 201, 85, 0.60);
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		/*background: hsl(185, 85%, 50%);*/
-		background: rgba(138, 201, 85, 0.60);
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/plpv14/_support/reveal/css/theme/serif.css b/docs/slides/plpv14/_support/reveal/css/theme/serif.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/theme/serif.css
+++ /dev/null
@@ -1,190 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar
- * to the default theme. The accent color is brown.
- *
- * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
- */
-.reveal a:not(.image) {
-  line-height: 1.3em; 
-}
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-body {
-  background: #f0f1eb;
-  background-color: #f0f1eb; }
-
-.reveal {
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  font-size: 36px;
-  font-weight: normal;
-  letter-spacing: -0.02em;
-  color: black; }
-
-::selection {
-  color: white;
-  background: #26351c;
-  text-shadow: none; }
-
-/*********************************************
- * HEADERS
- *********************************************/
-.reveal h1,
-.reveal h2,
-.reveal h3,
-.reveal h4,
-.reveal h5,
-.reveal h6 {
-  margin: 0 0 40px 0;
-  color: #383d3d;
-  font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
-  line-height: 0.9em;
-  letter-spacing: 0.02em;
-  text-transform: none;
-  text-shadow: none; }
-
-.reveal h1 {
-  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }
-
-
-
-/*pandoc*/
-.reveal .level1 h1 {
-	padding-top: 3%;
-	padding-bottom: 0.3em;
-	border-bottom: 1px solid #8e8e8e;
-	font-size: 100%;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h1 {
-	font-size: 3em;
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.05em 0.05em 0.25em blue;
-}
-
-/*pandoc*/
-.reveal .titlepage h2 {
-	font-size: 1em;
-	color: rgba(255,255,255,0.5);
-}
-
-/*pandoc*/
-.reveal .titlepage h3 {
-	font-size: 0.75em;
-	color: rgba(255,255,255,0.5);
-	text-align: center;
-}
-
-/*pandoc*/
-.reveal .topic h1 {
-	font-size: 2.11em;
-	color: rgba(255,255,255,0.9);
-	padding-top: 30%;
-	padding-bottom: 1em;
-	border: none;
-	text-shadow: 0.1em 0.1em 0.1em black;
-}
-
-/*pandoc*/
-.reveal .placeholder h1,
-.reveal .placeholder h2 {
-	border: none;
-}
-
-
-
-/*********************************************
- * LINKS
- *********************************************/
-.reveal a:not(.image) {
-  color: #51483d;
-  text-decoration: none;
-  -webkit-transition: color .15s ease;
-  -moz-transition: color .15s ease;
-  -ms-transition: color .15s ease;
-  -o-transition: color .15s ease;
-  transition: color .15s ease; }
-
-.reveal a:not(.image):hover {
-  color: #8b7c69;
-  text-shadow: none;
-  border: none; }
-
-.reveal .roll span:after {
-  color: #fff;
-  background: #25211c; }
-
-/*********************************************
- * IMAGES
- *********************************************/
-.reveal section img {
-  margin: 15px 0px;
-  background: rgba(255, 255, 255, 0.12);
-  border: 4px solid black;
-  box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-  -webkit-transition: all .2s linear;
-  -moz-transition: all .2s linear;
-  -ms-transition: all .2s linear;
-  -o-transition: all .2s linear;
-  transition: all .2s linear; }
-
-.reveal a:hover img {
-  background: rgba(255, 255, 255, 0.2);
-  border-color: #51483d;
-  box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-.reveal .controls div.navigate-left,
-.reveal .controls div.navigate-left.enabled {
-  border-right-color: #51483d; }
-
-.reveal .controls div.navigate-right,
-.reveal .controls div.navigate-right.enabled {
-  border-left-color: #51483d; }
-
-.reveal .controls div.navigate-up,
-.reveal .controls div.navigate-up.enabled {
-  border-bottom-color: #51483d; }
-
-.reveal .controls div.navigate-down,
-.reveal .controls div.navigate-down.enabled {
-  border-top-color: #51483d; }
-
-.reveal .controls div.navigate-left.enabled:hover {
-  border-right-color: #8b7c69; }
-
-.reveal .controls div.navigate-right.enabled:hover {
-  border-left-color: #8b7c69; }
-
-.reveal .controls div.navigate-up.enabled:hover {
-  border-bottom-color: #8b7c69; }
-
-.reveal .controls div.navigate-down.enabled:hover {
-  border-top-color: #8b7c69; }
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-.reveal .progress {
-  background: rgba(0, 0, 0, 0.2); }
-
-.reveal .progress span {
-  background: #51483d;
-  -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-  transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
-
-/*********************************************
- * SLIDE NUMBER
- *********************************************/
-.reveal .slide-number {
-  color: #51483d; }
diff --git a/docs/slides/plpv14/_support/reveal/css/theme/simple.css b/docs/slides/plpv14/_support/reveal/css/theme/simple.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/theme/simple.css
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * A simple theme for reveal.js presentations, similar 
- * to the default theme. The accent color is darkblue; 
- * do a find-replace to change it.
- * 
- * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
- * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se; so is the theme - beige.css - that this is based off of.
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@import url(http://fonts.googleapis.com/css?family=News+Cycle:400,700);
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'Lato', Times, 'Times New Roman', serif;
-	font-size: 36px;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: black !important;
-
-	background: white;
-}
-
-::-moz-selection {
-    background:rgba(0, 0, 0, 0.99);
-	color: white; 
-}
-::-webkit-selection {
-    background:rgba(0, 0, 0, 0.99);
-	color: white; 
-}
-::selection {
-    background:rgba(0, 0, 0, 0.99);
-	color: white; 
-}
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2, 
-.reveal h3, 
-.reveal h4, 
-.reveal h5, 
-.reveal h6 {
-	margin: 0 0 20px 0;
-	color: black;
-	font-family: 'News Cycle', Impact, sans-serif;
-	line-height: 0.9em;
-	
-	text-transform: uppercase;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: darkblue;
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		text-shadow: none;
-		border: none;
-		border-radius: 2px;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: darkblue;
-}
-
-
-/*********************************************
- * IMAGES
- *********************************************/
-
-.reveal section img {
-	margin: 30px 0 0 0;
-	background: rgba(255,255,255,0.12);
-	border: 4px solid #eee;
-	
-	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: darkblue;
-		
-		-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: black;
-}
-	.reveal .controls a.enabled {
-		color: darkblue;
-		opacity: 1;
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: darkblue;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/plpv14/_support/reveal/css/theme/sky.css b/docs/slides/plpv14/_support/reveal/css/theme/sky.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/css/theme/sky.css
+++ /dev/null
@@ -1,165 +0,0 @@
-/**
- * Sky theme for reveal.js presentations.
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-
-/*********************************************
- * FONT-FACE DEFINITIONS
- *********************************************/
-
-@import url(http://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
-@import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
-
-
-
-/*********************************************
- * GLOBAL STYLES
- *********************************************/
-
-body {
-	font-family: 'Open Sans', sans-serif;
-	font-size: 36px;
-	font-weight: 200;
-	letter-spacing: -0.02em;
-	color: #333;
-
-	background: #f7fbfc;
-	background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPHJhZGlhbEdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIj4KICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiNmN2ZiZmMiIHN0b3Atb3BhY2l0eT0iMSIvPgogICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjYWRkOWU0IiBzdG9wLW9wYWNpdHk9IjEiLz4KICA8L3JhZGlhbEdyYWRpZW50PgogIDxyZWN0IHg9Ii01MCIgeT0iLTUwIiB3aWR0aD0iMTAxIiBoZWlnaHQ9IjEwMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
-	background: -moz-radial-gradient(center, ellipse cover,  #f7fbfc 0%, #add9e4 100%);
-	background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#f7fbfc), color-stop(100%,#add9e4));
-	background: -webkit-radial-gradient(center, ellipse cover,  #f7fbfc 0%,#add9e4 100%);
-	background: -o-radial-gradient(center, ellipse cover,  #f7fbfc 0%,#add9e4 100%);
-	background: -ms-radial-gradient(center, ellipse cover,  #f7fbfc 0%,#add9e4 100%);
-	background: radial-gradient(ellipse at center,  #f7fbfc 0%,#add9e4 100%);
-}
-
-::-moz-selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-::-webkit-selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-::selection {
-	background:rgba(79, 64, 28, 0.99);
-	color: white; 
-}
-
-
-/*********************************************
- * HEADERS
- *********************************************/
-
-.reveal h1, 
-.reveal h2, 
-.reveal h3, 
-.reveal h4, 
-.reveal h5, 
-.reveal h6 {
-	margin: 0 0 20px 0;
-	color: #333;
-	font-family: 'Quicksand', sans-serif;
-	line-height: 0.9em;
-	letter-spacing: -0.08em;
-	
-	text-transform: uppercase;
-}
-
-
-/*********************************************
- * LINKS
- *********************************************/
-
-.reveal a:not(.image) {
-	color: #3b759e;
-	text-decoration: none;
-
-	-webkit-transition: color .15s ease;
-	   -moz-transition: color .15s ease;
-	    -ms-transition: color .15s ease;
-	     -o-transition: color .15s ease;
-	        transition: color .15s ease;
-}
-	.reveal a:not(.image):hover {
-		text-shadow: none;
-		border: none;
-		border-radius: 2px;
-	}
-
-.reveal .roll span:after {
-	color: #fff;
-	background: #3b759e;
-}
-
-
-/*********************************************
- * MISC
- *********************************************/
-
-.reveal section img {
-	margin: 30px 0 0 0;
-	background: rgba(255,255,255,0.12);
-	border: 1px solid #ddd;
-	
-	-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	   -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	        box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
-	
-	-webkit-transition: all .2s linear;
-	   -moz-transition: all .2s linear;
-	    -ms-transition: all .2s linear;
-	     -o-transition: all .2s linear;
-	        transition: all .2s linear;
-}
-
-	.reveal a:hover img {
-		background: rgba(255,255,255,0.2);
-		border-color: #3b759e;
-		
-		-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		   -moz-box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-		        box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
-	}
-
-.reveal blockquote {
-	background: rgba(255, 255, 255, 0.4);
-}
-
-.reveal p {
-	margin-bottom: 20px;
-}
-
-
-/*********************************************
- * NAVIGATION CONTROLS
- *********************************************/
-
-.reveal .controls a {
-	color: #fff;
-}
-	.reveal .controls a.enabled {
-		color: #3b759e;
-		text-shadow: 0px 0px 2px hsla(185, 45%, 70%, 0.3);
-	}
-
-
-/*********************************************
- * PROGRESS BAR
- *********************************************/
-
-.reveal .progress {
-	background: rgba(0,0,0,0.2);
-}
-	.reveal .progress span {
-		background: #3b759e;
-
-		-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		   -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		    -ms-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		     -o-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-		        transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-	}
-
-
diff --git a/docs/slides/plpv14/_support/reveal/js/.reveal.js.swo b/docs/slides/plpv14/_support/reveal/js/.reveal.js.swo
deleted file mode 100644
Binary files a/docs/slides/plpv14/_support/reveal/js/.reveal.js.swo and /dev/null differ
diff --git a/docs/slides/plpv14/_support/reveal/js/.reveal.js.swp b/docs/slides/plpv14/_support/reveal/js/.reveal.js.swp
deleted file mode 100644
Binary files a/docs/slides/plpv14/_support/reveal/js/.reveal.js.swp and /dev/null differ
diff --git a/docs/slides/plpv14/_support/reveal/js/.reveal.min.js.swo b/docs/slides/plpv14/_support/reveal/js/.reveal.min.js.swo
deleted file mode 100644
Binary files a/docs/slides/plpv14/_support/reveal/js/.reveal.min.js.swo and /dev/null differ
diff --git a/docs/slides/plpv14/_support/reveal/js/.reveal.min.js.swp b/docs/slides/plpv14/_support/reveal/js/.reveal.min.js.swp
deleted file mode 100644
Binary files a/docs/slides/plpv14/_support/reveal/js/.reveal.min.js.swp and /dev/null differ
diff --git a/docs/slides/plpv14/_support/reveal/js/reveal.js b/docs/slides/plpv14/_support/reveal/js/reveal.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/js/reveal.js
+++ /dev/null
@@ -1,1149 +0,0 @@
-/*!
- * reveal.js 2.0 r22
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- * 
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var Reveal = (function(){
-	
-	var HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section',
-		VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section',
-
-		IS_TOUCH_DEVICE = !!( 'ontouchstart' in window ),
-
-		// Configurations defaults, can be overridden at initialization time 
-		config = {
-			// Display controls in the bottom right corner
-			controls: true,
-
-			// Display a presentation progress bar
-			progress: true,
-
-			// Push each slide change to the browser history
-			history: false,
-
-			// Enable keyboard shortcuts for navigation
-			keyboard: true,
-
-			// Loop the presentation
-			loop: false,
-
-			// Number of milliseconds between automatically proceeding to the 
-			// next slide, disabled when set to 0
-			autoSlide: 0,
-
-			// Enable slide navigation via mouse wheel
-			mouseWheel: true,
-
-			// Apply a 3D roll to links on hover
-			rollingLinks: true,
-
-			// Transition style (see /css/theme)
-			theme: 'default', 
-
-			// Transition style
-			transition: 'default', // default/cube/page/concave/linear(2d),
-
-			// Script dependencies to load
-			dependencies: []
-		},
-
-		// The horizontal and verical index of the currently active slide
-		indexh = 0,
-		indexv = 0,
-
-		// The previous and current slide HTML elements
-		previousSlide,
-		currentSlide,
-
-		// Slides may hold a data-state attribute which we pick up and apply 
-		// as a class to the body. This list contains the combined state of 
-		// all current slides.
-		state = [],
-
-		// Cached references to DOM elements
-		dom = {},
-
-		// Detect support for CSS 3D transforms
-		supports3DTransforms =  'WebkitPerspective' in document.body.style ||
-                        		'MozPerspective' in document.body.style ||
-                        		'msPerspective' in document.body.style ||
-                        		'OPerspective' in document.body.style ||
-                        		'perspective' in document.body.style,
-        
-        supports2DTransforms =  'WebkitTransform' in document.body.style ||
-                        		'MozTransform' in document.body.style ||
-                        		'msTransform' in document.body.style ||
-                        		'OTransform' in document.body.style ||
-                        		'transform' in document.body.style,
-		
-		// Throttles mouse wheel navigation
-		mouseWheelTimeout = 0,
-
-		// An interval used to automatically move on to the next slide
-		autoSlideTimeout = 0,
-
-		// Delays updates to the URL due to a Chrome thumbnailer bug
-		writeURLTimeout = 0,
-
-		// Holds information about the currently ongoing touch input
-		touch = {
-			startX: 0,
-			startY: 0,
-			startSpan: 0,
-			startCount: 0,
-			handled: false,
-			threshold: 40
-		};
-	
-	
-	/**
-	 * Starts up the presentation if the client is capable.
-	 */
-	function initialize( options ) {
-		if( ( !supports2DTransforms && !supports3DTransforms ) ) {
-			document.body.setAttribute( 'class', 'no-transforms' );
-
-			// If the browser doesn't support core features we won't be 
-			// using JavaScript to control the presentation
-			return;
-		}
-
-		// Copy options over to our config object
-		extend( config, options );
-
-		// Cache references to DOM elements
-		dom.theme = document.querySelector( '#theme' );
-		dom.wrapper = document.querySelector( '.reveal' );
-		dom.progress = document.querySelector( '.reveal .progress' );
-		dom.progressbar = document.querySelector( '.reveal .progress span' );
-
-		if ( config.controls ) {
-			dom.controls = document.querySelector( '.reveal .controls' );
-			dom.controlsLeft = document.querySelector( '.reveal .controls .left' );
-			dom.controlsRight = document.querySelector( '.reveal .controls .right' );
-			dom.controlsUp = document.querySelector( '.reveal .controls .up' );
-			dom.controlsDown = document.querySelector( '.reveal .controls .down' );
-		}
-
-		// Loads the dependencies and continues to #start() once done
-		load();
-
-		// Set up hiding of the browser address bar
-		if( navigator.userAgent.match( /(iphone|ipod|android)/i ) ) {
-			// Give the page some scrollable overflow
-			document.documentElement.style.overflow = 'scroll';
-			document.body.style.height = '120%';
-
-			// Events that should trigger the address bar to hide
-			window.addEventListener( 'load', removeAddressBar, false );
-			window.addEventListener( 'orientationchange', removeAddressBar, false );
-		}
-		
-	}
-
-	/**
-	 * Loads the dependencies of reveal.js. Dependencies are 
-	 * defined via the configuration option 'dependencies' 
-	 * and will be loaded prior to starting/binding reveal.js. 
-	 * Some dependencies may have an 'async' flag, if so they 
-	 * will load after reveal.js has been started up.
-	 */
-	function load() {
-		var scripts = [],
-			scriptsAsync = [];
-
-		for( var i = 0, len = config.dependencies.length; i < len; i++ ) {
-			var s = config.dependencies[i];
-
-			// Load if there's no condition or the condition is truthy
-			if( !s.condition || s.condition() ) {
-				if( s.async ) {
-					scriptsAsync.push( s.src );
-				}
-				else {
-					scripts.push( s.src );
-				}
-
-				// Extension may contain callback functions
-				if( typeof s.callback === 'function' ) {
-					head.ready( s.src.match( /([\w\d_-]*)\.?[^\\\/]*$/i )[0], s.callback );
-				}
-			}
-		}
-
-		// Called once synchronous scritps finish loading
-		function proceed() {
-			// Load asynchronous scripts
-			head.js.apply( null, scriptsAsync );
-			
-			start();
-		}
-
-		if( scripts.length ) {
-			head.ready( proceed );
-
-			// Load synchronous scripts
-			head.js.apply( null, scripts );
-		}
-		else {
-			proceed();
-		}
-	}
-
-	/**
-	 * Starts up reveal.js by binding input events and navigating 
-	 * to the current URL deeplink if there is one.
-	 */
-	function start() {
-		// Subscribe to input
-		addEventListeners();
-
-		// Updates the presentation to match the current configuration values
-		configure();
-
-		// Read the initial hash
-		readURL();
-
-		// Start auto-sliding if it's enabled
-		cueAutoSlide();
-	}
-
-	/**
-	 * Applies the configuration settings from the config object.
-	 */
-	function configure() {
-		if( supports3DTransforms === false ) {
-			config.transition = 'linear';
-		}
-
-		if( config.controls && dom.controls ) {
-			dom.controls.style.display = 'block';
-		}
-
-		if( config.progress && dom.progress ) {
-			dom.progress.style.display = 'block';
-		}
-
-		// Load the theme in the config, if it's not already loaded
-		if( config.theme && dom.theme ) {
-			var themeURL = dom.theme.getAttribute( 'href' );
-			var themeFinder = /[^/]*?(?=\.css)/;
-			var themeName = themeURL.match(themeFinder)[0];
-			if(  config.theme !== themeName ) {
-				themeURL = themeURL.replace(themeFinder, config.theme);
-				dom.theme.setAttribute( 'href', themeURL );
-			}
-		}
-
-
-		if( config.transition !== 'default' ) {
-			dom.wrapper.classList.add( config.transition );
-		}
-
-		if( config.mouseWheel ) {
-			document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
-			document.addEventListener( 'mousewheel', onDocumentMouseScroll, false );
-		}
-
-		if( config.rollingLinks ) {
-			// Add some 3D magic to our anchors
-			linkify();
-		}
-	}
-
-	function addEventListeners() {
-		document.addEventListener( 'touchstart', onDocumentTouchStart, false );
-		document.addEventListener( 'touchmove', onDocumentTouchMove, false );
-		document.addEventListener( 'touchend', onDocumentTouchEnd, false );
-		window.addEventListener( 'hashchange', onWindowHashChange, false );
-
-		if( config.keyboard ) {
-			document.addEventListener( 'keydown', onDocumentKeyDown, false );
-		}
-
-		if ( config.controls && dom.controls ) {
-			dom.controlsLeft.addEventListener( 'click', preventAndForward( navigateLeft ), false );
-			dom.controlsRight.addEventListener( 'click', preventAndForward( navigateRight ), false );
-			dom.controlsUp.addEventListener( 'click', preventAndForward( navigateUp ), false );
-			dom.controlsDown.addEventListener( 'click', preventAndForward( navigateDown ), false );	
-		}
-	}
-
-	function removeEventListeners() {
-		document.removeEventListener( 'keydown', onDocumentKeyDown, false );
-		document.removeEventListener( 'touchstart', onDocumentTouchStart, false );
-		document.removeEventListener( 'touchmove', onDocumentTouchMove, false );
-		document.removeEventListener( 'touchend', onDocumentTouchEnd, false );
-		window.removeEventListener( 'hashchange', onWindowHashChange, false );
-		
-		if ( config.controls && dom.controls ) {
-			dom.controlsLeft.removeEventListener( 'click', preventAndForward( navigateLeft ), false );
-			dom.controlsRight.removeEventListener( 'click', preventAndForward( navigateRight ), false );
-			dom.controlsUp.removeEventListener( 'click', preventAndForward( navigateUp ), false );
-			dom.controlsDown.removeEventListener( 'click', preventAndForward( navigateDown ), false );
-		}
-	}
-
-	/**
-	 * Extend object a with the properties of object b. 
-	 * If there's a conflict, object b takes precedence.
-	 */
-	function extend( a, b ) {
-		for( var i in b ) {
-			a[ i ] = b[ i ];
-		}
-	}
-
-	/**
-	 * Measures the distance in pixels between point a
-	 * and point b. 
-	 * 
-	 * @param {Object} a point with x/y properties
-	 * @param {Object} b point with x/y properties
-	 */
-	function distanceBetween( a, b ) {
-		var dx = a.x - b.x,
-			dy = a.y - b.y;
-
-		return Math.sqrt( dx*dx + dy*dy );
-	}
-
-	/**
-	 * Prevents an events defaults behavior calls the 
-	 * specified delegate.
-	 * 
-	 * @param {Function} delegate The method to call 
-	 * after the wrapper has been executed
-	 */
-	function preventAndForward( delegate ) {
-		return function( event ) {
-			event.preventDefault();
-			delegate.call();
-		}
-	}
-
-	/**
-	 * Causes the address bar to hide on mobile devices, 
-	 * more vertical space ftw.
-	 */
-	function removeAddressBar() {
-		setTimeout( function() {
-			window.scrollTo( 0, 1 );
-		}, 0 );
-	}
-	
-	/**
-	 * Handler for the document level 'keydown' event.
-	 * 
-	 * @param {Object} event
-	 */
-	function onDocumentKeyDown( event ) {
-		// FFT: Use document.querySelector( ':focus' ) === null 
-		// instead of checking contentEditable?
-
-		// Disregard the event if the target is editable or a 
-		// modifier is present
-		if ( event.target.contentEditable != 'inherit' || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-				
-		var triggered = false;
-
-		switch( event.keyCode ) {
-			// p, page up
-			case 80: case 33: navigatePrev(); triggered = true; break; 
-			// n, page down
-			case 78: case 34: navigateNext(); triggered = true; break;
-			// h, left
-			case 72: case 37: navigateLeft(); triggered = true; break;
-			// l, right
-			case 76: case 39: navigateRight(); triggered = true; break;
-			// k, up
-			case 75: case 38: navigateUp(); triggered = true; break;
-			// j, down
-			case 74: case 40: navigateDown(); triggered = true; break;
-			// home
-			case 36: navigateTo( 0 ); triggered = true; break;
-			// end
-			case 35: navigateTo( Number.MAX_VALUE ); triggered = true; break;
-			// space
-			case 32: overviewIsActive() ? deactivateOverview() : navigateNext(); triggered = true; break;
-			// return
-			case 13: if( overviewIsActive() ) { deactivateOverview(); triggered = true; } break;
-		}
-
-		// If the input resulted in a triggered action we should prevent 
-		// the browsers default behavior
-		if( triggered ) {
-			event.preventDefault();
-		}
-		else if ( event.keyCode === 27 && supports3DTransforms ) {
-			toggleOverview();
-	
-			event.preventDefault();
-		}
-
-		// If auto-sliding is enabled we need to cue up 
-		// another timeout
-		cueAutoSlide();
-
-	}
-
-	/**
-	 * Handler for the document level 'touchstart' event,
-	 * enables support for swipe and pinch gestures.
-	 */
-	function onDocumentTouchStart( event ) {
-		touch.startX = event.touches[0].clientX;
-		touch.startY = event.touches[0].clientY;
-		touch.startCount = event.touches.length;
-
-		// If there's two touches we need to memorize the distance 
-		// between those two points to detect pinching
-		if( event.touches.length === 2 ) {
-			touch.startSpan = distanceBetween( {
-				x: event.touches[1].clientX,
-				y: event.touches[1].clientY
-			}, {
-				x: touch.startX,
-				y: touch.startY
-			} );
-		}
-	}
-	
-	/**
-	 * Handler for the document level 'touchmove' event.
-	 */
-	function onDocumentTouchMove( event ) {
-		// Each touch should only trigger one action
-		if( !touch.handled ) {
-			var currentX = event.touches[0].clientX;
-			var currentY = event.touches[0].clientY;
-
-			// If the touch started off with two points and still has 
-			// two active touches; test for the pinch gesture
-			if( event.touches.length === 2 && touch.startCount === 2 ) {
-
-				// The current distance in pixels between the two touch points
-				var currentSpan = distanceBetween( {
-					x: event.touches[1].clientX,
-					y: event.touches[1].clientY
-				}, {
-					x: touch.startX,
-					y: touch.startY
-				} );
-
-				// If the span is larger than the desire amount we've got 
-				// ourselves a pinch
-				if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) {
-					touch.handled = true;
-
-					if( currentSpan < touch.startSpan ) {
-						activateOverview();
-					}
-					else {
-						deactivateOverview();
-					}
-				}
-
-			}
-			// There was only one touch point, look for a swipe
-			else if( event.touches.length === 1 ) {
-				var deltaX = currentX - touch.startX,
-					deltaY = currentY - touch.startY;
-
-				if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
-					touch.handled = true;
-					navigateLeft();
-				} 
-				else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
-					touch.handled = true;
-					navigateRight();
-				} 
-				else if( deltaY > touch.threshold ) {
-					touch.handled = true;
-					navigateUp();
-				} 
-				else if( deltaY < -touch.threshold ) {
-					touch.handled = true;
-					navigateDown();
-				}
-			}
-
-			event.preventDefault();
-		}
-	}
-
-	/**
-	 * Handler for the document level 'touchend' event.
-	 */
-	function onDocumentTouchEnd( event ) {
-		touch.handled = false;
-	}
-
-	/**
-	 * Handles mouse wheel scrolling, throttled to avoid 
-	 * skipping multiple slides.
-	 */
-	function onDocumentMouseScroll( event ){
-		clearTimeout( mouseWheelTimeout );
-
-		mouseWheelTimeout = setTimeout( function() {
-			var delta = event.detail || -event.wheelDelta;
-			if( delta > 0 ) {
-				navigateNext();
-			}
-			else {
-				navigatePrev();
-			}
-		}, 100 );
-	}
-	
-	/**
-	 * Handler for the window level 'hashchange' event.
-	 * 
-	 * @param {Object} event
-	 */
-	function onWindowHashChange( event ) {
-		readURL();
-	}
-
-	/**
-	 * Wrap all links in 3D goodness.
-	 */
-	function linkify() {
-		if( supports3DTransforms && !( 'msPerspective' in document.body.style ) ) {
-        	var nodes = document.querySelectorAll( '.reveal .slides section a:not(.image)' );
-
-	        for( var i = 0, len = nodes.length; i < len; i++ ) {
-	            var node = nodes[i];
-	            
-	            if( node.textContent && !node.querySelector( 'img' ) && ( !node.className || !node.classList.contains( node, 'roll' ) ) ) {
-	                node.classList.add( 'roll' );
-	                node.innerHTML = '<span data-title="'+ node.text +'">' + node.innerHTML + '</span>';
-	            }
-	        };
-        }
-	}
-
-	/**
-	 * Displays the overview of slides (quick nav) by 
-	 * scaling down and arranging all slide elements.
-	 * 
-	 * Experimental feature, might be dropped if perf 
-	 * can't be improved.
-	 */
-	function activateOverview() {
-		
-		dom.wrapper.classList.add( 'overview' );
-
-		var horizontalSlides = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-
-		for( var i = 0, len1 = horizontalSlides.length; i < len1; i++ ) {
-			var hslide = horizontalSlides[i],
-				htransform = 'translateZ(-2500px) translate(' + ( ( i - indexh ) * 105 ) + '%, 0%)';
-			
-			hslide.setAttribute( 'data-index-h', i );
-			hslide.style.display = 'block';
-			hslide.style.WebkitTransform = htransform;
-			hslide.style.MozTransform = htransform;
-			hslide.style.msTransform = htransform;
-			hslide.style.OTransform = htransform;
-			hslide.style.transform = htransform;
-		
-			if( !hslide.classList.contains( 'stack' ) ) {
-				// Navigate to this slide on click
-				hslide.addEventListener( 'click', onOverviewSlideClicked, true );
-			}
-	
-			var verticalSlides = Array.prototype.slice.call( hslide.querySelectorAll( 'section' ) );
-
-			for( var j = 0, len2 = verticalSlides.length; j < len2; j++ ) {
-				var vslide = verticalSlides[j],
-					vtransform = 'translate(0%, ' + ( ( j - ( i === indexh ? indexv : 0 ) ) * 105 ) + '%)';
-
-				vslide.setAttribute( 'data-index-h', i );
-				vslide.setAttribute( 'data-index-v', j );
-				vslide.style.display = 'block';
-				vslide.style.WebkitTransform = vtransform;
-				vslide.style.MozTransform = vtransform;
-				vslide.style.msTransform = vtransform;
-				vslide.style.OTransform = vtransform;
-				vslide.style.transform = vtransform;
-
-				// Navigate to this slide on click
-				vslide.addEventListener( 'click', onOverviewSlideClicked, true );
-			}
-			
-		}
-	}
-	
-	/**
-	 * Exits the slide overview and enters the currently
-	 * active slide.
-	 */
-	function deactivateOverview() {
-		dom.wrapper.classList.remove( 'overview' );
-
-		var slides = Array.prototype.slice.call( document.querySelectorAll( '.reveal .slides section' ) );
-
-		for( var i = 0, len = slides.length; i < len; i++ ) {
-			var element = slides[i];
-
-			// Resets all transforms to use the external styles
-			element.style.WebkitTransform = '';
-			element.style.MozTransform = '';
-			element.style.msTransform = '';
-			element.style.OTransform = '';
-			element.style.transform = '';
-
-			element.removeEventListener( 'click', onOverviewSlideClicked );
-		}
-
-		slide();
-	}
-
-	/**
-	 * Checks if the overview is currently active.
-	 * 
-	 * @return {Boolean} true if the overview is active,
-	 * false otherwise
-	 */
-	function overviewIsActive() {
-		return dom.wrapper.classList.contains( 'overview' );
-	}
-
-	/**
-	 * Invoked when a slide is and we're in the overview.
-	 */
-	function onOverviewSlideClicked( event ) {
-		// TODO There's a bug here where the event listeners are not 
-		// removed after deactivating the overview.
-		if( overviewIsActive() ) {
-			event.preventDefault();
-
-			deactivateOverview();
-
-			indexh = this.getAttribute( 'data-index-h' );
-			indexv = this.getAttribute( 'data-index-v' );
-
-			slide();
-		}
-	}
-
-	/**
-	 * Updates one dimension of slides by showing the slide
-	 * with the specified index.
-	 * 
-	 * @param {String} selector A CSS selector that will fetch
-	 * the group of slides we are working with
-	 * @param {Number} index The index of the slide that should be
-	 * shown
-	 * 
-	 * @return {Number} The index of the slide that is now shown,
-	 * might differ from the passed in index if it was out of 
-	 * bounds.
-	 */
-	function updateSlides( selector, index ) {
-		
-		// Select all slides and convert the NodeList result to
-		// an array
-		var slides = Array.prototype.slice.call( document.querySelectorAll( selector ) ),
-			slidesLength = slides.length;
-		
-		if( slidesLength ) {
-
-			// Should the index loop?
-			if( config.loop ) {
-				index %= slidesLength;
-
-				if( index < 0 ) {
-					index = slidesLength + index;
-				}
-			}
-			
-			// Enforce max and minimum index bounds
-			index = Math.max( Math.min( index, slidesLength - 1 ), 0 );
-			
-			for( var i = 0; i < slidesLength; i++ ) {
-				var slide = slides[i];
-
-				// Optimization; hide all slides that are three or more steps 
-				// away from the present slide
-				if( overviewIsActive() === false ) {
-					// The distance loops so that it measures 1 between the first
-					// and last slides
-					var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0;
-
-					slide.style.display = distance > 3 ? 'none' : 'block';
-				}
-
-				slides[i].classList.remove( 'past' );
-				slides[i].classList.remove( 'present' );
-				slides[i].classList.remove( 'future' );
-
-				if( i < index ) {
-					// Any element previous to index is given the 'past' class
-					slides[i].classList.add( 'past' );
-				}
-				else if( i > index ) {
-					// Any element subsequent to index is given the 'future' class
-					slides[i].classList.add( 'future' );
-				}
-
-				// If this element contains vertical slides
-				if( slide.querySelector( 'section' ) ) {
-					slides[i].classList.add( 'stack' );
-				}
-			}
-
-			// Mark the current slide as present
-			slides[index].classList.add( 'present' );
-
-			// If this slide has a state associated with it, add it
-			// onto the current state of the deck
-			var slideState = slides[index].getAttribute( 'data-state' );
-			if( slideState ) {
-				state = state.concat( slideState.split( ' ' ) );
-			}
-		}
-		else {
-			// Since there are no slides we can't be anywhere beyond the 
-			// zeroth index
-			index = 0;
-		}
-		
-		return index;
-		
-	}
-	
-	/**
-	 * Updates the visual slides to represent the currently
-	 * set indices. 
-	 */
-	function slide( h, v ) {
-		// Remember where we were at before
-		previousSlide = currentSlide;
-
-		// Remember the state before this slide
-		var stateBefore = state.concat();
-
-		// Reset the state array
-		state.length = 0;
-
-		var indexhBefore = indexh,
-			indexvBefore = indexv;
-
-		// Activate and transition to the new slide
-		indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );
-		indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );
-
-		// Apply the new state
-		stateLoop: for( var i = 0, len = state.length; i < len; i++ ) {
-			// Check if this state existed on the previous slide. If it 
-			// did, we will avoid adding it repeatedly.
-			for( var j = 0; j < stateBefore.length; j++ ) {
-				if( stateBefore[j] === state[i] ) {
-					stateBefore.splice( j, 1 );
-					continue stateLoop;
-				}
-			}
-
-			document.documentElement.classList.add( state[i] );
-
-			// Dispatch custom event matching the state's name
-			dispatchEvent( state[i] );
-		}
-
-		// Clean up the remaints of the previous state
-		while( stateBefore.length ) {
-			document.documentElement.classList.remove( stateBefore.pop() );
-		}
-
-		// Update progress if enabled
-		if( config.progress && dom.progress ) {
-			dom.progressbar.style.width = ( indexh / ( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ).length - 1 ) ) * window.innerWidth + 'px';
-		}
-
-		// Close the overview if it's active
-		if( overviewIsActive() ) {
-			activateOverview();
-		}
-
-		updateControls();
-		
-		clearTimeout( writeURLTimeout );
-		writeURLTimeout = setTimeout( writeURL, 1500 );
-
-		// Query all horizontal slides in the deck
-		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-
-		// Find the current horizontal slide and any possible vertical slides
-		// within it
-		var currentHorizontalSlide = horizontalSlides[ indexh ],
-			currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );
-
-		// Store references to the previous and current slides
-		currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;
-
-		// Dispatch an event if the slide changed
-		if( indexh !== indexhBefore || indexv !== indexvBefore ) {
-			dispatchEvent( 'slidechanged', {
-				'indexh': indexh, 
-				'indexv': indexv,
-				'previousSlide': previousSlide,
-				'currentSlide': currentSlide
-			} );
-		}
-		else {
-			// Ensure that the previous slide is never the same as the current
-			previousSlide = null;
-		}
-
-		// Solves an edge case where the previous slide maintains the 
-		// 'present' class when navigating between adjacent vertical 
-		// stacks
-		if( previousSlide ) {
-			previousSlide.classList.remove( 'present' );
-		}
-	}
-
-	/**
-	 * Updates the state and link pointers of the controls.
-	 */
-	function updateControls() {
-		if ( !config.controls || !dom.controls ) {
-			return;
-		}
-		
-		var routes = availableRoutes();
-
-		// Remove the 'enabled' class from all directions
-		[ dom.controlsLeft, dom.controlsRight, dom.controlsUp, dom.controlsDown ].forEach( function( node ) {
-			node.classList.remove( 'enabled' );
-		} )
-
-		if( routes.left ) dom.controlsLeft.classList.add( 'enabled' );
-		if( routes.right ) dom.controlsRight.classList.add( 'enabled' );
-		if( routes.up ) dom.controlsUp.classList.add( 'enabled' );
-		if( routes.down ) dom.controlsDown.classList.add( 'enabled' );
-	}
-
-	/**
-	 * Determine what available routes there are for navigation.
-	 * 
-	 * @return {Object} containing four booleans: left/right/up/down
-	 */
-	function availableRoutes() {
-		var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );
-		var verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR );
-
-		return {
-			left: indexh > 0,
-			right: indexh < horizontalSlides.length - 1,
-			up: indexv > 0,
-			down: indexv < verticalSlides.length - 1
-		};
-	}
-	
-	/**
-	 * Reads the current URL (hash) and navigates accordingly.
-	 */
-	function readURL() {
-		var hash = window.location.hash;
-
-		// Attempt to parse the hash as either an index or name
-		var bits = hash.slice( 2 ).split( '/' ),
-			name = hash.replace( /#|\//gi, '' );
-
-		// If the first bit is invalid and there is a name we can 
-		// assume that this is a named link
-		if( isNaN( parseInt( bits[0] ) ) && name.length ) {
-			// Find the slide with the specified name
-			var slide = document.querySelector( '#' + name );
-
-			if( slide ) {
-				// Find the position of the named slide and navigate to it
-				var indices = Reveal.getIndices( slide );
-				navigateTo( indices.h, indices.v );
-			}
-			// If the slide doesn't exist, navigate to the current slide
-			else {
-				navigateTo( indexh, indexv );
-			}
-		}
-		else {
-			// Read the index components of the hash
-			var h = parseInt( bits[0] ) || 0,
-				v = parseInt( bits[1] ) || 0;
-
-			navigateTo( h, v );
-		}
-	}
-	
-	/**
-	 * Updates the page URL (hash) to reflect the current
-	 * state. 
-	 */
-	function writeURL() {
-		if( config.history ) {
-			var url = '/';
-			
-			// Only include the minimum possible number of components in
-			// the URL
-			if( indexh > 0 || indexv > 0 ) url += indexh;
-			if( indexv > 0 ) url += '/' + indexv;
-			
-			window.location.hash = url;
-		}
-	}
-
-	/**
-	 * Dispatches an event of the specified type from the 
-	 * reveal DOM element.
-	 */
-	function dispatchEvent( type, properties ) {
-		var event = document.createEvent( "HTMLEvents", 1, 2 );
-		event.initEvent( type, true, true );
-		extend( event, properties );
-		dom.wrapper.dispatchEvent( event );
-	}
-
-	/**
-	 * Navigate to the next slide fragment.
-	 * 
-	 * @return {Boolean} true if there was a next fragment,
-	 * false otherwise
-	 */
-	function nextFragment() {
-		// Vertical slides:
-		if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) {
-			var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' );
-			if( verticalFragments.length ) {
-				verticalFragments[0].classList.add( 'visible' );
-
-				// Notify subscribers of the change
-				dispatchEvent( 'fragmentshown', { fragment: verticalFragments[0] } );
-				return true;
-			}
-		}
-		// Horizontal slides:
-		else {
-			var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' );
-			if( horizontalFragments.length ) {
-				horizontalFragments[0].classList.add( 'visible' );
-
-				// Notify subscribers of the change
-				dispatchEvent( 'fragmentshown', { fragment: horizontalFragments[0] } );
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Navigate to the previous slide fragment.
-	 * 
-	 * @return {Boolean} true if there was a previous fragment,
-	 * false otherwise
-	 */
-	function previousFragment() {
-		// Vertical slides:
-		if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) {
-			var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment.visible' );
-			if( verticalFragments.length ) {
-				verticalFragments[ verticalFragments.length - 1 ].classList.remove( 'visible' );
-
-				// Notify subscribers of the change
-				dispatchEvent( 'fragmenthidden', { fragment: verticalFragments[ verticalFragments.length - 1 ] } );
-				return true;
-			}
-		}
-		// Horizontal slides:
-		else {
-			var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment.visible' );
-			if( horizontalFragments.length ) {
-				horizontalFragments[ horizontalFragments.length - 1 ].classList.remove( 'visible' );
-
-				// Notify subscribers of the change
-				dispatchEvent( 'fragmenthidden', { fragment: horizontalFragments[ horizontalFragments.length - 1 ] } );
-				return true;
-			}
-		}
-		
-		return false;
-	}
-
-	function cueAutoSlide() {
-		clearTimeout( autoSlideTimeout );
-
-		// Cue the next auto-slide if enabled
-		if( config.autoSlide ) {
-			autoSlideTimeout = setTimeout( navigateNext, config.autoSlide );
-		}
-	}
-	
-	/**
-	 * Triggers a navigation to the specified indices.
-	 * 
-	 * @param {Number} h The horizontal index of the slide to show
-	 * @param {Number} v The vertical index of the slide to show
-	 */
-	function navigateTo( h, v ) {
-		slide( h, v );
-	}
-	
-	function navigateLeft() {
-		// Prioritize hiding fragments
-		if( overviewIsActive() || previousFragment() === false ) {
-			slide( indexh - 1, 0 );
-		}
-	}
-	function navigateRight() {
-		// Prioritize revealing fragments
-		if( overviewIsActive() || nextFragment() === false ) {
-			slide( indexh + 1, 0 );
-		}
-	}
-	function navigateUp() {
-		// Prioritize hiding fragments
-		if( overviewIsActive() || previousFragment() === false ) {
-			slide( indexh, indexv - 1 );
-		}
-	}
-	function navigateDown() {
-		// Prioritize revealing fragments
-		if( overviewIsActive() || nextFragment() === false ) {
-			slide( indexh, indexv + 1 );
-		}
-	}
-
-	/**
-	 * Navigates backwards, prioritized in the following order:
-	 * 1) Previous fragment
-	 * 2) Previous vertical slide
-	 * 3) Previous horizontal slide
-	 */
-	function navigatePrev() {
-		// Prioritize revealing fragments
-		if( previousFragment() === false ) {
-			if( availableRoutes().up ) {
-				navigateUp();
-			}
-			else {
-				// Fetch the previous horizontal slide, if there is one
-				var previousSlide = document.querySelector( '.reveal .slides>section.past:nth-child(' + indexh + ')' );
-
-				if( previousSlide ) {
-					indexv = ( previousSlide.querySelectorAll('section').length + 1 ) || 0;
-					indexh --;
-					slide();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Same as #navigatePrev() but navigates forwards.
-	 */
-	function navigateNext() {
-		// Prioritize revealing fragments
-		if( nextFragment() === false ) {
-			availableRoutes().down ? navigateDown() : navigateRight();
-		}
-
-		// If auto-sliding is enabled we need to cue up 
-		// another timeout
-		cueAutoSlide();
-	}
-
-	/**
-	 * Toggles the slide overview mode on and off.
-	 */
-	function toggleOverview() {
-		if( overviewIsActive() ) {
-			deactivateOverview();
-		}
-		else {
-			activateOverview();
-		}
-	}
-	
-	// Expose some methods publicly
-	return {
-		initialize: initialize,
-		navigateTo: navigateTo,
-		navigateLeft: navigateLeft,
-		navigateRight: navigateRight,
-		navigateUp: navigateUp,
-		navigateDown: navigateDown,
-		navigatePrev: navigatePrev,
-		navigateNext: navigateNext,
-		toggleOverview: toggleOverview,
-
-		// Adds or removes all internal event listeners (such as keyboard)
-		addEventListeners: addEventListeners,
-		removeEventListeners: removeEventListeners,
-
-		// Returns the indices of the current, or specified, slide
-		getIndices: function( slide ) {
-			// By default, return the current indices
-			var h = indexh,
-				v = indexv;
-
-			// If a slide is specified, return the indices of that slide
-			if( slide ) {
-				var isVertical = !!slide.parentNode.nodeName.match( /section/gi );
-				var slideh = isVertical ? slide.parentNode : slide;
-
-				// Select all horizontal slides
-				var horizontalSlides = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
-
-				// Now that we know which the horizontal slide is, get its index
-				h = Math.max( horizontalSlides.indexOf( slideh ), 0 );
-
-				// If this is a vertical slide, grab the vertical index
-				if( isVertical ) {
-					v = Math.max( Array.prototype.slice.call( slide.parentNode.children ).indexOf( slide ), 0 );
-				}
-			}
-
-			return { h: h, v: v };
-		},
-
-		// Returns the previous slide element, may be null
-		getPreviousSlide: function() {
-			return previousSlide
-		},
-
-		// Returns the current slide element
-		getCurrentSlide: function() {
-			return currentSlide
-		},
-
-		// Helper method, retrieves query string as a key/value hash
-		getQueryHash: function() {
-			var query = {};
-
-			location.search.replace( /[A-Z0-9]+?=(\w*)/gi, function(a) {
-				query[ a.split( '=' ).shift() ] = a.split( '=' ).pop();
-			} );
-
-			return query;
-		},
-
-		// Forward event binding to the reveal DOM element
-		addEventListener: function( type, listener, useCapture ) {
-			if( 'addEventListener' in window ) {
-				( dom.wrapper || document.querySelector( '.reveal' ) ).addEventListener( type, listener, useCapture );
-			}
-		},
-		removeEventListener: function( type, listener, useCapture ) {
-			if( 'addEventListener' in window ) {
-				( dom.wrapper || document.querySelector( '.reveal' ) ).removeEventListener( type, listener, useCapture );
-			}
-		}
-	};
-	
-})();
diff --git a/docs/slides/plpv14/_support/reveal/js/reveal.min.js b/docs/slides/plpv14/_support/reveal/js/reveal.min.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/js/reveal.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/*!
- * reveal.js 2.0 r22
- * http://lab.hakim.se/reveal-js
- * MIT licensed
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var Reveal=(function(){var k=".reveal .slides>section",b=".reveal .slides>section.present>section",e=!!("ontouchstart" in window),N={controls:true,progress:true,history:false,keyboard:true,loop:false,autoSlide:0,mouseWheel:true,rollingLinks:true,theme:"default",transition:"default",dependencies:[]},l=0,c=0,w,E,ac=[],d={},P="WebkitPerspective" in document.body.style||"MozPerspective" in document.body.style||"msPerspective" in document.body.style||"OPerspective" in document.body.style||"perspective" in document.body.style,m="WebkitTransform" in document.body.style||"MozTransform" in document.body.style||"msTransform" in document.body.style||"OTransform" in document.body.style||"transform" in document.body.style,x=0,j=0,B=0,W={startX:0,startY:0,startSpan:0,startCount:0,handled:false,threshold:40};function h(ad){if((!m&&!P)){document.body.setAttribute("class","no-transforms");return}r(N,ad);d.theme=document.querySelector("#theme");d.wrapper=document.querySelector(".reveal");d.progress=document.querySelector(".reveal .progress");d.progressbar=document.querySelector(".reveal .progress span");if(N.controls){d.controls=document.querySelector(".reveal .controls");d.controlsLeft=document.querySelector(".reveal .controls .left");d.controlsRight=document.querySelector(".reveal .controls .right");d.controlsUp=document.querySelector(".reveal .controls .up");d.controlsDown=document.querySelector(".reveal .controls .down")}R();if(navigator.userAgent.match(/(iphone|ipod|android)/i)){document.documentElement.style.overflow="scroll";document.body.style.height="120%";window.addEventListener("load",X,false);window.addEventListener("orientationchange",X,false)}}function R(){var ae=[],ai=[];for(var af=0,ad=N.dependencies.length;af<ad;af++){var ag=N.dependencies[af];if(!ag.condition||ag.condition()){if(ag.async){ai.push(ag.src)}else{ae.push(ag.src)}if(typeof ag.callback==="function"){head.ready(ag.src.match(/([\w\d_-]*)\.?[^\\\/]*$/i)[0],ag.callback)}}}function ah(){head.js.apply(null,ai);F()}if(ae.length){head.ready(ah);head.js.apply(null,ae)}else{ah()}}function F(){C();I();H();K()}function I(){if(P===false){N.transition="linear"}if(N.controls&&d.controls){d.controls.style.display="block"}if(N.progress&&d.progress){d.progress.style.display="block"}if(N.theme&&d.theme){var af=d.theme.getAttribute("href");var ad=/[^/]*?(?=\.css)/;var ae=af.match(ad)[0];if(N.theme!==ae){af=af.replace(ad,N.theme);d.theme.setAttribute("href",af)}}if(N.transition!=="default"){d.wrapper.classList.add(N.transition)}if(N.mouseWheel){document.addEventListener("DOMMouseScroll",n,false);document.addEventListener("mousewheel",n,false)}if(N.rollingLinks){J()}}function C(){document.addEventListener("touchstart",y,false);document.addEventListener("touchmove",Z,false);document.addEventListener("touchend",S,false);window.addEventListener("hashchange",u,false);if(N.keyboard){document.addEventListener("keydown",aa,false)}if(N.controls&&d.controls){d.controlsLeft.addEventListener("click",o(z),false);d.controlsRight.addEventListener("click",o(i),false);d.controlsUp.addEventListener("click",o(s),false);d.controlsDown.addEventListener("click",o(D),false)}}function Q(){document.removeEventListener("keydown",aa,false);document.removeEventListener("touchstart",y,false);document.removeEventListener("touchmove",Z,false);document.removeEventListener("touchend",S,false);window.removeEventListener("hashchange",u,false);if(N.controls&&d.controls){d.controlsLeft.removeEventListener("click",o(z),false);d.controlsRight.removeEventListener("click",o(i),false);d.controlsUp.removeEventListener("click",o(s),false);d.controlsDown.removeEventListener("click",o(D),false)}}function r(ae,ad){for(var af in ad){ae[af]=ad[af]}}function O(af,ad){var ag=af.x-ad.x,ae=af.y-ad.y;return Math.sqrt(ag*ag+ae*ae)}function o(ad){return function(ae){ae.preventDefault();ad.call()}}function X(){setTimeout(function(){window.scrollTo(0,1)},0)}function aa(ae){if(ae.target.contentEditable!="inherit"||ae.shiftKey||ae.altKey||ae.ctrlKey||ae.metaKey){return}var ad=false;switch(ae.keyCode){case 80:case 33:U();ad=true;break;case 78:case 34:v();ad=true;break;case 72:case 37:z();ad=true;break;case 76:case 39:i();ad=true;break;case 75:case 38:s();ad=true;break;case 74:case 40:D();ad=true;break;case 36:L(0);ad=true;break;case 35:L(Number.MAX_VALUE);ad=true;break;case 32:V()?Y():v();ad=true;break;case 13:if(V()){Y();ad=true}break}if(ad){ae.preventDefault()}else{if(ae.keyCode===27&&P){T();ae.preventDefault()}}K()}function y(ad){W.startX=ad.touches[0].clientX;W.startY=ad.touches[0].clientY;W.startCount=ad.touches.length;if(ad.touches.length===2){W.startSpan=O({x:ad.touches[1].clientX,y:ad.touches[1].clientY},{x:W.startX,y:W.startY})}}function Z(ai){if(!W.handled){var ag=ai.touches[0].clientX;var af=ai.touches[0].clientY;if(ai.touches.length===2&&W.startCount===2){var ah=O({x:ai.touches[1].clientX,y:ai.touches[1].clientY},{x:W.startX,y:W.startY});if(Math.abs(W.startSpan-ah)>W.threshold){W.handled=true;if(ah<W.startSpan){G()}else{Y()}}}else{if(ai.touches.length===1){var ae=ag-W.startX,ad=af-W.startY;if(ae>W.threshold&&Math.abs(ae)>Math.abs(ad)){W.handled=true;z()}else{if(ae<-W.threshold&&Math.abs(ae)>Math.abs(ad)){W.handled=true;i()}else{if(ad>W.threshold){W.handled=true;s()}else{if(ad<-W.threshold){W.handled=true;D()}}}}}}ai.preventDefault()}}function S(ad){W.handled=false}function n(ad){clearTimeout(x);x=setTimeout(function(){var ae=ad.detail||-ad.wheelDelta;if(ae>0){v()}else{U()}},100)}function u(ad){H()}function J(){if(P&&!("msPerspective" in document.body.style)){var ae=document.querySelectorAll(".reveal .slides section a:not(.image)");for(var af=0,ad=ae.length;af<ad;af++){var ag=ae[af];if(ag.textContent&&!ag.querySelector("img")&&(!ag.className||!ag.classList.contains(ag,"roll"))){ag.classList.add("roll");ag.innerHTML='<span data-title="'+ag.text+'">'+ag.innerHTML+"</span>"}}}}function G(){d.wrapper.classList.add("overview");var ad=Array.prototype.slice.call(document.querySelectorAll(k));for(var ai=0,ag=ad.length;ai<ag;ai++){var af=ad[ai],am="translateZ(-2500px) translate("+((ai-l)*105)+"%, 0%)";af.setAttribute("data-index-h",ai);af.style.display="block";af.style.WebkitTransform=am;af.style.MozTransform=am;af.style.msTransform=am;af.style.OTransform=am;af.style.transform=am;if(!af.classList.contains("stack")){af.addEventListener("click",A,true)}var al=Array.prototype.slice.call(af.querySelectorAll("section"));for(var ah=0,ae=al.length;ah<ae;ah++){var ak=al[ah],aj="translate(0%, "+((ah-(ai===l?c:0))*105)+"%)";ak.setAttribute("data-index-h",ai);ak.setAttribute("data-index-v",ah);ak.style.display="block";ak.style.WebkitTransform=aj;ak.style.MozTransform=aj;ak.style.msTransform=aj;ak.style.OTransform=aj;ak.style.transform=aj;ak.addEventListener("click",A,true)}}}function Y(){d.wrapper.classList.remove("overview");var ag=Array.prototype.slice.call(document.querySelectorAll(".reveal .slides section"));for(var af=0,ad=ag.length;af<ad;af++){var ae=ag[af];ae.style.WebkitTransform="";ae.style.MozTransform="";ae.style.msTransform="";ae.style.OTransform="";ae.style.transform="";ae.removeEventListener("click",A)}a()}function V(){return d.wrapper.classList.contains("overview")}function A(ad){if(V()){ad.preventDefault();Y();l=this.getAttribute("data-index-h");c=this.getAttribute("data-index-v");a()}}function ab(ae,ag){var ai=Array.prototype.slice.call(document.querySelectorAll(ae)),aj=ai.length;if(aj){if(N.loop){ag%=aj;if(ag<0){ag=aj+ag}}ag=Math.max(Math.min(ag,aj-1),0);for(var ah=0;ah<aj;ah++){var ad=ai[ah];if(V()===false){var ak=Math.abs((ag-ah)%(aj-3))||0;ad.style.display=ak>3?"none":"block"}ai[ah].classList.remove("past");ai[ah].classList.remove("present");ai[ah].classList.remove("future");if(ah<ag){ai[ah].classList.add("past")}else{if(ah>ag){ai[ah].classList.add("future")}}if(ad.querySelector("section")){ai[ah].classList.add("stack")}}ai[ag].classList.add("present");var af=ai[ag].getAttribute("data-state");if(af){ac=ac.concat(af.split(" "))}}else{ag=0}return ag}function a(aj,an){w=E;var ag=ac.concat();ac.length=0;var am=l,ae=c;l=ab(k,aj===undefined?l:aj);c=ab(b,an===undefined?c:an);stateLoop:for(var ah=0,ak=ac.length;ah<ak;ah++){for(var af=0;af<ag.length;af++){if(ag[af]===ac[ah]){ag.splice(af,1);continue stateLoop}}document.documentElement.classList.add(ac[ah]);p(ac[ah])}while(ag.length){document.documentElement.classList.remove(ag.pop())}if(N.progress&&d.progress){d.progressbar.style.width=(l/(document.querySelectorAll(k).length-1))*window.innerWidth+"px"}if(V()){G()}q();clearTimeout(B);B=setTimeout(g,1500);var ad=document.querySelectorAll(k);var al=ad[l],ai=al.querySelectorAll("section");E=ai[c]||al;if(l!==am||c!==ae){p("slidechanged",{indexh:l,indexv:c,previousSlide:w,currentSlide:E})}else{w=null}if(w){w.classList.remove("present")}}function q(){if(!N.controls||!d.controls){return}var ad=f();[d.controlsLeft,d.controlsRight,d.controlsUp,d.controlsDown].forEach(function(ae){ae.classList.remove("enabled")});if(ad.left){d.controlsLeft.classList.add("enabled")}if(ad.right){d.controlsRight.classList.add("enabled")}if(ad.up){d.controlsUp.classList.add("enabled")}if(ad.down){d.controlsDown.classList.add("enabled")}}function f(){var ad=document.querySelectorAll(k);var ae=document.querySelectorAll(b);return{left:l>0,right:l<ad.length-1,up:c>0,down:c<ae.length-1}}function H(){var ai=window.location.hash;var ah=ai.slice(2).split("/"),af=ai.replace(/#|\//gi,"");if(isNaN(parseInt(ah[0]))&&af.length){var ad=document.querySelector("#"+af);if(ad){var aj=Reveal.getIndices(ad);L(aj.h,aj.v)}else{L(l,c)}}else{var ag=parseInt(ah[0])||0,ae=parseInt(ah[1])||0;L(ag,ae)}}function g(){if(N.history){var ad="/";if(l>0||c>0){ad+=l}if(c>0){ad+="/"+c}window.location.hash=ad}}function p(ae,ad){var af=document.createEvent("HTMLEvents",1,2);af.initEvent(ae,true,true);r(af,ad);d.wrapper.dispatchEvent(af)}function t(){if(document.querySelector(b+".present")){var ae=document.querySelectorAll(b+".present .fragment:not(.visible)");if(ae.length){ae[0].classList.add("visible");p("fragmentshown",{fragment:ae[0]});return true}}else{var ad=document.querySelectorAll(k+".present .fragment:not(.visible)");if(ad.length){ad[0].classList.add("visible");p("fragmentshown",{fragment:ad[0]});return true}}return false}function M(){if(document.querySelector(b+".present")){var ae=document.querySelectorAll(b+".present .fragment.visible");if(ae.length){ae[ae.length-1].classList.remove("visible");p("fragmenthidden",{fragment:ae[ae.length-1]});return true}}else{var ad=document.querySelectorAll(k+".present .fragment.visible");if(ad.length){ad[ad.length-1].classList.remove("visible");p("fragmenthidden",{fragment:ad[ad.length-1]});return true}}return false}function K(){clearTimeout(j);if(N.autoSlide){j=setTimeout(v,N.autoSlide)}}function L(ae,ad){a(ae,ad)}function z(){if(V()||M()===false){a(l-1,0)}}function i(){if(V()||t()===false){a(l+1,0)}}function s(){if(V()||M()===false){a(l,c-1)}}function D(){if(V()||t()===false){a(l,c+1)}}function U(){if(M()===false){if(f().up){s()}else{var ad=document.querySelector(".reveal .slides>section.past:nth-child("+l+")");if(ad){c=(ad.querySelectorAll("section").length+1)||0;l--;a()}}}}function v(){if(t()===false){f().down?D():i()}K()}function T(){if(V()){Y()}else{G()}}return{initialize:h,navigateTo:L,navigateLeft:z,navigateRight:i,navigateUp:s,navigateDown:D,navigatePrev:U,navigateNext:v,toggleOverview:T,addEventListeners:C,removeEventListeners:Q,getIndices:function(ad){var ah=l,af=c;if(ad){var ai=!!ad.parentNode.nodeName.match(/section/gi);var ag=ai?ad.parentNode:ad;var ae=Array.prototype.slice.call(document.querySelectorAll(k));ah=Math.max(ae.indexOf(ag),0);if(ai){af=Math.max(Array.prototype.slice.call(ad.parentNode.children).indexOf(ad),0)}}return{h:ah,v:af}},getPreviousSlide:function(){return w},getCurrentSlide:function(){return E},getQueryHash:function(){var ad={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(ae){ad[ae.split("=").shift()]=ae.split("=").pop()});return ad},addEventListener:function(ae,af,ad){if("addEventListener" in window){(d.wrapper||document.querySelector(".reveal")).addEventListener(ae,af,ad)}},removeEventListener:function(ae,af,ad){if("addEventListener" in window){(d.wrapper||document.querySelector(".reveal")).removeEventListener(ae,af,ad)}}}})();
diff --git a/docs/slides/plpv14/_support/reveal/lib/css/zenburn.css b/docs/slides/plpv14/_support/reveal/lib/css/zenburn.css
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/lib/css/zenburn.css
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-
-Zenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>
-based on dark.css by Ivan Sagalaev
-
-*/
-
-pre code {
-  display: block; padding: 0.5em;
-  background: #3F3F3F;
-  color: #DCDCDC;
-}
-
-pre .keyword,
-pre .tag,
-pre .django .tag,
-pre .django .keyword,
-pre .css .class,
-pre .css .id,
-pre .lisp .title {
-  color: #E3CEAB;
-}
-
-pre .django .template_tag,
-pre .django .variable,
-pre .django .filter .argument {
-  color: #DCDCDC;
-}
-
-pre .number,
-pre .date {
-  color: #8CD0D3;
-}
-
-pre .dos .envvar,
-pre .dos .stream,
-pre .variable,
-pre .apache .sqbracket {
-  color: #EFDCBC;
-}
-
-pre .dos .flow,
-pre .diff .change,
-pre .python .exception,
-pre .python .built_in,
-pre .literal,
-pre .tex .special {
-  color: #EFEFAF;
-}
-
-pre .diff .chunk,
-pre .ruby .subst {
-  color: #8F8F8F;
-}
-
-pre .dos .keyword,
-pre .python .decorator,
-pre .class .title,
-pre .haskell .label,
-pre .function .title,
-pre .ini .title,
-pre .diff .header,
-pre .ruby .class .parent,
-pre .apache .tag,
-pre .nginx .built_in,
-pre .tex .command,
-pre .input_number {
-    color: #efef8f;
-}
-
-pre .dos .winutils,
-pre .ruby .symbol,
-pre .ruby .symbol .string,
-pre .ruby .symbol .keyword,
-pre .ruby .symbol .keymethods,
-pre .ruby .string,
-pre .ruby .instancevar {
-  color: #DCA3A3;
-}
-
-pre .diff .deletion,
-pre .string,
-pre .tag .value,
-pre .preprocessor,
-pre .built_in,
-pre .sql .aggregate,
-pre .javadoc,
-pre .smalltalk .class,
-pre .smalltalk .localvars,
-pre .smalltalk .array,
-pre .css .rules .value,
-pre .attr_selector,
-pre .pseudo,
-pre .apache .cbracket,
-pre .tex .formula {
-  color: #CC9393;
-}
-
-pre .shebang,
-pre .diff .addition,
-pre .comment,
-pre .java .annotation,
-pre .template_comment,
-pre .pi,
-pre .doctype {
-  color: #7F9F7F;
-}
-
-pre .xml .css,
-pre .xml .javascript,
-pre .xml .vbscript,
-pre .tex .formula {
-  opacity: 0.5;
-}
-
diff --git a/docs/slides/plpv14/_support/reveal/lib/font/OpenSans-Regular.ttf b/docs/slides/plpv14/_support/reveal/lib/font/OpenSans-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/plpv14/_support/reveal/lib/font/OpenSans-Regular.ttf and /dev/null differ
diff --git a/docs/slides/plpv14/_support/reveal/lib/font/PT_Sans-Narrow-Web-Regular.ttf b/docs/slides/plpv14/_support/reveal/lib/font/PT_Sans-Narrow-Web-Regular.ttf
deleted file mode 100644
Binary files a/docs/slides/plpv14/_support/reveal/lib/font/PT_Sans-Narrow-Web-Regular.ttf and /dev/null differ
diff --git a/docs/slides/plpv14/_support/reveal/lib/font/league_gothic-webfont.ttf b/docs/slides/plpv14/_support/reveal/lib/font/league_gothic-webfont.ttf
deleted file mode 100644
Binary files a/docs/slides/plpv14/_support/reveal/lib/font/league_gothic-webfont.ttf and /dev/null differ
diff --git a/docs/slides/plpv14/_support/reveal/lib/js/classList.js b/docs/slides/plpv14/_support/reveal/lib/js/classList.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/lib/js/classList.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
-if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p<o;p++){if(p in this&&this[p]===q){return p}}return -1},n=function(o,p){this.name=o;this.code=DOMException[o];this.message=p},g=function(p,o){if(o===""){throw new n("SYNTAX_ERR","An invalid or illegal string was specified")}if(/\s/.test(o)){throw new n("INVALID_CHARACTER_ERR","String contains an invalid character")}return c.call(p,o)},d=function(s){var r=k.call(s.className),q=r?r.split(/\s+/):[],p=0,o=q.length;for(;p<o;p++){this.push(q[p])}this._updateClassName=function(){s.className=this.toString()}},e=d[f]=[],i=function(){return new d(this)};n[f]=Error[f];e.item=function(o){return this[o]||null};e.contains=function(o){o+="";return g(this,o)!==-1};e.add=function(o){o+="";if(g(this,o)===-1){this.push(o);this._updateClassName()}};e.remove=function(p){p+="";var o=g(this,p);if(o!==-1){this.splice(o,1);this._updateClassName()}};e.toggle=function(o){o+="";if(g(this,o)===-1){this.add(o)}else{this.remove(o)}};e.toString=function(){return this.join(" ")};if(b.defineProperty){var l={get:i,enumerable:true,configurable:true};try{b.defineProperty(m,a,l)}catch(h){if(h.number===-2146823252){l.enumerable=false;b.defineProperty(m,a,l)}}}else{if(b[f].__defineGetter__){m.__defineGetter__(a,i)}}}(self))};
diff --git a/docs/slides/plpv14/_support/reveal/lib/js/data-markdown.js b/docs/slides/plpv14/_support/reveal/lib/js/data-markdown.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/lib/js/data-markdown.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// From https://gist.github.com/1343518
-// Modified by Hakim to handle markdown indented with tabs
-(function(){
-
-    var slides = document.querySelectorAll('[data-markdown]');
-
-    for( var i = 0, len = slides.length; i < len; i++ ) {
-        var elem = slides[i];
-
-        // strip leading whitespace so it isn't evaluated as code
-        var text = elem.innerHTML;
-
-        var leadingWs = text.match(/^\n?(\s*)/)[1].length,
-            leadingTabs = text.match(/^\n?(\t*)/)[1].length;
-
-        if( leadingTabs > 0 ) {
-            text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
-        }
-        else if( leadingWs > 1 ) {
-            text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' );
-        }
-
-        // here, have sum HTML
-        elem.innerHTML = (new Showdown.converter()).makeHtml(text);
-    }
-
-})();
diff --git a/docs/slides/plpv14/_support/reveal/lib/js/head.min.js b/docs/slides/plpv14/_support/reveal/lib/js/head.min.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/lib/js/head.min.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
-    Head JS     The only script in your <HEAD>
-    Copyright   Tero Piirainen (tipiirai)
-    License     MIT / http://bit.ly/mit-license
-    Version     0.96
-
-    http://headjs.com
-*/(function(a){function z(){d||(d=!0,s(e,function(a){p(a)}))}function y(c,d){var e=a.createElement("script");e.type="text/"+(c.type||"javascript"),e.src=c.src||c,e.async=!1,e.onreadystatechange=e.onload=function(){var a=e.readyState;!d.done&&(!a||/loaded|complete/.test(a))&&(d.done=!0,d())},(a.body||b).appendChild(e)}function x(a,b){if(a.state==o)return b&&b();if(a.state==n)return k.ready(a.name,b);if(a.state==m)return a.onpreload.push(function(){x(a,b)});a.state=n,y(a.url,function(){a.state=o,b&&b(),s(g[a.name],function(a){p(a)}),u()&&d&&s(g.ALL,function(a){p(a)})})}function w(a,b){a.state===undefined&&(a.state=m,a.onpreload=[],y({src:a.url,type:"cache"},function(){v(a)}))}function v(a){a.state=l,s(a.onpreload,function(a){a.call()})}function u(a){a=a||h;var b;for(var c in a){if(a.hasOwnProperty(c)&&a[c].state!=o)return!1;b=!0}return b}function t(a){return Object.prototype.toString.call(a)=="[object Function]"}function s(a,b){if(!!a){typeof a=="object"&&(a=[].slice.call(a));for(var c=0;c<a.length;c++)b.call(a,a[c],c)}}function r(a){var b;if(typeof a=="object")for(var c in a)a[c]&&(b={name:c,url:a[c]});else b={name:q(a),url:a};var d=h[b.name];if(d&&d.url===b.url)return d;h[b.name]=b;return b}function q(a){var b=a.split("/"),c=b[b.length-1],d=c.indexOf("?");return d!=-1?c.substring(0,d):c}function p(a){a._done||(a(),a._done=1)}var b=a.documentElement,c,d,e=[],f=[],g={},h={},i=a.createElement("script").async===!0||"MozAppearance"in a.documentElement.style||window.opera,j=window.head_conf&&head_conf.head||"head",k=window[j]=window[j]||function(){k.ready.apply(null,arguments)},l=1,m=2,n=3,o=4;i?k.js=function(){var a=arguments,b=a[a.length-1],c={};t(b)||(b=null),s(a,function(d,e){d!=b&&(d=r(d),c[d.name]=d,x(d,b&&e==a.length-2?function(){u(c)&&p(b)}:null))});return k}:k.js=function(){var a=arguments,b=[].slice.call(a,1),d=b[0];if(!c){f.push(function(){k.js.apply(null,a)});return k}d?(s(b,function(a){t(a)||w(r(a))}),x(r(a[0]),t(d)?d:function(){k.js.apply(null,b)})):x(r(a[0]));return k},k.ready=function(b,c){if(b==a){d?p(c):e.push(c);return k}t(b)&&(c=b,b="ALL");if(typeof b!="string"||!t(c))return k;var f=h[b];if(f&&f.state==o||b=="ALL"&&u()&&d){p(c);return k}var i=g[b];i?i.push(c):i=g[b]=[c];return k},k.ready(a,function(){u()&&s(g.ALL,function(a){p(a)}),k.feature&&k.feature("domloaded",!0)});if(window.addEventListener)a.addEventListener("DOMContentLoaded",z,!1),window.addEventListener("load",z,!1);else if(window.attachEvent){a.attachEvent("onreadystatechange",function(){a.readyState==="complete"&&z()});var A=1;try{A=window.frameElement}catch(B){}!A&&b.doScroll&&function(){try{b.doScroll("left"),z()}catch(a){setTimeout(arguments.callee,1);return}}(),window.attachEvent("onload",z)}!a.readyState&&a.addEventListener&&(a.readyState="loading",a.addEventListener("DOMContentLoaded",handler=function(){a.removeEventListener("DOMContentLoaded",handler,!1),a.readyState="complete"},!1)),setTimeout(function(){c=!0,s(f,function(a){a()})},300)})(document)
diff --git a/docs/slides/plpv14/_support/reveal/lib/js/highlight.js b/docs/slides/plpv14/_support/reveal/lib/js/highlight.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/lib/js/highlight.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
-Syntax highlighting with language autodetection.
-http://softwaremaniacs.org/soft/highlight/
-*/
-var hljs=new function(){function m(p){return p.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function c(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function j(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function g(t,s){var r="";for(var q=0;q<t.childNodes.length;q++){if(t.childNodes[q].nodeType==3){var p=t.childNodes[q].nodeValue;if(s){p=p.replace(/\n/g,"")}r+=p}else{if(t.childNodes[q].nodeName=="BR"){r+="\n"}else{r+=g(t.childNodes[q])}}}if(/MSIE [678]/.test(navigator.userAgent)){r=r.replace(/\r/g,"\n")}return r}function a(s){var q=s.className.split(/\s+/);q=q.concat(s.parentNode.className.split(/\s+/));for(var p=0;p<q.length;p++){var r=q[p].replace(/^language-/,"");if(d[r]||r=="no-highlight"){return r}}}function b(p){var q=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{q.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);q.push({event:"stop",offset:t,node:s.childNodes[r]})}}}return t})(p,0);return q}function l(y,z,x){var r=0;var w="";var t=[];function u(){if(y.length&&z.length){if(y[0].offset!=z[0].offset){return(y[0].offset<z[0].offset)?y:z}else{return z[0].event=="start"?y:z}}else{return y.length?y:z}}function s(C){var D="<"+C.nodeName.toLowerCase();for(var A=0;A<C.attributes.length;A++){var B=C.attributes[A];D+=" "+B.nodeName.toLowerCase();if(B.nodeValue!=undefined&&B.nodeValue!=false&&B.nodeValue!=null){D+='="'+m(B.nodeValue)+'"'}}return D+">"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event=="start"){w+=s(v.node);t.push(v.node)}else{if(v.event=="stop"){var q=t.length;do{q--;var p=t[q];w+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);t.splice(q,1);while(q<t.length){w+=s(t[q]);q++}}}}w+=x.substr(r);return w}function i(){function p(u,t,v){if(u.compiled){return}if(!v){u.bR=c(t,u.b?u.b:"\\B|\\b");if(!u.e&&!u.eW){u.e="\\B|\\b"}if(u.e){u.eR=c(t,u.e)}}if(u.i){u.iR=c(t,u.i)}if(u.r==undefined){u.r=1}if(u.k){u.lR=c(t,u.l||hljs.IR,true)}for(var s in u.k){if(!u.k.hasOwnProperty(s)){continue}if(u.k[s] instanceof Object){u.kG=u.k}else{u.kG={keyword:u.k}}break}if(!u.c){u.c=[]}u.compiled=true;for(var r=0;r<u.c.length;r++){p(u.c[r],t,false)}if(u.starts){p(u.starts,t,false)}}for(var q in d){if(!d.hasOwnProperty(q)){continue}p(d[q].dM,d[q],true)}}function e(J,D){if(!i.called){i();i.called=true}function z(r,M){for(var L=0;L<M.c.length;L++){if(M.c[L].bR.test(r)){return M.c[L]}}}function w(L,r){if(C[L].e&&C[L].eR.test(r)){return 1}if(C[L].eW){var M=w(L-1,r);return M?M+1:0}return 0}function x(r,L){return L.iR&&L.iR.test(r)}function A(O,N){var M=[];for(var L=0;L<O.c.length;L++){M.push(O.c[L].b)}var r=C.length-1;do{if(C[r].e){M.push(C[r].e)}r--}while(C[r+1].eW);if(O.i){M.push(O.i)}return c(N,"("+M.join("|")+")",true)}function s(M,L){var N=C[C.length-1];if(!N.t){N.t=A(N,H)}N.t.lastIndex=L;var r=N.t.exec(M);if(r){return[M.substr(L,r.index-L),r[0],false]}else{return[M.substr(L),"",true]}}function p(O,r){var L=H.cI?r[0].toLowerCase():r[0];for(var N in O.kG){if(!O.kG.hasOwnProperty(N)){continue}var M=O.kG[N].hasOwnProperty(L);if(M){return[N,M]}}return false}function F(M,O){if(!O.k){return m(M)}var N="";var P=0;O.lR.lastIndex=0;var L=O.lR.exec(M);while(L){N+=m(M.substr(P,L.index-P));var r=p(O,L);if(r){t+=r[1];N+='<span class="'+r[0]+'">'+m(L[0])+"</span>"}else{N+=m(L[0])}P=O.lR.lastIndex;L=O.lR.exec(M)}N+=m(M.substr(P,M.length-P));return N}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){q+=L;M.buffer=""}else{if(M.eB){q+=m(r)+L;M.buffer=""}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?"</span>":"";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?"</span>":"";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer="";if(P.starts){I(P.starts,"")}return R.rE}if(x(L,R)){throw"Illegal"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q="";try{var v=0;H.dM.buffer="";do{var y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw"Illegal"}return{r:B,keyword_count:t,value:q}}catch(G){if(G=="Illegal"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"<br>")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);if(s=="no-highlight"){return}if(s){var w=e(s,y)}else{var w=f(y);s=w.language}var p=b(u);if(p.length){var r=document.createElement("pre");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match("(\\s|^)(language-)?"+s+"(\\s|$)")){t=t?(t+" "+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName=="CODE"&&u.parentNode.tagName=="PRE"){var r=u.parentNode;var v=document.createElement("div");v.innerHTML="<pre><code>"+w.value+"</code></pre>";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p<r.length;p++){var q=j(r[p]);if(q){o(q,hljs.tabReplace)}}}function n(){if(window.addEventListener){window.addEventListener("DOMContentLoaded",k,false);window.addEventListener("load",k,false)}else{if(window.attachEvent){window.attachEvent("onload",k)}else{window.onload=k}}}var d={};this.LANGUAGES=d;this.highlight=e;this.highlightAuto=f;this.fixMarkup=h;this.highlightBlock=o;this.initHighlighting=k;this.initHighlightingOnLoad=n;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.cs={dM:{k:{"abstract":1,as:1,base:1,bool:1,"break":1,"byte":1,"case":1,"catch":1,"char":1,checked:1,"class":1,"const":1,"continue":1,decimal:1,"default":1,delegate:1,"do":1,"do":1,"double":1,"else":1,"enum":1,event:1,explicit:1,extern:1,"false":1,"finally":1,fixed:1,"float":1,"for":1,foreach:1,"goto":1,"if":1,implicit:1,"in":1,"int":1,"interface":1,internal:1,is:1,lock:1,"long":1,namespace:1,"new":1,"null":1,object:1,operator:1,out:1,override:1,params:1,"private":1,"protected":1,"public":1,readonly:1,ref:1,"return":1,sbyte:1,sealed:1,"short":1,sizeof:1,stackalloc:1,"static":1,string:1,struct:1,"switch":1,"this":1,"throw":1,"true":1,"try":1,"typeof":1,uint:1,ulong:1,unchecked:1,unsafe:1,ushort:1,using:1,virtual:1,"volatile":1,"void":1,"while":1,ascending:1,descending:1,from:1,get:1,group:1,into:1,join:1,let:1,orderby:1,partial:1,select:1,set:1,value:1,"var":1,where:1,yield:1},c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},hljs.CLCM,hljs.CBLCLM,{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},hljs.ASM,hljs.QSM,hljs.CNM]}};hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}();hljs.LANGUAGES.javascript={dM:{k:{keyword:{"in":1,"if":1,"for":1,"while":1,"finally":1,"var":1,"new":1,"function":1,"do":1,"return":1,"void":1,"else":1,"break":1,"catch":1,"instanceof":1,"with":1,"throw":1,"case":1,"default":1,"try":1,"this":1,"switch":1,"continue":1,"typeof":1,"delete":1},literal:{"true":1,"false":1,"null":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:"("+hljs.RSR+"|case|return|throw)\\s*",k:{"return":1,"throw":1,"case":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",c:[{b:"\\\\/"}]}],r:0},{cN:"function",b:"\\bfunction\\b",e:"{",k:{"function":1},c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.css=function(){var a={cN:"function",b:hljs.IR+"\\(",e:"\\)",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:"[=/|']",c:[hljs.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:{"font-face":1,page:1}},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:{"import":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:"tag",b:hljs.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[hljs.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}}();hljs.LANGUAGES.xml=function(){var b="[A-Za-z0-9\\._:-]+";var a={eW:true,c:[{cN:"attribute",b:b,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,dM:{c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style",e:">",k:{title:{style:1}},c:[a],starts:{cN:"css",e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script",e:">",k:{title:{script:1}},c:[a],starts:{cN:"javascript",e:"<\/script>",rE:true,sL:"javascript"}},{cN:"vbscript",b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ />]+"},a]}]}}}();hljs.LANGUAGES.java={dM:{k:{"false":1,"synchronized":1,"int":1,"abstract":1,"float":1,"private":1,"char":1,"interface":1,"boolean":1,"static":1,"null":1,"if":1,"const":1,"for":1,"true":1,"while":1,"long":1,"throw":1,strictfp:1,"finally":1,"protected":1,"extends":1,"import":1,"native":1,"final":1,"implements":1,"return":1,"void":1,"enum":1,"else":1,"break":1,"transient":1,"new":1,"catch":1,"instanceof":1,"byte":1,"super":1,"class":1,"volatile":1,"case":1,assert:1,"short":1,"package":1,"default":1,"double":1,"public":1,"try":1,"this":1,"switch":1,"continue":1,"throws":1},c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:"class",b:"(class |interface )",e:"{",k:{"class":1,"interface":1},i:":",c:[{b:"(implements|extends)",k:{"extends":1,"implements":1},r:10},{cN:"title",b:hljs.UIR}]},hljs.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}};hljs.LANGUAGES.php={cI:true,dM:{k:{and:1,include_once:1,list:1,"abstract":1,global:1,"private":1,echo:1,"interface":1,as:1,"static":1,endswitch:1,array:1,"null":1,"if":1,endwhile:1,or:1,"const":1,"for":1,endforeach:1,self:1,"var":1,"while":1,isset:1,"public":1,"protected":1,exit:1,foreach:1,"throw":1,elseif:1,"extends":1,include:1,__FILE__:1,empty:1,require_once:1,"function":1,"do":1,xor:1,"return":1,"implements":1,parent:1,clone:1,use:1,__CLASS__:1,__LINE__:1,"else":1,"break":1,print:1,"eval":1,"new":1,"catch":1,__METHOD__:1,"class":1,"case":1,exception:1,php_user_filter:1,"default":1,die:1,require:1,__FUNCTION__:1,enddeclare:1,"final":1,"try":1,"this":1,"switch":1,"continue":1,endfor:1,endif:1,declare:1,unset:1,"true":1,"false":1,namespace:1},c:[hljs.CLCM,hljs.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+",r:10}]},hljs.CNM,hljs.inherit(hljs.ASM,{i:null}),hljs.inherit(hljs.QSM,{i:null}),{cN:"variable",b:"\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"}]}};hljs.LANGUAGES.python=function(){var c={cN:"string",b:"(u|b)?r?'''",e:"'''",r:10};var b={cN:"string",b:'(u|b)?r?"""',e:'"""',r:10};var a={cN:"string",b:"(u|r|ur|b|br)'",e:"'",c:[hljs.BE],r:10};var f={cN:"string",b:'(u|r|ur|b|br)"',e:'"',c:[hljs.BE],r:10};var d={cN:"title",b:hljs.UIR};var e={cN:"params",b:"\\(",e:"\\)",c:[c,b,a,f,hljs.ASM,hljs.QSM]};return{dM:{k:{keyword:{and:1,elif:1,is:1,global:1,as:1,"in":1,"if":1,from:1,raise:1,"for":1,except:1,"finally":1,print:1,"import":1,pass:1,"return":1,exec:1,"else":1,"break":1,not:1,"with":1,"class":1,assert:1,yield:1,"try":1,"while":1,"continue":1,del:1,or:1,def:1,lambda:1,nonlocal:10},built_in:{None:1,True:1,False:1,Ellipsis:1,NotImplemented:1}},i:"(</|->|\\?)",c:[hljs.HCM,c,b,a,f,hljs.ASM,hljs.QSM,{cN:"function",b:"\\bdef ",e:":",i:"$",k:{def:1},c:[d,e],r:10},{cN:"class",b:"\\bclass ",e:":",i:"[${]",k:{"class":1},c:[d,e],r:10},hljs.CNM,{cN:"decorator",b:"@",e:"$"}]}}}();hljs.LANGUAGES.perl=function(){var c={getpwent:1,getservent:1,quotemeta:1,msgrcv:1,scalar:1,kill:1,dbmclose:1,undef:1,lc:1,ma:1,syswrite:1,tr:1,send:1,umask:1,sysopen:1,shmwrite:1,vec:1,qx:1,utime:1,local:1,oct:1,semctl:1,localtime:1,readpipe:1,"do":1,"return":1,format:1,read:1,sprintf:1,dbmopen:1,pop:1,getpgrp:1,not:1,getpwnam:1,rewinddir:1,qq:1,fileno:1,qw:1,endprotoent:1,wait:1,sethostent:1,bless:1,s:1,opendir:1,"continue":1,each:1,sleep:1,endgrent:1,shutdown:1,dump:1,chomp:1,connect:1,getsockname:1,die:1,socketpair:1,close:1,flock:1,exists:1,index:1,shmget:1,sub:1,"for":1,endpwent:1,redo:1,lstat:1,msgctl:1,setpgrp:1,abs:1,exit:1,select:1,print:1,ref:1,gethostbyaddr:1,unshift:1,fcntl:1,syscall:1,"goto":1,getnetbyaddr:1,join:1,gmtime:1,symlink:1,semget:1,splice:1,x:1,getpeername:1,recv:1,log:1,setsockopt:1,cos:1,last:1,reverse:1,gethostbyname:1,getgrnam:1,study:1,formline:1,endhostent:1,times:1,chop:1,length:1,gethostent:1,getnetent:1,pack:1,getprotoent:1,getservbyname:1,rand:1,mkdir:1,pos:1,chmod:1,y:1,substr:1,endnetent:1,printf:1,next:1,open:1,msgsnd:1,readdir:1,use:1,unlink:1,getsockopt:1,getpriority:1,rindex:1,wantarray:1,hex:1,system:1,getservbyport:1,endservent:1,"int":1,chr:1,untie:1,rmdir:1,prototype:1,tell:1,listen:1,fork:1,shmread:1,ucfirst:1,setprotoent:1,"else":1,sysseek:1,link:1,getgrgid:1,shmctl:1,waitpid:1,unpack:1,getnetbyname:1,reset:1,chdir:1,grep:1,split:1,require:1,caller:1,lcfirst:1,until:1,warn:1,"while":1,values:1,shift:1,telldir:1,getpwuid:1,my:1,getprotobynumber:1,"delete":1,and:1,sort:1,uc:1,defined:1,srand:1,accept:1,"package":1,seekdir:1,getprotobyname:1,semop:1,our:1,rename:1,seek:1,"if":1,q:1,chroot:1,sysread:1,setpwent:1,no:1,crypt:1,getc:1,chown:1,sqrt:1,write:1,setnetent:1,setpriority:1,foreach:1,tie:1,sin:1,msgget:1,map:1,stat:1,getlogin:1,unless:1,elsif:1,truncate:1,exec:1,keys:1,glob:1,tied:1,closedir:1,ioctl:1,socket:1,readlink:1,"eval":1,xor:1,readline:1,binmode:1,setservent:1,eof:1,ord:1,bind:1,alarm:1,pipe:1,atan2:1,getgrent:1,exp:1,time:1,push:1,setgrent:1,gt:1,lt:1,or:1,ne:1,m:1};var d={cN:"subst",b:"[$@]\\{",e:"}",k:c,r:10};var b={cN:"variable",b:"\\$\\d"};var a={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var g=[hljs.BE,d,b,a];var f={b:"->",c:[{b:hljs.IR},{b:"{",e:"}"}]};var e=[b,a,hljs.HCM,{cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5},f,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:g,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:g,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:g,r:5},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"string",b:'"',e:'"',c:g,r:0},{cN:"string",b:"`",e:"`",c:[hljs.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[hljs.BE],r:0},{cN:"sub",b:"\\bsub\\b",e:"(\\s*\\(.*?\\))?[;{]",k:{sub:1},r:5},{cN:"operator",b:"-\\w\\b",r:0},{cN:"pod",b:"\\=\\w",e:"\\=cut"}];d.c=e;f.c[1].c=e;return{dM:{k:c,c:e}}}();hljs.LANGUAGES.cpp=function(){var b={keyword:{"false":1,"int":1,"float":1,"while":1,"private":1,"char":1,"catch":1,"export":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,"const":1,struct:1,"for":1,static_cast:2,union:1,namespace:1,unsigned:1,"long":1,"throw":1,"volatile":2,"static":1,"protected":1,bool:1,template:1,mutable:1,"if":1,"public":1,friend:2,"do":1,"return":1,"goto":1,auto:1,"void":2,"enum":1,"else":1,"break":1,"new":1,extern:1,using:1,"true":1,"class":1,asm:1,"case":1,typeid:1,"short":1,reinterpret_cast:2,"default":1,"double":1,register:1,explicit:1,signed:1,typename:1,"try":1,"this":1,"switch":1,"continue":1,wchar_t:1,inline:1,"delete":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};var a={cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10};a.c=[a];return{dM:{k:b,i:"</",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},hljs.CNM,{cN:"preprocessor",b:"#",e:"$"},a]}}}();
diff --git a/docs/slides/plpv14/_support/reveal/lib/js/html5shiv.js b/docs/slides/plpv14/_support/reveal/lib/js/html5shiv.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/lib/js/html5shiv.js
+++ /dev/null
@@ -1,7 +0,0 @@
-document.createElement('header');
-document.createElement('nav');
-document.createElement('section');
-document.createElement('article');
-document.createElement('aside');
-document.createElement('footer');
-document.createElement('hgroup');
diff --git a/docs/slides/plpv14/_support/reveal/lib/js/showdown.js b/docs/slides/plpv14/_support/reveal/lib/js/showdown.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/lib/js/showdown.js
+++ /dev/null
@@ -1,1341 +0,0 @@
-//
-// showdown.js -- A javascript port of Markdown.
-//
-// Copyright (c) 2007 John Fraser.
-//
-// Original Markdown Copyright (c) 2004-2005 John Gruber
-//   <http://daringfireball.net/projects/markdown/>
-//
-// Redistributable under a BSD-style open source license.
-// See license.txt for more information.
-//
-// The full source distribution is at:
-//
-//				A A L
-//				T C A
-//				T K B
-//
-//   <http://www.attacklab.net/>
-//
-
-//
-// Wherever possible, Showdown is a straight, line-by-line port
-// of the Perl version of Markdown.
-//
-// This is not a normal parser design; it's basically just a
-// series of string substitutions.  It's hard to read and
-// maintain this way,  but keeping Showdown close to the original
-// design makes it easier to port new features.
-//
-// More importantly, Showdown behaves like markdown.pl in most
-// edge cases.  So web applications can do client-side preview
-// in Javascript, and then build identical HTML on the server.
-//
-// This port needs the new RegExp functionality of ECMA 262,
-// 3rd Edition (i.e. Javascript 1.5).  Most modern web browsers
-// should do fine.  Even with the new regular expression features,
-// We do a lot of work to emulate Perl's regex functionality.
-// The tricky changes in this file mostly have the "attacklab:"
-// label.  Major or self-explanatory changes don't.
-//
-// Smart diff tools like Araxis Merge will be able to match up
-// this file with markdown.pl in a useful way.  A little tweaking
-// helps: in a copy of markdown.pl, replace "#" with "//" and
-// replace "$text" with "text".  Be sure to ignore whitespace
-// and line endings.
-//
-
-
-//
-// Showdown usage:
-//
-//   var text = "Markdown *rocks*.";
-//
-//   var converter = new Showdown.converter();
-//   var html = converter.makeHtml(text);
-//
-//   alert(html);
-//
-// Note: move the sample code to the bottom of this
-// file before uncommenting it.
-//
-
-
-//
-// Showdown namespace
-//
-var Showdown = {};
-
-//
-// converter
-//
-// Wraps all "globals" so that the only thing
-// exposed is makeHtml().
-//
-Showdown.converter = function() {
-
-//
-// Globals:
-//
-
-// Global hashes, used by various utility routines
-var g_urls;
-var g_titles;
-var g_html_blocks;
-
-// Used to track when we're inside an ordered or unordered list
-// (see _ProcessListItems() for details):
-var g_list_level = 0;
-
-
-this.makeHtml = function(text) {
-//
-// Main function. The order in which other subs are called here is
-// essential. Link and image substitutions need to happen before
-// _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>
-// and <img> tags get encoded.
-//
-
-	// Clear the global hashes. If we don't clear these, you get conflicts
-	// from other articles when generating a page which contains more than
-	// one article (e.g. an index page that shows the N most recent
-	// articles):
-	g_urls = new Array();
-	g_titles = new Array();
-	g_html_blocks = new Array();
-
-	// attacklab: Replace ~ with ~T
-	// This lets us use tilde as an escape char to avoid md5 hashes
-	// The choice of character is arbitray; anything that isn't
-    // magic in Markdown will work.
-	text = text.replace(/~/g,"~T");
-
-	// attacklab: Replace $ with ~D
-	// RegExp interprets $ as a special character
-	// when it's in a replacement string
-	text = text.replace(/\$/g,"~D");
-
-	// Standardize line endings
-	text = text.replace(/\r\n/g,"\n"); // DOS to Unix
-	text = text.replace(/\r/g,"\n"); // Mac to Unix
-
-	// Make sure text begins and ends with a couple of newlines:
-	text = "\n\n" + text + "\n\n";
-
-	// Convert all tabs to spaces.
-	text = _Detab(text);
-
-	// Strip any lines consisting only of spaces and tabs.
-	// This makes subsequent regexen easier to write, because we can
-	// match consecutive blank lines with /\n+/ instead of something
-	// contorted like /[ \t]*\n+/ .
-	text = text.replace(/^[ \t]+$/mg,"");
-
-	// Handle github codeblocks prior to running HashHTML so that
-	// HTML contained within the codeblock gets escaped propertly
-	text = _DoGithubCodeBlocks(text);
-
-	// Turn block-level HTML blocks into hash entries
-	text = _HashHTMLBlocks(text);
-
-	// Strip link definitions, store in hashes.
-	text = _StripLinkDefinitions(text);
-
-	text = _RunBlockGamut(text);
-
-	text = _UnescapeSpecialChars(text);
-
-	// attacklab: Restore dollar signs
-	text = text.replace(/~D/g,"$$");
-
-	// attacklab: Restore tildes
-	text = text.replace(/~T/g,"~");
-
-	return text;
-};
-
-
-var _StripLinkDefinitions = function(text) {
-//
-// Strips link definitions from text, stores the URLs and titles in
-// hash references.
-//
-
-	// Link defs are in the form: ^[id]: url "optional title"
-
-	/*
-		var text = text.replace(/
-				^[ ]{0,3}\[(.+)\]:  // id = $1  attacklab: g_tab_width - 1
-				  [ \t]*
-				  \n?				// maybe *one* newline
-				  [ \t]*
-				<?(\S+?)>?			// url = $2
-				  [ \t]*
-				  \n?				// maybe one newline
-				  [ \t]*
-				(?:
-				  (\n*)				// any lines skipped = $3 attacklab: lookbehind removed
-				  ["(]
-				  (.+?)				// title = $4
-				  [")]
-				  [ \t]*
-				)?					// title is optional
-				(?:\n+|$)
-			  /gm,
-			  function(){...});
-	*/
-	var text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|\Z)/gm,
-		function (wholeMatch,m1,m2,m3,m4) {
-			m1 = m1.toLowerCase();
-			g_urls[m1] = _EncodeAmpsAndAngles(m2);  // Link IDs are case-insensitive
-			if (m3) {
-				// Oops, found blank lines, so it's not a title.
-				// Put back the parenthetical statement we stole.
-				return m3+m4;
-			} else if (m4) {
-				g_titles[m1] = m4.replace(/"/g,"&quot;");
-			}
-
-			// Completely remove the definition from the text
-			return "";
-		}
-	);
-
-	return text;
-}
-
-
-var _HashHTMLBlocks = function(text) {
-	// attacklab: Double up blank lines to reduce lookaround
-	text = text.replace(/\n/g,"\n\n");
-
-	// Hashify HTML blocks:
-	// We only want to do this for block-level HTML tags, such as headers,
-	// lists, and tables. That's because we still want to wrap <p>s around
-	// "paragraphs" that are wrapped in non-block-level tags, such as anchors,
-	// phrase emphasis, and spans. The list of tags we're looking for is
-	// hard-coded:
-	var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del|style|section|header|footer|nav|article|aside";
-	var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside";
-
-	// First, look for nested blocks, e.g.:
-	//   <div>
-	//     <div>
-	//     tags for inner block must be indented.
-	//     </div>
-	//   </div>
-	//
-	// The outermost tags must start at the left margin for this to match, and
-	// the inner nested divs must be indented.
-	// We need to do this before the next, more liberal match, because the next
-	// match will start at the first `<div>` and stop at the first `</div>`.
-
-	// attacklab: This regex can be expensive when it fails.
-	/*
-		var text = text.replace(/
-		(						// save in $1
-			^					// start of line  (with /m)
-			<($block_tags_a)	// start tag = $2
-			\b					// word break
-								// attacklab: hack around khtml/pcre bug...
-			[^\r]*?\n			// any number of lines, minimally matching
-			</\2>				// the matching end tag
-			[ \t]*				// trailing spaces/tabs
-			(?=\n+)				// followed by a newline
-		)						// attacklab: there are sentinel newlines at end of document
-		/gm,function(){...}};
-	*/
-	text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm,hashElement);
-
-	//
-	// Now match more liberally, simply from `\n<tag>` to `</tag>\n`
-	//
-
-	/*
-		var text = text.replace(/
-		(						// save in $1
-			^					// start of line  (with /m)
-			<($block_tags_b)	// start tag = $2
-			\b					// word break
-								// attacklab: hack around khtml/pcre bug...
-			[^\r]*?				// any number of lines, minimally matching
-			.*</\2>				// the matching end tag
-			[ \t]*				// trailing spaces/tabs
-			(?=\n+)				// followed by a newline
-		)						// attacklab: there are sentinel newlines at end of document
-		/gm,function(){...}};
-	*/
-	text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm,hashElement);
-
-	// Special case just for <hr />. It was easier to make a special case than
-	// to make the other regex more complicated.
-
-	/*
-		text = text.replace(/
-		(						// save in $1
-			\n\n				// Starting after a blank line
-			[ ]{0,3}
-			(<(hr)				// start tag = $2
-			\b					// word break
-			([^<>])*?			//
-			\/?>)				// the matching end tag
-			[ \t]*
-			(?=\n{2,})			// followed by a blank line
-		)
-		/g,hashElement);
-	*/
-	text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,hashElement);
-
-	// Special case for standalone HTML comments:
-
-	/*
-		text = text.replace(/
-		(						// save in $1
-			\n\n				// Starting after a blank line
-			[ ]{0,3}			// attacklab: g_tab_width - 1
-			<!
-			(--[^\r]*?--\s*)+
-			>
-			[ \t]*
-			(?=\n{2,})			// followed by a blank line
-		)
-		/g,hashElement);
-	*/
-	text = text.replace(/(\n\n[ ]{0,3}<!(--[^\r]*?--\s*)+>[ \t]*(?=\n{2,}))/g,hashElement);
-
-	// PHP and ASP-style processor instructions (<?...?> and <%...%>)
-
-	/*
-		text = text.replace(/
-		(?:
-			\n\n				// Starting after a blank line
-		)
-		(						// save in $1
-			[ ]{0,3}			// attacklab: g_tab_width - 1
-			(?:
-				<([?%])			// $2
-				[^\r]*?
-				\2>
-			)
-			[ \t]*
-			(?=\n{2,})			// followed by a blank line
-		)
-		/g,hashElement);
-	*/
-	text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,hashElement);
-
-	// attacklab: Undo double lines (see comment at top of this function)
-	text = text.replace(/\n\n/g,"\n");
-	return text;
-}
-
-var hashElement = function(wholeMatch,m1) {
-	var blockText = m1;
-
-	// Undo double lines
-	blockText = blockText.replace(/\n\n/g,"\n");
-	blockText = blockText.replace(/^\n/,"");
-
-	// strip trailing blank lines
-	blockText = blockText.replace(/\n+$/g,"");
-
-	// Replace the element text with a marker ("~KxK" where x is its key)
-	blockText = "\n\n~K" + (g_html_blocks.push(blockText)-1) + "K\n\n";
-
-	return blockText;
-};
-
-var _RunBlockGamut = function(text) {
-//
-// These are all the transformations that form block-level
-// tags like paragraphs, headers, and list items.
-//
-	text = _DoHeaders(text);
-
-	// Do Horizontal Rules:
-	var key = hashBlock("<hr />");
-	text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm,key);
-	text = text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm,key);
-	text = text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm,key);
-
-	text = _DoLists(text);
-	text = _DoCodeBlocks(text);
-	text = _DoBlockQuotes(text);
-
-	// We already ran _HashHTMLBlocks() before, in Markdown(), but that
-	// was to escape raw HTML in the original Markdown source. This time,
-	// we're escaping the markup we've just created, so that we don't wrap
-	// <p> tags around block-level tags.
-	text = _HashHTMLBlocks(text);
-	text = _FormParagraphs(text);
-
-	return text;
-};
-
-
-var _RunSpanGamut = function(text) {
-//
-// These are all the transformations that occur *within* block-level
-// tags like paragraphs, headers, and list items.
-//
-
-	text = _DoCodeSpans(text);
-	text = _EscapeSpecialCharsWithinTagAttributes(text);
-	text = _EncodeBackslashEscapes(text);
-
-	// Process anchor and image tags. Images must come first,
-	// because ![foo][f] looks like an anchor.
-	text = _DoImages(text);
-	text = _DoAnchors(text);
-
-	// Make links out of things like `<http://example.com/>`
-	// Must come after _DoAnchors(), because you can use < and >
-	// delimiters in inline links like [this](<url>).
-	text = _DoAutoLinks(text);
-	text = _EncodeAmpsAndAngles(text);
-	text = _DoItalicsAndBold(text);
-
-	// Do hard breaks:
-	text = text.replace(/  +\n/g," <br />\n");
-
-	return text;
-}
-
-var _EscapeSpecialCharsWithinTagAttributes = function(text) {
-//
-// Within tags -- meaning between < and > -- encode [\ ` * _] so they
-// don't conflict with their use in Markdown for code, italics and strong.
-//
-
-	// Build a regex to find HTML tags and comments.  See Friedl's
-	// "Mastering Regular Expressions", 2nd Ed., pp. 200-201.
-	var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--.*?--\s*)+>)/gi;
-
-	text = text.replace(regex, function(wholeMatch) {
-		var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g,"$1`");
-		tag = escapeCharacters(tag,"\\`*_");
-		return tag;
-	});
-
-	return text;
-}
-
-var _DoAnchors = function(text) {
-//
-// Turn Markdown link shortcuts into XHTML <a> tags.
-//
-	//
-	// First, handle reference-style links: [link text] [id]
-	//
-
-	/*
-		text = text.replace(/
-		(							// wrap whole match in $1
-			\[
-			(
-				(?:
-					\[[^\]]*\]		// allow brackets nested one level
-					|
-					[^\[]			// or anything else
-				)*
-			)
-			\]
-
-			[ ]?					// one optional space
-			(?:\n[ ]*)?				// one optional newline followed by spaces
-
-			\[
-			(.*?)					// id = $3
-			\]
-		)()()()()					// pad remaining backreferences
-		/g,_DoAnchors_callback);
-	*/
-	text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeAnchorTag);
-
-	//
-	// Next, inline-style links: [link text](url "optional title")
-	//
-
-	/*
-		text = text.replace(/
-			(						// wrap whole match in $1
-				\[
-				(
-					(?:
-						\[[^\]]*\]	// allow brackets nested one level
-					|
-					[^\[\]]			// or anything else
-				)
-			)
-			\]
-			\(						// literal paren
-			[ \t]*
-			()						// no id, so leave $3 empty
-			<?(.*?)>?				// href = $4
-			[ \t]*
-			(						// $5
-				(['"])				// quote char = $6
-				(.*?)				// Title = $7
-				\6					// matching quote
-				[ \t]*				// ignore any spaces/tabs between closing quote and )
-			)?						// title is optional
-			\)
-		)
-		/g,writeAnchorTag);
-	*/
-	text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?(.*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeAnchorTag);
-
-	//
-	// Last, handle reference-style shortcuts: [link text]
-	// These must come last in case you've also got [link test][1]
-	// or [link test](/foo)
-	//
-
-	/*
-		text = text.replace(/
-		(		 					// wrap whole match in $1
-			\[
-			([^\[\]]+)				// link text = $2; can't contain '[' or ']'
-			\]
-		)()()()()()					// pad rest of backreferences
-		/g, writeAnchorTag);
-	*/
-	text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag);
-
-	return text;
-}
-
-var writeAnchorTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {
-	if (m7 == undefined) m7 = "";
-	var whole_match = m1;
-	var link_text   = m2;
-	var link_id	 = m3.toLowerCase();
-	var url		= m4;
-	var title	= m7;
-
-	if (url == "") {
-		if (link_id == "") {
-			// lower-case and turn embedded newlines into spaces
-			link_id = link_text.toLowerCase().replace(/ ?\n/g," ");
-		}
-		url = "#"+link_id;
-
-		if (g_urls[link_id] != undefined) {
-			url = g_urls[link_id];
-			if (g_titles[link_id] != undefined) {
-				title = g_titles[link_id];
-			}
-		}
-		else {
-			if (whole_match.search(/\(\s*\)$/m)>-1) {
-				// Special case for explicit empty url
-				url = "";
-			} else {
-				return whole_match;
-			}
-		}
-	}
-
-	url = escapeCharacters(url,"*_");
-	var result = "<a href=\"" + url + "\"";
-
-	if (title != "") {
-		title = title.replace(/"/g,"&quot;");
-		title = escapeCharacters(title,"*_");
-		result +=  " title=\"" + title + "\"";
-	}
-
-	result += ">" + link_text + "</a>";
-
-	return result;
-}
-
-
-var _DoImages = function(text) {
-//
-// Turn Markdown image shortcuts into <img> tags.
-//
-
-	//
-	// First, handle reference-style labeled images: ![alt text][id]
-	//
-
-	/*
-		text = text.replace(/
-		(						// wrap whole match in $1
-			!\[
-			(.*?)				// alt text = $2
-			\]
-
-			[ ]?				// one optional space
-			(?:\n[ ]*)?			// one optional newline followed by spaces
-
-			\[
-			(.*?)				// id = $3
-			\]
-		)()()()()				// pad rest of backreferences
-		/g,writeImageTag);
-	*/
-	text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g,writeImageTag);
-
-	//
-	// Next, handle inline images:  ![alt text](url "optional title")
-	// Don't forget: encode * and _
-
-	/*
-		text = text.replace(/
-		(						// wrap whole match in $1
-			!\[
-			(.*?)				// alt text = $2
-			\]
-			\s?					// One optional whitespace character
-			\(					// literal paren
-			[ \t]*
-			()					// no id, so leave $3 empty
-			<?(\S+?)>?			// src url = $4
-			[ \t]*
-			(					// $5
-				(['"])			// quote char = $6
-				(.*?)			// title = $7
-				\6				// matching quote
-				[ \t]*
-			)?					// title is optional
-		\)
-		)
-		/g,writeImageTag);
-	*/
-	text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g,writeImageTag);
-
-	return text;
-}
-
-var writeImageTag = function(wholeMatch,m1,m2,m3,m4,m5,m6,m7) {
-	var whole_match = m1;
-	var alt_text   = m2;
-	var link_id	 = m3.toLowerCase();
-	var url		= m4;
-	var title	= m7;
-
-	if (!title) title = "";
-
-	if (url == "") {
-		if (link_id == "") {
-			// lower-case and turn embedded newlines into spaces
-			link_id = alt_text.toLowerCase().replace(/ ?\n/g," ");
-		}
-		url = "#"+link_id;
-
-		if (g_urls[link_id] != undefined) {
-			url = g_urls[link_id];
-			if (g_titles[link_id] != undefined) {
-				title = g_titles[link_id];
-			}
-		}
-		else {
-			return whole_match;
-		}
-	}
-
-	alt_text = alt_text.replace(/"/g,"&quot;");
-	url = escapeCharacters(url,"*_");
-	var result = "<img src=\"" + url + "\" alt=\"" + alt_text + "\"";
-
-	// attacklab: Markdown.pl adds empty title attributes to images.
-	// Replicate this bug.
-
-	//if (title != "") {
-		title = title.replace(/"/g,"&quot;");
-		title = escapeCharacters(title,"*_");
-		result +=  " title=\"" + title + "\"";
-	//}
-
-	result += " />";
-
-	return result;
-}
-
-
-var _DoHeaders = function(text) {
-
-	// Setext-style headers:
-	//	Header 1
-	//	========
-	//
-	//	Header 2
-	//	--------
-	//
-	text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,
-		function(wholeMatch,m1){return hashBlock('<h1 id="' + headerId(m1) + '">' + _RunSpanGamut(m1) + "</h1>");});
-
-	text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,
-		function(matchFound,m1){return hashBlock('<h2 id="' + headerId(m1) + '">' + _RunSpanGamut(m1) + "</h2>");});
-
-	// atx-style headers:
-	//  # Header 1
-	//  ## Header 2
-	//  ## Header 2 with closing hashes ##
-	//  ...
-	//  ###### Header 6
-	//
-
-	/*
-		text = text.replace(/
-			^(\#{1,6})				// $1 = string of #'s
-			[ \t]*
-			(.+?)					// $2 = Header text
-			[ \t]*
-			\#*						// optional closing #'s (not counted)
-			\n+
-		/gm, function() {...});
-	*/
-
-	text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm,
-		function(wholeMatch,m1,m2) {
-			var h_level = m1.length;
-			return hashBlock("<h" + h_level + ' id="' + headerId(m2) + '">' + _RunSpanGamut(m2) + "</h" + h_level + ">");
-		});
-
-	function headerId(m) {
-		return m.replace(/[^\w]/g, '').toLowerCase();
-	}
-	return text;
-}
-
-// This declaration keeps Dojo compressor from outputting garbage:
-var _ProcessListItems;
-
-var _DoLists = function(text) {
-//
-// Form HTML ordered (numbered) and unordered (bulleted) lists.
-//
-
-	// attacklab: add sentinel to hack around khtml/safari bug:
-	// http://bugs.webkit.org/show_bug.cgi?id=11231
-	text += "~0";
-
-	// Re-usable pattern to match any entirel ul or ol list:
-
-	/*
-		var whole_list = /
-		(									// $1 = whole list
-			(								// $2
-				[ ]{0,3}					// attacklab: g_tab_width - 1
-				([*+-]|\d+[.])				// $3 = first list item marker
-				[ \t]+
-			)
-			[^\r]+?
-			(								// $4
-				~0							// sentinel for workaround; should be $
-			|
-				\n{2,}
-				(?=\S)
-				(?!							// Negative lookahead for another list item marker
-					[ \t]*
-					(?:[*+-]|\d+[.])[ \t]+
-				)
-			)
-		)/g
-	*/
-	var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
-
-	if (g_list_level) {
-		text = text.replace(whole_list,function(wholeMatch,m1,m2) {
-			var list = m1;
-			var list_type = (m2.search(/[*+-]/g)>-1) ? "ul" : "ol";
-
-			// Turn double returns into triple returns, so that we can make a
-			// paragraph for the last item in a list, if necessary:
-			list = list.replace(/\n{2,}/g,"\n\n\n");;
-			var result = _ProcessListItems(list);
-
-			// Trim any trailing whitespace, to put the closing `</$list_type>`
-			// up on the preceding line, to get it past the current stupid
-			// HTML block parser. This is a hack to work around the terrible
-			// hack that is the HTML block parser.
-			result = result.replace(/\s+$/,"");
-			result = "<"+list_type+">" + result + "</"+list_type+">\n";
-			return result;
-		});
-	} else {
-		whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g;
-		text = text.replace(whole_list,function(wholeMatch,m1,m2,m3) {
-			var runup = m1;
-			var list = m2;
-
-			var list_type = (m3.search(/[*+-]/g)>-1) ? "ul" : "ol";
-			// Turn double returns into triple returns, so that we can make a
-			// paragraph for the last item in a list, if necessary:
-			var list = list.replace(/\n{2,}/g,"\n\n\n");;
-			var result = _ProcessListItems(list);
-			result = runup + "<"+list_type+">\n" + result + "</"+list_type+">\n";
-			return result;
-		});
-	}
-
-	// attacklab: strip sentinel
-	text = text.replace(/~0/,"");
-
-	return text;
-}
-
-_ProcessListItems = function(list_str) {
-//
-//  Process the contents of a single ordered or unordered list, splitting it
-//  into individual list items.
-//
-	// The $g_list_level global keeps track of when we're inside a list.
-	// Each time we enter a list, we increment it; when we leave a list,
-	// we decrement. If it's zero, we're not in a list anymore.
-	//
-	// We do this because when we're not inside a list, we want to treat
-	// something like this:
-	//
-	//    I recommend upgrading to version
-	//    8. Oops, now this line is treated
-	//    as a sub-list.
-	//
-	// As a single paragraph, despite the fact that the second line starts
-	// with a digit-period-space sequence.
-	//
-	// Whereas when we're inside a list (or sub-list), that line will be
-	// treated as the start of a sub-list. What a kludge, huh? This is
-	// an aspect of Markdown's syntax that's hard to parse perfectly
-	// without resorting to mind-reading. Perhaps the solution is to
-	// change the syntax rules such that sub-lists must start with a
-	// starting cardinal number; e.g. "1." or "a.".
-
-	g_list_level++;
-
-	// trim trailing blank lines:
-	list_str = list_str.replace(/\n{2,}$/,"\n");
-
-	// attacklab: add sentinel to emulate \z
-	list_str += "~0";
-
-	/*
-		list_str = list_str.replace(/
-			(\n)?							// leading line = $1
-			(^[ \t]*)						// leading whitespace = $2
-			([*+-]|\d+[.]) [ \t]+			// list marker = $3
-			([^\r]+?						// list item text   = $4
-			(\n{1,2}))
-			(?= \n* (~0 | \2 ([*+-]|\d+[.]) [ \t]+))
-		/gm, function(){...});
-	*/
-	list_str = list_str.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm,
-		function(wholeMatch,m1,m2,m3,m4){
-			var item = m4;
-			var leading_line = m1;
-			var leading_space = m2;
-
-			if (leading_line || (item.search(/\n{2,}/)>-1)) {
-				item = _RunBlockGamut(_Outdent(item));
-			}
-			else {
-				// Recursion for sub-lists:
-				item = _DoLists(_Outdent(item));
-				item = item.replace(/\n$/,""); // chomp(item)
-				item = _RunSpanGamut(item);
-			}
-
-			return  "<li>" + item + "</li>\n";
-		}
-	);
-
-	// attacklab: strip sentinel
-	list_str = list_str.replace(/~0/g,"");
-
-	g_list_level--;
-	return list_str;
-}
-
-
-var _DoCodeBlocks = function(text) {
-//
-//  Process Markdown `<pre><code>` blocks.
-//
-
-	/*
-		text = text.replace(text,
-			/(?:\n\n|^)
-			(								// $1 = the code block -- one or more lines, starting with a space/tab
-				(?:
-					(?:[ ]{4}|\t)			// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
-					.*\n+
-				)+
-			)
-			(\n*[ ]{0,3}[^ \t\n]|(?=~0))	// attacklab: g_tab_width
-		/g,function(){...});
-	*/
-
-	// attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
-	text += "~0";
-
-	text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
-		function(wholeMatch,m1,m2) {
-			var codeblock = m1;
-			var nextChar = m2;
-
-			codeblock = _EncodeCode( _Outdent(codeblock));
-			codeblock = _Detab(codeblock);
-			codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines
-			codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace
-
-			codeblock = "<pre><code>" + codeblock + "\n</code></pre>";
-
-			return hashBlock(codeblock) + nextChar;
-		}
-	);
-
-	// attacklab: strip sentinel
-	text = text.replace(/~0/,"");
-
-	return text;
-};
-
-var _DoGithubCodeBlocks = function(text) {
-//
-//  Process Github-style code blocks
-//  Example:
-//  ```ruby
-//  def hello_world(x)
-//    puts "Hello, #{x}"
-//  end
-//  ```
-//
-
-
-	// attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
-	text += "~0";
-
-	text = text.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g,
-		function(wholeMatch,m1,m2) {
-			var language = m1;
-			var codeblock = m2;
-
-			codeblock = _EncodeCode(codeblock);
-			codeblock = _Detab(codeblock);
-			codeblock = codeblock.replace(/^\n+/g,""); // trim leading newlines
-			codeblock = codeblock.replace(/\n+$/g,""); // trim trailing whitespace
-
-			codeblock = "<pre><code" + (language ? " class=\"" + language + '"' : "") + ">" + codeblock + "\n</code></pre>";
-
-			return hashBlock(codeblock);
-		}
-	);
-
-	// attacklab: strip sentinel
-	text = text.replace(/~0/,"");
-
-	return text;
-}
-
-var hashBlock = function(text) {
-	text = text.replace(/(^\n+|\n+$)/g,"");
-	return "\n\n~K" + (g_html_blocks.push(text)-1) + "K\n\n";
-}
-
-var _DoCodeSpans = function(text) {
-//
-//   *  Backtick quotes are used for <code></code> spans.
-//
-//   *  You can use multiple backticks as the delimiters if you want to
-//	 include literal backticks in the code span. So, this input:
-//
-//		 Just type ``foo `bar` baz`` at the prompt.
-//
-//	   Will translate to:
-//
-//		 <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
-//
-//	There's no arbitrary limit to the number of backticks you
-//	can use as delimters. If you need three consecutive backticks
-//	in your code, use four for delimiters, etc.
-//
-//  *  You can use spaces to get literal backticks at the edges:
-//
-//		 ... type `` `bar` `` ...
-//
-//	   Turns to:
-//
-//		 ... type <code>`bar`</code> ...
-//
-
-	/*
-		text = text.replace(/
-			(^|[^\\])					// Character before opening ` can't be a backslash
-			(`+)						// $2 = Opening run of `
-			(							// $3 = The code block
-				[^\r]*?
-				[^`]					// attacklab: work around lack of lookbehind
-			)
-			\2							// Matching closer
-			(?!`)
-		/gm, function(){...});
-	*/
-
-	text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,
-		function(wholeMatch,m1,m2,m3,m4) {
-			var c = m3;
-			c = c.replace(/^([ \t]*)/g,"");	// leading whitespace
-			c = c.replace(/[ \t]*$/g,"");	// trailing whitespace
-			c = _EncodeCode(c);
-			return m1+"<code>"+c+"</code>";
-		});
-
-	return text;
-}
-
-var _EncodeCode = function(text) {
-//
-// Encode/escape certain characters inside Markdown code runs.
-// The point is that in code, these characters are literals,
-// and lose their special Markdown meanings.
-//
-	// Encode all ampersands; HTML entities are not
-	// entities within a Markdown code span.
-	text = text.replace(/&/g,"&amp;");
-
-	// Do the angle bracket song and dance:
-	text = text.replace(/</g,"&lt;");
-	text = text.replace(/>/g,"&gt;");
-
-	// Now, escape characters that are magic in Markdown:
-	text = escapeCharacters(text,"\*_{}[]\\",false);
-
-// jj the line above breaks this:
-//---
-
-//* Item
-
-//   1. Subitem
-
-//            special char: *
-//---
-
-	return text;
-}
-
-
-var _DoItalicsAndBold = function(text) {
-
-	// <strong> must go first:
-	text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g,
-		"<strong>$2</strong>");
-
-	text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g,
-		"<em>$2</em>");
-
-	return text;
-}
-
-
-var _DoBlockQuotes = function(text) {
-
-	/*
-		text = text.replace(/
-		(								// Wrap whole match in $1
-			(
-				^[ \t]*>[ \t]?			// '>' at the start of a line
-				.+\n					// rest of the first line
-				(.+\n)*					// subsequent consecutive lines
-				\n*						// blanks
-			)+
-		)
-		/gm, function(){...});
-	*/
-
-	text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,
-		function(wholeMatch,m1) {
-			var bq = m1;
-
-			// attacklab: hack around Konqueror 3.5.4 bug:
-			// "----------bug".replace(/^-/g,"") == "bug"
-
-			bq = bq.replace(/^[ \t]*>[ \t]?/gm,"~0");	// trim one level of quoting
-
-			// attacklab: clean up hack
-			bq = bq.replace(/~0/g,"");
-
-			bq = bq.replace(/^[ \t]+$/gm,"");		// trim whitespace-only lines
-			bq = _RunBlockGamut(bq);				// recurse
-
-			bq = bq.replace(/(^|\n)/g,"$1  ");
-			// These leading spaces screw with <pre> content, so we need to fix that:
-			bq = bq.replace(
-					/(\s*<pre>[^\r]+?<\/pre>)/gm,
-				function(wholeMatch,m1) {
-					var pre = m1;
-					// attacklab: hack around Konqueror 3.5.4 bug:
-					pre = pre.replace(/^  /mg,"~0");
-					pre = pre.replace(/~0/g,"");
-					return pre;
-				});
-
-			return hashBlock("<blockquote>\n" + bq + "\n</blockquote>");
-		});
-	return text;
-}
-
-
-var _FormParagraphs = function(text) {
-//
-//  Params:
-//    $text - string to process with html <p> tags
-//
-
-	// Strip leading and trailing lines:
-	text = text.replace(/^\n+/g,"");
-	text = text.replace(/\n+$/g,"");
-
-	var grafs = text.split(/\n{2,}/g);
-	var grafsOut = new Array();
-
-	//
-	// Wrap <p> tags.
-	//
-	var end = grafs.length;
-	for (var i=0; i<end; i++) {
-		var str = grafs[i];
-
-		// if this is an HTML marker, copy it
-		if (str.search(/~K(\d+)K/g) >= 0) {
-			grafsOut.push(str);
-		}
-		else if (str.search(/\S/) >= 0) {
-			str = _RunSpanGamut(str);
-			str = str.replace(/^([ \t]*)/g,"<p>");
-			str += "</p>"
-			grafsOut.push(str);
-		}
-
-	}
-
-	//
-	// Unhashify HTML blocks
-	//
-	end = grafsOut.length;
-	for (var i=0; i<end; i++) {
-		// if this is a marker for an html block...
-		while (grafsOut[i].search(/~K(\d+)K/) >= 0) {
-			var blockText = g_html_blocks[RegExp.$1];
-			blockText = blockText.replace(/\$/g,"$$$$"); // Escape any dollar signs
-			grafsOut[i] = grafsOut[i].replace(/~K\d+K/,blockText);
-		}
-	}
-
-	return grafsOut.join("\n\n");
-}
-
-
-var _EncodeAmpsAndAngles = function(text) {
-// Smart processing for ampersands and angle brackets that need to be encoded.
-
-	// Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
-	//   http://bumppo.net/projects/amputator/
-	text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g,"&amp;");
-
-	// Encode naked <'s
-	text = text.replace(/<(?![a-z\/?\$!])/gi,"&lt;");
-
-	return text;
-}
-
-
-var _EncodeBackslashEscapes = function(text) {
-//
-//   Parameter:  String.
-//   Returns:	The string, with after processing the following backslash
-//			   escape sequences.
-//
-
-	// attacklab: The polite way to do this is with the new
-	// escapeCharacters() function:
-	//
-	// 	text = escapeCharacters(text,"\\",true);
-	// 	text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
-	//
-	// ...but we're sidestepping its use of the (slow) RegExp constructor
-	// as an optimization for Firefox.  This function gets called a LOT.
-
-	text = text.replace(/\\(\\)/g,escapeCharacters_callback);
-	text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g,escapeCharacters_callback);
-	return text;
-}
-
-
-var _DoAutoLinks = function(text) {
-
-	text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi,"<a href=\"$1\">$1</a>");
-
-	// Email addresses: <address@domain.foo>
-
-	/*
-		text = text.replace(/
-			<
-			(?:mailto:)?
-			(
-				[-.\w]+
-				\@
-				[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
-			)
-			>
-		/gi, _DoAutoLinks_callback());
-	*/
-	text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
-		function(wholeMatch,m1) {
-			return _EncodeEmailAddress( _UnescapeSpecialChars(m1) );
-		}
-	);
-
-	return text;
-}
-
-
-var _EncodeEmailAddress = function(addr) {
-//
-//  Input: an email address, e.g. "foo@example.com"
-//
-//  Output: the email address as a mailto link, with each character
-//	of the address encoded as either a decimal or hex entity, in
-//	the hopes of foiling most address harvesting spam bots. E.g.:
-//
-//	<a href="&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101;
-//	   x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;">&#102;&#111;&#111;
-//	   &#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a>
-//
-//  Based on a filter by Matthew Wickline, posted to the BBEdit-Talk
-//  mailing list: <http://tinyurl.com/yu7ue>
-//
-
-	// attacklab: why can't javascript speak hex?
-	function char2hex(ch) {
-		var hexDigits = '0123456789ABCDEF';
-		var dec = ch.charCodeAt(0);
-		return(hexDigits.charAt(dec>>4) + hexDigits.charAt(dec&15));
-	}
-
-	var encode = [
-		function(ch){return "&#"+ch.charCodeAt(0)+";";},
-		function(ch){return "&#x"+char2hex(ch)+";";},
-		function(ch){return ch;}
-	];
-
-	addr = "mailto:" + addr;
-
-	addr = addr.replace(/./g, function(ch) {
-		if (ch == "@") {
-		   	// this *must* be encoded. I insist.
-			ch = encode[Math.floor(Math.random()*2)](ch);
-		} else if (ch !=":") {
-			// leave ':' alone (to spot mailto: later)
-			var r = Math.random();
-			// roughly 10% raw, 45% hex, 45% dec
-			ch =  (
-					r > .9  ?	encode[2](ch)   :
-					r > .45 ?	encode[1](ch)   :
-								encode[0](ch)
-				);
-		}
-		return ch;
-	});
-
-	addr = "<a href=\"" + addr + "\">" + addr + "</a>";
-	addr = addr.replace(/">.+:/g,"\">"); // strip the mailto: from the visible part
-
-	return addr;
-}
-
-
-var _UnescapeSpecialChars = function(text) {
-//
-// Swap back in all the special characters we've hidden.
-//
-	text = text.replace(/~E(\d+)E/g,
-		function(wholeMatch,m1) {
-			var charCodeToReplace = parseInt(m1);
-			return String.fromCharCode(charCodeToReplace);
-		}
-	);
-	return text;
-}
-
-
-var _Outdent = function(text) {
-//
-// Remove one level of line-leading tabs or spaces
-//
-
-	// attacklab: hack around Konqueror 3.5.4 bug:
-	// "----------bug".replace(/^-/g,"") == "bug"
-
-	text = text.replace(/^(\t|[ ]{1,4})/gm,"~0"); // attacklab: g_tab_width
-
-	// attacklab: clean up hack
-	text = text.replace(/~0/g,"")
-
-	return text;
-}
-
-var _Detab = function(text) {
-// attacklab: Detab's completely rewritten for speed.
-// In perl we could fix it by anchoring the regexp with \G.
-// In javascript we're less fortunate.
-
-	// expand first n-1 tabs
-	text = text.replace(/\t(?=\t)/g,"    "); // attacklab: g_tab_width
-
-	// replace the nth with two sentinels
-	text = text.replace(/\t/g,"~A~B");
-
-	// use the sentinel to anchor our regex so it doesn't explode
-	text = text.replace(/~B(.+?)~A/g,
-		function(wholeMatch,m1,m2) {
-			var leadingText = m1;
-			var numSpaces = 4 - leadingText.length % 4;  // attacklab: g_tab_width
-
-			// there *must* be a better way to do this:
-			for (var i=0; i<numSpaces; i++) leadingText+=" ";
-
-			return leadingText;
-		}
-	);
-
-	// clean up sentinels
-	text = text.replace(/~A/g,"    ");  // attacklab: g_tab_width
-	text = text.replace(/~B/g,"");
-
-	return text;
-}
-
-
-//
-//  attacklab: Utility functions
-//
-
-
-var escapeCharacters = function(text, charsToEscape, afterBackslash) {
-	// First we have to escape the escape characters so that
-	// we can build a character class out of them
-	var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g,"\\$1") + "])";
-
-	if (afterBackslash) {
-		regexString = "\\\\" + regexString;
-	}
-
-	var regex = new RegExp(regexString,"g");
-	text = text.replace(regex,escapeCharacters_callback);
-
-	return text;
-}
-
-
-var escapeCharacters_callback = function(wholeMatch,m1) {
-	var charCodeToEscape = m1.charCodeAt(0);
-	return "~E"+charCodeToEscape+"E";
-}
-
-} // end of Showdown.converter
-
-// export
-if (typeof module !== 'undefined') module.exports = Showdown;
diff --git a/docs/slides/plpv14/_support/reveal/package.json b/docs/slides/plpv14/_support/reveal/package.json
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-	"author": "Hakim El Hattab",
-	"name": "reveal.js",
-	"description": "HTML5 Slideware with Presenter Notes",
-	"version": "1.5.0",
-	"repository": {
-		"type": "git",
-		"url": "git://github.com/hakimel/reveal.js.git"
-	},
-	"engines": {
-		"node": "~0.6.8"
-	},
-	"dependencies": {
-		"underscore" : "1.3.3",
-		"express" : "2.5.9",
-		"socket.io" : "0.9.6",
-		"mustache" : "0.4.0"
-	},
-	"devDependencies": {}
-}
diff --git a/docs/slides/plpv14/_support/reveal/plugin/speakernotes/client.js b/docs/slides/plpv14/_support/reveal/plugin/speakernotes/client.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/plugin/speakernotes/client.js
+++ /dev/null
@@ -1,35 +0,0 @@
-(function() {
-	// don't emit events from inside the previews themselves
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var socket = io.connect(window.location.origin);
-	var socketId = Math.random().toString().slice(2);
-	
-	console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
-
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		var nextindexh;
-		var nextindexv;
-		var slideElement = event.currentSlide;
-
-		if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-			nextindexh = event.indexh;
-			nextindexv = event.indexv + 1;
-		} else {
-			nextindexh = event.indexh + 1;
-			nextindexv = 0;
-		}
-
-		var notes = slideElement.querySelector('aside.notes');
-		var slideData = {
-			notes : notes ? notes.innerHTML : '',
-			indexh : event.indexh,
-			indexv : event.indexv,
-			nextindexh : nextindexh,
-			nextindexv : nextindexv,
-			socketId : socketId
-		};
-
-		socket.emit('slidechanged', slideData);
-	} );
-}());
diff --git a/docs/slides/plpv14/_support/reveal/plugin/speakernotes/index.js b/docs/slides/plpv14/_support/reveal/plugin/speakernotes/index.js
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/plugin/speakernotes/index.js
+++ /dev/null
@@ -1,55 +0,0 @@
-var express   = require('express');
-var fs        = require('fs');
-var io        = require('socket.io');
-var _         = require('underscore');
-var Mustache  = require('mustache');
-
-var app       = express.createServer();
-var staticDir = express.static;
-
-io            = io.listen(app);
-
-var opts = {
-	port :      1947,
-	baseDir :   __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		socket.broadcast.emit('slidedata', slideData);
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/notes/:socketId", function(req, res) {
-
-	fs.readFile(opts.baseDir + 'plugin/speakernotes/notes.html', function(err, data) {
-		res.send(Mustache.to_html(data.toString(), {
-			socketId : req.params.socketId
-		}));
-	});
-	// fs.createReadStream(opts.baseDir + 'speakernotes/notes.html').pipe(res);
-});
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m', 
-	green = '\033[32m', 
-	reset = '\033[0m';
-
-var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
-
-console.log( brown + "reveal.js - Speaker Notes" + reset );
-console.log( "1. Open the slides at " + green + slidesLocation + reset );
-console.log( "2. Click on the link your JS console to go to the notes page" );
-console.log( "3. Advance through your slides and your notes will advance automatically" );
diff --git a/docs/slides/plpv14/_support/reveal/plugin/speakernotes/notes.html b/docs/slides/plpv14/_support/reveal/plugin/speakernotes/notes.html
deleted file mode 100644
--- a/docs/slides/plpv14/_support/reveal/plugin/speakernotes/notes.html
+++ /dev/null
@@ -1,111 +0,0 @@
-<!doctype html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8">
-
-		<title>reveal.js - Slide Notes</title>
-
-		<style>
-			body {
-				font-family: Helvetica;
-			}
-
-			#notes {
-				float: left;
-				font-size: 18px;
-				width: 640px;
-				margin-top: 10px;
-			}
-
-			#wrap-current-slide {
-				width: 400px;
-				height: 320px;
-				float: left;
-				overflow: hidden;
-			}
-
-			#current-slide {
-				width: 800px;
-				height: 600px;
-				border: none;
-				-moz-transform: scale(0.5);
-				-moz-transform-origin: 0 0;
-				-o-transform: scale(0.5);
-				-o-transform-origin: 0 0;
-				-webkit-transform: scale(0.5);
-				-webkit-transform-origin: 0 0;
-			}
-
-			#wrap-next-slide {
-				width: 320px;
-				height: 256px;
-				float: left;
-				margin: 0 0 0 10px;
-				overflow: hidden;
-			}
-
-			#next-slide {
-				width: 800px;
-				height: 600px;
-				border: none;
-				-moz-transform: scale(0.25);
-				-moz-transform-origin: 0 0;
-				-o-transform: scale(0.25);
-				-o-transform-origin: 0 0;
-				-webkit-transform: scale(0.25);
-				-webkit-transform-origin: 0 0;
-			}
-
-			.slides {
-				position: relative;
-				margin-bottom: 10px;
-				border: 1px solid black;
-				border-radius: 2px;
-				background: rgb(28, 30, 32);
-			}
-
-			.slides span {
-				position: absolute;
-				top: 3px;
-				left: 3px;
-				font-weight: bold;
-				font-size: 14px;
-				color: rgba( 255, 255, 255, 0.9 );
-			}
-		</style>
-	</head>
-
-	<body>
-
-		<div id="wrap-current-slide" class="slides">
-			<iframe src="/?receiver" width="800" height="600" id="current-slide"></iframe>
-		</div>
-
-		<div id="notes"></div>
-
-		<div id="wrap-next-slide" class="slides">
-			<iframe src="/?receiver" width="640" height="512" id="next-slide"></iframe>
-			<span>UPCOMING:</span>
-		</div>
-
-		<script src="/socket.io/socket.io.js"></script>
-
-		<script>
-		var socketId = '{{socketId}}';
-		var socket = io.connect(window.location.origin);
-		var notes = document.getElementById('notes');
-		var currentSlide = document.getElementById('current-slide');
-		var nextSlide = document.getElementById('next-slide');
-
-		socket.on('slidedata', function(data) {
-			// ignore data from sockets that aren't ours
-			if (data.socketId !== socketId) { return; }
-
-			notes.innerHTML = data.notes;
-			currentSlide.contentWindow.Reveal.navigateTo(data.indexh, data.indexv);
-			nextSlide.contentWindow.Reveal.navigateTo(data.nextindexh, data.nextindexv);
-		});
-		</script>
-
-	</body>
-</html>
diff --git a/docs/slides/plpv14/_support/template.reveal b/docs/slides/plpv14/_support/template.reveal
deleted file mode 100644
--- a/docs/slides/plpv14/_support/template.reveal
+++ /dev/null
@@ -1,103 +0,0 @@
-<!doctype html>  
-<html lang="en">
-	
-<head>
-<meta charset="utf-8">
-
-<title>LiquidHaskell Tutorial</title>
-
-<meta name="description" content="Tutorial Slides">
-<meta name="author" content="Ranjit Jhala">
-
-<meta name="apple-mobile-web-app-capable" content="yes" />
-<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
-
-<link href='http://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic' rel='stylesheet' type='text/css'>
-
-<link rel="stylesheet" href="$reveal$/css/main.css">
-<link rel="stylesheet" href="$reveal$/css/theme/seminar.css" id="theme">
-<link rel="stylesheet" href="$reveal$/css/liquidhaskell.css">
-
-<!-- For syntax highlighting -->
-<link rel="stylesheet" href="$reveal$/lib/css/zenburn.css">
-
-<script>
-	// If the query includes 'print-pdf' we'll use the PDF print sheet
-	document.write( '<link rel="stylesheet" href="../_support/reveal_01/css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
-</script>
-
-<!--[if lt IE 9]>
-<script src="lib/js/html5shiv.js"></script>
-<![endif]-->
-</head>
-<body>
-	
-<div class="reveal">
-<!-- 
-Used to fade in a background when a specific slide state is reached
--->
-<div class="state-background"></div>
-
-<!-- Slides
-Any section element inside of this "slides" container is displayed as a slide
--->
-<div class="slides">
-<!-- Pandoc -->
-$if(title)$
-<section class="titlepage">
-<h1 class="title">$title$</h1>
-$for(author)$
-<h2 class="author">$author$</h2>
-$endfor$
-<h3 class="date">$date$</h3>
-</section>
-$endif$
-$body$
-<!-- End Pandoc -->
-
-</div>
-<!-- End Slides -->
-
-<!-- The navigational controls UI -->
-<aside class="controls">
-<a class="left" href="#">&#x25C4;</a>
-<a class="right" href="#">&#x25BA;</a>
-<a class="up" href="#">&#x25B2;</a>
-<a class="down" href="#">&#x25BC;</a>
-</aside>
-
-<!-- Presentation progress bar -->
-<div class="progress"><span></span></div>
-</div>
-
-<!-- Initialize reveal.js :: make settings changes here -->
-<script src="$reveal$/lib/js/head.min.js"></script>
-<script src="$reveal$/js/reveal.js"></script>
-<script>		
-	// Full list of configuration options available here:
-	// https://github.com/hakimel/reveal.js#configuration
-	Reveal.initialize({
-		controls: true,
-		progress: true,
-		history: true,
-		center: false,
-        rollingLinks: false,
-        theme: Reveal.getQueryHash().theme || 'seminar', // available themes are in /css/theme
-		transition: Reveal.getQueryHash().transition || 'default', // default/cube/page/concave/linear(2d)
-
-		// Optional libraries used to extend on reveal.js
-		dependencies: [
-			{ src: '$reveal$/lib/js/highlight.js', async: true, callback: function() { window.hljs.initHighlightingOnLoad(); } },
-			{ src: '$reveal$/lib/js/classList.js', condition: function() { return !document.body.classList; } },
-			{ src: '$reveal$/lib/js/showdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/lib/js/data-markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
-			{ src: '$reveal$/socket.io/socket.io.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-			{ src: '$reveal$/plugin/speakernotes/client.js', async: true, condition: function() { return window.location.host === 'localhost:1947'; } },
-		]
-	});
-</script>
-<!-- Script for LiveReload -->
-<script>document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')
-</script>
-</body>
-</html>
diff --git a/docs/slides/plpv14/hopa/AbstractRefinements.lhs b/docs/slides/plpv14/hopa/AbstractRefinements.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/hopa/AbstractRefinements.lhs
+++ /dev/null
@@ -1,130 +0,0 @@
-% Abstract Refinements
-
-Abstract Refinements
---------------------
-
-\begin{code}
-module AbstractRefinements where
-\end{code}
-
-
-Abstract Refinements
---------------------
-
-<br>
-
-\begin{code} Consider the following function 
-maxInt     :: Int -> Int -> Int 
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-\begin{code} We can give `maxInt` many (incomparable) refinement types:
-maxInt :: Nat -> Nat -> Nat
-
-maxInt :: Even -> Even -> Even
-
-maxInt :: Prime -> Prime -> Prime
-\end{code}
-
-But **which** is the **right** type?
-
-
-Parametric Invariants 
----------------------
-
-`maxInt` returns *one of* its two inputs `x` and `y`. 
-
-- **If** *both inputs* satisfy a property  
-
-- **Then** *output* must satisfy that property
-
-This holds, **regardless of what that property was!**
- 
-- That  is, we can **abstract over refinements**
-
-- Or,  **parameterize** a type over its refinements.
-
-Parametric Invariants
---------------------- 
-
-\begin{code}
-{-@ maxInt :: forall <p :: Int -> Prop>. Int<p> -> Int<p> -> Int<p> @-}
-maxInt     :: Int -> Int -> Int 
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-
-
-Where
-
-- `Int<p>` is just an abbreviation for `{v:Int | (p v)}`
-
-
-This type states explicitly:
-
-- **For any property** `p`, that is a property of `Int`, 
-
-- `maxInt` takes two **inputs** of which satisfy `p`,
-
-- `maxInt` returns an **output** that satisfies `p`. 
-
-
-Parametric Invariants via Abstract Refinements
----------------------------------------------- 
-
-\begin{code} We type `maxInt` as
-maxInt :: forall <p :: Int -> Prop>. Int<p> -> Int<p> -> Int<p> 
-\end{code}
-
-We call `p` an an **abstract refinement** <br>
-
-
-In the refinement logic,
-
-- abstract refinements are **uninterpreted function symbols**
-
-- which (only) satisfy the *congruence axiom*: forall x, y. x = y => (p x) = (p y)
-
-
-
-Using Abstract Refinements
---------------------------
-
-- **If** we call `maxInt` with two `Int`s with the same concrete refinement,
-
-- **Then** the `p` will be instantiated with that concrete refinement,
-
-- **The output** of the call will also enjoy the concrete refinement.
-
-For example, the refinement is instantiated with `\v -> v >= 0` <br>
-
-\begin{code}
-{-@ maxNat :: Nat @-}
-maxNat     :: Int
-maxNat     = maxInt 2 5
-\end{code}
-
-Using Abstract Refinements
---------------------------
-
-- **If** we call `maxInt` with two `Int`s with the same concrete refinement,
-
-- **Then** the `p` will be instantiated with that concrete refinement,
-
-- **The output** of the call will also enjoy the concrete refinement.
-
-Or any other property <br>
-
-\begin{code}
-{-@ type RGB = {v: Int | ((0 <= v) && (v < 256)) } @-}
-\end{code}
-
-<br> to verify <br>
-
-\begin{code}
-{-@ maxRGB :: RGB @-}
-maxRGB     :: Int
-maxRGB     = maxInt 56 8
-\end{code}
diff --git a/docs/slides/plpv14/lhs/.01_SimpleRefinements.lhs.swn b/docs/slides/plpv14/lhs/.01_SimpleRefinements.lhs.swn
deleted file mode 100644
Binary files a/docs/slides/plpv14/lhs/.01_SimpleRefinements.lhs.swn and /dev/null differ
diff --git a/docs/slides/plpv14/lhs/00_Index.lhs b/docs/slides/plpv14/lhs/00_Index.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/00_Index.lhs
+++ /dev/null
@@ -1,151 +0,0 @@
-Refinement Types For Haskell
-============================
-
- {#berg} 
---------
-
-<br>
-
-+ Niki Vazou
-+ Eric Seidel
-+ *Ranjit Jhala*
-
-<br>
-
-**UC San Diego**
-
-<div class="hidden">
-
-\begin{code}
-main = putStrLn "Easter Egg"
-\end{code}
-
-</div>
-
-Install
--------
-
-<br>
-
-`cabal install liquidhaskell`
-
-<br>
-
-<div class="fragment"> 
-
-  Requires an SMTLIB2 binary 
-  
-  <br>
-
-  + `http://z3.codeplex.com`
-  + `http://cvc4.cs.nyu.edu`
-  + `http://mathsat.fbk.eu`
-
-</div>
-
-Try Online
-----------
-
-<br>
-
-`http://goto.ucsd.edu/liquid/haskell/demo`
-
-Follow Slides
--------------
-
-<br>
-
-`goto.ucsd.edu/~rjhala/liquid/haskell/plpv/lhs/`
-
-
- {#plan} 
---------
-
-1. <div class="fragment"><a href="01_SimpleRefinements.lhs.slides.html" target= "_blank">Refinements</a></div>
-2. <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-3. <div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target= "_blank">Higher-Order Functions</a></div>
-4. <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements</a></div>
-    - <div class="fragment"><a href="05_Composition.lhs.slides.html" target="_blank">Dependency</a><a href="06_Inductive.lhs.slides.html" target= "_blank">, Induction</a> <a href="07_Array.lhs.slides.html" target= "_blank">, Indexing</a> <a href="08_Recursive.lhs.slides.html" target= "_blank">, Recursion</a></div>
-5. <div class="fragment"><a href="09_Laziness.lhs.slides.html" target="_blank">Lazy Evaluation</a></div>
-6. <div class="fragment"><a href="10_Termination.lhs.slides.html" target="_blank">Termination</a></div>
-
-<!--
-
-[Higher Order Functions](03_HigherOrderFunctions.lhs.slides.html)
-   </div>
-4. <div class="fragment">
-      [Abstract Refinements](04_AbstractRefinements.lhs.slides.html)
-   </div>
-    - <div class="fragment">[Dependency](05_Composition.lhs.slides.html), 
-                            [Induction](06_Inductive.lhs.slides.html), 
-                            [Indexing](07_Array.lhs.slides.html), 
-                            [Recursion](08_Recursive.lhs.slides.html)
-      </div>
-5. <div class="fragment">
-    [Lazy Evaluation](09_Laziness.lhs.slides.html)
-   </div>
-6. <div class="fragment">
-     [Termination](10_Termination.lhs.slides.html)
-   </div>
-
--->
-
-Evaluation
-==========
-
-LiquidHaskell Is For Real
--------------------------
-
-<br>
-
-Substantial code bases, tricky properties.
-
-<br>
-
-<div class="fragment">Inference, FTW.</div>
-
-Numbers
--------
-
-<div align="center">
-
-**Library**                      LOC
----------------------------   ------
-`GHC.List`                       310
-`Data.List`                      504
-`Data.Set.Splay`                 149
-`Data.Vector.Algorithms`        1219
-`Data.Map.Base`                 1396
-`Data.Text`                     3125
-`Data.Bytestring`               3501 
----------------------------   ------
-
-</div>
-
-Evaluation: Termination
------------------------
-
-How bad is *termination* requirement anyway?
-
-- <div class="fragment">`520` recursive functions</div>
-- <div class="fragment">`67%` automatically proved</div>
-- <div class="fragment">`30%` need *witnesses* `/[...]`</div>
-- <div class="fragment">`18`  *not proven terminating*</div>
-- <div class="fragment">`12`  don't actually terminate (top-level `IO`)</div>
-- <div class="fragment">`6`   *probably* terminate, but *we* can't tell why.</div>
-
-
-Future Work
------------
-
-- Error Messages
-
-- Speed
-
-- Case Studies
-
-Thank You!
-----------
-
-`cabal install liquidhaskell`
-
diff --git a/docs/slides/plpv14/lhs/00_Index.lhs.markdown b/docs/slides/plpv14/lhs/00_Index.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/00_Index.lhs.markdown
+++ /dev/null
@@ -1,151 +0,0 @@
-Refinement Types For Haskell
-============================
-
- {#berg} 
---------
-
-<br>
-
-+ Niki Vazou
-+ Eric Seidel
-+ *Ranjit Jhala*
-
-<br>
-
-**UC San Diego**
-
-<div class="hidden">
-
-
-<pre><span class=hs-linenum>20: </span><a class=annot href="#"><span class=annottext>{x2 : (IO ()) | (x2 == Main.main)}</span><span class='hs-definition'>main</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>[(Char)] -&gt; (IO ())</span><span class='hs-varid'>putStrLn</span></a> <a class=annot href="#"><span class=annottext>{x3 : [(Char)] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-str'>"Easter Egg"</span></a>
-</pre>
-
-</div>
-
-Install
--------
-
-<br>
-
-`cabal install liquidhaskell`
-
-<br>
-
-<div class="fragment"> 
-
-  Requires an SMTLIB2 binary 
-  
-  <br>
-
-  + `http://z3.codeplex.com`
-  + `http://cvc4.cs.nyu.edu`
-  + `http://mathsat.fbk.eu`
-
-</div>
-
-Try Online
-----------
-
-<br>
-
-`http://goto.ucsd.edu/liquid/haskell/demo`
-
-Follow Slides
--------------
-
-<br>
-
-`goto.ucsd.edu/~rjhala/liquid/haskell/plpv/lhs/`
-
-
- {#plan} 
---------
-
-1. <div class="fragment"><a href="01_SimpleRefinements.lhs.slides.html" target= "_blank">Refinements</a></div>
-2. <div class="fragment"><a href="02_Measures.lhs.slides.html" target= "_blank">Measures</a></div>
-3. <div class="fragment"><a href="03_HigherOrderFunctions.lhs.slides.html" target= "_blank">Higher-Order Functions</a></div>
-4. <div class="fragment"><a href="04_AbstractRefinements.lhs.slides.html" target= "_blank">Abstract Refinements</a></div>
-    - <div class="fragment"><a href="05_Composition.lhs.slides.html" target="_blank">Dependency</a><a href="06_Inductive.lhs.slides.html" target= "_blank">, Induction</a> <a href="07_Array.lhs.slides.html" target= "_blank">, Indexing</a> <a href="08_Recursive.lhs.slides.html" target= "_blank">, Recursion</a></div>
-5. <div class="fragment"><a href="09_Laziness.lhs.slides.html" target="_blank">Lazy Evaluation</a></div>
-6. <div class="fragment"><a href="10_Termination.lhs.slides.html" target="_blank">Termination</a></div>
-
-<!--
-
-[Higher Order Functions](03_HigherOrderFunctions.lhs.slides.html)
-   </div>
-4. <div class="fragment">
-      [Abstract Refinements](04_AbstractRefinements.lhs.slides.html)
-   </div>
-    - <div class="fragment">[Dependency](05_Composition.lhs.slides.html), 
-                            [Induction](06_Inductive.lhs.slides.html), 
-                            [Indexing](07_Array.lhs.slides.html), 
-                            [Recursion](08_Recursive.lhs.slides.html)
-      </div>
-5. <div class="fragment">
-    [Lazy Evaluation](09_Laziness.lhs.slides.html)
-   </div>
-6. <div class="fragment">
-     [Termination](10_Termination.lhs.slides.html)
-   </div>
-
--->
-
-Evaluation
-==========
-
-LiquidHaskell Is For Real
--------------------------
-
-<br>
-
-Substantial code bases, tricky properties.
-
-<br>
-
-<div class="fragment">Inference, FTW.</div>
-
-Numbers
--------
-
-<div align="center">
-
-**Library**                      LOC
----------------------------   ------
-`GHC.List`                       310
-`Data.List`                      504
-`Data.Set.Splay`                 149
-`Data.Vector.Algorithms`        1219
-`Data.Map.Base`                 1396
-`Data.Text`                     3125
-`Data.Bytestring`               3501 
----------------------------   ------
-
-</div>
-
-Evaluation: Termination
------------------------
-
-How bad is *termination* requirement anyway?
-
-- <div class="fragment">`520` recursive functions</div>
-- <div class="fragment">`67%` automatically proved</div>
-- <div class="fragment">`30%` need *witnesses* `/[...]`</div>
-- <div class="fragment">`18`  *not proven terminating*</div>
-- <div class="fragment">`12`  don't actually terminate (top-level `IO`)</div>
-- <div class="fragment">`6`   *probably* terminate, but *we* can't tell why.</div>
-
-
-Future Work
------------
-
-- Error Messages
-
-- Speed
-
-- Case Studies
-
-Thank You!
-----------
-
-`cabal install liquidhaskell`
-
diff --git a/docs/slides/plpv14/lhs/01_SimpleRefinements.lhs b/docs/slides/plpv14/lhs/01_SimpleRefinements.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/01_SimpleRefinements.lhs
+++ /dev/null
@@ -1,360 +0,0 @@
- {#simplerefinements}
-=======================
-
-Simple Refinement Types
------------------------
-
-<div class="hidden">
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-module SimpleRefinements where
-import Language.Haskell.Liquid.Prelude
-import Prelude hiding (abs, max)
-
--- boring haskell type sigs
-zero    :: Int
-zero'   :: Int
-safeDiv :: Int -> Int -> Int
-abs     :: Int -> Int
-nats    :: L Int
-evens   :: L Int
-odds    :: L Int
-range   :: Int -> Int -> L Int
-\end{code}
-
-</div>
-
-
-Simple Refinement Types
-=======================
-
-
-Types + Predicates 
-------------------
-
-
-Example
--------
-
-Integers equal to `0`
-
-<br>
-
-\begin{code}
-{-@ type EqZero = {v:Int | v = 0} @-}
-\end{code}
-
-
-Example
--------
-
-Integers equal to `0`
-
-<br>
-
-\begin{code}
-{-@ zero :: EqZero @-}
-zero     =  0
-\end{code}
-
-<br>
-
-<div class="fragment">
-Refinement types via special comments `{-@ ... @-}`
-</div>
-
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo</a> 
-Lets take a look.
-</div>
-
- {#refinementsArePredicates}
-============================
-
-Refinements Are Predicates
---------------------------
-
-
-Refinements Are Predicates
-==========================
-
-Subtyping is Implication
-------------------------
-
-[Predicate Subtyping](http://pvs.csl.sri.com/papers/subtypes98/tse98.pdf)
-
-
-Subtyping is Implication
-------------------------
-
-<br>
-
---------  ---  ---------------------------------------------
-  **If**   :   Refinement of `S` *implies* refinement of `T` 
-
-**Then**   :   `S` is a *subtype* of `T`
---------  ---  ---------------------------------------------
-
-<br>
-
-
-Subtyping is Implication
-------------------------
-
-
-<br>
-
---------   ---     ----------------------------
-  **If**    :      `p => q`
-                
-**Then**    :      `{v : t | p} <: {v : t | q}`
---------   ---     ----------------------------
-
-
-Subtyping is Implication
-------------------------
-
-<br>
-
---------    ---  ---------------------------------------------------
-  **As**     :   `v=0` *implies* `0<=v` ... via SMT
-                 
-  **So**     :   `{v:Int | v=0} <: {v:Int | 0<=v}`
---------    ---  ---------------------------------------------------
-
-
-Example: Natural Numbers
-------------------------
-
-\begin{code} . 
-type Nat = {v : Int | 0 <= v}
-\end{code}
-
-<br>
-
-Via SMT, LiquidHaskell infers `EqZero <: Nat`, hence:
-
-<br>
-
-\begin{code}
-{-@ zero' :: Nat @-}
-zero'     =  zero
-\end{code}
-
- {#universalinvariants}
-=======================
-
-Types = Universal Invariants
-----------------------------
-
-(Notoriously hard with *pure* SMT)
-
-Types Yield Universal Invariants
-================================
-
-Example: Lists
---------------
-
-<div class="hidden">
-\begin{code}
-infixr `C`
-\end{code}
-</div>
-
-\begin{code}
-data L a = N | C a (L a)
-\end{code}
-
-<br>
-
-<div class="fragment">
-*Every element* in `nats` is non-negative:
-\begin{code}
-{-@ nats :: L Nat @-}
-nats     =  0 `C` 1 `C` 3 `C` N
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if `nats` contained `-2`? 
-
-</div>
-
-Example: Even/Odd Lists
------------------------
-
-\begin{code}
-{-@ type Even = {v:Int | v mod 2 =  0} @-}
-{-@ type Odd  = {v:Int | v mod 2 /= 0} @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ evens :: L Even @-}
-evens     =  0 `C` 2 `C` 4 `C` N
-
-{-@ odds  :: L Odd  @-}
-odds      =  1 `C` 3 `C` 5 `C` N 
-\end{code}
-</div>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if `evens` contained `1`? 
-</div>
-
- {#functiontypes}
-=================
-
-Contracts = Function Types
---------------------------
-
-Contracts: Function Types
-=========================
-
-
-Example: `safeDiv`
-------------------
-
-<br>
-
-**Precondition** divisor is *non-zero*.
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ type NonZero = {v:Int | v /= 0} @-}
-\end{code}
-</div>
-
-<br>
-
-Example: `safeDiv`
-------------------
-
-<br>
-
-+ **Pre-condition** divisor is *non-zero*.
-+ **Input type** specifies *pre-condition*
-
-<br>
-
-\begin{code}
-{-@ safeDiv :: Int -> NonZero -> Int @-}
-safeDiv x y = x `div` y
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if precondition does not hold?
-
-</div>
-
-Example: `abs`
---------------
-
-<br>
-
-+ **Postcondition** result is non-negative
-+ **Output type** specifies *post-condition*
-
-<br>
-
-\begin{code}
-{-@ abs       :: x:Int -> Nat @-}
-abs x 
-  | 0 <= x    = x 
-  | otherwise = 0 - x
-\end{code}
-
-
-
- {#dependentfunctions}
-======================
-
-Dependent Function Types
-------------------------
-
-+ Outputs *refer to* inputs
-+ *Relational* invariants
-
-
-Dependent Function Types
-========================
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-<br>
-
-\begin{code}
-{-@ type Btwn I J = {v:_|(I <= v && v < J)} @-}
-\end{code}
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-<br>
-
-\begin{code}
-{-@ range :: i:Int -> j:Int -> L (Btwn i j) @-}
-range i j         = go i
-  where
-    go n
-      | n < j     = n `C` go (n + 1)  
-      | otherwise = N
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Question:** What is the type of `go` ?
-</div>
-
-
-Example: Indexing Into List
----------------------------
-
-\begin{code} 
-(!)          :: L a -> Int -> a
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "Oops!"
-\end{code}
-
-<br>
-
-<div class="fragment">(Mouseover to view type of `liquidError`)</div>
-
-<br>
-
-- <div class="fragment">**Q:** How to ensure safety? </div>
-- <div class="fragment">**A:** Precondition: `i` between `0` and list **length**.
-
-<div class="fragment">Need way to [measure](#measures) *length of a list* ...</div>
-
-
diff --git a/docs/slides/plpv14/lhs/01_SimpleRefinements.lhs.markdown b/docs/slides/plpv14/lhs/01_SimpleRefinements.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/01_SimpleRefinements.lhs.markdown
+++ /dev/null
@@ -1,386 +0,0 @@
- {#simplerefinements}
-=======================
-
-Simple Refinement Types
------------------------
-
-<div class="hidden">
-
-
-<pre><span class=hs-linenum>10: </span><span class='hs-keyword'>{-@</span> <span class='hs-conid'>LIQUID</span> <span class='hs-str'>"--no-termination"</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>11: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>SimpleRefinements</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>12: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>Liquid</span><span class='hs-varop'>.</span><span class='hs-conid'>Prelude</span>
-<span class=hs-linenum>13: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>abs</span><span class='hs-layout'>,</span> <span class='hs-varid'>max</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>14: </span>
-<span class=hs-linenum>15: </span><span class='hs-comment'>-- boring haskell type sigs</span>
-<span class=hs-linenum>16: </span><span class='hs-definition'>zero</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>17: </span><span class='hs-definition'>zero'</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>18: </span><span class='hs-definition'>safeDiv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>19: </span><span class='hs-definition'>abs</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>20: </span><span class='hs-definition'>nats</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>21: </span><span class='hs-definition'>evens</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>22: </span><span class='hs-definition'>odds</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>23: </span><span class='hs-definition'>range</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Int</span>
-</pre>
-
-</div>
-
-
-Simple Refinement Types
-=======================
-
-
-Types + Predicates 
-------------------
-
-
-Example
--------
-
-Integers equal to `0`
-
-<br>
-
-
-<pre><span class=hs-linenum>45: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>EqZero</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-
-Example
--------
-
-Integers equal to `0`
-
-<br>
-
-
-<pre><span class=hs-linenum>57: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>zero</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EqZero</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>58: </span><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV == 0)}</span><span class='hs-definition'>zero</span></a>     <span class='hs-keyglyph'>=</span>  <a class=annot href="#"><span class=annottext>x1:(Int#) -&gt; {x2 : (Int) | (x2 == (x1  :  int))}</span><span class='hs-num'>0</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">
-Refinement types via special comments `{-@ ... @-}`
-</div>
-
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo</a> 
-Lets take a look.
-</div>
-
- {#refinementsArePredicates}
-============================
-
-Refinements Are Predicates
---------------------------
-
-
-Refinements Are Predicates
-==========================
-
-Subtyping is Implication
-------------------------
-
-[Predicate Subtyping](http://pvs.csl.sri.com/papers/subtypes98/tse98.pdf)
-
-
-Subtyping is Implication
-------------------------
-
-<br>
-
---------  ---  ---------------------------------------------
-  **If**   :   Refinement of `S` *implies* refinement of `T` 
-
-**Then**   :   `S` is a *subtype* of `T`
---------  ---  ---------------------------------------------
-
-<br>
-
-
-Subtyping is Implication
-------------------------
-
-
-<br>
-
---------   ---     ----------------------------
-  **If**    :      `p => q`
-                
-**Then**    :      `{v : t | p} <: {v : t | q}`
---------   ---     ----------------------------
-
-
-Subtyping is Implication
-------------------------
-
-<br>
-
---------    ---  ---------------------------------------------------
-  **As**     :   `v=0` *implies* `0<=v` ... via SMT
-                 
-  **So**     :   `{v:Int | v=0} <: {v:Int | 0<=v}`
---------    ---  ---------------------------------------------------
-
-
-Example: Natural Numbers
-------------------------
-
- . 
-<pre><span class=hs-linenum>134: </span><span class='hs-keyword'>type</span> <span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span> <span class='hs-conop'>:</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-num'>0</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span>
-</pre>
-
-<br>
-
-Via SMT, LiquidHaskell infers `EqZero <: Nat`, hence:
-
-<br>
-
-
-<pre><span class=hs-linenum>144: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>zero'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>145: </span><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-definition'>zero'</span></a>     <span class='hs-keyglyph'>=</span>  <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == 0) &amp;&amp; (x3 == SimpleRefinements.zero)}</span><span class='hs-varid'>zero</span></a>
-</pre>
-
- {#universalinvariants}
-=======================
-
-Types = Universal Invariants
-----------------------------
-
-(Notoriously hard with *pure* SMT)
-
-Types Yield Universal Invariants
-================================
-
-Example: Lists
---------------
-
-<div class="hidden">
-
-<pre><span class=hs-linenum>164: </span><span class='hs-keyword'>infixr</span> <span class='hs-varop'>`C`</span>
-</pre>
-</div>
-
-
-<pre><span class=hs-linenum>169: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-*Every element* in `nats` is non-negative:
-
-<pre><span class=hs-linenum>177: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>nats</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Nat</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>178: </span><a class=annot href="#"><span class=annottext>(L {VV : (Int) | (VV &gt;= 0)})</span><span class='hs-definition'>nats</span></a>     <span class='hs-keyglyph'>=</span>  <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>{x14 : (Int) | (x14 &gt;= 0) &amp;&amp; (x14 &gt;= SimpleRefinements.zero) &amp;&amp; (SimpleRefinements.zero &lt;= x14)}
--&gt; (L {x14 : (Int) | (x14 &gt;= 0) &amp;&amp; (x14 &gt;= SimpleRefinements.zero) &amp;&amp; (SimpleRefinements.zero &lt;= x14)})
--&gt; (L {x14 : (Int) | (x14 &gt;= 0) &amp;&amp; (x14 &gt;= SimpleRefinements.zero) &amp;&amp; (SimpleRefinements.zero &lt;= x14)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a> <a class=annot href="#"><span class=annottext>{x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)}
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a> <a class=annot href="#"><span class=annottext>{x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)}
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>(L {x2 : (Int) | false})</span><span class='hs-conid'>N</span></a>
-</pre>
-</div>
-
-<br>
-
-<div class="fragment">
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if `nats` contained `-2`? 
-
-</div>
-
-Example: Even/Odd Lists
------------------------
-
-
-<pre><span class=hs-linenum>195: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Even</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-varid'>mod</span> <span class='hs-num'>2</span> <span class='hs-keyglyph'>=</span>  <span class='hs-num'>0</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>196: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Odd</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-varid'>mod</span> <span class='hs-num'>2</span> <span class='hs-varop'>/=</span> <span class='hs-num'>0</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-
-<pre><span class=hs-linenum>203: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>evens</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Even</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>204: </span><a class=annot href="#"><span class=annottext>(L {VV : (Int) | ((VV mod 2) == 0)})</span><span class='hs-definition'>evens</span></a>     <span class='hs-keyglyph'>=</span>  <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>{x17 : (Int) | ((x17 mod 2) == 0) &amp;&amp; (x17 &gt;= 0) &amp;&amp; (x17 &gt;= SimpleRefinements.zero) &amp;&amp; (SimpleRefinements.zero &lt;= x17)}
--&gt; (L {x17 : (Int) | ((x17 mod 2) == 0) &amp;&amp; (x17 &gt;= 0) &amp;&amp; (x17 &gt;= SimpleRefinements.zero) &amp;&amp; (SimpleRefinements.zero &lt;= x17)})
--&gt; (L {x17 : (Int) | ((x17 mod 2) == 0) &amp;&amp; (x17 &gt;= 0) &amp;&amp; (x17 &gt;= SimpleRefinements.zero) &amp;&amp; (SimpleRefinements.zero &lt;= x17)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a> <a class=annot href="#"><span class=annottext>{x23 : (Int) | ((x23 mod 2) == 0) &amp;&amp; (x23 /= 0) &amp;&amp; (x23 &gt; 0) &amp;&amp; (x23 &gt; SimpleRefinements.zero) &amp;&amp; (x23 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x23)}
--&gt; (L {x23 : (Int) | ((x23 mod 2) == 0) &amp;&amp; (x23 /= 0) &amp;&amp; (x23 &gt; 0) &amp;&amp; (x23 &gt; SimpleRefinements.zero) &amp;&amp; (x23 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x23)})
--&gt; (L {x23 : (Int) | ((x23 mod 2) == 0) &amp;&amp; (x23 /= 0) &amp;&amp; (x23 &gt; 0) &amp;&amp; (x23 &gt; SimpleRefinements.zero) &amp;&amp; (x23 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x23)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (4  :  int))}</span><span class='hs-num'>4</span></a> <a class=annot href="#"><span class=annottext>{x23 : (Int) | ((x23 mod 2) == 0) &amp;&amp; (x23 /= 0) &amp;&amp; (x23 &gt; 0) &amp;&amp; (x23 &gt; SimpleRefinements.zero) &amp;&amp; (x23 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x23)}
--&gt; (L {x23 : (Int) | ((x23 mod 2) == 0) &amp;&amp; (x23 /= 0) &amp;&amp; (x23 &gt; 0) &amp;&amp; (x23 &gt; SimpleRefinements.zero) &amp;&amp; (x23 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x23)})
--&gt; (L {x23 : (Int) | ((x23 mod 2) == 0) &amp;&amp; (x23 /= 0) &amp;&amp; (x23 &gt; 0) &amp;&amp; (x23 &gt; SimpleRefinements.zero) &amp;&amp; (x23 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x23)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>(L {x2 : (Int) | false})</span><span class='hs-conid'>N</span></a>
-<span class=hs-linenum>205: </span>
-<span class=hs-linenum>206: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>odds</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Odd</span>  <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>207: </span><a class=annot href="#"><span class=annottext>(L {VV : (Int) | ((VV mod 2) == 1)})</span><span class='hs-definition'>odds</span></a>      <span class='hs-keyglyph'>=</span>  <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a> <a class=annot href="#"><span class=annottext>{x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)}
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a> <a class=annot href="#"><span class=annottext>{x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)}
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (5  :  int))}</span><span class='hs-num'>5</span></a> <a class=annot href="#"><span class=annottext>{x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)}
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})
--&gt; (L {x20 : (Int) | ((x20 mod 2) == 1) &amp;&amp; (x20 &gt; 0) &amp;&amp; (x20 &gt; SimpleRefinements.zero) &amp;&amp; (x20 &gt;= 0) &amp;&amp; (SimpleRefinements.zero &lt;= x20)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>(L {x2 : (Int) | false})</span><span class='hs-conid'>N</span></a> 
-</pre>
-</div>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if `evens` contained `1`? 
-</div>
-
- {#functiontypes}
-=================
-
-Contracts = Function Types
---------------------------
-
-Contracts: Function Types
-=========================
-
-
-Example: `safeDiv`
-------------------
-
-<br>
-
-**Precondition** divisor is *non-zero*.
-
-<br>
-
-<div class="fragment">
-
-<pre><span class=hs-linenum>237: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>NonZero</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-varop'>/=</span> <span class='hs-num'>0</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-</div>
-
-<br>
-
-Example: `safeDiv`
-------------------
-
-<br>
-
-+ **Pre-condition** divisor is *non-zero*.
-+ **Input type** specifies *pre-condition*
-
-<br>
-
-
-<pre><span class=hs-linenum>254: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>safeDiv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NonZero</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>255: </span><a class=annot href="#"><span class=annottext>(Int) -&gt; {VV : (Int) | (VV /= 0)} -&gt; (Int)</span><span class='hs-definition'>safeDiv</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV /= 0)}</span><span class='hs-varid'>y</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x1:(Int)
--&gt; x2:(Int)
--&gt; {x6 : (Int) | (((x1 &gt;= 0) &amp;&amp; (x2 &gt;= 0)) =&gt; (x6 &gt;= 0)) &amp;&amp; (((x1 &gt;= 0) &amp;&amp; (x2 &gt;= 1)) =&gt; (x6 &lt;= x1)) &amp;&amp; (x6 == (x1 / x2))}</span><span class='hs-varop'>`div`</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == y) &amp;&amp; (x3 /= 0)}</span><span class='hs-varid'>y</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellSimpleRefinements.hs" target= "_blank">Demo:</a> 
-What if precondition does not hold?
-
-</div>
-
-Example: `abs`
---------------
-
-<br>
-
-+ **Postcondition** result is non-negative
-+ **Output type** specifies *post-condition*
-
-<br>
-
-
-<pre><span class=hs-linenum>278: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>abs</span>       <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nat</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>279: </span><a class=annot href="#"><span class=annottext>(Int) -&gt; {VV : (Int) | (VV &gt;= 0)}</span><span class='hs-definition'>abs</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>x</span></a> 
-<span class=hs-linenum>280: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>x1:(Int)
--&gt; x2:(Int) -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt;= x2))}</span><span class='hs-varop'>&lt;=</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == x)}</span><span class='hs-varid'>x</span></a>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == x)}</span><span class='hs-varid'>x</span></a> 
-<span class=hs-linenum>281: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == x)}</span><span class='hs-varid'>x</span></a>
-</pre>
-
-
-
- {#dependentfunctions}
-======================
-
-Dependent Function Types
-------------------------
-
-+ Outputs *refer to* inputs
-+ *Relational* invariants
-
-
-Dependent Function Types
-========================
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-<br>
-
-
-<pre><span class=hs-linenum>313: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Btwn</span> <span class='hs-conid'>I</span> <span class='hs-conid'>J</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-keyglyph'>|</span><span class='hs-layout'>(</span><span class='hs-conid'>I</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>v</span> <span class='hs-varop'>&lt;</span> <span class='hs-conid'>J</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-Example: `range`
-----------------
-
-`(range i j)` returns `Int`s between `i` and `j`
-
-<br>
-
-
-<pre><span class=hs-linenum>324: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>range</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>i</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>j</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-layout'>(</span><span class='hs-conid'>Btwn</span> <span class='hs-varid'>i</span> <span class='hs-varid'>j</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>325: </span><a class=annot href="#"><span class=annottext>i:(Int) -&gt; j:(Int) -&gt; (L {v : (Int) | (v &lt; j) &amp;&amp; (i &lt;= v)})</span><span class='hs-definition'>range</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>j</span></a>         <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x10 : (Int) | (x10 &gt;= i) &amp;&amp; (i &lt;= x10)}
--&gt; (L {x7 : (Int) | (x7 &gt;= i) &amp;&amp; (x7 &gt;= x1) &amp;&amp; (x7 &lt; j) &amp;&amp; (i &lt;= x7) &amp;&amp; (x1 &lt;= x7)})</span><span class='hs-varid'>go</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == i)}</span><span class='hs-varid'>i</span></a>
-<span class=hs-linenum>326: </span>  <span class='hs-keyword'>where</span>
-<span class=hs-linenum>327: </span>    <a class=annot href="#"><span class=annottext>n:{VV : (Int) | (VV &gt;= i) &amp;&amp; (i &lt;= VV)}
--&gt; (L {VV : (Int) | (VV &gt;= i) &amp;&amp; (VV &gt;= n) &amp;&amp; (VV &lt; j) &amp;&amp; (i &lt;= VV) &amp;&amp; (n &lt;= VV)})</span><span class='hs-varid'>go</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= i) &amp;&amp; (i &lt;= VV)}</span><span class='hs-varid'>n</span></a>
-<span class=hs-linenum>328: </span>      <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == n) &amp;&amp; (x4 &gt;= i) &amp;&amp; (i &lt;= x4)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>&lt;</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == j)}</span><span class='hs-varid'>j</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == n) &amp;&amp; (x4 &gt;= i) &amp;&amp; (i &lt;= x4)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>{x20 : (Int) | (x20 &gt;= i) &amp;&amp; (x20 &gt;= n) &amp;&amp; (x20 &lt; j) &amp;&amp; (i &lt;= x20) &amp;&amp; (n &lt;= x20)}
--&gt; (L {x20 : (Int) | (x20 &gt;= i) &amp;&amp; (x20 &gt;= n) &amp;&amp; (x20 &lt; j) &amp;&amp; (i &lt;= x20) &amp;&amp; (n &lt;= x20)})
--&gt; (L {x20 : (Int) | (x20 &gt;= i) &amp;&amp; (x20 &gt;= n) &amp;&amp; (x20 &lt; j) &amp;&amp; (i &lt;= x20) &amp;&amp; (n &lt;= x20)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>n:{VV : (Int) | (VV &gt;= i) &amp;&amp; (i &lt;= VV)}
--&gt; (L {VV : (Int) | (VV &gt;= i) &amp;&amp; (VV &gt;= n) &amp;&amp; (VV &lt; j) &amp;&amp; (i &lt;= VV) &amp;&amp; (n &lt;= VV)})</span><span class='hs-varid'>go</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == n) &amp;&amp; (x4 &gt;= i) &amp;&amp; (i &lt;= x4)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span>  
-<span class=hs-linenum>329: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>(L {x2 : (Int) | false})</span><span class='hs-conid'>N</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">
-**Question:** What is the type of `go` ?
-</div>
-
-
-Example: Indexing Into List
----------------------------
-
- 
-<pre><span class=hs-linenum>343: </span><span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span>          <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>344: </span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <a class=annot href="#"><span class=annottext>forall a. (L a) -&gt; (Int) -&gt; a</span><span class='hs-varop'>!</span></a> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a>
-<span class=hs-linenum>345: </span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varop'>!</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>(L a)</span><span class='hs-varid'>xs</span></a> <a class=annot href="#"><span class=annottext>(L a) -&gt; (Int) -&gt; a</span><span class='hs-varop'>!</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>346: </span><span class='hs-keyword'>_</span>        <span class='hs-varop'>!</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x1 : [(Char)] | false} -&gt; {VV : a | false}</span><span class='hs-varid'>liquidError</span></a> <span class=hs-error><a class=annot href="#"><span class=annottext>{x3 : [(Char)] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-str'>"Oops!"</span></a></span>
-</pre>
-
-<br>
-
-<div class="fragment">(Mouseover to view type of `liquidError`)</div>
-
-<br>
-
-- <div class="fragment">**Q:** How to ensure safety? </div>
-- <div class="fragment">**A:** Precondition: `i` between `0` and list **length**.
-
-<div class="fragment">Need way to [measure](#measures) *length of a list* ...</div>
-
-
diff --git a/docs/slides/plpv14/lhs/02_Measures.lhs b/docs/slides/plpv14/lhs/02_Measures.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/02_Measures.lhs
+++ /dev/null
@@ -1,321 +0,0 @@
-
- {#measures}
-============
-
-Measuring Data Types
---------------------
-
-<div class="hidden">
-
-\begin{code}
-module Measures where
-import Prelude hiding ((!!), length)
-import Language.Haskell.Liquid.Prelude
-
-length      :: L a -> Int
-(!)         :: L a -> Int -> a
-insert      :: Ord a => a -> L a -> L a
-insertSort  :: Ord a => [a] -> L a
-\end{code}
-
-</div>
-
-Measuring Data Types 
-====================
-
-Recap
------
-
-1. <div class="fragment">**Refinements:** Types + Predicates</div>
-2. <div class="fragment">**Subtyping:** SMT Implication</div>
-
-<!--
-
----   -----------------------   ---  -------------------------
- 1.      **Refinement Types**    :   Types + Predicates
- 2.             **Subtyping**    :   SMT / Logical Implication 
----   -----------------------   ---  -------------------------
-
--->
-
-
-Example: Lists 
---------------
-
-<div class="hidden">
-
-\begin{code}
-infixr `C`
-\end{code}
-
-</div>
-
-<br>
-
-\begin{code}
-data L a = N 
-         | C a (L a)
-\end{code}
-
-Example: Length of a List 
--------------------------
-
-\begin{code}
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-LiquidHaskell *strengthens* data constructor types
-\begin{code} <div/>
-data L a where 
-  N :: {v: L a | (llen v) = 0}
-  C :: a -> xs:L a 
-         -> {v:L a | (llen v) = 1 + (llen xs)}
-\end{code}
-</div>
-
-Measures Are Uninterpreted
---------------------------
-
-\begin{code} <br>
-data L a where 
-  N :: {v: L a | (llen v) = 0}
-  C :: a -> xs:L a 
-         -> {v:L a | (llen v) = 1 + (llen xs)}
-\end{code}
-
-<br>
-
-`llen` is an *uninterpreted function* in SMT logic
-
-Measures Are Uninterpreted
---------------------------
-
-In SMT, [uninterpreted function](http://fm.csl.sri.com/SSFT12/smt-euf-arithmetic.pdf) `f` obeys *congruence* axiom:
-
-`forall x y. (x = y) => (f x) = (f y)`
-
-<br>
-
-<div class="fragment">
-All other facts about `llen` asserted at *fold* and *unfold*
-</div>
-
-Measures Are Uninterpreted
---------------------------
-
-All other facts about `llen` asserted at *fold* and *unfold*
-
-<br>
-
-<div class="fragment">
-\begin{code}**Fold**<br>
-z = C x y -- z :: {v | llen v = 1 + llen y}
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{code}**Unfold**<br>
-case z of 
-  N     -> e1 -- z :: {v | llen v = 0}
-  C x y -> e2 -- z :: {v | llen v = 1 + llen y}
-\end{code}
-</div>
-
-
-Measured Refinements
---------------------
-
-Now, we can verify:
-
-<br>
-
-\begin{code}
-{-@ length      :: xs:L a -> (EqLen xs) @-}
-length N        = 0
-length (C _ xs) = 1 + (length xs)
-\end{code}
-
-<div class="fragment">
-
-<br>
-
-Where `EqLen` is a type alias:
-
-\begin{code}
-{-@ type EqLen Xs = {v:Nat | v = (llen Xs)} @-}
-\end{code}
-
-</div>
-
-List Indexing Redux
--------------------
-
-We can type list indexed lookup:
-
-<br>
-
-\begin{code}
-{-@ (!)      :: xs:L a -> (LtLen xs) -> a @-}
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "never happens!"
-\end{code}
-
-<br>
-
-Where `LtLen` is a type alias:
-
-\begin{code}
-{-@ type LtLen Xs = {v:Nat | v < (llen Xs)} @-}
-\end{code}
-
-
-List Indexing Redux
--------------------
-
-Now we can type list indexed lookup:
-
-\begin{code} <br>
-{-@ (!)      :: xs:L a -> (LtLen xs) -> a @-}
-(C x _)  ! 0 = x
-(C _ xs) ! i = xs ! (i - 1)
-_        ! _ = liquidError "never happens!"
-\end{code}
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellMeasure.hs" target= "_blank">Demo:</a> 
-What if we *remove* the precondition?
-
-Multiple Measures
------------------
-
-LiquidHaskell allows *many* measures for a type
-
-
-Multiple Measures 
------------------
-
-**Example:** Nullity of a `List` 
-
-\begin{code}
-{-@ measure isNull :: (L a) -> Prop
-    isNull (N)      = true
-    isNull (C x xs) = false           @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-\begin{code} LiquidHaskell **strengthens** data constructors
-data L a where 
-  N :: {v : L a | (isNull v)}
-  C :: a -> L a -> {v:(L a) | not (isNull v)}
-\end{code}
-
-</div>
-
-Multiple Measures
------------------
-
-LiquidHaskell *conjoins* data constructor types:
-
-\begin{code} <br>
-data L a where 
-  N :: {v:L a |  (llen v) = 0 
-              && (isNull v) }
-  C :: a 
-    -> xs:L a 
-    -> {v:L a |  (llen v) = 1 + (llen xs) 
-              && not (isNull v)          }
-\end{code}
-
-Multiple Measures
------------------
-
-Unlike [indexed types](http://dl.acm.org/citation.cfm?id=270793) ...
-
-<br>
-
-+ <div class="fragment">Measures *decouple* properties from structures</div>
-+ <div class="fragment">Support *multiple* properties over structures </div>
-+ <div class="fragment">Enable  *reuse* of structures                 </div>
-
-<br>
-
-<div class="fragment">Invaluable in practice!</div>
-
-Refined Data Constructors
--------------------------
-
-Can *directly pack* properties inside data constructors
-
-<div class="fragment">
-
-<br>
-
-\begin{code}
-{-@ data L a = N
-             | C (x :: a) 
-                 (xs :: L {v:a | x <= v})  @-}
-\end{code}
-
-</div>
-
-<div class="fragment">
-
-<br>
-
-Specifies *increasing* Lists 
-</div>
-
-Refined Data Constructors
--------------------------
-
-**Example:** Increasing Lists, with strengthened constructors:
-
-\begin{code} <br>
-data L a where
-  N :: L a
-  C :: x:a -> xs: L {v:a | x <= v} -> L a
-\end{code}
-
-<br>
-
-- <div class="fragment">LiquidHaskell *checks* property when *folding* `C`</div>
-- <div class="fragment">LiquidHaskell *assumes* property when *unfolding* `C`</div>
-
-Refined Data Constructors
--------------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellInsertSort.hs" target= "_blank">Demo: Insertion Sort</a> (hover for inferred types) 
-
-\begin{code}
-insertSort = foldr insert N
-
-insert y (x `C` xs) 
-  | y <= x    = y `C` (x `C` xs)
-  | otherwise = x `C` insert y xs
-insert y N    = y `C` N    
-\end{code}
-
-<br>
-
-<div class="fragment">**Problem 1:** What if we need *both* [increasing and decreasing lists](http://web.cecs.pdx.edu/~sheard/Code/QSort.html)?</div>
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. <div class="fragment">**Measures:** Strengthened Constructors</div>
-    - <div class="fragment">*Decouple* structure & property, enable *reuse*</div>
-
diff --git a/docs/slides/plpv14/lhs/02_Measures.lhs.markdown b/docs/slides/plpv14/lhs/02_Measures.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/02_Measures.lhs.markdown
+++ /dev/null
@@ -1,331 +0,0 @@
-
- {#measures}
-============
-
-Measuring Data Types
---------------------
-
-<div class="hidden">
-
-
-<pre><span class=hs-linenum>11: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>Measures</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>12: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>!!</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>length</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>13: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>Liquid</span><span class='hs-varop'>.</span><span class='hs-conid'>Prelude</span>
-<span class=hs-linenum>14: </span>
-<span class=hs-linenum>15: </span><span class='hs-definition'>length</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>16: </span><span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>17: </span><span class='hs-definition'>insert</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>18: </span><span class='hs-definition'>insertSort</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-</pre>
-
-</div>
-
-Measuring Data Types 
-====================
-
-Recap
------
-
-1. <div class="fragment">**Refinements:** Types + Predicates</div>
-2. <div class="fragment">**Subtyping:** SMT Implication</div>
-
-<!--
-
----   -----------------------   ---  -------------------------
- 1.      **Refinement Types**    :   Types + Predicates
- 2.             **Subtyping**    :   SMT / Logical Implication 
----   -----------------------   ---  -------------------------
-
--->
-
-
-Example: Lists 
---------------
-
-<div class="hidden">
-
-
-<pre><span class=hs-linenum>48: </span><span class='hs-keyword'>infixr</span> <span class='hs-varop'>`C`</span>
-</pre>
-
-</div>
-
-<br>
-
-
-<pre><span class=hs-linenum>56: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span> 
-<span class=hs-linenum>57: </span>         <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-</pre>
-
-Example: Length of a List 
--------------------------
-
-
-<pre><span class=hs-linenum>64: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>measure</span> <span class='hs-varid'>llen</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>65: </span>    <span class='hs-varid'>llen</span> <span class='hs-layout'>(</span><span class='hs-conid'>N</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
-<span class=hs-linenum>66: </span>    <span class='hs-varid'>llen</span> <span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>  <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-LiquidHaskell *strengthens* data constructor types
- <div/>
-<pre><span class=hs-linenum>74: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>75: </span>  <span class='hs-conid'>N</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>76: </span>  <span class='hs-conid'>C</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> 
-<span class=hs-linenum>77: </span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-</pre>
-</div>
-
-Measures Are Uninterpreted
---------------------------
-
- <br>
-<pre><span class=hs-linenum>85: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>86: </span>  <span class='hs-conid'>N</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>87: </span>  <span class='hs-conid'>C</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> 
-<span class=hs-linenum>88: </span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-</pre>
-
-<br>
-
-`llen` is an *uninterpreted function* in SMT logic
-
-Measures Are Uninterpreted
---------------------------
-
-In SMT, [uninterpreted function](http://fm.csl.sri.com/SSFT12/smt-euf-arithmetic.pdf) `f` obeys *congruence* axiom:
-
-`forall x y. (x = y) => (f x) = (f y)`
-
-<br>
-
-<div class="fragment">
-All other facts about `llen` asserted at *fold* and *unfold*
-</div>
-
-Measures Are Uninterpreted
---------------------------
-
-All other facts about `llen` asserted at *fold* and *unfold*
-
-<br>
-
-<div class="fragment">
-**Fold**<br>
-<pre><span class=hs-linenum>117: </span><span class='hs-definition'>z</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-comment'>-- z :: {v | llen v = 1 + llen y}</span>
-</pre>
-</div>
-
-<br>
-
-<div class="fragment">
-**Unfold**<br>
-<pre><span class=hs-linenum>125: </span><span class='hs-keyword'>case</span> <span class='hs-varid'>z</span> <span class='hs-keyword'>of</span> 
-<span class=hs-linenum>126: </span>  <span class='hs-conid'>N</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>e1</span> <span class='hs-comment'>-- z :: {v | llen v = 0}</span>
-<span class=hs-linenum>127: </span>  <span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>e2</span> <span class='hs-comment'>-- z :: {v | llen v = 1 + llen y}</span>
-</pre>
-</div>
-
-
-Measured Refinements
---------------------
-
-Now, we can verify:
-
-<br>
-
-
-<pre><span class=hs-linenum>140: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>length</span>      <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqLen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>141: </span><a class=annot href="#"><span class=annottext>forall a. x1:(L a) -&gt; {VV : (Int) | (VV == (llen x1)) &amp;&amp; (VV &gt;= 0)}</span><span class='hs-definition'>length</span></a> <span class='hs-conid'>N</span>        <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:(Int#) -&gt; {x2 : (Int) | (x2 == (x1  :  int))}</span><span class='hs-num'>0</span></a>
-<span class=hs-linenum>142: </span><span class='hs-definition'>length</span> <span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>forall a. x1:(L a) -&gt; {VV : (Int) | (VV == (llen x1)) &amp;&amp; (VV &gt;= 0)}</span><span class='hs-varid'>length</span></a> <a class=annot href="#"><span class=annottext>{x2 : (L a) | (x2 == xs)}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>)</span>
-</pre>
-
-<div class="fragment">
-
-<br>
-
-Where `EqLen` is a type alias:
-
-
-<pre><span class=hs-linenum>152: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>EqLen</span> <span class='hs-conid'>Xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-conid'>Xs</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-</div>
-
-List Indexing Redux
--------------------
-
-We can type list indexed lookup:
-
-<br>
-
-
-<pre><span class=hs-linenum>165: </span><span class='hs-keyword'>{-@</span> <span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>LtLen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>166: </span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <a class=annot href="#"><span class=annottext>forall a.
-x1:(L a) -&gt; {VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; (llen x1))} -&gt; a</span><span class='hs-varop'>!</span></a> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a>
-<span class=hs-linenum>167: </span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varop'>!</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>(L {VV : a | (x &lt;= VV)})</span><span class='hs-varid'>xs</span></a> <a class=annot href="#"><span class=annottext>forall a.
-x1:(L a) -&gt; {VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; (llen x1))} -&gt; a</span><span class='hs-varop'>!</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 &gt;= 0)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>168: </span><span class='hs-keyword'>_</span>        <span class='hs-varop'>!</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x1 : [(Char)] | false} -&gt; {VV : a | false}</span><span class='hs-varid'>liquidError</span></a> <a class=annot href="#"><span class=annottext>{x3 : [(Char)] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-str'>"never happens!"</span></a>
-</pre>
-
-<br>
-
-Where `LtLen` is a type alias:
-
-
-<pre><span class=hs-linenum>176: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>LtLen</span> <span class='hs-conid'>Xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>v</span> <span class='hs-varop'>&lt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-conid'>Xs</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-
-List Indexing Redux
--------------------
-
-Now we can type list indexed lookup:
-
- <br>
-<pre><span class=hs-linenum>186: </span><span class='hs-keyword'>{-@</span> <span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>LtLen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>187: </span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-varop'>!</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span>
-<span class=hs-linenum>188: </span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varop'>!</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>xs</span> <span class='hs-varop'>!</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>189: </span><span class='hs-keyword'>_</span>        <span class='hs-varop'>!</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liquidError</span> <span class='hs-str'>"never happens!"</span>
-</pre>
-
-<br>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellMeasure.hs" target= "_blank">Demo:</a> 
-What if we *remove* the precondition?
-
-Multiple Measures
------------------
-
-LiquidHaskell allows *many* measures for a type
-
-
-Multiple Measures 
------------------
-
-**Example:** Nullity of a `List` 
-
-
-<pre><span class=hs-linenum>209: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>measure</span> <span class='hs-varid'>isNull</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>
-<span class=hs-linenum>210: </span>    <span class='hs-varid'>isNull</span> <span class='hs-layout'>(</span><span class='hs-conid'>N</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>true</span>
-<span class=hs-linenum>211: </span>    <span class='hs-varid'>isNull</span> <span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>false</span>           <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-
- LiquidHaskell **strengthens** data constructors
-<pre><span class=hs-linenum>219: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>220: </span>  <span class='hs-conid'>N</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span> <span class='hs-conop'>:</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>isNull</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-<span class=hs-linenum>221: </span>  <span class='hs-conid'>C</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isNull</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span>
-</pre>
-
-</div>
-
-Multiple Measures
------------------
-
-LiquidHaskell *conjoins* data constructor types:
-
- <br>
-<pre><span class=hs-linenum>232: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>233: </span>  <span class='hs-conid'>N</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span>  <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> 
-<span class=hs-linenum>234: </span>              <span class='hs-varop'>&amp;&amp;</span> <span class='hs-layout'>(</span><span class='hs-varid'>isNull</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
-<span class=hs-linenum>235: </span>  <span class='hs-conid'>C</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> 
-<span class=hs-linenum>236: </span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> 
-<span class=hs-linenum>237: </span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span>  <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>238: </span>              <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isNull</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>          <span class='hs-layout'>}</span>
-</pre>
-
-Multiple Measures
------------------
-
-Unlike [indexed types](http://dl.acm.org/citation.cfm?id=270793) ...
-
-<br>
-
-+ <div class="fragment">Measures *decouple* properties from structures</div>
-+ <div class="fragment">Support *multiple* properties over structures </div>
-+ <div class="fragment">Enable  *reuse* of structures                 </div>
-
-<br>
-
-<div class="fragment">Invaluable in practice!</div>
-
-Refined Data Constructors
--------------------------
-
-Can *directly pack* properties inside data constructors
-
-<div class="fragment">
-
-<br>
-
-
-<pre><span class=hs-linenum>266: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span>
-<span class=hs-linenum>267: </span>             <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>268: </span>                 <span class='hs-layout'>(</span><span class='hs-varid'>xs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>  <span class='hs-keyword'>@-}</span>
-</pre>
-
-</div>
-
-<div class="fragment">
-
-<br>
-
-Specifies *increasing* Lists 
-</div>
-
-Refined Data Constructors
--------------------------
-
-**Example:** Increasing Lists, with strengthened constructors:
-
- <br>
-<pre><span class=hs-linenum>286: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>287: </span>  <span class='hs-conid'>N</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>288: </span>  <span class='hs-conid'>C</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span> <span class='hs-conid'>L</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-</pre>
-
-<br>
-
-- <div class="fragment">LiquidHaskell *checks* property when *folding* `C`</div>
-- <div class="fragment">LiquidHaskell *assumes* property when *unfolding* `C`</div>
-
-Refined Data Constructors
--------------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=HaskellInsertSort.hs" target= "_blank">Demo: Insertion Sort</a> (hover for inferred types) 
-
-
-<pre><span class=hs-linenum>302: </span><a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; [a] -&gt; (L a)</span><span class='hs-definition'>insertSort</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>(a -&gt; (L a) -&gt; (L a)) -&gt; (L a) -&gt; [a] -&gt; (L a)</span><span class='hs-varid'>foldr</span></a> <a class=annot href="#"><span class=annottext>a -&gt; (L a) -&gt; (L a)</span><span class='hs-varid'>insert</span></a> <a class=annot href="#"><span class=annottext>{x3 : (L {VV : a | false}) | (((isNull x3)) &lt;=&gt; true) &amp;&amp; ((llen x3) == 0)}</span><span class='hs-conid'>N</span></a>
-<span class=hs-linenum>303: </span>
-<span class=hs-linenum>304: </span><a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; a -&gt; (L a) -&gt; (L a)</span><span class='hs-definition'>insert</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>y</span></a> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>305: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>x1:a -&gt; x2:a -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt;= x2))}</span><span class='hs-varop'>&lt;=</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>x1:{VV : a | (VV &gt;= y)}
--&gt; x2:(L {VV : a | (VV &gt;= y) &amp;&amp; (x1 &lt;= VV)})
--&gt; {x3 : (L {VV : a | (VV &gt;= y)}) | (((isNull x3)) &lt;=&gt; false) &amp;&amp; ((llen x3) == (1 + (llen x2)))}</span><span class='hs-varop'>`C`</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x1:{VV : a | (VV &gt;= x) &amp;&amp; (VV &gt;= y)}
--&gt; x2:(L {VV : a | (VV &gt;= x) &amp;&amp; (VV &gt;= y) &amp;&amp; (x1 &lt;= VV)})
--&gt; {x3 : (L {VV : a | (VV &gt;= x) &amp;&amp; (VV &gt;= y)}) | (((isNull x3)) &lt;=&gt; false) &amp;&amp; ((llen x3) == (1 + (llen x2)))}</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (L {VV : a | (x &lt;= VV)}) | (x2 == xs)}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>306: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x1:{VV : a | (VV &gt;= x)}
--&gt; x2:(L {VV : a | (VV &gt;= x) &amp;&amp; (x1 &lt;= VV)})
--&gt; {x3 : (L {VV : a | (VV &gt;= x)}) | (((isNull x3)) &lt;=&gt; false) &amp;&amp; ((llen x3) == (1 + (llen x2)))}</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; a -&gt; (L a) -&gt; (L a)</span><span class='hs-varid'>insert</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>{x2 : (L {VV : a | (x &lt;= VV)}) | (x2 == xs)}</span><span class='hs-varid'>xs</span></a>
-<span class=hs-linenum>307: </span><span class='hs-definition'>insert</span> <span class='hs-varid'>y</span> <span class='hs-conid'>N</span>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>x1:{VV : a | (VV == y)}
--&gt; x2:(L {VV : a | (VV == y) &amp;&amp; (x1 &lt;= VV)})
--&gt; {x3 : (L {VV : a | (VV == y)}) | (((isNull x3)) &lt;=&gt; false) &amp;&amp; ((llen x3) == (1 + (llen x2)))}</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x3 : (L {VV : a | false}) | (((isNull x3)) &lt;=&gt; true) &amp;&amp; ((llen x3) == 0)}</span><span class='hs-conid'>N</span></a>    
-</pre>
-
-<br>
-
-<div class="fragment">**Problem 1:** What if we need *both* [increasing and decreasing lists](http://web.cecs.pdx.edu/~sheard/Code/QSort.html)?</div>
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. <div class="fragment">**Measures:** Strengthened Constructors</div>
-    - <div class="fragment">*Decouple* structure & property, enable *reuse*</div>
-
diff --git a/docs/slides/plpv14/lhs/03_HigherOrderFunctions.lhs b/docs/slides/plpv14/lhs/03_HigherOrderFunctions.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/03_HigherOrderFunctions.lhs
+++ /dev/null
@@ -1,173 +0,0 @@
-  {#hofs}
-=========
-
-<div class="hidden">
-\begin{code}
-module Loop (
-    listSum
-  , listNatSum
-  ) where
-
-import Prelude
-
-{-@ LIQUID "--no-termination"@-}
-listNatSum  :: [Int] -> Int
-add         :: Int -> Int -> Int
-\end{code}
-</div>
-
-Higher-Order Specifications
----------------------------
-
-Types scale to *Higher-Order* Specifications
-
-<br>
-
-<div class="fragment">
-
-+ map
-+ fold
-+ visitors
-+ callbacks
-+ ...
-
-</div>
-
-<br>
-
-<div class="fragment">Very difficult with *first-order program logics*</div>
-
-
-Higher Order Specifications
-===========================
-
-Example: Higher Order Loop
---------------------------
-
-\begin{code}
-loop :: Int -> Int -> α -> (Int -> α -> α) -> α
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-LiquidHaskell infers `f` called with values `(Btwn lo hi)`
-
-
-Example: Summing Lists
-----------------------
-
-\begin{code}
-listSum xs  = loop 0 n 0 body 
-  where 
-    body    = \i acc -> acc + (xs !! i)
-    n       = length xs
-\end{code}
-
-<br>
-
-- <div class="fragment">*Function subtyping:* `body` called on `i :: Btwn 0 (llen xs)`</div>
-- <div class="fragment">Hence, indexing with `!!` is safe.</div>
-
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Loop.hs" target= "_blank">Demo:</a> Tweak `loop` exit condition? 
-</div>
-
-Example: Summing `Nat`s
------------------------
-
-<br>
-
-\begin{code}
-{-@ listNatSum :: [Nat] -> Nat @-}
-listNatSum xs  = loop 0 n 0 body 
-  where 
-    body       = \i acc -> acc + (xs !! i)
-    n          = length xs
-\end{code}
-
-<br>
-
-<div class="fragment" align="center">
-
-----  ----  ---------------------------------------
- (+)  `::`  `x:Int -> y:Int -> {v:Int| v=x+y}`
-      `<:`  `Nat   -> Nat   -> Nat`
-----  ----  ---------------------------------------
-
-</div>
-
-Example: Summing `Nat`s
------------------------
-
-\begin{code} <br> 
-{-@ listNatSum :: [Nat] -> Nat @-}
-listNatSum xs  = loop 0 n 0 body 
-  where 
-    body       = \i acc -> acc + (xs !! i)
-    n          = length xs
-\end{code}
-
-<br>
-
-Hence, verified by *instantiating* `α` of `loop` with `Nat`
-
-<div class="fragment">`Int -> Int -> Nat -> (Int -> Nat -> Nat) -> Nat`</div>
-
-Example: Summing `Nat`s
------------------------
-
-\begin{code} <br> 
-{-@ listNatSum :: [Nat] -> Nat @-}
-listNatSum xs  = loop 0 n 0 body 
-  where 
-    body       = \i acc -> acc + (xs !! i)
-    n          = length xs
-\end{code}
-
-<br>
-
-+ Parameter `α` corresponds to *loop invariant*
-
-+ Instantiation corresponds to invariant *synthesis*
-
-
-Instantiation And Inference
----------------------------
-
-+ <div class="fragment">Polymorphic instantiation happens *everywhere*</div> 
-
-+ <div class="fragment">Automatic inference is crucial</div>
-
-+ <div class="fragment">*Cannot use* unification (unlike indexed approaches)</div>
-
-+ <div class="fragment">*Can reuse* [SMT/predicate abstraction.](http://goto.ucsd.edu/~rjhala/papers/liquid_types.html)</div>
-
-
-
-Iteration Dependence
---------------------
-
-**Cannot** use parametric polymorphism to verify:
-
-<br>
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-
-- <div class="fragment">As property only holds after **last** loop iteration...</div>
-
-- <div class="fragment">... cannot instantiate `α` with `{v:Int | v = n + m}`</div>
-
-<div class="fragment">**Problem:** Need *iteration-dependent* invariants...</div>
-
diff --git a/docs/slides/plpv14/lhs/03_HigherOrderFunctions.lhs.markdown b/docs/slides/plpv14/lhs/03_HigherOrderFunctions.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/03_HigherOrderFunctions.lhs.markdown
+++ /dev/null
@@ -1,205 +0,0 @@
-  {#hofs}
-=========
-
-<div class="hidden">
-
-<pre><span class=hs-linenum> 6: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>Loop</span> <span class='hs-layout'>(</span>
-<span class=hs-linenum> 7: </span>    <span class='hs-varid'>listSum</span>
-<span class=hs-linenum> 8: </span>  <span class='hs-layout'>,</span> <span class='hs-varid'>listNatSum</span>
-<span class=hs-linenum> 9: </span>  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>10: </span>
-<span class=hs-linenum>11: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span>
-<span class=hs-linenum>12: </span>
-<span class=hs-linenum>13: </span><span class='hs-keyword'>{-@</span> <span class='hs-conid'>LIQUID</span> <span class='hs-str'>"--no-termination"</span><span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>14: </span><span class='hs-definition'>listNatSum</span>  <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Int</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>15: </span><span class='hs-definition'>add</span>         <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-</pre>
-</div>
-
-Higher-Order Specifications
----------------------------
-
-Types scale to *Higher-Order* Specifications
-
-<br>
-
-<div class="fragment">
-
-+ map
-+ fold
-+ visitors
-+ callbacks
-+ ...
-
-</div>
-
-<br>
-
-<div class="fragment">Very difficult with *first-order program logics*</div>
-
-
-Higher Order Specifications
-===========================
-
-Example: Higher Order Loop
---------------------------
-
-
-<pre><span class=hs-linenum>48: </span><span class='hs-definition'>loop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span>
-<span class=hs-linenum>49: </span><a class=annot href="#"><span class=annottext>forall a.
-lo:{VV : (Int) | (VV == 0) &amp;&amp; (VV &gt;= 0)}
--&gt; hi:{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= lo)}
--&gt; a
--&gt; ({VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= lo) &amp;&amp; (VV &lt; hi)} -&gt; a -&gt; a)
--&gt; a</span><span class='hs-definition'>loop</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV == 0) &amp;&amp; (VV &gt;= 0)}</span><span class='hs-varid'>lo</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= lo)}</span><span class='hs-varid'>hi</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>base</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= lo) &amp;&amp; (VV &lt; hi)} -&gt; a -&gt; a</span><span class='hs-varid'>f</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 &gt;= 0) &amp;&amp; (x4 &gt;= lo) &amp;&amp; (x4 &lt;= hi)} -&gt; a -&gt; a</span><span class='hs-varid'>go</span></a> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == 0) &amp;&amp; (x4 == lo) &amp;&amp; (x4 &gt;= 0)}</span><span class='hs-varid'>lo</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == base)}</span><span class='hs-varid'>base</span></a>
-<span class=hs-linenum>50: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>51: </span>    <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= lo) &amp;&amp; (VV &lt;= hi)} -&gt; a -&gt; a</span><span class='hs-varid'>go</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= lo) &amp;&amp; (VV &lt;= hi)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>acc</span></a> 
-<span class=hs-linenum>52: </span>      <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == i) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (x5 &gt;= lo) &amp;&amp; (x5 &lt;= hi)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>x1:{x12 : (Int) | (x12 &gt;= 0) &amp;&amp; (x12 &gt;= i) &amp;&amp; (x12 &gt;= lo) &amp;&amp; (x12 &lt;= hi)}
--&gt; x2:{x12 : (Int) | (x12 &gt;= 0) &amp;&amp; (x12 &gt;= i) &amp;&amp; (x12 &gt;= lo) &amp;&amp; (x12 &lt;= hi)}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>&lt;</span></a> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == hi) &amp;&amp; (x4 &gt;= 0) &amp;&amp; (x4 &gt;= lo)}</span><span class='hs-varid'>hi</span></a>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= lo) &amp;&amp; (VV &lt;= hi)} -&gt; a -&gt; a</span><span class='hs-varid'>go</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == i) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (x5 &gt;= lo) &amp;&amp; (x5 &lt;= hi)}</span><span class='hs-varid'>i</span></a><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 &gt;= 0) &amp;&amp; (x4 &gt;= lo) &amp;&amp; (x4 &lt; hi)} -&gt; a -&gt; a</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == i) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (x5 &gt;= lo) &amp;&amp; (x5 &lt;= hi)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == acc)}</span><span class='hs-varid'>acc</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>53: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == acc)}</span><span class='hs-varid'>acc</span></a>
-</pre>
-
-<br>
-
-LiquidHaskell infers `f` called with values `(Btwn lo hi)`
-
-
-Example: Summing Lists
-----------------------
-
-
-<pre><span class=hs-linenum>65: </span><a class=annot href="#"><span class=annottext>forall a. (Num a) =&gt; [a] -&gt; a</span><span class='hs-definition'>listSum</span></a> <a class=annot href="#"><span class=annottext>[a]</span><span class='hs-varid'>xs</span></a>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x12 : (Int) | (x12 == 0) &amp;&amp; (x12 &gt;= 0)}
--&gt; x2:{x9 : (Int) | (x9 &gt;= 0) &amp;&amp; (x9 &gt;= x1)}
--&gt; a
--&gt; ({x6 : (Int) | (x6 &gt;= 0) &amp;&amp; (x6 &gt;= x1) &amp;&amp; (x6 &lt; x2)} -&gt; a -&gt; a)
--&gt; a</span><span class='hs-varid'>loop</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 == (len xs))}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 &gt;= 0) &amp;&amp; (x3 &lt; n)} -&gt; a -&gt; a</span><span class='hs-varid'>body</span></a> 
-<span class=hs-linenum>66: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>67: </span>    <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; n)} -&gt; a -&gt; a</span><span class='hs-varid'>body</span></a>    <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; n)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>acc</span></a> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == acc)}</span><span class='hs-varid'>acc</span></a> <a class=annot href="#"><span class=annottext>x1:a -&gt; x2:a -&gt; {VV : a | (VV == (x1 + x2))}</span><span class='hs-varop'>+</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x4 : [a] | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a> <a class=annot href="#"><span class=annottext>x1:[a] -&gt; {x3 : (Int) | (x3 &lt; (len x1)) &amp;&amp; (0 &lt;= x3)} -&gt; a</span><span class='hs-varop'>!!</span></a> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == i) &amp;&amp; (x4 &gt;= 0) &amp;&amp; (x4 &lt; n)}</span><span class='hs-varid'>i</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>68: </span>    <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (len xs))}</span><span class='hs-varid'>n</span></a>       <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:[a] -&gt; {x2 : (Int) | (x2 == (len x1))}</span><span class='hs-varid'>length</span></a> <a class=annot href="#"><span class=annottext>{x4 : [a] | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-</pre>
-
-<br>
-
-- <div class="fragment">*Function subtyping:* `body` called on `i :: Btwn 0 (llen xs)`</div>
-- <div class="fragment">Hence, indexing with `!!` is safe.</div>
-
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Loop.hs" target= "_blank">Demo:</a> Tweak `loop` exit condition? 
-</div>
-
-Example: Summing `Nat`s
------------------------
-
-<br>
-
-
-<pre><span class=hs-linenum>87: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>listNatSum</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Nat</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nat</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>88: </span><a class=annot href="#"><span class=annottext>[{VV : (Int) | (VV &gt;= 0)}] -&gt; {VV : (Int) | (VV &gt;= 0)}</span><span class='hs-definition'>listNatSum</span></a> <a class=annot href="#"><span class=annottext>[{VV : (Int) | (VV &gt;= 0)}]</span><span class='hs-varid'>xs</span></a>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x20 : (Int) | (x20 == 0) &amp;&amp; (x20 &gt;= 0)}
--&gt; x2:{x17 : (Int) | (x17 &gt;= 0) &amp;&amp; (x17 &gt;= x1)}
--&gt; {x14 : (Int) | (x14 &gt;= 0)}
--&gt; ({x12 : (Int) | (x12 &gt;= 0) &amp;&amp; (x12 &gt;= x1) &amp;&amp; (x12 &lt; x2)}
-    -&gt; {x14 : (Int) | (x14 &gt;= 0)} -&gt; {x14 : (Int) | (x14 &gt;= 0)})
--&gt; {x14 : (Int) | (x14 &gt;= 0)}</span><span class='hs-varid'>loop</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 == (len xs))}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>{x8 : (Int) | (x8 &gt;= 0) &amp;&amp; (x8 &lt; n)}
--&gt; x2:{x5 : (Int) | (x5 &gt;= 0)}
--&gt; {x3 : (Int) | (x3 &gt;= 0) &amp;&amp; (x3 &gt;= x2)}</span><span class='hs-varid'>body</span></a> 
-<span class=hs-linenum>89: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>90: </span>    <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; n)}
--&gt; acc:{VV : (Int) | (VV &gt;= 0)}
--&gt; {VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= acc)}</span><span class='hs-varid'>body</span></a>       <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; n)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>acc</span></a> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == acc) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>acc</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x4 : [{x7 : (Int) | (x7 &gt;= 0)}] | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a> <a class=annot href="#"><span class=annottext>x1:[{x9 : (Int) | (x9 &gt;= 0)}]
--&gt; {x5 : (Int) | (x5 &lt; (len x1)) &amp;&amp; (0 &lt;= x5)}
--&gt; {x9 : (Int) | (x9 &gt;= 0)}</span><span class='hs-varop'>!!</span></a> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == i) &amp;&amp; (x4 &gt;= 0) &amp;&amp; (x4 &lt; n)}</span><span class='hs-varid'>i</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>91: </span>    <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (len xs))}</span><span class='hs-varid'>n</span></a>          <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:[{x6 : (Int) | (x6 &gt;= 0)}] -&gt; {x2 : (Int) | (x2 == (len x1))}</span><span class='hs-varid'>length</span></a> <a class=annot href="#"><span class=annottext>{x4 : [{x7 : (Int) | (x7 &gt;= 0)}] | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-</pre>
-
-<br>
-
-<div class="fragment" align="center">
-
-----  ----  ---------------------------------------
- (+)  `::`  `x:Int -> y:Int -> {v:Int| v=x+y}`
-      `<:`  `Nat   -> Nat   -> Nat`
-----  ----  ---------------------------------------
-
-</div>
-
-Example: Summing `Nat`s
------------------------
-
- <br> 
-<pre><span class=hs-linenum>109: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>listNatSum</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Nat</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nat</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>110: </span><span class='hs-definition'>listNatSum</span> <span class='hs-varid'>xs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-num'>0</span> <span class='hs-varid'>n</span> <span class='hs-num'>0</span> <span class='hs-varid'>body</span> 
-<span class=hs-linenum>111: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>112: </span>    <span class='hs-varid'>body</span>       <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>i</span> <span class='hs-varid'>acc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>acc</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span> <span class='hs-varop'>!!</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>113: </span>    <span class='hs-varid'>n</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>xs</span>
-</pre>
-
-<br>
-
-Hence, verified by *instantiating* `α` of `loop` with `Nat`
-
-<div class="fragment">`Int -> Int -> Nat -> (Int -> Nat -> Nat) -> Nat`</div>
-
-Example: Summing `Nat`s
------------------------
-
- <br> 
-<pre><span class=hs-linenum>126: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>listNatSum</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Nat</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nat</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>127: </span><span class='hs-definition'>listNatSum</span> <span class='hs-varid'>xs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-num'>0</span> <span class='hs-varid'>n</span> <span class='hs-num'>0</span> <span class='hs-varid'>body</span> 
-<span class=hs-linenum>128: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>129: </span>    <span class='hs-varid'>body</span>       <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>i</span> <span class='hs-varid'>acc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>acc</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span> <span class='hs-varop'>!!</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>130: </span>    <span class='hs-varid'>n</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>xs</span>
-</pre>
-
-<br>
-
-+ Parameter `α` corresponds to *loop invariant*
-
-+ Instantiation corresponds to invariant *synthesis*
-
-
-Instantiation And Inference
----------------------------
-
-+ <div class="fragment">Polymorphic instantiation happens *everywhere*</div> 
-
-+ <div class="fragment">Automatic inference is crucial</div>
-
-+ <div class="fragment">*Cannot use* unification (unlike indexed approaches)</div>
-
-+ <div class="fragment">*Can reuse* [SMT/predicate abstraction.](http://goto.ucsd.edu/~rjhala/papers/liquid_types.html)</div>
-
-
-
-Iteration Dependence
---------------------
-
-**Cannot** use parametric polymorphism to verify:
-
-<br>
-
-
-<pre><span class=hs-linenum>161: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>add</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span><span class='hs-keyword'>|v=m+n}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>162: </span><a class=annot href="#"><span class=annottext>n:{VV : (Int) | (VV &gt;= 0)}
--&gt; m:{VV : (Int) | (VV &gt;= 0)}
--&gt; {VV : (Int) | (VV == (m + n)) &amp;&amp; (VV &gt;= 0)}</span><span class='hs-definition'>add</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>m</span></a> <span class='hs-keyglyph'>=</span> <span class=hs-error><a class=annot href="#"><span class=annottext>x1:{x24 : (Int) | (x24 == 0) &amp;&amp; (x24 &gt;= 0)}
--&gt; x2:{x21 : (Int) | (x21 &gt;= 0) &amp;&amp; (x21 &gt;= x1)}
--&gt; {x18 : (Int) | (x18 &gt;= 0) &amp;&amp; (x18 &gt;= n)}
--&gt; ({x15 : (Int) | (x15 &gt;= 0) &amp;&amp; (x15 &gt;= x1) &amp;&amp; (x15 &lt; x2)}
-    -&gt; {x18 : (Int) | (x18 &gt;= 0) &amp;&amp; (x18 &gt;= n)}
-    -&gt; {x18 : (Int) | (x18 &gt;= 0) &amp;&amp; (x18 &gt;= n)})
--&gt; {x18 : (Int) | (x18 &gt;= 0) &amp;&amp; (x18 &gt;= n)}</span><span class='hs-varid'>loop</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == m) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>m</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>n</span></a></span><span class=hs-error> </span><span class=hs-error><span class='hs-layout'>(</span></span><span class=hs-error><a class=annot href="#"><span class=annottext>{x11 : (Int) | (x11 &gt;= 0) &amp;&amp; (x11 &lt; m)}
--&gt; x2:{x8 : (Int) | (x8 &gt;= 0) &amp;&amp; (x8 &gt;= n)}
--&gt; {x5 : (Int) | (x5 &gt; 0) &amp;&amp; (x5 &gt; x2) &amp;&amp; (x5 &gt; n) &amp;&amp; (x5 &gt;= 0)}</span><span class='hs-keyglyph'>\</span></a></span><span class=hs-error><span class='hs-keyword'>_</span></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= n)}</span><span class='hs-varid'>i</span></a></span><span class=hs-error> </span><span class=hs-error><span class='hs-keyglyph'>-&gt;</span></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == i) &amp;&amp; (x4 &gt;= 0) &amp;&amp; (x4 &gt;= n)}</span><span class='hs-varid'>i</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a></span><span class=hs-error><span class='hs-layout'>)</span></span>
-</pre>
-
-<br>
-
-
-- <div class="fragment">As property only holds after **last** loop iteration...</div>
-
-- <div class="fragment">... cannot instantiate `α` with `{v:Int | v = n + m}`</div>
-
-<div class="fragment">**Problem:** Need *iteration-dependent* invariants...</div>
-
diff --git a/docs/slides/plpv14/lhs/04_AbstractRefinements.lhs b/docs/slides/plpv14/lhs/04_AbstractRefinements.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/04_AbstractRefinements.lhs
+++ /dev/null
@@ -1,303 +0,0 @@
-  {#abstractrefinements}
-========================
-
-<div class="hidden">
-
-\begin{code}
-module AbstractRefinements where
-
-import Prelude 
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
-o, no        :: Int
-maxInt       :: Int -> Int -> Int
-\end{code}
-</div>
-
-
-
-Abstract Refinements
---------------------
-
-
-
-Abstract Refinements
-====================
-
-Two Problems
-------------
-
-<div class="fragment">
-
-**Problem 1:** 
-
-How do we specify *both* [increasing and decreasing lists](http://web.cecs.pdx.edu/~sheard/Code/QSort.html)?
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Problem 2:** 
-
-How do we specify *iteration-dependence* in higher-order functions?
-
-</div>
-
-
-Problem Is Pervasive
---------------------
-
-Lets distill it to a simple example...
-
-<div class="fragment">
-
-<br>
-
-(First, a few aliases)
-
-<br>
-
-\begin{code}
-{-@ type Odd  = {v:Int | (v mod 2) = 1} @-}
-{-@ type Even = {v:Int | (v mod 2) = 0} @-}
-\end{code}
-
-</div>
-
-
-Example: `maxInt` 
------------------
-
-Compute the larger of two `Int`s:
-
-\begin{code} <br> 
-maxInt     :: Int -> Int -> Int 
-maxInt x y = if y <= x then x else y
-\end{code}
-
-
-
-Example: `maxInt` 
------------------
-
-Has *many incomparable* refinement types
-
-\begin{code}<br>
-maxInt :: Nat  -> Nat  -> Nat
-maxInt :: Even -> Even -> Even
-maxInt :: Odd  -> Odd  -> Odd 
-\end{code}
-
-<br>
-
-<div class="fragment">Yikes. **Which** one should we use?</div>
-
-
-Refinement Polymorphism 
------------------------
-
-`maxInt` returns *one of* its two inputs `x` and `y` 
-
-<div align="center">
-
-<br>
-
----------   ---   -------------------------------------------
-   **If**    :    the *inputs* satisfy a property  
-
- **Then**    :    the *output* satisfies that property
----------   ---   -------------------------------------------
-
-<br>
-
-</div>
-
-<div class="fragment">Above holds *for all* properties!</div>
-
-<br>
-
-<div class="fragment"> 
-
-**Need to abstract refinements over types**
-
-</div>
-
-
-By Type Polymorphism?
----------------------
-
-\begin{code} <br> 
-max     :: α -> α -> α 
-max x y = if y <= x then x else y
-\end{code}
-
-<div class="fragment"> 
-
-Instantiate `α` at callsites
-
-\begin{code}
-{-@ o :: Odd  @-}
-o = maxInt 3 7     -- α := Odd
-
-{-@ e :: Even @-}
-e = maxInt 2 8     -- α := Even
-\end{code}
-
-</div>
-
-By Type Polymorphism?
----------------------
-
-\begin{code} <br> 
-max     :: α -> α -> α 
-max x y = if y <= x then x else y
-\end{code}
-
-<br>
-
-But there is a fly in the ointment ...
-
-Polymorphic `max` in Haskell
-----------------------------
-
-\begin{code} In Haskell the type of max is
-max :: (Ord α) => α -> α -> α
-\end{code}
-
-<br>
-
-\begin{code} Could *ignore* the class constraints, instantiate as before...
-{-@ o :: Odd @-}
-o     = max 3 7  -- α := Odd 
-\end{code}
-
-
-Polymorphic `(+)` in Haskell
-----------------------------
-
-\begin{code} ... but this is *unsound*!
-max :: (Ord α) => α -> α -> α
-(+) :: (Num α) => α -> α -> α
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-*Ignoring* class constraints would let us "prove":
-
-\begin{code}
-{-@ no :: Odd @-}
-no     = 3 + 7    -- α := Odd !
-\end{code}
-
-</div>
-
-Type Polymorphism? No.
-----------------------
-
-<div class="fragment">Need to try a bit harder...</div>
-
-By Parametric Refinements!
---------------------------
-
-That is, enable *quantification over refinements*...
-
-Parametric Refinements 
-----------------------
-
-\begin{code}
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-
-<div class="fragment">Type says: **for any** `p` that is a property of `Int`, </div>
-
-- <div class="fragment">`max` **takes** two `Int`s that satisfy `p`,</div>
-
-- <div class="fragment">`max` **returns** an `Int` that satisfies `p`.</div>
-
-Parametric Refinements 
-----------------------
-
-\begin{code}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-[Key idea: ](http://goto.ucsd.edu/~rjhala/papers/abstract_refinement_types.html) `Int<p>` is `{v:Int | (p v)}`
-
-<br>
-
-<div class="fragment">So, Abstract Refinement is an *uninterpreted function* in SMT logic</div>
-
-Parametric Refinements 
-----------------------
-
-\begin{code}<br>
-{-@ maxInt :: forall <p :: Int -> Prop>. 
-                Int<p> -> Int<p> -> Int<p>  @-}
-
-maxInt x y = if x <= y then y else x 
-\end{code}
-
-<br>
-
-**Check** and **Instantiate** type using *SMT & predicate abstraction*
-
-Using Abstract Refinements
---------------------------
-
-- <div class="fragment">**When** we call `maxInt` with args with some refinement,</div>
-
-- <div class="fragment">**Then** `p` instantiated with *same* refinement,</div>
-
-- <div class="fragment">**Result** of call will also have concrete refinement.</div>
-
-<div class="fragment">
-
-\begin{code}
-{-@ o' :: Odd  @-}
-o' = maxInt 3 7     -- p := \v -> Odd v 
-
-{-@ e' :: Even @-}
-e' = maxInt 2 8     -- p := \v -> Even v 
-\end{code}
-
-</div>
-
-Using Abstract Refinements
---------------------------
-
-Or any other property 
-
-<br>
-
-\begin{code}
-{-@ type RGB = {v:_ | (0 <= v && v < 256)} @-}
-
-{-@ rgb :: RGB @-}
-rgb = maxInt 56 8
-\end{code}
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. <div class="fragment">**Abstract:** Refinements over Type Signatures</div>
-
diff --git a/docs/slides/plpv14/lhs/04_AbstractRefinements.lhs.markdown b/docs/slides/plpv14/lhs/04_AbstractRefinements.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/04_AbstractRefinements.lhs.markdown
+++ /dev/null
@@ -1,317 +0,0 @@
-  {#abstractrefinements}
-========================
-
-<div class="hidden">
-
-
-<pre><span class=hs-linenum>7: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>AbstractRefinements</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>8: </span>
-<span class=hs-linenum>9: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> 
-<span class=hs-linenum>10: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>Liquid</span><span class='hs-varop'>.</span><span class='hs-conid'>Prelude</span>
-<span class=hs-linenum>11: </span><span class='hs-keyword'>{-@</span> <span class='hs-conid'>LIQUID</span> <span class='hs-str'>"--no-termination"</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>12: </span>
-<span class=hs-linenum>13: </span><span class='hs-definition'>o</span><span class='hs-layout'>,</span> <span class='hs-varid'>no</span>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>14: </span><span class='hs-definition'>maxInt</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-</pre>
-</div>
-
-
-
-Abstract Refinements
---------------------
-
-
-
-Abstract Refinements
-====================
-
-Two Problems
-------------
-
-<div class="fragment">
-
-**Problem 1:** 
-
-How do we specify *both* [increasing and decreasing lists](http://web.cecs.pdx.edu/~sheard/Code/QSort.html)?
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-**Problem 2:** 
-
-How do we specify *iteration-dependence* in higher-order functions?
-
-</div>
-
-
-Problem Is Pervasive
---------------------
-
-Lets distill it to a simple example...
-
-<div class="fragment">
-
-<br>
-
-(First, a few aliases)
-
-<br>
-
-
-<pre><span class=hs-linenum>64: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Odd</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-varid'>mod</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>65: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Even</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-varid'>mod</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-</div>
-
-
-Example: `maxInt` 
------------------
-
-Compute the larger of two `Int`s:
-
- <br> 
-<pre><span class=hs-linenum>77: </span><span class='hs-definition'>maxInt</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> 
-<span class=hs-linenum>78: </span><span class='hs-definition'>maxInt</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>y</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>y</span>
-</pre>
-
-
-
-Example: `maxInt` 
------------------
-
-Has *many incomparable* refinement types
-
-<br>
-<pre><span class=hs-linenum>89: </span><span class='hs-definition'>maxInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nat</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nat</span>
-<span class=hs-linenum>90: </span><span class='hs-definition'>maxInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Even</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Even</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Even</span>
-<span class=hs-linenum>91: </span><span class='hs-definition'>maxInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Odd</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Odd</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Odd</span> 
-</pre>
-
-<br>
-
-<div class="fragment">Yikes. **Which** one should we use?</div>
-
-
-Refinement Polymorphism 
------------------------
-
-`maxInt` returns *one of* its two inputs `x` and `y` 
-
-<div align="center">
-
-<br>
-
----------   ---   -------------------------------------------
-   **If**    :    the *inputs* satisfy a property  
-
- **Then**    :    the *output* satisfies that property
----------   ---   -------------------------------------------
-
-<br>
-
-</div>
-
-<div class="fragment">Above holds *for all* properties!</div>
-
-<br>
-
-<div class="fragment"> 
-
-**Need to abstract refinements over types**
-
-</div>
-
-
-By Type Polymorphism?
----------------------
-
- <br> 
-<pre><span class=hs-linenum>133: </span><span class='hs-definition'>max</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> 
-<span class=hs-linenum>134: </span><span class='hs-definition'>max</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>y</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>y</span>
-</pre>
-
-<div class="fragment"> 
-
-Instantiate `α` at callsites
-
-
-<pre><span class=hs-linenum>142: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Odd</span>  <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>143: </span><a class=annot href="#"><span class=annottext>{VV : (Int) | ((VV mod 2) == 1)}</span><span class='hs-definition'>o</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; Bool&gt;.
-{x3 : (Int)&lt;p&gt; | true}
--&gt; {x2 : (Int)&lt;p&gt; | true} -&gt; {x1 : (Int)&lt;p&gt; | true}</span><span class='hs-varid'>maxInt</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (7  :  int))}</span><span class='hs-num'>7</span></a>     <span class='hs-comment'>-- α := Odd</span>
-<span class=hs-linenum>144: </span>
-<span class=hs-linenum>145: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>e</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Even</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>146: </span><a class=annot href="#"><span class=annottext>{VV : (Int) | ((VV mod 2) == 0)}</span><span class='hs-definition'>e</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; Bool&gt;.
-{x3 : (Int)&lt;p&gt; | true}
--&gt; {x2 : (Int)&lt;p&gt; | true} -&gt; {x1 : (Int)&lt;p&gt; | true}</span><span class='hs-varid'>maxInt</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (8  :  int))}</span><span class='hs-num'>8</span></a>     <span class='hs-comment'>-- α := Even</span>
-</pre>
-
-</div>
-
-By Type Polymorphism?
----------------------
-
- <br> 
-<pre><span class=hs-linenum>155: </span><span class='hs-definition'>max</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> 
-<span class=hs-linenum>156: </span><span class='hs-definition'>max</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>y</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>y</span>
-</pre>
-
-<br>
-
-But there is a fly in the ointment ...
-
-Polymorphic `max` in Haskell
-----------------------------
-
- In Haskell the type of max is
-<pre><span class=hs-linenum>167: </span><span class='hs-definition'>max</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>α</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span>
-</pre>
-
-<br>
-
- Could *ignore* the class constraints, instantiate as before...
-<pre><span class=hs-linenum>173: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Odd</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>174: </span><span class='hs-definition'>o</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>max</span> <span class='hs-num'>3</span> <span class='hs-num'>7</span>  <span class='hs-comment'>-- α := Odd </span>
-</pre>
-
-
-Polymorphic `(+)` in Haskell
-----------------------------
-
- ... but this is *unsound*!
-<pre><span class=hs-linenum>182: </span><span class='hs-definition'>max</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>α</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span>
-<span class=hs-linenum>183: </span><span class='hs-layout'>(</span><span class='hs-varop'>+</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Num</span> <span class='hs-varid'>α</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-
-*Ignoring* class constraints would let us "prove":
-
-
-<pre><span class=hs-linenum>193: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>no</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Odd</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>194: </span><a class=annot href="#"><span class=annottext>{VV : (Int) | ((VV mod 2) == 1)}</span><span class='hs-definition'>no</span></a>     <span class='hs-keyglyph'>=</span> <span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (7  :  int))}</span><span class='hs-num'>7</span></a></span>    <span class='hs-comment'>-- α := Odd !</span>
-</pre>
-
-</div>
-
-Type Polymorphism? No.
-----------------------
-
-<div class="fragment">Need to try a bit harder...</div>
-
-By Parametric Refinements!
---------------------------
-
-That is, enable *quantification over refinements*...
-
-Parametric Refinements 
-----------------------
-
-
-<pre><span class=hs-linenum>213: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>maxInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span> 
-<span class=hs-linenum>214: </span>                <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span>  <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>215: </span>
-<span class=hs-linenum>216: </span><a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; Bool&gt;.
-{VV : (Int)&lt;p&gt; | true}
--&gt; {VV : (Int)&lt;p&gt; | true} -&gt; {VV : (Int)&lt;p&gt; | true}</span><span class='hs-definition'>maxInt</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | ((papp1 p VV))}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | ((papp1 p VV))}</span><span class='hs-varid'>y</span></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | ((papp1 p x3)) &amp;&amp; (x3 == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x1:{x6 : (Int) | ((papp1 p x6))}
--&gt; x2:{x6 : (Int) | ((papp1 p x6))}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt;= x2))}</span><span class='hs-varop'>&lt;=</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | ((papp1 p x3)) &amp;&amp; (x3 == y)}</span><span class='hs-varid'>y</span></a> <span class='hs-keyword'>then</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | ((papp1 p x3)) &amp;&amp; (x3 == y)}</span><span class='hs-varid'>y</span></a> <span class='hs-keyword'>else</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | ((papp1 p x3)) &amp;&amp; (x3 == x)}</span><span class='hs-varid'>x</span></a> 
-</pre>
-
-<br>
-
-
-<div class="fragment">Type says: **for any** `p` that is a property of `Int`, </div>
-
-- <div class="fragment">`max` **takes** two `Int`s that satisfy `p`,</div>
-
-- <div class="fragment">`max` **returns** an `Int` that satisfies `p`.</div>
-
-Parametric Refinements 
-----------------------
-
-<br>
-<pre><span class=hs-linenum>232: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>maxInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span> 
-<span class=hs-linenum>233: </span>                <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span>  <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>234: </span>
-<span class=hs-linenum>235: </span><span class='hs-definition'>maxInt</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>x</span> 
-</pre>
-
-<br>
-
-[Key idea: ](http://goto.ucsd.edu/~rjhala/papers/abstract_refinement_types.html) `Int<p>` is `{v:Int | (p v)}`
-
-<br>
-
-<div class="fragment">So, Abstract Refinement is an *uninterpreted function* in SMT logic</div>
-
-Parametric Refinements 
-----------------------
-
-<br>
-<pre><span class=hs-linenum>250: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>maxInt</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span> 
-<span class=hs-linenum>251: </span>                <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span>  <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>252: </span>
-<span class=hs-linenum>253: </span><span class='hs-definition'>maxInt</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>x</span> 
-</pre>
-
-<br>
-
-**Check** and **Instantiate** type using *SMT & predicate abstraction*
-
-Using Abstract Refinements
---------------------------
-
-- <div class="fragment">**When** we call `maxInt` with args with some refinement,</div>
-
-- <div class="fragment">**Then** `p` instantiated with *same* refinement,</div>
-
-- <div class="fragment">**Result** of call will also have concrete refinement.</div>
-
-<div class="fragment">
-
-
-<pre><span class=hs-linenum>272: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>o'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Odd</span>  <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>273: </span><a class=annot href="#"><span class=annottext>{VV : (Int) | ((VV mod 2) == 1)}</span><span class='hs-definition'>o'</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; Bool&gt;.
-{x3 : (Int)&lt;p&gt; | true}
--&gt; {x2 : (Int)&lt;p&gt; | true} -&gt; {x1 : (Int)&lt;p&gt; | true}</span><span class='hs-varid'>maxInt</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (7  :  int))}</span><span class='hs-num'>7</span></a>     <span class='hs-comment'>-- p := \v -&gt; Odd v </span>
-<span class=hs-linenum>274: </span>
-<span class=hs-linenum>275: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>e'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Even</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>276: </span><a class=annot href="#"><span class=annottext>{VV : (Int) | ((VV mod 2) == 0)}</span><span class='hs-definition'>e'</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; Bool&gt;.
-{x3 : (Int)&lt;p&gt; | true}
--&gt; {x2 : (Int)&lt;p&gt; | true} -&gt; {x1 : (Int)&lt;p&gt; | true}</span><span class='hs-varid'>maxInt</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (8  :  int))}</span><span class='hs-num'>8</span></a>     <span class='hs-comment'>-- p := \v -&gt; Even v </span>
-</pre>
-
-</div>
-
-Using Abstract Refinements
---------------------------
-
-Or any other property 
-
-<br>
-
-
-<pre><span class=hs-linenum>289: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>RGB</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>v</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>256</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>290: </span>
-<span class=hs-linenum>291: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>rgb</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RGB</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>292: </span><a class=annot href="#"><span class=annottext>{v : (Int) | (v &lt; 256) &amp;&amp; (0 &lt;= v)}</span><span class='hs-definition'>rgb</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; Bool&gt;.
-{x3 : (Int)&lt;p&gt; | true}
--&gt; {x2 : (Int)&lt;p&gt; | true} -&gt; {x1 : (Int)&lt;p&gt; | true}</span><span class='hs-varid'>maxInt</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (56  :  int))}</span><span class='hs-num'>56</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (8  :  int))}</span><span class='hs-num'>8</span></a>
-</pre>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. <div class="fragment">**Abstract:** Refinements over Type Signatures</div>
-
diff --git a/docs/slides/plpv14/lhs/05_Composition.lhs b/docs/slides/plpv14/lhs/05_Composition.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/05_Composition.lhs
+++ /dev/null
@@ -1,161 +0,0 @@
-Abstract Refinements {#composition}
-===================================
-
-Very General Mechanism 
-----------------------
-
-**Next:** Lets add parameters...
-
-<div class="hidden">
-\begin{code}
-module Composition where
-
-import Prelude hiding ((.))
-
-plus     :: Int -> Int -> Int
-plus3'   :: Int -> Int
-\end{code}
-</div>
-
-
-Example: `plus`
----------------
-
-\begin{code}
-{-@ plus :: x:_ -> y:_ -> {v:_ | v=x+y} @-}
-plus x y = x + y
-\end{code}
-
-
-Example: `plus 3` 
------------------
-
-<br>
-
-\begin{code}
-{-@ plus3' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3'     = plus 3
-\end{code}
-
-<br>
-
-Easily verified by LiquidHaskell
-
-A Composed Variant
-------------------
-
-Lets define `plus3` by *composition*
-
-A Composition Operator 
-----------------------
-
-\begin{code}
-(#) :: (b -> c) -> (a -> b) -> a -> c
-(#) f g x = f (g x)
-\end{code}
-
-
-`plus3` By Composition
------------------------
-
-\begin{code}
-{-@ plus3'' :: x:Int -> {v:Int | v = x + 3} @-}
-plus3''     = plus 1 # plus 2
-\end{code}
-
-<br>
-
-Yikes! Verification *fails*. But why?
-
-<br>
-
-<div class="fragment">(Hover mouse over `#` for a clue)</div>
-
-How to type compose (#) ? 
--------------------------
-
-This specification is *too weak* <br>
-
-\begin{code} <br>
-(#) :: (b -> c) -> (a -> b) -> (a -> c)
-\end{code}
-
-<br>
-
-Output type does not *relate* `c` with `a`!
-
-How to type compose (.) ?
--------------------------
-
-Write specification with abstract refinement type:
-
-<br>
-
-\begin{code}
-{-@ (.) :: forall <p :: b->c->Prop, 
-                   q :: a->b->Prop>.
-             f:(x:b -> c<p x>) 
-          -> g:(x:a -> b<q x>) 
-          -> y:a -> exists[z:b<q y>].c<p z>
- @-}
-(.) f g y = f (g y)
-\end{code}
-
-Using (.) Operator 
-------------------
-
-<br>
-
-\begin{code}
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br>
-
-<div class="fragment">*Verifies!*</div>
-
-
-Using (.) Operator 
-------------------
-
-\begin{code} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br>
-
-LiquidHaskell *instantiates*
-
-- `p` with `\x -> v = x + 1`
-- `q` with `\x -> v = x + 2`
-
-Using (.) Operator 
-------------------
-
-\begin{code} <br>
-{-@ plus3 :: x:Int -> {v:Int | v = x + 3} @-}
-plus3     = plus 1 . plus 2
-\end{code}
-
-<br> To *infer* that output of `plus3` has type: 
-
-`exists [z:{v = y + 2}].{v = z + 1}`
-
-<div class="fragment">
-
-`<:`
-
-`{v:Int|v=3}`
-</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract:** Refinements over Type Signatures
-    + <div class="fragment">*Dependencies* using refinement parameters</div>
diff --git a/docs/slides/plpv14/lhs/05_Composition.lhs.markdown b/docs/slides/plpv14/lhs/05_Composition.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/05_Composition.lhs.markdown
+++ /dev/null
@@ -1,169 +0,0 @@
-Abstract Refinements {#composition}
-===================================
-
-Very General Mechanism 
-----------------------
-
-**Next:** Lets add parameters...
-
-<div class="hidden">
-
-<pre><span class=hs-linenum>11: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>Composition</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>12: </span>
-<span class=hs-linenum>13: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>.</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>14: </span>
-<span class=hs-linenum>15: </span><span class='hs-definition'>plus</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>16: </span><span class='hs-definition'>plus3'</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-</pre>
-</div>
-
-
-Example: `plus`
----------------
-
-
-<pre><span class=hs-linenum>25: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>plus</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyword'>_</span> <span class='hs-keyword'>| v=x+y}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>26: </span><a class=annot href="#"><span class=annottext>x:(Int) -&gt; y:(Int) -&gt; {v : (Int) | (v == (x + y))}</span><span class='hs-definition'>plus</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>y</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == y)}</span><span class='hs-varid'>y</span></a>
-</pre>
-
-
-Example: `plus 3` 
------------------
-
-<br>
-
-
-<pre><span class=hs-linenum>36: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>plus3'</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span> <span class='hs-keyword'>| v = x + 3}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>37: </span><a class=annot href="#"><span class=annottext>x:(Int) -&gt; {VV : (Int) | (VV == (x + 3))}</span><span class='hs-definition'>plus3'</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x2 : (Int) | (x2 == (x1 + x2))}</span><span class='hs-varid'>plus</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a>
-</pre>
-
-<br>
-
-Easily verified by LiquidHaskell
-
-A Composed Variant
-------------------
-
-Lets define `plus3` by *composition*
-
-A Composition Operator 
-----------------------
-
-
-<pre><span class=hs-linenum>53: </span><span class='hs-layout'>(</span><span class='hs-cpp'>#</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span>
-<span class=hs-linenum>54: </span><a class=annot href="#"><span class=annottext>forall a b c. (a -&gt; b) -&gt; (c -&gt; a) -&gt; c -&gt; b</span><span class='hs-layout'>(</span></a><span class='hs-cpp'>#</span><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>a -&gt; b</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>a -&gt; b</span><span class='hs-varid'>g</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>x</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>a -&gt; b</span><span class='hs-varid'>f</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>a -&gt; b</span><span class='hs-varid'>g</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a><span class='hs-layout'>)</span>
-</pre>
-
-
-`plus3` By Composition
------------------------
-
-
-<pre><span class=hs-linenum>62: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>plus3''</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span> <span class='hs-keyword'>| v = x + 3}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>63: </span><a class=annot href="#"><span class=annottext>x:(Int) -&gt; {VV : (Int) | (VV == (x + 3))}</span><span class='hs-definition'>plus3''</span></a>     <span class='hs-keyglyph'>=</span> <span class=hs-error><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x2 : (Int) | (x2 == (x1 + x2))}</span><span class='hs-varid'>plus</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>((Int) -&gt; (Int)) -&gt; ((Int) -&gt; (Int)) -&gt; (Int) -&gt; (Int)</span><span class='hs-cpp'>#</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x2 : (Int) | (x2 == (x1 + x2))}</span><span class='hs-varid'>plus</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a></span>
-</pre>
-
-<br>
-
-Yikes! Verification *fails*. But why?
-
-<br>
-
-<div class="fragment">(Hover mouse over `#` for a clue)</div>
-
-How to type compose (#) ? 
--------------------------
-
-This specification is *too weak* <br>
-
- <br>
-<pre><span class=hs-linenum>80: </span><span class='hs-layout'>(</span><span class='hs-cpp'>#</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-Output type does not *relate* `c` with `a`!
-
-How to type compose (.) ?
--------------------------
-
-Write specification with abstract refinement type:
-
-<br>
-
-
-<pre><span class=hs-linenum>95: </span><span class='hs-keyword'>{-@</span> <span class='hs-layout'>(</span><span class='hs-varop'>.</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>b</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>c</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-conid'>Prop</span><span class='hs-layout'>,</span> 
-<span class=hs-linenum>96: </span>                   <span class='hs-varid'>q</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>b</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span>
-<span class=hs-linenum>97: </span>             <span class='hs-varid'>f</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>x</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>98: </span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>g</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>q</span> <span class='hs-varid'>x</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>99: </span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>exists</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>z</span><span class='hs-conop'>:</span><span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>q</span> <span class='hs-varid'>y</span><span class='hs-varop'>&gt;</span><span class='hs-keyglyph'>]</span><span class='hs-varop'>.</span><span class='hs-varid'>c</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>z</span><span class='hs-varop'>&gt;</span>
-<span class=hs-linenum>100: </span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>101: </span><a class=annot href="#"><span class=annottext>forall a b c &lt;p :: b-&gt; a-&gt; Bool, q :: c-&gt; b-&gt; Bool&gt;.
-(x:b -&gt; {VV : a&lt;p x&gt; | true})
--&gt; (x:c -&gt; {VV : b&lt;q x&gt; | true})
--&gt; y:c
--&gt; exists [z:{VV : b&lt;q y&gt; | true}].{VV : a&lt;p z&gt; | true}</span><span class='hs-layout'>(</span></a><span class='hs-varop'>.</span><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>x:a -&gt; {VV : b | ((papp2 p VV x))}</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>x:a -&gt; {VV : b | ((papp2 q VV x))}</span><span class='hs-varid'>g</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>y</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:a -&gt; {VV : b | ((papp2 p VV x1))}</span><span class='hs-varid'>f</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:a -&gt; {VV : b | ((papp2 q VV x1))}</span><span class='hs-varid'>g</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a><span class='hs-layout'>)</span>
-</pre>
-
-Using (.) Operator 
-------------------
-
-<br>
-
-
-<pre><span class=hs-linenum>110: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>plus3</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span> <span class='hs-keyword'>| v = x + 3}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>111: </span><a class=annot href="#"><span class=annottext>x:(Int) -&gt; {VV : (Int) | (VV == (x + 3))}</span><span class='hs-definition'>plus3</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x2 : (Int) | (x2 == (x1 + x2))}</span><span class='hs-varid'>plus</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a> <a class=annot href="#"><span class=annottext>forall &lt;q :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool, p :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-(x:(Int) -&gt; {x8 : (Int)&lt;p x&gt; | true})
--&gt; (x:(Int) -&gt; {x9 : (Int)&lt;q x&gt; | true})
--&gt; x3:(Int)
--&gt; exists [z:{x9 : (Int)&lt;q x3&gt; | true}].{x8 : (Int)&lt;p z&gt; | true}</span><span class='hs-varop'>.</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x2 : (Int) | (x2 == (x1 + x2))}</span><span class='hs-varid'>plus</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">*Verifies!*</div>
-
-
-Using (.) Operator 
-------------------
-
- <br>
-<pre><span class=hs-linenum>123: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>plus3</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span> <span class='hs-keyword'>| v = x + 3}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>124: </span><span class='hs-definition'>plus3</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>plus</span> <span class='hs-num'>1</span> <span class='hs-varop'>.</span> <span class='hs-varid'>plus</span> <span class='hs-num'>2</span>
-</pre>
-
-<br>
-
-LiquidHaskell *instantiates*
-
-- `p` with `\x -> v = x + 1`
-- `q` with `\x -> v = x + 2`
-
-Using (.) Operator 
-------------------
-
- <br>
-<pre><span class=hs-linenum>138: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>plus3</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span> <span class='hs-keyword'>| v = x + 3}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>139: </span><span class='hs-definition'>plus3</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>plus</span> <span class='hs-num'>1</span> <span class='hs-varop'>.</span> <span class='hs-varid'>plus</span> <span class='hs-num'>2</span>
-</pre>
-
-<br> To *infer* that output of `plus3` has type: 
-
-`exists [z:{v = y + 2}].{v = z + 1}`
-
-<div class="fragment">
-
-`<:`
-
-`{v:Int|v=3}`
-</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract:** Refinements over Type Signatures
-    + <div class="fragment">*Dependencies* using refinement parameters</div>
diff --git a/docs/slides/plpv14/lhs/06_Inductive.lhs b/docs/slides/plpv14/lhs/06_Inductive.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/06_Inductive.lhs
+++ /dev/null
@@ -1,464 +0,0 @@
-Abstract Refinements {#induction}
-=================================
-
-Induction
----------
-
-Encoding *induction* with Abstract refinements
-
-<div class="hidden">
-
-\begin{code}
-module Loop where
-import Prelude hiding ((!!), foldr, length, (++))
--- import Measures
-import Language.Haskell.Liquid.Prelude
-{-@ LIQUID "--no-termination" @-}
-
-{-@ measure llen  :: (L a) -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)  @-}
-
-size  :: L a -> Int
-add   :: Int -> Int -> Int
-loop  :: Int -> Int -> α -> (Int -> α -> α) -> α
-foldr :: (L a -> a -> b -> b) -> b -> L a -> b
-\end{code}
-</div>
-
-Induction
-=========
-
-Example: `loop` redux 
----------------------
-
-Recall the *higher-order* `loop` 
-
-<br>
-
-\begin{code}
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-**Problem**
-
-- As property only holds after *last* loop iteration...
-
-- ... cannot instantiate `α` with `{v:Int | v = n + m}`
-
-</div>
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-**Problem** 
-
-Need invariant relating *iteration* `i` with *accumulator* `acc`
-
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
-\begin{code} <br>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat|v=m+n} @-}
-add n m = loop 0 m n (\_ i -> i + 1)
-\end{code}
-
-<br>
-
-**Solution** 
-
-- Abstract Refinement `p :: Int -> a -> Prop`
-
-- `(p i acc)` relates *iteration* `i` with *accumulator* `acc`
-
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-<div class="fragment">
-<div align="center">
-
-------------  ---   ----------------------------
-  **Assume**   :    `out = loop lo hi base f` 
-
-   **Prove**   :    `(p hi out)`
-------------  ---   ----------------------------
-
-</div>
-</div>
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**Base Case** Initial accumulator `base` satisfies invariant
-
-
-`(p base lo)`   
-
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**Inductive Step** `f` *preserves* invariant at `i`
-
-
-`(p acc i) => (p (f i acc) (i + 1))`
-
-Induction in `loop` (by hand)
------------------------------
-
-\begin{code} <br> 
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-\end{code}
-
-<br>
-
-**"By Induction"** `out` satisfies invariant at `hi` 
-
-`(p out hi)`
-
-
-Induction in `loop` (by type)
------------------------------
-
-Induction is an **abstract refinement type** for `loop` 
-
-<br>
-
-\begin{code}
-{-@ loop :: forall a <p :: Int -> a -> Prop>.
-        lo:Int 
-     -> hi:{v:Int|lo <= v}
-     -> base:a<p lo>                      
-     -> f:(i:Int -> a<p i> -> a<p (i+1)>) 
-     -> a<p hi>                           @-}
-\end{code}
-
-<br>
-
-Induction in `loop` (by type)
------------------------------
-
-`p` is the *index dependent* invariant!
-
-
-\begin{code}<br> 
-p    :: Int -> a -> Prop             -- invt 
-base :: a<p lo>                      -- base 
-f    :: i:Int -> a<p i> -> a<p(i+1)> -- step
-out  :: a<p hi>                      -- goal
-\end{code}
-
-
-
-Using Induction
----------------
-
-\begin{code}
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br>
-
-**Verified** by instantiating the abstract refinement of `loop`
-
-`p := \i acc -> acc = i + n`
-
-
-Using Induction
----------------
-
-\begin{code} <div/>
-{-@ add :: n:Nat -> m:Nat -> {v:Nat| v=m+n} @-}
-add n m = loop 0 m n (\_ z -> z + 1)
-\end{code}
-
-<br>
-
-Verified by instantiating `p := \i acc -> acc = i + n`
-
-- <div class="fragment">**Base:**  `n = 0 + n`</div>
-
-- <div class="fragment">**Step:**  `acc = i + n  =>  acc + 1 = (i + 1) + n`</div>
-
-- <div class="fragment">**Goal:**  `out = m + n`</div>
-
-
-Generalizes To Structures 
--------------------------
-
-Same idea applies for induction over *structures* ...
-
-
-Structural Induction
-====================
-
-Example: Lists
---------------
-
-<br>
-
-\begin{code}
-data L a = N 
-         | C a (L a)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets write a generic loop over such lists ...
-</div>
-
-Example: `foldr`
-----------------
-
-\begin{code} <br>
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets brace ourselves for the type...
-</div>
-
-Example: `foldr`
-----------------
-
-\begin{code}
-{-@ foldr :: 
-    forall a b <p :: L a -> b -> Prop>. 
-      (xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)>) 
-    -> b<p N> 
-    -> ys:L a
-    -> b<p ys>                            @-}
-foldr f b N        = b
-foldr f b (C x xs) = f xs x (foldr f b xs)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Lets step through the type...
-</div>
-
-
-`foldr`: Abstract Refinement
-----------------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  ::  b<p ys>                            
-\end{code}
-
-<br>
-
-`(p xs b)` relates `b` with folded `xs`
-
-`p :: L a -> b -> Prop`
-
-
-`foldr`: Base Case
-------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-`base` is related to empty list `N`
-
-`base :: b<p N>` states 
-
-
-
-`foldr`: Ind. Step 
-------------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-`step` extends relation from `xs` to `C x xs`
-
-`step :: xs:L a -> x:a -> b<p xs> -> b<p(C x xs)>`
-
-
-`foldr`: Output
----------------
-
-\begin{code} <div/>
-p    :: L a -> b -> Prop   
-step :: xs:_ -> x:_ -> b<p xs> -> b<p(C x xs)> 
-base :: b<p N> 
-ys   :: L a
-out  :: b<p ys>                            
-\end{code}
-
-<br>
-
-Relation holds between `out` and input list `ys`
-
-`out :: b<p ys>`
-
-Using `foldr`: Size
--------------------
-
-We can now verify <br>
-
-\begin{code}
-{-@ size :: xs:_ -> {v:Int| v = (llen xs)} @-}
-size     = foldr (\_ _ n -> n + 1) 0
-\end{code}
-
-<br>
-
-<div class="fragment">
-Verified by automatically instantiating 
-
-`p := \xs acc -> acc = (llen xs)`
-</div>
-
-Using `foldr`: Append
----------------------
-
-\begin{code}
-{-@ (++) :: xs:_ -> ys:_ -> (Cat a xs ys) @-} 
-xs ++ ys = foldr (\_ -> C) ys xs 
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-where the alias `Cat` is:
-
-<br>
-
-\begin{code}
-{-@ type Cat a X Y = 
-    {v:L a|(llen v) = (llen X) + (llen Y)} @-}
-\end{code}
-
-</div>
-
-Using `foldr`: Append
----------------------
-
-\begin{code} <div/>
-{-@ (++) :: xs:_ -> ys:_ -> (Cat a xs ys) @-} 
-xs ++ ys = foldr (\_ -> C) ys xs 
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-Verified by automatically instantiating 
-
-`p := \xs acc -> llen acc = llen xs + llen ys`
-
-</div>
-
-Recap
------
-
-Abstract refinements decouple *invariant* from *traversal*
-
-<br>
-
-+ <div class="fragment">*reusable* specifications for higher-order functions.</div>
-
-+ <div class="fragment">*automatic* checking and instantiation by SMT.</div>
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract:** Refinements over Type Signatures
-    + *Dependencies*
-    + <div class="fragment">*Induction*</div>
diff --git a/docs/slides/plpv14/lhs/06_Inductive.lhs.markdown b/docs/slides/plpv14/lhs/06_Inductive.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/06_Inductive.lhs.markdown
+++ /dev/null
@@ -1,535 +0,0 @@
-Abstract Refinements {#induction}
-=================================
-
-Induction
----------
-
-Encoding *induction* with Abstract refinements
-
-<div class="hidden">
-
-
-<pre><span class=hs-linenum>12: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>Loop</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>13: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>!!</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldr</span><span class='hs-layout'>,</span> <span class='hs-varid'>length</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>14: </span><span class='hs-comment'>-- import Measures</span>
-<span class=hs-linenum>15: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>Liquid</span><span class='hs-varop'>.</span><span class='hs-conid'>Prelude</span>
-<span class=hs-linenum>16: </span><span class='hs-keyword'>{-@</span> <span class='hs-conid'>LIQUID</span> <span class='hs-str'>"--no-termination"</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>17: </span>
-<span class=hs-linenum>18: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>measure</span> <span class='hs-varid'>llen</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>19: </span>    <span class='hs-varid'>llen</span> <span class='hs-layout'>(</span><span class='hs-conid'>N</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
-<span class=hs-linenum>20: </span>    <span class='hs-varid'>llen</span> <span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>  <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>21: </span>
-<span class=hs-linenum>22: </span><span class='hs-definition'>size</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>23: </span><span class='hs-definition'>add</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>24: </span><span class='hs-definition'>loop</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>α</span>
-<span class=hs-linenum>25: </span><span class='hs-definition'>foldr</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span>
-</pre>
-</div>
-
-Induction
-=========
-
-Example: `loop` redux 
----------------------
-
-Recall the *higher-order* `loop` 
-
-<br>
-
-
-<pre><span class=hs-linenum>40: </span><a class=annot href="#"><span class=annottext>forall a &lt;p :: (GHC.Types.Int)-&gt; a-&gt; Bool&gt;.
-lo:(Int)
--&gt; hi:{VV : (Int) | (lo &lt;= VV)}
--&gt; {VV : a&lt;p lo&gt; | true}
--&gt; (i:(Int)
-    -&gt; {VV : a&lt;p i&gt; | true}
-    -&gt; forall [ex:{VV : (Int) | (VV == (i + 1))}].{VV : a&lt;p ex&gt; | true})
--&gt; {VV : a&lt;p hi&gt; | true}</span><span class='hs-definition'>loop</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>lo</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (lo &lt;= VV)}</span><span class='hs-varid'>hi</span></a> <a class=annot href="#"><span class=annottext>{VV : a | ((papp2 p VV lo))}</span><span class='hs-varid'>base</span></a> <a class=annot href="#"><span class=annottext>i:(Int)
--&gt; {VV : a | ((papp2 p VV i))}
--&gt; forall [ex:{VV : (Int) | (VV == (i + 1))}].{VV : a | ((papp2 p VV ex))}</span><span class='hs-varid'>f</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x4 : (Int) | (x4 &gt;= lo) &amp;&amp; (lo &lt;= x4) &amp;&amp; (x4 &lt;= hi)}
--&gt; {VV : a | ((papp2 p VV x1))} -&gt; {VV : a | ((papp2 p VV hi))}</span><span class='hs-varid'>go</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == lo)}</span><span class='hs-varid'>lo</span></a> <a class=annot href="#"><span class=annottext>{VV : a | ((papp2 p VV lo)) &amp;&amp; (VV == base)}</span><span class='hs-varid'>base</span></a>
-<span class=hs-linenum>41: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>42: </span>    <a class=annot href="#"><span class=annottext>i:{VV : (Int) | (VV &gt;= lo) &amp;&amp; (VV &lt;= hi) &amp;&amp; (lo &lt;= VV)}
--&gt; {VV : a | ((papp2 p VV i))} -&gt; {VV : a | ((papp2 p VV hi))}</span><span class='hs-varid'>go</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= lo) &amp;&amp; (VV &lt;= hi) &amp;&amp; (lo &lt;= VV)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>{VV : a | ((papp2 p VV i))}</span><span class='hs-varid'>acc</span></a> 
-<span class=hs-linenum>43: </span>      <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == i) &amp;&amp; (x5 &gt;= lo) &amp;&amp; (lo &lt;= x5) &amp;&amp; (x5 &lt;= hi)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>x1:{x14 : (Int) | (x14 &gt;= i) &amp;&amp; (x14 &gt;= lo) &amp;&amp; (i &lt;= x14) &amp;&amp; (lo &lt;= x14) &amp;&amp; (x14 &lt;= hi)}
--&gt; x2:{x14 : (Int) | (x14 &gt;= i) &amp;&amp; (x14 &gt;= lo) &amp;&amp; (i &lt;= x14) &amp;&amp; (lo &lt;= x14) &amp;&amp; (x14 &lt;= hi)}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>&lt;</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == hi) &amp;&amp; (lo &lt;= x3)}</span><span class='hs-varid'>hi</span></a>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>i:{VV : (Int) | (VV &gt;= lo) &amp;&amp; (VV &lt;= hi) &amp;&amp; (lo &lt;= VV)}
--&gt; {VV : a | ((papp2 p VV i))} -&gt; {VV : a | ((papp2 p VV hi))}</span><span class='hs-varid'>go</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == i) &amp;&amp; (x5 &gt;= lo) &amp;&amp; (lo &lt;= x5) &amp;&amp; (x5 &lt;= hi)}</span><span class='hs-varid'>i</span></a><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:(Int)
--&gt; {VV : a | ((papp2 p VV x1))}
--&gt; forall [ex:{VV : (Int) | (VV == (x1 + 1))}].{VV : a | ((papp2 p VV ex))}</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == i) &amp;&amp; (x5 &gt;= lo) &amp;&amp; (lo &lt;= x5) &amp;&amp; (x5 &lt;= hi)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>{VV : a | ((papp2 p VV i)) &amp;&amp; (VV == acc)}</span><span class='hs-varid'>acc</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>44: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | ((papp2 p VV i)) &amp;&amp; (VV == acc)}</span><span class='hs-varid'>acc</span></a>
-</pre>
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
- <br>
-<pre><span class=hs-linenum>53: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>add</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span><span class='hs-keyword'>|v=m+n}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>54: </span><span class='hs-definition'>add</span> <span class='hs-varid'>n</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-num'>0</span> <span class='hs-varid'>m</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-
-**Problem**
-
-- As property only holds after *last* loop iteration...
-
-- ... cannot instantiate `α` with `{v:Int | v = n + m}`
-
-</div>
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
- <br>
-<pre><span class=hs-linenum>75: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>add</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span><span class='hs-keyword'>|v=m+n}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>76: </span><span class='hs-definition'>add</span> <span class='hs-varid'>n</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-num'>0</span> <span class='hs-varid'>m</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-**Problem** 
-
-Need invariant relating *iteration* `i` with *accumulator* `acc`
-
-
-Iteration Dependence
---------------------
-
-We used `loop` to write 
-
- <br>
-<pre><span class=hs-linenum>92: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>add</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span><span class='hs-keyword'>|v=m+n}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>93: </span><span class='hs-definition'>add</span> <span class='hs-varid'>n</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-num'>0</span> <span class='hs-varid'>m</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>i</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-**Solution** 
-
-- Abstract Refinement `p :: Int -> a -> Prop`
-
-- `(p i acc)` relates *iteration* `i` with *accumulator* `acc`
-
-
-
-Induction in `loop` (by hand)
------------------------------
-
- <br> 
-<pre><span class=hs-linenum>110: </span><span class='hs-definition'>loop</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>hi</span> <span class='hs-varid'>base</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>base</span>
-<span class=hs-linenum>111: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>112: </span>    <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-varid'>acc</span> 
-<span class=hs-linenum>113: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>hi</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>i</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>114: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>acc</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-<div align="center">
-
-------------  ---   ----------------------------
-  **Assume**   :    `out = loop lo hi base f` 
-
-   **Prove**   :    `(p hi out)`
-------------  ---   ----------------------------
-
-</div>
-</div>
-
-
-Induction in `loop` (by hand)
------------------------------
-
- <br> 
-<pre><span class=hs-linenum>136: </span><span class='hs-definition'>loop</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>hi</span> <span class='hs-varid'>base</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>base</span>
-<span class=hs-linenum>137: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>138: </span>    <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-varid'>acc</span> 
-<span class=hs-linenum>139: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>hi</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>i</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>140: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>acc</span>
-</pre>
-
-<br>
-
-**Base Case** Initial accumulator `base` satisfies invariant
-
-
-`(p base lo)`   
-
-
-Induction in `loop` (by hand)
------------------------------
-
- <br> 
-<pre><span class=hs-linenum>155: </span><span class='hs-definition'>loop</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>hi</span> <span class='hs-varid'>base</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>base</span>
-<span class=hs-linenum>156: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>157: </span>    <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-varid'>acc</span> 
-<span class=hs-linenum>158: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>hi</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>i</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>159: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>acc</span>
-</pre>
-
-<br>
-
-**Inductive Step** `f` *preserves* invariant at `i`
-
-
-`(p acc i) => (p (f i acc) (i + 1))`
-
-Induction in `loop` (by hand)
------------------------------
-
- <br> 
-<pre><span class=hs-linenum>173: </span><span class='hs-definition'>loop</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>hi</span> <span class='hs-varid'>base</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>base</span>
-<span class=hs-linenum>174: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>175: </span>    <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-varid'>acc</span> 
-<span class=hs-linenum>176: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>i</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>hi</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>i</span> <span class='hs-varid'>acc</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>177: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>acc</span>
-</pre>
-
-<br>
-
-**"By Induction"** `out` satisfies invariant at `hi` 
-
-`(p out hi)`
-
-
-Induction in `loop` (by type)
------------------------------
-
-Induction is an **abstract refinement type** for `loop` 
-
-<br>
-
-
-<pre><span class=hs-linenum>195: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>loop</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span>
-<span class=hs-linenum>196: </span>        <span class='hs-varid'>lo</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> 
-<span class=hs-linenum>197: </span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>hi</span><span class='hs-conop'>:</span><span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span><span class='hs-keyword'>|lo &lt;= v}</span>
-<span class=hs-linenum>198: </span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>base</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>lo</span><span class='hs-varop'>&gt;</span>                      
-<span class=hs-linenum>199: </span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>i</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>200: </span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>hi</span><span class='hs-varop'>&gt;</span>                           <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-Induction in `loop` (by type)
------------------------------
-
-`p` is the *index dependent* invariant!
-
-
-<br> 
-<pre><span class=hs-linenum>212: </span><span class='hs-definition'>p</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>             <span class='hs-comment'>-- invt </span>
-<span class=hs-linenum>213: </span><span class='hs-definition'>base</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>lo</span><span class='hs-varop'>&gt;</span>                      <span class='hs-comment'>-- base </span>
-<span class=hs-linenum>214: </span><span class='hs-definition'>f</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varid'>i</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>i</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>&gt;</span> <span class='hs-comment'>-- step</span>
-<span class=hs-linenum>215: </span><span class='hs-definition'>out</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>hi</span><span class='hs-varop'>&gt;</span>                      <span class='hs-comment'>-- goal</span>
-</pre>
-
-
-
-Using Induction
----------------
-
-
-<pre><span class=hs-linenum>224: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>add</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span><span class='hs-keyword'>| v=m+n}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>225: </span><a class=annot href="#"><span class=annottext>n:{VV : (Int) | (VV &gt;= 0)}
--&gt; m:{VV : (Int) | (VV &gt;= 0)}
--&gt; {VV : (Int) | (VV == (m + n)) &amp;&amp; (VV &gt;= 0)}</span><span class='hs-definition'>add</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>m</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-x1:(Int)
--&gt; x2:{x21 : (Int) | (x1 &lt;= x21)}
--&gt; {x19 : (Int)&lt;p x1&gt; | (x19 &gt;= 0) &amp;&amp; (x19 &gt;= n) &amp;&amp; (n &lt;= x19)}
--&gt; (i:(Int)
-    -&gt; {x19 : (Int)&lt;p i&gt; | (x19 &gt;= 0) &amp;&amp; (x19 &gt;= n) &amp;&amp; (n &lt;= x19)}
-    -&gt; forall [ex:{VV : (Int) | (VV == (i + 1))}].{x19 : (Int)&lt;p ex&gt; | (x19 &gt;= 0) &amp;&amp; (x19 &gt;= n) &amp;&amp; (n &lt;= x19)})
--&gt; {x19 : (Int)&lt;p x2&gt; | (x19 &gt;= 0) &amp;&amp; (x19 &gt;= n) &amp;&amp; (n &lt;= x19)}</span><span class='hs-varid'>loop</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == m) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>m</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>n</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:(Int)
--&gt; x2:{x17 : (Int) | (x17 == (x1 + n)) &amp;&amp; (x17 == (n + x1)) &amp;&amp; (x17 &gt;= 0) &amp;&amp; (x17 &gt;= x1) &amp;&amp; (x17 &gt;= n) &amp;&amp; (x1 &lt;= x17) &amp;&amp; (n &lt;= x17)}
--&gt; {x9 : (Int) | (x9 == (x2 + 1)) &amp;&amp; (x9 &gt; 0) &amp;&amp; (x9 &gt; x1) &amp;&amp; (x9 &gt; x2) &amp;&amp; (x9 &gt; n) &amp;&amp; (x9 &gt;= 0) &amp;&amp; (x1 &lt;= x9) &amp;&amp; (n &lt;= x9)}</span><span class='hs-keyglyph'>\</span></a><span class='hs-keyword'>_</span> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &gt;= n) &amp;&amp; (n &lt;= VV)}</span><span class='hs-varid'>z</span></a> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == z) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (x5 &gt;= n) &amp;&amp; (n &lt;= x5)}</span><span class='hs-varid'>z</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-**Verified** by instantiating the abstract refinement of `loop`
-
-`p := \i acc -> acc = i + n`
-
-
-Using Induction
----------------
-
- <div/>
-<pre><span class=hs-linenum>239: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>add</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span><span class='hs-keyword'>| v=m+n}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>240: </span><span class='hs-definition'>add</span> <span class='hs-varid'>n</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>loop</span> <span class='hs-num'>0</span> <span class='hs-varid'>m</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>z</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-Verified by instantiating `p := \i acc -> acc = i + n`
-
-- <div class="fragment">**Base:**  `n = 0 + n`</div>
-
-- <div class="fragment">**Step:**  `acc = i + n  =>  acc + 1 = (i + 1) + n`</div>
-
-- <div class="fragment">**Goal:**  `out = m + n`</div>
-
-
-Generalizes To Structures 
--------------------------
-
-Same idea applies for induction over *structures* ...
-
-
-Structural Induction
-====================
-
-Example: Lists
---------------
-
-<br>
-
-
-<pre><span class=hs-linenum>269: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span> 
-<span class=hs-linenum>270: </span>         <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-Lets write a generic loop over such lists ...
-</div>
-
-Example: `foldr`
-----------------
-
- <br>
-<pre><span class=hs-linenum>283: </span><span class='hs-definition'>foldr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>b</span> <span class='hs-conid'>N</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span>
-<span class=hs-linenum>284: </span><span class='hs-definition'>foldr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>b</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-Lets brace ourselves for the type...
-</div>
-
-Example: `foldr`
-----------------
-
-
-<pre><span class=hs-linenum>297: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>foldr</span> <span class='hs-keyglyph'>::</span> 
-<span class=hs-linenum>298: </span>    <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span> 
-<span class=hs-linenum>299: </span>      <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>xs</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>300: </span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-conid'>N</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>301: </span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>302: </span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>ys</span><span class='hs-varop'>&gt;</span>                            <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>303: </span><a class=annot href="#"><span class=annottext>forall a b &lt;p :: (Loop.L a)-&gt; b-&gt; Bool&gt;.
-(xs:(L a)
- -&gt; x:a
- -&gt; {VV : b&lt;p xs&gt; | true}
- -&gt; forall [ex:{VV : (L a) | (VV == (Loop.C x xs))}].{VV : b&lt;p ex&gt; | true})
--&gt; forall [ex:{VV : (L a) | (VV == (Loop.N))}].{VV : b&lt;p ex&gt; | true}
--&gt; ys:(L a)
--&gt; {VV : b&lt;p ys&gt; | true}</span><span class='hs-definition'>foldr</span></a> <a class=annot href="#"><span class=annottext>xs:(L a)
--&gt; x:a
--&gt; {VV : b | ((papp2 p VV xs))}
--&gt; forall [ex:{VV : (L a) | (VV == (Loop.C x xs))}].{VV : b | ((papp2 p VV ex))}</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>forall [ex:{VV : (L a) | (VV == (Loop.N))}].{VV : a | ((papp2 p VV ex))}</span><span class='hs-varid'>b</span></a> <span class='hs-conid'>N</span>        <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall [ex:{VV : (L a) | (VV == (Loop.N))}].{VV : a | ((papp2 p VV ex))}</span><span class='hs-varid'>b</span></a>
-<span class=hs-linenum>304: </span><span class='hs-definition'>foldr</span> <span class='hs-varid'>f</span> <span class='hs-varid'>b</span> <span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:(L a)
--&gt; x2:a
--&gt; {VV : b | ((papp2 p VV x1))}
--&gt; forall [ex:{VV : (L a) | (VV == (Loop.C x2 x1))}].{VV : b | ((papp2 p VV ex))}</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{x2 : (L a) | (x2 == xs)}</span><span class='hs-varid'>xs</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>forall &lt;p :: (Loop.L a)-&gt; b-&gt; Bool&gt;.
-(xs:(L a)
- -&gt; x:a
- -&gt; {VV : b&lt;p xs&gt; | true}
- -&gt; forall [ex:{VV : (L a) | (VV == (Loop.C x xs))}].{VV : b&lt;p ex&gt; | true})
--&gt; forall [ex:{VV : (L a) | (VV == (Loop.N))}].{VV : b&lt;p ex&gt; | true}
--&gt; x4:(L a)
--&gt; {VV : b&lt;p x4&gt; | true}</span><span class='hs-varid'>foldr</span></a> <a class=annot href="#"><span class=annottext>x1:(L a)
--&gt; x2:a
--&gt; {VV : b | ((papp2 p VV x1))}
--&gt; forall [ex:{VV : (L a) | (VV == (Loop.C x2 x1))}].{VV : b | ((papp2 p VV ex))}</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>forall [ex:{VV : (L a) | (VV == (Loop.N))}].{VV : a | ((papp2 p VV ex))}</span><span class='hs-varid'>b</span></a> <a class=annot href="#"><span class=annottext>{x2 : (L a) | (x2 == xs)}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-Lets step through the type...
-</div>
-
-
-`foldr`: Abstract Refinement
-----------------------------
-
- <div/>
-<pre><span class=hs-linenum>318: </span><span class='hs-definition'>p</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>   
-<span class=hs-linenum>319: </span><span class='hs-definition'>step</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>xs</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>320: </span><span class='hs-definition'>base</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-conid'>N</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>321: </span><span class='hs-definition'>ys</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>322: </span><span class='hs-definition'>out</span>  <span class='hs-keyglyph'>::</span>  <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>ys</span><span class='hs-varop'>&gt;</span>                            
-</pre>
-
-<br>
-
-`(p xs b)` relates `b` with folded `xs`
-
-`p :: L a -> b -> Prop`
-
-
-`foldr`: Base Case
-------------------
-
- <div/>
-<pre><span class=hs-linenum>336: </span><span class='hs-definition'>p</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>   
-<span class=hs-linenum>337: </span><span class='hs-definition'>step</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>xs</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>338: </span><span class='hs-definition'>base</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-conid'>N</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>339: </span><span class='hs-definition'>ys</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>340: </span><span class='hs-definition'>out</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>ys</span><span class='hs-varop'>&gt;</span>                            
-</pre>
-
-<br>
-
-`base` is related to empty list `N`
-
-`base :: b<p N>` states 
-
-
-
-`foldr`: Ind. Step 
-------------------
-
- <div/>
-<pre><span class=hs-linenum>355: </span><span class='hs-definition'>p</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>   
-<span class=hs-linenum>356: </span><span class='hs-definition'>step</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>xs</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>357: </span><span class='hs-definition'>base</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-conid'>N</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>358: </span><span class='hs-definition'>ys</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>359: </span><span class='hs-definition'>out</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>ys</span><span class='hs-varop'>&gt;</span>                            
-</pre>
-
-<br>
-
-`step` extends relation from `xs` to `C x xs`
-
-`step :: xs:L a -> x:a -> b<p xs> -> b<p(C x xs)>`
-
-
-`foldr`: Output
----------------
-
- <div/>
-<pre><span class=hs-linenum>373: </span><span class='hs-definition'>p</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>   
-<span class=hs-linenum>374: </span><span class='hs-definition'>step</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>xs</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>375: </span><span class='hs-definition'>base</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-conid'>N</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>376: </span><span class='hs-definition'>ys</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>377: </span><span class='hs-definition'>out</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varid'>b</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>ys</span><span class='hs-varop'>&gt;</span>                            
-</pre>
-
-<br>
-
-Relation holds between `out` and input list `ys`
-
-`out :: b<p ys>`
-
-Using `foldr`: Size
--------------------
-
-We can now verify <br>
-
-
-<pre><span class=hs-linenum>392: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>size</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span><span class='hs-keyword'>| v = (llen xs)}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>393: </span><a class=annot href="#"><span class=annottext>forall a. xs:(L a) -&gt; {VV : (Int) | (VV == (llen xs))}</span><span class='hs-definition'>size</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: (Loop.L a)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-(xs:(L a)
- -&gt; x:a
- -&gt; {x12 : (Int)&lt;p xs&gt; | (x12 &gt;= 0)}
- -&gt; forall [ex:{VV : (L a) | (VV == (Loop.C x xs))}].{x12 : (Int)&lt;p ex&gt; | (x12 &gt;= 0)})
--&gt; forall [ex:{VV : (L a) | (VV == (Loop.N))}].{x12 : (Int)&lt;p ex&gt; | (x12 &gt;= 0)}
--&gt; x4:(L a)
--&gt; {x12 : (Int)&lt;p x4&gt; | (x12 &gt;= 0)}</span><span class='hs-varid'>foldr</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:(L a)
--&gt; a
--&gt; x3:{x8 : (Int) | (x8 == (llen x1)) &amp;&amp; (x8 &gt;= 0)}
--&gt; {x5 : (Int) | (x5 == (x3 + 1)) &amp;&amp; (x5 &gt; 0) &amp;&amp; (x5 &gt; x3) &amp;&amp; (x5 &gt;= 0)}</span><span class='hs-keyglyph'>\</span></a><span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>n</span></a> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">
-Verified by automatically instantiating 
-
-`p := \xs acc -> acc = (llen xs)`
-</div>
-
-Using `foldr`: Append
----------------------
-
-
-<pre><span class=hs-linenum>408: </span><span class='hs-keyword'>{-@</span> <span class='hs-layout'>(</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cat</span> <span class='hs-varid'>a</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span> 
-<span class=hs-linenum>409: </span><a class=annot href="#"><span class=annottext>(L a)</span><span class='hs-definition'>xs</span></a> <a class=annot href="#"><span class=annottext>forall a.
-xs:(L a)
--&gt; ys:(L a)
--&gt; {VV : (L a) | ((llen VV) == ((llen xs) + (llen ys)))}</span><span class='hs-varop'>++</span></a> <a class=annot href="#"><span class=annottext>(L a)</span><span class='hs-varid'>ys</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: (Loop.L a)-&gt; (Loop.L a)-&gt; Bool&gt;.
-(xs:(L a)
- -&gt; x:a
- -&gt; {x8 : (L a)&lt;p xs&gt; | true}
- -&gt; forall [ex:{VV : (L a) | (VV == (Loop.C x xs))}].{x8 : (L a)&lt;p ex&gt; | true})
--&gt; forall [ex:{VV : (L a) | (VV == (Loop.N))}].{x8 : (L a)&lt;p ex&gt; | true}
--&gt; x4:(L a)
--&gt; {x8 : (L a)&lt;p x4&gt; | true}</span><span class='hs-varid'>foldr</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>(L a)
--&gt; a -&gt; x3:(L a) -&gt; {x2 : (L a) | ((llen x2) == (1 + (llen x3)))}</span><span class='hs-keyglyph'>\</span></a><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>a -&gt; x2:(L a) -&gt; {x2 : (L a) | ((llen x2) == (1 + (llen x2)))}</span><span class='hs-conid'>C</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x2 : (L a) | (x2 == ys)}</span><span class='hs-varid'>ys</span></a> <a class=annot href="#"><span class=annottext>{x2 : (L a) | (x2 == xs)}</span><span class='hs-varid'>xs</span></a> 
-</pre>
-
-<br>
-
-<div class="fragment">
-
-where the alias `Cat` is:
-
-<br>
-
-
-<pre><span class=hs-linenum>421: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Cat</span> <span class='hs-varid'>a</span> <span class='hs-conid'>X</span> <span class='hs-conid'>Y</span> <span class='hs-keyglyph'>=</span> 
-<span class=hs-linenum>422: </span>    <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>|</span><span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-conid'>X</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-conid'>Y</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-</div>
-
-Using `foldr`: Append
----------------------
-
- <div/>
-<pre><span class=hs-linenum>431: </span><span class='hs-keyword'>{-@</span> <span class='hs-layout'>(</span><span class='hs-varop'>++</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cat</span> <span class='hs-varid'>a</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span> 
-<span class=hs-linenum>432: </span><span class='hs-definition'>xs</span> <span class='hs-varop'>++</span> <span class='hs-varid'>ys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>C</span><span class='hs-layout'>)</span> <span class='hs-varid'>ys</span> <span class='hs-varid'>xs</span> 
-</pre>
-
-<br>
-
-<div class="fragment">
-
-Verified by automatically instantiating 
-
-`p := \xs acc -> llen acc = llen xs + llen ys`
-
-</div>
-
-Recap
------
-
-Abstract refinements decouple *invariant* from *traversal*
-
-<br>
-
-+ <div class="fragment">*reusable* specifications for higher-order functions.</div>
-
-+ <div class="fragment">*automatic* checking and instantiation by SMT.</div>
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract:** Refinements over Type Signatures
-    + *Dependencies*
-    + <div class="fragment">*Induction*</div>
diff --git a/docs/slides/plpv14/lhs/07_Array.lhs b/docs/slides/plpv14/lhs/07_Array.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/07_Array.lhs
+++ /dev/null
@@ -1,405 +0,0 @@
-Abstract Refinements {#data}
-============================
-
-Recap
------
-
-**So far**
-
-Decouple invariants from *functions*
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-Decouple invariants from *data structures*
-</div>
-
-Decouple Invariants From Data {#vector} 
-=======================================
-
-Example: Vectors 
-----------------
-
-<div class="hidden">
-\begin{code}
-module LiquidArray where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume, liquidError)
-
-{-@ LIQUID "--no-termination" @-}
-
-fibMemo   :: Vec Int -> Int -> (Vec Int, Int)
-fastFib   :: Int -> Int
-idv       :: Int -> Vec Int
-axiom_fib :: Int -> Bool
-axiom_fib = undefined
-
-{-@ predicate AxFib I = (fib I) == (if I <= 1 then 1 else fib(I-1) + fib(I-2)) @-}
-\end{code}
-</div>
-
-<div class="fragment">
-
-Implemented as maps from `Int` to `a` 
-
-<br>
-
-\begin{code}
-data Vec a = V (Int -> a)
-\end{code}
-
-</div>
-
-
-Abstract *Domain* and *Range*
------------------------------
-
-Parameterize type with *two* abstract refinements:
-
-<br>
-
-\begin{code}
-{-@ data Vec a < dom :: Int -> Prop,
-                 rng :: Int -> a -> Prop >
-      = V {a :: i:Int<dom> -> a <rng i>}  @-}
-\end{code}
-
-<br>
-
-- `dom`: *domain* on which `Vec` is *defined* 
-
-- `rng`: *range*  and relationship with *index*
-
-Abstract *Domain* and *Range*
------------------------------
-
-Diverse `Vec`tors by *instantiating* `dom` and `rng`
-
-<br>
-
-<div class="fragment">
-
-A quick alias for *segments* between `I` and `J`
-
-<br>
-
-\begin{code}
-{-@ predicate Seg V I J = (I <= V && V < J) @-}
-\end{code}
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type IdVec N = Vec <{\v -> (Seg v 0 N)}, 
-                        {\k v -> v=k}> 
-                       Int                  @-}
-\end{code}
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-\begin{code}
-{-@ idv :: n:Nat -> (IdVec n) @-}
-idv n   = V (\k -> if 0 < k && k < n 
-                     then k 
-                     else liquidError "eeks")
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>Whats the problem? How can we fix it?
-</div>
-
-Ex: Zero-Terminated Vectors
----------------------------
-
-Defined between `[0..N)`, with *last* element equal to `0`:
-
-<br>
-
-<div class="fragment">
-
-\begin{code}
-{-@ type ZeroTerm N = 
-     Vec <{\v -> (Seg v 0 N)}, 
-          {\k v -> (k = N-1 => v = 0)}> 
-          Int                             @-}
-\end{code}
-
-</div>
-
-
-Ex: Fibonacci Table 
--------------------
-
-A vector whose value at index `k` is either 
-
-- `0` (undefined), or, 
-
-- `k`th fibonacci number 
-
-\begin{code}
-{-@ type FibV =  
-     Vec <{\v -> true}, 
-          {\k v -> (v = 0 || v = (fib k))}> 
-          Int                               @-}
-\end{code}
-
-
-Accessing Vectors
------------------
-
-Next: lets *abstractly* type `Vec`tor operations, *e.g.* 
-
-<br>
-
-- `empty`
-
-- `set`
-
-- `get`
-
-
-Ex: Empty Vectors
------------------
-
-`empty` returns Vector whose domain is `false`
-
-<br>
-
-\begin{code}
-{-@ empty :: forall <p :: Int -> a -> Prop>. 
-               Vec <{v:Int|false}, p> a     @-}
-
-empty     = V $ \_ -> error "empty vector!"
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-What would happen if we changed `false` to `true`?
-</div>
-
-Ex: `get` Key's Value 
----------------------
-
-- *Input* `key` in *domain*
-
-- *Output* value in *range* related with `k`
-
-\begin{code}
-{-@ get :: forall a <d :: Int -> Prop,  
-                     r :: Int -> a -> Prop>.
-           key:Int <d>
-        -> vec:Vec <d, r> a
-        -> a<r key>                        @-}
-
-get k (V f) = f k
-\end{code}
-
-
-Ex: `set` Key's Value 
----------------------
-
-- <div class="fragment">Input `key` in *domain*</div>
-
-- <div class="fragment">Input `val` in *range* related with `key`</div>
-
-- <div class="fragment">Input `vec` defined at *domain except at* `key`</div>
-
-- <div class="fragment">Output domain *includes* `key`</div>
-
-Ex: `set` Key's Value 
----------------------
-
-\begin{code}
-{-@ set :: forall a <d :: Int -> Prop,
-                     r :: Int -> a -> Prop>.
-           key: Int<d> -> val: a<r key>
-        -> vec: Vec<{v:Int<d>| v /= key},r> a
-        -> Vec <d, r> a                     @-}
-set key val (V f) = V $ \k -> if k == key 
-                                then val 
-                                else f key
-\end{code}
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-Help! Can you spot and fix the errors? 
-</div>
-
-<!-- INSERT tests/pos/vecloop.lhs here AFTER FIXED -->
-
-Using the Vector API
---------------------
-
-Memoized Fibonacci
-------------------
-
-Use `Vec` API to write a *memoized* fibonacci function
-
-<br>
-
-<div class="fragment">
-\begin{code} Using the fibonacci table:
-type FibV =  
-     Vec <{\v -> true}, 
-          {\k v -> (v = 0 || v = (fib k))}> 
-          Int                              
-\end{code}
-</div>
-
-<br>
-
-<div class="fragment">
-But wait, what is `fib` ?
-</div>
-
-
-Specifying Fibonacci
---------------------
-
-`fib` is *uninterpreted* in the refinement logic  
-
-<br>
-
-\begin{code}
-{-@ measure fib :: Int -> Int @-}
-\end{code}
-
-<br>
-
-Specifying Fibonacci
---------------------
-
-We *axiomatize* the definition of `fib` in SMT ...
-
-\begin{code}<br>
-predicate AxFib I = 
-  (fib I) == if I <= 1 
-               then 1 
-               else fib(I-1) + fib(I-2)
-\end{code}
-
-Specifying Fibonacci
---------------------
-
-Finally, lift axiom into LiquidHaskell as *ghost function*
-
-<br>
-
-\begin{code}
-{-@ axiom_fib :: 
-      i:_ -> {v:_|((Prop v) <=> (AxFib i))} @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Note:** Recipe for *escaping* SMT limitations
-
-1. *Prove* fact externally
-2. *Use* as ghost function call
-</div>
-
-
-Fast Fibonacci
---------------
-
-An efficient fibonacci function
-
-<br>
-
-\begin{code}
-{-@ fastFib :: n:Int -> {v:_ | v = (fib n)} @-}
-fastFib n   = snd $ fibMemo (V (\_ -> 0)) n
-\end{code}
-
-<br>
-
-<div class="fragment">
-- `fibMemo` *takes* a table initialized with `0`
-
-- `fibMemo` *returns* a table with `fib` values upto `n`.
-</div>
-
-
-Memoized Fibonacci 
-------------------
-
-\begin{code}
-fibMemo t i 
-  | i <= 1    
-  = (t, liquidAssume (axiom_fib i) 1)
-  | otherwise 
-  = case get i t of   
-     0 -> let (t1,n1) = fibMemo t  (i-1)
-              (t2,n2) = fibMemo t1 (i-2)
-              n       = liquidAssume 
-                        (axiom_fib i) (n1+n2)
-          in (set i n t2,  n)
-     n -> (t, n)
-\end{code}
-
-Memoized Fibonacci 
-------------------
-
-- `fibMemo` *takes* a table initialized with `0`
-- `fibMemo` *returns* a table with `fib` values upto `n`.
-
-<br>
-
-\begin{code}
-{-@ fibMemo :: FibV 
-            -> i:Int 
-            -> (FibV,{v:Int | v = (fib i)}) @-}
-\end{code}
-
-
-Recap
------
-
-Created a `Vec` container 
-
-Decoupled *domain* and *range* invariants from *data*
-
-<br>
-
-<div class="fragment">
-
-Previous, special purpose program analyses 
-
-- [Gopan-Reps-Sagiv, POPL 05](link)
-- [J.-McMillan, CAV 07](link)
-- [Logozzo-Cousot-Cousot, POPL 11](link)
-- [Dillig-Dillig, POPL 12](link) 
-- ...
-
-Encoded as instance of abstract refinement types!
-</div>
-
-
-
-
diff --git a/docs/slides/plpv14/lhs/07_Array.lhs.markdown b/docs/slides/plpv14/lhs/07_Array.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/07_Array.lhs.markdown
+++ /dev/null
@@ -1,467 +0,0 @@
-Abstract Refinements {#data}
-============================
-
-Recap
------
-
-**So far**
-
-Decouple invariants from *functions*
-
-<br>
-
-<div class="fragment">
-
-**Next**
-
-Decouple invariants from *data structures*
-</div>
-
-Decouple Invariants From Data {#vector} 
-=======================================
-
-Example: Vectors 
-----------------
-
-<div class="hidden">
-
-<pre><span class=hs-linenum>28: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>LiquidArray</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>29: </span>
-<span class=hs-linenum>30: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>Liquid</span><span class='hs-varop'>.</span><span class='hs-conid'>Prelude</span> <span class='hs-layout'>(</span><span class='hs-varid'>liquidAssume</span><span class='hs-layout'>,</span> <span class='hs-varid'>liquidError</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>31: </span>
-<span class=hs-linenum>32: </span><span class='hs-keyword'>{-@</span> <span class='hs-conid'>LIQUID</span> <span class='hs-str'>"--no-termination"</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>33: </span>
-<span class=hs-linenum>34: </span><span class='hs-definition'>fibMemo</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Vec</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Vec</span> <span class='hs-conid'>Int</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>35: </span><span class='hs-definition'>fastFib</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>36: </span><span class='hs-definition'>idv</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Vec</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>37: </span><span class='hs-definition'>axiom_fib</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
-<span class=hs-linenum>38: </span><a class=annot href="#"><span class=annottext>i:(Int)
--&gt; {v : (Bool) | (((Prop v)) &lt;=&gt; ((fib i) == (if (i &lt;= 1) then 1 else ((fib (i - 1)) + (fib (i - 2))))))}</span><span class='hs-definition'>axiom_fib</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a. a</span><span class='hs-varid'>undefined</span></a>
-<span class=hs-linenum>39: </span>
-<span class=hs-linenum>40: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>predicate</span> <span class='hs-conid'>AxFib</span> <span class='hs-conid'>I</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>fib</span> <span class='hs-conid'>I</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-conid'>I</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>1</span> <span class='hs-keyword'>then</span> <span class='hs-num'>1</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>fib</span><span class='hs-layout'>(</span><span class='hs-conid'>I</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fib</span><span class='hs-layout'>(</span><span class='hs-conid'>I</span><span class='hs-comment'>-</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-</pre>
-</div>
-
-<div class="fragment">
-
-Implemented as maps from `Int` to `a` 
-
-<br>
-
-
-<pre><span class=hs-linenum>51: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>Vec</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>V</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-</pre>
-
-</div>
-
-
-Abstract *Domain* and *Range*
------------------------------
-
-Parameterize type with *two* abstract refinements:
-
-<br>
-
-
-<pre><span class=hs-linenum>65: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>data</span> <span class='hs-conid'>Vec</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>dom</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-layout'>,</span>
-<span class=hs-linenum>66: </span>                 <span class='hs-varid'>rng</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span> <span class='hs-varop'>&gt;</span>
-<span class=hs-linenum>67: </span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>V</span> <span class='hs-layout'>{</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>i</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>dom</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>rng</span> <span class='hs-varid'>i</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>}</span>  <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-- `dom`: *domain* on which `Vec` is *defined* 
-
-- `rng`: *range*  and relationship with *index*
-
-Abstract *Domain* and *Range*
------------------------------
-
-Diverse `Vec`tors by *instantiating* `dom` and `rng`
-
-<br>
-
-<div class="fragment">
-
-A quick alias for *segments* between `I` and `J`
-
-<br>
-
-
-<pre><span class=hs-linenum>90: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>predicate</span> <span class='hs-conid'>Seg</span> <span class='hs-conid'>V</span> <span class='hs-conid'>I</span> <span class='hs-conid'>J</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>I</span> <span class='hs-varop'>&lt;=</span> <span class='hs-conid'>V</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-conid'>V</span> <span class='hs-varop'>&lt;</span> <span class='hs-conid'>J</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-<div class="fragment">
-
-
-<pre><span class=hs-linenum>105: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>IdVec</span> <span class='hs-conid'>N</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Vec</span> <span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Seg</span> <span class='hs-varid'>v</span> <span class='hs-num'>0</span> <span class='hs-conid'>N</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
-<span class=hs-linenum>106: </span>                        <span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>k</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>107: </span>                       <span class='hs-conid'>Int</span>                  <span class='hs-keyword'>@-}</span>
-</pre>
-
-</div>
-
-Ex: Identity Vectors
---------------------
-
-Defined between `[0..N)` mapping each key to itself:
-
-<br>
-
-
-<pre><span class=hs-linenum>120: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>idv</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>IdVec</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>121: </span><a class=annot href="#"><span class=annottext>n:{VV : (Int) | (VV &gt;= 0)}
--&gt; (Vec &lt;(VV &lt; n) &amp;&amp; (0 &lt;= VV), \k4 VV -&gt; (VV == k4)&gt; (Int))</span><span class='hs-definition'>idv</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>n</span></a>   <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;rng :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool, dom :: (GHC.Types.Int)-&gt; Bool&gt;.
-(i:{x13 : (Int)&lt;dom&gt; | true}
- -&gt; {x12 : (Int)&lt;rng i&gt; | (x12 &gt; 0) &amp;&amp; (x12 &gt;= 0) &amp;&amp; (x12 &lt; n)})
--&gt; (Vec &lt;dom, rng&gt; {x12 : (Int) | (x12 &gt; 0) &amp;&amp; (x12 &gt;= 0) &amp;&amp; (x12 &lt; n)})</span><span class='hs-conid'>V</span></a> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; n)}</span><span class='hs-varid'>k</span></a> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>if</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a> <a class=annot href="#"><span class=annottext>x1:{x12 : (Int) | (x12 &gt;= 0) &amp;&amp; (x12 &lt; n) &amp;&amp; (0 &lt;= x12) &amp;&amp; (x12 &lt;= k)}
--&gt; x2:{x12 : (Int) | (x12 &gt;= 0) &amp;&amp; (x12 &lt; n) &amp;&amp; (0 &lt;= x12) &amp;&amp; (x12 &lt;= k)}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>&lt;</span></a> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == k) &amp;&amp; (x4 &gt;= 0) &amp;&amp; (x4 &lt; n)}</span><span class='hs-varid'>k</span></a> <a class=annot href="#"><span class=annottext>x1:(Bool)
--&gt; x2:(Bool)
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (((Prop x1)) &amp;&amp; ((Prop x2))))}</span><span class='hs-varop'>&amp;&amp;</span></a> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == k) &amp;&amp; (x4 &gt;= 0) &amp;&amp; (x4 &lt; n)}</span><span class='hs-varid'>k</span></a> <a class=annot href="#"><span class=annottext>x1:{x12 : (Int) | (x12 &gt;= 0) &amp;&amp; (x12 &gt;= k) &amp;&amp; (0 &lt;= x12) &amp;&amp; (x12 &lt;= n)}
--&gt; x2:{x12 : (Int) | (x12 &gt;= 0) &amp;&amp; (x12 &gt;= k) &amp;&amp; (0 &lt;= x12) &amp;&amp; (x12 &lt;= n)}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>&lt;</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>n</span></a> 
-<span class=hs-linenum>122: </span>                     <span class='hs-keyword'>then</span> <a class=annot href="#"><span class=annottext>{x4 : (Int) | (x4 == k) &amp;&amp; (x4 &gt;= 0) &amp;&amp; (x4 &lt; n)}</span><span class='hs-varid'>k</span></a> 
-<span class=hs-linenum>123: </span>                     <span class='hs-keyword'>else</span> <a class=annot href="#"><span class=annottext>{x2 : [(Char)] | false} -&gt; {x1 : (Int) | false}</span><span class='hs-varid'>liquidError</span></a> <span class=hs-error><a class=annot href="#"><span class=annottext>{x3 : [(Char)] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-str'>"eeks"</span></a></span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>Whats the problem? How can we fix it?
-</div>
-
-Ex: Zero-Terminated Vectors
----------------------------
-
-Defined between `[0..N)`, with *last* element equal to `0`:
-
-<br>
-
-<div class="fragment">
-
-
-<pre><span class=hs-linenum>142: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>ZeroTerm</span> <span class='hs-conid'>N</span> <span class='hs-keyglyph'>=</span> 
-<span class=hs-linenum>143: </span>     <span class='hs-conid'>Vec</span> <span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Seg</span> <span class='hs-varid'>v</span> <span class='hs-num'>0</span> <span class='hs-conid'>N</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
-<span class=hs-linenum>144: </span>          <span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span><span class='hs-comment'>-</span><span class='hs-num'>1</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>145: </span>          <span class='hs-conid'>Int</span>                             <span class='hs-keyword'>@-}</span>
-</pre>
-
-</div>
-
-
-Ex: Fibonacci Table 
--------------------
-
-A vector whose value at index `k` is either 
-
-- `0` (undefined), or, 
-
-- `k`th fibonacci number 
-
-
-<pre><span class=hs-linenum>161: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>FibV</span> <span class='hs-keyglyph'>=</span>  
-<span class=hs-linenum>162: </span>     <span class='hs-conid'>Vec</span> <span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>true</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
-<span class=hs-linenum>163: </span>          <span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <span class='hs-varop'>||</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>fib</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>164: </span>          <span class='hs-conid'>Int</span>                               <span class='hs-keyword'>@-}</span>
-</pre>
-
-
-Accessing Vectors
------------------
-
-Next: lets *abstractly* type `Vec`tor operations, *e.g.* 
-
-<br>
-
-- `empty`
-
-- `set`
-
-- `get`
-
-
-Ex: Empty Vectors
------------------
-
-`empty` returns Vector whose domain is `false`
-
-<br>
-
-
-<pre><span class=hs-linenum>190: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>empty</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span> 
-<span class=hs-linenum>191: </span>               <span class='hs-conid'>Vec</span> <span class='hs-varop'>&lt;</span><span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span><span class='hs-keyword'>|false}</span><span class='hs-layout'>,</span> <span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span>     <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>192: </span>
-<span class=hs-linenum>193: </span><a class=annot href="#"><span class=annottext>forall a &lt;p :: (GHC.Types.Int)-&gt; a-&gt; Bool&gt;.
-(Vec &lt;false, \_ VV -&gt; p&gt; a)</span><span class='hs-definition'>empty</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>({x4 : (Int) | false} -&gt; {VV : a | false})
--&gt; (Vec &lt;false, \_ VV -&gt; false&gt; {VV : a | false})</span><span class='hs-conid'>V</span></a> <a class=annot href="#"><span class=annottext>(({x9 : (Int) | false} -&gt; {VV : a | false})
- -&gt; (Vec &lt;false, \_ VV -&gt; false&gt; {VV : a | false}))
--&gt; ({x9 : (Int) | false} -&gt; {VV : a | false})
--&gt; (Vec &lt;false, \_ VV -&gt; false&gt; {VV : a | false})</span><span class='hs-varop'>$</span></a> <a class=annot href="#"><span class=annottext>{x1 : (Int) | false} -&gt; {VV : a | false}</span><span class='hs-keyglyph'>\</span></a><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>[(Char)] -&gt; {VV : a | false}</span><span class='hs-varid'>error</span></a> <a class=annot href="#"><span class=annottext>{x3 : [(Char)] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-str'>"empty vector!"</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-What would happen if we changed `false` to `true`?
-</div>
-
-Ex: `get` Key's Value 
----------------------
-
-- *Input* `key` in *domain*
-
-- *Output* value in *range* related with `k`
-
-
-<pre><span class=hs-linenum>211: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>get</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-layout'>,</span>  
-<span class=hs-linenum>212: </span>                     <span class='hs-varid'>r</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span>
-<span class=hs-linenum>213: </span>           <span class='hs-varid'>key</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>d</span><span class='hs-varop'>&gt;</span>
-<span class=hs-linenum>214: </span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>vec</span><span class='hs-conop'>:</span><span class='hs-conid'>Vec</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>215: </span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>r</span> <span class='hs-varid'>key</span><span class='hs-varop'>&gt;</span>                        <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>216: </span>
-<span class=hs-linenum>217: </span><a class=annot href="#"><span class=annottext>forall a &lt;d :: (GHC.Types.Int)-&gt; Bool, r :: (GHC.Types.Int)-&gt; a-&gt; Bool&gt;.
-key:{VV : (Int)&lt;d&gt; | true}
--&gt; (Vec &lt;d, \_ VV -&gt; r&gt; a) -&gt; {VV : a&lt;r key&gt; | true}</span><span class='hs-definition'>get</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | ((papp1 d VV))}</span><span class='hs-varid'>k</span></a> <span class='hs-layout'>(</span><span class='hs-conid'>V</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x2 : (Int) | ((papp1 d x2))} -&gt; {VV : a | ((papp2 r VV x1))}</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | ((papp1 d x3)) &amp;&amp; (x3 == k)}</span><span class='hs-varid'>k</span></a>
-</pre>
-
-
-Ex: `set` Key's Value 
----------------------
-
-- <div class="fragment">Input `key` in *domain*</div>
-
-- <div class="fragment">Input `val` in *range* related with `key`</div>
-
-- <div class="fragment">Input `vec` defined at *domain except at* `key`</div>
-
-- <div class="fragment">Output domain *includes* `key`</div>
-
-Ex: `set` Key's Value 
----------------------
-
-
-<pre><span class=hs-linenum>236: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>set</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>d</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-layout'>,</span>
-<span class=hs-linenum>237: </span>                     <span class='hs-varid'>r</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;.</span>
-<span class=hs-linenum>238: </span>           <span class='hs-varid'>key</span><span class='hs-conop'>:</span> <span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>d</span><span class='hs-varop'>&gt;</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>val</span><span class='hs-conop'>:</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>r</span> <span class='hs-varid'>key</span><span class='hs-varop'>&gt;</span>
-<span class=hs-linenum>239: </span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>vec</span><span class='hs-conop'>:</span> <span class='hs-conid'>Vec</span><span class='hs-varop'>&lt;</span><span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>d</span><span class='hs-varop'>&gt;</span><span class='hs-keyword'>| v /= key}</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>240: </span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Vec</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>d</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span>                     <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>241: </span><a class=annot href="#"><span class=annottext>forall a &lt;d :: (GHC.Types.Int)-&gt; Bool, r :: (GHC.Types.Int)-&gt; a-&gt; Bool&gt;.
-key:{VV : (Int)&lt;d&gt; | true}
--&gt; {VV : a&lt;r key&gt; | true}
--&gt; (Vec &lt;d &amp; (VV /= key), \_ VV -&gt; r&gt; a)
--&gt; (Vec &lt;d, \_ VV -&gt; r&gt; a)</span><span class='hs-definition'>set</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | ((papp1 d VV))}</span><span class='hs-varid'>key</span></a> <a class=annot href="#"><span class=annottext>{VV : a | ((papp2 r VV key))}</span><span class='hs-varid'>val</span></a> <span class='hs-layout'>(</span><span class='hs-conid'>V</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class=hs-error><a class=annot href="#"><span class=annottext>({x6 : (Int) | ((papp1 d x6))} -&gt; {VV : a | ((papp2 r VV key))})
--&gt; (Vec &lt;((papp1 d x3)), \_ VV -&gt; ((papp2 r VV key))&gt; {VV : a | ((papp2 r VV key))})</span><span class='hs-conid'>V</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>(({x13 : (Int) | ((papp1 d x13))} -&gt; {VV : a | ((papp2 r VV key))})
- -&gt; (Vec &lt;((papp1 d x10)), \_ VV -&gt; ((papp2 r VV key))&gt; {VV : a | ((papp2 r VV key))}))
--&gt; ({x13 : (Int) | ((papp1 d x13))}
-    -&gt; {VV : a | ((papp2 r VV key))})
--&gt; (Vec &lt;((papp1 d x10)), \_ VV -&gt; ((papp2 r VV key))&gt; {VV : a | ((papp2 r VV key))})</span><span class='hs-varop'>$</span></a></span><span class=hs-error> </span><span class=hs-error><span class='hs-keyglyph'>\</span></span><span class=hs-error><a class=annot href="#"><span class=annottext>{VV : (Int) | ((papp1 d VV))}</span><span class='hs-varid'>k</span></a></span><span class=hs-error> </span><span class=hs-error><span class='hs-keyglyph'>-&gt;</span></span><span class=hs-error> </span><span class=hs-error><span class='hs-keyword'>if</span></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x3 : (Int) | ((papp1 d x3)) &amp;&amp; (x3 == k)}</span><span class='hs-varid'>k</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>x1:{x6 : (Int) | ((papp1 d x6))}
--&gt; x2:{x6 : (Int) | ((papp1 d x6))}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 == x2))}</span><span class='hs-varop'>==</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x3 : (Int) | ((papp1 d x3)) &amp;&amp; (x3 == key)}</span><span class='hs-varid'>key</span></a></span><span class=hs-error> </span>
-<span class=hs-linenum>242: </span>                                <span class=hs-error><span class='hs-keyword'>then</span></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{VV : a | ((papp2 r VV key)) &amp;&amp; (VV == val)}</span><span class='hs-varid'>val</span></a></span><span class=hs-error> </span><span class=hs-error>
-</span><span class=hs-linenum>243: </span>                                <span class=hs-error><span class='hs-keyword'>else</span></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>x1:{x3 : (Int) | ((papp1 d x3)) &amp;&amp; (x3 /= key)}
--&gt; {VV : a | ((papp2 r VV x1))}</span><span class='hs-varid'>f</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x3 : (Int) | ((papp1 d x3)) &amp;&amp; (x3 == key)}</span><span class='hs-varid'>key</span></a></span>
-</pre>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Array.hs" target="_blank">Demo:</a>
-Help! Can you spot and fix the errors? 
-</div>
-
-<!-- INSERT tests/pos/vecloop.lhs here AFTER FIXED -->
-
-Using the Vector API
---------------------
-
-Memoized Fibonacci
-------------------
-
-Use `Vec` API to write a *memoized* fibonacci function
-
-<br>
-
-<div class="fragment">
- Using the fibonacci table:
-<pre><span class=hs-linenum>267: </span><span class='hs-keyword'>type</span> <span class='hs-conid'>FibV</span> <span class='hs-keyglyph'>=</span>  
-<span class=hs-linenum>268: </span>     <span class='hs-conid'>Vec</span> <span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>true</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
-<span class=hs-linenum>269: </span>          <span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <span class='hs-varop'>||</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>fib</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>270: </span>          <span class='hs-conid'>Int</span>                              
-</pre>
-</div>
-
-<br>
-
-<div class="fragment">
-But wait, what is `fib` ?
-</div>
-
-
-Specifying Fibonacci
---------------------
-
-`fib` is *uninterpreted* in the refinement logic  
-
-<br>
-
-
-<pre><span class=hs-linenum>289: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>measure</span> <span class='hs-varid'>fib</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-Specifying Fibonacci
---------------------
-
-We *axiomatize* the definition of `fib` in SMT ...
-
-<br>
-<pre><span class=hs-linenum>300: </span><span class='hs-definition'>predicate</span> <span class='hs-conid'>AxFib</span> <span class='hs-conid'>I</span> <span class='hs-keyglyph'>=</span> 
-<span class=hs-linenum>301: </span>  <span class='hs-layout'>(</span><span class='hs-varid'>fib</span> <span class='hs-conid'>I</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-keyword'>if</span> <span class='hs-conid'>I</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>1</span> 
-<span class=hs-linenum>302: </span>               <span class='hs-keyword'>then</span> <span class='hs-num'>1</span> 
-<span class=hs-linenum>303: </span>               <span class='hs-keyword'>else</span> <span class='hs-varid'>fib</span><span class='hs-layout'>(</span><span class='hs-conid'>I</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-varid'>fib</span><span class='hs-layout'>(</span><span class='hs-conid'>I</span><span class='hs-comment'>-</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
-</pre>
-
-Specifying Fibonacci
---------------------
-
-Finally, lift axiom into LiquidHaskell as *ghost function*
-
-<br>
-
-
-<pre><span class=hs-linenum>314: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>axiom_fib</span> <span class='hs-keyglyph'>::</span> 
-<span class=hs-linenum>315: </span>      <span class='hs-varid'>i</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyword'>_</span><span class='hs-keyword'>|((Prop v) &lt;=&gt; (AxFib i))}</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-**Note:** Recipe for *escaping* SMT limitations
-
-1. *Prove* fact externally
-2. *Use* as ghost function call
-</div>
-
-
-Fast Fibonacci
---------------
-
-An efficient fibonacci function
-
-<br>
-
-
-<pre><span class=hs-linenum>336: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>fastFib</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-keyword'>_</span> <span class='hs-keyword'>| v = (fib n)}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>337: </span><a class=annot href="#"><span class=annottext>n:(Int) -&gt; {v : (Int) | (v == (fib n))}</span><span class='hs-definition'>fastFib</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>n</span></a>   <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>((Vec &lt;false, \x10 VV -&gt; ((x9 == 0) || (x9 == (fib x10)))&gt; (Int)), {x13 : (Int) | (x13 == (fib n))})
--&gt; {x2 : (Int) | (x2 == (fib n))}</span><span class='hs-varid'>snd</span></a> <a class=annot href="#"><span class=annottext>(((Vec &lt;false, \x24 VV -&gt; ((x23 == 0) || (x23 == (fib x24)))&gt; (Int)), {x27 : (Int) | (x27 == (fib n))})
- -&gt; {x16 : (Int) | (x16 == (fib n))})
--&gt; ((Vec &lt;false, \x24 VV -&gt; ((x23 == 0) || (x23 == (fib x24)))&gt; (Int)), {x27 : (Int) | (x27 == (fib n))})
--&gt; {x16 : (Int) | (x16 == (fib n))}</span><span class='hs-varop'>$</span></a> <a class=annot href="#"><span class=annottext>(Vec &lt;True, \x18 VV -&gt; ((x17 == 0) || (x17 == (fib x18)))&gt; (Int))
--&gt; x2:(Int)
--&gt; ((Vec &lt;True, \x8 VV -&gt; ((x7 == 0) || (x7 == (fib x8)))&gt; (Int)), {x11 : (Int) | (x11 == (fib x2))})</span><span class='hs-varid'>fibMemo</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>forall &lt;rng :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool, dom :: (GHC.Types.Int)-&gt; Bool&gt;.
-(i:{x15 : (Int)&lt;dom&gt; | true}
- -&gt; {x14 : (Int)&lt;rng i&gt; | ((x14 == 0) || (x14 == (fib n))) &amp;&amp; (x14 == 0) &amp;&amp; (x14 &gt;= 0)})
--&gt; (Vec &lt;dom, rng&gt; {x14 : (Int) | ((x14 == 0) || (x14 == (fib n))) &amp;&amp; (x14 == 0) &amp;&amp; (x14 &gt;= 0)})</span><span class='hs-conid'>V</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>(Int) -&gt; {x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-keyglyph'>\</span></a><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == n)}</span><span class='hs-varid'>n</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">
-- `fibMemo` *takes* a table initialized with `0`
-
-- `fibMemo` *returns* a table with `fib` values upto `n`.
-</div>
-
-
-Memoized Fibonacci 
-------------------
-
-
-<pre><span class=hs-linenum>353: </span><a class=annot href="#"><span class=annottext>(Vec &lt;True, \k10 VV -&gt; ((VV == 0) || (VV == (fib k10)))&gt; (Int))
--&gt; i:(Int)
--&gt; ((Vec &lt;True, \k10 VV -&gt; ((VV == 0) || (VV == (fib k10)))&gt; (Int)), {VV : (Int) | (VV == (fib i))})</span><span class='hs-definition'>fibMemo</span></a> <a class=annot href="#"><span class=annottext>(Vec &lt;True, \k10 VV -&gt; ((VV == 0) || (VV == (fib k10)))&gt; (Int))</span><span class='hs-varid'>t</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>i</span></a> 
-<span class=hs-linenum>354: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == i)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>x1:(Int)
--&gt; x2:(Int) -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt;= x2))}</span><span class='hs-varop'>&lt;=</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a>    
-<span class=hs-linenum>355: </span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a b &lt;p2 :: a-&gt; b-&gt; Bool&gt;.
-x1:a
--&gt; x2:{VV : b&lt;p2 x1&gt; | true}
--&gt; {x3 : (a, b)&lt;p2&gt; | ((fst x3) == x1) &amp;&amp; ((snd x3) == x2)}</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{x2 : (Vec &lt;True, \x7 VV -&gt; ((x6 == 0) || (x6 == (fib x7)))&gt; (Int)) | (x2 == t)}</span><span class='hs-varid'>t</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>x1:(Bool)
--&gt; {x8 : (Int) | (x8 == 1) &amp;&amp; (x8 &gt; 0) &amp;&amp; (x8 &gt;= i)}
--&gt; {x8 : (Int) | ((Prop x1)) &amp;&amp; (x8 == 1) &amp;&amp; (x8 &gt; 0) &amp;&amp; (x8 &gt;= i)}</span><span class='hs-varid'>liquidAssume</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:(Int)
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; ((fib x1) == (if (x1 &lt;= 1) then 1 else ((fib (x1 - 1)) + (fib (x1 - 2))))))}</span><span class='hs-varid'>axiom_fib</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == i)}</span><span class='hs-varid'>i</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>356: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> 
-<span class=hs-linenum>357: </span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <a class=annot href="#"><span class=annottext>forall &lt;r :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool, d :: (GHC.Types.Int)-&gt; Bool&gt;.
-x1:{x7 : (Int)&lt;d&gt; | true}
--&gt; (Vec &lt;d, \x5 VV -&gt; r x5&gt; (Int)) -&gt; {x6 : (Int)&lt;r x1&gt; | true}</span><span class='hs-varid'>get</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == i)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Vec &lt;True, \x7 VV -&gt; ((x6 == 0) || (x6 == (fib x7)))&gt; (Int)) | (x2 == t)}</span><span class='hs-varid'>t</span></a> <span class='hs-keyword'>of</span>   
-<span class=hs-linenum>358: </span>     <span class='hs-num'>0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : (Vec &lt;True, \x1 VV -&gt; ((VV == 0) || (VV == (fib x1)))&gt; (Int)) | (VV == t1)}</span><span class='hs-varid'>t1</span></a><span class='hs-layout'>,</span><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV == n1)}</span><span class='hs-varid'>n1</span></a><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>(Vec &lt;True, \x18 VV -&gt; ((x17 == 0) || (x17 == (fib x18)))&gt; (Int))
--&gt; x2:(Int)
--&gt; ((Vec &lt;True, \x8 VV -&gt; ((x7 == 0) || (x7 == (fib x8)))&gt; (Int)), {x11 : (Int) | (x11 == (fib x2))})</span><span class='hs-varid'>fibMemo</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Vec &lt;True, \x7 VV -&gt; ((x6 == 0) || (x6 == (fib x7)))&gt; (Int)) | (x2 == t)}</span><span class='hs-varid'>t</span></a>  <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == i)}</span><span class='hs-varid'>i</span></a><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>359: </span>              <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : (Vec &lt;(VV /= i), \x1 VV -&gt; ((VV == 0) || (VV == (fib x1)))&gt; (Int)) | (VV == t2)}</span><span class='hs-varid'>t2</span></a><span class='hs-layout'>,</span><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV == n2)}</span><span class='hs-varid'>n2</span></a><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>(Vec &lt;True, \x18 VV -&gt; ((x17 == 0) || (x17 == (fib x18)))&gt; (Int))
--&gt; x2:(Int)
--&gt; ((Vec &lt;True, \x8 VV -&gt; ((x7 == 0) || (x7 == (fib x8)))&gt; (Int)), {x11 : (Int) | (x11 == (fib x2))})</span><span class='hs-varid'>fibMemo</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Vec &lt;True, \x8 VV -&gt; ((x7 == 0) || (x7 == (fib x8)))&gt; (Int)) | (x3 == t1) &amp;&amp; (x3 == t1)}</span><span class='hs-varid'>t1</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == i)}</span><span class='hs-varid'>i</span></a><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>360: </span>              <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>n</span></a>       <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:(Bool) -&gt; (Int) -&gt; {x2 : (Int) | ((Prop x1))}</span><span class='hs-varid'>liquidAssume</span></a> 
-<span class=hs-linenum>361: </span>                        <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:(Int)
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; ((fib x1) == (if (x1 &lt;= 1) then 1 else ((fib (x1 - 1)) + (fib (x1 - 2))))))}</span><span class='hs-varid'>axiom_fib</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == i)}</span><span class='hs-varid'>i</span></a><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n1) &amp;&amp; (x3 == n1)}</span><span class='hs-varid'>n1</span></a><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a><a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n2) &amp;&amp; (x3 == n2)}</span><span class='hs-varid'>n2</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>362: </span>          <span class='hs-keyword'>in</span> <a class=annot href="#"><span class=annottext>forall a b &lt;p2 :: a-&gt; b-&gt; Bool&gt;.
-x1:a
--&gt; x2:{VV : b&lt;p2 x1&gt; | true}
--&gt; {x3 : (a, b)&lt;p2&gt; | ((fst x3) == x1) &amp;&amp; ((snd x3) == x2)}</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>forall &lt;r :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool, d :: (GHC.Types.Int)-&gt; Bool&gt;.
-x1:{x13 : (Int)&lt;d&gt; | true}
--&gt; {x12 : (Int)&lt;r x1&gt; | true}
--&gt; (Vec &lt;d &amp; (x8 /= x1), \x10 VV -&gt; r x10&gt; (Int))
--&gt; (Vec &lt;d, \x4 VV -&gt; r x4&gt; (Int))</span><span class='hs-varid'>set</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == i)}</span><span class='hs-varid'>i</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == n)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Vec &lt;(x5 /= i), \x9 VV -&gt; ((x8 == 0) || (x8 == (fib x9)))&gt; (Int)) | (x3 == t2) &amp;&amp; (x3 == t2)}</span><span class='hs-varid'>t2</span></a><span class='hs-layout'>,</span>  <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == n)}</span><span class='hs-varid'>n</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>363: </span>     <span class='hs-varid'>n</span> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>{x2 : ({x7 : (Vec &lt;True, \x12 VV -&gt; ((x11 == 0) || (x11 == (fib x12)))&gt; (Int)) | (x7 == t)}, {x16 : (Int) | (x16 == (fib i)) &amp;&amp; (x16 /= 0)})&lt;\_ VV -&gt; (x16 == (fib i)) &amp;&amp; (x16 /= 0)&gt; | ((fst x2) == t)}</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{x2 : (Vec &lt;True, \x7 VV -&gt; ((x6 == 0) || (x6 == (fib x7)))&gt; (Int)) | (x2 == t)}</span><span class='hs-varid'>t</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | ((x3 == 0) || (x3 == (fib i)))}</span><span class='hs-varid'>n</span></a><span class='hs-layout'>)</span>
-</pre>
-
-Memoized Fibonacci 
-------------------
-
-- `fibMemo` *takes* a table initialized with `0`
-- `fibMemo` *returns* a table with `fib` values upto `n`.
-
-<br>
-
-
-<pre><span class=hs-linenum>375: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>fibMemo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FibV</span> 
-<span class=hs-linenum>376: </span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>i</span><span class='hs-conop'>:</span><span class='hs-conid'>Int</span> 
-<span class=hs-linenum>377: </span>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>FibV</span><span class='hs-layout'>,</span><span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span> <span class='hs-keyword'>| v = (fib i)}</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-
-Recap
------
-
-Created a `Vec` container 
-
-Decoupled *domain* and *range* invariants from *data*
-
-<br>
-
-<div class="fragment">
-
-Previous, special purpose program analyses 
-
-- [Gopan-Reps-Sagiv, POPL 05](link)
-- [J.-McMillan, CAV 07](link)
-- [Logozzo-Cousot-Cousot, POPL 11](link)
-- [Dillig-Dillig, POPL 12](link) 
-- ...
-
-Encoded as instance of abstract refinement types!
-</div>
-
-
-
-
diff --git a/docs/slides/plpv14/lhs/08_Recursive.lhs b/docs/slides/plpv14/lhs/08_Recursive.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/08_Recursive.lhs
+++ /dev/null
@@ -1,488 +0,0 @@
-Decouple Invariants From Data {#recursive} 
-==========================================
-
-Recursive Structures 
---------------------
-
-<div class="fragment">
-Lets see another example of decoupling...
-</div>
-
-<div class="hidden">
-\begin{code}
-{-# LANGUAGE NoMonomorphismRestriction #-}
-
-module List (insertSort) where
-
-{-@ LIQUID "--no-termination" @-}
-
-mergeSort     :: Ord a => [a] -> [a]
-insertSort :: (Ord a) => [a] -> L a 
-slist :: L Int
-slist' :: L Int
-iGoUp, iGoDn, iDiff :: [Int]
-infixr `C`
-\end{code}
-</div>
-
-Decouple Invariants From Recursive Data
-=======================================
-
-Recall: Lists
--------------
-
-\begin{code}
-data L a = N 
-         | C a (L a)
-\end{code}
-
-
-Recall: Refined Constructors 
-----------------------------
-
-Define *increasing* Lists with strengthened constructors:
-
-\begin{code} <br>
-data L a where
-  N :: L a
-  C :: hd:a -> tl: L {v:a | hd <= v} -> L a
-\end{code}
-
-Problem: Decreasing Lists?
---------------------------
-
-What if we need *both* [increasing and decreasing lists](http://web.cecs.pdx.edu/~sheard/Code/QSort.html)?
-
-<br>
-
-<div class="fragment">
-*Separate* types are tedious...
-</div>
-
-
-Abstract That Refinement!
--------------------------
-
-\begin{code}
-{-@ data L a <p :: a -> a -> Prop>
-      = N 
-      | C (hd :: a) (tl :: (L <p> a<p hd>)) @-}
-\end{code}
-
-<br>
-
-- <div class="fragment"> `p` is a *binary* relation between two `a` values</div>
-
-- <div class="fragment"> Definition relates `hd` with *all* the elements of `tl`</div>
-
-- <div class="fragment"> Recursive: `p` holds for *every pair* of elements!</div>
-
-Example
--------
-
-Consider a list with *three* or more elements 
-
-\begin{code} <br>
-x1 `C` x2 `C` x3 `C` rest :: L <p> a 
-\end{code}
-
-Example: Unfold Once
---------------------
-
-\begin{code} <br> 
-x1                 :: a
-x2 `C` x3 `C` rest :: L <p> a<p x1> 
-\end{code}
-
-Example: Unfold Twice
----------------------
-
-\begin{code} <br> 
-x1          :: a
-x2          :: a<p x1>  
-x3 `C` rest :: L <p> a<p x1 && p x2> 
-\end{code}
-
-Example: Unfold Thrice
-----------------------
-
-\begin{code} <br> 
-x1   :: a
-x2   :: a<p x1>  
-x3   :: a<p x1 && p x2>  
-rest :: L <p> a<p x1 && p x2 && p x3> 
-\end{code}
-
-<br>
-
-<div class="fragment">
-Note how `p` holds between **every pair** of elements in the list. 
-</div>
-
-A Concrete Example
-------------------
-
-That was a rather *abstract*!
-
-<br>
-
-How can we *use* fact that `p` holds between *every pair* ?
-
-
-Example: Increasing Lists
--------------------------
-
-*Instantiate* `p` with a *concrete* refinement
-
-<br>
-
-\begin{code}
-{-@ type IncL a = L <{\hd v -> hd <= v}> a @-}
-\end{code}
-
-<br>
-
-- <div class="fragment"> Refinement says `hd` less than each tail element `v`,</div>
-
-- <div class="fragment"> Thus, `IncL` denotes *increaing* lists. </div>
-
-Example: Increasing Lists
--------------------------
-
-LiquidHaskell verifies that `slist` is indeed increasing...
-
-\begin{code}
-{-@ slist :: IncL Int @-}
-slist     = 1 `C` 6 `C` 12 `C` N
-\end{code}
-
-<br> 
-
-<div class="fragment">
-
-... and protests that `slist'` is not: 
-
-\begin{code}
-{-@ slist' :: IncL Int @-}
-slist' = 6 `C` 1 `C` 12 `C` N
-\end{code}
-</div>
-
-Insertion Sort
---------------
-
-\begin{code}
-{-@ insertSort :: (Ord a) => [a] -> IncL a @-}
-insertSort     = foldr insert N
-
-insert y N          = y `C` N
-insert y (x `C` xs) 
-  | y < x           = y `C` (x `C` xs)
-  | otherwise       = x `C` insert y xs
-\end{code}
-
-<br>
-
-(*Hover* over `insert'` to see inferred type.)
-
-Checking GHC Lists
-------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target= "_blank">Demo:</a> 
-Above applies to GHC's List definition:
-
-\begin{code} <br> 
-data [a] <p :: a -> a -> Prop>
-  = [] 
-  | (:) (h :: a) (tl :: ([a<p h>]<p>))
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Increasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Incs a = [a]<{\h v -> h <= v}> @-}
-
-{-@ iGoUp :: Incs Int @-}
-iGoUp     = [1,2,3]
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Decreasing Lists
-
-<br>
-
-\begin{code}
-{-@ type Decs a = [a]<{\h v -> h >= v}> @-}
-
-{-@ iGoDn :: Decs Int @-}
-iGoDn     = [3,2,1]
-\end{code}
-
-
-Checking GHC Lists
-------------------
-
-Duplicate-free Lists
-
-<br>
-
-\begin{code}
-{-@ type Difs a = [a]<{\h v -> h /= v}> @-}
-
-{-@ iDiff :: Difs Int @-}
-iDiff     = [1,3,2]
-\end{code}
-
-Checking GHC Lists
-------------------
-
-Now we can check all the usual list sorting algorithms 
-
-Example: `mergeSort` [1/2]
---------------------------
-
-\begin{code}
-{-@ mergeSort  :: (Ord a) => [a] -> Incs a @-}
-mergeSort []   = []
-mergeSort [x]  = [x]
-mergeSort xs   = merge xs1' xs2' 
-  where 
-   (xs1, xs2)  = split xs
-   xs1'        = mergeSort xs1
-   xs2'        = mergeSort xs2
-\end{code}
-
-Example: `mergeSort` [1/2]
---------------------------
-
-\begin{code}
-split (x:y:zs) = (x:xs, y:ys) 
-  where 
-    (xs, ys)   = split zs
-split xs       = (xs, [])
-
-merge xs []    = xs
-merge [] ys    = ys
-merge (x:xs) (y:ys) 
-  | x <= y     = x : merge xs (y:ys)
-  | otherwise  = y : merge (x:xs) ys
-\end{code}
-
-Example: `Data.List.sort` 
--------------------------
-
-GHC's "official" list sorting routine
-
-Juggling lists of increasing & decreasing lists
-
-
-Ex: `Data.List.sort` [1/4]
---------------------------
-
-Juggling lists of increasing & decreasing lists
-
-<br>
-
-\begin{code}
-{-@ sort :: (Ord a) => [a] -> Incs a  @-}
-sort = mergeAll . sequences
-
-sequences (a:b:xs)
-  | a `compare` b == GT = descending b [a]  xs
-  | otherwise           = ascending  b (a:) xs
-sequences [x]           = [[x]]
-sequences []            = [[]]
-\end{code}
-
-Ex: `Data.List.sort` [2/4]
---------------------------
-
-Juggling lists of increasing & decreasing lists
-
-<br>
-
-\begin{code}
-descending a as (b:bs)
-  | a `compare` b == GT 
-  = descending b (a:as) bs
-descending a as bs      
-  = (a:as): sequences bs
-\end{code}
-
-Ex: `Data.List.sort` [3/4]
---------------------------
-
-Juggling lists of increasing & decreasing lists
-
-<br>
-
-
-\begin{code}
-ascending a as (b:bs)
-  | a `compare` b /= GT 
-  = ascending b (\ys -> as (a:ys)) bs
-ascending a as bs      
-  = as [a]: sequences bs
-\end{code}
-
-Ex: `Data.List.sort` [4/4]
---------------------------
-
-Juggling lists of increasing & decreasing lists
-
-<br>
-
-\begin{code}
-mergeAll [x]        = x
-mergeAll xs         = mergeAll (mergePairs xs)
-
-mergePairs (a:b:xs) = merge a b: mergePairs xs
-mergePairs [x]      = [x]
-mergePairs []       = []
-\end{code}
-
-Phew!
------
-
-Lets see one last example...
-
-
-Example: Binary Trees
----------------------
-
-... `Map` from keys of type `k` to values of type `a` 
-
-<br>
-
-<div class="fragment">
-
-Implemented, in `Data.Map` as a binary tree:
-
-<br>
-
-\begin{code}
-data Map k a = Tip
-             | Bin Size k a (Map k a) (Map k a)
-
-type Size    = Int
-\end{code}
-</div>
-
-Two Abstract Refinements
-------------------------
-
-- `l` : relates root `key` with `left`-subtree keys
-- `r` : relates root `key` with `right`-subtree keys
-
-\begin{code}
-{-@ data Map k a < l :: k -> k -> Prop
-                 , r :: k -> k -> Prop >
-    = Tip
-    | Bin (sz :: Size) (key :: k) (val :: a)
-          (left  :: Map <l,r> (k<l key>) a)
-          (right :: Map <l,r> (k<r key>) a) @-}
-\end{code}
-
-
-Ex: Binary Search Trees
------------------------
-
-Keys are *Binary-Search* Ordered
-
-<br>
-
-\begin{code}
-{-@ type BST k a = 
-      Map <{\r v -> v < r }, 
-           {\r v -> v > r }> 
-          k a                   @-}
-\end{code}
-
-Ex: Minimum Heaps 
------------------
-
-Root contains *minimum* value
-
-<br>
-
-\begin{code}
-{-@ type MinHeap k a = 
-      Map <{\r v -> r <= v}, 
-           {\r v -> r <= v}> 
-           k a               @-}
-\end{code}
-
-Ex: Maximum Heaps 
------------------
-
-Root contains *maximum* value
-
-<br>
-
-\begin{code}
-{-@ type MaxHeap k a = 
-      Map <{\r v -> r >= v}, 
-           {\r v -> r >= v}> 
-           k a               @-}
-\end{code}
-
-
-Example: Data.Map
------------------
-
-Standard Key-Value container
-
-- <div class="fragment">1300+ non-comment lines</div>
-
-- <div class="fragment">`insert`, `split`, `merge`,...</div>
-
-- <div class="fragment">Rotation, Rebalance,...</div>
-
-<div class="fragment">
-SMT & inference crucial for [verification](https://github.com/ucsd-progsys/liquidhaskell/blob/master/benchmarks/esop2013-submission/Base.hs)
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Map.hs" target="_blank">Demo:</a>Try online!
-</div>
-
-Recap: Abstract Refinements
----------------------------
-
-<div class="fragment">
-
-Decouple invariants from *functions*
-
-+ `max`
-+ `loop`
-+ `foldr`
-
-</div>
-
-<div class="fragment">
-Decouple invariants from *data*
-
-+ `Vector`
-+ `List`
-+ `Tree`
-
-</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract Refinements:* Decouple Invariants 
-5. <div class="fragment">Er, what of *lazy evaluation*?</div>
diff --git a/docs/slides/plpv14/lhs/08_Recursive.lhs.markdown b/docs/slides/plpv14/lhs/08_Recursive.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/08_Recursive.lhs.markdown
+++ /dev/null
@@ -1,671 +0,0 @@
-Decouple Invariants From Data {#recursive} 
-==========================================
-
-Recursive Structures 
---------------------
-
-<div class="fragment">
-Lets see another example of decoupling...
-</div>
-
-<div class="hidden">
-
-<pre><span class=hs-linenum>13: </span><span class='hs-comment'>{-# LANGUAGE NoMonomorphismRestriction #-}</span>
-<span class=hs-linenum>14: </span>
-<span class=hs-linenum>15: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>List</span> <span class='hs-layout'>(</span><span class='hs-varid'>insertSort</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>16: </span>
-<span class=hs-linenum>17: </span><span class='hs-keyword'>{-@</span> <span class='hs-conid'>LIQUID</span> <span class='hs-str'>"--no-termination"</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>18: </span>
-<span class=hs-linenum>19: </span><span class='hs-definition'>mergeSort</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
-<span class=hs-linenum>20: </span><span class='hs-definition'>insertSort</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> 
-<span class=hs-linenum>21: </span><span class='hs-definition'>slist</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>22: </span><span class='hs-definition'>slist'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>23: </span><span class='hs-definition'>iGoUp</span><span class='hs-layout'>,</span> <span class='hs-varid'>iGoDn</span><span class='hs-layout'>,</span> <span class='hs-varid'>iDiff</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Int</span><span class='hs-keyglyph'>]</span>
-<span class=hs-linenum>24: </span><span class='hs-keyword'>infixr</span> <span class='hs-varop'>`C`</span>
-</pre>
-</div>
-
-Decouple Invariants From Recursive Data
-=======================================
-
-Recall: Lists
--------------
-
-
-<pre><span class=hs-linenum>35: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span> 
-<span class=hs-linenum>36: </span>         <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-</pre>
-
-
-Recall: Refined Constructors 
-----------------------------
-
-Define *increasing* Lists with strengthened constructors:
-
- <br>
-<pre><span class=hs-linenum>46: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>47: </span>  <span class='hs-conid'>N</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>48: </span>  <span class='hs-conid'>C</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>hd</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tl</span><span class='hs-conop'>:</span> <span class='hs-conid'>L</span> <span class='hs-layout'>{</span><span class='hs-varid'>v</span><span class='hs-conop'>:</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>hd</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-</pre>
-
-Problem: Decreasing Lists?
---------------------------
-
-What if we need *both* [increasing and decreasing lists](http://web.cecs.pdx.edu/~sheard/Code/QSort.html)?
-
-<br>
-
-<div class="fragment">
-*Separate* types are tedious...
-</div>
-
-
-Abstract That Refinement!
--------------------------
-
-
-<pre><span class=hs-linenum>67: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;</span>
-<span class=hs-linenum>68: </span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span> 
-<span class=hs-linenum>69: </span>      <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span> <span class='hs-layout'>(</span><span class='hs-varid'>hd</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tl</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>hd</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-- <div class="fragment"> `p` is a *binary* relation between two `a` values</div>
-
-- <div class="fragment"> Definition relates `hd` with *all* the elements of `tl`</div>
-
-- <div class="fragment"> Recursive: `p` holds for *every pair* of elements!</div>
-
-Example
--------
-
-Consider a list with *three* or more elements 
-
- <br>
-<pre><span class=hs-linenum>86: </span><span class='hs-definition'>x1</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>x2</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>x3</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>rest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span> 
-</pre>
-
-Example: Unfold Once
---------------------
-
- <br> 
-<pre><span class=hs-linenum>93: </span><span class='hs-definition'>x1</span>                 <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>94: </span><span class='hs-definition'>x2</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>x3</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>rest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>x1</span><span class='hs-varop'>&gt;</span> 
-</pre>
-
-Example: Unfold Twice
----------------------
-
- <br> 
-<pre><span class=hs-linenum>101: </span><span class='hs-definition'>x1</span>          <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>102: </span><span class='hs-definition'>x2</span>          <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>x1</span><span class='hs-varop'>&gt;</span>  
-<span class=hs-linenum>103: </span><span class='hs-definition'>x3</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>rest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>x1</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>p</span> <span class='hs-varid'>x2</span><span class='hs-varop'>&gt;</span> 
-</pre>
-
-Example: Unfold Thrice
-----------------------
-
- <br> 
-<pre><span class=hs-linenum>110: </span><span class='hs-definition'>x1</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span>
-<span class=hs-linenum>111: </span><span class='hs-definition'>x2</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>x1</span><span class='hs-varop'>&gt;</span>  
-<span class=hs-linenum>112: </span><span class='hs-definition'>x3</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>x1</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>p</span> <span class='hs-varid'>x2</span><span class='hs-varop'>&gt;</span>  
-<span class=hs-linenum>113: </span><span class='hs-definition'>rest</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>x1</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>p</span> <span class='hs-varid'>x2</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>p</span> <span class='hs-varid'>x3</span><span class='hs-varop'>&gt;</span> 
-</pre>
-
-<br>
-
-<div class="fragment">
-Note how `p` holds between **every pair** of elements in the list. 
-</div>
-
-A Concrete Example
-------------------
-
-That was a rather *abstract*!
-
-<br>
-
-How can we *use* fact that `p` holds between *every pair* ?
-
-
-Example: Increasing Lists
--------------------------
-
-*Instantiate* `p` with a *concrete* refinement
-
-<br>
-
-
-<pre><span class=hs-linenum>140: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>IncL</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>hd</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>hd</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-- <div class="fragment"> Refinement says `hd` less than each tail element `v`,</div>
-
-- <div class="fragment"> Thus, `IncL` denotes *increaing* lists. </div>
-
-Example: Increasing Lists
--------------------------
-
-LiquidHaskell verifies that `slist` is indeed increasing...
-
-
-<pre><span class=hs-linenum>155: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>slist</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IncL</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>156: </span><a class=annot href="#"><span class=annottext>(L &lt;\hd2 VV -&gt; (hd2 &lt;= VV)&gt; (Int))</span><span class='hs-definition'>slist</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-x1:{x10 : (Int) | (x10 &gt; 0)}
--&gt; (L &lt;p&gt; {x10 : (Int)&lt;p x1&gt; | (x10 &gt; 0)})
--&gt; (L &lt;p&gt; {x10 : (Int) | (x10 &gt; 0)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (6  :  int))}</span><span class='hs-num'>6</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-x1:{x10 : (Int) | (x10 &gt; 0)}
--&gt; (L &lt;p&gt; {x10 : (Int)&lt;p x1&gt; | (x10 &gt; 0)})
--&gt; (L &lt;p&gt; {x10 : (Int) | (x10 &gt; 0)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (12  :  int))}</span><span class='hs-num'>12</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-x1:{x10 : (Int) | (x10 &gt; 0)}
--&gt; (L &lt;p&gt; {x10 : (Int)&lt;p x1&gt; | (x10 &gt; 0)})
--&gt; (L &lt;p&gt; {x10 : (Int) | (x10 &gt; 0)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>(L &lt;\_ VV -&gt; false&gt; {x3 : (Int) | false})</span><span class='hs-conid'>N</span></a>
-</pre>
-
-<br> 
-
-<div class="fragment">
-
-... and protests that `slist'` is not: 
-
-
-<pre><span class=hs-linenum>166: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>slist'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IncL</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>167: </span><a class=annot href="#"><span class=annottext>(L &lt;\hd2 VV -&gt; (hd2 &lt;= VV)&gt; (Int))</span><span class='hs-definition'>slist'</span></a> <span class='hs-keyglyph'>=</span> <span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (6  :  int))}</span><span class='hs-num'>6</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-x1:{x10 : (Int) | (x10 &gt; 0)}
--&gt; (L &lt;p&gt; {x10 : (Int)&lt;p x1&gt; | (x10 &gt; 0)})
--&gt; (L &lt;p&gt; {x10 : (Int) | (x10 &gt; 0)})</span><span class='hs-varop'>`C`</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-x1:{x10 : (Int) | (x10 &gt; 0)}
--&gt; (L &lt;p&gt; {x10 : (Int)&lt;p x1&gt; | (x10 &gt; 0)})
--&gt; (L &lt;p&gt; {x10 : (Int) | (x10 &gt; 0)})</span><span class='hs-varop'>`C`</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (12  :  int))}</span><span class='hs-num'>12</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>forall &lt;p :: (GHC.Types.Int)-&gt; (GHC.Types.Int)-&gt; Bool&gt;.
-x1:{x10 : (Int) | (x10 &gt; 0)}
--&gt; (L &lt;p&gt; {x10 : (Int)&lt;p x1&gt; | (x10 &gt; 0)})
--&gt; (L &lt;p&gt; {x10 : (Int) | (x10 &gt; 0)})</span><span class='hs-varop'>`C`</span></a></span><span class=hs-error> </span><span class=hs-error><a class=annot href="#"><span class=annottext>(L &lt;\_ VV -&gt; false&gt; {x3 : (Int) | false})</span><span class='hs-conid'>N</span></a></span>
-</pre>
-</div>
-
-Insertion Sort
---------------
-
-
-<pre><span class=hs-linenum>175: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>insertSort</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IncL</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>176: </span><a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; [a] -&gt; (L &lt;\hd2 VV -&gt; (hd2 &lt;= VV)&gt; a)</span><span class='hs-definition'>insertSort</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>(a
- -&gt; (L &lt;\x11 VV -&gt; (VV &gt;= x11)&gt; a)
- -&gt; (L &lt;\x11 VV -&gt; (VV &gt;= x11)&gt; a))
--&gt; (L &lt;\x11 VV -&gt; (VV &gt;= x11)&gt; a)
--&gt; [a]
--&gt; (L &lt;\x11 VV -&gt; (VV &gt;= x11)&gt; a)</span><span class='hs-varid'>foldr</span></a> <a class=annot href="#"><span class=annottext>a -&gt; (L &lt;\x4 VV -&gt; (VV &gt;= x4)&gt; a) -&gt; (L &lt;\x2 VV -&gt; (VV &gt;= x2)&gt; a)</span><span class='hs-varid'>insert</span></a> <a class=annot href="#"><span class=annottext>(L &lt;\_ VV -&gt; false&gt; {VV : a | false})</span><span class='hs-conid'>N</span></a>
-<span class=hs-linenum>177: </span>
-<span class=hs-linenum>178: </span><a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-a -&gt; (L &lt;\x2 VV -&gt; (VV &gt;= x2)&gt; a) -&gt; (L &lt;\x1 VV -&gt; (VV &gt;= x1)&gt; a)</span><span class='hs-definition'>insert</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>y</span></a> <span class='hs-conid'>N</span>          <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (VV == y)}
--&gt; (L &lt;p&gt; {VV : a&lt;p x1&gt; | (VV == y)})
--&gt; (L &lt;p&gt; {VV : a | (VV == y)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>(L &lt;\_ VV -&gt; false&gt; {VV : a | false})</span><span class='hs-conid'>N</span></a>
-<span class=hs-linenum>179: </span><span class='hs-definition'>insert</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>180: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>x1:a -&gt; x2:a -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>&lt;</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a>           <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (VV &gt;= y)}
--&gt; (L &lt;p&gt; {VV : a&lt;p x1&gt; | (VV &gt;= y)})
--&gt; (L &lt;p&gt; {VV : a | (VV &gt;= y)})</span><span class='hs-varop'>`C`</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (VV &gt; y) &amp;&amp; (VV &gt;= x)}
--&gt; (L &lt;p&gt; {VV : a&lt;p x1&gt; | (VV &gt; y) &amp;&amp; (VV &gt;= x)})
--&gt; (L &lt;p&gt; {VV : a | (VV &gt; y) &amp;&amp; (VV &gt;= x)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (L &lt;\x3 VV -&gt; (VV &gt;= x3)&gt; {VV : a | (VV &gt;= x)}) | (x2 == xs)}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>181: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>       <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (VV &gt;= x)}
--&gt; (L &lt;p&gt; {VV : a&lt;p x1&gt; | (VV &gt;= x)})
--&gt; (L &lt;p&gt; {VV : a | (VV &gt;= x)})</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-a -&gt; (L &lt;\x2 VV -&gt; (VV &gt;= x2)&gt; a) -&gt; (L &lt;\x1 VV -&gt; (VV &gt;= x1)&gt; a)</span><span class='hs-varid'>insert</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>{x2 : (L &lt;\x3 VV -&gt; (VV &gt;= x3)&gt; {VV : a | (VV &gt;= x)}) | (x2 == xs)}</span><span class='hs-varid'>xs</span></a>
-</pre>
-
-<br>
-
-(*Hover* over `insert'` to see inferred type.)
-
-Checking GHC Lists
-------------------
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Order.hs" target= "_blank">Demo:</a> 
-Above applies to GHC's List definition:
-
- <br> 
-<pre><span class=hs-linenum>195: </span><span class='hs-keyword'>data</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span><span class='hs-varop'>&gt;</span>
-<span class=hs-linenum>196: </span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span> 
-<span class=hs-linenum>197: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>h</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tl</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span> <span class='hs-varid'>h</span><span class='hs-varop'>&gt;</span><span class='hs-keyglyph'>]</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>p</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
-</pre>
-
-Checking GHC Lists
-------------------
-
-Increasing Lists
-
-<br>
-
-
-<pre><span class=hs-linenum>208: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Incs</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>h</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>209: </span>
-<span class=hs-linenum>210: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>iGoUp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Incs</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>211: </span><a class=annot href="#"><span class=annottext>[(Int)]&lt;\h6 VV -&gt; (h6 &lt;= VV)&gt;</span><span class='hs-definition'>iGoUp</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x4 : [{x14 : (Int) | (x14 &gt; 0)}]&lt;\x11 VV -&gt; (x11 /= x12) &amp;&amp; (x12 &gt; 0) &amp;&amp; (x12 &gt; x11) &amp;&amp; (x11 &lt;= x12)&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>,</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a><span class='hs-layout'>,</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a><span class='hs-keyglyph'>]</span>
-</pre>
-
-Checking GHC Lists
-------------------
-
-Decreasing Lists
-
-<br>
-
-
-<pre><span class=hs-linenum>222: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Decs</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>h</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>223: </span>
-<span class=hs-linenum>224: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>iGoDn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Decs</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>225: </span><a class=annot href="#"><span class=annottext>[(Int)]&lt;\h8 VV -&gt; (h8 &gt;= VV)&gt;</span><span class='hs-definition'>iGoDn</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x4 : [{x15 : (Int) | (x15 &gt; 0)}]&lt;\x13 VV -&gt; (x12 == 1) &amp;&amp; (x13 /= x12) &amp;&amp; (x12 &gt; 0) &amp;&amp; (x13 &gt;= x12) &amp;&amp; (x12 &lt; x13)&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a><span class='hs-layout'>,</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a><span class='hs-layout'>,</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-keyglyph'>]</span>
-</pre>
-
-
-Checking GHC Lists
-------------------
-
-Duplicate-free Lists
-
-<br>
-
-
-<pre><span class=hs-linenum>237: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>Difs</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>h</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>h</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>238: </span>
-<span class=hs-linenum>239: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>iDiff</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Difs</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>240: </span><a class=annot href="#"><span class=annottext>[(Int)]&lt;\h10 VV -&gt; (h10 /= VV)&gt;</span><span class='hs-definition'>iDiff</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x4 : [{x14 : (Int) | (x14 &gt; 0)}]&lt;\x12 VV -&gt; (x12 /= x11) &amp;&amp; (x11 &gt; 0) &amp;&amp; (x12 &gt;= x11) &amp;&amp; (x11 &lt; x12)&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>,</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (3  :  int))}</span><span class='hs-num'>3</span></a><span class='hs-layout'>,</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a><span class='hs-keyglyph'>]</span>
-</pre>
-
-Checking GHC Lists
-------------------
-
-Now we can check all the usual list sorting algorithms 
-
-Example: `mergeSort` [1/2]
---------------------------
-
-
-<pre><span class=hs-linenum>252: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>mergeSort</span>  <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Incs</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>253: </span><a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; [a] -&gt; [a]&lt;\h6 VV -&gt; (h6 &lt;= VV)&gt;</span><span class='hs-definition'>mergeSort</span></a> <span class='hs-conid'>[]</span>   <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-{x4 : [{VV : a | false}]&lt;p&gt; | (((null x4)) &lt;=&gt; true) &amp;&amp; ((len x4) == 0) &amp;&amp; ((sumLens x4) == 0)}</span><span class='hs-conid'>[]</span></a>
-<span class=hs-linenum>254: </span><span class='hs-definition'>mergeSort</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x6 : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | (((null x6)) &lt;=&gt; true) &amp;&amp; ((len x6) == 0) &amp;&amp; ((sumLens x6) == 0) &amp;&amp; ((len x6) &gt;= 0) &amp;&amp; ((sumLens x6) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a><span class='hs-keyglyph'>]</span>
-<span class=hs-linenum>255: </span><span class='hs-definition'>mergeSort</span> <span class='hs-varid'>xs</span>   <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x10 : [a]&lt;\x11 VV -&gt; (VV &gt;= x11)&gt; | ((len x10) &gt;= 0)}
--&gt; x2:{x7 : [a]&lt;\x8 VV -&gt; (VV &gt;= x8)&gt; | ((len x7) &gt;= 0)}
--&gt; {x4 : [a]&lt;\x5 VV -&gt; (x5 &lt;= VV)&gt; | ((len x4) &gt;= 0) &amp;&amp; ((len x4) &gt;= (len x1)) &amp;&amp; ((len x4) &gt;= (len x2))}</span><span class='hs-varid'>merge</span></a> <a class=annot href="#"><span class=annottext>{x4 : [a]&lt;\x5 VV -&gt; (x5 &lt;= VV)&gt; | (x4 == xs1') &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs1'</span></a> <a class=annot href="#"><span class=annottext>{x4 : [a]&lt;\x5 VV -&gt; (x5 &lt;= VV)&gt; | (x4 == xs2') &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs2'</span></a> 
-<span class=hs-linenum>256: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>257: </span>   <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : [a] | (VV == xs1) &amp;&amp; ((len VV) == (len xs1)) &amp;&amp; ((len VV) &gt;= 0) &amp;&amp; ((len VV) &gt;= (len xs2))}</span><span class='hs-varid'>xs1</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV == xs2) &amp;&amp; ((len VV) == (len xs2)) &amp;&amp; ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len xs1)) &amp;&amp; ((len VV) &lt;= (len xs1))}</span><span class='hs-varid'>xs2</span></a><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x14 : [a] | ((len x14) &gt; 0)}
--&gt; ({x9 : [a] | ((len x9) &gt;= 0) &amp;&amp; ((len x9) &lt;= (len x1))}, {x12 : [a] | ((len x12) &gt;= 0) &amp;&amp; ((len x12) &lt;= (len x1))})&lt;\x5 VV -&gt; ((len x6) &gt;= 0) &amp;&amp; ((len x6) &lt;= (len x5)) &amp;&amp; ((len x6) &lt;= (len x1))&gt;</span><span class='hs-varid'>split</span></a> <a class=annot href="#"><span class=annottext>{x3 : [a] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-<span class=hs-linenum>258: </span>   <a class=annot href="#"><span class=annottext>[a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt;</span><span class='hs-varid'>xs1'</span></a>        <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>[a] -&gt; [a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt;</span><span class='hs-varid'>mergeSort</span></a> <a class=annot href="#"><span class=annottext>{x7 : [a] | (x7 == xs1) &amp;&amp; (x7 == xs1) &amp;&amp; ((len x7) == (len xs1)) &amp;&amp; ((len x7) &gt;= 0) &amp;&amp; ((len x7) &gt;= (len xs2)) &amp;&amp; ((sumLens x7) &gt;= 0)}</span><span class='hs-varid'>xs1</span></a>
-<span class=hs-linenum>259: </span>   <a class=annot href="#"><span class=annottext>[a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt;</span><span class='hs-varid'>xs2'</span></a>        <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>[a] -&gt; [a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt;</span><span class='hs-varid'>mergeSort</span></a> <a class=annot href="#"><span class=annottext>{x8 : [a] | (x8 == xs2) &amp;&amp; (x8 == xs2) &amp;&amp; ((len x8) == (len xs2)) &amp;&amp; ((len x8) &gt;= 0) &amp;&amp; ((sumLens x8) &gt;= 0) &amp;&amp; ((len x8) &lt;= (len xs1)) &amp;&amp; ((len x8) &lt;= (len xs1))}</span><span class='hs-varid'>xs2</span></a>
-</pre>
-
-Example: `mergeSort` [1/2]
---------------------------
-
-
-<pre><span class=hs-linenum>266: </span><a class=annot href="#"><span class=annottext>forall a.
-x1:{VV : [a] | ((len VV) &gt;= 0)}
--&gt; ({VV : [a] | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len x1))}, {VV : [a] | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len x1))})&lt;\x1 VV -&gt; ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len x1)) &amp;&amp; ((len VV) &lt;= (len x1))&gt;</span><span class='hs-definition'>split</span></a> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-varid'>zs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a b &lt;p2 :: a-&gt; b-&gt; Bool&gt;.
-x1:a
--&gt; x2:{VV : b&lt;p2 x1&gt; | true}
--&gt; {x3 : (a, b)&lt;p2&gt; | ((fst x3) == x1) &amp;&amp; ((snd x3) == x2)}</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:a
--&gt; x2:[{VV : a&lt;p x1&gt; | true}]&lt;p&gt;
--&gt; {x4 : [a]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{x8 : [a] | (x8 == xs) &amp;&amp; (x8 == xs) &amp;&amp; ((len x8) == (len xs)) &amp;&amp; ((len x8) &gt;= 0) &amp;&amp; ((len x8) &gt;= (len ys)) &amp;&amp; ((sumLens x8) &gt;= 0) &amp;&amp; ((len x8) &lt;= (len zs))}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:a
--&gt; x2:[{VV : a&lt;p x1&gt; | true}]&lt;p&gt;
--&gt; {x4 : [a]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{x9 : [a] | (x9 == ys) &amp;&amp; (x9 == ys) &amp;&amp; ((len x9) == (len ys)) &amp;&amp; ((len x9) &gt;= 0) &amp;&amp; ((sumLens x9) &gt;= 0) &amp;&amp; ((len x9) &lt;= (len xs)) &amp;&amp; ((len x9) &lt;= (len xs)) &amp;&amp; ((len x9) &lt;= (len zs))}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>)</span> 
-<span class=hs-linenum>267: </span>  <span class='hs-keyword'>where</span> 
-<span class=hs-linenum>268: </span>    <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : [a] | (VV == xs) &amp;&amp; ((len VV) == (len xs)) &amp;&amp; ((len VV) &gt;= 0) &amp;&amp; ((len VV) &gt;= (len ys)) &amp;&amp; ((len VV) &lt;= (len zs))}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{VV : [a] | (VV == ys) &amp;&amp; ((len VV) == (len ys)) &amp;&amp; ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len xs)) &amp;&amp; ((len VV) &lt;= (len xs)) &amp;&amp; ((len VV) &lt;= (len zs))}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a.
-x1:{VV : [a] | ((len VV) &gt;= 0)}
--&gt; ({VV : [a] | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len x1))}, {VV : [a] | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len x1))})&lt;\x1 VV -&gt; ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len x1)) &amp;&amp; ((len VV) &lt;= (len x1))&gt;</span><span class='hs-varid'>split</span></a> <a class=annot href="#"><span class=annottext>{x4 : [a] | (x4 == zs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>zs</span></a>
-<span class=hs-linenum>269: </span><span class='hs-definition'>split</span> <span class='hs-varid'>xs</span>       <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a b &lt;p2 :: a-&gt; b-&gt; Bool&gt;.
-x1:a
--&gt; x2:{VV : b&lt;p2 x1&gt; | true}
--&gt; {x3 : (a, b)&lt;p2&gt; | ((fst x3) == x1) &amp;&amp; ((snd x3) == x2)}</span><span class='hs-layout'>(</span></a><a class=annot href="#"><span class=annottext>{x3 : [a] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>,</span> <a class=annot href="#"><span class=annottext>{x6 : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | (((null x6)) &lt;=&gt; true) &amp;&amp; ((len x6) == 0) &amp;&amp; ((sumLens x6) == 0) &amp;&amp; ((len x6) &gt;= 0) &amp;&amp; ((sumLens x6) &gt;= 0)}</span><span class='hs-conid'>[]</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>270: </span>
-<span class=hs-linenum>271: </span><a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-xs:{VV : [a]&lt;\x3 VV -&gt; (VV &gt;= x3)&gt; | ((len VV) &gt;= 0)}
--&gt; x1:{VV : [a]&lt;\x2 VV -&gt; (VV &gt;= x2)&gt; | ((len VV) &gt;= 0)}
--&gt; {VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &gt;= (len x1)) &amp;&amp; ((len VV) &gt;= (len xs))}</span><span class='hs-definition'>merge</span></a> <a class=annot href="#"><span class=annottext>{VV : [a]&lt;\x1 VV -&gt; (VV &gt;= x1)&gt; | ((len VV) &gt;= 0)}</span><span class='hs-varid'>xs</span></a> <span class='hs-conid'>[]</span>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x4 : [a]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-<span class=hs-linenum>272: </span><span class='hs-definition'>merge</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>ys</span>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x3 : [a]&lt;\x4 VV -&gt; (VV &gt;= x4)&gt; | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-varid'>ys</span></a>
-<span class=hs-linenum>273: </span><span class='hs-definition'>merge</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> 
-<span class=hs-linenum>274: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x1:a -&gt; x2:a -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt;= x2))}</span><span class='hs-varop'>&lt;=</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (x &lt;= VV)}
--&gt; x2:[{VV : a&lt;p x1&gt; | (x &lt;= VV)}]&lt;p&gt;
--&gt; {x4 : [{VV : a | (x &lt;= VV)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-xs:{VV : [a]&lt;\x3 VV -&gt; (VV &gt;= x3)&gt; | ((len VV) &gt;= 0)}
--&gt; x1:{VV : [a]&lt;\x2 VV -&gt; (VV &gt;= x2)&gt; | ((len VV) &gt;= 0)}
--&gt; {VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &gt;= (len x1)) &amp;&amp; ((len VV) &gt;= (len xs))}</span><span class='hs-varid'>merge</span></a> <a class=annot href="#"><span class=annottext>{x4 : [{VV : a | (VV &gt;= x)}]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (x &lt;= VV) &amp;&amp; (y &lt;= VV)}
--&gt; x2:[{VV : a&lt;p x1&gt; | (x &lt;= VV) &amp;&amp; (y &lt;= VV)}]&lt;p&gt;
--&gt; {x4 : [{VV : a | (x &lt;= VV) &amp;&amp; (y &lt;= VV)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{x4 : [{VV : a | (VV &gt;= y)}]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 == ys) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>275: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (VV &gt;= y)}
--&gt; x2:[{VV : a&lt;p x1&gt; | (VV &gt;= y)}]&lt;p&gt;
--&gt; {x4 : [{VV : a | (VV &gt;= y)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-xs:{VV : [a]&lt;\x3 VV -&gt; (VV &gt;= x3)&gt; | ((len VV) &gt;= 0)}
--&gt; x1:{VV : [a]&lt;\x2 VV -&gt; (VV &gt;= x2)&gt; | ((len VV) &gt;= 0)}
--&gt; {VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &gt;= (len x1)) &amp;&amp; ((len VV) &gt;= (len xs))}</span><span class='hs-varid'>merge</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (VV &gt; y)}
--&gt; x2:[{VV : a&lt;p x1&gt; | (VV &gt; y)}]&lt;p&gt;
--&gt; {x4 : [{VV : a | (VV &gt; y)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{x4 : [{VV : a | (VV &gt;= x)}]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x4 : [{VV : a | (VV &gt;= y)}]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 == ys) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>ys</span></a>
-</pre>
-
-Example: `Data.List.sort` 
--------------------------
-
-GHC's "official" list sorting routine
-
-Juggling lists of increasing & decreasing lists
-
-
-Ex: `Data.List.sort` [1/4]
---------------------------
-
-Juggling lists of increasing & decreasing lists
-
-<br>
-
-
-<pre><span class=hs-linenum>294: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>sort</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Incs</span> <span class='hs-varid'>a</span>  <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>295: </span><a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; [a] -&gt; [a]&lt;\h6 VV -&gt; (h6 &lt;= VV)&gt;</span><span class='hs-definition'>sort</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x5 : [{x9 : [a]&lt;\x10 VV -&gt; (x10 &lt;= VV)&gt; | ((len x9) &gt;= 0)}]&lt;\_ VV -&gt; ((len x7) &gt;= 0)&gt; | ((len x5) &gt; 0)}
--&gt; {x2 : [a]&lt;\x3 VV -&gt; (x3 &lt;= VV)&gt; | ((len x2) &gt;= 0)}</span><span class='hs-varid'>mergeAll</span></a> <a class=annot href="#"><span class=annottext>forall &lt;q :: [a]-&gt; [[a]]-&gt; Bool, p :: [[a]]-&gt; [a]-&gt; Bool&gt;.
-(x:{x26 : [{x30 : [a]&lt;\x31 VV -&gt; (x31 &lt;= VV)&gt; | ((len x30) &gt;= 0)}]&lt;\_ VV -&gt; ((len x28) &gt;= 0)&gt; | ((len x26) &gt; 0)}
- -&gt; {x23 : [a]&lt;\x24 VV -&gt; (x24 &lt;= VV)&gt;&lt;p x&gt; | ((len x23) &gt;= 0)})
--&gt; (y:[a]
-    -&gt; {x26 : [{x30 : [a]&lt;\x31 VV -&gt; (x31 &lt;= VV)&gt; | ((len x30) &gt;= 0)}]&lt;\_ VV -&gt; ((len x28) &gt;= 0)&gt;&lt;q y&gt; | ((len x26) &gt; 0)})
--&gt; x3:[a]
--&gt; exists [z:{x26 : [{x30 : [a]&lt;\x31 VV -&gt; (x31 &lt;= VV)&gt; | ((len x30) &gt;= 0)}]&lt;\_ VV -&gt; ((len x28) &gt;= 0)&gt;&lt;q x3&gt; | ((len x26) &gt; 0)}].{x23 : [a]&lt;\x24 VV -&gt; (x24 &lt;= VV)&gt;&lt;p z&gt; | ((len x23) &gt;= 0)}</span><span class='hs-varop'>.</span></a> <a class=annot href="#"><span class=annottext>[a]
--&gt; {x2 : [{x6 : [a]&lt;\x7 VV -&gt; (x7 &lt;= VV)&gt; | ((len x6) &gt;= 0)}]&lt;\_ VV -&gt; ((len x4) &gt;= 0)&gt; | ((len x2) &gt; 0)}</span><span class='hs-varid'>sequences</span></a>
-<span class=hs-linenum>296: </span>
-<span class=hs-linenum>297: </span><a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-[a]
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-definition'>sequences</span></a> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-conop'>:</span><span class='hs-varid'>b</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>298: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:a
--&gt; x2:a
--&gt; {x4 : (Ordering) | ((x4 == GHC.Types.EQ) &lt;=&gt; (x1 == x2)) &amp;&amp; ((x4 == GHC.Types.GT) &lt;=&gt; (x1 &gt; x2)) &amp;&amp; ((x4 == GHC.Types.LT) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>`compare`</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == b)}</span><span class='hs-varid'>b</span></a> <a class=annot href="#"><span class=annottext>x1:(Ordering)
--&gt; x2:(Ordering) -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 == x2))}</span><span class='hs-varop'>==</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Ordering) | (x3 == GHC.Types.GT) &amp;&amp; ((cmp x3) == GHC.Types.GT)}</span><span class='hs-conid'>GT</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-a:a
--&gt; {VV : [{VV : a | (VV &gt; a)}]&lt;\x2 VV -&gt; (VV &gt; a) &amp;&amp; (VV &gt; x2)&gt; | ((len VV) &gt; 0)}
--&gt; {VV : [a] | ((len VV) &gt;= 0)}
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-varid'>descending</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == b)}</span><span class='hs-varid'>b</span></a> <a class=annot href="#"><span class=annottext>{x4 : [{VV : a | (VV == a) &amp;&amp; (VV &gt; b)}]&lt;\_ VV -&gt; false&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a><span class='hs-keyglyph'>]</span>  <a class=annot href="#"><span class=annottext>{x4 : [a] | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-<span class=hs-linenum>299: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>           <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-a:a
--&gt; (x1:{VV : [{VV : a | (VV &gt;= a)}]&lt;\x3 VV -&gt; (a &lt;= VV) &amp;&amp; (x3 &lt;= VV)&gt; | ((len VV) &gt; 0)}
-    -&gt; {VV : [a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt; | (VV /= x1) &amp;&amp; ((len VV) &gt; 0) &amp;&amp; ((len VV) &gt; (len x1))})
--&gt; {VV : [a] | ((len VV) &gt;= 0)}
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-varid'>ascending</span></a>  <a class=annot href="#"><span class=annottext>{VV : a | (VV == b)}</span><span class='hs-varid'>b</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (a &lt;= VV)}
--&gt; x2:[{VV : a&lt;p x1&gt; | (a &lt;= VV)}]&lt;p&gt;
--&gt; {x4 : [{VV : a | (a &lt;= VV)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x4 : [a] | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-<span class=hs-linenum>300: </span><span class='hs-definition'>sequences</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span>           <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x6 : [{x8 : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | false}]&lt;\_ VV -&gt; false&gt; | (((null x6)) &lt;=&gt; true) &amp;&amp; ((len x6) == 0) &amp;&amp; ((sumLens x6) == 0) &amp;&amp; ((len x6) &gt;= 0) &amp;&amp; ((sumLens x6) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{x4 : [{VV : a | (VV == a)}]&lt;\_ VV -&gt; false&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>x</span></a><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
-<span class=hs-linenum>301: </span><span class='hs-definition'>sequences</span> <span class='hs-conid'>[]</span>            <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x6 : [{x8 : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | false}]&lt;\_ VV -&gt; false&gt; | (((null x6)) &lt;=&gt; true) &amp;&amp; ((len x6) == 0) &amp;&amp; ((sumLens x6) == 0) &amp;&amp; ((len x6) &gt;= 0) &amp;&amp; ((sumLens x6) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{x6 : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | (((null x6)) &lt;=&gt; true) &amp;&amp; ((len x6) == 0) &amp;&amp; ((sumLens x6) == 0) &amp;&amp; ((len x6) &gt;= 0) &amp;&amp; ((sumLens x6) &gt;= 0)}</span><span class='hs-conid'>[]</span></a><span class='hs-keyglyph'>]</span>
-</pre>
-
-Ex: `Data.List.sort` [2/4]
---------------------------
-
-Juggling lists of increasing & decreasing lists
-
-<br>
-
-
-<pre><span class=hs-linenum>312: </span><a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-a:a
--&gt; {VV : [{VV : a | (VV &gt; a)}]&lt;\x2 VV -&gt; (VV &gt; a) &amp;&amp; (VV &gt; x2)&gt; | ((len VV) &gt; 0)}
--&gt; {VV : [a] | ((len VV) &gt;= 0)}
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-definition'>descending</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>{VV : [{VV : a | (VV &gt; a)}]&lt;\x1 VV -&gt; (VV &gt; a) &amp;&amp; (VV &gt; x1)&gt; | ((len VV) &gt; 0)}</span><span class='hs-keyword'>as</span></a> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-conop'>:</span><span class='hs-varid'>bs</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>313: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:a
--&gt; x2:a
--&gt; {x4 : (Ordering) | ((x4 == GHC.Types.EQ) &lt;=&gt; (x1 == x2)) &amp;&amp; ((x4 == GHC.Types.GT) &lt;=&gt; (x1 &gt; x2)) &amp;&amp; ((x4 == GHC.Types.LT) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>`compare`</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == b)}</span><span class='hs-varid'>b</span></a> <a class=annot href="#"><span class=annottext>x1:(Ordering)
--&gt; x2:(Ordering) -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 == x2))}</span><span class='hs-varop'>==</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Ordering) | (x3 == GHC.Types.GT) &amp;&amp; ((cmp x3) == GHC.Types.GT)}</span><span class='hs-conid'>GT</span></a> 
-<span class=hs-linenum>314: </span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-a:a
--&gt; {VV : [{VV : a | (VV &gt; a)}]&lt;\x2 VV -&gt; (VV &gt; a) &amp;&amp; (VV &gt; x2)&gt; | ((len VV) &gt; 0)}
--&gt; {VV : [a] | ((len VV) &gt;= 0)}
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-varid'>descending</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == b)}</span><span class='hs-varid'>b</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (VV &gt; b)}
--&gt; x2:[{VV : a&lt;p x1&gt; | (VV &gt; b)}]&lt;p&gt;
--&gt; {x4 : [{VV : a | (VV &gt; b)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{x5 : [{VV : a | (VV &gt; a)}]&lt;\x6 VV -&gt; (VV &gt; a) &amp;&amp; (VV &gt; x6)&gt; | (x5 == as) &amp;&amp; ((len x5) &gt; 0) &amp;&amp; ((len x5) &gt;= 0) &amp;&amp; ((sumLens x5) &gt;= 0)}</span><span class='hs-keyword'>as</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x4 : [a] | (x4 == bs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>bs</span></a>
-<span class=hs-linenum>315: </span><span class='hs-definition'>descending</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>as</span> <span class='hs-varid'>bs</span>      
-<span class=hs-linenum>316: </span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (a &lt;= VV)}
--&gt; x2:[{VV : a&lt;p x1&gt; | (a &lt;= VV)}]&lt;p&gt;
--&gt; {x4 : [{VV : a | (a &lt;= VV)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{x5 : [{VV : a | (VV &gt; a)}]&lt;\x6 VV -&gt; (VV &gt; a) &amp;&amp; (VV &gt; x6)&gt; | (x5 == as) &amp;&amp; ((len x5) &gt; 0) &amp;&amp; ((len x5) &gt;= 0) &amp;&amp; ((sumLens x5) &gt;= 0)}</span><span class='hs-keyword'>as</span></a><span class='hs-layout'>)</span><a class=annot href="#"><span class=annottext>forall &lt;p :: [a]-&gt; [a]-&gt; Bool&gt;.
-x1:{x15 : [a]&lt;\x16 VV -&gt; (x16 &lt;= VV)&gt; | ((len x15) &gt;= 0)}
--&gt; x2:[{x15 : [a]&lt;\x16 VV -&gt; (x16 &lt;= VV)&gt;&lt;p x1&gt; | ((len x15) &gt;= 0)}]&lt;p&gt;
--&gt; {x4 : [{x15 : [a]&lt;\x16 VV -&gt; (x16 &lt;= VV)&gt; | ((len x15) &gt;= 0)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-[a]
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-varid'>sequences</span></a> <a class=annot href="#"><span class=annottext>{x3 : [a] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-varid'>bs</span></a>
-</pre>
-
-Ex: `Data.List.sort` [3/4]
---------------------------
-
-Juggling lists of increasing & decreasing lists
-
-<br>
-
-
-
-<pre><span class=hs-linenum>328: </span><a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-a:a
--&gt; (x1:{VV : [{VV : a | (VV &gt;= a)}]&lt;\x3 VV -&gt; (a &lt;= VV) &amp;&amp; (x3 &lt;= VV)&gt; | ((len VV) &gt; 0)}
-    -&gt; {VV : [a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt; | (VV /= x1) &amp;&amp; ((len VV) &gt; 0) &amp;&amp; ((len VV) &gt; (len x1))})
--&gt; {VV : [a] | ((len VV) &gt;= 0)}
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-definition'>ascending</span></a> <a class=annot href="#"><span class=annottext>a</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:{VV : [{VV : a | (VV &gt;= a)}]&lt;\x2 VV -&gt; (a &lt;= VV) &amp;&amp; (x2 &lt;= VV)&gt; | ((len VV) &gt; 0)}
--&gt; {VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | (VV /= x1) &amp;&amp; ((len VV) &gt; 0) &amp;&amp; ((len VV) &gt; (len x1))}</span><span class='hs-keyword'>as</span></a> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-conop'>:</span><span class='hs-varid'>bs</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>329: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:a
--&gt; x2:a
--&gt; {x4 : (Ordering) | ((x4 == GHC.Types.EQ) &lt;=&gt; (x1 == x2)) &amp;&amp; ((x4 == GHC.Types.GT) &lt;=&gt; (x1 &gt; x2)) &amp;&amp; ((x4 == GHC.Types.LT) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>`compare`</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == b)}</span><span class='hs-varid'>b</span></a> <a class=annot href="#"><span class=annottext>x1:(Ordering)
--&gt; x2:(Ordering) -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 /= x2))}</span><span class='hs-varop'>/=</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Ordering) | (x3 == GHC.Types.GT) &amp;&amp; ((cmp x3) == GHC.Types.GT)}</span><span class='hs-conid'>GT</span></a> 
-<span class=hs-linenum>330: </span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-a:a
--&gt; (x1:{VV : [{VV : a | (VV &gt;= a)}]&lt;\x3 VV -&gt; (a &lt;= VV) &amp;&amp; (x3 &lt;= VV)&gt; | ((len VV) &gt; 0)}
-    -&gt; {VV : [a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt; | (VV /= x1) &amp;&amp; ((len VV) &gt; 0) &amp;&amp; ((len VV) &gt; (len x1))})
--&gt; {VV : [a] | ((len VV) &gt;= 0)}
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-varid'>ascending</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == b)}</span><span class='hs-varid'>b</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:{x7 : [{VV : a | (VV &gt;= a) &amp;&amp; (VV &gt;= b)}]&lt;\x8 VV -&gt; (a &lt;= VV) &amp;&amp; (b &lt;= VV) &amp;&amp; (x8 &lt;= VV)&gt; | ((len x7) &gt; 0)}
--&gt; {x4 : [a]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 /= x1) &amp;&amp; ((len x4) &gt; 0) &amp;&amp; ((len x4) &gt; (len x1))}</span><span class='hs-keyglyph'>\</span></a><a class=annot href="#"><span class=annottext>{VV : [{VV : a | (VV &gt;= a) &amp;&amp; (VV &gt;= b)}]&lt;\x1 VV -&gt; (a &lt;= VV) &amp;&amp; (b &lt;= VV) &amp;&amp; (x1 &lt;= VV)&gt; | ((len VV) &gt; 0)}</span><span class='hs-varid'>ys</span></a> <span class='hs-keyglyph'>-&gt;</span> <a class=annot href="#"><span class=annottext>x1:{x7 : [{VV : a | (VV &gt;= a)}]&lt;\x8 VV -&gt; (a &lt;= VV) &amp;&amp; (x8 &lt;= VV)&gt; | ((len x7) &gt; 0)}
--&gt; {x4 : [a]&lt;\x5 VV -&gt; (x5 &lt;= VV)&gt; | (x4 /= x1) &amp;&amp; ((len x4) &gt; 0) &amp;&amp; ((len x4) &gt; (len x1))}</span><span class='hs-keyword'>as</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: a-&gt; a-&gt; Bool&gt;.
-x1:{VV : a | (VV &gt;= a)}
--&gt; x2:[{VV : a&lt;p x1&gt; | (VV &gt;= a)}]&lt;p&gt;
--&gt; {x4 : [{VV : a | (VV &gt;= a)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a><a class=annot href="#"><span class=annottext>{x5 : [{VV : a | (VV &gt;= a) &amp;&amp; (VV &gt;= b)}]&lt;\x6 VV -&gt; (a &lt;= VV) &amp;&amp; (b &lt;= VV) &amp;&amp; (x6 &lt;= VV)&gt; | (x5 == ys) &amp;&amp; ((len x5) &gt; 0) &amp;&amp; ((len x5) &gt;= 0) &amp;&amp; ((sumLens x5) &gt;= 0)}</span><span class='hs-varid'>ys</span></a><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x4 : [a] | (x4 == bs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>bs</span></a>
-<span class=hs-linenum>331: </span><span class='hs-definition'>ascending</span> <span class='hs-varid'>a</span> <span class='hs-keyword'>as</span> <span class='hs-varid'>bs</span>      
-<span class=hs-linenum>332: </span>  <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x7 : [{VV : a | (VV &gt;= a)}]&lt;\x8 VV -&gt; (a &lt;= VV) &amp;&amp; (x8 &lt;= VV)&gt; | ((len x7) &gt; 0)}
--&gt; {x4 : [a]&lt;\x5 VV -&gt; (x5 &lt;= VV)&gt; | (x4 /= x1) &amp;&amp; ((len x4) &gt; 0) &amp;&amp; ((len x4) &gt; (len x1))}</span><span class='hs-keyword'>as</span></a> <a class=annot href="#"><span class=annottext>{x4 : [{VV : a | (VV == a) &amp;&amp; (VV &gt; b)}]&lt;\_ VV -&gt; false&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{VV : a | (VV == a)}</span><span class='hs-varid'>a</span></a><span class='hs-keyglyph'>]</span><a class=annot href="#"><span class=annottext>forall &lt;p :: [a]-&gt; [a]-&gt; Bool&gt;.
-x1:{x15 : [a]&lt;\x16 VV -&gt; (x16 &lt;= VV)&gt; | ((len x15) &gt;= 0)}
--&gt; x2:[{x15 : [a]&lt;\x16 VV -&gt; (x16 &lt;= VV)&gt;&lt;p x1&gt; | ((len x15) &gt;= 0)}]&lt;p&gt;
--&gt; {x4 : [{x15 : [a]&lt;\x16 VV -&gt; (x16 &lt;= VV)&gt; | ((len x15) &gt;= 0)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-[a]
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt; 0)}</span><span class='hs-varid'>sequences</span></a> <a class=annot href="#"><span class=annottext>{x3 : [a] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-varid'>bs</span></a>
-</pre>
-
-Ex: `Data.List.sort` [4/4]
---------------------------
-
-Juggling lists of increasing & decreasing lists
-
-<br>
-
-
-<pre><span class=hs-linenum>343: </span><a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-{VV : [{VV : [a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt;= 0)}
--&gt; {VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}</span><span class='hs-definition'>mergeAll</span></a> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span>        <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x4 : [a]&lt;\x5 VV -&gt; (x5 &lt;= VV)&gt; | (x4 == x) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>x</span></a>
-<span class=hs-linenum>344: </span><span class='hs-definition'>mergeAll</span> <span class='hs-varid'>xs</span>         <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-{VV : [{VV : [a]&lt;\x2 VV -&gt; (x2 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt;= 0)}
--&gt; {VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}</span><span class='hs-varid'>mergeAll</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:{x10 : [{x14 : [a]&lt;\x15 VV -&gt; (VV &gt;= x15)&gt; | ((len x14) &gt;= 0)}]&lt;\_ VV -&gt; ((len x12) &gt;= 0)&gt; | ((len x10) &gt;= 0)}
--&gt; {x3 : [{x7 : [a]&lt;\x8 VV -&gt; (VV &gt;= x8)&gt; | ((len x7) &gt;= 0)}]&lt;\_ VV -&gt; ((len x5) &gt;= 0)&gt; | ((len x3) &gt;= 0) &amp;&amp; ((len x3) &lt;= (len x1))}</span><span class='hs-varid'>mergePairs</span></a> <a class=annot href="#"><span class=annottext>{x3 : [{x7 : [a]&lt;\x8 VV -&gt; (x8 &lt;= VV)&gt; | ((len x7) &gt;= 0)}]&lt;\_ VV -&gt; ((len x5) &gt;= 0)&gt; | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>)</span>
-<span class=hs-linenum>345: </span>
-<span class=hs-linenum>346: </span><a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-x1:{VV : [{VV : [a]&lt;\x2 VV -&gt; (VV &gt;= x2)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt;= 0)}
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len x1))}</span><span class='hs-definition'>mergePairs</span></a> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-conop'>:</span><span class='hs-varid'>b</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x10 : [a]&lt;\x11 VV -&gt; (VV &gt;= x11)&gt; | ((len x10) &gt;= 0)}
--&gt; x2:{x7 : [a]&lt;\x8 VV -&gt; (VV &gt;= x8)&gt; | ((len x7) &gt;= 0)}
--&gt; {x4 : [a]&lt;\x5 VV -&gt; (x5 &lt;= VV)&gt; | ((len x4) &gt;= 0) &amp;&amp; ((len x4) &gt;= (len x1)) &amp;&amp; ((len x4) &gt;= (len x2))}</span><span class='hs-varid'>merge</span></a> <a class=annot href="#"><span class=annottext>{x4 : [a]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 == a) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>{x4 : [a]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 == b) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>b</span></a><a class=annot href="#"><span class=annottext>forall &lt;p :: [a]-&gt; [a]-&gt; Bool&gt;.
-x1:{x15 : [a]&lt;\x16 VV -&gt; (VV &gt;= x16)&gt; | ((len x15) &gt;= 0)}
--&gt; x2:[{x15 : [a]&lt;\x16 VV -&gt; (VV &gt;= x16)&gt;&lt;p x1&gt; | ((len x15) &gt;= 0)}]&lt;p&gt;
--&gt; {x4 : [{x15 : [a]&lt;\x16 VV -&gt; (VV &gt;= x16)&gt; | ((len x15) &gt;= 0)}]&lt;p&gt; | (((null x4)) &lt;=&gt; false) &amp;&amp; ((len x4) == (1 + (len x2))) &amp;&amp; ((sumLens x4) == ((len x1) + (sumLens x2)))}</span><span class='hs-conop'>:</span></a> <a class=annot href="#"><span class=annottext>forall a.
-(Ord a) =&gt;
-x1:{VV : [{VV : [a]&lt;\x2 VV -&gt; (VV &gt;= x2)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt;= 0)}
--&gt; {VV : [{VV : [a]&lt;\x1 VV -&gt; (x1 &lt;= VV)&gt; | ((len VV) &gt;= 0)}]&lt;\_ VV -&gt; ((len VV) &gt;= 0)&gt; | ((len VV) &gt;= 0) &amp;&amp; ((len VV) &lt;= (len x1))}</span><span class='hs-varid'>mergePairs</span></a> <a class=annot href="#"><span class=annottext>{x4 : [{x8 : [a]&lt;\x9 VV -&gt; (VV &gt;= x9)&gt; | ((len x8) &gt;= 0)}]&lt;\_ VV -&gt; ((len x6) &gt;= 0)&gt; | (x4 == xs) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>xs</span></a>
-<span class=hs-linenum>347: </span><span class='hs-definition'>mergePairs</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span>      <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x6 : [{x8 : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | false}]&lt;\_ VV -&gt; false&gt; | (((null x6)) &lt;=&gt; true) &amp;&amp; ((len x6) == 0) &amp;&amp; ((sumLens x6) == 0) &amp;&amp; ((len x6) &gt;= 0) &amp;&amp; ((sumLens x6) &gt;= 0)}</span><span class='hs-keyglyph'>[</span></a><a class=annot href="#"><span class=annottext>{x4 : [a]&lt;\x5 VV -&gt; (VV &gt;= x5)&gt; | (x4 == a) &amp;&amp; ((len x4) &gt;= 0) &amp;&amp; ((sumLens x4) &gt;= 0)}</span><span class='hs-varid'>x</span></a><span class='hs-keyglyph'>]</span>
-<span class=hs-linenum>348: </span><span class='hs-definition'>mergePairs</span> <span class='hs-conid'>[]</span>       <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall &lt;p :: [a]-&gt; [a]-&gt; Bool&gt;.
-{x4 : [{x6 : [{VV : a | false}]&lt;\_ VV -&gt; false&gt; | false}]&lt;p&gt; | (((null x4)) &lt;=&gt; true) &amp;&amp; ((len x4) == 0) &amp;&amp; ((sumLens x4) == 0)}</span><span class='hs-conid'>[]</span></a>
-</pre>
-
-Phew!
------
-
-Lets see one last example...
-
-
-Example: Binary Trees
----------------------
-
-... `Map` from keys of type `k` to values of type `a` 
-
-<br>
-
-<div class="fragment">
-
-Implemented, in `Data.Map` as a binary tree:
-
-<br>
-
-
-<pre><span class=hs-linenum>371: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span>
-<span class=hs-linenum>372: </span>             <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Bin</span> <span class='hs-conid'>Size</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>373: </span>
-<span class=hs-linenum>374: </span><span class='hs-keyword'>type</span> <span class='hs-conid'>Size</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
-</pre>
-</div>
-
-Two Abstract Refinements
-------------------------
-
-- `l` : relates root `key` with `left`-subtree keys
-- `r` : relates root `key` with `right`-subtree keys
-
-
-<pre><span class=hs-linenum>385: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>data</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span>
-<span class=hs-linenum>386: </span>                 <span class='hs-layout'>,</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Prop</span> <span class='hs-varop'>&gt;</span>
-<span class=hs-linenum>387: </span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span>
-<span class=hs-linenum>388: </span>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Bin</span> <span class='hs-layout'>(</span><span class='hs-varid'>sz</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Size</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>key</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>val</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>389: </span>          <span class='hs-layout'>(</span><span class='hs-varid'>left</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-varop'>&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>l</span> <span class='hs-varid'>key</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>390: </span>          <span class='hs-layout'>(</span><span class='hs-varid'>right</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varop'>&lt;</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-varop'>&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>r</span> <span class='hs-varid'>key</span><span class='hs-varop'>&gt;</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-</pre>
-
-
-Ex: Binary Search Trees
------------------------
-
-Keys are *Binary-Search* Ordered
-
-<br>
-
-
-<pre><span class=hs-linenum>402: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>BST</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> 
-<span class=hs-linenum>403: </span>      <span class='hs-conid'>Map</span> <span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>r</span> <span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
-<span class=hs-linenum>404: </span>           <span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>v</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>r</span> <span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>405: </span>          <span class='hs-varid'>k</span> <span class='hs-varid'>a</span>                   <span class='hs-keyword'>@-}</span>
-</pre>
-
-Ex: Minimum Heaps 
------------------
-
-Root contains *minimum* value
-
-<br>
-
-
-<pre><span class=hs-linenum>416: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>MinHeap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> 
-<span class=hs-linenum>417: </span>      <span class='hs-conid'>Map</span> <span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
-<span class=hs-linenum>418: </span>           <span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>419: </span>           <span class='hs-varid'>k</span> <span class='hs-varid'>a</span>               <span class='hs-keyword'>@-}</span>
-</pre>
-
-Ex: Maximum Heaps 
------------------
-
-Root contains *maximum* value
-
-<br>
-
-
-<pre><span class=hs-linenum>430: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>type</span> <span class='hs-conid'>MaxHeap</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> 
-<span class=hs-linenum>431: </span>      <span class='hs-conid'>Map</span> <span class='hs-varop'>&lt;</span><span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-layout'>,</span> 
-<span class=hs-linenum>432: </span>           <span class='hs-layout'>{</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>v</span><span class='hs-layout'>}</span><span class='hs-varop'>&gt;</span> 
-<span class=hs-linenum>433: </span>           <span class='hs-varid'>k</span> <span class='hs-varid'>a</span>               <span class='hs-keyword'>@-}</span>
-</pre>
-
-
-Example: Data.Map
------------------
-
-Standard Key-Value container
-
-- <div class="fragment">1300+ non-comment lines</div>
-
-- <div class="fragment">`insert`, `split`, `merge`,...</div>
-
-- <div class="fragment">Rotation, Rebalance,...</div>
-
-<div class="fragment">
-SMT & inference crucial for [verification](https://github.com/ucsd-progsys/liquidhaskell/blob/master/benchmarks/esop2013-submission/Base.hs)
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=Map.hs" target="_blank">Demo:</a>Try online!
-</div>
-
-Recap: Abstract Refinements
----------------------------
-
-<div class="fragment">
-
-Decouple invariants from *functions*
-
-+ `max`
-+ `loop`
-+ `foldr`
-
-</div>
-
-<div class="fragment">
-Decouple invariants from *data*
-
-+ `Vector`
-+ `List`
-+ `Tree`
-
-</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract Refinements:* Decouple Invariants 
-5. <div class="fragment">Er, what of *lazy evaluation*?</div>
diff --git a/docs/slides/plpv14/lhs/09_Laziness.lhs b/docs/slides/plpv14/lhs/09_Laziness.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/09_Laziness.lhs
+++ /dev/null
@@ -1,237 +0,0 @@
- {#laziness}
-============
-
-<div class="hidden">
-\begin{code}
-module Laziness where
-import Language.Haskell.Liquid.Prelude
-
-{-@ LIQUID "--no-termination" @-}
-
-divide :: Int -> Int -> Int
-foo     :: Int -> Int
--- zero    :: Int 
--- diverge :: a -> b
-\end{code}
-</div>
-
-
-Lazy Evaluation?
-----------------
-
-Lazy Evaluation
-===============
-
-SMT based Verification
-----------------------
-
-Techniques developed for *strict* languages
-
-<br>
-
-<div class="fragment">
-
------------------------   ---   ------------------------------------------
-        **Floyd-Hoare**    :    `ESCJava`, `SpecSharp` ...
-     **Model Checkers**    :    `Slam`, `Blast` ...
-   **Refinement Types**    :    `DML`, `Stardust`, `F7`, `F*`, `Sage` ...
------------------------   ---   ------------------------------------------
-
-</div>
-
-<br>
-
-<div class="fragment">
-Surely soundness carries over to Haskell, right?
-</div>
-
-
-Back To the Beginning
----------------------
-
-\begin{code}
-{-@ divide :: Int -> {v:Int| v /= 0} -> Int @-}
-divide n 0 = liquidError "div-by-zero!"
-divide n d = n `div` d
-\end{code}
-
-<br>
-
-<div class="fragment">
-Should only try to `divide` by non-zero values
-</div>
-
-An Innocent Function
---------------------
-
-`foo` returns a value *strictly less than* input.
-
-<br>
-
-\begin{code}
-{-@ foo       :: n:Nat -> {v:Nat | v < n} @-}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-\end{code}
-
-LiquidHaskell Lies! 
--------------------
-
-\begin{code}
-explode = let z = 0
-          in  (\x -> (2013 `divide` z)) (foo z)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Why is this deemed *safe*? 
-</div>
-
-<br>
-
-<div class="fragment">
-(Where's the *red* highlight when you want it?)
-</div>
-
-
-Safe With Eager Eval
---------------------
-
-\begin{code} <div/>
-{- foo       :: n:Nat -> {v:Nat | v < n} -}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0
-          in  (\x -> (2013 `divide` z)) (foo z)
-\end{code}
-
-<br>
-
-<div class="fragment">
-In Java, ML, etc: program spins away, *never hits* divide-by-zero 
-</div>
-
-Unsafe With Lazy Eval
----------------------
-
-\begin{code}<div/>
-{- foo       :: n:Nat -> {v:Nat | v < n} -}
-foo n   
-  | n > 0     = n - 1
-  | otherwise = foo n
-
-explode = let z = 0
-          in  (\x -> (2013 `divide` z)) (foo z)
-\end{code}
-
-<br>
-
-In Haskell, program *skips* `(foo z)` & hits divide-by-zero!
-
-Problem: Divergence
--------------------
-
-<div class="fragment">
-What is denoted by `e :: {v:Int | 0 <= v}` ?
-</div>
-
-<br>
-
-<div class="fragment">
-`e` evaluates to a `Nat`  
-</div>
-
-<div class="fragment">
-or
-
-**diverges**! 
-</div>
-
-<div class="fragment">
-<br>
-
-Classical Floyd-Hoare notion of [partial correctness](http://en.wikipedia.org/wiki/Hoare_logic#Partial_and_total_correctness)
-
-</div>
-
-
-
-Problem: Divergence
--------------------
-
-Suppose `e :: {v:Int | 0 <= v}`
-
-<br>
-
-**Consider**
-
-`let x = e in body`
-
-With Eager Evaluation 
----------------------
-
-Suppose `e :: {v:Int | 0 <= v}`
-
-<br>
-
-**Consider**
-
-`let x = e in body`
-
-<br>
-
-<div class="fragment">
-**Can** assume `x` is a `Nat` when checking `body`
-</div>
-
-But With Lazy Evaluation 
-------------------------
-
-Suppose `e :: {v:Int | 0 <= v}`
-
-<br>
-
-**Consider**
-
-`let x = e in body`
-
-<br>
-
-<div class="fragment">
-**Cannot** assume `x` is a `Nat` when checking e!
-</div>
-
-Oops. Now what?
----------------
-
-**Solution** 
-
-Only assign *non-trivial* refinements to *non-diverging* terms!
-
-<br>
-
-<div class="fragment">
-
-**Require A Termination Analysis**
-
-(Oh dear.)
-
-</div>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=TellingLies.hs" target="_blank">Demo:</a>Disable `"--no-termination" and see what happens!
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract Refinements:* Decouple Invariants 
-5. **Lazy Evaluation:** Requires Termination
-6. <div class="fragment">**Termination:** Via Refinements!</div>
-
diff --git a/docs/slides/plpv14/lhs/09_Laziness.lhs.markdown b/docs/slides/plpv14/lhs/09_Laziness.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/09_Laziness.lhs.markdown
+++ /dev/null
@@ -1,244 +0,0 @@
- {#laziness}
-============
-
-<div class="hidden">
-
-<pre><span class=hs-linenum>6: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>Laziness</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum>7: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>Liquid</span><span class='hs-varop'>.</span><span class='hs-conid'>Prelude</span>
-<span class=hs-linenum>8: </span>
-<span class=hs-linenum>9: </span><span class='hs-keyword'>{-@</span> <span class='hs-conid'>LIQUID</span> <span class='hs-str'>"--no-termination"</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>10: </span>
-<span class=hs-linenum>11: </span><span class='hs-definition'>divide</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>12: </span><span class='hs-definition'>foo</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>13: </span><span class='hs-comment'>-- zero    :: Int </span>
-<span class=hs-linenum>14: </span><span class='hs-comment'>-- diverge :: a -&gt; b</span>
-</pre>
-</div>
-
-
-Lazy Evaluation?
-----------------
-
-Lazy Evaluation
-===============
-
-SMT based Verification
-----------------------
-
-Techniques developed for *strict* languages
-
-<br>
-
-<div class="fragment">
-
------------------------   ---   ------------------------------------------
-        **Floyd-Hoare**    :    `ESCJava`, `SpecSharp` ...
-     **Model Checkers**    :    `Slam`, `Blast` ...
-   **Refinement Types**    :    `DML`, `Stardust`, `F7`, `F*`, `Sage` ...
------------------------   ---   ------------------------------------------
-
-</div>
-
-<br>
-
-<div class="fragment">
-Surely soundness carries over to Haskell, right?
-</div>
-
-
-Back To the Beginning
----------------------
-
-
-<pre><span class=hs-linenum>53: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>divide</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Int</span><span class='hs-keyword'>| v /= 0}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>54: </span><a class=annot href="#"><span class=annottext>(Int) -&gt; {VV : (Int) | (VV /= 0)} -&gt; (Int)</span><span class='hs-definition'>divide</span></a> <a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-varid'>n</span></a> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : [(Char)] | false} -&gt; {x1 : (Int) | false}</span><span class='hs-varid'>liquidError</span></a> <a class=annot href="#"><span class=annottext>{x3 : [(Char)] | ((len x3) &gt;= 0) &amp;&amp; ((sumLens x3) &gt;= 0)}</span><span class='hs-str'>"div-by-zero!"</span></a>
-<span class=hs-linenum>55: </span><span class='hs-definition'>divide</span> <span class='hs-varid'>n</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == n)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>x1:(Int)
--&gt; x2:(Int)
--&gt; {x6 : (Int) | (((x1 &gt;= 0) &amp;&amp; (x2 &gt;= 0)) =&gt; (x6 &gt;= 0)) &amp;&amp; (((x1 &gt;= 0) &amp;&amp; (x2 &gt;= 1)) =&gt; (x6 &lt;= x1)) &amp;&amp; (x6 == (x1 / x2))}</span><span class='hs-varop'>`div`</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 /= 0)}</span><span class='hs-varid'>d</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">
-Should only try to `divide` by non-zero values
-</div>
-
-An Innocent Function
---------------------
-
-`foo` returns a value *strictly less than* input.
-
-<br>
-
-
-<pre><span class=hs-linenum>72: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>foo</span>       <span class='hs-keyglyph'>::</span> <span class='hs-varid'>n</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span> <span class='hs-keyword'>| v &lt; n}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>73: </span><a class=annot href="#"><span class=annottext>n:{VV : (Int) | (VV &gt;= 0)} -&gt; {VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; n)}</span><span class='hs-definition'>foo</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>n</span></a>   
-<span class=hs-linenum>74: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>x1:{x8 : (Int) | (x8 &gt;= 0) &amp;&amp; (x8 &lt;= n)}
--&gt; x2:{x8 : (Int) | (x8 &gt;= 0) &amp;&amp; (x8 &lt;= n)}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &gt; x2))}</span><span class='hs-varop'>&gt;</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>n</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a>
-<span class=hs-linenum>75: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{x5 : (Int) | (x5 &gt;= 0)}
--&gt; {x3 : (Int) | (x3 &gt;= 0) &amp;&amp; (x3 &lt; x1)}</span><span class='hs-varid'>foo</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == n) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>n</span></a>
-</pre>
-
-LiquidHaskell Lies! 
--------------------
-
-
-<pre><span class=hs-linenum>82: </span><a class=annot href="#"><span class=annottext>(Int)</span><span class='hs-definition'>explode</span></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-varid'>z</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (0  :  int))}</span><span class='hs-num'>0</span></a>
-<span class=hs-linenum>83: </span>          <span class='hs-keyword'>in</span>  <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x:{VV : (Int) | (VV == 0) &amp;&amp; (VV == 1) &amp;&amp; (VV == Laziness.explode) &amp;&amp; (VV == z) &amp;&amp; (VV &gt; 0) &amp;&amp; (VV &gt; Laziness.explode) &amp;&amp; (VV &gt; z) &amp;&amp; (VV &lt; 0) &amp;&amp; (VV &lt; Laziness.explode) &amp;&amp; (VV &lt; z)}
--&gt; {VV : (Int) | (VV == 0) &amp;&amp; (VV == 1) &amp;&amp; (VV == Laziness.explode) &amp;&amp; (VV == x) &amp;&amp; (VV == z) &amp;&amp; (VV &gt; 0) &amp;&amp; (VV &gt; Laziness.explode) &amp;&amp; (VV &gt; x) &amp;&amp; (VV &gt; z) &amp;&amp; (VV &lt; 0) &amp;&amp; (VV &lt; Laziness.explode) &amp;&amp; (VV &lt; x) &amp;&amp; (VV &lt; z)}</span><span class='hs-keyglyph'>\</span></a><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV == 0) &amp;&amp; (VV == 1) &amp;&amp; (VV == Laziness.explode) &amp;&amp; (VV == z) &amp;&amp; (VV &gt; 0) &amp;&amp; (VV &gt; Laziness.explode) &amp;&amp; (VV &gt; z) &amp;&amp; (VV &lt; 0) &amp;&amp; (VV &lt; Laziness.explode) &amp;&amp; (VV &lt; z)}</span><span class='hs-varid'>x</span></a> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2013  :  int))}</span><span class='hs-num'>2013</span></a> <a class=annot href="#"><span class=annottext>(Int) -&gt; {x3 : (Int) | (x3 /= 0)} -&gt; (Int)</span><span class='hs-varop'>`divide`</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == z) &amp;&amp; (x3 == (0  :  int))}</span><span class='hs-varid'>z</span></a><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>x1:{x5 : (Int) | (x5 &gt;= 0)}
--&gt; {x3 : (Int) | (x3 &gt;= 0) &amp;&amp; (x3 &lt; x1)}</span><span class='hs-varid'>foo</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == z) &amp;&amp; (x3 == (0  :  int))}</span><span class='hs-varid'>z</span></a><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-Why is this deemed *safe*? 
-</div>
-
-<br>
-
-<div class="fragment">
-(Where's the *red* highlight when you want it?)
-</div>
-
-
-Safe With Eager Eval
---------------------
-
- <div/>
-<pre><span class=hs-linenum>103: </span><span class='hs-comment'>{- foo       :: n:Nat -&gt; {v:Nat | v &lt; n} -}</span>
-<span class=hs-linenum>104: </span><span class='hs-definition'>foo</span> <span class='hs-varid'>n</span>   
-<span class=hs-linenum>105: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span>
-<span class=hs-linenum>106: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foo</span> <span class='hs-varid'>n</span>
-<span class=hs-linenum>107: </span>
-<span class=hs-linenum>108: </span><span class='hs-definition'>explode</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
-<span class=hs-linenum>109: </span>          <span class='hs-keyword'>in</span>  <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-num'>2013</span> <span class='hs-varop'>`divide`</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>foo</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-In Java, ML, etc: program spins away, *never hits* divide-by-zero 
-</div>
-
-Unsafe With Lazy Eval
----------------------
-
-<div/>
-<pre><span class=hs-linenum>122: </span><span class='hs-comment'>{- foo       :: n:Nat -&gt; {v:Nat | v &lt; n} -}</span>
-<span class=hs-linenum>123: </span><span class='hs-definition'>foo</span> <span class='hs-varid'>n</span>   
-<span class=hs-linenum>124: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span>
-<span class=hs-linenum>125: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foo</span> <span class='hs-varid'>n</span>
-<span class=hs-linenum>126: </span>
-<span class=hs-linenum>127: </span><span class='hs-definition'>explode</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
-<span class=hs-linenum>128: </span>          <span class='hs-keyword'>in</span>  <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-num'>2013</span> <span class='hs-varop'>`divide`</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>foo</span> <span class='hs-varid'>z</span><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-In Haskell, program *skips* `(foo z)` & hits divide-by-zero!
-
-Problem: Divergence
--------------------
-
-<div class="fragment">
-What is denoted by `e :: {v:Int | 0 <= v}` ?
-</div>
-
-<br>
-
-<div class="fragment">
-`e` evaluates to a `Nat`  
-</div>
-
-<div class="fragment">
-or
-
-**diverges**! 
-</div>
-
-<div class="fragment">
-<br>
-
-Classical Floyd-Hoare notion of [partial correctness](http://en.wikipedia.org/wiki/Hoare_logic#Partial_and_total_correctness)
-
-</div>
-
-
-
-Problem: Divergence
--------------------
-
-Suppose `e :: {v:Int | 0 <= v}`
-
-<br>
-
-**Consider**
-
-`let x = e in body`
-
-With Eager Evaluation 
----------------------
-
-Suppose `e :: {v:Int | 0 <= v}`
-
-<br>
-
-**Consider**
-
-`let x = e in body`
-
-<br>
-
-<div class="fragment">
-**Can** assume `x` is a `Nat` when checking `body`
-</div>
-
-But With Lazy Evaluation 
-------------------------
-
-Suppose `e :: {v:Int | 0 <= v}`
-
-<br>
-
-**Consider**
-
-`let x = e in body`
-
-<br>
-
-<div class="fragment">
-**Cannot** assume `x` is a `Nat` when checking e!
-</div>
-
-Oops. Now what?
----------------
-
-**Solution** 
-
-Only assign *non-trivial* refinements to *non-diverging* terms!
-
-<br>
-
-<div class="fragment">
-
-**Require A Termination Analysis**
-
-(Oh dear.)
-
-</div>
-
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=TellingLies.hs" target="_blank">Demo:</a>Disable `"--no-termination" and see what happens!
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract Refinements:* Decouple Invariants 
-5. **Lazy Evaluation:** Requires Termination
-6. <div class="fragment">**Termination:** Via Refinements!</div>
-
diff --git a/docs/slides/plpv14/lhs/10_Termination.lhs b/docs/slides/plpv14/lhs/10_Termination.lhs
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/10_Termination.lhs
+++ /dev/null
@@ -1,291 +0,0 @@
-Termination {#termination}
-==========================
-
-
-<div class="hidden">
-\begin{code}
-module Termination where
-
-import Prelude hiding (gcd, mod, map)
-fib :: Int -> Int
-gcd :: Int -> Int -> Int
-infixr `C`
-
-data L a = N | C a (L a)
-
-{-@ invariant {v: (L a) | 0 <= (llen v)} @-}
-
-mod :: Int -> Int -> Int
-mod a b | a - b >  b = mod (a - b) b
-        | a - b <  b = a - b
-        | a - b == b = 0
-
-merge :: Ord a => L a -> L a -> L a
-\end{code}
-</div>
-
-Dependent != Refinement
------------------------
-
-<div class="fragment">**Dependent Types**</div>
-
-+ <div class="fragment">*Arbitrary terms* appear inside types</div> 
-+ <div class="fragment">Termination ensures well-defined</div>
-
-<br>
-
-<div class="fragment">**Refinement Types**</div>
-
-+ <div class="fragment">*Restricted refinements* appear in types</div>
-+ <div class="fragment">Termination *not* required ...</div> 
-+ <div class="fragment">... except, alas, with *lazy* evaluation!</div>
-
-Refinements & Termination
-----------------------------
-
-<div class="fragment">
-Fortunately, we can ensure termination *using refinements*
-</div>
-
-
-Main Idea
----------
-
-Recursive calls must be on *smaller* inputs
-
-<br>
-
-+ [Turing](http://classes.soe.ucsc.edu/cmps210/Winter11/Papers/turing-1936.pdf)
-+ [Sized Types](http://dl.acm.org/citation.cfm?id=240882)
-
-Recur On *Smaller* `Nat` 
-------------------------
-
-<div class="fragment">
-
-**To ensure termination of**
-
-\begin{code} <div/>
-foo   :: Nat -> T
-foo x =  body
-\end{code}
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:Nat | v < x} -> T`
-
-<br>
-
-*i.e.* require recursive calls have inputs *smaller* than `x`
-</div>
-
-
-
-Ex: Recur On *Smaller* `Nat` 
-----------------------------
-
-\begin{code}
-{-@ fib  :: Nat -> Nat @-}
-fib 0    = 1
-fib 1    = 1
-fib n    = fib (n-1) + fib (n-2)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Terminates, as both `n-1` and `n-2` are `< n`
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=GCD.hs" target="_blank">Demo:</a>What if we drop the `fib 1` case?
-</div>
-
-Refinements Are Essential!
---------------------------
-
-\begin{code}
-{-@ gcd :: a:Nat -> {b:Nat | b < a} -> Int @-}
-gcd a 0 = a
-gcd a b = gcd b (a `mod` b)
-\end{code}
-
-<br>
-
-<div class="fragment">
-Need refinements to prove `(a mod b) < b` at *recursive* call!
-</div>
-
-<br>
-
-<div class="fragment">
-\begin{code}
-{-@ mod :: a:Nat 
-        -> b:{v:Nat|(0 < v && v < a)} 
-        -> {v:Nat| v < b}                 @-}
-\end{code}
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{code}<div/>
-foo   :: S -> T
-foo x = body
-\end{code}
-
-<br>
-
-<div class="fragment">
-**Reduce** to `Nat` case...
-</div>
-
-<br>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-\begin{code}<div/>
-foo   :: S -> T
-foo x = body
-\end{code}
-
-<br>
-
-Specify a **default measure** `mS :: S -> Int`
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:s | 0 <= (mS v) < (mS x)} -> T`
-</div>
-
-
-Ex: Recur on *smaller* `List`
------------------------------
-
-\begin{code} 
-map f N        = N
-map f (C x xs) = (f x) `C` (map f xs) 
-\end{code}
-
-<br>
-
-Terminates using **default** measure `llen`
-
-<div class="fragment">
-\begin{code}
-{-@ data L [llen] a = N 
-                    | C (x::a) (xs :: L a) @-}
-{-@ measure llen :: L a -> Int
-    llen (N)      = 0
-    llen (C x xs) = 1 + (llen xs)   @-}
-\end{code}
-</div>
-
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of *smallness* spread across inputs?
-
-<br>
-
-\begin{code}
-merge xs@(x `C` xs') ys@(y `C` ys')
-  | x < y     = x `C` merge xs' ys
-  | otherwise = y `C` merge xs ys'
-\end{code}
-
-<br>
-
-<div class="fragment">
-Neither input decreases, but their *sum* does.
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-Neither input decreases, but their *sum* does.
-
-<br>
-
-\begin{code}
-{-@ merge :: Ord a => xs:_ -> ys:_ -> _ 
-          /  [(llen xs) + (llen ys)]     @-}
-\end{code}
-
-<br>
-
-<div class="fragment">
-
-Synthesize *ghost* parameter equal to `[...]`
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-Reduces to single-parameter-decrease case. 
-
-</div>
-
-Important Extensions 
---------------------
-
-- <div class="fragment">Mutual recursion</div>
-
-- <div class="fragment">Lexicographic ordering...</div>
-
-Recap
------
-
-Main idea: Recursive calls on *smaller inputs*
-
-<br>
-
-- <div class="fragment">Use refinements to *check* smaller</div>
-
-- <div class="fragment">Use refinements to *establish* smaller</div>
-
-
-A Curious Circularity
----------------------
-
-<div class="fragment">Refinements require termination ...</div> 
-
-<br>
-
-<div class="fragment">... Termination requires refinements!</div>
-
-<br>
-
-<div class="fragment"> (Meta-theory is tricky, but all ends well.)</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract Refinements:* Decouple Invariants 
-5. **Lazy Evaluation:** Requires Termination
-6. **Termination:** Via Refinements!
-7. <div class="fragment">**Evaluation** </div>
-
-
diff --git a/docs/slides/plpv14/lhs/10_Termination.lhs.markdown b/docs/slides/plpv14/lhs/10_Termination.lhs.markdown
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/10_Termination.lhs.markdown
+++ /dev/null
@@ -1,305 +0,0 @@
-Termination {#termination}
-==========================
-
-
-<div class="hidden">
-
-<pre><span class=hs-linenum> 7: </span><span class='hs-keyword'>module</span> <span class='hs-conid'>Termination</span> <span class='hs-keyword'>where</span>
-<span class=hs-linenum> 8: </span>
-<span class=hs-linenum> 9: </span><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>gcd</span><span class='hs-layout'>,</span> <span class='hs-varid'>mod</span><span class='hs-layout'>,</span> <span class='hs-varid'>map</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>10: </span><span class='hs-definition'>fib</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>11: </span><span class='hs-definition'>gcd</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>12: </span><span class='hs-keyword'>infixr</span> <span class='hs-varop'>`C`</span>
-<span class=hs-linenum>13: </span>
-<span class=hs-linenum>14: </span><span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>15: </span>
-<span class=hs-linenum>16: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>invariant</span> <span class='hs-keyword'>{v:</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>| 0 &lt;= (llen v)}</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>17: </span>
-<span class=hs-linenum>18: </span><span class='hs-definition'>mod</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>19: </span><a class=annot href="#"><span class=annottext>x1:{VV : (Int) | (VV &gt;= 0)}
--&gt; x2:{VV : (Int) | (VV &gt;= 0) &amp;&amp; (0 &lt; VV) &amp;&amp; (VV &lt; x1)}
--&gt; {VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; x2)}</span><span class='hs-definition'>mod</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0) &amp;&amp; (0 &lt; VV) &amp;&amp; (VV &lt; a)}</span><span class='hs-varid'>b</span></a> <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == a) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a> <a class=annot href="#"><span class=annottext>x1:{x10 : (Int) | (x10 &gt; 0) &amp;&amp; (0 &lt; x10) &amp;&amp; (x10 &lt; a)}
--&gt; x2:{x10 : (Int) | (x10 &gt; 0) &amp;&amp; (0 &lt; x10) &amp;&amp; (x10 &lt; a)}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &gt; x2))}</span><span class='hs-varop'>&gt;</span></a>  <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{VV : (Int) | (VV &gt;= 0)}
--&gt; x2:{VV : (Int) | (VV &gt;= 0) &amp;&amp; (0 &lt; VV) &amp;&amp; (VV &lt; x1)}
--&gt; {VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; x2)}</span><span class='hs-varid'>mod</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == a) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a>
-<span class=hs-linenum>20: </span>        <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == a) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a> <a class=annot href="#"><span class=annottext>x1:{x12 : (Int) | (x12 &gt; 0) &amp;&amp; (0 &lt; x12) &amp;&amp; (x12 &lt; a) &amp;&amp; (x12 &lt;= b)}
--&gt; x2:{x12 : (Int) | (x12 &gt; 0) &amp;&amp; (0 &lt; x12) &amp;&amp; (x12 &lt; a) &amp;&amp; (x12 &lt;= b)}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>&lt;</span></a>  <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == a) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a>
-<span class=hs-linenum>21: </span>        <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == a) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a> <a class=annot href="#"><span class=annottext>x1:{x12 : (Int) | (x12 == b) &amp;&amp; (x12 &gt; 0) &amp;&amp; (0 &lt; x12) &amp;&amp; (x12 &lt; a)}
--&gt; x2:{x12 : (Int) | (x12 == b) &amp;&amp; (x12 &gt; 0) &amp;&amp; (0 &lt; x12) &amp;&amp; (x12 &lt; a)}
--&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 == x2))}</span><span class='hs-varop'>==</span></a> <a class=annot href="#"><span class=annottext>{x5 : (Int) | (x5 == b) &amp;&amp; (x5 &gt;= 0) &amp;&amp; (0 &lt; x5) &amp;&amp; (x5 &lt; a)}</span><span class='hs-varid'>b</span></a> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:(Int#) -&gt; {x2 : (Int) | (x2 == (x1  :  int))}</span><span class='hs-num'>0</span></a>
-<span class=hs-linenum>22: </span>
-<span class=hs-linenum>23: </span><span class='hs-definition'>merge</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span>
-</pre>
-</div>
-
-Dependent != Refinement
------------------------
-
-<div class="fragment">**Dependent Types**</div>
-
-+ <div class="fragment">*Arbitrary terms* appear inside types</div> 
-+ <div class="fragment">Termination ensures well-defined</div>
-
-<br>
-
-<div class="fragment">**Refinement Types**</div>
-
-+ <div class="fragment">*Restricted refinements* appear in types</div>
-+ <div class="fragment">Termination *not* required ...</div> 
-+ <div class="fragment">... except, alas, with *lazy* evaluation!</div>
-
-Refinements & Termination
-----------------------------
-
-<div class="fragment">
-Fortunately, we can ensure termination *using refinements*
-</div>
-
-
-Main Idea
----------
-
-Recursive calls must be on *smaller* inputs
-
-<br>
-
-+ [Turing](http://classes.soe.ucsc.edu/cmps210/Winter11/Papers/turing-1936.pdf)
-+ [Sized Types](http://dl.acm.org/citation.cfm?id=240882)
-
-Recur On *Smaller* `Nat` 
-------------------------
-
-<div class="fragment">
-
-**To ensure termination of**
-
- <div/>
-<pre><span class=hs-linenum>69: </span><span class='hs-definition'>foo</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>T</span>
-<span class=hs-linenum>70: </span><span class='hs-definition'>foo</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>  <span class='hs-varid'>body</span>
-</pre>
-
-</div>
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:Nat | v < x} -> T`
-
-<br>
-
-*i.e.* require recursive calls have inputs *smaller* than `x`
-</div>
-
-
-
-Ex: Recur On *Smaller* `Nat` 
-----------------------------
-
-
-<pre><span class=hs-linenum>93: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>fib</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nat</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>94: </span><a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)} -&gt; {VV : (Int) | (VV &gt;= 0)}</span><span class='hs-definition'>fib</span></a> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:(Int#) -&gt; {x2 : (Int) | (x2 == (x1  :  int))}</span><span class='hs-num'>1</span></a>
-<span class=hs-linenum>95: </span><span class='hs-definition'>fib</span> <span class='hs-num'>1</span>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:(Int#) -&gt; {x2 : (Int) | (x2 == (x1  :  int))}</span><span class='hs-num'>1</span></a>
-<span class=hs-linenum>96: </span><span class='hs-definition'>fib</span> <span class='hs-varid'>n</span>    <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)} -&gt; {VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>fib</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 &gt;= 0)}</span><span class='hs-varid'>n</span></a><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (1  :  int))}</span><span class='hs-num'>1</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 + x2))}</span><span class='hs-varop'>+</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)} -&gt; {VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>fib</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 &gt;= 0)}</span><span class='hs-varid'>n</span></a><a class=annot href="#"><span class=annottext>x1:(Int) -&gt; x2:(Int) -&gt; {x4 : (Int) | (x4 == (x1 - x2))}</span><span class='hs-comment'>-</span></a><a class=annot href="#"><span class=annottext>{x2 : (Int) | (x2 == (2  :  int))}</span><span class='hs-num'>2</span></a><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-Terminates, as both `n-1` and `n-2` are `< n`
-</div>
-
-<br>
-
-<div class="fragment">
-<a href="http://goto.ucsd.edu:8090/index.html#?demo=GCD.hs" target="_blank">Demo:</a>What if we drop the `fib 1` case?
-</div>
-
-Refinements Are Essential!
---------------------------
-
-
-<pre><span class=hs-linenum>115: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>gcd</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{b:</span><span class='hs-conid'>Nat</span> <span class='hs-keyword'>| b &lt; a}</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>116: </span><a class=annot href="#"><span class=annottext>x1:{VV : (Int) | (VV &gt;= 0)}
--&gt; {VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; x1)} -&gt; (Int)</span><span class='hs-definition'>gcd</span></a> <a class=annot href="#"><span class=annottext>{VV : (Int) | (VV &gt;= 0)}</span><span class='hs-varid'>a</span></a> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == a) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>a</span></a>
-<span class=hs-linenum>117: </span><span class='hs-definition'>gcd</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>x1:{VV : (Int) | (VV &gt;= 0)}
--&gt; {VV : (Int) | (VV &gt;= 0) &amp;&amp; (VV &lt; x1)} -&gt; (Int)</span><span class='hs-varid'>gcd</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 &gt;= 0) &amp;&amp; (x3 &lt; a)}</span><span class='hs-varid'>b</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 == a) &amp;&amp; (x3 &gt;= 0)}</span><span class='hs-varid'>a</span></a> <a class=annot href="#"><span class=annottext>x1:{x9 : (Int) | (x9 &gt;= 0)}
--&gt; x2:{x7 : (Int) | (x7 &gt;= 0) &amp;&amp; (0 &lt; x7) &amp;&amp; (x7 &lt; x1)}
--&gt; {x3 : (Int) | (x3 &gt;= 0) &amp;&amp; (x3 &lt; x2)}</span><span class='hs-varop'>`mod`</span></a> <a class=annot href="#"><span class=annottext>{x3 : (Int) | (x3 &gt;= 0) &amp;&amp; (x3 &lt; a)}</span><span class='hs-varid'>b</span></a><span class='hs-layout'>)</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-Need refinements to prove `(a mod b) < b` at *recursive* call!
-</div>
-
-<br>
-
-<div class="fragment">
-
-<pre><span class=hs-linenum>130: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>mod</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span><span class='hs-conop'>:</span><span class='hs-conid'>Nat</span> 
-<span class=hs-linenum>131: </span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-conop'>:</span><span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span><span class='hs-keyword'>|(0 &lt; v &amp;&amp; v &lt; a)}</span> 
-<span class=hs-linenum>132: </span>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>{v:</span><span class='hs-conid'>Nat</span><span class='hs-keyword'>| v &lt; b}</span>                 <span class='hs-keyword'>@-}</span>
-</pre>
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-<div/>
-<pre><span class=hs-linenum>142: </span><span class='hs-definition'>foo</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>T</span>
-<span class=hs-linenum>143: </span><span class='hs-definition'>foo</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>body</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-**Reduce** to `Nat` case...
-</div>
-
-<br>
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of input types other than `Nat` ?
-
-<div/>
-<pre><span class=hs-linenum>160: </span><span class='hs-definition'>foo</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>T</span>
-<span class=hs-linenum>161: </span><span class='hs-definition'>foo</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>body</span>
-</pre>
-
-<br>
-
-Specify a **default measure** `mS :: S -> Int`
-
-<br>
-
-<div class="fragment">
-**Check `body` Under Assumption**
-
-`foo :: {v:s | 0 <= (mS v) < (mS x)} -> T`
-</div>
-
-
-Ex: Recur on *smaller* `List`
------------------------------
-
- 
-<pre><span class=hs-linenum>181: </span><a class=annot href="#"><span class=annottext>forall a b. (a -&gt; b) -&gt; (L a) -&gt; (L b)</span><span class='hs-definition'>map</span></a> <a class=annot href="#"><span class=annottext>a -&gt; b</span><span class='hs-varid'>f</span></a> <span class='hs-conid'>N</span>        <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>forall a. {x2 : (L a) | ((llen x2) == 0)}</span><span class='hs-conid'>N</span></a>
-<span class=hs-linenum>182: </span><span class='hs-definition'>map</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>a -&gt; b</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>a -&gt; x2:(L a) -&gt; {x2 : (L a) | ((llen x2) == (1 + (llen x2)))}</span><span class='hs-varop'>`C`</span></a> <span class='hs-layout'>(</span><a class=annot href="#"><span class=annottext>forall a b. (a -&gt; b) -&gt; (L a) -&gt; (L b)</span><span class='hs-varid'>map</span></a> <a class=annot href="#"><span class=annottext>a -&gt; b</span><span class='hs-varid'>f</span></a> <a class=annot href="#"><span class=annottext>{x3 : (L a) | (x3 == xs) &amp;&amp; (0 &lt;= (llen x3))}</span><span class='hs-varid'>xs</span></a><span class='hs-layout'>)</span> 
-</pre>
-
-<br>
-
-Terminates using **default** measure `llen`
-
-<div class="fragment">
-
-<pre><span class=hs-linenum>191: </span><span class='hs-keyword'>{-@</span> <span class='hs-keyword'>data</span> <span class='hs-conid'>L</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>llen</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>N</span> 
-<span class=hs-linenum>192: </span>                    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>C</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>::</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>@-}</span>
-<span class=hs-linenum>193: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>measure</span> <span class='hs-varid'>llen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
-<span class=hs-linenum>194: </span>    <span class='hs-varid'>llen</span> <span class='hs-layout'>(</span><span class='hs-conid'>N</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
-<span class=hs-linenum>195: </span>    <span class='hs-varid'>llen</span> <span class='hs-layout'>(</span><span class='hs-conid'>C</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span>   <span class='hs-keyword'>@-}</span>
-</pre>
-</div>
-
-
-Recur On *Smaller* Inputs
--------------------------
-
-What of *smallness* spread across inputs?
-
-<br>
-
-
-<pre><span class=hs-linenum>208: </span><a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; (L a) -&gt; (L a) -&gt; (L a)</span><span class='hs-definition'>merge</span></a> <a class=annot href="#"><span class=annottext>(L a)</span><span class='hs-varid'>xs</span></a><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>xs'</span><span class='hs-layout'>)</span> <a class=annot href="#"><span class=annottext>(L a)</span><span class='hs-varid'>ys</span></a><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>y</span> <span class='hs-varop'>`C`</span> <span class='hs-varid'>ys'</span><span class='hs-layout'>)</span>
-<span class=hs-linenum>209: </span>  <span class='hs-keyglyph'>|</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>x1:a -&gt; x2:a -&gt; {x2 : (Bool) | (((Prop x2)) &lt;=&gt; (x1 &lt; x2))}</span><span class='hs-varop'>&lt;</span></a> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a>     <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == x)}</span><span class='hs-varid'>x</span></a> <a class=annot href="#"><span class=annottext>a -&gt; x2:(L a) -&gt; {x2 : (L a) | ((llen x2) == (1 + (llen x2)))}</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; (L a) -&gt; (L a) -&gt; (L a)</span><span class='hs-varid'>merge</span></a> <a class=annot href="#"><span class=annottext>{x3 : (L a) | (x3 == xs') &amp;&amp; (0 &lt;= (llen x3))}</span><span class='hs-varid'>xs'</span></a> <a class=annot href="#"><span class=annottext>{x5 : (L a) | (x5 == ys) &amp;&amp; (x5 == (Termination.C y ys')) &amp;&amp; ((llen x5) == (1 + (llen ys'))) &amp;&amp; (0 &lt;= (llen x5))}</span><span class='hs-varid'>ys</span></a>
-<span class=hs-linenum>210: </span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <a class=annot href="#"><span class=annottext>{VV : a | (VV == y)}</span><span class='hs-varid'>y</span></a> <a class=annot href="#"><span class=annottext>a -&gt; x2:(L a) -&gt; {x2 : (L a) | ((llen x2) == (1 + (llen x2)))}</span><span class='hs-varop'>`C`</span></a> <a class=annot href="#"><span class=annottext>forall a. (Ord a) =&gt; (L a) -&gt; (L a) -&gt; (L a)</span><span class='hs-varid'>merge</span></a> <a class=annot href="#"><span class=annottext>{x5 : (L a) | (x5 == xs) &amp;&amp; (x5 == (Termination.C x xs')) &amp;&amp; ((llen x5) == (1 + (llen xs'))) &amp;&amp; (0 &lt;= (llen x5))}</span><span class='hs-varid'>xs</span></a> <a class=annot href="#"><span class=annottext>{x3 : (L a) | (x3 == ys') &amp;&amp; (0 &lt;= (llen x3))}</span><span class='hs-varid'>ys'</span></a>
-</pre>
-
-<br>
-
-<div class="fragment">
-Neither input decreases, but their *sum* does.
-</div>
-
-Recur On *Smaller* Inputs
--------------------------
-
-Neither input decreases, but their *sum* does.
-
-<br>
-
-
-<pre><span class=hs-linenum>227: </span><span class='hs-keyword'>{-@</span> <span class='hs-varid'>merge</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>xs</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ys</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>_</span> 
-<span class=hs-linenum>228: </span>          <span class='hs-varop'>/</span>  <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>llen</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>     <span class='hs-keyword'>@-}</span>
-</pre>
-
-<br>
-
-<div class="fragment">
-
-Synthesize *ghost* parameter equal to `[...]`
-
-</div>
-
-<br>
-
-<div class="fragment">
-
-Reduces to single-parameter-decrease case. 
-
-</div>
-
-Important Extensions 
---------------------
-
-- <div class="fragment">Mutual recursion</div>
-
-- <div class="fragment">Lexicographic ordering...</div>
-
-Recap
------
-
-Main idea: Recursive calls on *smaller inputs*
-
-<br>
-
-- <div class="fragment">Use refinements to *check* smaller</div>
-
-- <div class="fragment">Use refinements to *establish* smaller</div>
-
-
-A Curious Circularity
----------------------
-
-<div class="fragment">Refinements require termination ...</div> 
-
-<br>
-
-<div class="fragment">... Termination requires refinements!</div>
-
-<br>
-
-<div class="fragment"> (Meta-theory is tricky, but all ends well.)</div>
-
-
-Recap
------
-
-1. **Refinements:** Types + Predicates
-2. **Subtyping:** SMT Implication
-3. **Measures:** Strengthened Constructors
-4. **Abstract Refinements:* Decouple Invariants 
-5. **Lazy Evaluation:** Requires Termination
-6. **Termination:** Via Refinements!
-7. <div class="fragment">**Evaluation** </div>
-
-
diff --git a/docs/slides/plpv14/lhs/liquid.css b/docs/slides/plpv14/lhs/liquid.css
deleted file mode 100644
--- a/docs/slides/plpv14/lhs/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-.hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-  // font-weight: bold;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   /* color: #00FFFF; color: #0E84B5; */
-  //font-weight: bold;  
-}
-
-.hs-definition { 
-  color: #06287E 
-  /* font-weight: bold; */ 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  // font-size: 120%;
-  // font-family: Bitstream Vera Sans Mono,monospace;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/docs/slides/plpv14/pdcreveal.tgz b/docs/slides/plpv14/pdcreveal.tgz
deleted file mode 100644
Binary files a/docs/slides/plpv14/pdcreveal.tgz and /dev/null differ
diff --git a/docs/slides/plpv14/reveal.js/.gitignore b/docs/slides/plpv14/reveal.js/.gitignore
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.DS_Store
-.svn
-log/*.log
-tmp/**
-node_modules/
-.sass-cache
diff --git a/docs/slides/plpv14/reveal.js/.travis.yml b/docs/slides/plpv14/reveal.js/.travis.yml
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - 0.8
-before_script:
-  - npm install -g grunt-cli
diff --git a/docs/slides/plpv14/reveal.js/Gruntfile.js b/docs/slides/plpv14/reveal.js/Gruntfile.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/Gruntfile.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/* global module:false */
-module.exports = function(grunt) {
-	var port = grunt.option('port') || 8000;
-	// Project configuration
-	grunt.initConfig({
-		pkg: grunt.file.readJSON('package.json'),
-		meta: {
-			banner:
-				'/*!\n' +
-				' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
-				' * http://lab.hakim.se/reveal-js\n' +
-				' * MIT licensed\n' +
-				' *\n' +
-				' * Copyright (C) 2013 Hakim El Hattab, http://hakim.se\n' +
-				' */'
-		},
-
-		qunit: {
-			files: [ 'test/*.html' ]
-		},
-
-		uglify: {
-			options: {
-				banner: '<%= meta.banner %>\n'
-			},
-			build: {
-				src: 'js/reveal.js',
-				dest: 'js/reveal.min.js'
-			}
-		},
-
-		cssmin: {
-			compress: {
-				files: {
-					'css/reveal.min.css': [ 'css/reveal.css' ]
-				}
-			}
-		},
-
-		sass: {
-			main: {
-				files: {
-					'css/theme/default.css': 'css/theme/source/default.scss',
-					'css/theme/beige.css': 'css/theme/source/beige.scss',
-					'css/theme/night.css': 'css/theme/source/night.scss',
-					'css/theme/serif.css': 'css/theme/source/serif.scss',
-					'css/theme/simple.css': 'css/theme/source/simple.scss',
-					'css/theme/sky.css': 'css/theme/source/sky.scss',
-					'css/theme/moon.css': 'css/theme/source/moon.scss',
-					'css/theme/solarized.css': 'css/theme/source/solarized.scss',
-					'css/theme/blood.css': 'css/theme/source/blood.scss'
-				}
-			}
-		},
-
-		jshint: {
-			options: {
-				curly: false,
-				eqeqeq: true,
-				immed: true,
-				latedef: true,
-				newcap: true,
-				noarg: true,
-				sub: true,
-				undef: true,
-				eqnull: true,
-				browser: true,
-				expr: true,
-				globals: {
-					head: false,
-					module: false,
-					console: false,
-					unescape: false
-				}
-			},
-			files: [ 'Gruntfile.js', 'js/reveal.js' ]
-		},
-
-		connect: {
-			server: {
-				options: {
-					port: port,
-					base: '.'
-				}
-			}
-		},
-
-		zip: {
-			'reveal-js-presentation.zip': [
-				'index.html',
-				'css/**',
-				'js/**',
-				'lib/**',
-				'images/**',
-				'plugin/**'
-			]
-		},
-
-		watch: {
-			main: {
-				files: [ 'Gruntfile.js', 'js/reveal.js', 'css/reveal.css' ],
-				tasks: 'default'
-			},
-			theme: {
-				files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ],
-				tasks: 'themes'
-			}
-		}
-
-	});
-
-	// Dependencies
-	grunt.loadNpmTasks( 'grunt-contrib-qunit' );
-	grunt.loadNpmTasks( 'grunt-contrib-jshint' );
-	grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
-	grunt.loadNpmTasks( 'grunt-contrib-uglify' );
-	grunt.loadNpmTasks( 'grunt-contrib-watch' );
-	grunt.loadNpmTasks( 'grunt-contrib-sass' );
-	grunt.loadNpmTasks( 'grunt-contrib-connect' );
-	grunt.loadNpmTasks( 'grunt-zip' );
-
-	// Default task
-	grunt.registerTask( 'default', [ 'jshint', 'cssmin', 'uglify', 'qunit' ] );
-
-	// Theme task
-	grunt.registerTask( 'themes', [ 'sass' ] );
-
-	// Package presentation to archive
-	grunt.registerTask( 'package', [ 'default', 'zip' ] );
-
-	// Serve presentation locally
-	grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
-
-	// Run tests
-	grunt.registerTask( 'test', [ 'jshint', 'qunit' ] );
-
-};
diff --git a/docs/slides/plpv14/reveal.js/LICENSE b/docs/slides/plpv14/reveal.js/LICENSE
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (C) 2013 Hakim El Hattab, http://hakim.se
-
-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.
diff --git a/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.eot b/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.eot
deleted file mode 100644
Binary files a/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.eot and /dev/null differ
diff --git a/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.svg b/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.svg
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.svg
+++ /dev/null
@@ -1,230 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="LeagueGothicRegular" horiz-adv-x="724" >
-<font-face units-per-em="2048" ascent="1505" descent="-543" />
-<missing-glyph horiz-adv-x="315" />
-<glyph horiz-adv-x="0" />
-<glyph horiz-adv-x="2048" />
-<glyph unicode="&#xd;" horiz-adv-x="682" />
-<glyph unicode=" "  horiz-adv-x="315" />
-<glyph unicode="&#x09;" horiz-adv-x="315" />
-<glyph unicode="&#xa0;" horiz-adv-x="315" />
-<glyph unicode="!" horiz-adv-x="387" d="M74 1505h239l-55 -1099h-129zM86 0v227h215v-227h-215z" />
-<glyph unicode="&#x22;" horiz-adv-x="329" d="M57 1505h215l-30 -551h-154z" />
-<glyph unicode="#" horiz-adv-x="1232" d="M49 438l27 195h198l37 258h-196l26 194h197l57 420h197l-57 -420h260l57 420h197l-58 -420h193l-27 -194h-192l-37 -258h190l-26 -195h-191l-59 -438h-197l60 438h-261l-59 -438h-197l60 438h-199zM471 633h260l37 258h-260z" />
-<glyph unicode="$" horiz-adv-x="692" d="M37 358l192 13q12 -186 129 -187q88 0 93 185q0 74 -61 175q-21 36 -34 53l-40 55q-28 38 -65.5 90t-70.5 101.5t-70.5 141.5t-37.5 170q4 293 215 342v131h123v-125q201 -23 235 -282l-192 -25q-14 129 -93 125q-80 -2 -84 -162q0 -102 94 -227l41 -59q30 -42 37 -52 t33 -48l37 -52q41 -57 68 -109l26 -55q43 -94 43 -186q-4 -338 -245 -369v-217h-123v221q-236 41 -250 352z" />
-<glyph unicode="%" horiz-adv-x="1001" d="M55 911v437q0 110 82 156q33 18 90.5 18t97.5 -44t44 -87l4 -43v-437q0 -107 -81 -157q-32 -19 -77 -19q-129 0 -156 135zM158 0l553 1505h131l-547 -1505h-137zM178 911q-4 -55 37 -55q16 0 25.5 14.5t9.5 26.5v451q2 55 -35 55q-18 0 -27.5 -13.5t-9.5 -27.5v-451z M631 158v436q0 108 81 156q33 20 79 20q125 0 153 -135l4 -41v-436q0 -110 -80 -156q-32 -18 -90.5 -18t-98.5 43t-44 88zM754 158q-4 -57 37 -58q37 0 34 58v436q2 55 -34 55q-18 0 -27.5 -13t-9.5 -28v-450z" />
-<glyph unicode="&#x26;" horiz-adv-x="854" d="M49 304q0 126 44 225.5t126 222.5q-106 225 -106 442v18q0 94 47 180q70 130 223 130q203 0 252 -215q14 -61 12 -113q0 -162 -205 -434q76 -174 148 -285q33 96 47 211l176 -33q-16 -213 -92 -358q55 -63 92 -76v-235q-23 0 -86 37.5t-123 101.5q-123 -139 -252 -139 t-216 97t-87 223zM263 325.5q1 -65.5 28.5 -107.5t78.5 -42t117 86q-88 139 -174 295q-18 -30 -34.5 -98t-15.5 -133.5zM305 1194q0 -111 55 -246q101 156 101 252q-2 2 0 15.5t-2 36t-11 42.5q-19 52 -61.5 52t-62 -38t-19.5 -75v-39z" />
-<glyph unicode="'" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="(" horiz-adv-x="561" d="M66 645q0 143 29.5 292.5t73.5 261.5q92 235 159 343l30 47l162 -84q-38 -53 -86.5 -148t-82.5 -189.5t-61.5 -238t-27.5 -284.5t26.5 -282.5t64.5 -240.5q80 -207 141 -296l26 -39l-162 -84q-41 61 -96 173t-94 217.5t-70.5 257t-31.5 294.5z" />
-<glyph unicode=")" horiz-adv-x="561" d="M41 -213q36 50 85.5 147t83.5 190t61.5 236.5t27.5 284.5t-26.5 282.5t-64.5 240.5q-78 205 -140 298l-27 39l162 84q41 -61 96 -173.5t94 -217t71 -257.5t32 -296t-30 -292.5t-74 -260.5q-92 -233 -159 -342l-30 -47z" />
-<glyph unicode="*" horiz-adv-x="677" d="M74 1251l43 148l164 -70l-19 176h154l-19 -176l164 70l43 -148l-172 -34l115 -138l-131 -80l-78 152l-76 -152l-131 80l115 138z" />
-<glyph unicode="+" horiz-adv-x="1060" d="M74 649v172h370v346h172v-346h371v-172h-371v-346h-172v346h-370z" />
-<glyph unicode="," horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="-" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="." horiz-adv-x="321" d="M53 0v227h215v-227h-215z" />
-<glyph unicode="/" horiz-adv-x="720" d="M8 -147l543 1652h162l-537 -1652h-168z" />
-<glyph unicode="0" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="1" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="2" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="3" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="4" horiz-adv-x="684" d="M25 328v194l323 983h221v-983h103v-194h-103v-328h-202v328h-342zM213 522h154v516h-13z" />
-<glyph unicode="5" horiz-adv-x="704" d="M74 438h221v-59q0 -115 14.5 -159t52 -44t53 45t15.5 156v336q0 111 -70 110q-33 0 -59.5 -40t-26.5 -70h-186v792h535v-219h-344v-313q74 55 127 51q78 0 133 -40t77 -100q35 -98 35 -171v-336q0 -393 -289 -393q-78 0 -133 29.5t-84.5 71.5t-46.5 109q-24 98 -24 244z " />
-<glyph unicode="6" horiz-adv-x="700" d="M66 309v856q0 356 288.5 356.5t288.5 -356.5v-94h-221q0 162 -11.5 210t-53.5 48t-56 -37t-14 -127v-268q59 37 124.5 37t119 -36t75.5 -93q37 -92 37 -189v-307q0 -90 -42 -187q-26 -61 -89 -99.5t-157.5 -38.5t-158 38.5t-88.5 99.5q-42 98 -42 187zM287 244 q0 -20 17.5 -44t49 -24t50 24.5t18.5 43.5v450q0 18 -18.5 43t-49 25t-48 -20.5t-19.5 -41.5v-456z" />
-<glyph unicode="7" horiz-adv-x="589" d="M8 1286v219h557v-221l-221 -1284h-229l225 1286h-332z" />
-<glyph unicode="8" horiz-adv-x="696" d="M53 322v176q0 188 115 297q-102 102 -102 276v127q0 213 147 293q57 31 135 31t135.5 -31t84 -71t42.5 -93q21 -66 21 -129v-127q0 -174 -103 -276q115 -109 115 -297v-176q0 -222 -153 -306q-60 -32 -142 -32t-141.5 32.5t-88 73.5t-44.5 96q-21 69 -21 136zM269 422 q1 -139 16.5 -187.5t57.5 -48.5t59.5 30t21.5 71t4 158t-13.5 174t-66.5 57t-66.5 -57.5t-12.5 -196.5zM284 1116q-1 -123 11 -173t53 -50t53.5 50t12.5 170t-12.5 167t-51.5 47t-52 -44t-14 -167z" />
-<glyph unicode="9" horiz-adv-x="700" d="M57 340v94h222q0 -162 11 -210t53 -48t56.5 37t14.5 127v283q-59 -37 -125 -37t-119 35.5t-76 92.5q-37 96 -37 189v293q0 87 43 188q25 60 88.5 99t157.5 39t157.5 -39t88.5 -99q43 -101 43 -188v-856q0 -356 -289 -356t-289 356zM279 825q0 -18 18 -42.5t49 -24.5 t48.5 20.5t19.5 40.5v443q0 20 -17.5 43.5t-49.5 23.5t-50 -24.5t-18 -42.5v-437z" />
-<glyph unicode=":" horiz-adv-x="362" d="M74 0v227h215v-227h-215zM74 893v227h215v-227h-215z" />
-<glyph unicode=";" horiz-adv-x="362" d="M74 0v227h215v-227l-113 -266h-102l71 266h-71zM74 893v227h215v-227h-215z" />
-<glyph unicode="&#x3c;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="=" horiz-adv-x="1058" d="M74 477v172h911v-172h-911zM74 864v172h911v-172h-911z" />
-<glyph unicode="&#x3e;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="?" horiz-adv-x="645" d="M25 1260q24 67 78 131q105 128 235 122q82 -2 138 -33.5t82 -81.5q46 -88 46 -170.5t-80 -219.5l-57 -96q-18 -32 -42 -106.5t-24 -143.5v-256h-190v256q0 102 24.5 195t48 140t65.5 118t50 105t-9 67.5t-60 34.5t-78 -48t-49 -98zM199 0h215v227h-215v-227z" />
-<glyph unicode="@" horiz-adv-x="872" d="M66 303v889q0 97 73 200q39 56 117 93t184.5 37t184 -37t116.5 -93q74 -105 74 -200v-793h-164l-20 56q-14 -28 -46 -48t-67 -20q-145 0 -145 172v485q0 170 145 170q71 0 113 -67v45q0 51 -45 104.5t-145.5 53.5t-145.5 -53.5t-45 -104.5v-889q0 -53 44 -103t153.5 -50 t160.5 63l152 -86q-109 -143 -320 -143q-106 0 -184 35.5t-117 90.5q-73 102 -73 193zM535 573q0 -53 48 -53t48 53v455q0 53 -48 53t-48 -53v-455z" />
-<glyph unicode="A" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="B" horiz-adv-x="745" d="M82 0v1505h194q205 0 304.5 -91t99.5 -308q0 -106 -29.5 -175t-107.5 -136q14 -5 47 -38.5t54 -71.5q52 -97 52 -259q0 -414 -342 -426h-272zM303 219q74 0 109 31q55 56 55 211t-63 195q-42 26 -93 26h-8v-463zM303 885q87 0 119 39q45 55 45 138t-14.5 124t-30.5 60.5 t-45 28.5q-35 11 -74 11v-401z" />
-<glyph unicode="C" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175z" />
-<glyph unicode="D" horiz-adv-x="761" d="M82 0v1505h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174zM303 221q117 0 140.5 78t23.5 399v111q0 322 -23.5 398.5t-140.5 76.5v-1063z" />
-<glyph unicode="E" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506z" />
-<glyph unicode="F" horiz-adv-x="616" d="M82 0v1505h526v-227h-305v-395h205v-228h-205v-655h-221z" />
-<glyph unicode="G" horiz-adv-x="737" d="M67 271.5q0 26.5 1 37.5v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-231h-221v231q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-905q0 -46 19.5 -78.5t54 -32.5t53 28t18.5 54l2 29v272h-88v187h309v-750h-131l-26 72 q-70 -88 -172 -88q-203 0 -250 213q-11 48 -11 74.5z" />
-<glyph unicode="H" horiz-adv-x="778" d="M82 0v1505h221v-622h172v622h221v-1505h-221v655h-172v-655h-221z" />
-<glyph unicode="I" horiz-adv-x="385" d="M82 0v1505h221v-1505h-221z" />
-<glyph unicode="J" horiz-adv-x="423" d="M12 -14v217q4 0 12.5 -1t29 2t35.5 12t28.5 34.5t13.5 62.5v1192h221v-1226q0 -137 -74 -216q-74 -78 -223 -78h-4q-19 0 -39 1z" />
-<glyph unicode="K" horiz-adv-x="768" d="M82 0v1505h221v-526h8l195 526h215l-203 -495l230 -1010h-216l-153 655l-6 31h-6l-64 -154v-532h-221z" />
-<glyph unicode="L" horiz-adv-x="604" d="M82 0v1505h221v-1300h293v-205h-514z" />
-<glyph unicode="M" horiz-adv-x="991" d="M82 0v1505h270l131 -688l11 -80h4l10 80l131 688h270v-1505h-204v1010h-13l-149 -1010h-94l-142 946l-8 64h-12v-1010h-205z" />
-<glyph unicode="N" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203z" />
-<glyph unicode="O" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5 t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="P" horiz-adv-x="720" d="M82 0v1505h221q166 0 277.5 -105.5t111.5 -345t-111.5 -346t-277.5 -106.5v-602h-221zM303 827q102 0 134 45.5t32 175.5t-33 181t-133 51v-453z" />
-<glyph unicode="Q" horiz-adv-x="729" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -94 -45 -182q33 -43 88 -53v-189q-160 0 -227 117q-55 -18 -125 -18t-130 33.5t-88 81.5q-55 94 -60 175zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887 q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="R" horiz-adv-x="739" d="M82 0v1505h221q377 0 377 -434q0 -258 -123 -342l141 -729h-221l-115 635h-59v-635h-221zM303 840q117 0 149 98q15 49 15 125t-15.5 125t-45.5 68q-44 30 -103 30v-446z" />
-<glyph unicode="S" horiz-adv-x="702" d="M37 422l217 20q0 -256 104 -256q90 0 91 166q0 59 -32 117.5t-45 79.5l-54 79q-40 58 -77 113t-73.5 117t-68 148.5t-31.5 162.5q0 139 71.5 245t216.5 108h10q88 0 152 -36t94 -100q54 -120 54 -264l-217 -20q0 217 -89 217q-75 -2 -75 -146q0 -59 23 -105 q32 -66 58 -104l197 -296q31 -49 67 -139.5t36 -166.5q0 -378 -306 -378h-2q-229 0 -290 188q-31 99 -31 250z" />
-<glyph unicode="T" horiz-adv-x="647" d="M4 1278v227h639v-227h-209v-1278h-221v1278h-209z" />
-<glyph unicode="U" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175z" />
-<glyph unicode="V" horiz-adv-x="716" d="M18 1505h215l111 -827l8 -64h13l118 891h215l-229 -1505h-221z" />
-<glyph unicode="W" horiz-adv-x="1036" d="M25 1505h204l88 -782l5 -49h16l100 831h160l100 -831h17l92 831h205l-203 -1505h-172l-115 801h-8l-115 -801h-172z" />
-<glyph unicode="X" horiz-adv-x="737" d="M16 0l244 791l-240 714h218l120 -381l7 -18h8l127 399h217l-240 -714l244 -791h-217l-127 449l-4 18h-8l-132 -467h-217z" />
-<glyph unicode="Y" horiz-adv-x="700" d="M14 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641z" />
-<glyph unicode="Z" horiz-adv-x="626" d="M20 0v238l347 1048h-297v219h536v-219l-352 -1067h352v-219h-586z" />
-<glyph unicode="[" horiz-adv-x="538" d="M82 -213v1718h399v-196h-202v-1325h202v-197h-399z" />
-<glyph unicode="\" horiz-adv-x="792" d="M8 1692h162l614 -1872h-168z" />
-<glyph unicode="]" horiz-adv-x="538" d="M57 -16h203v1325h-203v196h400v-1718h-400v197z" />
-<glyph unicode="^" horiz-adv-x="1101" d="M53 809l381 696h234l381 -696h-199l-299 543l-299 -543h-199z" />
-<glyph unicode="_" horiz-adv-x="1210" d="M74 -154h1063v-172h-1063v172z" />
-<glyph unicode="`" horiz-adv-x="1024" d="M293 1489h215l106 -184h-159z" />
-<glyph unicode="a" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="b" horiz-adv-x="686" d="M82 0v1505h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-74h-207zM289 246q0 -29 19.5 -48.5t42 -19.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -21.5t-19.5 -46.5v-628z" />
-<glyph unicode="c" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331z" />
-<glyph unicode="d" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v458h207v-1505h-207v74q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 19.5t19.5 48.5v628q0 25 -19.5 46.5t-42 21.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="e" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="f" horiz-adv-x="475" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-65 0 -65 -175v-5v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="g" horiz-adv-x="700" d="M12 -184q0 94 162 170q-125 35 -125 149q0 45 40 93t89 75q-51 35 -80.5 95.5t-34.5 105.5l-4 43v305q0 35 16.5 91t41 94t79 69t126.5 31q135 0 206 -103q102 102 170 103v-185q-72 0 -120 -24l10 -70v-317q0 -37 -17.5 -90.5t-42 -90t-79 -66.5t-104.5 -30t-62 2 q-29 -25 -29 -46t11 -33.5t42 -20.5t45.5 -10t65.5 -10.5t95 -21.5t89 -41q96 -60 96 -205t-103 -212q-100 -65 -250 -65h-9q-156 2 -240 50t-84 165zM213 -150q0 -77 132 -77h3q59 0 108.5 19t49.5 54t-20.5 52.5t-90.5 29.5l-106 21q-76 -43 -76 -99zM262 509 q0 -17 15.5 -45t44.5 -28q63 6 63 101v307q-2 0 0 10q1 3 1 7q0 8 -3 19q-4 15 -9 30q-11 36 -46 36t-50.5 -25.5t-15.5 -52.5v-359z" />
-<glyph unicode="h" horiz-adv-x="690" d="M82 0v1505h207v-479l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="i" horiz-adv-x="370" d="M82 0v1120h207v-1120h-207zM82 1298v207h207v-207h-207z" />
-<glyph unicode="j" horiz-adv-x="364" d="M-45 -182q29 -8 57 -8q64 0 64 142v1168h207v-1149q0 -186 -51 -266q-23 -35 -71 -62.5t-115 -27.5t-91 12v191zM76 1298v207h207v-207h-207z" />
-<glyph unicode="k" horiz-adv-x="641" d="M82 0v1505h207v-714h10l113 329h186l-149 -364l188 -756h-199l-102 453l-4 16h-10l-33 -82v-387h-207z" />
-<glyph unicode="l" horiz-adv-x="370" d="M82 0v1505h207v-1505h-207z" />
-<glyph unicode="m" horiz-adv-x="1021" d="M82 0v1120h207v-94q2 0 33 30q80 81 139 81q100 0 139 -125q125 125 194.5 125t109.5 -69t40 -150v-918h-194v887q-1 49 -56 49q-41 0 -78 -53v-883h-194v887q0 49 -55 49q-41 0 -78 -53v-883h-207z" />
-<glyph unicode="n" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207z" />
-<glyph unicode="o" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="p" horiz-adv-x="686" d="M82 -385v1505h207v-73q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="q" horiz-adv-x="686" d="M74 203v715q0 82 41 150.5t118 68.5q33 0 74 -22.5t66 -45.5l24 -22v73h207v-1505h-207v459q-88 -90 -165 -90t-117.5 68.5t-40.5 150.5zM281 246q0 -29 16 -48.5t38.5 -19.5t42 21.5t19.5 46.5v628q0 29 -19.5 48.5t-42 19.5t-38.5 -19.5t-16 -48.5v-628z" />
-<glyph unicode="r" horiz-adv-x="503" d="M82 0v1120h207v-125q8 41 58.5 91.5t148.5 50.5v-230q-34 11 -77 11t-86.5 -39t-43.5 -101v-778h-207z" />
-<glyph unicode="s" horiz-adv-x="630" d="M37 326h192q0 -170 97 -170q71 0 71 131q0 78 -129 202q-68 66 -98.5 99t-64 101.5t-33.5 134t12 114.5t39 95q59 100 201 104h11q161 0 211 -105q42 -86 42 -198h-193q0 131 -67 131q-63 -2 -64 -131q0 -33 23.5 -73t45 -62.5t66.5 -65.5q190 -182 191 -342 q0 -123 -64.5 -215t-199.5 -92q-197 0 -260 170q-29 76 -29 172z" />
-<glyph unicode="t" horiz-adv-x="501" d="M20 934v186h105v277h207v-277h141v-186h-141v-557q0 -184 65 -184l76 8v-203q-45 -14 -112 -14t-114.5 28.5t-70 64.5t-34.5 96q-17 79 -17 187v574h-105z" />
-<glyph unicode="u" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5z" />
-<glyph unicode="v" horiz-adv-x="602" d="M16 1120h201l68 -649l8 -72h16l76 721h201l-183 -1120h-204z" />
-<glyph unicode="w" horiz-adv-x="905" d="M20 1120h189l65 -585l9 -64h12l96 649h123l86 -585l10 -64h13l73 649h189l-166 -1120h-172l-80 535l-10 63h-8l-91 -598h-172z" />
-<glyph unicode="x" horiz-adv-x="618" d="M16 0l193 578l-176 542h194l74 -262l6 -31h4l6 31l74 262h195l-176 -542l192 -578h-201l-84 283l-6 30h-4l-6 -30l-84 -283h-201z" />
-<glyph unicode="y" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5z" />
-<glyph unicode="z" horiz-adv-x="532" d="M12 0v168l285 764h-240v188h459v-168l-285 -764h285v-188h-504z" />
-<glyph unicode="{" horiz-adv-x="688" d="M61 453v163q72 0 102 49.5t30 90.5v397q0 223 96 298t342 71v-172q-135 2 -188.5 -38t-53.5 -159v-397q0 -143 -127 -221q127 -82 127 -222v-397q0 -119 53.5 -159t188.5 -38v-172q-246 -4 -342 71t-96 298v397q0 57 -41 97.5t-91 42.5z" />
-<glyph unicode="|" horiz-adv-x="356" d="M82 -512v2204h192v-2204h-192z" />
-<glyph unicode="}" horiz-adv-x="688" d="M57 -281q135 -2 188.5 38t53.5 159v397q0 139 127 222q-127 78 -127 221v397q0 119 -53 159t-189 38v172q246 4 342.5 -71t96.5 -298v-397q0 -63 41 -101.5t90 -38.5v-163q-72 -4 -101.5 -52.5t-29.5 -87.5v-397q0 -223 -96.5 -298t-342.5 -71v172z" />
-<glyph unicode="~" horiz-adv-x="1280" d="M113 1352q35 106 115 200q34 41 94.5 74t121 33t116.5 -18.5t82 -33t83 -51.5q106 -72 174 -71q109 0 178 153l13 29l135 -57q-63 -189 -206 -276q-56 -34 -120 -34q-121 0 -272 101q-115 74 -178.5 74t-113.5 -45.5t-69 -90.5l-18 -45z" />
-<glyph unicode="&#xa1;" horiz-adv-x="387" d="M74 -385l55 1100h129l55 -1100h-239zM86 893v227h215v-227h-215z" />
-<glyph unicode="&#xa2;" horiz-adv-x="636" d="M66 508v489q0 297 208 328v242h123v-244q98 -16 144.5 -88t46.5 -227v-88h-189v135q0 90 -72.5 90t-72.5 -90v-604q0 -90 72 -91q74 0 73 91v155h189v-108q0 -156 -46 -228.5t-145 -89.5v-303h-123v301q-209 31 -208 330z" />
-<glyph unicode="&#xa3;" horiz-adv-x="817" d="M4 63q8 20 23.5 53.5t70 91.5t117.5 68q37 111 37 189t-31 184h-188v137h147l-6 21q-78 254 -78 333t15.5 140t48.5 116q72 122 231 126q190 4 267 -126q65 -108 65 -276h-213q0 201 -115 197q-47 -2 -68.5 -51t-21.5 -139.5t70 -315.5l6 -25h211v-137h-174 q25 -100 24.5 -189t-57.5 -204q16 -8 44 -24q59 -35 89 -35q74 4 82 190l188 -22q-12 -182 -81.5 -281.5t-169.5 -99.5q-51 0 -143.5 51t-127.5 51t-63.5 -25.5t-40.5 -52.5l-12 -24z" />
-<glyph unicode="&#xa5;" horiz-adv-x="720" d="M25 1505h217l110 -481l6 -14h4l7 14l110 481h217l-196 -753h147v-138h-176v-137h176v-137h-176v-340h-221v340h-176v137h176v137h-176v138h147z" />
-<glyph unicode="&#xa8;" horiz-adv-x="1024" d="M272 1305v200h191v-200h-191zM561 1305v200h191v-200h-191z" />
-<glyph unicode="&#xa9;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM627 487v531q0 122 97 174q40 22 95 22 q147 0 182 -147l7 -49v-125h-138v142q0 11 -12 28.5t-37 17.5q-47 -2 -49 -63v-531q0 -63 49 -63q53 2 49 63v125h138v-125q0 -68 -40 -127q-18 -26 -57 -47.5t-108.5 -21.5t-117.5 49t-54 98z" />
-<glyph unicode="&#xaa;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xad;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#xae;" horiz-adv-x="1644" d="M53 751.5q0 317.5 225.5 544t543 226.5t543.5 -226.5t226 -544t-226 -542.5t-543.5 -225t-543 225t-225.5 542.5zM172 751.5q0 -266.5 191.5 -458t457.5 -191.5t459 191.5t193 459t-191.5 459t-459 191.5t-459 -192.5t-191.5 -459zM625 313v879h196q231 0 232 -258 q0 -76 -16.5 -125t-71.5 -96l106 -400h-151l-95 365h-55v-365h-145zM770 805h45q43 0 65.5 21.5t27.5 45t5 61.5t-5 62.5t-27.5 46t-65.5 21.5h-45v-258z" />
-<glyph unicode="&#xaf;" horiz-adv-x="1024" d="M313 1315v162h398v-162h-398z" />
-<glyph unicode="&#xb2;" horiz-adv-x="731" d="M55 0v219l39 62q25 39 88.5 152.5t112.5 220t91 241.5t44 238q0 184 -73.5 184t-73.5 -184v-105h-222v105q0 389 295 389t295 -375q0 -336 -346 -928h350v-219h-600z" />
-<glyph unicode="&#xb3;" horiz-adv-x="686" d="M45 1071q0 249 63 343q29 42 84.5 75t134.5 33t136 -31t84.5 -71t44.5 -92q22 -71 22 -130q0 -291 -108 -399q127 -100 127 -414q0 -68 -19.5 -145.5t-47 -128t-85 -89t-136.5 -38.5t-135 31.5t-86 75.5t-48 113q-23 91 -23 230h217q2 -150 17.5 -203t59.5 -53t56.5 50.5 t12.5 104.5t1 102t0 63q-6 82 -14 95l-18 33q-12 22 -29 29q-55 22 -108 25h-19v184q133 7 156 73q12 34 12 91v105q0 146 -29 177q-16 17 -40 17q-41 0 -52.5 -49t-13.5 -207h-217z" />
-<glyph unicode="&#xb4;" horiz-adv-x="1024" d="M410 1305l106 184h215l-162 -184h-159z" />
-<glyph unicode="&#xb7;" horiz-adv-x="215" d="M0 649v228h215v-228h-215z" />
-<glyph unicode="&#xb8;" horiz-adv-x="1024" d="M426 -111h172v-141l-45 -133h-104l40 133h-63v141z" />
-<glyph unicode="&#xb9;" horiz-adv-x="475" d="M25 1180v141q129 25 205 130q16 21 30 54h133v-1505h-221v1180h-147z" />
-<glyph unicode="&#xba;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM257 259q0 -17 9 -44q18 -49 62 -49q70 10 71 113v563l1 19q0 19 -10 45q-18 50 -62 50 q-68 -10 -70 -114v-563q1 -1 1 -4z" />
-<glyph unicode="&#xbf;" horiz-adv-x="645" d="M41 -106q0 82 80 219l57 95q18 32 42 106.5t24 144.5v256h190v-256q0 -102 -24.5 -195.5t-48 -140.5t-65.5 -118t-50 -104.5t9 -67.5t60 -35t78 48.5t49 98.5l179 -84q-24 -66 -78 -132q-104 -126 -236 -122q-163 4 -220 115q-46 90 -46 172zM231 893v227h215v-227h-215z " />
-<glyph unicode="&#xc0;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM141 1823h215l107 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc1;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM293 1638l106 185h215l-161 -185h-160zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc2;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM133 1638l141 185h220l141 -185h-189l-63 72l-61 -72h-189zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc3;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM184 1632v152q49 39 95.5 39t104.5 -18.5t100.5 -19.5t97.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-98 19.5t-102 -33zM307 541h152l-64 475l-6 39h-12z" />
-<glyph unicode="&#xc4;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM143 1638v201h191v-201h-191zM307 541h152l-64 475l-6 39h-12zM432 1638v201h191v-201h-191z" />
-<glyph unicode="&#xc5;" horiz-adv-x="765" d="M20 0l228 1505h270l227 -1505h-215l-41 307h-213l-40 -307h-216zM231 1761.5q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM307 541h152l-64 475l-6 39h-12zM309 1761.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50 t-23.5 50t-52.5 21.5t-52.5 -21.5t-23.5 -50z" />
-<glyph unicode="&#xc6;" horiz-adv-x="1099" d="M16 0l420 1505h623v-227h-285v-395h205v-242h-205v-414h285v-227h-506v307h-227l-90 -307h-220zM393 541h160v514h-10z" />
-<glyph unicode="&#xc7;" horiz-adv-x="708" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-207h-206v207q-2 0 0 11.5t-3.5 27.5t-12.5 33q-17 39 -68 39q-70 -10 -78 -111v-887q0 -43 21.5 -76.5t59.5 -33.5t59.5 27.5t21.5 56.5v233h206v-207q0 -42 -17 -106t-45 -107 t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM268 -111v-141h64l-41 -133h104l45 133v141h-172z" />
-<glyph unicode="&#xc8;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM111 1823h215l106 -185h-160z" />
-<glyph unicode="&#xc9;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM236 1638l106 185h215l-162 -185h-159z" />
-<glyph unicode="&#xca;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM84 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xcb;" horiz-adv-x="628" d="M82 0v1505h506v-227h-285v-395h205v-242h-205v-414h285v-227h-506zM94 1638v201h191v-201h-191zM383 1638v201h190v-201h-190z" />
-<glyph unicode="&#xcc;" horiz-adv-x="401" d="M-6 1823h215l106 -185h-159zM98 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcd;" horiz-adv-x="401" d="M82 0v1505h221v-1505h-221zM86 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xce;" horiz-adv-x="370" d="M-66 1638l142 185h219l141 -185h-188l-64 72l-61 -72h-189zM74 0v1505h221v-1505h-221z" />
-<glyph unicode="&#xcf;" horiz-adv-x="372" d="M-53 1638v201h190v-201h-190zM76 0v1505h221v-1505h-221zM236 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd0;" horiz-adv-x="761" d="M20 655v228h62v622h174q270 0 346 -113q31 -46 50.5 -95.5t28.5 -139.5t12 -177t3 -228.5t-3 -228.5t-12 -176t-28.5 -138t-50.5 -95t-80 -68q-106 -46 -266 -46h-174v655h-62zM303 221q117 0 141.5 81t22.5 452q2 371 -22.5 450.5t-141.5 79.5v-401h84v-228h-84v-434z " />
-<glyph unicode="&#xd1;" horiz-adv-x="808" d="M82 0v1505h197l215 -784l18 -70h12v854h203v-1505h-197l-215 784l-18 70h-12v-854h-203zM207 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39t-102.5 19.5t-100 19.5t-99.5 -33z" />
-<glyph unicode="&#xd2;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM121 1823h215l106 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd3;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM285 1638l106 185h215l-162 -185h-159zM289 309q0 -46 19.5 -78t54 -32t53 27.5 t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd4;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM113 1638l141 185h219l141 -185h-188l-64 72l-61 -72h-188zM289 309q0 -46 19.5 -78 t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd5;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM164 1632v152q49 39 95 39t104.5 -18.5t102.5 -19.5t95 32v-152q-51 -39 -95 -39 t-102.5 19.5t-100 19.5t-99.5 -33zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887z" />
-<glyph unicode="&#xd6;" d="M68 309v887q0 42 17 106t45 107t88.5 78t144 35t144 -34t88.5 -81q55 -93 60 -178l2 -33v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-144 -34.5t-144 33.5t-88.5 81.5q-55 94 -60 175zM123 1638v201h190v-201h-190zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v887q0 46 -19.5 78.5t-54 32.5t-53 -28t-18.5 -54l-2 -29v-887zM412 1638v201h190v-201h-190z" />
-<glyph unicode="&#xd8;" d="M59 -20l47 157q-36 74 -36 148l-2 24v887q0 42 17 106t45 107t88.5 78t148 35t153.5 -43l15 47h122l-45 -150q43 -84 43 -155l2 -25v-887q0 -42 -17 -106t-45 -107t-88.5 -77.5t-150.5 -34.5t-153 43l-15 -47h-129zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5 l2 26v488zM289 727l147 479q-8 100 -74 101q-35 0 -53 -28t-18 -54l-2 -29v-469z" />
-<glyph unicode="&#xd9;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM145 1823h215l107 -185h-160z" />
-<glyph unicode="&#xda;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM307 1638l107 185h215l-162 -185h-160z" />
-<glyph unicode="&#xdb;" horiz-adv-x="749" d="M80 309q0 -42 17.5 -106t45 -107t88 -77.5t144.5 -34.5t144.5 33.5t88.5 81.5q55 97 60 175l2 35v1196h-221v-1196q0 -44 -19.5 -77t-54.5 -33t-53.5 27.5t-18.5 56.5l-2 26v1196h-221v-1196zM125 1638l141 185h219l142 -185h-189l-63 72l-62 -72h-188z" />
-<glyph unicode="&#xdc;" horiz-adv-x="749" d="M80 309v1196h221v-1196q0 -46 19.5 -78t54.5 -32t53 27.5t18 56.5l3 26v1196h221v-1196q0 -42 -17.5 -106t-45 -107t-88 -77.5t-144.5 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175zM135 1638v201h191v-201h-191zM424 1638v201h190v-201h-190z" />
-<glyph unicode="&#xdd;" horiz-adv-x="704" d="M16 1505l226 -864v-641h221v641l225 864h-217l-111 -481l-6 -14h-4l-6 14l-111 481h-217zM254 1638l106 185h215l-161 -185h-160z" />
-<glyph unicode="&#xde;" d="M82 0v1505h219v-241h2q166 0 277.5 -105.5t111.5 -345.5t-111.5 -346.5t-277.5 -106.5v-360h-221zM303 586q102 0 134 45t32 175t-33 181t-133 51v-452z" />
-<glyph unicode="&#xdf;" horiz-adv-x="733" d="M66 0v1235q0 123 70.5 205t206.5 82t204.5 -81t68.5 -197t-88 -181q152 -88 152 -488q0 -362 -87 -475q-46 -59 -102.5 -79.5t-144.5 -20.5v193q45 0 70 25q57 57 57 357q0 316 -57 377q-25 27 -70 27v141q35 0 60.5 33t25.5 84q0 100 -86 100q-74 0 -74 -102v-1235h-206 z" />
-<glyph unicode="&#xe0;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1489h215 l107 -184h-160zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe1;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM252 291 q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xe2;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM90 1305 l141 184h220l141 -184h-189l-63 71l-61 -71h-189zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe3;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM143 1305v151 q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250z" />
-<glyph unicode="&#xe4;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM102 1305v200 h191v-200h-191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM391 1305v200h191v-200h-191z" />
-<glyph unicode="&#xe5;" horiz-adv-x="681" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t190 88t184.5 -74t75 -180v-688q0 -109 14 -195h-202q-18 20 -19 90h-14q-20 -37 -65.5 -71.5t-102.5 -34.5t-110.5 60t-53.5 191zM188 1421.5 q0 61.5 45.5 102.5t109 41t107.5 -41t44 -102.5t-44 -102.5t-107.5 -41t-109 41t-45.5 102.5zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM266 1421.5q0 -28.5 23.5 -50t52.5 -21.5t52.5 21.5t23.5 50t-23.5 50t-52.5 21.5t-52.5 -21.5 t-23.5 -50z" />
-<glyph unicode="&#xe6;" horiz-adv-x="989" d="M49 235q0 131 34 212t83 124t98 73t88 50.5t43 36.5v123q0 102 -57 102q-41 0 -50 -42t-9 -84v-39h-207v47q0 123 80.5 211t197.5 88q84 0 152 -52q66 51 162 52q199 0 251 -197q14 -51 15 -92v-326h-342v-256q0 -60 38 -88q17 -12 38 -12q70 10 73 113v122h193v-129 q0 -37 -16.5 -93t-41 -95t-80 -69.5t-130.5 -30.5q-158 0 -226 131q-102 -131 -221 -131q-59 0 -112.5 60t-53.5 191zM252 291q0 -104 57 -105q35 0 60.5 19.5t25.5 48.5v287q-143 -62 -143 -250zM588 684h149v158q0 48 -19.5 81t-53 33t-53 -28.5t-21.5 -57.5l-2 -28v-158z " />
-<glyph unicode="&#xe7;" horiz-adv-x="645" d="M66 315v490q0 332 264 332q137 0 201.5 -71t64.5 -251v-88h-207v135q0 51 -12 70.5t-47 19.5q-58 0 -58 -90v-604q0 -90 58 -90q35 0 47 19.5t12 70.5v156h207v-109q0 -180 -64.5 -250.5t-201.5 -70.5q-264 0 -264 331zM238 -111v-141h63l-41 -133h105l45 133v141h-172z " />
-<glyph unicode="&#xe8;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM102 1489h215l107 -184 h-160zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xe9;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM258 684h150v158 q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM264 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xea;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM80 1305l141 184h219 l142 -184h-189l-63 71l-62 -71h-188zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158z" />
-<glyph unicode="&#xeb;" horiz-adv-x="659" d="M66 279v563q0 36 16 94.5t42 97.5t81 71t129 32q199 0 252 -197q14 -51 14 -92v-326h-342v-256q0 -59 39 -88q16 -12 37 -12q70 10 74 113v122h192v-129q0 -37 -16.5 -93t-41 -95t-79.5 -69.5t-130 -30.5t-130.5 30.5t-80.5 73.5q-49 87 -54 160zM90 1305v200h191v-200 h-191zM258 684h150v158q0 48 -19.5 81t-53.5 33t-53.5 -28.5t-21.5 -57.5l-2 -28v-158zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xec;" horiz-adv-x="370" d="M-33 1489h215l107 -184h-160zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xed;" horiz-adv-x="370" d="M82 0h207v1120h-207v-1120zM82 1305l106 184h215l-161 -184h-160z" />
-<glyph unicode="&#xee;" horiz-adv-x="370" d="M-66 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189zM82 0h207v1120h-207v-1120z" />
-<glyph unicode="&#xef;" horiz-adv-x="372" d="M-53 1305v200h190v-200h-190zM82 0v1120h207v-1120h-207zM236 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf0;" horiz-adv-x="673" d="M76 279v579q0 279 172 279q63 0 155 -78q-12 109 -51 203l-82 -72l-55 63l100 88l-45 66l109 100q25 -27 53 -61l94 82l56 -66l-101 -88q125 -201 125 -446v-656q0 -102 -56 -188q-26 -39 -80 -69.5t-129 -30.5t-130 30.5t-80 73.5q-53 91 -53 160zM270 267.5 q-2 -11.5 2 -29t10 -34.5q16 -38 58 -38q70 10 72 113v563q-2 0 0 11t-2 28.5t-10 34.5q-16 40 -60 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf1;" horiz-adv-x="690" d="M82 0v1120h207v-94l32 32q79 79 145.5 79t106 -69t39.5 -150v-918h-206v887q-1 49 -50 49q-41 0 -67 -53v-883h-207zM147 1305v151q49 39 95.5 39t105 -18.5t97 -19.5t100.5 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#xf2;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM98 1489h215l107 -184h-160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf3;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5 t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM260 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xf4;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM78 1305l141 184h219l142 -184h-189l-63 71l-62 -71h-188zM258 267.5q-2 -11.5 2 -29 t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf5;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM131 1305v151q49 39 95.5 39t104.5 -18.5t98.5 -19.5t98.5 32v-152q-51 -39 -95 -39 t-102 19.5t-101 19.5t-99 -32zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5z" />
-<glyph unicode="&#xf6;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t129.5 32q199 0 252 -197q14 -51 14 -92v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-129 -30.5t-130 30.5t-80.5 73.5q-52 92 -52 160zM90 1305v200h191v-200h-191zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38 q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM379 1305v200h190v-200h-190z" />
-<glyph unicode="&#xf8;" horiz-adv-x="657" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t118 32t117.5 -19l21 80h75l-30 -121q88 -84 94 -229v-576q0 -102 -56 -188q-26 -39 -80.5 -69.5t-120.5 -30.5t-112 16l-20 -78h-80l31 121q-41 39 -64.5 97.5t-25.5 97.5zM258 436l125 486q-18 35 -55 34q-68 -10 -70 -114 v-406zM274 197q17 -31 54 -31q70 10 71 113v403z" />
-<glyph unicode="&#xf9;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM113 1489h215l106 -184h-160z" />
-<glyph unicode="&#xfa;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM274 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfb;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM94 1305l142 184h219l141 -184h-188l-64 71l-61 -71h-189z" />
-<glyph unicode="&#xfc;" horiz-adv-x="690" d="M78 203v917h207v-887q0 -49 49 -49q41 0 67 54v882h207v-1120h-207v94l-31 -32q-78 -78 -145.5 -78t-107 68.5t-39.5 150.5zM106 1305v200h191v-200h-191zM395 1305v200h191v-200h-191z" />
-<glyph unicode="&#xfd;" horiz-adv-x="634" d="M25 1120l190 -1153q0 -68 -36 -123t-97 -61l-49 4v-184q70 -4 92 -4q115 0 192.5 95t94.5 222l198 1204h-202l-82 -688l-4 -57h-9l-4 57l-82 688h-202zM231 1305l107 184h215l-162 -184h-160z" />
-<glyph unicode="&#xfe;" horiz-adv-x="686" d="M82 -385v1890h207v-458q88 90 165 90t117.5 -69t40.5 -150v-715q0 -82 -41 -150.5t-118 -68.5q-33 0 -74 22.5t-66 44.5l-24 23v-459h-207zM289 246q0 -25 19.5 -46.5t42 -21.5t39 19.5t16.5 48.5v628q0 29 -16.5 48.5t-39 19.5t-42 -19.5t-19.5 -48.5v-628z" />
-<glyph unicode="&#xff;" horiz-adv-x="634" d="M25 1120h202l82 -688l4 -57h9l4 57l82 688h202l-198 -1204q-16 -127 -94 -222t-193 -95l-92 4v184q16 -4 49 -4q61 6 97 61.5t36 122.5zM78 1305v200h190v-200h-190zM367 1305v200h190v-200h-190z" />
-<glyph unicode="&#x152;" horiz-adv-x="983" d="M68 309v887q0 41 17 101.5t45 100.5t88.5 73.5t143.5 33.5h580v-227h-285v-395h205v-242h-205v-414h285v-227h-580q-84 0 -144 31.5t-88 78.5q-55 91 -60 169zM289 309q0 -46 19.5 -78t54 -32t53 27.5t18.5 56.5l2 26v901q-6 96 -74 97q-35 0 -53 -28t-18 -54l-2 -29 v-887z" />
-<glyph unicode="&#x153;" horiz-adv-x="995" d="M63 279v563q0 40 15.5 96.5t40 95.5t80 71t145.5 32t156 -60q66 59 170 60q199 0 252 -197q14 -51 14 -92v-326h-342v-250q0 -46 22.5 -76t53.5 -30q70 10 73 113v122h193v-129q0 -37 -16.5 -93t-41 -95t-80 -69.5t-146 -30.5t-154.5 57q-68 -57 -156 -57t-143.5 30.5 t-80.5 73.5q-52 92 -52 160zM258 267.5q-2 -11.5 2 -29t10 -34.5q14 -38 58 -38q70 10 71 113v563q-2 0 0 11t-2 28.5t-10 34.5q-15 40 -59 40q-68 -10 -70 -114v-563q2 0 0 -11.5zM594 684h149v158q0 48 -19 81t-58 33t-55.5 -37.5t-16.5 -70.5v-164z" />
-<glyph unicode="&#x178;" horiz-adv-x="704" d="M16 1505h217l111 -481l6 -14h4l6 14l111 481h217l-225 -864v-641h-221v641zM113 1638v201h190v-201h-190zM401 1638v201h191v-201h-191z" />
-<glyph unicode="&#x2c6;" horiz-adv-x="1021" d="M260 1305l141 184h220l141 -184h-189l-63 71l-61 -71h-189z" />
-<glyph unicode="&#x2dc;" horiz-adv-x="1024" d="M313 1305v151q49 39 95.5 39t104.5 -18.5t97 -19.5t101 32v-152q-51 -39 -95.5 -39t-102.5 19.5t-99 19.5t-101 -32z" />
-<glyph unicode="&#x2000;" horiz-adv-x="952" />
-<glyph unicode="&#x2001;" horiz-adv-x="1905" />
-<glyph unicode="&#x2002;" horiz-adv-x="952" />
-<glyph unicode="&#x2003;" horiz-adv-x="1905" />
-<glyph unicode="&#x2004;" horiz-adv-x="635" />
-<glyph unicode="&#x2005;" horiz-adv-x="476" />
-<glyph unicode="&#x2006;" horiz-adv-x="317" />
-<glyph unicode="&#x2007;" horiz-adv-x="317" />
-<glyph unicode="&#x2008;" horiz-adv-x="238" />
-<glyph unicode="&#x2009;" horiz-adv-x="381" />
-<glyph unicode="&#x200a;" horiz-adv-x="105" />
-<glyph unicode="&#x2010;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2011;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2012;" horiz-adv-x="444" d="M74 455v194h297v-194h-297z" />
-<glyph unicode="&#x2013;" horiz-adv-x="806" d="M74 649v195h659v-195h-659z" />
-<glyph unicode="&#x2014;" horiz-adv-x="972" d="M74 649v195h825v-195h-825z" />
-<glyph unicode="&#x2018;" horiz-adv-x="309" d="M49 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x2019;" horiz-adv-x="309" d="M45 1012l72 266h-72v227h215v-227l-113 -266h-102z" />
-<glyph unicode="&#x201a;" horiz-adv-x="309" d="M45 0v227h215v-227l-113 -266h-102l72 266h-72z" />
-<glyph unicode="&#x201c;" horiz-adv-x="624" d="M53 1012v227l113 266h102l-71 -266h71v-227h-215zM356 1012v227l113 266h102l-71 -266h71v-227h-215z" />
-<glyph unicode="&#x201d;" horiz-adv-x="624" d="M53 1012l72 266h-72v227h215v-227l-112 -266h-103zM356 1012l72 266h-72v227h215v-227l-112 -266h-103z" />
-<glyph unicode="&#x201e;" horiz-adv-x="624" d="M53 0v227h215v-227l-112 -266h-103l72 266h-72zM356 0v227h215v-227l-112 -266h-103l72 266h-72z" />
-<glyph unicode="&#x2022;" horiz-adv-x="663" d="M82 815q0 104 72.5 177t177 73t177.5 -72.5t73 -177t-73 -177.5t-177 -73t-177 73t-73 177z" />
-<glyph unicode="&#x2026;" horiz-adv-x="964" d="M53 0v227h215v-227h-215zM375 0v227h215v-227h-215zM696 0v227h215v-227h-215z" />
-<glyph unicode="&#x202f;" horiz-adv-x="381" />
-<glyph unicode="&#x2039;" horiz-adv-x="1058" d="M74 649v160l911 475v-199l-698 -356l698 -356v-199z" />
-<glyph unicode="&#x203a;" horiz-adv-x="1058" d="M74 174v199l698 356l-698 356v199l911 -475v-160z" />
-<glyph unicode="&#x205f;" horiz-adv-x="476" />
-<glyph unicode="&#x20ac;" horiz-adv-x="813" d="M53 547v137h107v137h-107v137h107v238q0 42 17.5 106t45 107t88 78t144.5 35t144 -34t88 -81q53 -90 61 -178l2 -33v-84h-207v84q-2 0 0 11.5t-3 27.5t-12 33q-18 39 -69 39q-70 -10 -78 -111v-238h233v-137h-233v-137h233v-137h-233v-238q0 -43 21.5 -76.5t59.5 -33.5 t58.5 27.5t20.5 56.5l2 26v84h207v-84q0 -38 -17.5 -104t-45.5 -109t-88 -77.5t-144 -34.5t-144.5 33.5t-88.5 81.5q-55 97 -60 175l-2 35v238h-107z" />
-<glyph unicode="&#x2122;" horiz-adv-x="937" d="M74 1401v104h321v-104h-104v-580h-113v580h-104zM440 821v684h138l67 -319h6l68 319h137v-684h-104v449l-78 -449h-51l-80 449v-449h-103z" />
-<glyph unicode="&#xe000;" horiz-adv-x="1120" d="M0 0v1120h1120v-1120h-1120z" />
-<glyph unicode="&#xfb01;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2v-184q-41 12 -91 12t-69.5 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h358v-1120h-207v934h-151v-934h-207v934h-105z" />
-<glyph unicode="&#xfb02;" horiz-adv-x="772" d="M20 934v186h105v31q0 172 31 231q16 31 42 67q53 71 181 71q59 0 127 -13l20 -2h164v-1505h-207v1329q-37 4 -67.5 4t-50 -18.5t-25.5 -58.5q-8 -52 -8 -107v-29h104v-186h-104v-934h-207v934h-105z" />
-<glyph unicode="&#xfb03;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1120h207v-1120h-207zM1032 1298v207h207v-207h-207z" />
-<glyph unicode="&#xfb04;" horiz-adv-x="1320" d="M20 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934h-207v934h-105zM495 934v186h105v31q0 190 51 270q23 35 71 63.5t115 28.5l97 -14v-178q-27 8 -62 8q-66 0 -65 -180v-29h104v-186h-104v-934 h-207v934h-105zM1032 0v1505h207v-1505h-207z" />
-</font>
-</defs></svg> 
diff --git a/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.ttf b/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.ttf
deleted file mode 100644
Binary files a/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.ttf and /dev/null differ
diff --git a/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.woff b/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.woff
deleted file mode 100644
Binary files a/docs/slides/plpv14/reveal.js/lib/font/league_gothic-webfont.woff and /dev/null differ
diff --git a/docs/slides/plpv14/reveal.js/lib/font/league_gothic_license b/docs/slides/plpv14/reveal.js/lib/font/league_gothic_license
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/lib/font/league_gothic_license
+++ /dev/null
@@ -1,2 +0,0 @@
-SIL Open Font License (OFL)
-http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
diff --git a/docs/slides/plpv14/reveal.js/plugin/highlight/highlight.js b/docs/slides/plpv14/reveal.js/plugin/highlight/highlight.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/highlight/highlight.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// START CUSTOM REVEAL.JS INTEGRATION
-(function() {
-	if( typeof window.addEventListener === 'function' ) {
-		var hljs_nodes = document.querySelectorAll( 'pre code' );
-
-		for( var i = 0, len = hljs_nodes.length; i < len; i++ ) {
-			var element = hljs_nodes[i];
-
-			// trim whitespace if data-trim attribute is present
-			if( element.hasAttribute( 'data-trim' ) && typeof element.innerHTML.trim === 'function' ) {
-				element.innerHTML = element.innerHTML.trim();
-			}
-
-			// Now escape html unless prevented by author
-			if( ! element.hasAttribute( 'data-noescape' )) {
-				element.innerHTML = element.innerHTML.replace(/</g,"&lt;").replace(/>/g,"&gt;");
-			}
-
-			// re-highlight when focus is lost (for edited code)
-			element.addEventListener( 'focusout', function( event ) {
-				hljs.highlightBlock( event.currentTarget );
-			}, false );
-		}
-	}
-})();
-// END CUSTOM REVEAL.JS INTEGRATION
-
-// highlight.js build includes support for:
-// All languages in master + fsharp
-
-
-var hljs=new function(){function l(o){return o.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+(q.parentNode?q.parentNode.className:"")).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o<p.length;o++){if(e[p[o]]||p[o]=="no-highlight"){return p[o]}}}function c(q){var o=[];(function p(r,s){for(var t=r.firstChild;t;t=t.nextSibling){if(t.nodeType==3){s+=t.nodeValue.length}else{if(t.nodeName=="BR"){s+=1}else{if(t.nodeType==1){o.push({event:"start",offset:s,node:t});s=p(t,s);o.push({event:"stop",offset:s,node:t})}}}}return s})(q,0);return o}function j(x,v,w){var p=0;var y="";var r=[];function t(){if(x.length&&v.length){if(x[0].offset!=v[0].offset){return(x[0].offset<v[0].offset)?x:v}else{return v[0].event=="start"?x:v}}else{return x.length?x:v}}function s(A){function z(B){return" "+B.nodeName+'="'+l(B.value)+'"'}return"<"+A.nodeName+Array.prototype.map.call(A.attributes,z).join("")+">"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=("</"+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q<r.length){y+=s(r[q]);q++}}}}return y+l(w.substr(p))}function f(r){function o(s){return(s&&s.source)||s}function p(t,s){return RegExp(o(t),"m"+(r.cI?"i":"")+(s?"g":""))}function q(z,x){if(z.compiled){return}z.compiled=true;var u=[];if(z.k){var s={};function A(B,t){t.split(" ").forEach(function(C){var D=C.split("|");s[D[0]]=[B,D[1]?Number(D[1]):1];u.push(D[0])})}z.lR=p(z.l||hljs.IR+"(?!\\.)",true);if(typeof z.k=="string"){A("keyword",z.k)}else{for(var y in z.k){if(!z.k.hasOwnProperty(y)){continue}A(y,z.k[y])}}z.k=s}if(x){if(z.bWK){z.b="\\b("+u.join("|")+")\\b(?!\\.)\\s*"}z.bR=p(z.b?z.b:"\\B|\\b");if(!z.e&&!z.eW){z.e="\\B|\\b"}if(z.e){z.eR=p(z.e)}z.tE=o(z.e)||"";if(z.eW&&x.tE){z.tE+=(z.e?"|":"")+x.tE}}if(z.i){z.iR=p(z.i)}if(z.r===undefined){z.r=1}if(!z.c){z.c=[]}for(var w=0;w<z.c.length;w++){if(z.c[w]=="self"){z.c[w]=z}q(z.c[w],z)}if(z.starts){q(z.starts,x)}var v=[];for(var w=0;w<z.c.length;w++){v.push(o(z.c[w].b))}if(z.tE){v.push(o(z.tE))}if(z.i){v.push(o(z.i))}z.t=v.length?p(v.join("|"),true):{exec:function(t){return null}}}q(r)}function d(E,F,C){function o(r,N){for(var M=0;M<N.c.length;M++){var L=N.c[M].bR.exec(r);if(L&&L.index==0){return N.c[M]}}}function s(L,r){if(L.e&&L.eR.test(r)){return L}if(L.eW){return s(L.parent,r)}}function t(r,L){return !C&&L.i&&L.iR.test(r)}function y(M,r){var L=G.cI?r[0].toLowerCase():r[0];return M.k.hasOwnProperty(L)&&M.k[L]}function H(){var L=l(w);if(!A.k){return L}var r="";var O=0;A.lR.lastIndex=0;var M=A.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=y(A,M);if(N){v+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=A.lR.lastIndex;M=A.lR.exec(L)}return r+L.substr(O)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return'<span class="'+r.language+'">'+r.value+"</span>"}function K(){return A.sL!==undefined?z():H()}function J(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){x+=L;w=""}else{if(M.eB){x+=l(r)+L;w=""}else{x+=L;w=r}}A=Object.create(M,{parent:{value:A}})}function D(L,r){w+=L;if(r===undefined){x+=K();return 0}var N=o(r,A);if(N){x+=K();J(N,r);return N.rB?0:r.length}var O=s(A,r);if(O){var M=A;if(!(M.rE||M.eE)){w+=r}x+=K();do{if(A.cN){x+="</span>"}B+=A.r;A=A.parent}while(A!=O.parent);if(M.eE){x+=l(r)}w="";if(O.starts){J(O.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw new Error('Illegal lexem "'+r+'" for mode "'+(A.cN||"<unnamed>")+'"')}w+=r;return r.length||1}var G=e[E];f(G);var A=G;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(F);if(!u){break}q=D(F.substr(p,u.index-p),u[0]);p=u.index+q}D(F.substr(p));return{r:B,keyword_count:v,value:x,language:E}}catch(I){if(I.message.indexOf("Illegal")!=-1){return{r:0,keyword_count:0,value:l(F)}}else{throw I}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s,false);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g,"<br>")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v,true):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES["1c"]=function(b){var f="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*";var c="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт";var e="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a],r:0};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(процедура|функция)",e:"$",l:f,k:"процедура функция",c:[{cN:"title",b:f},{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"знач",c:[d,g]},{cN:"export",b:"экспорт",eW:true,l:f,k:"экспорт",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}}(hljs);hljs.LANGUAGES.actionscript=function(a){var d="[a-zA-Z_$][a-zA-Z0-9_$]*";var c="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var e={cN:"rest_arg",b:"[.]{3}",e:d,r:10};var b={cN:"title",b:d};return{k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:"package",bWK:true,e:"{",k:"package",c:[b]},{cN:"class",bWK:true,e:"{",k:"class interface",c:[{bWK:true,k:"extends implements"},b]},{cN:"preprocessor",bWK:true,e:";",k:"import include"},{cN:"function",bWK:true,e:"[{;]",k:"function",i:"\\S",c:[b,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,e]},{cN:"type",b:":",e:c,r:10}]}]}}(hljs);hljs.LANGUAGES.apache=function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,k:{keyword:"acceptfilter acceptmutex acceptpathinfo accessfilename action addalt addaltbyencoding addaltbytype addcharset adddefaultcharset adddescription addencoding addhandler addicon addiconbyencoding addiconbytype addinputfilter addlanguage addmoduleinfo addoutputfilter addoutputfilterbytype addtype alias aliasmatch allow allowconnect allowencodedslashes allowoverride anonymous anonymous_logemail anonymous_mustgiveemail anonymous_nouserid anonymous_verifyemail authbasicauthoritative authbasicprovider authdbduserpwquery authdbduserrealmquery authdbmgroupfile authdbmtype authdbmuserfile authdefaultauthoritative authdigestalgorithm authdigestdomain authdigestnccheck authdigestnonceformat authdigestnoncelifetime authdigestprovider authdigestqop authdigestshmemsize authgroupfile authldapbinddn authldapbindpassword authldapcharsetconfig authldapcomparednonserver authldapdereferencealiases authldapgroupattribute authldapgroupattributeisdn authldapremoteuserattribute authldapremoteuserisdn authldapurl authname authnprovideralias authtype authuserfile authzdbmauthoritative authzdbmtype authzdefaultauthoritative authzgroupfileauthoritative authzldapauthoritative authzownerauthoritative authzuserauthoritative balancermember browsermatch browsermatchnocase bufferedlogs cachedefaultexpire cachedirlength cachedirlevels cachedisable cacheenable cachefile cacheignorecachecontrol cacheignoreheaders cacheignorenolastmod cacheignorequerystring cachelastmodifiedfactor cachemaxexpire cachemaxfilesize cacheminfilesize cachenegotiateddocs cacheroot cachestorenostore cachestoreprivate cgimapextension charsetdefault charsetoptions charsetsourceenc checkcaseonly checkspelling chrootdir contentdigest cookiedomain cookieexpires cookielog cookiename cookiestyle cookietracking coredumpdirectory customlog dav davdepthinfinity davgenericlockdb davlockdb davmintimeout dbdexptime dbdkeep dbdmax dbdmin dbdparams dbdpersist dbdpreparesql dbdriver defaulticon defaultlanguage defaulttype deflatebuffersize deflatecompressionlevel deflatefilternote deflatememlevel deflatewindowsize deny directoryindex directorymatch directoryslash documentroot dumpioinput dumpiologlevel dumpiooutput enableexceptionhook enablemmap enablesendfile errordocument errorlog example expiresactive expiresbytype expiresdefault extendedstatus extfilterdefine extfilteroptions fileetag filterchain filterdeclare filterprotocol filterprovider filtertrace forcelanguagepriority forcetype forensiclog gracefulshutdowntimeout group header headername hostnamelookups identitycheck identitychecktimeout imapbase imapdefault imapmenu include indexheadinsert indexignore indexoptions indexorderdefault indexstylesheet isapiappendlogtoerrors isapiappendlogtoquery isapicachefile isapifakeasync isapilognotsupported isapireadaheadbuffer keepalive keepalivetimeout languagepriority ldapcacheentries ldapcachettl ldapconnectiontimeout ldapopcacheentries ldapopcachettl ldapsharedcachefile ldapsharedcachesize ldaptrustedclientcert ldaptrustedglobalcert ldaptrustedmode ldapverifyservercert limitinternalrecursion limitrequestbody limitrequestfields limitrequestfieldsize limitrequestline limitxmlrequestbody listen listenbacklog loadfile loadmodule lockfile logformat loglevel maxclients maxkeepaliverequests maxmemfree maxrequestsperchild maxrequestsperthread maxspareservers maxsparethreads maxthreads mcachemaxobjectcount mcachemaxobjectsize mcachemaxstreamingbuffer mcacheminobjectsize mcacheremovalalgorithm mcachesize metadir metafiles metasuffix mimemagicfile minspareservers minsparethreads mmapfile mod_gzip_on mod_gzip_add_header_count mod_gzip_keep_workfiles mod_gzip_dechunk mod_gzip_min_http mod_gzip_minimum_file_size mod_gzip_maximum_file_size mod_gzip_maximum_inmem_size mod_gzip_temp_dir mod_gzip_item_include mod_gzip_item_exclude mod_gzip_command_version mod_gzip_can_negotiate mod_gzip_handle_methods mod_gzip_static_suffix mod_gzip_send_vary mod_gzip_update_static modmimeusepathinfo multiviewsmatch namevirtualhost noproxy nwssltrustedcerts nwsslupgradeable options order passenv pidfile protocolecho proxybadheader proxyblock proxydomain proxyerroroverride proxyftpdircharset proxyiobuffersize proxymaxforwards proxypass proxypassinterpolateenv proxypassmatch proxypassreverse proxypassreversecookiedomain proxypassreversecookiepath proxypreservehost proxyreceivebuffersize proxyremote proxyremotematch proxyrequests proxyset proxystatus proxytimeout proxyvia readmename receivebuffersize redirect redirectmatch redirectpermanent redirecttemp removecharset removeencoding removehandler removeinputfilter removelanguage removeoutputfilter removetype requestheader require rewritebase rewritecond rewriteengine rewritelock rewritelog rewriteloglevel rewritemap rewriteoptions rewriterule rlimitcpu rlimitmem rlimitnproc satisfy scoreboardfile script scriptalias scriptaliasmatch scriptinterpretersource scriptlog scriptlogbuffer scriptloglength scriptsock securelisten seerequesttail sendbuffersize serveradmin serveralias serverlimit servername serverpath serverroot serversignature servertokens setenv setenvif setenvifnocase sethandler setinputfilter setoutputfilter ssienableaccess ssiendtag ssierrormsg ssistarttag ssitimeformat ssiundefinedecho sslcacertificatefile sslcacertificatepath sslcadnrequestfile sslcadnrequestpath sslcarevocationfile sslcarevocationpath sslcertificatechainfile sslcertificatefile sslcertificatekeyfile sslciphersuite sslcryptodevice sslengine sslhonorciperorder sslmutex ssloptions sslpassphrasedialog sslprotocol sslproxycacertificatefile sslproxycacertificatepath sslproxycarevocationfile sslproxycarevocationpath sslproxyciphersuite sslproxyengine sslproxymachinecertificatefile sslproxymachinecertificatepath sslproxyprotocol sslproxyverify sslproxyverifydepth sslrandomseed sslrequire sslrequiressl sslsessioncache sslsessioncachetimeout sslusername sslverifyclient sslverifydepth startservers startthreads substitute suexecusergroup threadlimit threadsperchild threadstacksize timeout traceenable transferlog typesconfig unsetenv usecanonicalname usecanonicalphysicalport user userdir virtualdocumentroot virtualdocumentrootip virtualscriptalias virtualscriptaliasip win32disableacceptex xbithack",literal:"on off"},c:[a.HCM,{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,{cN:"tag",b:"</?",e:">"},a.QSM]}}(hljs);hljs.LANGUAGES.applescript=function(a){var b=a.inherit(a.QSM,{i:""});var e={cN:"title",b:a.UIR};var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bWK:true,k:"on",i:"[${=;\\n]",c:[e,d]}].concat(c),i:"//"}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);hljs.LANGUAGES.asciidoc=function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{4,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}}(hljs);hljs.LANGUAGES.avrasm=function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$"},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}}(hljs);hljs.LANGUAGES.axapta=function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"{",i:":",k:"class interface",c:[{cN:"inheritance",bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]}]}}(hljs);hljs.LANGUAGES.bash=function(a){var c={cN:"variable",b:/\$[\w\d#@][\w\d_]*/};var b={cN:"variable",b:/\$\{(.*?)\}/};var e={cN:"string",b:/"/,e:/"/,c:[a.BE,c,b,{cN:"variable",b:/\$\(/,e:/\)/,c:a.BE}],r:0};var d={cN:"string",b:/'/,e:/'/,r:0};return{l:/-?[a-z]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[{cN:"title",b:/\w[\w\d_]*/}],r:0},a.HCM,a.NM,e,d,c,b]}}(hljs);hljs.LANGUAGES.brainfuck=function(a){return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",eE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]"},{cN:"literal",b:"[\\+\\-]"}]}}(hljs);hljs.LANGUAGES.clojure=function(l){var e={built_in:"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for doseq dosync dotimes and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import intern refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! import use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if throw printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time ns assert re-find re-groups rand-int rand mod locking assert-valid-fdecl alias namespace resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! memfn to-array future future-call into-array aset gen-class reduce merge map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j={cN:"string",b:'"',e:'"',c:[l.BE],r:0};var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:"\\S",c:[o,m]}}(hljs);hljs.LANGUAGES.cmake=function(a){return{cI:true,k:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file",c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}}(hljs);hljs.LANGUAGES.coffeescript=function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f={cN:"title",b:a};var e={cN:"subst",b:"#\\{",e:"}",k:b,};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",b:"'''",e:"'''",c:[c.BE]},{cN:"string",b:"'",e:"'",c:[c.BE],r:0},{cN:"string",b:'"""',e:'"""',c:[c.BE,e]},{cN:"string",b:'"',e:'"',c:[c.BE,e],r:0},{cN:"regexp",b:"///",e:"///",c:[c.HCM]},{cN:"regexp",b:"//[gim]*",r:0},{cN:"regexp",b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bWK:true,k:"class",e:"$",i:"[:\\[\\]]",c:[{bWK:true,k:"extends",eW:true,i:":",c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true}])}}(hljs);hljs.LANGUAGES.cpp=function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.css=function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.d=function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?',r:0};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}}(hljs);hljs.LANGUAGES.delphi=function(b){var f="and safecall cdecl then string exports library not pascal set virtual file in array label packed end. index while const raise for to implementation with except overload destructor downto finally program exit unit inherited override if type until function do begin repeat goto nil far initialization object else var uses external resourcestring interface end finalization class asm mod case on shr shl of register xorwrite threadvar try record near stored constructor stdcall inline div out or procedure";var e="safecall stdcall pascal stored const implementation finalization except to finally program inherited override then exports string read not mod shr try div shl set library message packed index for near overload label downto exit public goto interface asm on of constructor or private array unit raise destructor var type until function else external with case default record while protected property procedure published and cdecl do threadvar file in if end virtual write far out begin repeat nil initialization object uses resourcestring class register xorwrite inline static";var a={cN:"comment",b:"{",e:"}",r:0};var g={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}],r:0};var d={cN:"string",b:"(#\\d+)+"};var h={cN:"function",bWK:true,e:"[:;]",k:"function constructor|10 destructor|10 procedure|10",c:[{cN:"title",b:b.IR},{cN:"params",b:"\\(",e:"\\)",k:f,c:[c,d]},a,g]};return{cI:true,k:f,i:'("|\\$[G-Zg-z]|\\/\\*|</)',c:[a,g,b.CLCM,c,d,b.NM,h,{cN:"class",b:"=\\bclass\\b",e:"end;",k:e,c:[c,d,a,g,b.CLCM,h]}]}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.django=function(c){function e(h,g){return(g==undefined||(!h.cN&&g.cN=="tag")||h.cN=="value")}function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}if(e(l,k)){m=b.concat(m)}if(m.length){g.c=m}}return g}var d={cN:"filter",b:"\\|[A-Za-z]+\\:?",k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:'"',e:'"'}]};var b=[{cN:"template_comment",b:"{%\\s*comment\\s*%}",e:"{%\\s*endcomment\\s*%}"},{cN:"template_comment",b:"{#",e:"#}"},{cN:"template_tag",b:"{%",e:"%}",k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[d]},{cN:"variable",b:"{{",e:"}}",c:[d]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.dos=function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}}(hljs);hljs.LANGUAGES["erlang-repl"]=function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}}(hljs);hljs.LANGUAGES.erlang=function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#",e:"}",i:".",r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",eW:true,r:0}]};var k={k:f,b:"(fun|receive|if|try|case)",e:"end"};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(</|\\*=|\\+=|-=|/=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+c+"\\s*\\(",e:"->",rB:true,i:"\\(|#|//|/\\*|\\\\|:",c:[d,{cN:"title",b:c}],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}}(hljs);hljs.LANGUAGES.fsharp=function(a){var b="'[a-zA-Z0-9_]+";return{k:"yield! return! let! do!abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun|10 function global if in inherit inline interface internal lazy let match member module mutable|10 namespace new null of open or override private public rec|10 return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"//",e:"$",rB:true},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bWK:true,e:"\\(|=|$",k:"type",c:[{cN:"title",b:a.UIR}]},{cN:"annotation",b:"\\[<",e:">\\]",r:10},{cN:"typeparam",b:"<",e:">",c:[{cN:"title",b:b}]},a.CLCM,a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}}(hljs);hljs.LANGUAGES.glsl=function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}}(hljs);hljs.LANGUAGES.go=function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"string",b:"`",e:"`"},{cN:"number",b:"[^a-zA-Z_0-9](\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?",r:0},a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.haml=function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(-#|/).*$",r:0},{b:"^\\s*-(?!#)",starts:{e:"\\n",sL:"ruby"},r:0},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+",r:0},{cN:"value",b:"[#\\.]\\w+",r:0},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,r:0,c:[{cN:"symbol",b:":\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,r:0,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"',r:0},{cN:"string",b:"'",e:"'",r:0},{b:"\\w+",r:0}]},],r:0}],r:10},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"},r:0}]}}(hljs);hljs.LANGUAGES.handlebars=function(c){function f(l,k){var g={};for(var j in l){if(j!="contains"){g[j]=l[j]}var m=[];for(var h=0;l.c&&h<l.c.length;h++){m.push(f(l.c[h],l))}m=d.concat(m);if(m.length){g.c=m}}return g}var b="each in with if else unless bindattr action collection debugger log outlet template unbound view yield";var e={cN:"variable",b:"[a-zA-Z.]+",k:b};var d=[{cN:"expression",b:"{{",e:"}}",c:[{cN:"begin-block",b:"#[a-zA-Z .]+",k:b},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z .]+",k:b},{cN:"variable",b:"[a-zA-Z.]+",k:b}]}];var a=f(c.LANGUAGES.xml);a.cI=true;return a}(hljs);hljs.LANGUAGES.haskell=function(a){var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},{cN:"title",b:"[_a-z][\\w']*"}]};var b={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance not as foreign ccall safe unsafe",c:[{cN:"comment",b:"--",e:"$"},{cN:"preprocessor",b:"{-#",e:"#-}"},{cN:"comment",c:["self"],b:"{-",e:"-}"},{cN:"string",b:"\\s+'",e:"'",c:[a.BE],r:0},a.QSM,{cN:"import",b:"\\bimport",e:"$",k:"import qualified as hiding",c:[c],i:"\\W\\.|;"},{cN:"module",b:"\\bmodule",e:"where",k:"module where",c:[c],i:"\\W\\.|;"},{cN:"class",b:"\\b(class|instance)",e:"where",k:"class where instance",c:[d]},{cN:"typedef",b:"\\b(data|(new)?type)",e:"$",k:"data type newtype deriving",c:[d,c,b]},a.CNM,{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},d,{cN:"title",b:"^[_a-z][\\w']*"},{b:"->|<-"}]}}(hljs);hljs.LANGUAGES.http=function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}}(hljs);hljs.LANGUAGES.ini=function(a){return{cI:true,i:"[^\\s]",c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}}(hljs);hljs.LANGUAGES.java=function(a){return{k:"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,{cN:"class",bWK:true,e:"{",k:"class interface",eE:true,i:":",c:[{bWK:true,k:"extends implements",r:10},{cN:"title",b:a.UIR}]},a.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,sL:"xml"}],r:0},{cN:"function",bWK:true,e:/{/,k:"function",c:[{cN:"title",b:/[A-Za-z$_][0-9A-Za-z$_]*/},{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/}]}}(hljs);hljs.LANGUAGES.json=function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}}(hljs);hljs.LANGUAGES.lasso=function(b){var a="[a-zA-Z_][a-zA-Z0-9_.]*|&[lg]t;";var c="<\\?(lasso(script)?|=)";return{cI:true,l:a,k:{literal:"true false none minimal full all infinity nan and or not bw ew cn lt lte gt gte eq neq ft rx nrx",built_in:"array date decimal duration integer map pair string tag xml null list queue set stack staticarray local var variable data global self inherited void",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require skip split_thread sum take thread to trait type where with yield"},c:[{cN:"preprocessor",b:"\\]|\\?>",r:0,starts:{cN:"markup",e:"\\[|"+c,rE:true}},{cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true}},{cN:"preprocessor",b:"\\[no_square_brackets|\\[/noprocess|"+c},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10},b.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},b.CBLCLM,b.CNM,b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",b:"#\\d+|[#$]"+a},{cN:"tag",b:"::",e:a},{cN:"attribute",b:"\\.\\.\\.|-"+b.UIR},{cN:"class",bWK:true,k:"define",eE:true,e:"\\(|=>",c:[{cN:"title",b:b.UIR+"=?"}]}]}}(hljs);hljs.LANGUAGES.lisp=function(i){var l="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var m="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var k={cN:"shebang",b:"^#!",e:"$"};var a={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d=[{cN:"number",b:m},{cN:"number",b:"#b[0-1]+(/[0-1]+)?"},{cN:"number",b:"#o[0-7]+(/[0-7]+)?"},{cN:"number",b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{cN:"number",b:"#c\\("+m+" +"+m,e:"\\)"}];var h={cN:"string",b:'"',e:'"',c:[i.BE],r:0};var n={cN:"comment",b:";",e:"$"};var g={cN:"variable",b:"\\*",e:"\\*"};var o={cN:"keyword",b:"[:&]"+l};var b={b:"\\(",e:"\\)",c:["self",a,h].concat(d)};var e={cN:"quoted",b:"['`]\\(",e:"\\)",c:d.concat([h,g,o,b])};var c={cN:"quoted",b:"\\(quote ",e:"\\)",k:{title:"quote"},c:d.concat([h,g,o,b])};var j={cN:"list",b:"\\(",e:"\\)"};var f={eW:true,r:0};j.c=[{cN:"title",b:l},f];f.c=[e,c,j,a].concat(d).concat([h,n,g,o]);return{i:"[^\\s]",c:d.concat([k,a,h,n,e,c,j])}}(hljs);hljs.LANGUAGES.lua=function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bWK:true,e:"\\)",k:"function",c:[{cN:"title",b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"},{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}}(hljs);hljs.LANGUAGES.markdown=function(a){return{c:[{cN:"header",b:"^#{1,3}",e:"$"},{cN:"header",b:"^.+?\\n[=-]{2,}$"},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",b:"\\*.+?\\*"},{cN:"emphasis",b:"_.+?_",r:0},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",b:"`.+?`"},{cN:"code",b:"^    ",e:"$",r:0},{cN:"horizontal_rule",b:"^-{3,}",e:"$"},{b:"\\[.+?\\]\\(.+?\\)",rB:true,c:[{cN:"link_label",b:"\\[.+\\]"},{cN:"link_url",b:"\\(",e:"\\)",eB:true,eE:true}]}]}}(hljs);hljs.LANGUAGES.matlab=function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bWK:true,e:"$",k:"function",c:[{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:""},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b},{cN:"comment",b:"\\%",e:"$"}].concat(b)}}(hljs);hljs.LANGUAGES.mel=function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:"</",c:[a.CNM,a.ASM,a.QSM,{cN:"string",b:"`",e:"`",c:[a.BE]},{cN:"variable",b:"\\$\\d",r:5},{cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)"},a.CLCM,a.CBLCLM]}}(hljs);hljs.LANGUAGES.mizar=function(a){return{k:["environ vocabularies notations constructors definitions registrations theorems schemes requirements","begin end definition registration cluster existence pred func defpred deffunc theorem proof","let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from","be being by means equals implies iff redefine define now not or attr is mode suppose per cases set","thesis contradiction scheme reserve struct","correctness compatibility coherence symmetry assymetry reflexivity irreflexivity","connectedness uniqueness commutativity idempotence involutiveness projectivity"].join(" "),c:[{cN:"comment",b:"::",e:"$"}]}}(hljs);hljs.LANGUAGES.nginx=function(b){var c=[{cN:"variable",b:"\\$\\d+"},{cN:"variable",b:"\\${",e:"}"},{cN:"variable",b:"[\\$\\@]"+b.UIR}];var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[b.HCM,{cN:"string",b:'"',e:'"',c:[b.BE].concat(c),r:0},{cN:"string",b:"'",e:"'",c:[b.BE].concat(c),r:0},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",b:"\\s\\^",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"~\\*?\\s+",e:"\\s|{|;",rE:true,c:[b.BE].concat(c)},{cN:"regexp",b:"\\*(\\.[a-z\\-]+)+",c:[b.BE].concat(c)},{cN:"regexp",b:"([a-z\\-]+\\.)+\\*",c:[b.BE].concat(c)},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0}].concat(c)};return{c:[b.HCM,{b:b.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:b.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}}(hljs);hljs.LANGUAGES.objectivec=function(a){var b={keyword:"int float while private char catch export sizeof typedef const struct for union unsigned long volatile static protected bool mutable if public do return goto void enum else break extern asm case short default double throw register explicit signed typename try this switch continue wchar_t inline readonly assign property self synchronized end synthesize id optional required nonatomic super unichar finally dynamic IBOutlet IBAction selector strong weak readonly",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};return{k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bWK:true,e:"({|$)",k:"interface class protocol implementation",c:[{cN:"id",b:a.UIR}]},{cN:"variable",b:"\\."+a.UIR,r:0}]}}(hljs);hljs.LANGUAGES.parser3=function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}}(hljs);hljs.LANGUAGES.perl=function(e){var a="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var d={cN:"subst",b:"[$@]\\{",e:"\\}",k:a,r:10};var b={cN:"variable",b:"\\$\\d"};var i={cN:"variable",b:"[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|[^\\s\\w{]|{\\w+}|\\w+(\\:\\:\\w*)*)"};var f=[e.BE,d,b,i];var h={b:"->",c:[{b:e.IR},{b:"{",e:"}"}]};var g={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var c=[b,i,e.HCM,g,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},h,{cN:"string",b:"q[qwxr]?\\s*\\(",e:"\\)",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\[",e:"\\]",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\{",e:"\\}",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\|",e:"\\|",c:f,r:5},{cN:"string",b:"q[qwxr]?\\s*\\<",e:"\\>",c:f,r:5},{cN:"string",b:"qw\\s+q",e:"q",c:f,r:5},{cN:"string",b:"'",e:"'",c:[e.BE],r:0},{cN:"string",b:'"',e:'"',c:f,r:0},{cN:"string",b:"`",e:"`",c:[e.BE]},{cN:"string",b:"{\\w+}",r:0},{cN:"string",b:"-?\\w+\\s*\\=\\>",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"("+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,g,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"sub",bWK:true,e:"(\\s*\\(.*?\\))?[;{]",k:"sub",r:5},{cN:"operator",b:"-\\w\\b",r:0}];d.c=c;h.c[1].c=c;return{k:a,c:c}}(hljs);hljs.LANGUAGES.php=function(a){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var b=[a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),{cN:"string",b:'b"',e:'"',c:[a.BE]},{cN:"string",b:"b'",e:"'",c:[a.BE]}];var c=[a.BNM,a.CNM];var d={cN:"title",b:a.UIR};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return implements parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception php_user_filter default die require __FUNCTION__ enddeclare final try this switch continue endfor endif declare unset true false namespace trait goto instanceof insteadof __DIR__ __NAMESPACE__ __halt_compiler",c:[a.CLCM,a.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"}]},{cN:"comment",eB:true,b:"__halt_compiler.+?;",eW:true},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[a.BE]},{cN:"preprocessor",b:"<\\?php",r:10},{cN:"preprocessor",b:"\\?>"},e,{cN:"function",bWK:true,e:"{",k:"function",i:"\\$|\\[|%",c:[d,{cN:"params",b:"\\(",e:"\\)",c:["self",e,a.CBLCLM].concat(b).concat(c)}]},{cN:"class",bWK:true,e:"{",k:"class",i:"[:\\(\\$]",c:[{bWK:true,eW:true,k:"extends",c:[d]},d]},{b:"=>"}].concat(b).concat(c)}}(hljs);hljs.LANGUAGES.profile=function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[{cN:"title",b:a.UIR,r:0}],r:0}]}}(hljs);hljs.LANGUAGES.python=function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var c=[{cN:"string",b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{cN:"string",b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{cN:"string",b:/(u|r|ur)'/,e:/'/,c:[a.BE],r:10},{cN:"string",b:/(u|r|ur)"/,e:/"/,c:[a.BE],r:10},{cN:"string",b:/(b|br)'/,e:/'/,c:[a.BE]},{cN:"string",b:/(b|br)"/,e:/"/,c:[a.BE]}].concat([a.ASM,a.QSM]);var e={cN:"title",b:a.UIR};var d={cN:"params",b:/\(/,e:/\)/,c:["self",a.CNM,f].concat(c)};var b={bWK:true,e:/:/,i:/[${=;\n]/,c:[e,d],r:10};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10",built_in:"None True False Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:c.concat([f,a.HCM,a.inherit(b,{cN:"function",k:"def"}),a.inherit(b,{cN:"class",k:"class"}),a.CNM,{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}])}}(hljs);hljs.LANGUAGES.r=function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[a.BE],r:0},{cN:"string",b:"'",e:"'",c:[a.BE],r:0}]}}(hljs);hljs.LANGUAGES.rib=function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"</",c:[a.HCM,a.CNM,a.ASM,a.QSM]}}(hljs);hljs.LANGUAGES.rsl=function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"shader",bWK:true,e:"\\(",k:"surface displacement light volume imager"},{cN:"shading",bWK:true,e:"\\(",k:"illuminate illuminance gather"}]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.ruleslanguage=function(a){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEMASK|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN DELETE SAVE SAVE_UPDATE CLEAR DETERMINANT LABEL REPORT REVENUE ABORT CALL DONE LEAVE EACH IN LIST NOVALUE FROM TOTAL CHARGE BLOCK AND OR CSV_FILE BILL_PERIOD RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM ABORT WARN NUMDAYS RATE_CODE READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"array",b:"#[a-zA-Z .]+"}]}}(hljs);hljs.LANGUAGES.rust=function(b){var d={cN:"title",b:b.UIR};var c={cN:"number",b:"\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\.[0-9_]+)?([uif](8|16|32|64)?)?)",r:0};var a="assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while";return{k:a,i:"</",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:"function",bWK:true,e:"(\\(|<)",k:"fn",c:[d]},{cN:"preprocessor",b:"#\\[",e:"\\]"},{bWK:true,e:"(=|<)",k:"type",c:[d],i:"\\S"},{bWK:true,e:"({|<)",k:"trait enum",c:[d],i:"\\S"}]}}(hljs);hljs.LANGUAGES.scala=function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,a.ASM,a.QSM,b,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bWK:true,k:"extends with",r:10},{cN:"title",b:a.UIR},{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}}(hljs);hljs.LANGUAGES.scss=function(a){var c="[a-zA-Z-][a-zA-Z0-9_-]*";var d={cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};var b={cN:"hexcolor",b:"#[0-9A-Fa-f]+"};var e={cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"important",b:"!important"}]}};return{cI:true,i:"[=/|']",c:[a.CLCM,a.CBLCLM,{cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]},{cN:"id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{cN:"pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{cN:"value",b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{cN:"value",b:":",e:";",c:[b,a.NM,a.QSM,a.ASM,{cN:"important",b:"!important"}]},{cN:"at_rule",b:"@",e:"[{;]",k:"mixin include for extend charset import media page font-face namespace",c:[d,a.QSM,a.ASM,b,a.NM,{cN:"preprocessor",b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}}(hljs);hljs.LANGUAGES.smalltalk=function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"',r:0},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":"},a.CNM,c,d,{cN:"localvars",b:"\\|\\s*"+b+"(\\s+"+b+")*\\s*\\|"},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}}(hljs);hljs.LANGUAGES.sql=function(a){return{cI:true,c:[{cN:"operator",b:"(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}],r:0},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}],r:0},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}}(hljs);hljs.LANGUAGES.tex=function(a){var d={cN:"command",b:"\\\\[a-zA-Zа-яА-я]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Zа-яА-я0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Zа-яА-я]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}}(hljs);hljs.LANGUAGES.vala=function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bWK:true,e:"{",k:"class interface delegate namespace",i:"[^,:\\n\\s\\.]",c:[{cN:"title",b:a.UIR}]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}}(hljs);hljs.LANGUAGES.vbnet=function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"(//|endif|gosub|variant|wend)",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}}(hljs);hljs.LANGUAGES.vbscript=function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$"},a.CNM]}}(hljs);hljs.LANGUAGES.vhdl=function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,r:0,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},{cN:"tag",b:"</?",e:"/?>",r:0,c:[{cN:"title",b:"[^ /><]+"},b]}]}}(hljs);
diff --git a/docs/slides/plpv14/reveal.js/plugin/leap/leap.js b/docs/slides/plpv14/reveal.js/plugin/leap/leap.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/leap/leap.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2013, Leap Motion, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Version 0.2.0 - http://js.leapmotion.com/0.2.0/leap.min.js
- * Grab latest versions from http://js.leapmotion.com/
- */
-
-!function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i}({1:[function(require,module,exports){var chooseProtocol=require("./protocol").chooseProtocol,EventEmitter=require("events").EventEmitter,_=require("underscore");var BaseConnection=module.exports=function(opts){this.opts=_.defaults(opts||{},{host:"127.0.0.1",enableGestures:false,port:6437,enableHeartbeat:true,heartbeatInterval:100,requestProtocolVersion:3});this.host=opts.host;this.port=opts.port;this.on("ready",function(){this.enableGestures(this.opts.enableGestures);if(this.opts.enableHeartbeat)this.startHeartbeat()});this.on("disconnect",function(){if(this.opts.enableHeartbeat)this.stopHeartbeat()});this.heartbeatTimer=null};BaseConnection.prototype.getUrl=function(){return"ws://"+this.host+":"+this.port+"/v"+this.opts.requestProtocolVersion+".json"};BaseConnection.prototype.sendHeartbeat=function(){if(this.protocol){this.setHeartbeatState(true);this.protocol.sendHeartbeat(this)}};BaseConnection.prototype.handleOpen=function(){this.emit("connect")};BaseConnection.prototype.enableGestures=function(enabled){this.gesturesEnabled=enabled?true:false;this.send(this.protocol.encode({enableGestures:this.gesturesEnabled}))};BaseConnection.prototype.handleClose=function(){this.disconnect();this.startReconnection()};BaseConnection.prototype.startReconnection=function(){var connection=this;setTimeout(function(){connection.connect()},1e3)};BaseConnection.prototype.disconnect=function(){if(!this.socket)return;this.socket.close();delete this.socket;delete this.protocol;this.emit("disconnect")};BaseConnection.prototype.handleData=function(data){var message=JSON.parse(data);var messageEvent;if(this.protocol===undefined){messageEvent=this.protocol=chooseProtocol(message);this.emit("ready")}else{messageEvent=this.protocol(message)}this.emit(messageEvent.type,messageEvent)};BaseConnection.prototype.connect=function(){if(this.socket)return;this.socket=this.setupSocket();return true};BaseConnection.prototype.send=function(data){this.socket.send(data)};BaseConnection.prototype.stopHeartbeat=function(){if(!this.heartbeatTimer)return;clearInterval(this.heartbeatTimer);delete this.heartbeatTimer;this.setHeartbeatState(false)};BaseConnection.prototype.setHeartbeatState=function(state){if(this.heartbeatState===state)return;this.heartbeatState=state;this.emit(this.heartbeatState?"focus":"blur")};_.extend(BaseConnection.prototype,EventEmitter.prototype)},{"./protocol":12,events:17,underscore:20}],2:[function(require,module,exports){var CircularBuffer=module.exports=function(size){this.pos=0;this._buf=[];this.size=size};CircularBuffer.prototype.get=function(i){if(i==undefined)i=0;if(i>=this.size)return undefined;if(i>=this._buf.length)return undefined;return this._buf[(this.pos-i-1)%this.size]};CircularBuffer.prototype.push=function(o){this._buf[this.pos%this.size]=o;return this.pos++}},{}],3:[function(require,module,exports){var Connection=module.exports=require("./base_connection");Connection.prototype.setupSocket=function(){var connection=this;var socket=new WebSocket(this.getUrl());socket.onopen=function(){connection.handleOpen()};socket.onmessage=function(message){connection.handleData(message.data)};socket.onclose=function(){connection.handleClose()};return socket};Connection.prototype.startHeartbeat=function(){if(!this.protocol.sendHeartbeat||this.heartbeatTimer)return;var connection=this;var propertyName=null;if(typeof document.hidden!=="undefined"){propertyName="hidden"}else if(typeof document.mozHidden!=="undefined"){propertyName="mozHidden"}else if(typeof document.msHidden!=="undefined"){propertyName="msHidden"}else if(typeof document.webkitHidden!=="undefined"){propertyName="webkitHidden"}else{propertyName=undefined}var windowVisible=true;var focusListener=window.addEventListener("focus",function(e){windowVisible=true});var blurListener=window.addEventListener("blur",function(e){windowVisible=false});this.on("disconnect",function(){if(connection.heartbeatTimer){clearTimeout(connection.heartbeatTimer);delete connection.heartbeatTimer}window.removeEventListener(focusListener);window.removeEventListener(blurListener)});this.heartbeatTimer=setInterval(function(){var isVisible=propertyName===undefined?true:document[propertyName]===false;if(isVisible&&windowVisible){connection.sendHeartbeat()}else{connection.setHeartbeatState(false)}},this.opts.heartbeatInterval)}},{"./base_connection":1}],4:[function(require,module,exports){!function(process){var Frame=require("./frame"),CircularBuffer=require("./circular_buffer"),Pipeline=require("./pipeline"),EventEmitter=require("events").EventEmitter,gestureListener=require("./gesture").gestureListener,_=require("underscore");var Controller=module.exports=function(opts){var inNode=typeof process!=="undefined"&&process.title==="node";opts=_.defaults(opts||{},{inNode:inNode});this.inNode=opts.inNode;opts=_.defaults(opts||{},{frameEventName:this.useAnimationLoop()?"animationFrame":"deviceFrame",supressAnimationLoop:false});this.supressAnimationLoop=opts.supressAnimationLoop;this.frameEventName=opts.frameEventName;this.history=new CircularBuffer(200);this.lastFrame=Frame.Invalid;this.lastValidFrame=Frame.Invalid;this.lastConnectionFrame=Frame.Invalid;this.accumulatedGestures=[];if(opts.connectionType===undefined){this.connectionType=this.inBrowser()?require("./connection"):require("./node_connection")}else{this.connectionType=opts.connectionType}this.connection=new this.connectionType(opts);this.setupConnectionEvents()};Controller.prototype.gesture=function(type,cb){var creator=gestureListener(this,type);if(cb!==undefined){creator.stop(cb)}return creator};Controller.prototype.inBrowser=function(){return!this.inNode};Controller.prototype.useAnimationLoop=function(){return this.inBrowser()&&typeof chrome==="undefined"};Controller.prototype.connect=function(){var controller=this;if(this.connection.connect()&&this.inBrowser()&&!controller.supressAnimationLoop){var callback=function(){controller.emit("animationFrame",controller.lastConnectionFrame);window.requestAnimFrame(callback)};window.requestAnimFrame(callback)}};Controller.prototype.disconnect=function(){this.connection.disconnect()};Controller.prototype.frame=function(num){return this.history.get(num)||Frame.Invalid};Controller.prototype.loop=function(callback){switch(callback.length){case 1:this.on(this.frameEventName,callback);break;case 2:var controller=this;var scheduler=null;var immediateRunnerCallback=function(frame){callback(frame,function(){if(controller.lastFrame!=frame){immediateRunnerCallback(controller.lastFrame)}else{controller.once(controller.frameEventName,immediateRunnerCallback)}})};this.once(this.frameEventName,immediateRunnerCallback);break}this.connect()};Controller.prototype.addStep=function(step){if(!this.pipeline)this.pipeline=new Pipeline(this);this.pipeline.addStep(step)};Controller.prototype.processFrame=function(frame){if(frame.gestures){this.accumulatedGestures=this.accumulatedGestures.concat(frame.gestures)}if(this.pipeline){frame=this.pipeline.run(frame);if(!frame)frame=Frame.Invalid}this.lastConnectionFrame=frame;this.emit("deviceFrame",frame)};Controller.prototype.processFinishedFrame=function(frame){this.lastFrame=frame;if(frame.valid){this.lastValidFrame=frame}frame.controller=this;frame.historyIdx=this.history.push(frame);if(frame.gestures){frame.gestures=this.accumulatedGestures;this.accumulatedGestures=[];for(var gestureIdx=0;gestureIdx!=frame.gestures.length;gestureIdx++){this.emit("gesture",frame.gestures[gestureIdx],frame)}}this.emit("frame",frame)};Controller.prototype.setupConnectionEvents=function(){var controller=this;this.connection.on("frame",function(frame){controller.processFrame(frame)});this.on(this.frameEventName,function(frame){controller.processFinishedFrame(frame)});this.connection.on("disconnect",function(){controller.emit("disconnect")});this.connection.on("ready",function(){controller.emit("ready")});this.connection.on("connect",function(){controller.emit("connect")});this.connection.on("focus",function(){controller.emit("focus")});this.connection.on("blur",function(){controller.emit("blur")});this.connection.on("protocol",function(protocol){controller.emit("protocol",protocol)});this.connection.on("deviceConnect",function(evt){controller.emit(evt.state?"deviceConnected":"deviceDisconnected")})};_.extend(Controller.prototype,EventEmitter.prototype)}(require("__browserify_process"))},{"./circular_buffer":2,"./connection":3,"./frame":5,"./gesture":6,"./node_connection":16,"./pipeline":10,__browserify_process:18,events:17,underscore:20}],5:[function(require,module,exports){var Hand=require("./hand"),Pointable=require("./pointable"),createGesture=require("./gesture").createGesture,glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,InteractionBox=require("./interaction_box"),_=require("underscore");var Frame=module.exports=function(data){this.valid=true;this.id=data.id;this.timestamp=data.timestamp;this.hands=[];this.handsMap={};this.pointables=[];this.tools=[];this.fingers=[];if(data.interactionBox){this.interactionBox=new InteractionBox(data.interactionBox)}this.gestures=[];this.pointablesMap={};this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.data=data;this.type="frame";this.currentFrameRate=data.currentFrameRate;var handMap={};for(var handIdx=0,handCount=data.hands.length;handIdx!=handCount;handIdx++){var hand=new Hand(data.hands[handIdx]);hand.frame=this;this.hands.push(hand);this.handsMap[hand.id]=hand;handMap[hand.id]=handIdx}for(var pointableIdx=0,pointableCount=data.pointables.length;pointableIdx!=pointableCount;pointableIdx++){var pointable=new Pointable(data.pointables[pointableIdx]);pointable.frame=this;this.pointables.push(pointable);this.pointablesMap[pointable.id]=pointable;(pointable.tool?this.tools:this.fingers).push(pointable);if(pointable.handId!==undefined&&handMap.hasOwnProperty(pointable.handId)){var hand=this.hands[handMap[pointable.handId]];hand.pointables.push(pointable);(pointable.tool?hand.tools:hand.fingers).push(pointable)}}if(data.gestures){for(var gestureIdx=0,gestureCount=data.gestures.length;gestureIdx!=gestureCount;gestureIdx++){this.gestures.push(createGesture(data.gestures[gestureIdx]))}}};Frame.prototype.tool=function(id){var pointable=this.pointable(id);return pointable.tool?pointable:Pointable.Invalid};Frame.prototype.pointable=function(id){return this.pointablesMap[id]||Pointable.Invalid};Frame.prototype.finger=function(id){var pointable=this.pointable(id);return!pointable.tool?pointable:Pointable.Invalid};Frame.prototype.hand=function(id){return this.handsMap[id]||Hand.Invalid};Frame.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Frame.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceFrame._rotation[5],this._rotation[2]-sinceFrame._rotation[6],this._rotation[3]-sinceFrame._rotation[1]])};Frame.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);return mat3.multiply(mat3.create(),sinceFrame._rotation,transpose)};Frame.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;return Math.exp(this._scaleFactor-sinceFrame._scaleFactor)};Frame.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();return vec3.subtract(vec3.create(),this._translation,sinceFrame._translation)};Frame.prototype.toString=function(){var str="Frame [ id:"+this.id+" | timestamp:"+this.timestamp+" | Hand count:("+this.hands.length+") | Pointable count:("+this.pointables.length+")";if(this.gestures)str+=" | Gesture count:("+this.gestures.length+")";str+=" ]";return str};Frame.prototype.dump=function(){var out="";out+="Frame Info:<br/>";out+=this.toString();out+="<br/><br/>Hands:<br/>";for(var handIdx=0,handCount=this.hands.length;handIdx!=handCount;handIdx++){out+="  "+this.hands[handIdx].toString()+"<br/>"}out+="<br/><br/>Pointables:<br/>";for(var pointableIdx=0,pointableCount=this.pointables.length;pointableIdx!=pointableCount;pointableIdx++){out+="  "+this.pointables[pointableIdx].toString()+"<br/>"}if(this.gestures){out+="<br/><br/>Gestures:<br/>";for(var gestureIdx=0,gestureCount=this.gestures.length;gestureIdx!=gestureCount;gestureIdx++){out+="  "+this.gestures[gestureIdx].toString()+"<br/>"}}out+="<br/><br/>Raw JSON:<br/>";out+=JSON.stringify(this.data);return out};Frame.Invalid={valid:false,hands:[],fingers:[],tools:[],gestures:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},hand:function(){return Hand.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"gl-matrix":19,underscore:20}],6:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3,EventEmitter=require("events").EventEmitter,_=require("underscore");var createGesture=exports.createGesture=function(data){var gesture;switch(data.type){case"circle":gesture=new CircleGesture(data);break;case"swipe":gesture=new SwipeGesture(data);break;case"screenTap":gesture=new ScreenTapGesture(data);break;case"keyTap":gesture=new KeyTapGesture(data);break;default:throw"unkown gesture type"}gesture.id=data.id;gesture.handIds=data.handIds;gesture.pointableIds=data.pointableIds;gesture.duration=data.duration;gesture.state=data.state;gesture.type=data.type;return gesture};var gestureListener=exports.gestureListener=function(controller,type){var handlers={};var gestureMap={};var gestureCreator=function(){var candidateGesture=gestureMap[gesture.id];if(candidateGesture!==undefined)gesture.update(gesture,frame);if(gesture.state=="start"||gesture.state=="stop"){if(type==gesture.type&&gestureMap[gesture.id]===undefined){gestureMap[gesture.id]=new Gesture(gesture,frame);gesture.update(gesture,frame)}if(gesture.state=="stop"){delete gestureMap[gesture.id]}}};controller.on("gesture",function(gesture,frame){if(gesture.type==type){if(gesture.state=="start"||gesture.state=="stop"){if(gestureMap[gesture.id]===undefined){var gestureTracker=new Gesture(gesture,frame);gestureMap[gesture.id]=gestureTracker;_.each(handlers,function(cb,name){gestureTracker.on(name,cb)})}}gestureMap[gesture.id].update(gesture,frame);if(gesture.state=="stop"){delete gestureMap[gesture.id]}}});var builder={start:function(cb){handlers["start"]=cb;return builder},stop:function(cb){handlers["stop"]=cb;return builder},complete:function(cb){handlers["stop"]=cb;return builder},update:function(cb){handlers["update"]=cb;return builder}};return builder};var Gesture=exports.Gesture=function(gesture,frame){this.gestures=[gesture];this.frames=[frame]};Gesture.prototype.update=function(gesture,frame){this.gestures.push(gesture);this.frames.push(frame);this.emit(gesture.state,this)};_.extend(Gesture.prototype,EventEmitter.prototype);var CircleGesture=function(data){this.center=data.center;this.normal=data.normal;this.progress=data.progress;this.radius=data.radius};CircleGesture.prototype.toString=function(){return"CircleGesture ["+JSON.stringify(this)+"]"};var SwipeGesture=function(data){this.startPosition=data.startPosition;this.position=data.position;this.direction=data.direction;this.speed=data.speed};SwipeGesture.prototype.toString=function(){return"SwipeGesture ["+JSON.stringify(this)+"]"};var ScreenTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};ScreenTapGesture.prototype.toString=function(){return"ScreenTapGesture ["+JSON.stringify(this)+"]"};var KeyTapGesture=function(data){this.position=data.position;this.direction=data.direction;this.progress=data.progress};KeyTapGesture.prototype.toString=function(){return"KeyTapGesture ["+JSON.stringify(this)+"]"}},{events:17,"gl-matrix":19,underscore:20}],7:[function(require,module,exports){var Pointable=require("./pointable"),glMatrix=require("gl-matrix"),mat3=glMatrix.mat3,vec3=glMatrix.vec3,_=require("underscore");var Hand=module.exports=function(data){this.id=data.id;this.palmPosition=data.palmPosition;this.direction=data.direction;this.palmVelocity=data.palmVelocity;this.palmNormal=data.palmNormal;this.sphereCenter=data.sphereCenter;this.sphereRadius=data.sphereRadius;this.valid=true;this.pointables=[];this.fingers=[];this.tools=[];this._translation=data.t;this._rotation=_.flatten(data.r);this._scaleFactor=data.s;this.timeVisible=data.timeVisible;this.stabilizedPalmPosition=data.stabilizedPalmPosition};Hand.prototype.finger=function(id){var finger=this.frame.finger(id);return finger&&finger.handId==this.id?finger:Pointable.Invalid};Hand.prototype.rotationAngle=function(sinceFrame,axis){if(!this.valid||!sinceFrame.valid)return 0;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 0;var rot=this.rotationMatrix(sinceFrame);var cs=(rot[0]+rot[4]+rot[8]-1)*.5;var angle=Math.acos(cs);angle=isNaN(angle)?0:angle;if(axis!==undefined){var rotAxis=this.rotationAxis(sinceFrame);angle*=vec3.dot(rotAxis,vec3.normalize(vec3.create(),axis))}return angle};Hand.prototype.rotationAxis=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return vec3.normalize(vec3.create(),[this._rotation[7]-sinceHand._rotation[5],this._rotation[2]-sinceHand._rotation[6],this._rotation[3]-sinceHand._rotation[1]])};Hand.prototype.rotationMatrix=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return mat3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return mat3.create();var transpose=mat3.transpose(mat3.create(),this._rotation);var m=mat3.multiply(mat3.create(),sinceHand._rotation,transpose);return m};Hand.prototype.scaleFactor=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return 1;var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return 1;return Math.exp(this._scaleFactor-sinceHand._scaleFactor)};Hand.prototype.translation=function(sinceFrame){if(!this.valid||!sinceFrame.valid)return vec3.create();var sinceHand=sinceFrame.hand(this.id);if(!sinceHand.valid)return vec3.create();return[this._translation[0]-sinceHand._translation[0],this._translation[1]-sinceHand._translation[1],this._translation[2]-sinceHand._translation[2]]};Hand.prototype.toString=function(){return"Hand [ id: "+this.id+" | palm velocity:"+this.palmVelocity+" | sphere center:"+this.sphereCenter+" ] "};Hand.Invalid={valid:false,fingers:[],tools:[],pointables:[],pointable:function(){return Pointable.Invalid},finger:function(){return Pointable.Invalid},toString:function(){return"invalid frame"},dump:function(){return this.toString()},rotationAngle:function(){return 0},rotationMatrix:function(){return mat3.create()},rotationAxis:function(){return vec3.create()},scaleFactor:function(){return 1},translation:function(){return vec3.create()}}},{"./pointable":11,"gl-matrix":19,underscore:20}],8:[function(require,module,exports){!function(){module.exports={Controller:require("./controller"),Frame:require("./frame"),Gesture:require("./gesture"),Hand:require("./hand"),Pointable:require("./pointable"),InteractionBox:require("./interaction_box"),Connection:require("./connection"),CircularBuffer:require("./circular_buffer"),UI:require("./ui"),glMatrix:require("gl-matrix"),mat3:require("gl-matrix").mat3,vec3:require("gl-matrix").vec3,loopController:undefined,loop:function(opts,callback){if(callback===undefined){callback=opts;opts={}}if(!this.loopController)this.loopController=new this.Controller(opts);this.loopController.loop(callback)}}}()},{"./circular_buffer":2,"./connection":3,"./controller":4,"./frame":5,"./gesture":6,"./hand":7,"./interaction_box":9,"./pointable":11,"./ui":13,"gl-matrix":19}],9:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var InteractionBox=module.exports=function(data){this.valid=true;this.center=data.center;this.size=data.size;this.width=data.size[0];this.height=data.size[1];this.depth=data.size[2]};InteractionBox.prototype.denormalizePoint=function(normalizedPosition){return vec3.fromValues((normalizedPosition[0]-.5)*this.size[0]+this.center[0],(normalizedPosition[1]-.5)*this.size[1]+this.center[1],(normalizedPosition[2]-.5)*this.size[2]+this.center[2])};InteractionBox.prototype.normalizePoint=function(position,clamp){var vec=vec3.fromValues((position[0]-this.center[0])/this.size[0]+.5,(position[1]-this.center[1])/this.size[1]+.5,(position[2]-this.center[2])/this.size[2]+.5);if(clamp){vec[0]=Math.min(Math.max(vec[0],0),1);vec[1]=Math.min(Math.max(vec[1],0),1);vec[2]=Math.min(Math.max(vec[2],0),1)}return vec};InteractionBox.prototype.toString=function(){return"InteractionBox [ width:"+this.width+" | height:"+this.height+" | depth:"+this.depth+" ]"};InteractionBox.Invalid={valid:false}},{"gl-matrix":19}],10:[function(require,module,exports){var Pipeline=module.exports=function(){this.steps=[]};Pipeline.prototype.addStep=function(step){this.steps.push(step)};Pipeline.prototype.run=function(frame){var stepsLength=this.steps.length;for(var i=0;i!=stepsLength;i++){if(!frame)break;frame=this.steps[i](frame)}return frame}},{}],11:[function(require,module,exports){var glMatrix=require("gl-matrix"),vec3=glMatrix.vec3;var Pointable=module.exports=function(data){this.valid=true;this.id=data.id;this.handId=data.handId;this.length=data.length;this.tool=data.tool;this.width=data.width;this.direction=data.direction;this.stabilizedTipPosition=data.stabilizedTipPosition;this.tipPosition=data.tipPosition;this.tipVelocity=data.tipVelocity;this.touchZone=data.touchZone;this.touchDistance=data.touchDistance;this.timeVisible=data.timeVisible};Pointable.prototype.toString=function(){if(this.tool==true){return"Pointable [ id:"+this.id+" "+this.length+"mmx | with:"+this.width+"mm | direction:"+this.direction+" ]"}else{return"Pointable [ id:"+this.id+" "+this.length+"mmx | direction: "+this.direction+" ]"}};Pointable.Invalid={valid:false}},{"gl-matrix":19}],12:[function(require,module,exports){var Frame=require("./frame");var Event=function(data){this.type=data.type;this.state=data.state};var chooseProtocol=exports.chooseProtocol=function(header){var protocol;switch(header.version){case 1:protocol=JSONProtocol(1,function(data){return new Frame(data)});break;case 2:protocol=JSONProtocol(2,function(data){return new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;case 3:protocol=JSONProtocol(3,function(data){return data.event?new Event(data.event):new Frame(data)});protocol.sendHeartbeat=function(connection){connection.send(protocol.encode({heartbeat:true}))};break;default:throw"unrecognized version"}return protocol};var JSONProtocol=function(version,cb){var protocol=cb;protocol.encode=function(message){return JSON.stringify(message)};protocol.version=version;protocol.versionLong="Version "+version;protocol.type="protocol";return protocol}},{"./frame":5}],13:[function(require,module,exports){exports.UI={Region:require("./ui/region"),Cursor:require("./ui/cursor")}},{"./ui/cursor":14,"./ui/region":15}],14:[function(require,module,exports){var Cursor=module.exports=function(){return function(frame){var pointable=frame.pointables.sort(function(a,b){return a.z-b.z})[0];if(pointable&&pointable.valid){frame.cursorPosition=pointable.tipPosition}return frame}}},{}],15:[function(require,module,exports){var EventEmitter=require("events").EventEmitter,_=require("underscore");var Region=module.exports=function(start,end){this.start=new Vector(start);this.end=new Vector(end);this.enteredFrame=null};Region.prototype.hasPointables=function(frame){for(var i=0;i!=frame.pointables.length;i++){var position=frame.pointables[i].tipPosition;if(position.x>=this.start.x&&position.x<=this.end.x&&position.y>=this.start.y&&position.y<=this.end.y&&position.z>=this.start.z&&position.z<=this.end.z){return true}}return false};Region.prototype.listener=function(opts){var region=this;if(opts&&opts.nearThreshold)this.setupNearRegion(opts.nearThreshold);return function(frame){return region.updatePosition(frame)}};Region.prototype.clipper=function(){var region=this;return function(frame){region.updatePosition(frame);return region.enteredFrame?frame:null}};Region.prototype.setupNearRegion=function(distance){var nearRegion=this.nearRegion=new Region([this.start.x-distance,this.start.y-distance,this.start.z-distance],[this.end.x+distance,this.end.y+distance,this.end.z+distance]);var region=this;nearRegion.on("enter",function(frame){region.emit("near",frame)});nearRegion.on("exit",function(frame){region.emit("far",frame)});region.on("exit",function(frame){region.emit("near",frame)})};Region.prototype.updatePosition=function(frame){if(this.nearRegion)this.nearRegion.updatePosition(frame);if(this.hasPointables(frame)&&this.enteredFrame==null){this.enteredFrame=frame;this.emit("enter",this.enteredFrame)}else if(!this.hasPointables(frame)&&this.enteredFrame!=null){this.enteredFrame=null;this.emit("exit",this.enteredFrame)}return frame};Region.prototype.normalize=function(position){return new Vector([(position.x-this.start.x)/(this.end.x-this.start.x),(position.y-this.start.y)/(this.end.y-this.start.y),(position.z-this.start.z)/(this.end.z-this.start.z)])};Region.prototype.mapToXY=function(position,width,height){var normalized=this.normalize(position);var x=normalized.x,y=normalized.y;if(x>1)x=1;else if(x<-1)x=-1;if(y>1)y=1;else if(y<-1)y=-1;return[(x+1)/2*width,(1-y)/2*height,normalized.z]};_.extend(Region.prototype,EventEmitter.prototype)},{events:17,underscore:20}],16:[function(require,module,exports){},{}],17:[function(require,module,exports){!function(process){if(!process.EventEmitter)process.EventEmitter=function(){};var EventEmitter=exports.EventEmitter=process.EventEmitter;var isArray=typeof Array.isArray==="function"?Array.isArray:function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function indexOf(xs,x){if(xs.indexOf)return xs.indexOf(x);for(var i=0;i<xs.length;i++){if(x===xs[i])return i}return-1}var defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!this._events)this._events={};this._events.maxListeners=n};EventEmitter.prototype.emit=function(type){if(type==="error"){if(!this._events||!this._events.error||isArray(this._events.error)&&!this._events.error.length){if(arguments[1]instanceof Error){throw arguments[1]}else{throw new Error("Uncaught, unspecified 'error' event.")}return false}}if(!this._events)return false;var handler=this._events[type];if(!handler)return false;if(typeof handler=="function"){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:var args=Array.prototype.slice.call(arguments,1);handler.apply(this,args)}return true}else if(isArray(handler)){var args=Array.prototype.slice.call(arguments,1);var listeners=handler.slice();for(var i=0,l=listeners.length;i<l;i++){listeners[i].apply(this,args)}return true}else{return false}};EventEmitter.prototype.addListener=function(type,listener){if("function"!==typeof listener){throw new Error("addListener only takes instances of Function")}if(!this._events)this._events={};this.emit("newListener",type,listener);if(!this._events[type]){this._events[type]=listener}else if(isArray(this._events[type])){if(!this._events[type].warned){var m;if(this._events.maxListeners!==undefined){m=this._events.maxListeners}else{m=defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);console.trace()}}this._events[type].push(listener)}else{this._events[type]=[this._events[type],listener]}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){var self=this;self.on(type,function g(){self.removeListener(type,g);listener.apply(this,arguments)});return this};EventEmitter.prototype.removeListener=function(type,listener){if("function"!==typeof listener){throw new Error("removeListener only takes instances of Function")}if(!this._events||!this._events[type])return this;var list=this._events[type];if(isArray(list)){var i=indexOf(list,listener);if(i<0)return this;list.splice(i,1);if(list.length==0)delete this._events[type]}else if(this._events[type]===listener){delete this._events[type]}return this};EventEmitter.prototype.removeAllListeners=function(type){if(arguments.length===0){this._events={};return this}if(type&&this._events&&this._events[type])this._events[type]=null;return this};EventEmitter.prototype.listeners=function(type){if(!this._events)this._events={};if(!this._events[type])this._events[type]=[];if(!isArray(this._events[type])){this._events[type]=[this._events[type]]}return this._events[type]}}(require("__browserify_process"))},{__browserify_process:18}],18:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){if(ev.source===window&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],19:[function(require,module,exports){!function(){!function(){"use strict";var shim={};if(typeof exports==="undefined"){if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){shim.exports={};define(function(){return shim.exports})}else{shim.exports=window}}else{shim.exports=exports}!function(exports){var vec2={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec2.create=function(){return new Float32Array(2)};vec2.clone=function(a){var out=new Float32Array(2);out[0]=a[0];out[1]=a[1];return out};vec2.fromValues=function(x,y){var out=new Float32Array(2);out[0]=x;out[1]=y;return out};vec2.copy=function(out,a){out[0]=a[0];out[1]=a[1];return out};vec2.set=function(out,x,y){out[0]=x;out[1]=y;return out};vec2.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];return out};vec2.sub=vec2.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];return out};vec2.mul=vec2.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];return out};vec2.div=vec2.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];return out};vec2.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);
-out[1]=Math.min(a[1],b[1]);return out};vec2.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);return out};vec2.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;return out};vec2.dist=vec2.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return Math.sqrt(x*x+y*y)};vec2.sqrDist=vec2.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return x*x+y*y};vec2.len=vec2.length=function(a){var x=a[0],y=a[1];return Math.sqrt(x*x+y*y)};vec2.sqrLen=vec2.squaredLength=function(a){var x=a[0],y=a[1];return x*x+y*y};vec2.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];return out};vec2.normalize=function(out,a){var x=a[0],y=a[1];var len=x*x+y*y;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len}return out};vec2.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]};vec2.cross=function(out,a,b){var z=a[0]*b[1]-a[1]*b[0];out[0]=out[1]=0;out[2]=z;return out};vec2.lerp=function(out,a,b,t){var ax=a[0],ay=a[1];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);return out};vec2.transformMat2=function(out,a,m){var x=a[0],y=a[1];out[0]=x*m[0]+y*m[1];out[1]=x*m[2]+y*m[3];return out};vec2.forEach=function(){var vec=new Float32Array(2);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=2}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1]}return a}}();vec2.str=function(a){return"vec2("+a[0]+", "+a[1]+")"};if(typeof exports!=="undefined"){exports.vec2=vec2}var vec3={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec3.create=function(){return new Float32Array(3)};vec3.clone=function(a){var out=new Float32Array(3);out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.fromValues=function(x,y,z){var out=new Float32Array(3);out[0]=x;out[1]=y;out[2]=z;return out};vec3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.set=function(out,x,y,z){out[0]=x;out[1]=y;out[2]=z;return out};vec3.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];return out};vec3.sub=vec3.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];return out};vec3.mul=vec3.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];return out};vec3.div=vec3.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];return out};vec3.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);return out};vec3.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);return out};vec3.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;return out};vec3.dist=vec3.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrDist=vec3.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return x*x+y*y+z*z};vec3.len=vec3.length=function(a){var x=a[0],y=a[1],z=a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrLen=vec3.squaredLength=function(a){var x=a[0],y=a[1],z=a[2];return x*x+y*y+z*z};vec3.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];return out};vec3.normalize=function(out,a){var x=a[0],y=a[1],z=a[2];var len=x*x+y*y+z*z;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len}return out};vec3.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]};vec3.cross=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2];out[0]=ay*bz-az*by;out[1]=az*bx-ax*bz;out[2]=ax*by-ay*bx;return out};vec3.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);return out};vec3.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12];out[1]=m[1]*x+m[5]*y+m[9]*z+m[13];out[2]=m[2]*x+m[6]*y+m[10]*z+m[14];return out};vec3.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec3.forEach=function(){var vec=new Float32Array(3);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=3}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2]}return a}}();vec3.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};if(typeof exports!=="undefined"){exports.vec3=vec3}var vec4={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec4.create=function(){return new Float32Array(4)};vec4.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.fromValues=function(x,y,z,w){var out=new Float32Array(4);out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.set=function(out,x,y,z,w){out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];out[3]=a[3]+b[3];return out};vec4.sub=vec4.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];out[3]=a[3]-b[3];return out};vec4.mul=vec4.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];out[3]=a[3]*b[3];return out};vec4.div=vec4.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];out[3]=a[3]/b[3];return out};vec4.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);out[3]=Math.min(a[3],b[3]);return out};vec4.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);out[3]=Math.max(a[3],b[3]);return out};vec4.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;out[3]=a[3]*b;return out};vec4.dist=vec4.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrDist=vec4.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return x*x+y*y+z*z+w*w};vec4.len=vec4.length=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrLen=vec4.squaredLength=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return x*x+y*y+z*z+w*w};vec4.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=-a[3];return out};vec4.normalize=function(out,a){var x=a[0],y=a[1],z=a[2],w=a[3];var len=x*x+y*y+z*z+w*w;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;out[3]=a[3]*len}return out};vec4.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]};vec4.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);out[3]=aw+t*(b[3]-aw);return out};vec4.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2],w=a[3];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12]*w;out[1]=m[1]*x+m[5]*y+m[9]*z+m[13]*w;out[2]=m[2]*x+m[6]*y+m[10]*z+m[14]*w;out[3]=m[3]*x+m[7]*y+m[11]*z+m[15]*w;return out};vec4.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec4.forEach=function(){var vec=new Float32Array(4);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=4}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];vec[3]=a[i+3];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2];a[i+3]=vec[3]}return a}}();vec4.str=function(a){return"vec4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.vec4=vec4}var mat2={};var mat2Identity=new Float32Array([1,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat2.create=function(){return new Float32Array(mat2Identity)};mat2.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=1;return out};mat2.transpose=function(out,a){if(out===a){var a1=a[1];out[1]=a[2];out[2]=a1}else{out[0]=a[0];out[1]=a[2];out[2]=a[1];out[3]=a[3]}return out};mat2.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],det=a0*a3-a2*a1;if(!det){return null}det=1/det;out[0]=a3*det;out[1]=-a1*det;out[2]=-a2*det;out[3]=a0*det;return out};mat2.adjoint=function(out,a){var a0=a[0];out[0]=a[3];out[1]=-a[1];out[2]=-a[2];out[3]=a0;return out};mat2.determinant=function(a){return a[0]*a[3]-a[2]*a[1]};mat2.mul=mat2.multiply=function(out,a,b){var a0=a[0],a1=a[1],a2=a[2],a3=a[3];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=a0*b0+a1*b2;out[1]=a0*b1+a1*b3;out[2]=a2*b0+a3*b2;out[3]=a2*b1+a3*b3;return out};mat2.rotate=function(out,a,rad){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],s=Math.sin(rad),c=Math.cos(rad);out[0]=a0*c+a1*s;out[1]=a0*-s+a1*c;out[2]=a2*c+a3*s;out[3]=a2*-s+a3*c;return out};mat2.scale=function(out,a,v){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],v0=v[0],v1=v[1];out[0]=a0*v0;out[1]=a1*v1;out[2]=a2*v0;out[3]=a3*v1;return out};mat2.str=function(a){return"mat2("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.mat2=mat2}var mat3={};var mat3Identity=new Float32Array([1,0,0,0,1,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat3.create=function(){return new Float32Array(mat3Identity)};mat3.clone=function(a){var out=new Float32Array(9);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=1;out[5]=0;out[6]=0;out[7]=0;out[8]=1;return out};mat3.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a12=a[5];out[1]=a[3];out[2]=a[6];out[3]=a01;out[5]=a[7];out[6]=a02;out[7]=a12}else{out[0]=a[0];out[1]=a[3];out[2]=a[6];out[3]=a[1];out[4]=a[4];out[5]=a[7];out[6]=a[2];out[7]=a[5];out[8]=a[8]}return out};mat3.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b01=a22*a11-a12*a21,b11=-a22*a10+a12*a20,b21=a21*a10-a11*a20,det=a00*b01+a01*b11+a02*b21;if(!det){return null}det=1/det;out[0]=b01*det;out[1]=(-a22*a01+a02*a21)*det;out[2]=(a12*a01-a02*a11)*det;out[3]=b11*det;out[4]=(a22*a00-a02*a20)*det;out[5]=(-a12*a00+a02*a10)*det;out[6]=b21*det;out[7]=(-a21*a00+a01*a20)*det;out[8]=(a11*a00-a01*a10)*det;return out};mat3.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];out[0]=a11*a22-a12*a21;out[1]=a02*a21-a01*a22;out[2]=a01*a12-a02*a11;out[3]=a12*a20-a10*a22;out[4]=a00*a22-a02*a20;out[5]=a02*a10-a00*a12;out[6]=a10*a21-a11*a20;out[7]=a01*a20-a00*a21;out[8]=a00*a11-a01*a10;return out};mat3.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];return a00*(a22*a11-a12*a21)+a01*(-a22*a10+a12*a20)+a02*(a21*a10-a11*a20)};mat3.mul=mat3.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b00=b[0],b01=b[1],b02=b[2],b10=b[3],b11=b[4],b12=b[5],b20=b[6],b21=b[7],b22=b[8];out[0]=b00*a00+b01*a10+b02*a20;out[1]=b00*a01+b01*a11+b02*a21;out[2]=b00*a02+b01*a12+b02*a22;out[3]=b10*a00+b11*a10+b12*a20;out[4]=b10*a01+b11*a11+b12*a21;out[5]=b10*a02+b11*a12+b12*a22;out[6]=b20*a00+b21*a10+b22*a20;out[7]=b20*a01+b21*a11+b22*a21;out[8]=b20*a02+b21*a12+b22*a22;return out};mat3.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"};if(typeof exports!=="undefined"){exports.mat3=mat3}var mat4={};var mat4Identity=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat4.create=function(){return new Float32Array(mat4Identity)};mat4.clone=function(a){var out=new Float32Array(16);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=1;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=1;out[11]=0;out[12]=0;out[13]=0;out[14]=0;out[15]=1;return out};mat4.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a03=a[3],a12=a[6],a13=a[7],a23=a[11];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a01;out[6]=a[9];out[7]=a[13];out[8]=a02;out[9]=a12;out[11]=a[14];out[12]=a03;out[13]=a13;out[14]=a23}else{out[0]=a[0];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a[1];out[5]=a[5];out[6]=a[9];out[7]=a[13];out[8]=a[2];out[9]=a[6];out[10]=a[10];out[11]=a[14];out[12]=a[3];out[13]=a[7];out[14]=a[11];out[15]=a[15]}return out};mat4.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32,det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(!det){return null}det=1/det;out[0]=(a11*b11-a12*b10+a13*b09)*det;out[1]=(a02*b10-a01*b11-a03*b09)*det;out[2]=(a31*b05-a32*b04+a33*b03)*det;out[3]=(a22*b04-a21*b05-a23*b03)*det;out[4]=(a12*b08-a10*b11-a13*b07)*det;out[5]=(a00*b11-a02*b08+a03*b07)*det;out[6]=(a32*b02-a30*b05-a33*b01)*det;out[7]=(a20*b05-a22*b02+a23*b01)*det;out[8]=(a10*b10-a11*b08+a13*b06)*det;out[9]=(a01*b08-a00*b10-a03*b06)*det;out[10]=(a30*b04-a31*b02+a33*b00)*det;out[11]=(a21*b02-a20*b04-a23*b00)*det;out[12]=(a11*b07-a10*b09-a12*b06)*det;out[13]=(a00*b09-a01*b07+a02*b06)*det;out[14]=(a31*b01-a30*b03-a32*b00)*det;out[15]=(a20*b03-a21*b01+a22*b00)*det;return out};mat4.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];out[0]=a11*(a22*a33-a23*a32)-a21*(a12*a33-a13*a32)+a31*(a12*a23-a13*a22);out[1]=-(a01*(a22*a33-a23*a32)-a21*(a02*a33-a03*a32)+a31*(a02*a23-a03*a22));out[2]=a01*(a12*a33-a13*a32)-a11*(a02*a33-a03*a32)+a31*(a02*a13-a03*a12);out[3]=-(a01*(a12*a23-a13*a22)-a11*(a02*a23-a03*a22)+a21*(a02*a13-a03*a12));out[4]=-(a10*(a22*a33-a23*a32)-a20*(a12*a33-a13*a32)+a30*(a12*a23-a13*a22));out[5]=a00*(a22*a33-a23*a32)-a20*(a02*a33-a03*a32)+a30*(a02*a23-a03*a22);out[6]=-(a00*(a12*a33-a13*a32)-a10*(a02*a33-a03*a32)+a30*(a02*a13-a03*a12));out[7]=a00*(a12*a23-a13*a22)-a10*(a02*a23-a03*a22)+a20*(a02*a13-a03*a12);out[8]=a10*(a21*a33-a23*a31)-a20*(a11*a33-a13*a31)+a30*(a11*a23-a13*a21);out[9]=-(a00*(a21*a33-a23*a31)-a20*(a01*a33-a03*a31)+a30*(a01*a23-a03*a21));out[10]=a00*(a11*a33-a13*a31)-a10*(a01*a33-a03*a31)+a30*(a01*a13-a03*a11);out[11]=-(a00*(a11*a23-a13*a21)-a10*(a01*a23-a03*a21)+a20*(a01*a13-a03*a11));out[12]=-(a10*(a21*a32-a22*a31)-a20*(a11*a32-a12*a31)+a30*(a11*a22-a12*a21));out[13]=a00*(a21*a32-a22*a31)-a20*(a01*a32-a02*a31)+a30*(a01*a22-a02*a21);out[14]=-(a00*(a11*a32-a12*a31)-a10*(a01*a32-a02*a31)+a30*(a01*a12-a02*a11));out[15]=a00*(a11*a22-a12*a21)-a10*(a01*a22-a02*a21)+a20*(a01*a12-a02*a11);return out};mat4.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32;return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06};mat4.mul=mat4.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=b0*a00+b1*a10+b2*a20+b3*a30;out[1]=b0*a01+b1*a11+b2*a21+b3*a31;out[2]=b0*a02+b1*a12+b2*a22+b3*a32;out[3]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[4];b1=b[5];b2=b[6];b3=b[7];out[4]=b0*a00+b1*a10+b2*a20+b3*a30;out[5]=b0*a01+b1*a11+b2*a21+b3*a31;out[6]=b0*a02+b1*a12+b2*a22+b3*a32;out[7]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[8];b1=b[9];b2=b[10];b3=b[11];out[8]=b0*a00+b1*a10+b2*a20+b3*a30;out[9]=b0*a01+b1*a11+b2*a21+b3*a31;out[10]=b0*a02+b1*a12+b2*a22+b3*a32;out[11]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[12];b1=b[13];b2=b[14];b3=b[15];out[12]=b0*a00+b1*a10+b2*a20+b3*a30;out[13]=b0*a01+b1*a11+b2*a21+b3*a31;out[14]=b0*a02+b1*a12+b2*a22+b3*a32;out[15]=b0*a03+b1*a13+b2*a23+b3*a33;return out};mat4.translate=function(out,a,v){var x=v[0],y=v[1],z=v[2],a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;if(a===out){out[12]=a[0]*x+a[4]*y+a[8]*z+a[12];out[13]=a[1]*x+a[5]*y+a[9]*z+a[13];out[14]=a[2]*x+a[6]*y+a[10]*z+a[14];out[15]=a[3]*x+a[7]*y+a[11]*z+a[15]}else{a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a03;out[4]=a10;out[5]=a11;out[6]=a12;out[7]=a13;out[8]=a20;out[9]=a21;out[10]=a22;out[11]=a23;out[12]=a00*x+a10*y+a20*z+a[12];out[13]=a01*x+a11*y+a21*z+a[13];out[14]=a02*x+a12*y+a22*z+a[14];out[15]=a03*x+a13*y+a23*z+a[15]}return out};mat4.scale=function(out,a,v){var x=v[0],y=v[1],z=v[2];out[0]=a[0]*x;out[1]=a[1]*x;out[2]=a[2]*x;out[3]=a[3]*x;out[4]=a[4]*y;out[5]=a[5]*y;out[6]=a[6]*y;out[7]=a[7]*y;out[8]=a[8]*z;out[9]=a[9]*z;out[10]=a[10]*z;out[11]=a[11]*z;out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.rotate=function(out,a,rad,axis){var x=axis[0],y=axis[1],z=axis[2],len=Math.sqrt(x*x+y*y+z*z),s,c,t,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,b00,b01,b02,b10,b11,b12,b20,b21,b22;if(Math.abs(len)<GLMAT_EPSILON){return null}len=1/len;x*=len;y*=len;z*=len;s=Math.sin(rad);c=Math.cos(rad);t=1-c;a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];b00=x*x*t+c;b01=y*x*t+z*s;b02=z*x*t-y*s;b10=x*y*t-z*s;b11=y*y*t+c;b12=z*y*t+x*s;b20=x*z*t+y*s;b21=y*z*t-x*s;b22=z*z*t+c;out[0]=a00*b00+a10*b01+a20*b02;out[1]=a01*b00+a11*b01+a21*b02;out[2]=a02*b00+a12*b01+a22*b02;out[3]=a03*b00+a13*b01+a23*b02;out[4]=a00*b10+a10*b11+a20*b12;out[5]=a01*b10+a11*b11+a21*b12;out[6]=a02*b10+a12*b11+a22*b12;out[7]=a03*b10+a13*b11+a23*b12;out[8]=a00*b20+a10*b21+a20*b22;out[9]=a01*b20+a11*b21+a21*b22;out[10]=a02*b20+a12*b21+a22*b22;out[11]=a03*b20+a13*b21+a23*b22;if(a!==out){out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}return out};mat4.rotateX=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[4]=a10*c+a20*s;out[5]=a11*c+a21*s;out[6]=a12*c+a22*s;out[7]=a13*c+a23*s;out[8]=a20*c-a10*s;out[9]=a21*c-a11*s;out[10]=a22*c-a12*s;out[11]=a23*c-a13*s;return out};mat4.rotateY=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c-a20*s;out[1]=a01*c-a21*s;out[2]=a02*c-a22*s;out[3]=a03*c-a23*s;out[8]=a00*s+a20*c;out[9]=a01*s+a21*c;out[10]=a02*s+a22*c;out[11]=a03*s+a23*c;return out};mat4.rotateZ=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7];if(a!==out){out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c+a10*s;out[1]=a01*c+a11*s;out[2]=a02*c+a12*s;out[3]=a03*c+a13*s;out[4]=a10*c-a00*s;out[5]=a11*c-a01*s;out[6]=a12*c-a02*s;out[7]=a13*c-a03*s;return out};mat4.fromRotationTranslation=function(out,q,v){var x=q[0],y=q[1],z=q[2],w=q[3],x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;out[0]=1-(yy+zz);out[1]=xy+wz;out[2]=xz-wy;out[3]=0;out[4]=xy-wz;out[5]=1-(xx+zz);out[6]=yz+wx;out[7]=0;out[8]=xz+wy;out[9]=yz-wx;out[10]=1-(xx+yy);out[11]=0;out[12]=v[0];out[13]=v[1];out[14]=v[2];out[15]=1;return out};mat4.frustum=function(out,left,right,bottom,top,near,far){var rl=1/(right-left),tb=1/(top-bottom),nf=1/(near-far);out[0]=near*2*rl;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=near*2*tb;out[6]=0;out[7]=0;out[8]=(right+left)*rl;out[9]=(top+bottom)*tb;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=far*near*2*nf;out[15]=0;return out};mat4.perspective=function(out,fovy,aspect,near,far){var f=1/Math.tan(fovy/2),nf=1/(near-far);out[0]=f/aspect;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=f;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=2*far*near*nf;out[15]=0;return out};mat4.ortho=function(out,left,right,bottom,top,near,far){var lr=1/(left-right),bt=1/(bottom-top),nf=1/(near-far);out[0]=-2*lr;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=-2*bt;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=2*nf;out[11]=0;out[12]=(left+right)*lr;out[13]=(top+bottom)*bt;out[14]=(far+near)*nf;out[15]=1;return out};mat4.lookAt=function(out,eye,center,up){var x0,x1,x2,y0,y1,y2,z0,z1,z2,len,eyex=eye[0],eyey=eye[1],eyez=eye[2],upx=up[0],upy=up[1],upz=up[2],centerx=center[0],centery=center[1],centerz=center[2];if(Math.abs(eyex-centerx)<GLMAT_EPSILON&&Math.abs(eyey-centery)<GLMAT_EPSILON&&Math.abs(eyez-centerz)<GLMAT_EPSILON){return mat4.identity(out)}z0=eyex-centerx;z1=eyey-centery;z2=eyez-centerz;len=1/Math.sqrt(z0*z0+z1*z1+z2*z2);z0*=len;z1*=len;z2*=len;x0=upy*z2-upz*z1;x1=upz*z0-upx*z2;x2=upx*z1-upy*z0;len=Math.sqrt(x0*x0+x1*x1+x2*x2);if(!len){x0=0;x1=0;x2=0}else{len=1/len;x0*=len;x1*=len;x2*=len}y0=z1*x2-z2*x1;y1=z2*x0-z0*x2;y2=z0*x1-z1*x0;len=Math.sqrt(y0*y0+y1*y1+y2*y2);if(!len){y0=0;y1=0;y2=0}else{len=1/len;y0*=len;y1*=len;y2*=len}out[0]=x0;out[1]=y0;out[2]=z0;out[3]=0;out[4]=x1;out[5]=y1;out[6]=z1;out[7]=0;out[8]=x2;out[9]=y2;out[10]=z2;out[11]=0;out[12]=-(x0*eyex+x1*eyey+x2*eyez);out[13]=-(y0*eyex+y1*eyey+y2*eyez);out[14]=-(z0*eyex+z1*eyey+z2*eyez);out[15]=1;return out};mat4.str=function(a){return"mat4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+")"};if(typeof exports!=="undefined"){exports.mat4=mat4}var quat={};var quatIdentity=new Float32Array([0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}quat.create=function(){return new Float32Array(quatIdentity)};quat.clone=vec4.clone;quat.fromValues=vec4.fromValues;quat.copy=vec4.copy;quat.set=vec4.set;quat.identity=function(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out};quat.setAxisAngle=function(out,axis,rad){rad=rad*.5;var s=Math.sin(rad);out[0]=s*axis[0];out[1]=s*axis[1];out[2]=s*axis[2];out[3]=Math.cos(rad);return out};quat.add=vec4.add;quat.mul=quat.multiply=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=b[3];out[0]=ax*bw+aw*bx+ay*bz-az*by;out[1]=ay*bw+aw*by+az*bx-ax*bz;out[2]=az*bw+aw*bz+ax*by-ay*bx;out[3]=aw*bw-ax*bx-ay*by-az*bz;return out};quat.scale=vec4.scale;quat.rotateX=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+aw*bx;out[1]=ay*bw+az*bx;out[2]=az*bw-ay*bx;out[3]=aw*bw-ax*bx;return out};quat.rotateY=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],by=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw-az*by;out[1]=ay*bw+aw*by;out[2]=az*bw+ax*by;out[3]=aw*bw-ay*by;return out};quat.rotateZ=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bz=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+ay*bz;out[1]=ay*bw-ax*bz;out[2]=az*bw+aw*bz;out[3]=aw*bw-az*bz;return out};quat.calculateW=function(out,a){var x=a[0],y=a[1],z=a[2];out[0]=x;out[1]=y;out[2]=z;out[3]=-Math.sqrt(Math.abs(1-x*x-y*y-z*z));return out};quat.dot=vec4.dot;quat.lerp=vec4.lerp;quat.slerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=a[3];var cosHalfTheta=ax*bx+ay*by+az*bz+aw*bw,halfTheta,sinHalfTheta,ratioA,ratioB;if(Math.abs(cosHalfTheta)>=1){if(out!==a){out[0]=ax;out[1]=ay;out[2]=az;out[3]=aw}return out}halfTheta=Math.acos(cosHalfTheta);sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001){out[0]=ax*.5+bx*.5;out[1]=ay*.5+by*.5;out[2]=az*.5+bz*.5;out[3]=aw*.5+bw*.5;return out}ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta;ratioB=Math.sin(t*halfTheta)/sinHalfTheta;out[0]=ax*ratioA+bx*ratioB;out[1]=ay*ratioA+by*ratioB;out[2]=az*ratioA+bz*ratioB;out[3]=aw*ratioA+bw*ratioB;return out};quat.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],dot=a0*a0+a1*a1+a2*a2+a3*a3,invDot=dot?1/dot:0;out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out};quat.conjugate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out};quat.len=quat.length=vec4.length;quat.sqrLen=quat.squaredLength=vec4.squaredLength;quat.normalize=vec4.normalize;quat.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.quat=quat}}(shim.exports)}()}()},{}],20:[function(require,module,exports){!function(){!function(){var root=this;var previousUnderscore=root._;var breaker={};var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var push=ArrayProto.push,slice=ArrayProto.slice,concat=ArrayProto.concat,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeForEach=ArrayProto.forEach,nativeMap=ArrayProto.map,nativeReduce=ArrayProto.reduce,nativeReduceRight=ArrayProto.reduceRight,nativeFilter=ArrayProto.filter,nativeEvery=ArrayProto.every,nativeSome=ArrayProto.some,nativeIndexOf=ArrayProto.indexOf,nativeLastIndexOf=ArrayProto.lastIndexOf,nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){if(obj instanceof _)return obj;if(!(this instanceof _))return new _(obj);this._wrapped=obj};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=_}exports._=_}else{root._=_}_.VERSION="1.4.4";var each=_.each=_.forEach=function(obj,iterator,context){if(obj==null)return;if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i<l;i++){if(iterator.call(context,obj[i],i,obj)===breaker)return}}else{for(var key in obj){if(_.has(obj,key)){if(iterator.call(context,obj[key],key,obj)===breaker)return}}}};_.map=_.collect=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeMap&&obj.map===nativeMap)return obj.map(iterator,context);each(obj,function(value,index,list){results[results.length]=iterator.call(context,value,index,list)});return results};var reduceError="Reduce of empty array with no initial value";_.reduce=_.foldl=_.inject=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduce&&obj.reduce===nativeReduce){if(context)iterator=_.bind(iterator,context);return initial?obj.reduce(iterator,memo):obj.reduce(iterator)}each(obj,function(value,index,list){if(!initial){memo=value;initial=true}else{memo=iterator.call(context,memo,value,index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.reduceRight=_.foldr=function(obj,iterator,memo,context){var initial=arguments.length>2;if(obj==null)obj=[];if(nativeReduceRight&&obj.reduceRight===nativeReduceRight){if(context)iterator=_.bind(iterator,context);return initial?obj.reduceRight(iterator,memo):obj.reduceRight(iterator)}var length=obj.length;if(length!==+length){var keys=_.keys(obj);length=keys.length}each(obj,function(value,index,list){index=keys?keys[--length]:--length;if(!initial){memo=obj[index];initial=true}else{memo=iterator.call(context,memo,obj[index],index,list)}});if(!initial)throw new TypeError(reduceError);return memo};_.find=_.detect=function(obj,iterator,context){var result;any(obj,function(value,index,list){if(iterator.call(context,value,index,list)){result=value;return true}});return result};_.filter=_.select=function(obj,iterator,context){var results=[];if(obj==null)return results;if(nativeFilter&&obj.filter===nativeFilter)return obj.filter(iterator,context);each(obj,function(value,index,list){if(iterator.call(context,value,index,list))results[results.length]=value});return results};_.reject=function(obj,iterator,context){return _.filter(obj,function(value,index,list){return!iterator.call(context,value,index,list)},context)};_.every=_.all=function(obj,iterator,context){iterator||(iterator=_.identity);var result=true;if(obj==null)return result;if(nativeEvery&&obj.every===nativeEvery)return obj.every(iterator,context);each(obj,function(value,index,list){if(!(result=result&&iterator.call(context,value,index,list)))return breaker});return!!result};var any=_.some=_.any=function(obj,iterator,context){iterator||(iterator=_.identity);var result=false;if(obj==null)return result;if(nativeSome&&obj.some===nativeSome)return obj.some(iterator,context);each(obj,function(value,index,list){if(result||(result=iterator.call(context,value,index,list)))return breaker});return!!result};_.contains=_.include=function(obj,target){if(obj==null)return false;if(nativeIndexOf&&obj.indexOf===nativeIndexOf)return obj.indexOf(target)!=-1;return any(obj,function(value){return value===target})};_.invoke=function(obj,method){var args=slice.call(arguments,2);var isFunc=_.isFunction(method);return _.map(obj,function(value){return(isFunc?method:value[method]).apply(value,args)})};_.pluck=function(obj,key){return _.map(obj,function(value){return value[key]})};_.where=function(obj,attrs,first){if(_.isEmpty(attrs))return first?null:[];return _[first?"find":"filter"](obj,function(value){for(var key in attrs){if(attrs[key]!==value[key])return false}return true})};_.findWhere=function(obj,attrs){return _.where(obj,attrs,true)};_.max=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.max.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return-Infinity;var result={computed:-Infinity,value:-Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed>=result.computed&&(result={value:value,computed:computed})});return result.value};_.min=function(obj,iterator,context){if(!iterator&&_.isArray(obj)&&obj[0]===+obj[0]&&obj.length<65535){return Math.min.apply(Math,obj)}if(!iterator&&_.isEmpty(obj))return Infinity;var result={computed:Infinity,value:Infinity};each(obj,function(value,index,list){var computed=iterator?iterator.call(context,value,index,list):value;computed<result.computed&&(result={value:value,computed:computed})});return result.value};_.shuffle=function(obj){var rand;var index=0;var shuffled=[];each(obj,function(value){rand=_.random(index++);shuffled[index-1]=shuffled[rand];shuffled[rand]=value});return shuffled};var lookupIterator=function(value){return _.isFunction(value)?value:function(obj){return obj[value]}};_.sortBy=function(obj,value,context){var iterator=lookupIterator(value);return _.pluck(_.map(obj,function(value,index,list){return{value:value,index:index,criteria:iterator.call(context,value,index,list)}}).sort(function(left,right){var a=left.criteria;
-var b=right.criteria;if(a!==b){if(a>b||a===void 0)return 1;if(a<b||b===void 0)return-1}return left.index<right.index?-1:1}),"value")};var group=function(obj,value,context,behavior){var result={};var iterator=lookupIterator(value||_.identity);each(obj,function(value,index){var key=iterator.call(context,value,index,obj);behavior(result,key,value)});return result};_.groupBy=function(obj,value,context){return group(obj,value,context,function(result,key,value){(_.has(result,key)?result[key]:result[key]=[]).push(value)})};_.countBy=function(obj,value,context){return group(obj,value,context,function(result,key){if(!_.has(result,key))result[key]=0;result[key]++})};_.sortedIndex=function(array,obj,iterator,context){iterator=iterator==null?_.identity:lookupIterator(iterator);var value=iterator.call(context,obj);var low=0,high=array.length;while(low<high){var mid=low+high>>>1;iterator.call(context,array[mid])<value?low=mid+1:high=mid}return low};_.toArray=function(obj){if(!obj)return[];if(_.isArray(obj))return slice.call(obj);if(obj.length===+obj.length)return _.map(obj,_.identity);return _.values(obj)};_.size=function(obj){if(obj==null)return 0;return obj.length===+obj.length?obj.length:_.keys(obj).length};_.first=_.head=_.take=function(array,n,guard){if(array==null)return void 0;return n!=null&&!guard?slice.call(array,0,n):array[0]};_.initial=function(array,n,guard){return slice.call(array,0,array.length-(n==null||guard?1:n))};_.last=function(array,n,guard){if(array==null)return void 0;if(n!=null&&!guard){return slice.call(array,Math.max(array.length-n,0))}else{return array[array.length-1]}};_.rest=_.tail=_.drop=function(array,n,guard){return slice.call(array,n==null||guard?1:n)};_.compact=function(array){return _.filter(array,_.identity)};var flatten=function(input,shallow,output){each(input,function(value){if(_.isArray(value)){shallow?push.apply(output,value):flatten(value,shallow,output)}else{output.push(value)}});return output};_.flatten=function(array,shallow){return flatten(array,shallow,[])};_.without=function(array){return _.difference(array,slice.call(arguments,1))};_.uniq=_.unique=function(array,isSorted,iterator,context){if(_.isFunction(isSorted)){context=iterator;iterator=isSorted;isSorted=false}var initial=iterator?_.map(array,iterator,context):array;var results=[];var seen=[];each(initial,function(value,index){if(isSorted?!index||seen[seen.length-1]!==value:!_.contains(seen,value)){seen.push(value);results.push(array[index])}});return results};_.union=function(){return _.uniq(concat.apply(ArrayProto,arguments))};_.intersection=function(array){var rest=slice.call(arguments,1);return _.filter(_.uniq(array),function(item){return _.every(rest,function(other){return _.indexOf(other,item)>=0})})};_.difference=function(array){var rest=concat.apply(ArrayProto,slice.call(arguments,1));return _.filter(array,function(value){return!_.contains(rest,value)})};_.zip=function(){var args=slice.call(arguments);var length=_.max(_.pluck(args,"length"));var results=new Array(length);for(var i=0;i<length;i++){results[i]=_.pluck(args,""+i)}return results};_.object=function(list,values){if(list==null)return{};var result={};for(var i=0,l=list.length;i<l;i++){if(values){result[list[i]]=values[i]}else{result[list[i][0]]=list[i][1]}}return result};_.indexOf=function(array,item,isSorted){if(array==null)return-1;var i=0,l=array.length;if(isSorted){if(typeof isSorted=="number"){i=isSorted<0?Math.max(0,l+isSorted):isSorted}else{i=_.sortedIndex(array,item);return array[i]===item?i:-1}}if(nativeIndexOf&&array.indexOf===nativeIndexOf)return array.indexOf(item,isSorted);for(;i<l;i++)if(array[i]===item)return i;return-1};_.lastIndexOf=function(array,item,from){if(array==null)return-1;var hasIndex=from!=null;if(nativeLastIndexOf&&array.lastIndexOf===nativeLastIndexOf){return hasIndex?array.lastIndexOf(item,from):array.lastIndexOf(item)}var i=hasIndex?from:array.length;while(i--)if(array[i]===item)return i;return-1};_.range=function(start,stop,step){if(arguments.length<=1){stop=start||0;start=0}step=arguments[2]||1;var len=Math.max(Math.ceil((stop-start)/step),0);var idx=0;var range=new Array(len);while(idx<len){range[idx++]=start;start+=step}return range};_.bind=function(func,context){if(func.bind===nativeBind&&nativeBind)return nativeBind.apply(func,slice.call(arguments,1));var args=slice.call(arguments,2);return function(){return func.apply(context,args.concat(slice.call(arguments)))}};_.partial=function(func){var args=slice.call(arguments,1);return function(){return func.apply(this,args.concat(slice.call(arguments)))}};_.bindAll=function(obj){var funcs=slice.call(arguments,1);if(funcs.length===0)funcs=_.functions(obj);each(funcs,function(f){obj[f]=_.bind(obj[f],obj)});return obj};_.memoize=function(func,hasher){var memo={};hasher||(hasher=_.identity);return function(){var key=hasher.apply(this,arguments);return _.has(memo,key)?memo[key]:memo[key]=func.apply(this,arguments)}};_.delay=function(func,wait){var args=slice.call(arguments,2);return setTimeout(function(){return func.apply(null,args)},wait)};_.defer=function(func){return _.delay.apply(_,[func,1].concat(slice.call(arguments,1)))};_.throttle=function(func,wait){var context,args,timeout,result;var previous=0;var later=function(){previous=new Date;timeout=null;result=func.apply(context,args)};return function(){var now=new Date;var remaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0){clearTimeout(timeout);timeout=null;previous=now;result=func.apply(context,args)}else if(!timeout){timeout=setTimeout(later,remaining)}return result}};_.debounce=function(func,wait,immediate){var timeout,result;return function(){var context=this,args=arguments;var later=function(){timeout=null;if(!immediate)result=func.apply(context,args)};var callNow=immediate&&!timeout;clearTimeout(timeout);timeout=setTimeout(later,wait);if(callNow)result=func.apply(context,args);return result}};_.once=function(func){var ran=false,memo;return function(){if(ran)return memo;ran=true;memo=func.apply(this,arguments);func=null;return memo}};_.wrap=function(func,wrapper){return function(){var args=[func];push.apply(args,arguments);return wrapper.apply(this,args)}};_.compose=function(){var funcs=arguments;return function(){var args=arguments;for(var i=funcs.length-1;i>=0;i--){args=[funcs[i].apply(this,args)]}return args[0]}};_.after=function(times,func){if(times<=0)return func();return function(){if(--times<1){return func.apply(this,arguments)}}};_.keys=nativeKeys||function(obj){if(obj!==Object(obj))throw new TypeError("Invalid object");var keys=[];for(var key in obj)if(_.has(obj,key))keys[keys.length]=key;return keys};_.values=function(obj){var values=[];for(var key in obj)if(_.has(obj,key))values.push(obj[key]);return values};_.pairs=function(obj){var pairs=[];for(var key in obj)if(_.has(obj,key))pairs.push([key,obj[key]]);return pairs};_.invert=function(obj){var result={};for(var key in obj)if(_.has(obj,key))result[obj[key]]=key;return result};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key)}return names.sort()};_.extend=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){obj[prop]=source[prop]}}});return obj};_.pick=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));each(keys,function(key){if(key in obj)copy[key]=obj[key]});return copy};_.omit=function(obj){var copy={};var keys=concat.apply(ArrayProto,slice.call(arguments,1));for(var key in obj){if(!_.contains(keys,key))copy[key]=obj[key]}return copy};_.defaults=function(obj){each(slice.call(arguments,1),function(source){if(source){for(var prop in source){if(obj[prop]==null)obj[prop]=source[prop]}}});return obj};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj)};_.tap=function(obj,interceptor){interceptor(obj);return obj};var eq=function(a,b,aStack,bStack){if(a===b)return a!==0||1/a==1/b;if(a==null||b==null)return a===b;if(a instanceof _)a=a._wrapped;if(b instanceof _)b=b._wrapped;var className=toString.call(a);if(className!=toString.call(b))return false;switch(className){case"[object String]":return a==String(b);case"[object Number]":return a!=+a?b!=+b:a==0?1/a==1/b:a==+b;case"[object Date]":case"[object Boolean]":return+a==+b;case"[object RegExp]":return a.source==b.source&&a.global==b.global&&a.multiline==b.multiline&&a.ignoreCase==b.ignoreCase}if(typeof a!="object"||typeof b!="object")return false;var length=aStack.length;while(length--){if(aStack[length]==a)return bStack[length]==b}aStack.push(a);bStack.push(b);var size=0,result=true;if(className=="[object Array]"){size=a.length;result=size==b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack)))break}}}else{var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(_.isFunction(aCtor)&&aCtor instanceof aCtor&&_.isFunction(bCtor)&&bCtor instanceof bCtor)){return false}for(var key in a){if(_.has(a,key)){size++;if(!(result=_.has(b,key)&&eq(a[key],b[key],aStack,bStack)))break}}if(result){for(key in b){if(_.has(b,key)&&!size--)break}result=!size}}aStack.pop();bStack.pop();return result};_.isEqual=function(a,b){return eq(a,b,[],[])};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true};_.isElement=function(obj){return!!(obj&&obj.nodeType===1)};_.isArray=nativeIsArray||function(obj){return toString.call(obj)=="[object Array]"};_.isObject=function(obj){return obj===Object(obj)};each(["Arguments","Function","String","Number","Date","RegExp"],function(name){_["is"+name]=function(obj){return toString.call(obj)=="[object "+name+"]"}});if(!_.isArguments(arguments)){_.isArguments=function(obj){return!!(obj&&_.has(obj,"callee"))}}if(typeof/./!=="function"){_.isFunction=function(obj){return typeof obj==="function"}}_.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj))};_.isNaN=function(obj){return _.isNumber(obj)&&obj!=+obj};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)=="[object Boolean]"};_.isNull=function(obj){return obj===null};_.isUndefined=function(obj){return obj===void 0};_.has=function(obj,key){return hasOwnProperty.call(obj,key)};_.noConflict=function(){root._=previousUnderscore;return this};_.identity=function(value){return value};_.times=function(n,iterator,context){var accum=Array(n);for(var i=0;i<n;i++)accum[i]=iterator.call(context,i);return accum};_.random=function(min,max){if(max==null){max=min;min=0}return min+Math.floor(Math.random()*(max-min+1))};var entityMap={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};entityMap.unescape=_.invert(entityMap.escape);var entityRegexes={escape:new RegExp("["+_.keys(entityMap.escape).join("")+"]","g"),unescape:new RegExp("("+_.keys(entityMap.unescape).join("|")+")","g")};_.each(["escape","unescape"],function(method){_[method]=function(string){if(string==null)return"";return(""+string).replace(entityRegexes[method],function(match){return entityMap[method][match]})}});_.result=function(object,property){if(object==null)return null;var value=object[property];return _.isFunction(value)?value.call(object):value};_.mixin=function(obj){each(_.functions(obj),function(name){var func=_[name]=obj[name];_.prototype[name]=function(){var args=[this._wrapped];push.apply(args,arguments);return result.call(this,func.apply(_,args))}})};var idCounter=0;_.uniqueId=function(prefix){var id=++idCounter+"";return prefix?prefix+id:id};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/(.)^/;var escapes={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"};var escaper=/\\|'|\r|\n|\t|\u2028|\u2029/g;_.template=function(text,data,settings){var render;settings=_.defaults({},settings,_.templateSettings);var matcher=new RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join("|")+"|$","g");var index=0;var source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,function(match){return"\\"+escapes[match]});if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'"}if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'"}if(evaluate){source+="';\n"+evaluate+"\n__p+='"}index=offset+match.length;return match});source+="';\n";if(!settings.variable)source="with(obj||{}){\n"+source+"}\n";source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+"return __p;\n";try{render=new Function(settings.variable||"obj","_",source)}catch(e){e.source=source;throw e}if(data)return render(data,_);var template=function(data){return render.call(this,data,_)};template.source="function("+(settings.variable||"obj")+"){\n"+source+"}";return template};_.chain=function(obj){return _(obj).chain()};var result=function(obj){return this._chain?_(obj).chain():obj};_.mixin(_);each(["pop","push","reverse","shift","sort","splice","unshift"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){var obj=this._wrapped;method.apply(obj,arguments);if((name=="shift"||name=="splice")&&obj.length===0)delete obj[0];return result.call(this,obj)}});each(["concat","join","slice"],function(name){var method=ArrayProto[name];_.prototype[name]=function(){return result.call(this,method.apply(this._wrapped,arguments))}});_.extend(_.prototype,{chain:function(){this._chain=true;return this},value:function(){return this._wrapped}})}.call(this)}()},{}],21:[function(require,module,exports){window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){window.setTimeout(callback,1e3/60)}}();Leap=require("../lib/index")},{"../lib/index":8}]},{},[21]);
-
-/*
- * Leap Motion integration for Reveal.js.
- * James Sun  [sun16]
- * Rory Hardy [gneatgeek]
- */
-
-(function () {
-  var body        = document.body,
-      controller  = new Leap.Controller({ enableGestures: true }),
-      lastGesture = 0,
-      leapConfig  = Reveal.getConfig().leap,
-      pointer     = document.createElement( 'div' ),
-      config      = {
-        autoCenter       : true,      // Center pointer around detected position.
-        gestureDelay     : 500,       // How long to delay between gestures.
-        naturalSwipe     : true,      // Swipe as if it were a touch screen.
-        pointerColor     : '#00aaff', // Default color of the pointer.
-        pointerOpacity   : 0.7,       // Default opacity of the pointer.
-        pointerSize      : 15,        // Default minimum height/width of the pointer.
-        pointerTolerance : 120        // Bigger = slower pointer.
-      },
-      entered, enteredPosition, now, size, tipPosition; // Other vars we need later, but don't need to redeclare.
-
-      // Merge user defined settings with defaults
-      if( leapConfig ) {
-        for( key in leapConfig ) {
-          config[key] = leapConfig[key];
-        }
-      }
-
-      pointer.id = 'leap';
-
-      pointer.style.position        = 'absolute';
-      pointer.style.visibility      = 'hidden';
-      pointer.style.zIndex          = 50;
-      pointer.style.opacity         = config.pointerOpacity;
-      pointer.style.backgroundColor = config.pointerColor;
-
-      body.appendChild( pointer );
-
-  // Leap's loop
-  controller.on( 'frame', function ( frame ) {
-    // Timing code to rate limit gesture execution
-    now = new Date().getTime();
-
-    // Pointer: 1 to 2 fingers. Strictly one finger works but may cause innaccuracies.
-    // The innaccuracies were observed on a development model and may not be an issue with consumer models.
-    if( frame.fingers.length > 0 && frame.fingers.length < 3 ) {
-      // Invert direction and multiply by 3 for greater effect.
-      size = -3 * frame.fingers[0].tipPosition[2];
-
-      if( size < config.pointerSize ) {
-        size = config.pointerSize;
-      }
-
-      pointer.style.width        = size     + 'px';
-      pointer.style.height       = size     + 'px';
-      pointer.style.borderRadius = size - 5 + 'px';
-      pointer.style.visibility   = 'visible';
-
-      if( config.autoCenter ) {
-        tipPosition = frame.fingers[0].tipPosition;
-
-        // Check whether the finger has entered the z range of the Leap Motion. Used for the autoCenter option.
-        if( !entered ) {
-          entered         = true;
-          enteredPosition = frame.fingers[0].tipPosition;
-        }
-
-        pointer.style.top =
-          (-1 * (( tipPosition[1] - enteredPosition[1] ) * body.offsetHeight / config.pointerTolerance )) +
-            ( body.offsetHeight / 2 ) + 'px';
-
-        pointer.style.left =
-          (( tipPosition[0] - enteredPosition[0] ) * body.offsetWidth / config.pointerTolerance ) +
-            ( body.offsetWidth / 2 ) + 'px';
-      }
-      else {
-        pointer.style.top  = ( 1 - (( tipPosition[1] - 50) / config.pointerTolerance )) *
-          body.offsetHeight + 'px';
-
-        pointer.style.left = ( tipPosition[0] * body.offsetWidth / config.pointerTolerance ) +
-          ( body.offsetWidth / 2 ) + 'px';
-      }
-    }
-    else {
-      // Hide pointer on exit
-      entered                  = false;
-      pointer.style.visibility = 'hidden';
-    }
-
-    // Gestures
-    if( frame.gestures.length > 0 && (now - lastGesture) > config.gestureDelay ) {
-      var gesture = frame.gestures[0];
-
-      // One hand gestures
-      if( frame.hands.length === 1 ) {
-        // Swipe gestures. 3+ fingers.
-        if( frame.fingers.length > 2 && gesture.type === 'swipe' ) {
-          // Define here since some gestures will throw undefined for these.
-          var x = gesture.direction[0],
-              y = gesture.direction[1];
-
-          // Left/right swipe gestures
-          if( Math.abs( x ) > Math.abs( y )) {
-            if( x > 0 ) {
-              config.naturalSwipe ? Reveal.left() : Reveal.right();
-            }
-            else {
-              config.naturalSwipe ? Reveal.right() : Reveal.left();
-            }
-          }
-          // Up/down swipe gestures
-          else {
-            if( y > 0 ) {
-              config.naturalSwipe ? Reveal.down() : Reveal.up();
-            }
-            else {
-              config.naturalSwipe ? Reveal.up() : Reveal.down();
-            }
-          }
-
-          lastGesture = now;
-        }
-      }
-      // Two hand gestures
-      else if( frame.hands.length === 2 ) {
-        // Upward two hand swipe gesture
-        if( gesture.direction[1] > 0 && gesture.type === 'swipe' ) {
-          Reveal.toggleOverview();
-        }
-
-        lastGesture = now;
-      }
-    }
-  });
-
-  controller.connect();
-})();
diff --git a/docs/slides/plpv14/reveal.js/plugin/markdown/markdown.js b/docs/slides/plpv14/reveal.js/plugin/markdown/markdown.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/markdown/markdown.js
+++ /dev/null
@@ -1,392 +0,0 @@
-/**
- * The reveal.js markdown plugin. Handles parsing of
- * markdown inside of presentations as well as loading
- * of external markdown documents.
- */
-(function( root, factory ) {
-	if( typeof exports === 'object' ) {
-		module.exports = factory( require( './marked' ) );
-	}
-	else {
-		// Browser globals (root is window)
-		root.RevealMarkdown = factory( root.marked );
-		root.RevealMarkdown.initialize();
-	}
-}( this, function( marked ) {
-
-	if( typeof marked === 'undefined' ) {
-		throw 'The reveal.js Markdown plugin requires marked to be loaded';
-	}
-
-	if( typeof hljs !== 'undefined' ) {
-		marked.setOptions({
-			highlight: function( lang, code ) {
-				return hljs.highlightAuto( lang, code ).value;
-			}
-		});
-	}
-
-	var DEFAULT_SLIDE_SEPARATOR = '^\n---\n$',
-		DEFAULT_NOTES_SEPARATOR = 'note:',
-		DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '\\\.element\\\s*?(.+?)$',
-		DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '\\\.slide:\\\s*?(\\\S.+?)$';
-
-
-	/**
-	 * Retrieves the markdown contents of a slide section
-	 * element. Normalizes leading tabs/whitespace.
-	 */
-	function getMarkdownFromSlide( section ) {
-
-		var template = section.querySelector( 'script' );
-
-		// strip leading whitespace so it isn't evaluated as code
-		var text = ( template || section ).textContent;
-
-		var leadingWs = text.match( /^\n?(\s*)/ )[1].length,
-			leadingTabs = text.match( /^\n?(\t*)/ )[1].length;
-
-		if( leadingTabs > 0 ) {
-			text = text.replace( new RegExp('\\n?\\t{' + leadingTabs + '}','g'), '\n' );
-		}
-		else if( leadingWs > 1 ) {
-			text = text.replace( new RegExp('\\n? {' + leadingWs + '}','g'), '\n' );
-		}
-
-		return text;
-
-	}
-
-	/**
-	 * Given a markdown slide section element, this will
-	 * return all arguments that aren't related to markdown
-	 * parsing. Used to forward any other user-defined arguments
-	 * to the output markdown slide.
-	 */
-	function getForwardedAttributes( section ) {
-
-		var attributes = section.attributes;
-		var result = [];
-
-		for( var i = 0, len = attributes.length; i < len; i++ ) {
-			var name = attributes[i].name,
-				value = attributes[i].value;
-
-			// disregard attributes that are used for markdown loading/parsing
-			if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue;
-
-			if( value ) {
-				result.push( name + '=' + value );
-			}
-			else {
-				result.push( name );
-			}
-		}
-
-		return result.join( ' ' );
-
-	}
-
-	/**
-	 * Inspects the given options and fills out default
-	 * values for what's not defined.
-	 */
-	function getSlidifyOptions( options ) {
-
-		options = options || {};
-		options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR;
-		options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR;
-		options.attributes = options.attributes || '';
-
-		return options;
-
-	}
-
-	/**
-	 * Helper function for constructing a markdown slide.
-	 */
-	function createMarkdownSlide( content, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) );
-
-		if( notesMatch.length === 2 ) {
-			content = notesMatch[0] + '<aside class="notes" data-markdown>' + notesMatch[1].trim() + '</aside>';
-		}
-
-		return '<script type="text/template">' + content + '</script>';
-
-	}
-
-	/**
-	 * Parses a data string into multiple slides based
-	 * on the passed in separator arguments.
-	 */
-	function slidify( markdown, options ) {
-
-		options = getSlidifyOptions( options );
-
-		var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ),
-			horizontalSeparatorRegex = new RegExp( options.separator );
-
-		var matches,
-			lastIndex = 0,
-			isHorizontal,
-			wasHorizontal = true,
-			content,
-			sectionStack = [];
-
-		// iterate until all blocks between separators are stacked up
-		while( matches = separatorRegex.exec( markdown ) ) {
-			notes = null;
-
-			// determine direction (horizontal by default)
-			isHorizontal = horizontalSeparatorRegex.test( matches[0] );
-
-			if( !isHorizontal && wasHorizontal ) {
-				// create vertical stack
-				sectionStack.push( [] );
-			}
-
-			// pluck slide content from markdown input
-			content = markdown.substring( lastIndex, matches.index );
-
-			if( isHorizontal && wasHorizontal ) {
-				// add to horizontal stack
-				sectionStack.push( content );
-			}
-			else {
-				// add to vertical stack
-				sectionStack[sectionStack.length-1].push( content );
-			}
-
-			lastIndex = separatorRegex.lastIndex;
-			wasHorizontal = isHorizontal;
-		}
-
-		// add the remaining slide
-		( wasHorizontal ? sectionStack : sectionStack[sectionStack.length-1] ).push( markdown.substring( lastIndex ) );
-
-		var markdownSections = '';
-
-		// flatten the hierarchical stack, and insert <section data-markdown> tags
-		for( var i = 0, len = sectionStack.length; i < len; i++ ) {
-			// vertical
-			if( sectionStack[i] instanceof Array ) {
-				markdownSections += '<section '+ options.attributes +'>';
-
-				sectionStack[i].forEach( function( child ) {
-					markdownSections += '<section data-markdown>' +  createMarkdownSlide( child, options ) + '</section>';
-				} );
-
-				markdownSections += '</section>';
-			}
-			else {
-				markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>';
-			}
-		}
-
-		return markdownSections;
-
-	}
-
-	/**
-	 * Parses any current data-markdown slides, splits
-	 * multi-slide markdown into separate sections and
-	 * handles loading of external markdown.
-	 */
-	function processSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]'),
-			section;
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			section = sections[i];
-
-			if( section.getAttribute( 'data-markdown' ).length ) {
-
-				var xhr = new XMLHttpRequest(),
-					url = section.getAttribute( 'data-markdown' );
-
-				datacharset = section.getAttribute( 'data-charset' );
-
-				// see https://developer.mozilla.org/en-US/docs/Web/API/element.getAttribute#Notes
-				if( datacharset != null && datacharset != '' ) {
-					xhr.overrideMimeType( 'text/html; charset=' + datacharset );
-				}
-
-				xhr.onreadystatechange = function() {
-					if( xhr.readyState === 4 ) {
-						if ( xhr.status >= 200 && xhr.status < 300 ) {
-
-							section.outerHTML = slidify( xhr.responseText, {
-								separator: section.getAttribute( 'data-separator' ),
-								verticalSeparator: section.getAttribute( 'data-vertical' ),
-								notesSeparator: section.getAttribute( 'data-notes' ),
-								attributes: getForwardedAttributes( section )
-							});
-
-						}
-						else {
-
-							section.outerHTML = '<section data-state="alert">' +
-								'ERROR: The attempt to fetch ' + url + ' failed with HTTP status ' + xhr.status + '.' +
-								'Check your browser\'s JavaScript console for more details.' +
-								'<p>Remember that you need to serve the presentation HTML from a HTTP server.</p>' +
-								'</section>';
-
-						}
-					}
-				};
-
-				xhr.open( 'GET', url, false );
-
-				try {
-					xhr.send();
-				}
-				catch ( e ) {
-					alert( 'Failed to get the Markdown file ' + url + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + e );
-				}
-
-			}
-			else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-vertical' ) || section.getAttribute( 'data-notes' ) ) {
-
-				section.outerHTML = slidify( getMarkdownFromSlide( section ), {
-					separator: section.getAttribute( 'data-separator' ),
-					verticalSeparator: section.getAttribute( 'data-vertical' ),
-					notesSeparator: section.getAttribute( 'data-notes' ),
-					attributes: getForwardedAttributes( section )
-				});
-
-			}
-			else {
-				section.innerHTML = createMarkdownSlide( getMarkdownFromSlide( section ) );
-			}
-		}
-
-	}
-
-	/**
-	 * Check if a node value has the attributes pattern.
-	 * If yes, extract it and add that value as one or several attributes
-	 * the the terget element.
-	 *
-	 * You need Cache Killer on Chrome to see the effect on any FOM transformation
-	 * directly on refresh (F5)
-	 * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277
-	 */
-	function addAttributeInElement( node, elementTarget, separator ) {
-
-		var mardownClassesInElementsRegex = new RegExp( separator, 'mg' );
-		var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' );
-		var nodeValue = node.nodeValue;
-		if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) {
-
-			var classes = matches[1];
-			nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex );
-			node.nodeValue = nodeValue;
-			while( matchesClass = mardownClassRegex.exec( classes ) ) {
-				elementTarget.setAttribute( matchesClass[1], matchesClass[2] );
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Add attributes to the parent element of a text node,
-	 * or the element of an attribute node.
-	 */
-	function addAttributes( section, element, previousElement, separatorElementAttributes, separatorSectionAttributes ) {
-
-		if ( element != null && element.childNodes != undefined && element.childNodes.length > 0 ) {
-			previousParentElement = element;
-			for( var i = 0; i < element.childNodes.length; i++ ) {
-				childElement = element.childNodes[i];
-				if ( i > 0 ) {
-					j = i - 1;
-					while ( j >= 0 ) {
-						aPreviousChildElement = element.childNodes[j];
-						if ( typeof aPreviousChildElement.setAttribute == 'function' && aPreviousChildElement.tagName != "BR" ) {
-							previousParentElement = aPreviousChildElement;
-							break;
-						}
-						j = j - 1;
-					}
-				}
-				parentSection = section;
-				if( childElement.nodeName ==  "section" ) {
-					parentSection = childElement ;
-					previousParentElement = childElement ;
-				}
-				if ( typeof childElement.setAttribute == 'function' || childElement.nodeType == Node.COMMENT_NODE ) {
-					addAttributes( parentSection, childElement, previousParentElement, separatorElementAttributes, separatorSectionAttributes );
-				}
-			}
-		}
-
-		if ( element.nodeType == Node.COMMENT_NODE ) {
-			if ( addAttributeInElement( element, previousElement, separatorElementAttributes ) == false ) {
-				addAttributeInElement( element, section, separatorSectionAttributes );
-			}
-		}
-	}
-
-	/**
-	 * Converts any current data-markdown slides in the
-	 * DOM to HTML.
-	 */
-	function convertSlides() {
-
-		var sections = document.querySelectorAll( '[data-markdown]');
-
-		for( var i = 0, len = sections.length; i < len; i++ ) {
-
-			var section = sections[i];
-
-			// Only parse the same slide once
-			if( !section.getAttribute( 'data-markdown-parsed' ) ) {
-
-				section.setAttribute( 'data-markdown-parsed', true )
-
-				var notes = section.querySelector( 'aside.notes' );
-				var markdown = getMarkdownFromSlide( section );
-
-				section.innerHTML = marked( markdown );
-				addAttributes( 	section, section, null, section.getAttribute( 'data-element-attributes' ) ||
-								section.parentNode.getAttribute( 'data-element-attributes' ) ||
-								DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR,
-								section.getAttribute( 'data-attributes' ) ||
-								section.parentNode.getAttribute( 'data-attributes' ) ||
-								DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR);
-
-				// If there were notes, we need to re-add them after
-				// having overwritten the section's HTML
-				if( notes ) {
-					section.appendChild( notes );
-				}
-
-			}
-
-		}
-
-	}
-
-	// API
-	return {
-
-		initialize: function() {
-			processSlides();
-			convertSlides();
-		},
-
-		// TODO: Do these belong in the API?
-		processSlides: processSlides,
-		convertSlides: convertSlides,
-		slidify: slidify
-
-	};
-
-}));
diff --git a/docs/slides/plpv14/reveal.js/plugin/markdown/marked.js b/docs/slides/plpv14/reveal.js/plugin/markdown/marked.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/markdown/marked.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * marked - a markdown parser
- * Copyright (c) 2011-2013, Christopher Jeffrey. (MIT Licensed)
- * https://github.com/chjj/marked
- */
-
-(function(){var block={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:noop,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:noop,lheading:/^([^\n]+)\n *(=|-){3,} *\n*/,blockquote:/^( *>[^\n]+(\n[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:noop,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
-text:/^[^\n]+/};block.bullet=/(?:[*+-]|\d+\.)/;block.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;block.item=replace(block.item,"gm")(/bull/g,block.bullet)();block.list=replace(block.list)(/bull/g,block.bullet)("hr",/\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();block._tag="(?!(?:"+"a|em|strong|small|s|cite|q|dfn|abbr|data|time|code"+"|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo"+"|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";block.html=replace(block.html)("comment",/\x3c!--[\s\S]*?--\x3e/)("closed",
-/<(tag)[\s\S]+?<\/\1>/)("closing",/<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)(/tag/g,block._tag)();block.paragraph=replace(block.paragraph)("hr",block.hr)("heading",block.heading)("lheading",block.lheading)("blockquote",block.blockquote)("tag","<"+block._tag)("def",block.def)();block.normal=merge({},block);block.gfm=merge({},block.normal,{fences:/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,paragraph:/^/});block.gfm.paragraph=replace(block.paragraph)("(?!","(?!"+block.gfm.fences.source.replace("\\1",
-"\\2")+"|")();block.tables=merge({},block.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/});function Lexer(options){this.tokens=[];this.tokens.links={};this.options=options||marked.defaults;this.rules=block.normal;if(this.options.gfm)if(this.options.tables)this.rules=block.tables;else this.rules=block.gfm}Lexer.rules=block;Lexer.lex=function(src,options){var lexer=new Lexer(options);return lexer.lex(src)};
-Lexer.prototype.lex=function(src){src=src.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n");return this.token(src,true)};Lexer.prototype.token=function(src,top){var src=src.replace(/^ +$/gm,""),next,loose,cap,bull,b,item,space,i,l;while(src){if(cap=this.rules.newline.exec(src)){src=src.substring(cap[0].length);if(cap[0].length>1)this.tokens.push({type:"space"})}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);cap=cap[0].replace(/^ {4}/gm,
-"");this.tokens.push({type:"code",text:!this.options.pedantic?cap.replace(/\n+$/,""):cap});continue}if(cap=this.rules.fences.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"code",lang:cap[2],text:cap[3]});continue}if(cap=this.rules.heading.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[1].length,text:cap[2]});continue}if(top&&(cap=this.rules.nptable.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,
-"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]="center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].split(/ *\| */);this.tokens.push(item);continue}if(cap=this.rules.lheading.exec(src)){src=
-src.substring(cap[0].length);this.tokens.push({type:"heading",depth:cap[2]==="="?1:2,text:cap[1]});continue}if(cap=this.rules.hr.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"hr"});continue}if(cap=this.rules.blockquote.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"blockquote_start"});cap=cap[0].replace(/^ *> ?/gm,"");this.token(cap,top);this.tokens.push({type:"blockquote_end"});continue}if(cap=this.rules.list.exec(src)){src=src.substring(cap[0].length);
-bull=cap[2];this.tokens.push({type:"list_start",ordered:bull.length>1});cap=cap[0].match(this.rules.item);next=false;l=cap.length;i=0;for(;i<l;i++){item=cap[i];space=item.length;item=item.replace(/^ *([*+-]|\d+\.) +/,"");if(~item.indexOf("\n ")){space-=item.length;item=!this.options.pedantic?item.replace(new RegExp("^ {1,"+space+"}","gm"),""):item.replace(/^ {1,4}/gm,"")}if(this.options.smartLists&&i!==l-1){b=block.bullet.exec(cap[i+1])[0];if(bull!==b&&!(bull.length>1&&b.length>1)){src=cap.slice(i+
-1).join("\n")+src;i=l-1}}loose=next||/\n\n(?!\s*$)/.test(item);if(i!==l-1){next=item[item.length-1]==="\n";if(!loose)loose=next}this.tokens.push({type:loose?"loose_item_start":"list_item_start"});this.token(item,false);this.tokens.push({type:"list_item_end"})}this.tokens.push({type:"list_end"});continue}if(cap=this.rules.html.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:cap[1]==="pre"||cap[1]==="script",text:cap[0]});continue}if(top&&
-(cap=this.rules.def.exec(src))){src=src.substring(cap[0].length);this.tokens.links[cap[1].toLowerCase()]={href:cap[2],title:cap[3]};continue}if(top&&(cap=this.rules.table.exec(src))){src=src.substring(cap[0].length);item={type:"table",header:cap[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:cap[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:cap[3].replace(/(?: *\| *)?\n$/,"").split("\n")};for(i=0;i<item.align.length;i++)if(/^ *-+: *$/.test(item.align[i]))item.align[i]="right";else if(/^ *:-+: *$/.test(item.align[i]))item.align[i]=
-"center";else if(/^ *:-+ *$/.test(item.align[i]))item.align[i]="left";else item.align[i]=null;for(i=0;i<item.cells.length;i++)item.cells[i]=item.cells[i].replace(/^ *\| *| *\| *$/g,"").split(/ *\| */);this.tokens.push(item);continue}if(top&&(cap=this.rules.paragraph.exec(src))){src=src.substring(cap[0].length);this.tokens.push({type:"paragraph",text:cap[1][cap[1].length-1]==="\n"?cap[1].slice(0,-1):cap[1]});continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);this.tokens.push({type:"text",
-text:cap[0]});continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return this.tokens};var inline={escape:/^\\([\\`*{}\[\]()#+\-.!_>])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:noop,tag:/^\x3c!--[\s\S]*?--\x3e|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
-code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:noop,text:/^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/};inline._inside=/(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;inline._href=/\s*<?([^\s]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;inline.link=replace(inline.link)("inside",inline._inside)("href",inline._href)();inline.reflink=replace(inline.reflink)("inside",inline._inside)();inline.normal=merge({},inline);inline.pedantic=merge({},inline.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
-em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/});inline.gfm=merge({},inline.normal,{escape:replace(inline.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:replace(inline.text)("]|","~]|")("|","|https?://|")()});inline.breaks=merge({},inline.gfm,{br:replace(inline.br)("{2,}","*")(),text:replace(inline.gfm.text)("{2,}","*")()});function InlineLexer(links,options){this.options=options||marked.defaults;this.links=links;this.rules=inline.normal;
-if(!this.links)throw new Error("Tokens array requires a `links` property.");if(this.options.gfm)if(this.options.breaks)this.rules=inline.breaks;else this.rules=inline.gfm;else if(this.options.pedantic)this.rules=inline.pedantic}InlineLexer.rules=inline;InlineLexer.output=function(src,links,options){var inline=new InlineLexer(links,options);return inline.output(src)};InlineLexer.prototype.output=function(src){var out="",link,text,href,cap;while(src){if(cap=this.rules.escape.exec(src)){src=src.substring(cap[0].length);
-out+=cap[1];continue}if(cap=this.rules.autolink.exec(src)){src=src.substring(cap[0].length);if(cap[2]==="@"){text=cap[1][6]===":"?this.mangle(cap[1].substring(7)):this.mangle(cap[1]);href=this.mangle("mailto:")+text}else{text=escape(cap[1]);href=text}out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.url.exec(src)){src=src.substring(cap[0].length);text=escape(cap[1]);href=text;out+='<a href="'+href+'">'+text+"</a>";continue}if(cap=this.rules.tag.exec(src)){src=src.substring(cap[0].length);
-out+=this.options.sanitize?escape(cap[0]):cap[0];continue}if(cap=this.rules.link.exec(src)){src=src.substring(cap[0].length);out+=this.outputLink(cap,{href:cap[2],title:cap[3]});continue}if((cap=this.rules.reflink.exec(src))||(cap=this.rules.nolink.exec(src))){src=src.substring(cap[0].length);link=(cap[2]||cap[1]).replace(/\s+/g," ");link=this.links[link.toLowerCase()];if(!link||!link.href){out+=cap[0][0];src=cap[0].substring(1)+src;continue}out+=this.outputLink(cap,link);continue}if(cap=this.rules.strong.exec(src)){src=
-src.substring(cap[0].length);out+="<strong>"+this.output(cap[2]||cap[1])+"</strong>";continue}if(cap=this.rules.em.exec(src)){src=src.substring(cap[0].length);out+="<em>"+this.output(cap[2]||cap[1])+"</em>";continue}if(cap=this.rules.code.exec(src)){src=src.substring(cap[0].length);out+="<code>"+escape(cap[2],true)+"</code>";continue}if(cap=this.rules.br.exec(src)){src=src.substring(cap[0].length);out+="<br>";continue}if(cap=this.rules.del.exec(src)){src=src.substring(cap[0].length);out+="<del>"+
-this.output(cap[1])+"</del>";continue}if(cap=this.rules.text.exec(src)){src=src.substring(cap[0].length);out+=escape(cap[0]);continue}if(src)throw new Error("Infinite loop on byte: "+src.charCodeAt(0));}return out};InlineLexer.prototype.outputLink=function(cap,link){if(cap[0][0]!=="!")return'<a href="'+escape(link.href)+'"'+(link.title?' title="'+escape(link.title)+'"':"")+">"+this.output(cap[1])+"</a>";else return'<img src="'+escape(link.href)+'" alt="'+escape(cap[1])+'"'+(link.title?' title="'+
-escape(link.title)+'"':"")+">"};InlineLexer.prototype.smartypants=function(text){if(!this.options.smartypants)return text;return text.replace(/--/g,"\u2014").replace(/'([^']*)'/g,"\u2018$1\u2019").replace(/"([^"]*)"/g,"\u201c$1\u201d").replace(/\.{3}/g,"\u2026")};InlineLexer.prototype.mangle=function(text){var out="",l=text.length,i=0,ch;for(;i<l;i++){ch=text.charCodeAt(i);if(Math.random()>0.5)ch="x"+ch.toString(16);out+="&#"+ch+";"}return out};function Parser(options){this.tokens=[];this.token=null;
-this.options=options||marked.defaults}Parser.parse=function(src,options){var parser=new Parser(options);return parser.parse(src)};Parser.prototype.parse=function(src){this.inline=new InlineLexer(src.links,this.options);this.tokens=src.reverse();var out="";while(this.next())out+=this.tok();return out};Parser.prototype.next=function(){return this.token=this.tokens.pop()};Parser.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0};Parser.prototype.parseText=function(){var body=this.token.text;
-while(this.peek().type==="text")body+="\n"+this.next().text;return this.inline.output(body)};Parser.prototype.tok=function(){switch(this.token.type){case "space":return"";case "hr":return"<hr>\n";case "heading":return"<h"+this.token.depth+">"+this.inline.output(this.token.text)+"</h"+this.token.depth+">\n";case "code":if(this.options.highlight){var code=this.options.highlight(this.token.text,this.token.lang);if(code!=null&&code!==this.token.text){this.token.escaped=true;this.token.text=code}}if(!this.token.escaped)this.token.text=
-escape(this.token.text,true);return"<pre><code"+(this.token.lang?' class="'+this.options.langPrefix+this.token.lang+'"':"")+">"+this.token.text+"</code></pre>\n";case "table":var body="",heading,i,row,cell,j;body+="<thead>\n<tr>\n";for(i=0;i<this.token.header.length;i++){heading=this.inline.output(this.token.header[i]);body+=this.token.align[i]?'<th align="'+this.token.align[i]+'">'+heading+"</th>\n":"<th>"+heading+"</th>\n"}body+="</tr>\n</thead>\n";body+="<tbody>\n";for(i=0;i<this.token.cells.length;i++){row=
-this.token.cells[i];body+="<tr>\n";for(j=0;j<row.length;j++){cell=this.inline.output(row[j]);body+=this.token.align[j]?'<td align="'+this.token.align[j]+'">'+cell+"</td>\n":"<td>"+cell+"</td>\n"}body+="</tr>\n"}body+="</tbody>\n";return"<table>\n"+body+"</table>\n";case "blockquote_start":var body="";while(this.next().type!=="blockquote_end")body+=this.tok();return"<blockquote>\n"+body+"</blockquote>\n";case "list_start":var type=this.token.ordered?"ol":"ul",body="";while(this.next().type!=="list_end")body+=
-this.tok();return"<"+type+">\n"+body+"</"+type+">\n";case "list_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.token.type==="text"?this.parseText():this.tok();return"<li>"+body+"</li>\n";case "loose_item_start":var body="";while(this.next().type!=="list_item_end")body+=this.tok();return"<li>"+body+"</li>\n";case "html":return!this.token.pre&&!this.options.pedantic?this.inline.output(this.token.text):this.token.text;case "paragraph":return"<p>"+this.inline.output(this.token.text)+
-"</p>\n";case "text":return"<p>"+this.parseText()+"</p>\n"}};function escape(html,encode){return html.replace(!encode?/&(?!#?\w+;)/g:/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function replace(regex,opt){regex=regex.source;opt=opt||"";return function self(name,val){if(!name)return new RegExp(regex,opt);val=val.source||val;val=val.replace(/(^|[^\[])\^/g,"$1");regex=regex.replace(name,val);return self}}function noop(){}noop.exec=noop;function merge(obj){var i=
-1,target,key;for(;i<arguments.length;i++){target=arguments[i];for(key in target)if(Object.prototype.hasOwnProperty.call(target,key))obj[key]=target[key]}return obj}function marked(src,opt,callback){if(callback||typeof opt==="function"){if(!callback){callback=opt;opt=null}if(opt)opt=merge({},marked.defaults,opt);var tokens=Lexer.lex(tokens,opt),highlight=opt.highlight,pending=0,l=tokens.length,i=0;if(!highlight||highlight.length<3)return callback(null,Parser.parse(tokens,opt));var done=function(){delete opt.highlight;
-var out=Parser.parse(tokens,opt);opt.highlight=highlight;return callback(null,out)};for(;i<l;i++)(function(token){if(token.type!=="code")return;pending++;return highlight(token.text,token.lang,function(err,code){if(code==null||code===token.text)return--pending||done();token.text=code;token.escaped=true;--pending||done()})})(tokens[i]);return}try{if(opt)opt=merge({},marked.defaults,opt);return Parser.parse(Lexer.lex(src,opt),opt)}catch(e){e.message+="\nPlease report this to https://github.com/chjj/marked.";
-if((opt||marked.defaults).silent)return"<p>An error occured:</p><pre>"+escape(e.message+"",true)+"</pre>";throw e;}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,smartLists:false,silent:false,highlight:null,langPrefix:""};marked.Parser=Parser;marked.parser=Parser.parse;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;
-marked.parse=marked;if(typeof exports==="object")module.exports=marked;else if(typeof define==="function"&&define.amd)define(function(){return marked});else this.marked=marked}).call(function(){return this||(typeof window!=="undefined"?window:global)}());
diff --git a/docs/slides/plpv14/reveal.js/plugin/math/math.js b/docs/slides/plpv14/reveal.js/plugin/math/math.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/math/math.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * A plugin which enables rendering of math equations inside
- * of reveal.js slides. Essentially a thin wrapper for MathJax.
- *
- * @author Hakim El Hattab
- */
-var RevealMath = window.RevealMath || (function(){
-
-	var options = Reveal.getConfig().math || {};
-	options.mathjax = options.mathjax || 'http://cdn.mathjax.org/mathjax/latest/MathJax.js';
-	options.config = options.config || 'TeX-AMS_HTML-full';
-
-	loadScript( options.mathjax + '?config=' + options.config, function() {
-
-		MathJax.Hub.Config({
-			messageStyle: 'none',
-			tex2jax: { inlineMath: [['$','$'],['\\(','\\)']] },
-			skipStartupTypeset: true
-		});
-
-		// Typeset followed by an immediate reveal.js layout since
-		// the typesetting process could affect slide height
-		MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] );
-		MathJax.Hub.Queue( Reveal.layout );
-
-		// Reprocess equations in slides when they turn visible
-		Reveal.addEventListener( 'slidechanged', function( event ) {
-
-			MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] );
-
-		} );
-
-	} );
-
-	function loadScript( url, callback ) {
-
-		var head = document.querySelector( 'head' );
-		var script = document.createElement( 'script' );
-		script.type = 'text/javascript';
-		script.src = url;
-
-		// Wrapper for callback to make sure it only fires once
-		var finish = function() {
-			if( typeof callback === 'function' ) {
-				callback.call();
-				callback = null;
-			}
-		}
-
-		script.onload = finish;
-
-		// IE
-		script.onreadystatechange = function() {
-			if ( this.readyState === 'loaded' ) {
-				finish();
-			}
-		}
-
-		// Normal browsers
-		head.appendChild( script );
-
-	}
-
-})();
diff --git a/docs/slides/plpv14/reveal.js/plugin/multiplex/client.js b/docs/slides/plpv14/reveal.js/plugin/multiplex/client.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/multiplex/client.js
+++ /dev/null
@@ -1,13 +0,0 @@
-(function() {
-	var multiplex = Reveal.getConfig().multiplex;
-	var socketId = multiplex.id;
-	var socket = io.connect(multiplex.url);
-
-	socket.on(multiplex.id, function(data) {
-		// ignore data from sockets that aren't ours
-		if (data.socketId !== socketId) { return; }
-		if( window.location.host === 'localhost:1947' ) return;
-
-		Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote');
-	});
-}());
diff --git a/docs/slides/plpv14/reveal.js/plugin/multiplex/index.js b/docs/slides/plpv14/reveal.js/plugin/multiplex/index.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/multiplex/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-var express		= require('express');
-var fs			= require('fs');
-var io			= require('socket.io');
-var crypto		= require('crypto');
-
-var app			= express.createServer();
-var staticDir	= express.static;
-
-io				= io.listen(app);
-
-var opts = {
-	port: 1948,
-	baseDir : __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		if (typeof slideData.secret == 'undefined' || slideData.secret == null || slideData.secret === '') return;
-		if (createHash(slideData.secret) === slideData.socketId) {
-			slideData.secret = null;
-			socket.broadcast.emit(slideData.socketId, slideData);
-		};
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/token", function(req,res) {
-	var ts = new Date().getTime();
-	var rand = Math.floor(Math.random()*9999999);
-	var secret = ts.toString() + rand.toString();
-	res.send({secret: secret, socketId: createHash(secret)});
-});
-
-var createHash = function(secret) {
-	var cipher = crypto.createCipher('blowfish', secret);
-	return(cipher.final('hex'));
-};
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset );
diff --git a/docs/slides/plpv14/reveal.js/plugin/multiplex/master.js b/docs/slides/plpv14/reveal.js/plugin/multiplex/master.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/multiplex/master.js
+++ /dev/null
@@ -1,51 +0,0 @@
-(function() {
-	// Don't emit events from inside of notes windows
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var multiplex = Reveal.getConfig().multiplex;
-
-	var socket = io.connect(multiplex.url);
-
-	var notify = function( slideElement, indexh, indexv, origin ) {
-		if( typeof origin === 'undefined' && origin !== 'remote' ) {
-			var nextindexh;
-			var nextindexv;
-
-			var fragmentindex = Reveal.getIndices().f;
-			if (typeof fragmentindex == 'undefined') {
-				fragmentindex = 0;
-			}
-
-			if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-				nextindexh = indexh;
-				nextindexv = indexv + 1;
-			} else {
-				nextindexh = indexh + 1;
-				nextindexv = 0;
-			}
-
-			var slideData = {
-				indexh : indexh,
-				indexv : indexv,
-				indexf : fragmentindex,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				secret: multiplex.secret,
-				socketId : multiplex.id
-			};
-
-			socket.emit('slidechanged', slideData);
-		}
-	}
-
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		notify( event.currentSlide, event.indexh, event.indexv, event.origin );
-	} );
-
-	var fragmentNotify = function( event ) {
-		notify( Reveal.getCurrentSlide(), Reveal.getIndices().h, Reveal.getIndices().v, event.origin );
-	};
-
-	Reveal.addEventListener( 'fragmentshown', fragmentNotify );
-	Reveal.addEventListener( 'fragmenthidden', fragmentNotify );
-}());
diff --git a/docs/slides/plpv14/reveal.js/plugin/notes-server/client.js b/docs/slides/plpv14/reveal.js/plugin/notes-server/client.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/notes-server/client.js
+++ /dev/null
@@ -1,57 +0,0 @@
-(function() {
-	// don't emit events from inside the previews themselves
-	if ( window.location.search.match( /receiver/gi ) ) { return; }
-
-	var socket = io.connect(window.location.origin);
-	var socketId = Math.random().toString().slice(2);
-	
-	console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
-	window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);
-
-	// Fires when a fragment is shown
-	Reveal.addEventListener( 'fragmentshown', function( event ) {
-		var fragmentData = {
-			fragment : 'next',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when a fragment is hidden
-	Reveal.addEventListener( 'fragmenthidden', function( event ) {
-		var fragmentData = {
-			fragment : 'previous',
-			socketId : socketId
-		};
-		socket.emit('fragmentchanged', fragmentData);
-	} );
-
-	// Fires when slide is changed
-	Reveal.addEventListener( 'slidechanged', function( event ) {
-		var nextindexh;
-		var nextindexv;
-		var slideElement = event.currentSlide;
-
-		if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
-			nextindexh = event.indexh;
-			nextindexv = event.indexv + 1;
-		} else {
-			nextindexh = event.indexh + 1;
-			nextindexv = 0;
-		}
-
-		var notes = slideElement.querySelector('aside.notes');
-		var slideData = {
-			notes : notes ? notes.innerHTML : '',
-			indexh : event.indexh,
-			indexv : event.indexv,
-			nextindexh : nextindexh,
-			nextindexv : nextindexv,
-			socketId : socketId,
-			markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false
-
-		};
-
-		socket.emit('slidechanged', slideData);
-	} );
-}());
diff --git a/docs/slides/plpv14/reveal.js/plugin/notes-server/index.js b/docs/slides/plpv14/reveal.js/plugin/notes-server/index.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/notes-server/index.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var express   = require('express');
-var fs        = require('fs');
-var io        = require('socket.io');
-var _         = require('underscore');
-var Mustache  = require('mustache');
-
-var app       = express.createServer();
-var staticDir = express.static;
-
-io            = io.listen(app);
-
-var opts = {
-	port :      1947,
-	baseDir :   __dirname + '/../../'
-};
-
-io.sockets.on('connection', function(socket) {
-	socket.on('slidechanged', function(slideData) {
-		socket.broadcast.emit('slidedata', slideData);
-	});
-	socket.on('fragmentchanged', function(fragmentData) {
-		socket.broadcast.emit('fragmentdata', fragmentData);
-	});
-});
-
-app.configure(function() {
-	[ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
-		app.use('/' + dir, staticDir(opts.baseDir + dir));
-	});
-});
-
-app.get("/", function(req, res) {
-	res.writeHead(200, {'Content-Type': 'text/html'});
-	fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
-});
-
-app.get("/notes/:socketId", function(req, res) {
-
-	fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
-		res.send(Mustache.to_html(data.toString(), {
-			socketId : req.params.socketId
-		}));
-	});
-	// fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
-});
-
-// Actually listen
-app.listen(opts.port || null);
-
-var brown = '\033[33m',
-	green = '\033[32m',
-	reset = '\033[0m';
-
-var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
-
-console.log( brown + "reveal.js - Speaker Notes" + reset );
-console.log( "1. Open the slides at " + green + slidesLocation + reset );
-console.log( "2. Click on the link your JS console to go to the notes page" );
-console.log( "3. Advance through your slides and your notes will advance automatically" );
diff --git a/docs/slides/plpv14/reveal.js/plugin/notes/notes.js b/docs/slides/plpv14/reveal.js/plugin/notes/notes.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/notes/notes.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Handles opening of and synchronization with the reveal.js
- * notes window.
- */
-var RevealNotes = (function() {
-
-	function openNotes() {
-		var jsFileLocation = document.querySelector('script[src$="notes.js"]').src;  // this js file path
-		jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, '');   // the js folder path
-		var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
-
-		// Fires when slide is changed
-		Reveal.addEventListener( 'slidechanged', post );
-
-		// Fires when a fragment is shown
-		Reveal.addEventListener( 'fragmentshown', post );
-
-		// Fires when a fragment is hidden
-		Reveal.addEventListener( 'fragmenthidden', post );
-
-		/**
-		 * Posts the current slide data to the notes window
-		 */
-		function post() {
-			var slideElement = Reveal.getCurrentSlide(),
-				slideIndices = Reveal.getIndices(),
-				messageData;
-
-			var notes = slideElement.querySelector( 'aside.notes' ),
-				nextindexh,
-				nextindexv;
-
-			if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
-				nextindexh = slideIndices.h;
-				nextindexv = slideIndices.v + 1;
-			} else {
-				nextindexh = slideIndices.h + 1;
-				nextindexv = 0;
-			}
-
-			messageData = {
-				notes : notes ? notes.innerHTML : '',
-				indexh : slideIndices.h,
-				indexv : slideIndices.v,
-				indexf : slideIndices.f,
-				nextindexh : nextindexh,
-				nextindexv : nextindexv,
-				markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
-			};
-
-			notesPopup.postMessage( JSON.stringify( messageData ), '*' );
-		}
-
-		// Navigate to the current slide when the notes are loaded
-		notesPopup.addEventListener( 'load', function( event ) {
-			post();
-		}, false );
-	}
-
-	// If the there's a 'notes' query set, open directly
-	if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
-		openNotes();
-	}
-
-	// Open the notes when the 's' key is hit
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openNotes();
-		}
-	}, false );
-
-	return { open: openNotes };
-})();
diff --git a/docs/slides/plpv14/reveal.js/plugin/postmessage/postmessage.js b/docs/slides/plpv14/reveal.js/plugin/postmessage/postmessage.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/postmessage/postmessage.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-
-	simple postmessage plugin
-
-	Useful when a reveal slideshow is inside an iframe.
-	It allows to call reveal methods from outside.
-
-	Example:
-		 var reveal =  window.frames[0];
-
-		 // Reveal.prev(); 
-		 reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
-		 // Reveal.next(); 
-		 reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
-		 // Reveal.slide(2, 2); 
-		 reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
-
-	Add to the slideshow:
-
-		dependencies: [
-			...
-			{ src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
-		]
-
-*/
-
-(function (){
-
-	window.addEventListener( "message", function ( event ) {
-		var data = JSON.parse( event.data ),
-				method = data.method,
-				args = data.args;
-
-		if( typeof Reveal[method] === 'function' ) {
-			Reveal[method].apply( Reveal, data.args );
-		}
-	}, false);
-
-}());
-
-
-
diff --git a/docs/slides/plpv14/reveal.js/plugin/print-pdf/print-pdf.js b/docs/slides/plpv14/reveal.js/plugin/print-pdf/print-pdf.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/print-pdf/print-pdf.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * phantomjs script for printing presentations to PDF.
- *
- * Example:
- * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
- *
- * By Manuel Bieh (https://github.com/manuelbieh)
- */
-
-// html2pdf.js
-var page = new WebPage();
-var system = require( 'system' );
-
-page.viewportSize  = {
-	width: 1024,
-	height: 768
-};
-
-page.paperSize = {
-	format: 'letter',
-	orientation: 'landscape',
-	margin: {
-		left: '0',
-		right: '0',
-		top: '0',
-		bottom: '0'
-	}
-};
-
-var revealFile = system.args[1] || 'index.html?print-pdf';
-var slideFile = system.args[2] || 'slides.pdf';
-
-if( slideFile.match( /\.pdf$/gi ) === null ) {
-	slideFile += '.pdf';
-}
-
-console.log( 'Printing PDF...' );
-
-page.open( revealFile, function( status ) {
-	console.log( 'Printed succesfully' );
-	page.render( slideFile );
-	phantom.exit();
-} );
-
diff --git a/docs/slides/plpv14/reveal.js/plugin/remotes/remotes.js b/docs/slides/plpv14/reveal.js/plugin/remotes/remotes.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/remotes/remotes.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Touch-based remote controller for your presentation courtesy 
- * of the folks at http://remotes.io
- */
-
-(function(window){
-
-    /**
-     * Detects if we are dealing with a touch enabled device (with some false positives)
-     * Borrowed from modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touch.js   
-     */
-    var hasTouch  = (function(){
-        return ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
-    })();
-
-    /**
-     * Detects if notes are enable and the current page is opened inside an /iframe
-     * this prevents loading Remotes.io several times
-     */
-    var isNotesAndIframe = (function(){
-        return window.RevealNotes && !(self == top);
-    })();
-
-    if(!hasTouch && !isNotesAndIframe){
-        head.ready( 'remotes.ne.min.js', function() {
-            new Remotes("preview")
-                .on("swipe-left", function(e){ Reveal.right(); })
-                .on("swipe-right", function(e){ Reveal.left(); })
-                .on("swipe-up", function(e){ Reveal.down(); })
-                .on("swipe-down", function(e){ Reveal.up(); })
-                .on("tap", function(e){ Reveal.next(); })
-                .on("zoom-out", function(e){ Reveal.toggleOverview(true); })
-                .on("zoom-in", function(e){ Reveal.toggleOverview(false); })
-            ;
-        } );
-
-        head.js('https://hakim-static.s3.amazonaws.com/reveal-js/remotes.ne.min.js');
-    }
-})(window);
diff --git a/docs/slides/plpv14/reveal.js/plugin/search/search.js b/docs/slides/plpv14/reveal.js/plugin/search/search.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/search/search.js
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
- * by navigatating to that slide and highlighting it.
- *
- * By Jon Snyder <snyder.jon@gmail.com>, February 2013
- */
-
-var RevealSearch = (function() {
-
-	var matchedSlides;
-	var currentMatchedIndex;
-	var searchboxDirty;
-	var myHilitor;
-
-// Original JavaScript code by Chirp Internet: www.chirp.com.au
-// Please acknowledge use of this code by including this header.
-// 2/2013 jon: modified regex to display any match, not restricted to word boundaries.
-
-function Hilitor(id, tag)
-{
-
-  var targetNode = document.getElementById(id) || document.body;
-  var hiliteTag = tag || "EM";
-  var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM|SPAN)$");
-  var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"];
-  var wordColor = [];
-  var colorIdx = 0;
-  var matchRegex = "";
-  var matchingSlides = [];
-
-  this.setRegex = function(input)
-  {
-    input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|");
-    matchRegex = new RegExp("(" + input + ")","i");
-  }
-
-  this.getRegex = function()
-  {
-    return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " ");
-  }
-
-  // recursively apply word highlighting
-  this.hiliteWords = function(node)
-  {
-    if(node == undefined || !node) return;
-    if(!matchRegex) return;
-    if(skipTags.test(node.nodeName)) return;
-
-    if(node.hasChildNodes()) {
-      for(var i=0; i < node.childNodes.length; i++)
-        this.hiliteWords(node.childNodes[i]);
-    }
-    if(node.nodeType == 3) { // NODE_TEXT
-      if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) {
-      	//find the slide's section element and save it in our list of matching slides
-      	var secnode = node.parentNode;
-      	while (secnode.nodeName != 'SECTION') {
-      		secnode = secnode.parentNode;
-      	}
-      	
-      	var slideIndex = Reveal.getIndices(secnode);
-      	var slidelen = matchingSlides.length;
-      	var alreadyAdded = false;
-      	for (var i=0; i < slidelen; i++) {
-      		if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) {
-      			alreadyAdded = true;
-      		}
-      	}
-      	if (! alreadyAdded) {
-      		matchingSlides.push(slideIndex);
-      	}
-      	
-        if(!wordColor[regs[0].toLowerCase()]) {
-          wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
-        }
-
-        var match = document.createElement(hiliteTag);
-        match.appendChild(document.createTextNode(regs[0]));
-        match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
-        match.style.fontStyle = "inherit";
-        match.style.color = "#000";
-
-        var after = node.splitText(regs.index);
-        after.nodeValue = after.nodeValue.substring(regs[0].length);
-        node.parentNode.insertBefore(match, after);
-      }
-    }
-  };
-
-  // remove highlighting
-  this.remove = function()
-  {
-    var arr = document.getElementsByTagName(hiliteTag);
-    while(arr.length && (el = arr[0])) {
-      el.parentNode.replaceChild(el.firstChild, el);
-    }
-  };
-
-  // start highlighting at target node
-  this.apply = function(input)
-  {
-    if(input == undefined || !input) return;
-    this.remove();
-    this.setRegex(input);
-    this.hiliteWords(targetNode);
-    return matchingSlides;
-  };
-
-}
-
-	function openSearch() {
-		//ensure the search term input dialog is visible and has focus:
-		var inputbox = document.getElementById("searchinput");
-		inputbox.style.display = "inline";
-		inputbox.focus();
-		inputbox.select();
-	}
-
-	function toggleSearch() {
-		var inputbox = document.getElementById("searchinput");
-		if (inputbox.style.display !== "inline") {
-			openSearch();
-		}
-		else {
-			inputbox.style.display = "none";
-			myHilitor.remove();
-		}
-	}
-
-	function doSearch() {
-		//if there's been a change in the search term, perform a new search:
-		if (searchboxDirty) {
-			var searchstring = document.getElementById("searchinput").value;
-
-			//find the keyword amongst the slides
-			myHilitor = new Hilitor("slidecontent");
-			matchedSlides = myHilitor.apply(searchstring);
-			currentMatchedIndex = 0;
-		}
-
-		//navigate to the next slide that has the keyword, wrapping to the first if necessary
-		if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) {
-			currentMatchedIndex = 0;
-		}
-		if (matchedSlides.length > currentMatchedIndex) {
-			Reveal.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v);
-			currentMatchedIndex++;
-		}
-	}
-
-	var dom = {};
-	dom.wrapper = document.querySelector( '.reveal' );
-
-	if( !dom.wrapper.querySelector( '.searchbox' ) ) {
-			var searchElement = document.createElement( 'div' );
-			searchElement.id = "searchinputdiv";
-			searchElement.classList.add( 'searchdiv' );
-      searchElement.style.position = 'absolute';
-      searchElement.style.top = '10px';
-      searchElement.style.left = '10px';
-      //embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/:
-			searchElement.innerHTML = '<span><input type="search" id="searchinput" class="searchinput" style="vertical-align: top;"/><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJiSURBVHjatFZNaxNBGH5md+Mmu92NVdKDRipSAyqCghgQD4L4cRe86UUtAQ+eFCxoa4/25EXBFi8eBE+eRPoDhB6KgiiixdAPCEkx2pjvTXadd9yNsflwuyUDD/O+u8PzzDPvzOwyx3EwyCZhwG3gAkp7MnpjgbopjsltcD4gjuXZZKeAR348MYLYTm3LzOs/y3j3JTfZxgXWXmTuwPHIc4VmoOmv5IrI53+AO2DdHLjkDWQ3GoEEVFXtXQOvkSnPWcyUceviLhwbDYv8/XIVj97kse7TodLvZXxYxrPUHkQ1ufXs3FEdybEIxucySOesoNvUgWU1cP3MkCBfTFdw9fGaAMVmRELq7LBw2Q3/FaAxxWIRpw+ZIr/7IouPqzUBiqmdHAv7EuhRAwf1er2Vy4x1jW3b2d5Jfvu5IPp7l2LYbcgCFFNb+FoJ7oBqEAqFMPNqFcmEgVMJDfMT+1tvN0pNjERlMS6QA5pFOKxiKVPFhakPeL3It+WGJUDxt2wFR+JhzI7v5ctkd8DXOZAkCYYxhO+lKm4+Xfqz/rIixBuNBl7eOYzkQQNzqX249mRl6zUgEcYkaJrGhUwBinVdh6IouPzwE6/DL5w4oLkH8y981aDf+uq6hlKpJESiUdNfDZi7/ehG9K6KfiA3pml0PLcsq+cSMTj2NL9ukc4UOmz7AZ3+crkC4mHujFvXNaMFB3bEr8xPS6p5O+jXxq4VZtaen7/PwzrntjcLUE0iHPS1Ud1cdiEJl/8WivZk0wXd7zWOMkeF8s0CcAmkNrC2nvXZDbbbN73ccYnZoH9bfgswAFzAe9/h3dbKAAAAAElFTkSuQmCC" id="searchbutton" class="searchicon" style="vertical-align: top; margin-top: -1px;"/></span>';
-			dom.wrapper.appendChild( searchElement );
-	}
-
-	document.getElementById("searchbutton").addEventListener( 'click', function(event) {
-		doSearch();
-	}, false );
-
-	document.getElementById("searchinput").addEventListener( 'keyup', function( event ) {
-		switch (event.keyCode) {
-			case 13:
-				event.preventDefault();
-				doSearch();
-				searchboxDirty = false;
-				break;
-			default:
-				searchboxDirty = true;
-		}
-	}, false );
-
-	// Open the search when the 's' key is hit (yes, this conflicts with the notes plugin, disabling for now)
-	/*
-	document.addEventListener( 'keydown', function( event ) {
-		// Disregard the event if the target is editable or a
-		// modifier is present
-		if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
-
-		if( event.keyCode === 83 ) {
-			event.preventDefault();
-			openSearch();
-		}
-	}, false );
-*/
-	return { open: openSearch };
-})();
diff --git a/docs/slides/plpv14/reveal.js/plugin/zoom-js/zoom.js b/docs/slides/plpv14/reveal.js/plugin/zoom-js/zoom.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/plugin/zoom-js/zoom.js
+++ /dev/null
@@ -1,258 +0,0 @@
-// Custom reveal.js integration
-(function(){
-	var isEnabled = true;
-
-	document.querySelector( '.reveal' ).addEventListener( 'mousedown', function( event ) {
-		var modifier = ( Reveal.getConfig().zoomKey ? Reveal.getConfig().zoomKey : 'alt' ) + 'Key';
-
-		if( event[ modifier ] && isEnabled ) {
-			event.preventDefault();
-			zoom.to({ element: event.target, pan: false });
-		}
-	} );
-
-	Reveal.addEventListener( 'overviewshown', function() { isEnabled = false; } );
-	Reveal.addEventListener( 'overviewhidden', function() { isEnabled = true; } );
-})();
-
-/*!
- * zoom.js 0.2 (modified version for use with reveal.js)
- * http://lab.hakim.se/zoom-js
- * MIT licensed
- *
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
- */
-var zoom = (function(){
-
-	// The current zoom level (scale)
-	var level = 1;
-
-	// The current mouse position, used for panning
-	var mouseX = 0,
-		mouseY = 0;
-
-	// Timeout before pan is activated
-	var panEngageTimeout = -1,
-		panUpdateInterval = -1;
-
-	var currentOptions = null;
-
-	// Check for transform support so that we can fallback otherwise
-	var supportsTransforms = 	'WebkitTransform' in document.body.style ||
-								'MozTransform' in document.body.style ||
-								'msTransform' in document.body.style ||
-								'OTransform' in document.body.style ||
-								'transform' in document.body.style;
-
-	if( supportsTransforms ) {
-		// The easing that will be applied when we zoom in/out
-		document.body.style.transition = 'transform 0.8s ease';
-		document.body.style.OTransition = '-o-transform 0.8s ease';
-		document.body.style.msTransition = '-ms-transform 0.8s ease';
-		document.body.style.MozTransition = '-moz-transform 0.8s ease';
-		document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';
-	}
-
-	// Zoom out if the user hits escape
-	document.addEventListener( 'keyup', function( event ) {
-		if( level !== 1 && event.keyCode === 27 ) {
-			zoom.out();
-		}
-	}, false );
-
-	// Monitor mouse movement for panning
-	document.addEventListener( 'mousemove', function( event ) {
-		if( level !== 1 ) {
-			mouseX = event.clientX;
-			mouseY = event.clientY;
-		}
-	}, false );
-
-	/**
-	 * Applies the CSS required to zoom in, prioritizes use of CSS3
-	 * transforms but falls back on zoom for IE.
-	 *
-	 * @param {Number} pageOffsetX
-	 * @param {Number} pageOffsetY
-	 * @param {Number} elementOffsetX
-	 * @param {Number} elementOffsetY
-	 * @param {Number} scale
-	 */
-	function magnify( pageOffsetX, pageOffsetY, elementOffsetX, elementOffsetY, scale ) {
-
-		if( supportsTransforms ) {
-			var origin = pageOffsetX +'px '+ pageOffsetY +'px',
-				transform = 'translate('+ -elementOffsetX +'px,'+ -elementOffsetY +'px) scale('+ scale +')';
-
-			document.body.style.transformOrigin = origin;
-			document.body.style.OTransformOrigin = origin;
-			document.body.style.msTransformOrigin = origin;
-			document.body.style.MozTransformOrigin = origin;
-			document.body.style.WebkitTransformOrigin = origin;
-
-			document.body.style.transform = transform;
-			document.body.style.OTransform = transform;
-			document.body.style.msTransform = transform;
-			document.body.style.MozTransform = transform;
-			document.body.style.WebkitTransform = transform;
-		}
-		else {
-			// Reset all values
-			if( scale === 1 ) {
-				document.body.style.position = '';
-				document.body.style.left = '';
-				document.body.style.top = '';
-				document.body.style.width = '';
-				document.body.style.height = '';
-				document.body.style.zoom = '';
-			}
-			// Apply scale
-			else {
-				document.body.style.position = 'relative';
-				document.body.style.left = ( - ( pageOffsetX + elementOffsetX ) / scale ) + 'px';
-				document.body.style.top = ( - ( pageOffsetY + elementOffsetY ) / scale ) + 'px';
-				document.body.style.width = ( scale * 100 ) + '%';
-				document.body.style.height = ( scale * 100 ) + '%';
-				document.body.style.zoom = scale;
-			}
-		}
-
-		level = scale;
-
-		if( level !== 1 && document.documentElement.classList ) {
-			document.documentElement.classList.add( 'zoomed' );
-		}
-		else {
-			document.documentElement.classList.remove( 'zoomed' );
-		}
-	}
-
-	/**
-	 * Pan the document when the mosue cursor approaches the edges
-	 * of the window.
-	 */
-	function pan() {
-		var range = 0.12,
-			rangeX = window.innerWidth * range,
-			rangeY = window.innerHeight * range,
-			scrollOffset = getScrollOffset();
-
-		// Up
-		if( mouseY < rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
-		}
-		// Down
-		else if( mouseY > window.innerHeight - rangeY ) {
-			window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
-		}
-
-		// Left
-		if( mouseX < rangeX ) {
-			window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
-		}
-		// Right
-		else if( mouseX > window.innerWidth - rangeX ) {
-			window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
-		}
-	}
-
-	function getScrollOffset() {
-		return {
-			x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
-			y: window.scrollY !== undefined ? window.scrollY : window.pageXYffset
-		}
-	}
-
-	return {
-		/**
-		 * Zooms in on either a rectangle or HTML element.
-		 *
-		 * @param {Object} options
-		 *   - element: HTML element to zoom in on
-		 *   OR
-		 *   - x/y: coordinates in non-transformed space to zoom in on
-		 *   - width/height: the portion of the screen to zoom in on
-		 *   - scale: can be used instead of width/height to explicitly set scale
-		 */
-		to: function( options ) {
-			// Due to an implementation limitation we can't zoom in
-			// to another element without zooming out first
-			if( level !== 1 ) {
-				zoom.out();
-			}
-			else {
-				options.x = options.x || 0;
-				options.y = options.y || 0;
-
-				// If an element is set, that takes precedence
-				if( !!options.element ) {
-					// Space around the zoomed in element to leave on screen
-					var padding = 20;
-
-					options.width = options.element.getBoundingClientRect().width + ( padding * 2 );
-					options.height = options.element.getBoundingClientRect().height + ( padding * 2 );
-					options.x = options.element.getBoundingClientRect().left - padding;
-					options.y = options.element.getBoundingClientRect().top - padding;
-				}
-
-				// If width/height values are set, calculate scale from those values
-				if( options.width !== undefined && options.height !== undefined ) {
-					options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
-				}
-
-				if( options.scale > 1 ) {
-					options.x *= options.scale;
-					options.y *= options.scale;
-
-					var scrollOffset = getScrollOffset();
-
-					if( options.element ) {
-						scrollOffset.x -= ( window.innerWidth - ( options.width * options.scale ) ) / 2;
-					}
-
-					magnify( scrollOffset.x, scrollOffset.y, options.x, options.y, options.scale );
-
-					if( options.pan !== false ) {
-
-						// Wait with engaging panning as it may conflict with the
-						// zoom transition
-						panEngageTimeout = setTimeout( function() {
-							panUpdateInterval = setInterval( pan, 1000 / 60 );
-						}, 800 );
-
-					}
-				}
-
-				currentOptions = options;
-			}
-		},
-
-		/**
-		 * Resets the document zoom state to its default.
-		 */
-		out: function() {
-			clearTimeout( panEngageTimeout );
-			clearInterval( panUpdateInterval );
-
-			var scrollOffset = getScrollOffset();
-
-			if( currentOptions && currentOptions.element ) {
-				scrollOffset.x -= ( window.innerWidth - ( currentOptions.width * currentOptions.scale ) ) / 2;
-			}
-
-			magnify( scrollOffset.x, scrollOffset.y, 0, 0, 1 );
-
-			level = 1;
-		},
-
-		// Alias
-		magnify: function( options ) { this.to( options ) },
-		reset: function() { this.out() },
-
-		zoomLevel: function() {
-			return level;
-		}
-	}
-
-})();
-
diff --git a/docs/slides/plpv14/reveal.js/test/examples/assets/image1.png b/docs/slides/plpv14/reveal.js/test/examples/assets/image1.png
deleted file mode 100644
Binary files a/docs/slides/plpv14/reveal.js/test/examples/assets/image1.png and /dev/null differ
diff --git a/docs/slides/plpv14/reveal.js/test/examples/assets/image2.png b/docs/slides/plpv14/reveal.js/test/examples/assets/image2.png
deleted file mode 100644
Binary files a/docs/slides/plpv14/reveal.js/test/examples/assets/image2.png and /dev/null differ
diff --git a/docs/slides/plpv14/reveal.js/test/qunit-1.12.0.css b/docs/slides/plpv14/reveal.js/test/qunit-1.12.0.css
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/test/qunit-1.12.0.css
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- */
-
-/** Font Family and Sizes */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
-	font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
-}
-
-#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
-#qunit-tests { font-size: smaller; }
-
-
-/** Resets */
-
-#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
-	margin: 0;
-	padding: 0;
-}
-
-
-/** Header */
-
-#qunit-header {
-	padding: 0.5em 0 0.5em 1em;
-
-	color: #8699a4;
-	background-color: #0d3349;
-
-	font-size: 1.5em;
-	line-height: 1em;
-	font-weight: normal;
-
-	border-radius: 5px 5px 0 0;
-	-moz-border-radius: 5px 5px 0 0;
-	-webkit-border-top-right-radius: 5px;
-	-webkit-border-top-left-radius: 5px;
-}
-
-#qunit-header a {
-	text-decoration: none;
-	color: #c2ccd1;
-}
-
-#qunit-header a:hover,
-#qunit-header a:focus {
-	color: #fff;
-}
-
-#qunit-testrunner-toolbar label {
-	display: inline-block;
-	padding: 0 .5em 0 .1em;
-}
-
-#qunit-banner {
-	height: 5px;
-}
-
-#qunit-testrunner-toolbar {
-	padding: 0.5em 0 0.5em 2em;
-	color: #5E740B;
-	background-color: #eee;
-	overflow: hidden;
-}
-
-#qunit-userAgent {
-	padding: 0.5em 0 0.5em 2.5em;
-	background-color: #2b81af;
-	color: #fff;
-	text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
-}
-
-#qunit-modulefilter-container {
-	float: right;
-}
-
-/** Tests: Pass/Fail */
-
-#qunit-tests {
-	list-style-position: inside;
-}
-
-#qunit-tests li {
-	padding: 0.4em 0.5em 0.4em 2.5em;
-	border-bottom: 1px solid #fff;
-	list-style-position: inside;
-}
-
-#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {
-	display: none;
-}
-
-#qunit-tests li strong {
-	cursor: pointer;
-}
-
-#qunit-tests li a {
-	padding: 0.5em;
-	color: #c2ccd1;
-	text-decoration: none;
-}
-#qunit-tests li a:hover,
-#qunit-tests li a:focus {
-	color: #000;
-}
-
-#qunit-tests li .runtime {
-	float: right;
-	font-size: smaller;
-}
-
-.qunit-assert-list {
-	margin-top: 0.5em;
-	padding: 0.5em;
-
-	background-color: #fff;
-
-	border-radius: 5px;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-}
-
-.qunit-collapsed {
-	display: none;
-}
-
-#qunit-tests table {
-	border-collapse: collapse;
-	margin-top: .2em;
-}
-
-#qunit-tests th {
-	text-align: right;
-	vertical-align: top;
-	padding: 0 .5em 0 0;
-}
-
-#qunit-tests td {
-	vertical-align: top;
-}
-
-#qunit-tests pre {
-	margin: 0;
-	white-space: pre-wrap;
-	word-wrap: break-word;
-}
-
-#qunit-tests del {
-	background-color: #e0f2be;
-	color: #374e0c;
-	text-decoration: none;
-}
-
-#qunit-tests ins {
-	background-color: #ffcaca;
-	color: #500;
-	text-decoration: none;
-}
-
-/*** Test Counts */
-
-#qunit-tests b.counts                       { color: black; }
-#qunit-tests b.passed                       { color: #5E740B; }
-#qunit-tests b.failed                       { color: #710909; }
-
-#qunit-tests li li {
-	padding: 5px;
-	background-color: #fff;
-	border-bottom: none;
-	list-style-position: inside;
-}
-
-/*** Passing Styles */
-
-#qunit-tests li li.pass {
-	color: #3c510c;
-	background-color: #fff;
-	border-left: 10px solid #C6E746;
-}
-
-#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }
-#qunit-tests .pass .test-name               { color: #366097; }
-
-#qunit-tests .pass .test-actual,
-#qunit-tests .pass .test-expected           { color: #999999; }
-
-#qunit-banner.qunit-pass                    { background-color: #C6E746; }
-
-/*** Failing Styles */
-
-#qunit-tests li li.fail {
-	color: #710909;
-	background-color: #fff;
-	border-left: 10px solid #EE5757;
-	white-space: pre;
-}
-
-#qunit-tests > li:last-child {
-	border-radius: 0 0 5px 5px;
-	-moz-border-radius: 0 0 5px 5px;
-	-webkit-border-bottom-right-radius: 5px;
-	-webkit-border-bottom-left-radius: 5px;
-}
-
-#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }
-#qunit-tests .fail .test-name,
-#qunit-tests .fail .module-name             { color: #000000; }
-
-#qunit-tests .fail .test-actual             { color: #EE5757; }
-#qunit-tests .fail .test-expected           { color: green;   }
-
-#qunit-banner.qunit-fail                    { background-color: #EE5757; }
-
-
-/** Result */
-
-#qunit-testresult {
-	padding: 0.5em 0.5em 0.5em 2.5em;
-
-	color: #2b81af;
-	background-color: #D2E0E6;
-
-	border-bottom: 1px solid white;
-}
-#qunit-testresult .module-name {
-	font-weight: bold;
-}
-
-/** Fixture */
-
-#qunit-fixture {
-	position: absolute;
-	top: -10000px;
-	left: -10000px;
-	width: 1000px;
-	height: 1000px;
-}
diff --git a/docs/slides/plpv14/reveal.js/test/qunit-1.12.0.js b/docs/slides/plpv14/reveal.js/test/qunit-1.12.0.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/test/qunit-1.12.0.js
+++ /dev/null
@@ -1,2212 +0,0 @@
-/**
- * QUnit v1.12.0 - A JavaScript Unit Testing Framework
- *
- * http://qunitjs.com
- *
- * Copyright 2013 jQuery Foundation and other contributors
- * Released under the MIT license.
- * https://jquery.org/license/
- */
-
-(function( window ) {
-
-var QUnit,
-	assert,
-	config,
-	onErrorFnPrev,
-	testId = 0,
-	fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
-	toString = Object.prototype.toString,
-	hasOwn = Object.prototype.hasOwnProperty,
-	// Keep a local reference to Date (GH-283)
-	Date = window.Date,
-	setTimeout = window.setTimeout,
-	defined = {
-		setTimeout: typeof window.setTimeout !== "undefined",
-		sessionStorage: (function() {
-			var x = "qunit-test-string";
-			try {
-				sessionStorage.setItem( x, x );
-				sessionStorage.removeItem( x );
-				return true;
-			} catch( e ) {
-				return false;
-			}
-		}())
-	},
-	/**
-	 * Provides a normalized error string, correcting an issue
-	 * with IE 7 (and prior) where Error.prototype.toString is
-	 * not properly implemented
-	 *
-	 * Based on http://es5.github.com/#x15.11.4.4
-	 *
-	 * @param {String|Error} error
-	 * @return {String} error message
-	 */
-	errorString = function( error ) {
-		var name, message,
-			errorString = error.toString();
-		if ( errorString.substring( 0, 7 ) === "[object" ) {
-			name = error.name ? error.name.toString() : "Error";
-			message = error.message ? error.message.toString() : "";
-			if ( name && message ) {
-				return name + ": " + message;
-			} else if ( name ) {
-				return name;
-			} else if ( message ) {
-				return message;
-			} else {
-				return "Error";
-			}
-		} else {
-			return errorString;
-		}
-	},
-	/**
-	 * Makes a clone of an object using only Array or Object as base,
-	 * and copies over the own enumerable properties.
-	 *
-	 * @param {Object} obj
-	 * @return {Object} New object with only the own properties (recursively).
-	 */
-	objectValues = function( obj ) {
-		// Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.
-		/*jshint newcap: false */
-		var key, val,
-			vals = QUnit.is( "array", obj ) ? [] : {};
-		for ( key in obj ) {
-			if ( hasOwn.call( obj, key ) ) {
-				val = obj[key];
-				vals[key] = val === Object(val) ? objectValues(val) : val;
-			}
-		}
-		return vals;
-	};
-
-function Test( settings ) {
-	extend( this, settings );
-	this.assertions = [];
-	this.testNumber = ++Test.count;
-}
-
-Test.count = 0;
-
-Test.prototype = {
-	init: function() {
-		var a, b, li,
-			tests = id( "qunit-tests" );
-
-		if ( tests ) {
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml;
-
-			// `a` initialized at top of scope
-			a = document.createElement( "a" );
-			a.innerHTML = "Rerun";
-			a.href = QUnit.url({ testNumber: this.testNumber });
-
-			li = document.createElement( "li" );
-			li.appendChild( b );
-			li.appendChild( a );
-			li.className = "running";
-			li.id = this.id = "qunit-test-output" + testId++;
-
-			tests.appendChild( li );
-		}
-	},
-	setup: function() {
-		if (
-			// Emit moduleStart when we're switching from one module to another
-			this.module !== config.previousModule ||
-				// They could be equal (both undefined) but if the previousModule property doesn't
-				// yet exist it means this is the first test in a suite that isn't wrapped in a
-				// module, in which case we'll just emit a moduleStart event for 'undefined'.
-				// Without this, reporters can get testStart before moduleStart  which is a problem.
-				!hasOwn.call( config, "previousModule" )
-		) {
-			if ( hasOwn.call( config, "previousModule" ) ) {
-				runLoggingCallbacks( "moduleDone", QUnit, {
-					name: config.previousModule,
-					failed: config.moduleStats.bad,
-					passed: config.moduleStats.all - config.moduleStats.bad,
-					total: config.moduleStats.all
-				});
-			}
-			config.previousModule = this.module;
-			config.moduleStats = { all: 0, bad: 0 };
-			runLoggingCallbacks( "moduleStart", QUnit, {
-				name: this.module
-			});
-		}
-
-		config.current = this;
-
-		this.testEnvironment = extend({
-			setup: function() {},
-			teardown: function() {}
-		}, this.moduleTestEnvironment );
-
-		this.started = +new Date();
-		runLoggingCallbacks( "testStart", QUnit, {
-			name: this.testName,
-			module: this.module
-		});
-
-		/*jshint camelcase:false */
-
-
-		/**
-		 * Expose the current test environment.
-		 *
-		 * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.
-		 */
-		QUnit.current_testEnvironment = this.testEnvironment;
-
-		/*jshint camelcase:true */
-
-		if ( !config.pollution ) {
-			saveGlobal();
-		}
-		if ( config.notrycatch ) {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-			return;
-		}
-		try {
-			this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );
-		} catch( e ) {
-			QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-		}
-	},
-	run: function() {
-		config.current = this;
-
-		var running = id( "qunit-testresult" );
-
-		if ( running ) {
-			running.innerHTML = "Running: <br/>" + this.nameHtml;
-		}
-
-		if ( this.async ) {
-			QUnit.stop();
-		}
-
-		this.callbackStarted = +new Date();
-
-		if ( config.notrycatch ) {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-			return;
-		}
-
-		try {
-			this.callback.call( this.testEnvironment, QUnit.assert );
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-		} catch( e ) {
-			this.callbackRuntime = +new Date() - this.callbackStarted;
-
-			QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
-			// else next test will carry the responsibility
-			saveGlobal();
-
-			// Restart the tests if they're blocking
-			if ( config.blocking ) {
-				QUnit.start();
-			}
-		}
-	},
-	teardown: function() {
-		config.current = this;
-		if ( config.notrycatch ) {
-			if ( typeof this.callbackRuntime === "undefined" ) {
-				this.callbackRuntime = +new Date() - this.callbackStarted;
-			}
-			this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			return;
-		} else {
-			try {
-				this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );
-			} catch( e ) {
-				QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );
-			}
-		}
-		checkPollution();
-	},
-	finish: function() {
-		config.current = this;
-		if ( config.requireExpects && this.expected === null ) {
-			QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
-		} else if ( this.expected !== null && this.expected !== this.assertions.length ) {
-			QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
-		} else if ( this.expected === null && !this.assertions.length ) {
-			QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
-		}
-
-		var i, assertion, a, b, time, li, ol,
-			test = this,
-			good = 0,
-			bad = 0,
-			tests = id( "qunit-tests" );
-
-		this.runtime = +new Date() - this.started;
-		config.stats.all += this.assertions.length;
-		config.moduleStats.all += this.assertions.length;
-
-		if ( tests ) {
-			ol = document.createElement( "ol" );
-			ol.className = "qunit-assert-list";
-
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				assertion = this.assertions[i];
-
-				li = document.createElement( "li" );
-				li.className = assertion.result ? "pass" : "fail";
-				li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
-				ol.appendChild( li );
-
-				if ( assertion.result ) {
-					good++;
-				} else {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-
-			// store result when possible
-			if ( QUnit.config.reorder && defined.sessionStorage ) {
-				if ( bad ) {
-					sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
-				} else {
-					sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
-				}
-			}
-
-			if ( bad === 0 ) {
-				addClass( ol, "qunit-collapsed" );
-			}
-
-			// `b` initialized at top of scope
-			b = document.createElement( "strong" );
-			b.innerHTML = this.nameHtml + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
-
-			addEvent(b, "click", function() {
-				var next = b.parentNode.lastChild,
-					collapsed = hasClass( next, "qunit-collapsed" );
-				( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );
-			});
-
-			addEvent(b, "dblclick", function( e ) {
-				var target = e && e.target ? e.target : window.event.srcElement;
-				if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {
-					target = target.parentNode;
-				}
-				if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-					window.location = QUnit.url({ testNumber: test.testNumber });
-				}
-			});
-
-			// `time` initialized at top of scope
-			time = document.createElement( "span" );
-			time.className = "runtime";
-			time.innerHTML = this.runtime + " ms";
-
-			// `li` initialized at top of scope
-			li = id( this.id );
-			li.className = bad ? "fail" : "pass";
-			li.removeChild( li.firstChild );
-			a = li.firstChild;
-			li.appendChild( b );
-			li.appendChild( a );
-			li.appendChild( time );
-			li.appendChild( ol );
-
-		} else {
-			for ( i = 0; i < this.assertions.length; i++ ) {
-				if ( !this.assertions[i].result ) {
-					bad++;
-					config.stats.bad++;
-					config.moduleStats.bad++;
-				}
-			}
-		}
-
-		runLoggingCallbacks( "testDone", QUnit, {
-			name: this.testName,
-			module: this.module,
-			failed: bad,
-			passed: this.assertions.length - bad,
-			total: this.assertions.length,
-			duration: this.runtime
-		});
-
-		QUnit.reset();
-
-		config.current = undefined;
-	},
-
-	queue: function() {
-		var bad,
-			test = this;
-
-		synchronize(function() {
-			test.init();
-		});
-		function run() {
-			// each of these can by async
-			synchronize(function() {
-				test.setup();
-			});
-			synchronize(function() {
-				test.run();
-			});
-			synchronize(function() {
-				test.teardown();
-			});
-			synchronize(function() {
-				test.finish();
-			});
-		}
-
-		// `bad` initialized at top of scope
-		// defer when previous test run passed, if storage is available
-		bad = QUnit.config.reorder && defined.sessionStorage &&
-						+sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
-
-		if ( bad ) {
-			run();
-		} else {
-			synchronize( run, true );
-		}
-	}
-};
-
-// Root QUnit object.
-// `QUnit` initialized at top of scope
-QUnit = {
-
-	// call on start of module test to prepend name to all tests
-	module: function( name, testEnvironment ) {
-		config.currentModule = name;
-		config.currentModuleTestEnvironment = testEnvironment;
-		config.modules[name] = true;
-	},
-
-	asyncTest: function( testName, expected, callback ) {
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		QUnit.test( testName, expected, callback, true );
-	},
-
-	test: function( testName, expected, callback, async ) {
-		var test,
-			nameHtml = "<span class='test-name'>" + escapeText( testName ) + "</span>";
-
-		if ( arguments.length === 2 ) {
-			callback = expected;
-			expected = null;
-		}
-
-		if ( config.currentModule ) {
-			nameHtml = "<span class='module-name'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;
-		}
-
-		test = new Test({
-			nameHtml: nameHtml,
-			testName: testName,
-			expected: expected,
-			async: async,
-			callback: callback,
-			module: config.currentModule,
-			moduleTestEnvironment: config.currentModuleTestEnvironment,
-			stack: sourceFromStacktrace( 2 )
-		});
-
-		if ( !validTest( test ) ) {
-			return;
-		}
-
-		test.queue();
-	},
-
-	// Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through.
-	expect: function( asserts ) {
-		if (arguments.length === 1) {
-			config.current.expected = asserts;
-		} else {
-			return config.current.expected;
-		}
-	},
-
-	start: function( count ) {
-		// QUnit hasn't been initialized yet.
-		// Note: RequireJS (et al) may delay onLoad
-		if ( config.semaphore === undefined ) {
-			QUnit.begin(function() {
-				// This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first
-				setTimeout(function() {
-					QUnit.start( count );
-				});
-			});
-			return;
-		}
-
-		config.semaphore -= count || 1;
-		// don't start until equal number of stop-calls
-		if ( config.semaphore > 0 ) {
-			return;
-		}
-		// ignore if start is called more often then stop
-		if ( config.semaphore < 0 ) {
-			config.semaphore = 0;
-			QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );
-			return;
-		}
-		// A slight delay, to avoid any current callbacks
-		if ( defined.setTimeout ) {
-			setTimeout(function() {
-				if ( config.semaphore > 0 ) {
-					return;
-				}
-				if ( config.timeout ) {
-					clearTimeout( config.timeout );
-				}
-
-				config.blocking = false;
-				process( true );
-			}, 13);
-		} else {
-			config.blocking = false;
-			process( true );
-		}
-	},
-
-	stop: function( count ) {
-		config.semaphore += count || 1;
-		config.blocking = true;
-
-		if ( config.testTimeout && defined.setTimeout ) {
-			clearTimeout( config.timeout );
-			config.timeout = setTimeout(function() {
-				QUnit.ok( false, "Test timed out" );
-				config.semaphore = 1;
-				QUnit.start();
-			}, config.testTimeout );
-		}
-	}
-};
-
-// `assert` initialized at top of scope
-// Assert helpers
-// All of these must either call QUnit.push() or manually do:
-// - runLoggingCallbacks( "log", .. );
-// - config.current.assertions.push({ .. });
-// We attach it to the QUnit object *after* we expose the public API,
-// otherwise `assert` will become a global variable in browsers (#341).
-assert = {
-	/**
-	 * Asserts rough true-ish result.
-	 * @name ok
-	 * @function
-	 * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-	 */
-	ok: function( result, msg ) {
-		if ( !config.current ) {
-			throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-		result = !!result;
-		msg = msg || (result ? "okay" : "failed" );
-
-		var source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: msg
-			};
-
-		msg = "<span class='test-message'>" + escapeText( msg ) + "</span>";
-
-		if ( !result ) {
-			source = sourceFromStacktrace( 2 );
-			if ( source ) {
-				details.source = source;
-				msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr></table>";
-			}
-		}
-		runLoggingCallbacks( "log", QUnit, details );
-		config.current.assertions.push({
-			result: result,
-			message: msg
-		});
-	},
-
-	/**
-	 * Assert that the first two arguments are equal, with an optional message.
-	 * Prints out both actual and expected values.
-	 * @name equal
-	 * @function
-	 * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
-	 */
-	equal: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected == actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notEqual
-	 * @function
-	 */
-	notEqual: function( actual, expected, message ) {
-		/*jshint eqeqeq:false */
-		QUnit.push( expected != actual, actual, expected, message );
-	},
-
-	/**
-	 * @name propEqual
-	 * @function
-	 */
-	propEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notPropEqual
-	 * @function
-	 */
-	notPropEqual: function( actual, expected, message ) {
-		actual = objectValues(actual);
-		expected = objectValues(expected);
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name deepEqual
-	 * @function
-	 */
-	deepEqual: function( actual, expected, message ) {
-		QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name notDeepEqual
-	 * @function
-	 */
-	notDeepEqual: function( actual, expected, message ) {
-		QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
-	},
-
-	/**
-	 * @name strictEqual
-	 * @function
-	 */
-	strictEqual: function( actual, expected, message ) {
-		QUnit.push( expected === actual, actual, expected, message );
-	},
-
-	/**
-	 * @name notStrictEqual
-	 * @function
-	 */
-	notStrictEqual: function( actual, expected, message ) {
-		QUnit.push( expected !== actual, actual, expected, message );
-	},
-
-	"throws": function( block, expected, message ) {
-		var actual,
-			expectedOutput = expected,
-			ok = false;
-
-		// 'expected' is optional
-		if ( typeof expected === "string" ) {
-			message = expected;
-			expected = null;
-		}
-
-		config.current.ignoreGlobalErrors = true;
-		try {
-			block.call( config.current.testEnvironment );
-		} catch (e) {
-			actual = e;
-		}
-		config.current.ignoreGlobalErrors = false;
-
-		if ( actual ) {
-			// we don't want to validate thrown error
-			if ( !expected ) {
-				ok = true;
-				expectedOutput = null;
-			// expected is a regexp
-			} else if ( QUnit.objectType( expected ) === "regexp" ) {
-				ok = expected.test( errorString( actual ) );
-			// expected is a constructor
-			} else if ( actual instanceof expected ) {
-				ok = true;
-			// expected is a validation function which returns true is validation passed
-			} else if ( expected.call( {}, actual ) === true ) {
-				expectedOutput = null;
-				ok = true;
-			}
-
-			QUnit.push( ok, actual, expectedOutput, message );
-		} else {
-			QUnit.pushFailure( message, null, "No exception was thrown." );
-		}
-	}
-};
-
-/**
- * @deprecated since 1.8.0
- * Kept assertion helpers in root for backwards compatibility.
- */
-extend( QUnit, assert );
-
-/**
- * @deprecated since 1.9.0
- * Kept root "raises()" for backwards compatibility.
- * (Note that we don't introduce assert.raises).
- */
-QUnit.raises = assert[ "throws" ];
-
-/**
- * @deprecated since 1.0.0, replaced with error pushes since 1.3.0
- * Kept to avoid TypeErrors for undefined methods.
- */
-QUnit.equals = function() {
-	QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
-};
-QUnit.same = function() {
-	QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
-};
-
-// We want access to the constructor's prototype
-(function() {
-	function F() {}
-	F.prototype = QUnit;
-	QUnit = new F();
-	// Make F QUnit's constructor so that we can add to the prototype later
-	QUnit.constructor = F;
-}());
-
-/**
- * Config object: Maintain internal state
- * Later exposed as QUnit.config
- * `config` initialized at top of scope
- */
-config = {
-	// The queue of tests to run
-	queue: [],
-
-	// block until document ready
-	blocking: true,
-
-	// when enabled, show only failing tests
-	// gets persisted through sessionStorage and can be changed in UI via checkbox
-	hidepassed: false,
-
-	// by default, run previously failed tests first
-	// very useful in combination with "Hide passed tests" checked
-	reorder: true,
-
-	// by default, modify document.title when suite is done
-	altertitle: true,
-
-	// when enabled, all tests must call expect()
-	requireExpects: false,
-
-	// add checkboxes that are persisted in the query-string
-	// when enabled, the id is set to `true` as a `QUnit.config` property
-	urlConfig: [
-		{
-			id: "noglobals",
-			label: "Check for Globals",
-			tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."
-		},
-		{
-			id: "notrycatch",
-			label: "No try-catch",
-			tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."
-		}
-	],
-
-	// Set of all modules.
-	modules: {},
-
-	// logging callback queues
-	begin: [],
-	done: [],
-	log: [],
-	testStart: [],
-	testDone: [],
-	moduleStart: [],
-	moduleDone: []
-};
-
-// Export global variables, unless an 'exports' object exists,
-// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
-if ( typeof exports === "undefined" ) {
-	extend( window, QUnit.constructor.prototype );
-
-	// Expose QUnit object
-	window.QUnit = QUnit;
-}
-
-// Initialize more QUnit.config and QUnit.urlParams
-(function() {
-	var i,
-		location = window.location || { search: "", protocol: "file:" },
-		params = location.search.slice( 1 ).split( "&" ),
-		length = params.length,
-		urlParams = {},
-		current;
-
-	if ( params[ 0 ] ) {
-		for ( i = 0; i < length; i++ ) {
-			current = params[ i ].split( "=" );
-			current[ 0 ] = decodeURIComponent( current[ 0 ] );
-			// allow just a key to turn on a flag, e.g., test.html?noglobals
-			current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
-			urlParams[ current[ 0 ] ] = current[ 1 ];
-		}
-	}
-
-	QUnit.urlParams = urlParams;
-
-	// String search anywhere in moduleName+testName
-	config.filter = urlParams.filter;
-
-	// Exact match of the module name
-	config.module = urlParams.module;
-
-	config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
-
-	// Figure out if we're running the tests from a server or not
-	QUnit.isLocal = location.protocol === "file:";
-}());
-
-// Extend QUnit object,
-// these after set here because they should not be exposed as global functions
-extend( QUnit, {
-	assert: assert,
-
-	config: config,
-
-	// Initialize the configuration options
-	init: function() {
-		extend( config, {
-			stats: { all: 0, bad: 0 },
-			moduleStats: { all: 0, bad: 0 },
-			started: +new Date(),
-			updateRate: 1000,
-			blocking: false,
-			autostart: true,
-			autorun: false,
-			filter: "",
-			queue: [],
-			semaphore: 1
-		});
-
-		var tests, banner, result,
-			qunit = id( "qunit" );
-
-		if ( qunit ) {
-			qunit.innerHTML =
-				"<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-				"<h2 id='qunit-banner'></h2>" +
-				"<div id='qunit-testrunner-toolbar'></div>" +
-				"<h2 id='qunit-userAgent'></h2>" +
-				"<ol id='qunit-tests'></ol>";
-		}
-
-		tests = id( "qunit-tests" );
-		banner = id( "qunit-banner" );
-		result = id( "qunit-testresult" );
-
-		if ( tests ) {
-			tests.innerHTML = "";
-		}
-
-		if ( banner ) {
-			banner.className = "";
-		}
-
-		if ( result ) {
-			result.parentNode.removeChild( result );
-		}
-
-		if ( tests ) {
-			result = document.createElement( "p" );
-			result.id = "qunit-testresult";
-			result.className = "result";
-			tests.parentNode.insertBefore( result, tests );
-			result.innerHTML = "Running...<br/>&nbsp;";
-		}
-	},
-
-	// Resets the test setup. Useful for tests that modify the DOM.
-	/*
-	DEPRECATED: Use multiple tests instead of resetting inside a test.
-	Use testStart or testDone for custom cleanup.
-	This method will throw an error in 2.0, and will be removed in 2.1
-	*/
-	reset: function() {
-		var fixture = id( "qunit-fixture" );
-		if ( fixture ) {
-			fixture.innerHTML = config.fixture;
-		}
-	},
-
-	// Trigger an event on an element.
-	// @example triggerEvent( document.body, "click" );
-	triggerEvent: function( elem, type, event ) {
-		if ( document.createEvent ) {
-			event = document.createEvent( "MouseEvents" );
-			event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
-				0, 0, 0, 0, 0, false, false, false, false, 0, null);
-
-			elem.dispatchEvent( event );
-		} else if ( elem.fireEvent ) {
-			elem.fireEvent( "on" + type );
-		}
-	},
-
-	// Safe object type checking
-	is: function( type, obj ) {
-		return QUnit.objectType( obj ) === type;
-	},
-
-	objectType: function( obj ) {
-		if ( typeof obj === "undefined" ) {
-				return "undefined";
-		// consider: typeof null === object
-		}
-		if ( obj === null ) {
-				return "null";
-		}
-
-		var match = toString.call( obj ).match(/^\[object\s(.*)\]$/),
-			type = match && match[1] || "";
-
-		switch ( type ) {
-			case "Number":
-				if ( isNaN(obj) ) {
-					return "nan";
-				}
-				return "number";
-			case "String":
-			case "Boolean":
-			case "Array":
-			case "Date":
-			case "RegExp":
-			case "Function":
-				return type.toLowerCase();
-		}
-		if ( typeof obj === "object" ) {
-			return "object";
-		}
-		return undefined;
-	},
-
-	push: function( result, actual, expected, message ) {
-		if ( !config.current ) {
-			throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
-		}
-
-		var output, source,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: result,
-				message: message,
-				actual: actual,
-				expected: expected
-			};
-
-		message = escapeText( message ) || ( result ? "okay" : "failed" );
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		if ( !result ) {
-			expected = escapeText( QUnit.jsDump.parse(expected) );
-			actual = escapeText( QUnit.jsDump.parse(actual) );
-			output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
-
-			if ( actual !== expected ) {
-				output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
-				output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
-			}
-
-			source = sourceFromStacktrace();
-
-			if ( source ) {
-				details.source = source;
-				output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-			}
-
-			output += "</table>";
-		}
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: !!result,
-			message: output
-		});
-	},
-
-	pushFailure: function( message, source, actual ) {
-		if ( !config.current ) {
-			throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
-		}
-
-		var output,
-			details = {
-				module: config.current.module,
-				name: config.current.testName,
-				result: false,
-				message: message
-			};
-
-		message = escapeText( message ) || "error";
-		message = "<span class='test-message'>" + message + "</span>";
-		output = message;
-
-		output += "<table>";
-
-		if ( actual ) {
-			output += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";
-		}
-
-		if ( source ) {
-			details.source = source;
-			output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";
-		}
-
-		output += "</table>";
-
-		runLoggingCallbacks( "log", QUnit, details );
-
-		config.current.assertions.push({
-			result: false,
-			message: output
-		});
-	},
-
-	url: function( params ) {
-		params = extend( extend( {}, QUnit.urlParams ), params );
-		var key,
-			querystring = "?";
-
-		for ( key in params ) {
-			if ( hasOwn.call( params, key ) ) {
-				querystring += encodeURIComponent( key ) + "=" +
-					encodeURIComponent( params[ key ] ) + "&";
-			}
-		}
-		return window.location.protocol + "//" + window.location.host +
-			window.location.pathname + querystring.slice( 0, -1 );
-	},
-
-	extend: extend,
-	id: id,
-	addEvent: addEvent,
-	addClass: addClass,
-	hasClass: hasClass,
-	removeClass: removeClass
-	// load, equiv, jsDump, diff: Attached later
-});
-
-/**
- * @deprecated: Created for backwards compatibility with test runner that set the hook function
- * into QUnit.{hook}, instead of invoking it and passing the hook function.
- * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
- * Doing this allows us to tell if the following methods have been overwritten on the actual
- * QUnit object.
- */
-extend( QUnit.constructor.prototype, {
-
-	// Logging callbacks; all receive a single argument with the listed properties
-	// run test/logs.html for any related changes
-	begin: registerLoggingCallback( "begin" ),
-
-	// done: { failed, passed, total, runtime }
-	done: registerLoggingCallback( "done" ),
-
-	// log: { result, actual, expected, message }
-	log: registerLoggingCallback( "log" ),
-
-	// testStart: { name }
-	testStart: registerLoggingCallback( "testStart" ),
-
-	// testDone: { name, failed, passed, total, duration }
-	testDone: registerLoggingCallback( "testDone" ),
-
-	// moduleStart: { name }
-	moduleStart: registerLoggingCallback( "moduleStart" ),
-
-	// moduleDone: { name, failed, passed, total }
-	moduleDone: registerLoggingCallback( "moduleDone" )
-});
-
-if ( typeof document === "undefined" || document.readyState === "complete" ) {
-	config.autorun = true;
-}
-
-QUnit.load = function() {
-	runLoggingCallbacks( "begin", QUnit, {} );
-
-	// Initialize the config, saving the execution queue
-	var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
-		urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,
-		numModules = 0,
-		moduleNames = [],
-		moduleFilterHtml = "",
-		urlConfigHtml = "",
-		oldconfig = extend( {}, config );
-
-	QUnit.init();
-	extend(config, oldconfig);
-
-	config.blocking = false;
-
-	len = config.urlConfig.length;
-
-	for ( i = 0; i < len; i++ ) {
-		val = config.urlConfig[i];
-		if ( typeof val === "string" ) {
-			val = {
-				id: val,
-				label: val,
-				tooltip: "[no tooltip available]"
-			};
-		}
-		config[ val.id ] = QUnit.urlParams[ val.id ];
-		urlConfigHtml += "<input id='qunit-urlconfig-" + escapeText( val.id ) +
-			"' name='" + escapeText( val.id ) +
-			"' type='checkbox'" + ( config[ val.id ] ? " checked='checked'" : "" ) +
-			" title='" + escapeText( val.tooltip ) +
-			"'><label for='qunit-urlconfig-" + escapeText( val.id ) +
-			"' title='" + escapeText( val.tooltip ) + "'>" + val.label + "</label>";
-	}
-	for ( i in config.modules ) {
-		if ( config.modules.hasOwnProperty( i ) ) {
-			moduleNames.push(i);
-		}
-	}
-	numModules = moduleNames.length;
-	moduleNames.sort( function( a, b ) {
-		return a.localeCompare( b );
-	});
-	moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-		( config.module === undefined  ? "selected='selected'" : "" ) +
-		">< All Modules ></option>";
-
-
-	for ( i = 0; i < numModules; i++) {
-			moduleFilterHtml += "<option value='" + escapeText( encodeURIComponent(moduleNames[i]) ) + "' " +
-				( config.module === moduleNames[i] ? "selected='selected'" : "" ) +
-				">" + escapeText(moduleNames[i]) + "</option>";
-	}
-	moduleFilterHtml += "</select>";
-
-	// `userAgent` initialized at top of scope
-	userAgent = id( "qunit-userAgent" );
-	if ( userAgent ) {
-		userAgent.innerHTML = navigator.userAgent;
-	}
-
-	// `banner` initialized at top of scope
-	banner = id( "qunit-header" );
-	if ( banner ) {
-		banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "'>" + banner.innerHTML + "</a> ";
-	}
-
-	// `toolbar` initialized at top of scope
-	toolbar = id( "qunit-testrunner-toolbar" );
-	if ( toolbar ) {
-		// `filter` initialized at top of scope
-		filter = document.createElement( "input" );
-		filter.type = "checkbox";
-		filter.id = "qunit-filter-pass";
-
-		addEvent( filter, "click", function() {
-			var tmp,
-				ol = document.getElementById( "qunit-tests" );
-
-			if ( filter.checked ) {
-				ol.className = ol.className + " hidepass";
-			} else {
-				tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-				ol.className = tmp.replace( / hidepass /, " " );
-			}
-			if ( defined.sessionStorage ) {
-				if (filter.checked) {
-					sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
-				} else {
-					sessionStorage.removeItem( "qunit-filter-passed-tests" );
-				}
-			}
-		});
-
-		if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
-			filter.checked = true;
-			// `ol` initialized at top of scope
-			ol = document.getElementById( "qunit-tests" );
-			ol.className = ol.className + " hidepass";
-		}
-		toolbar.appendChild( filter );
-
-		// `label` initialized at top of scope
-		label = document.createElement( "label" );
-		label.setAttribute( "for", "qunit-filter-pass" );
-		label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );
-		label.innerHTML = "Hide passed tests";
-		toolbar.appendChild( label );
-
-		urlConfigCheckboxesContainer = document.createElement("span");
-		urlConfigCheckboxesContainer.innerHTML = urlConfigHtml;
-		urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input");
-		// For oldIE support:
-		// * Add handlers to the individual elements instead of the container
-		// * Use "click" instead of "change"
-		// * Fallback from event.target to event.srcElement
-		addEvents( urlConfigCheckboxes, "click", function( event ) {
-			var params = {},
-				target = event.target || event.srcElement;
-			params[ target.name ] = target.checked ? true : undefined;
-			window.location = QUnit.url( params );
-		});
-		toolbar.appendChild( urlConfigCheckboxesContainer );
-
-		if (numModules > 1) {
-			moduleFilter = document.createElement( "span" );
-			moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-			moduleFilter.innerHTML = moduleFilterHtml;
-			addEvent( moduleFilter.lastChild, "change", function() {
-				var selectBox = moduleFilter.getElementsByTagName("select")[0],
-					selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);
-
-				window.location = QUnit.url({
-					module: ( selectedModule === "" ) ? undefined : selectedModule,
-					// Remove any existing filters
-					filter: undefined,
-					testNumber: undefined
-				});
-			});
-			toolbar.appendChild(moduleFilter);
-		}
-	}
-
-	// `main` initialized at top of scope
-	main = id( "qunit-fixture" );
-	if ( main ) {
-		config.fixture = main.innerHTML;
-	}
-
-	if ( config.autostart ) {
-		QUnit.start();
-	}
-};
-
-addEvent( window, "load", QUnit.load );
-
-// `onErrorFnPrev` initialized at top of scope
-// Preserve other handlers
-onErrorFnPrev = window.onerror;
-
-// Cover uncaught exceptions
-// Returning true will suppress the default browser handler,
-// returning false will let it run.
-window.onerror = function ( error, filePath, linerNr ) {
-	var ret = false;
-	if ( onErrorFnPrev ) {
-		ret = onErrorFnPrev( error, filePath, linerNr );
-	}
-
-	// Treat return value as window.onerror itself does,
-	// Only do our handling if not suppressed.
-	if ( ret !== true ) {
-		if ( QUnit.config.current ) {
-			if ( QUnit.config.current.ignoreGlobalErrors ) {
-				return true;
-			}
-			QUnit.pushFailure( error, filePath + ":" + linerNr );
-		} else {
-			QUnit.test( "global failure", extend( function() {
-				QUnit.pushFailure( error, filePath + ":" + linerNr );
-			}, { validTest: validTest } ) );
-		}
-		return false;
-	}
-
-	return ret;
-};
-
-function done() {
-	config.autorun = true;
-
-	// Log the last module results
-	if ( config.currentModule ) {
-		runLoggingCallbacks( "moduleDone", QUnit, {
-			name: config.currentModule,
-			failed: config.moduleStats.bad,
-			passed: config.moduleStats.all - config.moduleStats.bad,
-			total: config.moduleStats.all
-		});
-	}
-	delete config.previousModule;
-
-	var i, key,
-		banner = id( "qunit-banner" ),
-		tests = id( "qunit-tests" ),
-		runtime = +new Date() - config.started,
-		passed = config.stats.all - config.stats.bad,
-		html = [
-			"Tests completed in ",
-			runtime,
-			" milliseconds.<br/>",
-			"<span class='passed'>",
-			passed,
-			"</span> assertions of <span class='total'>",
-			config.stats.all,
-			"</span> passed, <span class='failed'>",
-			config.stats.bad,
-			"</span> failed."
-		].join( "" );
-
-	if ( banner ) {
-		banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
-	}
-
-	if ( tests ) {
-		id( "qunit-testresult" ).innerHTML = html;
-	}
-
-	if ( config.altertitle && typeof document !== "undefined" && document.title ) {
-		// show ✖ for good, ✔ for bad suite result in title
-		// use escape sequences in case file gets loaded with non-utf-8-charset
-		document.title = [
-			( config.stats.bad ? "\u2716" : "\u2714" ),
-			document.title.replace( /^[\u2714\u2716] /i, "" )
-		].join( " " );
-	}
-
-	// clear own sessionStorage items if all tests passed
-	if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-		// `key` & `i` initialized at top of scope
-		for ( i = 0; i < sessionStorage.length; i++ ) {
-			key = sessionStorage.key( i++ );
-			if ( key.indexOf( "qunit-test-" ) === 0 ) {
-				sessionStorage.removeItem( key );
-			}
-		}
-	}
-
-	// scroll back to top to show results
-	if ( window.scrollTo ) {
-		window.scrollTo(0, 0);
-	}
-
-	runLoggingCallbacks( "done", QUnit, {
-		failed: config.stats.bad,
-		passed: passed,
-		total: config.stats.all,
-		runtime: runtime
-	});
-}
-
-/** @return Boolean: true if this test should be ran */
-function validTest( test ) {
-	var include,
-		filter = config.filter && config.filter.toLowerCase(),
-		module = config.module && config.module.toLowerCase(),
-		fullName = (test.module + ": " + test.testName).toLowerCase();
-
-	// Internally-generated tests are always valid
-	if ( test.callback && test.callback.validTest === validTest ) {
-		delete test.callback.validTest;
-		return true;
-	}
-
-	if ( config.testNumber ) {
-		return test.testNumber === config.testNumber;
-	}
-
-	if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {
-		return false;
-	}
-
-	if ( !filter ) {
-		return true;
-	}
-
-	include = filter.charAt( 0 ) !== "!";
-	if ( !include ) {
-		filter = filter.slice( 1 );
-	}
-
-	// If the filter matches, we need to honour include
-	if ( fullName.indexOf( filter ) !== -1 ) {
-		return include;
-	}
-
-	// Otherwise, do the opposite
-	return !include;
-}
-
-// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
-// Later Safari and IE10 are supposed to support error.stack as well
-// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
-function extractStacktrace( e, offset ) {
-	offset = offset === undefined ? 3 : offset;
-
-	var stack, include, i;
-
-	if ( e.stacktrace ) {
-		// Opera
-		return e.stacktrace.split( "\n" )[ offset + 3 ];
-	} else if ( e.stack ) {
-		// Firefox, Chrome
-		stack = e.stack.split( "\n" );
-		if (/^error$/i.test( stack[0] ) ) {
-			stack.shift();
-		}
-		if ( fileName ) {
-			include = [];
-			for ( i = offset; i < stack.length; i++ ) {
-				if ( stack[ i ].indexOf( fileName ) !== -1 ) {
-					break;
-				}
-				include.push( stack[ i ] );
-			}
-			if ( include.length ) {
-				return include.join( "\n" );
-			}
-		}
-		return stack[ offset ];
-	} else if ( e.sourceURL ) {
-		// Safari, PhantomJS
-		// hopefully one day Safari provides actual stacktraces
-		// exclude useless self-reference for generated Error objects
-		if ( /qunit.js$/.test( e.sourceURL ) ) {
-			return;
-		}
-		// for actual exceptions, this is useful
-		return e.sourceURL + ":" + e.line;
-	}
-}
-function sourceFromStacktrace( offset ) {
-	try {
-		throw new Error();
-	} catch ( e ) {
-		return extractStacktrace( e, offset );
-	}
-}
-
-/**
- * Escape text for attribute or text content.
- */
-function escapeText( s ) {
-	if ( !s ) {
-		return "";
-	}
-	s = s + "";
-	// Both single quotes and double quotes (for attributes)
-	return s.replace( /['"<>&]/g, function( s ) {
-		switch( s ) {
-			case "'":
-				return "&#039;";
-			case "\"":
-				return "&quot;";
-			case "<":
-				return "&lt;";
-			case ">":
-				return "&gt;";
-			case "&":
-				return "&amp;";
-		}
-	});
-}
-
-function synchronize( callback, last ) {
-	config.queue.push( callback );
-
-	if ( config.autorun && !config.blocking ) {
-		process( last );
-	}
-}
-
-function process( last ) {
-	function next() {
-		process( last );
-	}
-	var start = new Date().getTime();
-	config.depth = config.depth ? config.depth + 1 : 1;
-
-	while ( config.queue.length && !config.blocking ) {
-		if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {
-			config.queue.shift()();
-		} else {
-			setTimeout( next, 13 );
-			break;
-		}
-	}
-	config.depth--;
-	if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {
-		done();
-	}
-}
-
-function saveGlobal() {
-	config.pollution = [];
-
-	if ( config.noglobals ) {
-		for ( var key in window ) {
-			if ( hasOwn.call( window, key ) ) {
-				// in Opera sometimes DOM element ids show up here, ignore them
-				if ( /^qunit-test-output/.test( key ) ) {
-					continue;
-				}
-				config.pollution.push( key );
-			}
-		}
-	}
-}
-
-function checkPollution() {
-	var newGlobals,
-		deletedGlobals,
-		old = config.pollution;
-
-	saveGlobal();
-
-	newGlobals = diff( config.pollution, old );
-	if ( newGlobals.length > 0 ) {
-		QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
-	}
-
-	deletedGlobals = diff( old, config.pollution );
-	if ( deletedGlobals.length > 0 ) {
-		QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
-	}
-}
-
-// returns a new Array with the elements that are in a but not in b
-function diff( a, b ) {
-	var i, j,
-		result = a.slice();
-
-	for ( i = 0; i < result.length; i++ ) {
-		for ( j = 0; j < b.length; j++ ) {
-			if ( result[i] === b[j] ) {
-				result.splice( i, 1 );
-				i--;
-				break;
-			}
-		}
-	}
-	return result;
-}
-
-function extend( a, b ) {
-	for ( var prop in b ) {
-		if ( hasOwn.call( b, prop ) ) {
-			// Avoid "Member not found" error in IE8 caused by messing with window.constructor
-			if ( !( prop === "constructor" && a === window ) ) {
-				if ( b[ prop ] === undefined ) {
-					delete a[ prop ];
-				} else {
-					a[ prop ] = b[ prop ];
-				}
-			}
-		}
-	}
-
-	return a;
-}
-
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-	// Standards-based browsers
-	if ( elem.addEventListener ) {
-		elem.addEventListener( type, fn, false );
-	// IE
-	} else {
-		elem.attachEvent( "on" + type, fn );
-	}
-}
-
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-	var i = elems.length;
-	while ( i-- ) {
-		addEvent( elems[i], type, fn );
-	}
-}
-
-function hasClass( elem, name ) {
-	return (" " + elem.className + " ").indexOf(" " + name + " ") > -1;
-}
-
-function addClass( elem, name ) {
-	if ( !hasClass( elem, name ) ) {
-		elem.className += (elem.className ? " " : "") + name;
-	}
-}
-
-function removeClass( elem, name ) {
-	var set = " " + elem.className + " ";
-	// Class name may appear multiple times
-	while ( set.indexOf(" " + name + " ") > -1 ) {
-		set = set.replace(" " + name + " " , " ");
-	}
-	// If possible, trim it for prettiness, but not necessarily
-	elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
-}
-
-function id( name ) {
-	return !!( typeof document !== "undefined" && document && document.getElementById ) &&
-		document.getElementById( name );
-}
-
-function registerLoggingCallback( key ) {
-	return function( callback ) {
-		config[key].push( callback );
-	};
-}
-
-// Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks( key, scope, args ) {
-	var i, callbacks;
-	if ( QUnit.hasOwnProperty( key ) ) {
-		QUnit[ key ].call(scope, args );
-	} else {
-		callbacks = config[ key ];
-		for ( i = 0; i < callbacks.length; i++ ) {
-			callbacks[ i ].call( scope, args );
-		}
-	}
-}
-
-// Test for equality any JavaScript type.
-// Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
-
-	// Call the o related callback with the given arguments.
-	function bindCallbacks( o, callbacks, args ) {
-		var prop = QUnit.objectType( o );
-		if ( prop ) {
-			if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
-				return callbacks[ prop ].apply( callbacks, args );
-			} else {
-				return callbacks[ prop ]; // or undefined
-			}
-		}
-	}
-
-	// the real equiv function
-	var innerEquiv,
-		// stack to decide between skip/abort functions
-		callers = [],
-		// stack to avoiding loops from circular referencing
-		parents = [],
-		parentsB = [],
-
-		getProto = Object.getPrototypeOf || function ( obj ) {
-			/*jshint camelcase:false */
-			return obj.__proto__;
-		},
-		callbacks = (function () {
-
-			// for string, boolean, number and null
-			function useStrictEquality( b, a ) {
-				/*jshint eqeqeq:false */
-				if ( b instanceof a.constructor || a instanceof b.constructor ) {
-					// to catch short annotation VS 'new' annotation of a
-					// declaration
-					// e.g. var i = 1;
-					// var j = new Number(1);
-					return a == b;
-				} else {
-					return a === b;
-				}
-			}
-
-			return {
-				"string": useStrictEquality,
-				"boolean": useStrictEquality,
-				"number": useStrictEquality,
-				"null": useStrictEquality,
-				"undefined": useStrictEquality,
-
-				"nan": function( b ) {
-					return isNaN( b );
-				},
-
-				"date": function( b, a ) {
-					return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
-				},
-
-				"regexp": function( b, a ) {
-					return QUnit.objectType( b ) === "regexp" &&
-						// the regex itself
-						a.source === b.source &&
-						// and its modifiers
-						a.global === b.global &&
-						// (gmi) ...
-						a.ignoreCase === b.ignoreCase &&
-						a.multiline === b.multiline &&
-						a.sticky === b.sticky;
-				},
-
-				// - skip when the property is a method of an instance (OOP)
-				// - abort otherwise,
-				// initial === would have catch identical references anyway
-				"function": function() {
-					var caller = callers[callers.length - 1];
-					return caller !== Object && typeof caller !== "undefined";
-				},
-
-				"array": function( b, a ) {
-					var i, j, len, loop, aCircular, bCircular;
-
-					// b could be an object literal here
-					if ( QUnit.objectType( b ) !== "array" ) {
-						return false;
-					}
-
-					len = a.length;
-					if ( len !== b.length ) {
-						// safe and faster
-						return false;
-					}
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-					for ( i = 0; i < len; i++ ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									parents.pop();
-									parentsB.pop();
-									return false;
-								}
-							}
-						}
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							parents.pop();
-							parentsB.pop();
-							return false;
-						}
-					}
-					parents.pop();
-					parentsB.pop();
-					return true;
-				},
-
-				"object": function( b, a ) {
-					/*jshint forin:false */
-					var i, j, loop, aCircular, bCircular,
-						// Default to true
-						eq = true,
-						aProperties = [],
-						bProperties = [];
-
-					// comparing constructors is more strict than using
-					// instanceof
-					if ( a.constructor !== b.constructor ) {
-						// Allow objects with no prototype to be equivalent to
-						// objects with Object as their constructor.
-						if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
-							( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
-								return false;
-						}
-					}
-
-					// stack constructor before traversing properties
-					callers.push( a.constructor );
-
-					// track reference to avoid circular references
-					parents.push( a );
-					parentsB.push( b );
-
-					// be strict: don't ensure hasOwnProperty and go deep
-					for ( i in a ) {
-						loop = false;
-						for ( j = 0; j < parents.length; j++ ) {
-							aCircular = parents[j] === a[i];
-							bCircular = parentsB[j] === b[i];
-							if ( aCircular || bCircular ) {
-								if ( a[i] === b[i] || aCircular && bCircular ) {
-									loop = true;
-								} else {
-									eq = false;
-									break;
-								}
-							}
-						}
-						aProperties.push(i);
-						if ( !loop && !innerEquiv(a[i], b[i]) ) {
-							eq = false;
-							break;
-						}
-					}
-
-					parents.pop();
-					parentsB.pop();
-					callers.pop(); // unstack, we are done
-
-					for ( i in b ) {
-						bProperties.push( i ); // collect b's properties
-					}
-
-					// Ensures identical properties name
-					return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
-				}
-			};
-		}());
-
-	innerEquiv = function() { // can take multiple arguments
-		var args = [].slice.apply( arguments );
-		if ( args.length < 2 ) {
-			return true; // end transition
-		}
-
-		return (function( a, b ) {
-			if ( a === b ) {
-				return true; // catch the most you can
-			} else if ( a === null || b === null || typeof a === "undefined" ||
-					typeof b === "undefined" ||
-					QUnit.objectType(a) !== QUnit.objectType(b) ) {
-				return false; // don't lose time with error prone cases
-			} else {
-				return bindCallbacks(a, callbacks, [ b, a ]);
-			}
-
-			// apply transition with (1..n) arguments
-		}( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );
-	};
-
-	return innerEquiv;
-}());
-
-/**
- * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
- * http://flesler.blogspot.com Licensed under BSD
- * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
- *
- * @projectDescription Advanced and extensible data dumping for Javascript.
- * @version 1.0.0
- * @author Ariel Flesler
- * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
- */
-QUnit.jsDump = (function() {
-	function quote( str ) {
-		return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\"";
-	}
-	function literal( o ) {
-		return o + "";
-	}
-	function join( pre, arr, post ) {
-		var s = jsDump.separator(),
-			base = jsDump.indent(),
-			inner = jsDump.indent(1);
-		if ( arr.join ) {
-			arr = arr.join( "," + s + inner );
-		}
-		if ( !arr ) {
-			return pre + post;
-		}
-		return [ pre, inner + arr, base + post ].join(s);
-	}
-	function array( arr, stack ) {
-		var i = arr.length, ret = new Array(i);
-		this.up();
-		while ( i-- ) {
-			ret[i] = this.parse( arr[i] , undefined , stack);
-		}
-		this.down();
-		return join( "[", ret, "]" );
-	}
-
-	var reName = /^function (\w+)/,
-		jsDump = {
-			// type is used mostly internally, you can fix a (custom)type in advance
-			parse: function( obj, type, stack ) {
-				stack = stack || [ ];
-				var inStack, res,
-					parser = this.parsers[ type || this.typeOf(obj) ];
-
-				type = typeof parser;
-				inStack = inArray( obj, stack );
-
-				if ( inStack !== -1 ) {
-					return "recursion(" + (inStack - stack.length) + ")";
-				}
-				if ( type === "function" )  {
-					stack.push( obj );
-					res = parser.call( this, obj, stack );
-					stack.pop();
-					return res;
-				}
-				return ( type === "string" ) ? parser : this.parsers.error;
-			},
-			typeOf: function( obj ) {
-				var type;
-				if ( obj === null ) {
-					type = "null";
-				} else if ( typeof obj === "undefined" ) {
-					type = "undefined";
-				} else if ( QUnit.is( "regexp", obj) ) {
-					type = "regexp";
-				} else if ( QUnit.is( "date", obj) ) {
-					type = "date";
-				} else if ( QUnit.is( "function", obj) ) {
-					type = "function";
-				} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
-					type = "window";
-				} else if ( obj.nodeType === 9 ) {
-					type = "document";
-				} else if ( obj.nodeType ) {
-					type = "node";
-				} else if (
-					// native arrays
-					toString.call( obj ) === "[object Array]" ||
-					// NodeList objects
-					( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-				) {
-					type = "array";
-				} else if ( obj.constructor === Error.prototype.constructor ) {
-					type = "error";
-				} else {
-					type = typeof obj;
-				}
-				return type;
-			},
-			separator: function() {
-				return this.multiline ?	this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
-			},
-			// extra can be a number, shortcut for increasing-calling-decreasing
-			indent: function( extra ) {
-				if ( !this.multiline ) {
-					return "";
-				}
-				var chr = this.indentChar;
-				if ( this.HTML ) {
-					chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
-				}
-				return new Array( this.depth + ( extra || 0 ) ).join(chr);
-			},
-			up: function( a ) {
-				this.depth += a || 1;
-			},
-			down: function( a ) {
-				this.depth -= a || 1;
-			},
-			setParser: function( name, parser ) {
-				this.parsers[name] = parser;
-			},
-			// The next 3 are exposed so you can use them
-			quote: quote,
-			literal: literal,
-			join: join,
-			//
-			depth: 1,
-			// This is the list of parsers, to modify them, use jsDump.setParser
-			parsers: {
-				window: "[Window]",
-				document: "[Document]",
-				error: function(error) {
-					return "Error(\"" + error.message + "\")";
-				},
-				unknown: "[Unknown]",
-				"null": "null",
-				"undefined": "undefined",
-				"function": function( fn ) {
-					var ret = "function",
-						// functions never have name in IE
-						name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
-
-					if ( name ) {
-						ret += " " + name;
-					}
-					ret += "( ";
-
-					ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
-					return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
-				},
-				array: array,
-				nodelist: array,
-				"arguments": array,
-				object: function( map, stack ) {
-					/*jshint forin:false */
-					var ret = [ ], keys, key, val, i;
-					QUnit.jsDump.up();
-					keys = [];
-					for ( key in map ) {
-						keys.push( key );
-					}
-					keys.sort();
-					for ( i = 0; i < keys.length; i++ ) {
-						key = keys[ i ];
-						val = map[ key ];
-						ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
-					}
-					QUnit.jsDump.down();
-					return join( "{", ret, "}" );
-				},
-				node: function( node ) {
-					var len, i, val,
-						open = QUnit.jsDump.HTML ? "&lt;" : "<",
-						close = QUnit.jsDump.HTML ? "&gt;" : ">",
-						tag = node.nodeName.toLowerCase(),
-						ret = open + tag,
-						attrs = node.attributes;
-
-					if ( attrs ) {
-						for ( i = 0, len = attrs.length; i < len; i++ ) {
-							val = attrs[i].nodeValue;
-							// IE6 includes all attributes in .attributes, even ones not explicitly set.
-							// Those have values like undefined, null, 0, false, "" or "inherit".
-							if ( val && val !== "inherit" ) {
-								ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );
-							}
-						}
-					}
-					ret += close;
-
-					// Show content of TextNode or CDATASection
-					if ( node.nodeType === 3 || node.nodeType === 4 ) {
-						ret += node.nodeValue;
-					}
-
-					return ret + open + "/" + tag + close;
-				},
-				// function calls it internally, it's the arguments part of the function
-				functionArgs: function( fn ) {
-					var args,
-						l = fn.length;
-
-					if ( !l ) {
-						return "";
-					}
-
-					args = new Array(l);
-					while ( l-- ) {
-						// 97 is 'a'
-						args[l] = String.fromCharCode(97+l);
-					}
-					return " " + args.join( ", " ) + " ";
-				},
-				// object calls it internally, the key part of an item in a map
-				key: quote,
-				// function calls it internally, it's the content of the function
-				functionCode: "[code]",
-				// node calls it internally, it's an html attribute value
-				attribute: quote,
-				string: quote,
-				date: quote,
-				regexp: literal,
-				number: literal,
-				"boolean": literal
-			},
-			// if true, entities are escaped ( <, >, \t, space and \n )
-			HTML: false,
-			// indentation unit
-			indentChar: "  ",
-			// if true, items in a collection, are separated by a \n, else just a space.
-			multiline: true
-		};
-
-	return jsDump;
-}());
-
-// from jquery.js
-function inArray( elem, array ) {
-	if ( array.indexOf ) {
-		return array.indexOf( elem );
-	}
-
-	for ( var i = 0, length = array.length; i < length; i++ ) {
-		if ( array[ i ] === elem ) {
-			return i;
-		}
-	}
-
-	return -1;
-}
-
-/*
- * Javascript Diff Algorithm
- *  By John Resig (http://ejohn.org/)
- *  Modified by Chu Alan "sprite"
- *
- * Released under the MIT license.
- *
- * More Info:
- *  http://ejohn.org/projects/javascript-diff-algorithm/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
- */
-QUnit.diff = (function() {
-	/*jshint eqeqeq:false, eqnull:true */
-	function diff( o, n ) {
-		var i,
-			ns = {},
-			os = {};
-
-		for ( i = 0; i < n.length; i++ ) {
-			if ( !hasOwn.call( ns, n[i] ) ) {
-				ns[ n[i] ] = {
-					rows: [],
-					o: null
-				};
-			}
-			ns[ n[i] ].rows.push( i );
-		}
-
-		for ( i = 0; i < o.length; i++ ) {
-			if ( !hasOwn.call( os, o[i] ) ) {
-				os[ o[i] ] = {
-					rows: [],
-					n: null
-				};
-			}
-			os[ o[i] ].rows.push( i );
-		}
-
-		for ( i in ns ) {
-			if ( hasOwn.call( ns, i ) ) {
-				if ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {
-					n[ ns[i].rows[0] ] = {
-						text: n[ ns[i].rows[0] ],
-						row: os[i].rows[0]
-					};
-					o[ os[i].rows[0] ] = {
-						text: o[ os[i].rows[0] ],
-						row: ns[i].rows[0]
-					};
-				}
-			}
-		}
-
-		for ( i = 0; i < n.length - 1; i++ ) {
-			if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
-						n[ i + 1 ] == o[ n[i].row + 1 ] ) {
-
-				n[ i + 1 ] = {
-					text: n[ i + 1 ],
-					row: n[i].row + 1
-				};
-				o[ n[i].row + 1 ] = {
-					text: o[ n[i].row + 1 ],
-					row: i + 1
-				};
-			}
-		}
-
-		for ( i = n.length - 1; i > 0; i-- ) {
-			if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
-						n[ i - 1 ] == o[ n[i].row - 1 ]) {
-
-				n[ i - 1 ] = {
-					text: n[ i - 1 ],
-					row: n[i].row - 1
-				};
-				o[ n[i].row - 1 ] = {
-					text: o[ n[i].row - 1 ],
-					row: i - 1
-				};
-			}
-		}
-
-		return {
-			o: o,
-			n: n
-		};
-	}
-
-	return function( o, n ) {
-		o = o.replace( /\s+$/, "" );
-		n = n.replace( /\s+$/, "" );
-
-		var i, pre,
-			str = "",
-			out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
-			oSpace = o.match(/\s+/g),
-			nSpace = n.match(/\s+/g);
-
-		if ( oSpace == null ) {
-			oSpace = [ " " ];
-		}
-		else {
-			oSpace.push( " " );
-		}
-
-		if ( nSpace == null ) {
-			nSpace = [ " " ];
-		}
-		else {
-			nSpace.push( " " );
-		}
-
-		if ( out.n.length === 0 ) {
-			for ( i = 0; i < out.o.length; i++ ) {
-				str += "<del>" + out.o[i] + oSpace[i] + "</del>";
-			}
-		}
-		else {
-			if ( out.n[0].text == null ) {
-				for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
-					str += "<del>" + out.o[n] + oSpace[n] + "</del>";
-				}
-			}
-
-			for ( i = 0; i < out.n.length; i++ ) {
-				if (out.n[i].text == null) {
-					str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
-				}
-				else {
-					// `pre` initialized at top of scope
-					pre = "";
-
-					for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
-						pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
-					}
-					str += " " + out.n[i].text + nSpace[i] + pre;
-				}
-			}
-		}
-
-		return str;
-	};
-}());
-
-// for CommonJS environments, export everything
-if ( typeof exports !== "undefined" ) {
-	extend( exports, QUnit.constructor.prototype );
-}
-
-// get at whatever the global object is, like window in browsers
-}( (function() {return this;}.call()) ));
diff --git a/docs/slides/plpv14/reveal.js/test/test-markdown-element-attributes.js b/docs/slides/plpv14/reveal.js/test/test-markdown-element-attributes.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/test/test-markdown-element-attributes.js
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 4, 'found four slides' );
-	});
-
-
-	test( 'Attributes on element header in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.fade-out' ).length, 1, 'found one vertical slide with class fragment.fade-out on header' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.shrink' ).length, 1, 'found one vertical slide with class fragment.shrink on header' );
-	});
-
-	test( 'Attributes on element paragraphs in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section p.fragment.grow' ).length, 2, 'found a vertical slide with two paragraphs with class fragment.grow' );
-	});
-
-	test( 'Attributes on element list items in vertical slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section>section li.fragment.roll-in' ).length, 3, 'found a vertical slide with three list items with class fragment.roll-in' );
-	});
-
-	test( 'Attributes on element paragraphs in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-red' ).length, 4, 'found a horizontal slide with four paragraphs with class fragment.grow' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section li.fragment.highlight-green' ).length, 5, 'found a horizontal slide with five list items with class fragment.roll-in' );
-	});
-	test( 'Attributes on element list items in horizontal slides', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section img.reveal.stretch' ).length, 1, 'found a horizontal slide with stretched image, class img.reveal.stretch' );
-	});
-
-	test( 'Attributes on elements in vertical slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section h2.fragment.highlight-red' ).length, 2, 'found two h2 titles with fragment highlight-red in vertical slides with default element attribute separator' );
-	});
-
-	test( 'Attributes on elements in single slides with default element attribute separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-blue' ).length, 3, 'found three elements with fragment highlight-blue in single slide with default element attribute separator' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/plpv14/reveal.js/test/test-markdown-slide-attributes.js b/docs/slides/plpv14/reveal.js/test/test-markdown-slide-attributes.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/test/test-markdown-slide-attributes.js
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 6, 'found six vertical slides' );
-	});
-
-	test( 'Id on slide', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section#slide2' ).length, 1, 'found one slide with id slide2' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, 'found one slide with a link to slide2' );
-	});
-
-	test( 'data-background attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-background attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' );
-	});
-
-	test( 'data-transition attributes with default separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' );
-	});
-
-	test( 'data-transition attributes with inline content', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' );
-	});
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/plpv14/reveal.js/test/test-markdown.js b/docs/slides/plpv14/reveal.js/test/test-markdown.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/test/test-markdown.js
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	QUnit.module( 'Markdown' );
-
-	test( 'Vertical separator', function() {
-		strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/plpv14/reveal.js/test/test.js b/docs/slides/plpv14/reveal.js/test/test.js
deleted file mode 100644
--- a/docs/slides/plpv14/reveal.js/test/test.js
+++ /dev/null
@@ -1,438 +0,0 @@
-
-// These tests expect the DOM to contain a presentation
-// with the following slide structure:
-//
-// 1
-// 2 - Three sub-slides
-// 3 - Three fragment elements
-// 3 - Two fragments with same data-fragment-index
-// 4
-
-
-Reveal.addEventListener( 'ready', function() {
-
-	// ---------------------------------------------------------------
-	// DOM TESTS
-
-	QUnit.module( 'DOM' );
-
-	test( 'Initial slides classes', function() {
-		var horizontalSlides = document.querySelectorAll( '.reveal .slides>section' )
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.past' ).length, 0, 'no .past slides' );
-		strictEqual( document.querySelectorAll( '.reveal .slides section.present' ).length, 1, 'one .present slide' );
-		strictEqual( document.querySelectorAll( '.reveal .slides>section.future' ).length, horizontalSlides.length - 1, 'remaining horizontal slides are .future' );
-
-		strictEqual( document.querySelectorAll( '.reveal .slides section.stack' ).length, 2, 'two .stacks' );
-
-		ok( document.querySelectorAll( '.reveal .slides section.stack' )[0].querySelectorAll( '.future' ).length > 0, 'vertical slides are given .future' );
-	});
-
-	// ---------------------------------------------------------------
-	// API TESTS
-
-	QUnit.module( 'API' );
-
-	test( 'Reveal.isReady', function() {
-		strictEqual( Reveal.isReady(), true, 'returns true' );
-	});
-
-	test( 'Reveal.isOverview', function() {
-		strictEqual( Reveal.isOverview(), false, 'false by default' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), true, 'true after toggling on' );
-
-		Reveal.toggleOverview();
-		strictEqual( Reveal.isOverview(), false, 'false after toggling off' );
-	});
-
-	test( 'Reveal.isPaused', function() {
-		strictEqual( Reveal.isPaused(), false, 'false by default' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), true, 'true after pausing' );
-
-		Reveal.togglePause();
-		strictEqual( Reveal.isPaused(), false, 'false after resuming' );
-	});
-
-	test( 'Reveal.isFirstSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-
-		Reveal.slide( 1, 0 );
-		strictEqual( Reveal.isFirstSlide(), false, 'false after Reveal.slide( 1, 0 )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.isLastSlide', function() {
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-
-		var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1;
-
-		Reveal.slide( lastSlideIndex, 0 );
-		strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( ', 0+ lastSlideIndex +' )' );
-
-		Reveal.slide( 0, 0 );
-		strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' );
-	});
-
-	test( 'Reveal.getIndices', function() {
-		var indices = Reveal.getIndices();
-
-		ok( typeof indices.hasOwnProperty( 'h' ), 'h exists' );
-		ok( typeof indices.hasOwnProperty( 'v' ), 'v exists' );
-		ok( typeof indices.hasOwnProperty( 'f' ), 'f exists' );
-
-		Reveal.slide( 1, 0 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 0, 'h 1, v 0' );
-
-		Reveal.slide( 1, 2 );
-		ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 2, 'h 1, v 2' );
-
-		Reveal.slide( 0, 0 );
-	});
-
-	test( 'Reveal.getSlide', function() {
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-
-		equal( Reveal.getSlide( 0 ), firstSlide, 'gets correct first slide' );
-
-		strictEqual( Reveal.getSlide( 100 ), undefined, 'returns undefined when slide can\'t be found' );
-	});
-
-	test( 'Reveal.getPreviousSlide/getCurrentSlide', function() {
-		Reveal.slide( 0, 0 );
-		Reveal.slide( 1, 0 );
-
-		var firstSlide = document.querySelector( '.reveal .slides>section:first-child' );
-		var secondSlide = document.querySelector( '.reveal .slides>section:nth-child(2)>section' );
-
-		equal( Reveal.getPreviousSlide(), firstSlide, 'previous is slide #0' );
-		equal( Reveal.getCurrentSlide(), secondSlide, 'current is slide #1' );
-	});
-
-	test( 'Reveal.getScale', function() {
-		ok( typeof Reveal.getScale() === 'number', 'has scale' );
-	});
-
-	test( 'Reveal.getConfig', function() {
-		ok( typeof Reveal.getConfig() === 'object', 'has config' );
-	});
-
-	test( 'Reveal.configure', function() {
-		strictEqual( Reveal.getConfig().loop, false, '"loop" is false to start with' );
-
-		Reveal.configure({ loop: true });
-		strictEqual( Reveal.getConfig().loop, true, '"loop" has changed to true' );
-
-		Reveal.configure({ loop: false, customTestValue: 1 });
-		strictEqual( Reveal.getConfig().customTestValue, 1, 'supports custom values' );
-	});
-
-	test( 'Reveal.availableRoutes', function() {
-		Reveal.slide( 0, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: false, up: false, down: false, right: true }, 'correct for first slide' );
-
-		Reveal.slide( 1, 0 );
-		deepEqual( Reveal.availableRoutes(), { left: true, up: false, down: true, right: true }, 'correct for vertical slide' );
-	});
-
-	test( 'Reveal.next', function() {
-		Reveal.slide( 0, 0 );
-
-		// Step through vertical child slides
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 1, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 1, v: 2, f: undefined } );
-
-		// Step through fragments
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 } );
-	});
-
-	test( 'Reveal.next at end', function() {
-		Reveal.slide( 3 );
-
-		// We're at the end, this should have no effect
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 3, v: 0, f: undefined } );
-	});
-
-
-	// ---------------------------------------------------------------
-	// FRAGMENT TESTS
-
-	QUnit.module( 'Fragments' );
-
-	test( 'Sliding to fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: -1 }, 'Reveal.slide( 2, 0, -1 )' );
-
-		Reveal.slide( 2, 0, 0 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'Reveal.slide( 2, 0, 0 )' );
-
-		Reveal.slide( 2, 0, 2 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'Reveal.slide( 2, 0, 2 )' );
-
-		Reveal.slide( 2, 0, 1 );
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'Reveal.slide( 2, 0, 1 )' );
-	});
-
-	test( 'Hiding all fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 1, 'one fragment visible when index is 0' );
-
-		Reveal.slide( 2, 0, -1 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when index is -1' );
-	});
-
-	test( 'Current fragment', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 2, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment at index -1' );
-
-		Reveal.slide( 2, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 1, 'one current fragment at index 0' );
-
-		Reveal.slide( 1, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		strictEqual( fragmentSlide.querySelectorAll( '.fragment.current-fragment' ).length, 0, 'no current fragment when navigating to next slide' );
-	});
-
-	test( 'Stepping through fragments', function() {
-		Reveal.slide( 2, 0, -1 );
-
-		// forwards:
-
-		Reveal.next();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'next() goes to next fragment' );
-
-		Reveal.right();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'right() goes to next fragment' );
-
-		Reveal.down();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'down() goes to next fragment' );
-
-		Reveal.down(); // moves to f #3
-
-		// backwards:
-
-		Reveal.prev();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 2 }, 'prev() goes to prev fragment' );
-
-		Reveal.left();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 1 }, 'left() goes to prev fragment' );
-
-		Reveal.up();
-		deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'up() goes to prev fragment' );
-	});
-
-	test( 'Stepping past fragments', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		Reveal.slide( 0, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when on previous slide' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 3, 'all fragments visible when on future slide' );
-	});
-
-	test( 'Fragment indices', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(2)' );
-
-		Reveal.slide( 3, 0, 0 );
-		equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 2, 'both fragments of same index are shown' );
-	});
-
-	test( 'Index generation', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(1)' );
-
-		// These have no indices defined to start with
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '2' );
-	});
-
-	test( 'Index normalization', function() {
-		var fragmentSlide = document.querySelector( '#fragment-slides>section:nth-child(3)' );
-
-		// These start out as 1-4-4 and should normalize to 0-1-1
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[0].getAttribute( 'data-fragment-index' ), '0' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[1].getAttribute( 'data-fragment-index' ), '1' );
-		equal( fragmentSlide.querySelectorAll( '.fragment' )[2].getAttribute( 'data-fragment-index' ), '1' );
-	});
-
-	asyncTest( 'fragmentshown event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmentshown', _onEvent );
-
-		Reveal.slide( 2, 0 );
-		Reveal.slide( 2, 0 ); // should do nothing
-		Reveal.slide( 2, 0, 0 ); // should do nothing
-		Reveal.next();
-		Reveal.next();
-		Reveal.prev(); // shouldn't fire fragmentshown
-
-		start();
-
-		Reveal.removeEventListener( 'fragmentshown', _onEvent );
-	});
-
-	asyncTest( 'fragmenthidden event', function() {
-		expect( 2 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'fragmenthidden', _onEvent );
-
-		Reveal.slide( 2, 0, 2 );
-		Reveal.slide( 2, 0, 2 ); // should do nothing
-		Reveal.prev();
-		Reveal.prev();
-		Reveal.next(); // shouldn't fire fragmenthidden
-
-		start();
-
-		Reveal.removeEventListener( 'fragmenthidden', _onEvent );
-	});
-
-
-	// ---------------------------------------------------------------
-	// CONFIGURATION VALUES
-
-	QUnit.module( 'Configuration' );
-
-	test( 'Controls', function() {
-		var controlsElement = document.querySelector( '.reveal>.controls' );
-
-		Reveal.configure({ controls: false });
-		equal( controlsElement.style.display, 'none', 'controls are hidden' );
-
-		Reveal.configure({ controls: true });
-		equal( controlsElement.style.display, 'block', 'controls are visible' );
-	});
-
-	test( 'Progress', function() {
-		var progressElement = document.querySelector( '.reveal>.progress' );
-
-		Reveal.configure({ progress: false });
-		equal( progressElement.style.display, 'none', 'progress are hidden' );
-
-		Reveal.configure({ progress: true });
-		equal( progressElement.style.display, 'block', 'progress are visible' );
-	});
-
-	test( 'Loop', function() {
-		Reveal.configure({ loop: true });
-
-		Reveal.slide( 0, 0 );
-
-		Reveal.left();
-		notEqual( Reveal.getIndices().h, 0, 'looped from start to end' );
-
-		Reveal.right();
-		equal( Reveal.getIndices().h, 0, 'looped from end to start' );
-
-		Reveal.configure({ loop: false });
-	});
-
-
-	// ---------------------------------------------------------------
-	// EVENT TESTS
-
-	QUnit.module( 'Events' );
-
-	asyncTest( 'slidechanged', function() {
-		expect( 3 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'slidechanged', _onEvent );
-
-		Reveal.slide( 1, 0 ); // should trigger
-		Reveal.slide( 1, 0 ); // should do nothing
-		Reveal.next(); // should trigger
-		Reveal.slide( 3, 0 ); // should trigger
-		Reveal.next(); // should do nothing
-
-		start();
-
-		Reveal.removeEventListener( 'slidechanged', _onEvent );
-
-	});
-
-	asyncTest( 'paused', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'paused', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'paused', _onEvent );
-	});
-
-	asyncTest( 'resumed', function() {
-		expect( 1 );
-
-		var _onEvent = function( event ) {
-			ok( true, 'event fired' );
-		}
-
-		Reveal.addEventListener( 'resumed', _onEvent );
-
-		Reveal.togglePause();
-		Reveal.togglePause();
-
-		start();
-
-		Reveal.removeEventListener( 'resumed', _onEvent );
-	});
-
-
-} );
-
-Reveal.initialize();
-
diff --git a/docs/slides/plpv14/tmp/Foo.hs b/docs/slides/plpv14/tmp/Foo.hs
deleted file mode 100644
--- a/docs/slides/plpv14/tmp/Foo.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-module Loop (listSum) where
-
-{-@ LIQUID "--no-termination"@-}
-
--- listSum     :: [Int] -> Int
--- listNatSum  :: [Int] -> Int
--- listEvenSum :: [Int] -> Int
--- add         :: Int -> Int -> Int
-
-loop :: Int -> Int -> a -> (Int -> a -> a) -> a
-loop lo hi base f = go lo base
-  where 
-    go i acc 
-      | i < hi    = go (i+1) (f i acc)
-      | otherwise = acc
-      
-listSum xs  = loop 0 n 0 body 
-  where 
-    body    = \i acc -> acc + (xs !! i) -- replace !! with `poo` and its safe? wtf.
-    n       = length xs
diff --git a/docs/slides/plpv14/tmp/liquid.css b/docs/slides/plpv14/tmp/liquid.css
deleted file mode 100644
--- a/docs/slides/plpv14/tmp/liquid.css
+++ /dev/null
@@ -1,105 +0,0 @@
-.hs-linenum {
-  color: #B2B2B2; 
-  font-style: italic;
-}
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-  // font-weight: bold;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   /* color: #00FFFF; color: #0E84B5; */
-  //font-weight: bold;  
-}
-
-.hs-definition { 
-  color: #06287E 
-  /* font-weight: bold; */ 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  // font-size: 120%;
-  // font-family: Bitstream Vera Sans Mono,monospace;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/external/hsmisc/Graphs.hs b/external/hsmisc/Graphs.hs
deleted file mode 100644
--- a/external/hsmisc/Graphs.hs
+++ /dev/null
@@ -1,69 +0,0 @@
-module Graphs where
-
-import qualified Data.Set as S
-import qualified Data.Map as M
-import Text.Printf
-import Data.Foldable (find)
-import Data.List (intercalate, sort, sortBy, foldl', nubBy)
-
-type Graph = M.Map Int [Int]
-
-ofList :: [(Int, Int)] -> Graph
-ofList uvs = sort `fmap` foldl' adds M.empty uvs
-  where adds g (u, v) = M.insert u (v: (M.findWithDefault [] u g)) g
-
-readGraph :: FilePath -> IO Graph
-readGraph f 
-  = do s     <- readFile f
-       let es = filter ((4 ==) . length) (words `fmap` lines s)
-       return $ ofList [((read u) :: Int, (read v) :: Int) | [u,_,v,_] <- es]
-  
-writeGraph :: FilePath -> Graph -> IO ()
-writeGraph f = writeFile f . showGraph 
-
-showGraph :: Graph -> String
-showGraph g  = intercalate "\n" [ printf "%d -> %d ;" u v | (u, vs) <- M.toList g, v <- vs] 
-
-postStar :: Graph -> S.Set Int -> Graph
-postStar g vs = go vs S.empty
-  where 
-    go new reach
-      | S.null new = project reach g
-      | otherwise  = let vs'    = posts g new 
-                         reach' = S.union reach new
-                         new'   = S.difference vs' reach' 
-                     in go new' reach'
-
-project :: S.Set Int -> Graph -> Graph
-project reach = M.map (filter (`S.member` reach)) . M.filterWithKey (\u _ -> S.member u reach)
-
-posts      :: Graph -> S.Set Int -> S.Set Int 
-posts g us = S.unions [post g u | u <- S.toList us]  
-
-post     :: Graph -> Int -> S.Set Int 
-post g u = S.fromList $ M.findWithDefault [] u g
-
-
-findPath :: Graph -> Int -> Int -> Maybe [Int]
-findPath g src dst = go M.empty (M.fromList [(src, [])]) 
-  where 
-    go :: M.Map Int [Int] -> M.Map Int [Int] -> Maybe [Int]
-    go reach frnt 
-      | M.null frnt = Nothing 
-      | otherwise   = case find ((dst ==) . fst) (M.assocs frnt) of
-                        Just (_, path) -> Just (reverse path)
-                        Nothing        -> let reach' = updReach reach frnt -- (S.fromList $ fst `fmap` S.elems frnt) 
-                                              frnt'  = postFront g reach frnt
-                                        in go reach' frnt'
-   
-updReach = M.unionWith  (\p1 p2 -> if length p1 < length p2 then p1 else p2)
-
-postFront g reach frnt 
-  = M.fromList 
-  $ nubBy (\x y -> fst x == fst y) 
-  $ sortBy (\x y -> let m = length . snd in compare (m x) (m y))
-      [ (v, u:path) | (u, path) <- M.assocs frnt
-                    , v         <- S.elems (post g u)
-                    , not (M.member v reach) 
-      ]
-
diff --git a/external/hsmisc/Lhs2Hs.hs b/external/hsmisc/Lhs2Hs.hs
deleted file mode 100644
--- a/external/hsmisc/Lhs2Hs.hs
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env runhaskell
-
-import System.Environment   (getArgs)
-import System.FilePath      (replaceExtension)
-import Data.Char            (isSpace)
-
-main         = getArgs >>= mapM lhs2hsFile
-
-lhs2hsFile f = do str <- readFile f
-                  writeFile (replaceExtension f ".hs") $ lhs2hs txBeginEnd {- txBird -} $ str
-
-lhs2hs tx    = unlines . tx . map trimSpaces . lines 
-trimSpaces   = reverse . dropWhile isSpace . reverse 
-
---------------------------------------------------------------------------
-txBeginEnd   = stepFold step Comment 
-
-data Mode = Code | Comment
-
-step Comment "\\begin{code}" = (Code   , "")
-step Comment ""              = (Comment, "")
-step Comment s               = (Comment, "-- " ++ s)
-step Code    "\\end{code}"   = (Comment, "")
-step Code    s               = (Code   , s )
-
-
-stepFold f b []     = []
-stepFold f b (x:xs) = y : stepFold f b' xs 
-                      where (b', y) = f b x 
---------------------------------------------------------------------------
-
-txBird  = map dropTrack 
-  where 
-    dropTrack ('>' : ' ' : l) = l
-    dropTrack l               = "--" ++ l
-
diff --git a/include/Data/ByteString/Lazy/Char8.spec b/include/Data/ByteString/Lazy/Char8.spec
deleted file mode 100644
--- a/include/Data/ByteString/Lazy/Char8.spec
+++ /dev/null
@@ -1,417 +0,0 @@
-module spec Data.ByteString.Lazy where
-
-assume empty :: { bs : Data.ByteString.Lazy.ByteString | bllen bs == 0 }
-
-assume singleton
-    :: Char -> { bs : Data.ByteString.Lazy.ByteString | bllen bs == 1 }
-
-assume pack
-    :: w8s : [Char]
-    -> { bs : Data.ByteString.ByteString | bllen bs == len w8s }
-
-assume unpack
-    :: bs : Data.ByteString.Lazy.ByteString
-    -> { w8s : [Char] | len w8s == bllen bs }
-
-assume fromStrict
-    :: i : Data.ByteString.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bslen i }
-
-assume toStrict
-    :: i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.ByteString | bslen o == bllen i }
-
-assume fromChunks
-    :: i : [Data.ByteString.ByteString]
-    -> { o : Data.ByteString.Lazy.ByteString | len i == 0 <=> bllen o == 0 }
-
-assume toChunks
-    :: i : Data.ByteString.Lazy.ByteString
-    -> { os : [{ o : Data.ByteString.ByteString | bslen o <= bllen i}] | len os == 0 <=> bllen i == 0 }
-
-assume cons
-    :: Char
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i + 1 }
-
-assume snoc
-    :: i : Data.ByteString.Lazy.ByteString
-    -> Char
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i + 1 }
-
-assume append
-    :: l : Data.ByteString.Lazy.ByteString
-    -> r : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen l + bllen r }
-
-head
-    :: { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs }
-    -> Char
-
-assume uncons
-    :: i : Data.ByteString.Lazy.ByteString
-    -> Maybe (Char, { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i - 1 })
-
-assume unsnoc
-    :: i : Data.ByteString.Lazy.ByteString
-    -> Maybe ({ o : Data.ByteString.Lazy.ByteString | bllen o == bllen i - 1 }, Char)
-
-last
-    :: { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs }
-    -> Char
-
-tail
-    :: { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs }
-    -> Char
-
-init
-    :: { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs }
-    -> Char
-
-assume null
-    :: bs : Data.ByteString.Lazy.ByteString
-    -> { b : Bool | b <=> bllen bs == 0 }
-
-assume length
-    :: bs : Data.ByteString.Lazy.ByteString -> { n : Data.Int.Int64 | bllen bs == n }
-
-assume map
-    :: (Char -> Char)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i }
-
-assume reverse
-    :: i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i }
-
-assume intersperse
-    :: Char
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | (bllen i == 0 <=> bllen o == 0) && (1 <= bllen i <=> bllen o == 2 * bllen i - 1) }
-
-assume intercalate
-    :: l : Data.ByteString.Lazy.ByteString
-    -> rs : [Data.ByteString.Lazy.ByteString]
-    -> { o : Data.ByteString.Lazy.ByteString | len rs == 0 ==> bllen o == 0 }
-
-assume transpose
-    :: is : [Data.ByteString.Lazy.ByteString]
-    -> { os : [{ bs : Data.ByteString.Lazy.ByteString | bllen bs <= len is }] | len is == 0 ==> len os == 0}
-
-foldl1
-    :: (Char -> Char -> Char)
-    -> { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs }
-    -> Char
-
-foldl1'
-    :: (Char -> Char -> Char)
-    -> { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs }
-    -> Char
-
-foldr1
-    :: (Char -> Char -> Char)
-    -> { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs }
-    -> Char
-
-foldr1'
-    :: (Char -> Char -> Char)
-    -> { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs }
-    -> Char
-
-assume concat
-    :: is : [Data.ByteString.Lazy.ByteString]
-    -> { o : Data.ByteString.Lazy.ByteString | len is == 0 ==> bllen o }
-
-assume concatMap
-    :: (Char -> Data.ByteString.Lazy.ByteString)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen i == 0 ==> bllen o == 0 }
-
-assume any :: (Char -> Bool)
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> { b : Bool | bllen bs == 0 ==> not b }
-
-assume all :: (Char -> Bool)
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> { b : Bool | bllen bs == 0 ==> b }
-
-maximum :: { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs } -> Char
-
-minimum :: { bs : Data.ByteString.Lazy.ByteString | 1 <= bllen bs } -> Char
-
-assume scanl
-    :: (Char -> Char -> Char)
-    -> Char
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i }
-
-assume scanl1
-    :: (Char -> Char -> Char)
-    -> i : { i : Data.ByteString.Lazy.ByteString | 1 <= bllen i }
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i }
-
-assume scanr
-    :: (Char -> Char -> Char)
-    -> Char
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i }
-
-assume scanr1
-    :: (Char -> Char -> Char)
-    -> i : { i : Data.ByteString.Lazy.ByteString | 1 <= bllen i }
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i }
-
-assume mapAccumL
-    :: (acc -> Char -> (acc, Char))
-    -> acc
-    -> i : Data.ByteString.Lazy.ByteString
-    -> (acc, { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i })
-
-assume mapAccumR
-    :: (acc -> Char -> (acc, Char))
-    -> acc
-    -> i : Data.ByteString.Lazy.ByteString
-    -> (acc, { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i })
-
-assume replicate
-    :: n : Data.Int.Int64
-    -> Char
-    -> { bs : Data.ByteString.Lazy.ByteString | bllen bs == n }
-
-assume unfoldrN
-    :: n : Int
-    -> (a -> Maybe (Char, a))
-    -> a
-    -> ({ bs : Data.ByteString.Lazy.ByteString | bllen bs <= n }, Maybe a)
-
-assume take
-    :: n : Data.Int.Int64
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | (n <= 0 ==> bllen o == 0) &&
-                                               ((0 <= n && n <= bllen i) <=> bllen o == n) &&
-                                               (bllen i <= n <=> bllen o = bllen i) }
-
-assume drop
-    :: n : Data.Int.Int64
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | (n <= 0 <=> bllen o == bllen i) &&
-                                               ((0 <= n && n <= bllen i) <=> bllen o == bllen i - n) &&
-                                               (bllen i <= n <=> bllen o == 0) }
-
-assume splitAt
-    :: n : Data.Int.Int64
-    -> i : Data.ByteString.Lazy.ByteString
-    -> ( { l : Data.ByteString.Lazy.ByteString | (n <= 0 <=> bllen l == 0) &&
-                                                 ((0 <= n && n <= bllen i) <=> bllen l == n) &&
-                                                 (bllen i <= n <=> bllen l == bllen i) }
-       , { r : Data.ByteString.Lazy.ByteString | (n <= 0 <=> bllen r == bllen i) &&
-                                                 ((0 <= n && n <= bllen i) <=> bllen r == bllen i - n) &&
-                                                 (bllen i <= n <=> bllen r == 0) }
-       )
-
-assume takeWhile
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }
-
-assume dropWhile
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }
-
-assume span
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> ( { l : Data.ByteString.Lazy.ByteString | bllen l <= bllen i }
-       , { r : Data.ByteString.Lazy.ByteString | bllen r <= bllen i }
-       )
-
-assume spanEnd
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> ( { l : Data.ByteString.Lazy.ByteString | bllen l <= bllen i }
-       , { r : Data.ByteString.Lazy.ByteString | bllen r <= bllen i }
-       )
-
-assume break
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> ( { l : Data.ByteString.Lazy.ByteString | bllen l <= bllen i }
-       , { r : Data.ByteString.Lazy.ByteString | bllen r <= bllen i }
-       )
-
-assume breakEnd
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> ( { l : Data.ByteString.Lazy.ByteString | bllen l <= bllen i }
-       , { r : Data.ByteString.Lazy.ByteString | bllen r <= bllen i }
-       )
-assume group
-    :: i : Data.ByteString.Lazy.ByteString
-    -> [{ o : Data.ByteString.Lazy.ByteString | 1 <= bllen o && bllen o <= bllen i }]
-
-assume groupBy
-    :: (Char -> Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> [{ o : Data.ByteString.Lazy.ByteString | 1 <= bllen o && bllen o <= bllen i }]
-
-assume inits
-    :: i : Data.ByteString.Lazy.ByteString
-    -> [{ o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }]
-
-assume tails
-    :: i : Data.ByteString.Lazy.ByteString
-    -> [{ o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }]
-
-assume split
-    :: Char
-    -> i : Data.ByteString.Lazy.ByteString
-    -> [{ o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }]
-
-assume splitWith
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> [{ o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }]
-
-assume lines
-    :: i : Data.ByteString.Lazy.ByteString
-    -> [{ o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }]
-
-assume words
-    :: i : Data.ByteString.Lazy.ByteString
-    -> [{ o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }]
-
-assume unlines
-    :: is : [Data.ByteString.Lazy.ByteString]
-    -> { o : Data.ByteString.Lazy.ByteString | (len is == 0 <=> bllen o == 0) && bllen o >= len is }
-
-assume unwords
-    :: is : [Data.ByteString.Lazy.ByteString]
-    -> { o : Data.ByteString.Lazy.ByteString | (len is == 0 ==> bllen o == 0) && (1 <= len is ==> bllen o >= len is - 1) }
-
-assume isPrefixOf
-    :: l : Data.ByteString.Lazy.ByteString
-    -> r : Data.ByteString.Lazy.ByteString
-    -> { b : Bool | bllen l >= bllen r ==> not b }
-
-assume isSuffixOf
-    :: l : Data.ByteString.Lazy.ByteString
-    -> r : Data.ByteString.Lazy.ByteString
-    -> { b : Bool | bllen l >= bllen r ==> not b }
-
-assume isInfixOf
-    :: l : Data.ByteString.Lazy.ByteString
-    -> r : Data.ByteString.Lazy.ByteString
-    -> { b : Bool | bllen l >= bllen r ==> not b }
-
-assume breakSubstring
-    :: il : Data.ByteString.Lazy.ByteString
-    -> ir : Data.ByteString.Lazy.ByteString
-    -> ( { ol : Data.ByteString.Lazy.ByteString | bllen ol <= bllen ir && (bllen il > bllen ir ==> bllen ol == bllen ir)}
-       , { or : Data.ByteString.Lazy.ByteString | bllen or <= bllen ir && (bllen il > bllen ir ==> bllen or == 0) }
-       )
-
-assume elem
-    :: Char
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> { b : Bool | bllen b == 0 ==> not b }
-
-assume notElem
-    :: Char
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> { b : Bool | bllen b == 0 ==> b }
-
-assume find
-    :: (Char -> Bool)
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> Maybe { w8 : Char | bllen bs /= 0 }
-
-assume filter
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o <= bllen i }
-
-assume partition
-    :: (Char -> Bool)
-    -> i : Data.ByteString.Lazy.ByteString
-    -> ( { l : Data.ByteString.Lazy.ByteString | bllen l <= bllen i }
-       , { r : Data.ByteString.Lazy.ByteString | bllen r <= bllen i }
-       )
-
-index
-    :: bs : Data.ByteString.Lazy.ByteString
-    -> { n : Data.Int.Int64 | 0 <= n && n < bllen bs }
-    -> Char
-
-assume elemIndex
-    :: Char
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> Maybe { n : Data.Int.Int64 | 0 <= n && n < bllen bs }
-
-assume elemIndices
-    :: Char
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> [{ n : Data.Int.Int64 | 0 <= n && n < bllen bs }]
-
-assume elemIndexEnd
-    :: Char
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> Maybe { n : Data.Int.Int64 | 0 <= n && n < bllen bs }
-
-assume findIndex
-    :: (Char -> Bool)
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> Maybe { n : Data.Int.Int64 | 0 <= n && n < bllen bs }
-
-assume findIndices
-    :: (Char -> Bool)
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> [{ n : Data.Int.Int64 | 0 <= n && n < bllen bs }]
-
-assume count
-    :: Char
-    -> bs : Data.ByteString.Lazy.ByteString
-    -> { n : Data.Int.Int64 | 0 <= n && n < bllen bs }
-
-assume zip
-    :: l : Data.ByteString.Lazy.ByteString
-    -> r : Data.ByteString.Lazy.ByteString
-    -> { o : [(Char, Char)] | len o <= bllen l && len o <= bllen r }
-
-assume zipWith
-    :: (Char -> Char -> a)
-    -> l : Data.ByteString.Lazy.ByteString
-    -> r : Data.ByteString.Lazy.ByteString
-    -> { o : [a] | len o <= bllen l && len o <= bllen r }
-
-assume unzip
-    :: i : [(Char, Char)]
-    -> ( { l : Data.ByteString.Lazy.ByteString | bllen l == len i }
-       , { r : Data.ByteString.Lazy.ByteString | bllen r == len i }
-       )
-
-assume sort
-    :: i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i }
-
-assume readInt
-    :: i : Data.ByteString.Lazy.ByteString
-    -> Maybe { p : (Int, { o : Data.ByteString.Lazy.ByteString | bllen o < bllen i}) | bllen i /= 0 }
-
-assume readInteger
-    :: i : Data.ByteString.Lazy.ByteString
-    -> Maybe { p : (Integer, { o : Data.ByteString.Lazy.ByteString | bllen o < bllen i}) | bllen i /= 0 }
-
-assume copy
-    :: i : Data.ByteString.Lazy.ByteString
-    -> { o : Data.ByteString.Lazy.ByteString | bllen o == bllen i }
-
-assume hGet
-    :: System.IO.Handle
-    -> n : { n : Int | 0 <= n }
-    -> IO { bs : Data.ByteString.Lazy.ByteString | bllen bs == n || bllen bs == 0 }
-
-assume hGetNonBlocking
-    :: System.IO.Handle
-    -> n : { n : Int | 0 <= n }
-    -> IO { bs : Data.ByteString.Lazy.ByteString | bllen bs <= n }
diff --git a/include/Data/Map.hiddenspec b/include/Data/Map.hiddenspec
deleted file mode 100644
--- a/include/Data/Map.hiddenspec
+++ /dev/null
@@ -1,27 +0,0 @@
-module spec Data.Map where
-
-embed Data.Map.Map as Map_t
-
----------------------------------------------------------------------------------------
--- | Logical Map Operators: Interpreted "natively" by the SMT solver ------------------
----------------------------------------------------------------------------------------
-
-measure Map_select :: forall k v. Data.Map.Map k v -> k -> v
-
-measure Map_store  :: forall k v. Data.Map.Map k v -> k -> v -> Data.Map.Map k v
-
-
-insert :: Ord k => k:k -> v:v -> m:Data.Map.Map k v -> {n:Data.Map.Map k v | n = Map_store m k v}
-
-lookup :: Ord k => k:k -> m:Data.Map.Map k v -> Maybe {v:v | v = Map_select m k}
-
-(!)    :: Ord k => m:Data.Map.Map k v -> k:k -> {v:v | v = Map_select m k}
-
-
-
-
-
-
-
-
-
diff --git a/liquidhaskell.cabal b/liquidhaskell.cabal
--- a/liquidhaskell.cabal
+++ b/liquidhaskell.cabal
@@ -1,5 +1,5 @@
 Name:                liquidhaskell
-Version:             0.8.0.3
+Version:             0.8.0.5
 Copyright:           2010-17 Ranjit Jhala & Niki Vazou, University of California, San Diego.
 build-type:          Simple
 Synopsis:            Liquid Types for Haskell
@@ -41,6 +41,7 @@
 
 extra-source-files: CHANGES.md
                   , README.md
+                  , devel/Paths_liquidhaskell.hs
                   , tests/pos/*.hs
                   , tests/neg/*.hs
                   , tests/import/lib/*.hs
@@ -73,7 +74,7 @@
                , deepseq
                , pretty
                , process
-               , liquid-fixpoint >= 0.7.0.3
+               , liquid-fixpoint >= 0.7.0.5
                , located-base
                , liquidhaskell
                , hpc >= 0.6
@@ -119,7 +120,7 @@
                 , vector >= 0.10
                 , hashable >= 1.2
                 , unordered-containers >= 0.2
-                , liquid-fixpoint >= 0.7.0.3
+                , liquid-fixpoint >= 0.7.0.5
                 , located-base
                 , aeson >= 0.10 && < 1.0
                 , bytestring >= 0.10
@@ -281,7 +282,7 @@
                ,     tasty-rerun >= 1.1
                ,     transformers >= 0.3
                ,     syb
-               ,     liquid-fixpoint >= 0.7.0.3
+               ,     liquid-fixpoint >= 0.7.0.5
                ,     hpc >= 0.6
                ,     text
 
@@ -303,7 +304,7 @@
                ,     text
                ,     transformers >= 0.3
                ,     syb
-               ,     liquid-fixpoint >= 0.7.0.3
+               ,     liquid-fixpoint >= 0.7.0.5
                ,     hpc >= 0.6
 
   if flag(devel)
@@ -322,7 +323,7 @@
                 , ghc == 8.0.2
                 , ghc-boot == 8.0.2
                 , hashable >= 1.2
-                , liquid-fixpoint >= 0.7.0.3
+                , liquid-fixpoint >= 0.7.0.5
                 , pretty
                 , syb >= 0.4.4
                 , time
diff --git a/resources/icon.png b/resources/icon.png
deleted file mode 100644
Binary files a/resources/icon.png and /dev/null differ
diff --git a/resources/icon.svg b/resources/icon.svg
deleted file mode 100644
--- a/resources/icon.svg
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="29.703594mm"
-   height="39.899921mm"
-   viewBox="0 0 105.24896 141.37768"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="icon.svg"
-   inkscape:export-filename="C:\Users\mdsmt\Downloads\lh_revised2.png"
-   inkscape:export-xdpi="235.685"
-   inkscape:export-ydpi="235.685">
-  <defs
-     id="defs4">
-    <clipPath
-       id="clip1">
-      <path
-         inkscape:connector-curvature="0"
-         d="m 0,340.15625 481.89062,0 L 481.89062,0 0,0 0,340.15625 Z m 0,0"
-         id="path4220" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath7186">
-      <g
-         id="g7188">
-        <path
-           style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 84.794583,521.06991 14.010237,0 23.34623,40.52476 -21.34623,40.52194 -16.010237,0 21.346227,-40.52194 z"
-           id="path7190"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccccc" />
-        <path
-           sodipodi:nodetypes="ccccccccc"
-           style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 102.14081,517.01175 8.01023,-10.84724 54.69249,95.9521 -16.01024,0 -13.33999,-25.32586 -13.34225,25.32586 -16.01024,0 21.34846,-40.52194 z"
-           id="path7192"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 139.94069,548.53025 38.40551,0 0,12.60994 -30.72442,0 -7.68109,-12.60994 z"
-           id="path7194"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 150.61272,567.44386 26.90505,0 0,12.60732 -19.78966,0 z"
-           id="path7196"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccc" />
-      </g>
-    </clipPath>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="420.32985"
-     inkscape:cy="245.30718"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1057"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="1"
-     fit-margin-top="3"
-     fit-margin-left="3"
-     fit-margin-right="3"
-     fit-margin-bottom="3" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-81.531717,-469.11796)">
-    <path
-       style="fill:#0264c0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 59.990234,10.630859 C 54.173316,21.067707 46.657394,32.271636 39.59375,43.375 l 45.373047,79.60352 c 4.666674,-3.15931 8.700176,-7.21939 11.673828,-12.04493 l -13.078125,0 -7.115234,-12.607418 24.998044,0 c 0.26827,-1.521339 0.44649,-3.086134 0.52344,-4.69336 0.0194,-0.528607 0.008,-1.068833 -0.004,-1.609374 l -28.507809,0 -7.68164,-12.609376 33.716797,0 C 92.505251,58.605472 72.389306,32.877514 59.990234,10.630859 Z M 32.216797,55.351562 c -0.968127,1.637942 -1.900951,3.264431 -2.806641,4.88086 L 47.986328,92.478516 32.779297,121.34766 c 1.252735,0.97118 2.556275,1.87737 3.910156,2.70703 L 53.324219,92.478516 32.216797,55.351562 Z m -9.798828,18.980469 c -2.902037,6.972944 -4.61497,13.505235 -4.402344,19.300781 0.291245,6.082803 2.013151,11.557818 4.751953,16.326168 L 31.976562,92.478516 22.417969,74.332031 Z m 38.910156,33.341799 -11.492187,21.81445 c 3.341504,0.80593 6.75804,1.24152 10.154296,1.25977 4.194017,-0.0225 8.421216,-0.67523 12.496094,-1.88867 L 61.328125,107.67383 Z"
-       id="path6853"
-       transform="translate(74.164662,469.11702)"
-       inkscape:connector-curvature="0" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path7178"
-       d="m 134.15547,479.74694 c -15.42062,27.66803 -42.79313,60.73047 -41.975971,83.00381 1.085444,22.67002 21.923071,37.00723 41.975971,37.11498 20.05291,-0.10779 40.89193,-14.44496 41.97737,-37.11498 0.81718,-22.27334 -26.55672,-55.33578 -41.97737,-83.00381 z"
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       clip-path="url(#clipPath7186)" />
-  </g>
-</svg>
diff --git a/resources/logo.png b/resources/logo.png
deleted file mode 100644
Binary files a/resources/logo.png and /dev/null differ
diff --git a/resources/logo.svg b/resources/logo.svg
deleted file mode 100644
--- a/resources/logo.svg
+++ /dev/null
@@ -1,190 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="186.13966mm"
-   height="42.912865mm"
-   viewBox="0 0 659.55 152.05346"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="lh_revised2.svg"
-   inkscape:export-filename="C:\Users\mdsmt\Downloads\lh_revised2.png"
-   inkscape:export-xdpi="235.685"
-   inkscape:export-ydpi="235.685">
-  <defs
-     id="defs4">
-    <clipPath
-       id="clip1">
-      <path
-         inkscape:connector-curvature="0"
-         d="m 0,340.15625 481.89062,0 L 481.89062,0 0,0 0,340.15625 Z m 0,0"
-         id="path4220" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath7186">
-      <g
-         id="g7188">
-        <path
-           style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 84.794583,521.06991 14.010237,0 23.34623,40.52476 -21.34623,40.52194 -16.010237,0 21.346227,-40.52194 z"
-           id="path7190"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccccc" />
-        <path
-           sodipodi:nodetypes="ccccccccc"
-           style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 102.14081,517.01175 8.01023,-10.84724 54.69249,95.9521 -16.01024,0 -13.33999,-25.32586 -13.34225,25.32586 -16.01024,0 21.34846,-40.52194 z"
-           id="path7192"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 139.94069,548.53025 38.40551,0 0,12.60994 -30.72442,0 -7.68109,-12.60994 z"
-           id="path7194"
-           inkscape:connector-curvature="0" />
-        <path
-           style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 150.61272,567.44386 26.90505,0 0,12.60732 -19.78966,0 z"
-           id="path7196"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccc" />
-      </g>
-    </clipPath>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.70710678"
-     inkscape:cx="512.42856"
-     inkscape:cy="361.49986"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     showguides="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1057"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="1"
-     fit-margin-top="3"
-     fit-margin-left="3"
-     fit-margin-right="3"
-     fit-margin-bottom="3" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-81.531688,-469.11796)">
-    <g
-       transform="translate(-121.00001,52.939233)"
-       id="text4830"
-       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:90px;line-height:125%;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#00872a;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
-      <path
-         style="fill:#00872a;fill-opacity:1"
-         inkscape:connector-curvature="0"
-         id="path4877"
-         d="m 593.64984,533.48008 0,-32.97577 -28.38668,0 0,32.97577 -15.48364,0 0,-79.51602 15.48364,0 0,32.50802 28.38668,0 0,-32.50802 15.48364,0 0,79.51602 -15.48364,0 z" />
-      <path
-         style="fill:#00872a;fill-opacity:1"
-         inkscape:connector-curvature="0"
-         id="path4879"
-         d="m 658.99691,493.25432 0,24.32254 q 0.2244,2.80646 0.8976,3.97581 0.6732,1.05241 2.80501,1.52016 l -0.4488,11.81046 q -5.72222,0 -9.20043,-0.81855 -3.36601,-0.81854 -6.84422,-3.27419 -8.07842,4.09274 -16.49344,4.09274 -17.39105,0 -17.39105,-19.17739 0,-9.35482 4.82461,-13.21368 4.82462,-3.97581 14.81044,-4.67741 l 12.00544,-0.9355 0,-3.62499 q 0,-3.62498 -1.57081,-4.91128 -1.5708,-1.40322 -5.04901,-1.40322 l -21.09366,0.93548 -0.4488,-10.87498 q 12.00543,-3.39114 22.77666,-3.39114 10.88343,0 15.59584,4.67743 4.82462,4.6774 4.82462,14.96771 z m -25.24507,15.43546 q -6.28322,0.58469 -6.28322,7.01612 0,6.43145 5.49782,6.43145 4.26361,0 9.31262,-1.40323 l 1.68301,-0.46774 0,-12.51208 -10.21023,0.93548 z" />
-      <path
-         style="fill:#00872a;fill-opacity:1"
-         inkscape:connector-curvature="0"
-         id="path4881"
-         d="m 709.08473,489.62934 q -13.91284,-1.87097 -19.52285,-1.87097 -5.49782,0 -7.18082,1.05241 -1.57081,1.05243 -1.57081,3.39113 0,2.22176 2.13181,3.15725 2.24401,0.81854 11.22003,2.57258 9.08822,1.63709 12.90303,5.49596 3.81482,3.85886 3.81482,12.51207 0,18.94352 -22.55227,18.94352 -7.40522,0 -17.95204,-2.10483 l -3.59041,-0.70161 0.4488,-13.09676 q 13.91283,1.87097 19.29845,1.87097 5.49781,0 7.40522,-1.05242 2.0196,-1.16935 2.0196,-3.39113 0,-2.22177 -2.1318,-3.27419 -2.01961,-1.05242 -10.77123,-2.57256 -8.63942,-1.52016 -12.90304,-5.14515 -4.26361,-3.62501 -4.26361,-12.86291 0,-9.35482 6.05882,-14.03222 6.05882,-4.79436 15.59584,-4.79436 6.61982,0 18.06425,2.22177 l 3.70261,0.70162 -0.2244,12.97983 z" />
-      <path
-         style="fill:#00872a;fill-opacity:1"
-         inkscape:connector-curvature="0"
-         id="path4883"
-         d="m 729.10293,533.48008 -15.03484,0 0,-81.85472 15.03484,0 0,46.54025 5.72222,-1.05242 11.10783,-22.10077 16.83005,0 -14.58604,27.71366 15.37144,30.754 -16.94225,0 -11.33223,-22.80239 -6.17102,1.05241 0,21.74998 z" />
-      <path
-         style="fill:#00872a;fill-opacity:1"
-         inkscape:connector-curvature="0"
-         id="path4885"
-         d="m 776.89691,510.91156 q 0.1122,5.37902 2.69281,7.83466 2.69281,2.33871 7.62962,2.33871 10.43463,0 18.62525,-0.70161 l 3.14161,-0.35081 0.2244,11.57659 q -12.90304,3.27419 -23.33767,3.27419 -12.67863,0 -18.40084,-7.01612 -5.72222,-7.01611 -5.72222,-22.80238 0,-31.45561 24.79627,-31.45561 24.45966,0 24.45966,26.42739 l -1.122,10.87499 -32.98689,0 z m 19.29845,-11.9274 q 0,-7.01612 -2.1318,-9.70564 -2.13181,-2.80644 -7.51742,-2.80644 -5.27342,0 -7.51742,2.92337 -2.13181,2.80646 -2.24401,9.58871 l 19.41065,0 z" />
-      <path
-         style="fill:#00872a;fill-opacity:1"
-         inkscape:connector-curvature="0"
-         id="path4887"
-         d="m 816.19394,533.48008 0,-81.85472 15.03484,0 0,81.85472 -15.03484,0 z" />
-      <path
-         style="fill:#00872a;fill-opacity:1"
-         inkscape:connector-curvature="0"
-         id="path4889"
-         d="m 836.4169,533.48008 0,-81.85472 15.03484,0 0,81.85472 -15.03484,0 z" />
-    </g>
-    <path
-       style="fill:#0264c0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 59.990234,10.630859 C 54.173316,21.067707 46.657394,32.271636 39.59375,43.375 l 45.373047,79.60352 c 4.666674,-3.15931 8.700176,-7.21939 11.673828,-12.04493 l -13.078125,0 -7.115234,-12.607418 24.998044,0 c 0.26827,-1.521339 0.44649,-3.086134 0.52344,-4.69336 0.0194,-0.528607 0.008,-1.068833 -0.004,-1.609374 l -28.507809,0 -7.68164,-12.609376 33.716797,0 C 92.505251,58.605472 72.389306,32.877514 59.990234,10.630859 Z M 32.216797,55.351562 c -0.968127,1.637942 -1.900951,3.264431 -2.806641,4.88086 L 47.986328,92.478516 32.779297,121.34766 c 1.252735,0.97118 2.556275,1.87737 3.910156,2.70703 L 53.324219,92.478516 32.216797,55.351562 Z m -9.798828,18.980469 c -2.902037,6.972944 -4.61497,13.505235 -4.402344,19.300781 0.291245,6.082803 2.013151,11.557818 4.751953,16.326168 L 31.976562,92.478516 22.417969,74.332031 Z m 38.910156,33.341799 -11.492187,21.81445 c 3.341504,0.80593 6.75804,1.24152 10.154296,1.25977 4.194017,-0.0225 8.421216,-0.67523 12.496094,-1.88867 L 61.328125,107.67383 Z"
-       id="path6853"
-       transform="translate(74.164662,469.11702)"
-       inkscape:connector-curvature="0" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path7178"
-       d="m 134.15547,479.74694 c -15.42062,27.66803 -42.79313,60.73047 -41.975971,83.00381 1.085444,22.67002 21.923071,37.00723 41.975971,37.11498 20.05291,-0.10779 40.89193,-14.44496 41.97737,-37.11498 0.81718,-22.27334 -26.55672,-55.33578 -41.97737,-83.00381 z"
-       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.05262315px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       clip-path="url(#clipPath7186)" />
-    <g
-       transform="matrix(1.24667,0,0,1.24667,-75.199562,-49.505648)"
-       id="text4859"
-       style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:90px;line-height:125%;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Semi-Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#0264c0;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4864"
-         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:90px;line-height:125%;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Semi-Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#0264c0;fill-opacity:1"
-         d="m 245.99829,510.09816 -34.56,0 0,-61.65 9.99,0 0,52.74 24.57,0 0,8.91 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path4866"
-         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:90px;line-height:125%;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Semi-Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#0264c0;fill-opacity:1"
-         d="m 249.55594,510.09816 0,-45 9.81,0 0,45 -9.81,0 z m 0,-52.65 0,-10.35 9.81,0 0,10.35 -9.81,0 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path4868"
-         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:90px;line-height:125%;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Semi-Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#0264c0;fill-opacity:1"
-         d="m 280.56359,511.08816 q -9.27,0 -13.5,-5.22 -4.14,-5.22 -4.14,-18.27 0,-13.14 4.86,-18.27 4.95,-5.22 17.01,-5.22 4.41,0 13.5,0.81 l 2.97,0.27 0,64.26 -9.72,0 0,-21.06 q -6.03,2.7 -10.98,2.7 z m 4.23,-38.52 q -7.11,0 -9.63,3.6 -2.43,3.51 -2.43,11.52 0,8.01 2.16,11.34 2.25,3.33 6.84,3.33 4.23,0 8.46,-1.35 l 1.35,-0.45 0,-27.63 q -4.32,-0.36 -6.75,-0.36 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path4870"
-         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:90px;line-height:125%;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Semi-Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#0264c0;fill-opacity:1"
-         d="m 332.54123,465.09816 9.72,0 0,45 -9.72,0 0,-2.79 q -6.57,3.78 -12.15,3.78 -9.27,0 -12.42,-4.95 -3.15,-5.04 -3.15,-17.55 l 0,-23.49 9.81,0 0,23.58 q 0,8.1 1.35,10.89 1.35,2.79 6.3,2.79 4.86,0 8.91,-1.8 l 1.35,-0.54 0,-34.92 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path4872"
-         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:90px;line-height:125%;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Semi-Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#0264c0;fill-opacity:1"
-         d="m 345.81888,510.09816 0,-45 9.81,0 0,45 -9.81,0 z m 0,-52.65 0,-10.35 9.81,0 0,10.35 -9.81,0 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path4874"
-         style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-size:90px;line-height:125%;font-family:'Titillium Web';-inkscape-font-specification:'Titillium Web, Semi-Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#0264c0;fill-opacity:1"
-         d="m 397.97652,446.37816 0,63.72 -9.72,0 0,-2.34 q -6.57,3.33 -12.06,3.33 -8.82,0 -12.96,-5.31 -4.05,-5.31 -4.05,-17.82 0,-12.51 4.5,-18.18 4.59,-5.67 14.22,-5.67 3.24,0 10.26,1.17 l 0,-18.9 9.81,0 z m -11.34,54.36 1.53,-0.63 0,-26.64 q -5.4,-0.9 -9.99,-0.9 -9.09,0 -9.09,15.12 0,8.28 2.07,11.52 2.16,3.15 6.75,3.15 4.59,0 8.73,-1.62 z" />
-    </g>
-  </g>
-</svg>
diff --git a/scripts/CountBinders.hs b/scripts/CountBinders.hs
deleted file mode 100644
--- a/scripts/CountBinders.hs
+++ /dev/null
@@ -1,93 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE TypeSynonymInstances #-}
-module Main where
-
-
-import           Control.Applicative
-import           Data.Function
-import           Data.Generics
-import           Data.List
-import           System.Environment
-import           Text.Printf
-
-import           CoreMonad
-import           CoreSyn
-import           DynFlags
-import           GHC
-import           GHC.Paths
-import           HscTypes
-import qualified Outputable as Out
-import           Type
-import           Var
-
-import           Language.Haskell.Liquid.GhcMisc
-import           Language.Haskell.Liquid.Misc
-
-getCoreBinds :: FilePath -> IO [CoreBind]
-getCoreBinds target = runGhc (Just libdir) $ do
-  addTarget =<< guessTarget target Nothing
-  flags <- getSessionDynFlags
-  inc <- liftIO getIncludeDir
-  setSessionDynFlags $ updateDynFlags flags [inc]
-  load LoadAllTargets
-  modGraph <- getModuleGraph
-  case find ((== target) . msHsFilePath) modGraph of
-    Just modSummary -> do
-      mod_guts <- coreModule <$> (desugarModule =<< typecheckModule =<< parseModule modSummary)
-      return   $! mg_binds mod_guts
-    Nothing     -> error "Ghc Interface: Unable to get GhcModGuts"
-
-
-updateDynFlags :: DynFlags -> [FilePath] -> DynFlags
-updateDynFlags df ps
-  = df { importPaths  = ps ++ importPaths df
-       , libraryPaths = ps ++ libraryPaths df
-       , profAuto     = ProfAutoCalls
-       , ghcLink      = NoLink
-       , hscTarget    = HscInterpreted
-       , ghcMode      = CompManager
-       } `xopt_set` Opt_MagicHash
-         `dopt_set` Opt_ImplicitImportQualified
-
-
-allBinders :: [CoreBind] -> [CoreBind]
-allBinders cbs = cbs ++ map bind (concatMap (listify isBinder) cbs)
-  where
-    bind (Let x _)     = x
-    isBinder (Let _ _) = True
-    isBinder _         = False
-
-
-recsAndFuns :: [CoreBind] -> ([Var],[Var],[Var])
-recsAndFuns binds = (recs,recfuns,funs)
-  where
-    recs    = [v | Rec bs <- binds, (v,_)  <- bs]
-    recfuns = filter isFun recs
-    -- GHC does transforms recursive functions (at least with tyvars)
-    -- into a let binding that quantifies over the tyvar followed by a
-    -- letrec that defines the function, e.g.
-    --     let foo = \ @a -> { letrec foo = ... in foo }
-    -- but we don't want to count foo as rec and nonrec
-    funs    = nubBy ((==) `on` getOccName)
-            $ [v | NonRec v _ <- binds, isFun v]
-           ++ recfuns
-    isFun   = isFunTy . snd . splitForAllTys . varType
-
-
-main :: IO ()
-main = do
-  target <- head <$> getArgs
-  binds  <- allBinders <$> getCoreBinds target
-
-  let (recs,recfuns,funs) = recsAndFuns binds
-
-  printf "funs:     %d\n" (length funs)
-  printf "recs:     %d\n" (length recs)
-  printf "recsFuns: %d\n" (length recfuns)
-
-
-instance Show CoreBind where
-  show = showPpr
-
-instance Show (Expr CoreBndr) where
-  show = showPpr
diff --git a/scripts/haskell_count b/scripts/haskell_count
deleted file mode 100644
--- a/scripts/haskell_count
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/perl -w
-# haskell_count - count physical lines of code
-# Strips out {- .. -} and -- comments and counts the rest.
-# Pragmas, {-#...}, are counted as SLOC.
-# BUG: Doesn't handle strings with embedded block comment markers gracefully.
-#      In practice, that shouldn't be a problem.
-# Usage: haskell_count [-f file] [list_of_files]
-#  file: file with a list of files to count (if "-", read list from stdin)
-#  list_of_files: list of files to count
-#  -f file or list_of_files can be used, or both
-
-# This is part of SLOCCount, a toolsuite that counts
-# source lines of code (SLOC).
-# Copyright (C) 2001-2004 David A. Wheeler.
-# 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-# 
-# This program 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 General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-# 
-# To contact David A. Wheeler, see his website at:
-#  http://www.dwheeler.com.
-# 
-
-
-
-
-
-$total_sloc = 0;
-
-# Do we have "-f" (read list of files from second argument)?
-if (($#ARGV >= 1) && ($ARGV[0] eq "-f")) {
-  # Yes, we have -f
-  if ($ARGV[1] eq "-") {
-    # The list of files is in STDIN
-    while (<STDIN>) {
-      chomp ($_);
-      &count_file ($_);
-    }
-  } else {
-    # The list of files is in the file $ARGV[1]
-    open (FILEWITHLIST, $ARGV[1]) || die "Error: Could not open $ARGV[1]\n";
-    while (<FILEWITHLIST>) {
-      chomp ($_);
-      &count_file ($_);
-    }
-    close FILEWITHLIST;
-  }
-  shift @ARGV; shift @ARGV;
-}
-# Process all (remaining) arguments as file names
-while ($file = shift @ARGV) {
-  &count_file ($file);
-}
-
-print "Total:\n";
-print "$total_sloc\n";
-
-sub determine_lit_type {
-  my ($file) = @_;
-
-  open (FILE, $file);
-  while (<FILE>) {
-    if (m/^\\begin{code}/) { close FILE; return 2; }
-    if (m/^>\s/) { close FILE; return 1; }
-  }
-
-  return 0;
-}
-
-sub count_file {
-  my ($file) = @_;
-  my $sloc = 0;
-  my $incomment = 0;
-  my ($literate, $inlitblock) = (0,0);
-
-  $literate = 1 if $file =~ /\.lhs$/;
-  if($literate) { $literate = determine_lit_type($file) }
-
-  open (FILE, $file);
-  while (<FILE>) {
-    if ($literate == 1) {
-      if (!s/^>//) { s/.*//; }
-    } elsif ($literate == 2) {
-      if ($inlitblock) {
-        if (m/^\\end{code}/) { s/.*//; $inlitblock = 0; }
-      } elsif (!$inlitblock) {
-        if (m/^\\begin{code}/) { s/.*//; $inlitblock = 1; }
-        else { s/.*//; }
-      }
-    }
-
-    if ($incomment) {
-      if (m/\-\}/) { s/^.*?\-\}//;  $incomment = 0;}
-      else { s/.*//; }
-    }
-    if (!$incomment) {
-      s!{-[^#].*?-}!!g;
-      s/--.*//;
-      if (m/{-/ && (!m/{-#/)) {
-        s/{-.*//;
-	$incomment = 1;
-      }
-    }
-    if (m/\S/) {$sloc++;}
-  }
-  print "$sloc $file\n";
-  if ($incomment) {print "ERROR: ended in comment in $ARGV\n";}
-  $total_sloc += $sloc;
-  $sloc = 0;
-  $incomment = 0;
-  close (FILE);
-}
diff --git a/scripts/metrics.py b/scripts/metrics.py
deleted file mode 100644
--- a/scripts/metrics.py
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/usr/bin/python
-
-from collections import defaultdict
-from datetime import datetime
-import os
-import re
-import string
-import subprocess
-import sys
-
-benchmarks = {
-    'benchmarks/text-0.11.2.3': [ 'Data/Text.hs'
-                                , 'Data/Text/Array.hs'
-                                , 'Data/Text/Encoding.hs'
-                                , 'Data/Text/Foreign.hs'
-                                , 'Data/Text/Fusion.hs'
-                                , 'Data/Text/Fusion/Size.hs'
-                                , 'Data/Text/Internal.hs'
-                                , 'Data/Text/Lazy.hs'
-                                , 'Data/Text/Lazy/Builder.hs'
-                                , 'Data/Text/Lazy/Encoding.hs'
-                                , 'Data/Text/Lazy/Fusion.hs'
-                                , 'Data/Text/Lazy/Internal.hs'
-                                , 'Data/Text/Lazy/Search.hs'
-                                , 'Data/Text/Private.hs'
-                                , 'Data/Text/Search.hs'
-                                , 'Data/Text/Unsafe.hs'
-                                , 'Data/Text/UnsafeChar.hs' ],
-
-    'benchmarks/bytestring-0.9.2.1': [ 'Data/ByteString.T.hs'
-                                     , 'Data/ByteString/Char8.hs'
-                                     , 'Data/ByteString/Fusion.T.hs'
-                                     , 'Data/ByteString/Internal.hs'
-                                     , 'Data/ByteString/Lazy.hs'
-                                     # , 'Data/ByteString/LazyZip.hs'
-                                     , 'Data/ByteString/Lazy/Char8.hs'
-                                     , 'Data/ByteString/Lazy/Internal.hs'
-                                     , 'Data/ByteString/Unsafe.hs' ],
-
-    'benchmarks/vector-algorithms-0.5.4.2': [ 'Data/Vector/Algorithms/AmericanFlag.hs'
-                                            , 'Data/Vector/Algorithms/Combinators.hs'
-                                            , 'Data/Vector/Algorithms/Common.hs'
-                                            , 'Data/Vector/Algorithms/Heap.hs'
-                                            , 'Data/Vector/Algorithms/Insertion.hs'
-                                            , 'Data/Vector/Algorithms/Intro.hs'
-                                            , 'Data/Vector/Algorithms/Merge.hs'
-                                            , 'Data/Vector/Algorithms/Optimal.hs'
-                                            , 'Data/Vector/Algorithms/Radix.hs'
-                                            , 'Data/Vector/Algorithms/Search.hs' ],
-
-    'benchmarks/esop2013-submission': [ 'Base.hs', 'Splay.hs' ],
-
-    'benchmarks/hscolour-1.20.0.0': [ 'Language/Haskell/HsColour.hs'
-                                    , 'Language/Haskell/HsColour/ACSS.hs'
-                                    , 'Language/Haskell/HsColour/Anchors.hs'
-                                    , 'Language/Haskell/HsColour/ANSI.hs'
-                                    , 'Language/Haskell/HsColour/Classify.hs'
-                                    , 'Language/Haskell/HsColour/ColourHighlight.hs'
-                                    , 'Language/Haskell/HsColour/Colourise.hs'
-                                    , 'Language/Haskell/HsColour/CSS.hs'
-                                    , 'Language/Haskell/HsColour/General.hs'
-                                    , 'Language/Haskell/HsColour/HTML.hs'
-                                    , 'Language/Haskell/HsColour/InlineCSS.hs'
-                                    , 'Language/Haskell/HsColour/LaTeX.hs'
-                                    , 'Language/Haskell/HsColour/MIRC.hs'
-                                    , 'Language/Haskell/HsColour/Options.hs'
-                                    , 'Language/Haskell/HsColour/Output.hs'
-                                    , 'Language/Haskell/HsColour/TTY.hs' ],
-
-    'benchmarks/xmonad': [ 'XMonad/StackSet.hs' ],
-
-    'include': [ 'GHC/List.lhs' ],
-
-    '.': [ 'benchmarks/base-4.5.1.0/Data/List.hs' ]
-}
-
-def time(fn):
-    start = datetime.now()
-    with open(fn+'.log', 'w') as out:
-        subprocess.call(['liquid', '--smtsolver', 'z3mem', fn], stdout=out, stderr=out)
-    return (datetime.now() - start).total_seconds()
-
-def errors(fn):
-    with open(fn+'.log') as fd:
-        log = fd.readlines()
-    unsafes = [l for l in log if l.startswith('**** UNSAFE:')]
-    return unsafes
-
-def sloc(scripts,fn):
-    return int(subprocess.check_output(
-        '%s/haskell_count %s | tail -n1' % (scripts, fn), shell=True))
-
-def lines(anns):
-    return sum(map(lambda x:(1+x.count('\n')), anns))
-
-def recs(fn):
-    out = subprocess.check_output('liquid-count-binders %s 2>/dev/null' % fn, shell=True)
-    return [int(n) for n in re.findall('(\d+)', out)]
-
-def find(rx, str):
-    return [(str[a.start():(3+string.find(str,"@-}", a.start()))])
-            for a in list(re.finditer(rx, str))]
-
-qualif_re = '{-@ qualif'
-other = 'import|include|invariant|embed|Decrease|LAZYVAR|Strict|Lazy'
-other_re = '{-@ (%s)' % other
-spec_re = '{-@ (?!(%s|qualif|LIQUID))' % other
-dec_re = '{-@ Decrease'
-div_re = '{-@ (Strict|Lazy)'
-wit_re = '{- LIQUID WITNESS'
-mod_re = '^module ([\w\.]+)'
-
-def combine(x, y):
-    return {k:x[k] + y[k] for k in y.keys()}
-
-def texify(fn, metrics):
-    return '\\texttt{%s} & %d & %d / %d & %d / %d & %d / %d & %d & %d & %d & %d & %d \\\\\n' % (
-        fn, metrics['sloc'], metrics['specs'], metrics['specs_lines'],
-        metrics['others'], metrics['others_lines'],
-        metrics['qualifs'], metrics['qualifs_lines'],
-        metrics['funs'], metrics['recfuns'], metrics['divs'],
-        metrics['hints'], metrics['time'])
-
-def texify_term(fn, metrics):
-    return '\\texttt{%s} & %d & %d & %d & %d & %d & %d & %d \\\\\n' % (
-        fn, metrics['sloc'], metrics['errs'],
-        metrics['funs'], metrics['recfuns'], metrics['divs'],
-        metrics['hints'], metrics['time'])
-
-def main():
-    if len(sys.argv) >= 2 and sys.argv[1] == '--only-term':
-        print 'ONLY COLLECTING TERMINATION DATA!'
-        colformat = '|l|rr|rrrr|r|'
-        headers = ['Module', 'LOC', 'Err', 'Fun', 'Rec', 'Div', 'Hint', 'Time']
-        pptex = texify_term
-    else:
-        colformat = '|l|rrrr|rrrr|r|'
-        headers = ['Module', 'LOC', 'Specs', 'Annot', 'Qualif',
-                   'Fun', 'Rec', 'Div', 'Hint', 'Time']
-        pptex = texify
-    results = {}
-    pwd = os.getcwd()
-    for d, fs in benchmarks.iteritems():
-        os.chdir(d)
-        results[d] = {}
-        for fn in fs:
-            print fn
-            f_res = {}
-            f_res['time'] = time(fn)
-            f_res['sloc'] = sloc(os.path.join(pwd,'scripts'),fn)
-            [fs,rs,rfs] = recs(fn)
-            f_res['funs'] = fs
-            f_res['recs'] = rs
-            f_res['recfuns'] = rfs
-
-            errs = set(errors(fn))
-            import pprint
-            pprint.pprint(errs)
-            f_res['errs'] = len(errs)
-
-            str = (open(fn, 'r')).read()
-            mod = re.search(mod_re, str, re.M).group(1)
-
-            specs = find(spec_re, str)
-            f_res['specs'] = len(specs)
-            f_res['specs_lines'] = lines(specs)
-
-            qualifs = find(qualif_re, str)
-            f_res['qualifs'] = len(qualifs)
-            f_res['qualifs_lines'] = lines(qualifs)
-
-            others = find(other_re, str)
-            f_res['others'] = len(others)
-            f_res['others_lines'] = lines(others)
-
-            f_res['divs'] = len(re.findall(div_re, str))
-            f_res['hints'] = len(re.findall(wit_re, str)) + len(re.findall(dec_re, str))
-            results[d][mod] = f_res
-
-        os.chdir(pwd)
-
-    with open('metrics.tex', 'w') as out:
-        out.write('\\begin{tabular}{%s}\n' % colformat)
-        out.write('\\hline\n')
-        out.write(' & '.join('\\textbf{%s}' % h for h in headers) + '\\\\\n')
-        out.write('\\hline\\hline\n')
-        totals = defaultdict(int)
-        for d, fs in results.iteritems():
-            dirtotals = defaultdict(int)
-            for fn, metrics in sorted(fs.iteritems()):
-                out.write(pptex(fn, metrics))
-                dirtotals = combine(dirtotals, metrics)
-            out.write(pptex(d, dirtotals))
-            out.write('\\hline\n\n')
-            totals = combine(totals, dirtotals)
-        out.write(pptex('Total', totals))
-        out.write('\\hline\n\\end{tabular}\n')
-
-if __name__ == '__main__':
-    main()
diff --git a/scripts/performance/cleanup.bash b/scripts/performance/cleanup.bash
deleted file mode 100644
--- a/scripts/performance/cleanup.bash
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-
-SCRIPT_DIR=`dirname $0`;
-SCRIPT_LOGS="$SCRIPT_DIR/logs";
-FAILURES_OCCURRED=false;
-
-function notify_if_failed {
-    local EXIT_CODE=$?;
-    if [ $EXIT_CODE != 0 ]
-    then
-        echo $1;
-        echo "Exit code was: $EXIT_CODE";
-        $FAILURES_OCCURRED=true;
-    fi
-}
-
-echo "Deleting $SCRIPT_LOGS...";
-rm -rf $SCRIPT_LOGS;
-notify_if_failed "Failed to delete $SCRIPT_LOGS...";
-
-if [ $FAILURES_OCCURRED = true ]
-then
-    echo "Cleanup failures occurred, please investigate...";
-else
-    echo "Cleanup completed successfully!";
-fi
diff --git a/scripts/performance/generate.bash b/scripts/performance/generate.bash
deleted file mode 100644
--- a/scripts/performance/generate.bash
+++ /dev/null
@@ -1,248 +0,0 @@
-#!/bin/bash
-
-GIT=`which git`;
-MAKE=`which make`;
-CABAL=`which cabal`;
-ALL_FOUND=true;
-
-SCRIPT_DIR=`dirname $0`;
-
-SCRIPT_LOGS="$SCRIPT_DIR/logs";
-SCRIPT_REPO="$SCRIPT_LOGS/repository";
-SCRIPT_FIXPOINT="$SCRIPT_REPO/liquid-fixpoint";
-REPO_TEST="$SCRIPT_REPO/dist/build/test/test";
-REPO_TEST_ARGS=" --timeout 10m";
-REPO_LOG="$SCRIPT_REPO/tests/logs/cur/summary.csv";
-
-ALL_GIT_TAGS="$GIT show-ref --tags | grep liquidhaskell | cut -c -40";
-ALL_GIT_HASHES="$GIT log --format=%H";
-
-START=0;
-END=0;
-FORCE=false;
-MAX_LOGS=-1;
-DONE_LOGS=0;
-
-START_FOUND=false;
-END_FOUND=false;
-
-function refresh_repo {
-    cd $SCRIPT_REPO;
-    abort_if_failed "Couldn't change to $SCRIPT_REPO...";
-
-    $GIT pull origin master;
-
-    if [ $END != 0 ]
-    then
-        $GIT checkout master;
-        $GIT submodule update;
-    fi
-
-    abort_if_failed "Couldn't pull Liquid Haskell from remote...";
-
-    $GIT reset;
-    abort_if_failed "Couldn't reset the the liquid-haskell repository...";
-
-    $GIT checkout .;
-    abort_if_failed "Couldn't discard changes to liquid-haskell...";
-
-    $GIT submodule foreach 'git reset ; git checkout . ;';
-    abort_if_failed "Couldn't reset and discard changes to submodules...";
-}
-
-function generate_log {
-    local HASH=$1;
-    local RESULT=$SCRIPT_LOGS/$HASH.csv;
-    local SHOULD_GEN=true;
-
-    if [ -e $RESULT ]
-    then
-        if [ $FORCE = false ]
-        then
-            SHOULD_GEN=false;
-        fi
-    fi
-
-    if [ $SHOULD_GEN = true ]
-    then
-        DONE_LOGS=`expr $DONE_LOGS + 1`
-        $GIT checkout $HASH;
-        $GIT submodule update;
-        $MAKE clean;
-        if [ $? != 0 ]
-        then
-            return 1;
-        fi
-
-        rm -rf .cabal-sandbox;
-        rm cabal.sandbox.config;
-
-        $CABAL sandbox init;
-        if [ $? != 0 ]
-        then
-            return 1;
-        fi
-
-        $CABAL sandbox add-source $SCRIPT_FIXPOINT;
-
-        $CABAL install --enable-tests;
-        if [ $? != 0 ]
-        then
-            return 1;
-        fi
-
-        $CABAL configure --enable-tests --disable-library-profiling -O2;
-        if [ $? != 0 ]
-        then
-            return 1;
-        fi
-
-        $CABAL build;
-        if [ $? != 0 ]
-        then
-            return 1;
-        fi
-
-        $CABAL exec $REPO_TEST -- $REPO_TEST_ARGS;
-        # Not testing for failure; failed tests shouldn't prevent the site from
-        # being generated.
-
-        cp $REPO_LOG $RESULT
-        if [ $? != 0 ]
-        then
-            return 1;
-        fi
-    fi
-
-    return 0;
-}
-
-function abort_if_failed {
-    local EXIT_CODE=$?;
-    if [ $EXIT_CODE != 0 ]
-    then
-        echo $1;
-        exit $EXIT_CODE;
-    fi
-}
-
-function usage {
-    echo "$0 -s [START HASH] -e [END HASH] -f -n [MAX LOGS TO GENERATE]"
-    echo "   -s - hash to start generating logs at";
-    echo "   -e - hash to end generating logs at";
-    echo "   -f - If passed, will force re-creation of all logs. This will take an extremely long time!";
-    echo "   -n - Only generate n logs (useful for cron jobs and such)"
-    exit 1;
-}
-
-# Get options
-
-while getopts ":s:e:n:f" OPT; do
-    case $OPT in
-        s)
-            START=$OPTARG;;
-        e)
-            END=$OPTARG;;
-        f)
-            FORCE=true;;
-        n)
-            MAX_LOGS=$OPTARG;;
-        *)
-            usage;;
-    esac
-done
-
-# Check dependencies
-
-if [ $GIT = "" ]
-then
-    echo "Git not found...";
-    ALL_FOUND=false;
-fi
-
-if [ $MAKE = "" ]
-then
-    echo "Make not found...";
-    ALL_FOUND=false;
-fi
-
-if [ $CABAL = "" ]
-then
-    echo "Cabal not found...";
-    ALL_FOUND=false;
-else
-    cabal sandbox --help &> /dev/null;
-    if [ $? != 0 ]
-    then
-        echo "Cabal sandboxes not supported...";
-        CABAL_VER=`cabal --numeric-version`;
-        echo "Found Cabal version: $CABAL_VER, need 1.18 or greater..."
-        ALL_FOUND=false;
-    fi
-fi
-
-if [ $ALL_FOUND = true ]
-then
-    echo "All dependencies met...";
-else
-    echo "Some dependencies are unmet...";
-    exit 1;
-fi
-
-$CABAL update;
-abort_if_failed "Couldn't perform cabal update...";
-
-# generate logs
-
-if [ ! -e $SCRIPT_LOGS ]
-then
-    mkdir $SCRIPT_LOGS;
-    abort_if_failed "$SCRIPT_LOGS doesn't exist and couldn't be created...";
-fi
-
-# Refresh the repo prior to working
-refresh_repo;
-
-if [ $END = 0 ]
-then
-    END_FOUND=true;
-fi
-
-for CURR in `$ALL_GIT_HASHES`
-do
-    if [ $START_FOUND = false ]
-    then
-        if [ $END_FOUND = false ]
-        then
-            if [ $CURR = $END ]
-            then
-                END_FOUND=true;
-            fi
-        fi
-
-        if [ $END_FOUND = true ]
-        then
-            echo "Processing: $CURR";
-            generate_log $CURR;
-        fi
-
-        if [ ! $? = 0 ]
-        then
-            echo "Log generation for $CURR failed...";
-        fi
-
-        if [ $CURR = $START ]
-        then
-            START_FOUND=true;
-        fi
-
-        if [ $MAX_LOGS = $DONE_LOGS  ]
-        then
-            START_FOUND=true;
-        fi
-
-        rm -rf /tmp/ghc*;
-        rm -rf /tmp/cabal*;
-    fi
-
-done
diff --git a/scripts/performance/initialize.bash b/scripts/performance/initialize.bash
deleted file mode 100644
--- a/scripts/performance/initialize.bash
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/bash
-
-GIT=`which git`;
-CABAL=`which cabal`;
-GHC=`which ghc`;
-ALL_FOUND=true;
-
-SCRIPT_DIR=`dirname $0`;
-SCRIPT_LOGS="$SCRIPT_DIR/logs";
-SCRIPT_REPO="$SCRIPT_LOGS/repository";
-
-LIQUID_URL="https://github.com/ucsd-progsys/liquidhaskell.git";
-
-function abort_if_failed {
-    local EXIT_CODE=$?;
-    if [ $EXIT_CODE != 0 ]
-    then
-        echo $1;
-        exit $EXIT_CODE;
-    fi
-}
-
-# Check dependencies
-
-if [ $GIT = "" ]
-then
-    echo "Git not found...";
-    ALL_FOUND=false;
-fi
-
-if [ $CABAL = "" ]
-then
-    echo "Cabal not found...";
-    ALL_FOUND=false;
-else
-    cabal sandbox --help &> /dev/null;
-    if [ $? != 0 ]
-    then
-        echo "Cabal sandboxes not supported...";
-        CABAL_VER=`cabal --numeric-version`;
-        echo "Found Cabal version: $CABAL_VER, need 1.18 or greater..."
-        ALL_FOUND=false;
-    fi
-fi
-
-if [ $GHC = "" ]
-then
-    echo "GHC not found...";
-    ALL_FOUND=false;
-fi
-
-if [ $ALL_FOUND = true ]
-then
-    echo "All dependencies met...";
-else
-    echo "Some dependencies are unmet...";
-    exit 1;
-fi
-
-if [ -e $SCRIPT_LOGS ]
-then
-    echo "$SCRIPT_LOGS already exists, aborting..."
-    exit 1;
-fi
-
-# clone repos
-
-$GIT clone $LIQUID_URL $SCRIPT_REPO
-abort_if_failed "Unable to clone Liquid Haskell...";
-
-cd $SCRIPT_REPO;
-abort_if_failed "Unable to change to $SCRIPT_REPO...";
-
-$GIT submodule update --init;
-abort_if_failed "Unable to initialize the git submodules...";
-
-echo "Initialization completed successfully!";
diff --git a/scripts/plot-benchmarks/README.md b/scripts/plot-benchmarks/README.md
deleted file mode 100644
--- a/scripts/plot-benchmarks/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-Plot-Benchmarks
-===============
-
-Overview
---------
-
-Plot-Benchmarks is a tool designed to ingest a directory full of LiquidHaskell test suite logs and generate graphs of performance data over time.
-
-Usage
------
-
-```
-  -l --logdir=ITEM            The directory that contains the logs
-  -o --outputdir=ITEM         The diretory to output graphs to
-     --plotcompare=ITEM,ITEM  Pairs of benchmarks to compare
-     --plot=ITEM              Benchmarks to plot
-  -? --help                   Display help message
-  -V --version                Print version information
-     --numeric-version        Print just the version number
-```
-
-* `logdir`: The directory that contains log files to be considered. Defaults to the current directory (`./`).
-
-* `outputdir`: The directory to write resulting graphs to. Defaults to the current directory (`./`).
-
-* `plot`: A benchmark to plot. This is drawn from the first column of the LiquidHaskell log file and takes the form of `/intermediate/suite/container/TestFile.hs`. For each benchmark, one .svg file will be produced in the output directory.
-
-* `plotcompare`: Two benchmarks to plot against each other. This is drawn from the first column of the LiquidHaskell log file and takes the form of `/intermediate/suite/container/TestFileLHS.hs,/some/other/suite/TestFileRHS.hs`. For each pair of benchmarks, one .svg file will be produced in the output directory.
-
-Prerequisites
--------------
-
-This program relies on a special header being present in the test suite output. This header is implemented in the master branch as of commit `29d72f62fd7f2d90574ad0d587185101ad960b23`. For any log file created prior to this commit, the following header can be prepended to the log file:
-
-```
-Epoch Timestamp: 1454554725
---------------------------------------------------------------------------------
-```
-
-This timestamp is required for plot-benchmarks to properly order each log. This time should be the *commiter* date of the git commit. An appropriate timestamp will be produced by git using the following command: `git show --format="%ct" --quiet`
-
-Examples
---------
-
-* `plot-benchmarks --plot Tests/Unit/pos/PointDist.hs --plotcompare Tests/Unit/pos/vector0.hs,Tests/Unit/neg/vector0.hs`
-
-This will produce two .svg files in the current directory: one that plots the results of `Tests/Unit/pos/PointDist.hs`, and one that plots both `Tests/Unit/pos/vector0.hs` and `Tests/Unit/neg/vector0.hs`.
-
-* `plot-benchmarks --logdir /tmp --plot Tests/Unit/pos/PointDist.hs --outputdir /tmp/results`
-
-This will read log data from `/tmp` and create one .svg file for `Tests/Unit/pos/PointDist.hs` in `/tmp/results`
diff --git a/scripts/plot-benchmarks/Setup.hs b/scripts/plot-benchmarks/Setup.hs
deleted file mode 100644
--- a/scripts/plot-benchmarks/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/scripts/plot-benchmarks/plot-benchmarks.cabal b/scripts/plot-benchmarks/plot-benchmarks.cabal
deleted file mode 100644
--- a/scripts/plot-benchmarks/plot-benchmarks.cabal
+++ /dev/null
@@ -1,36 +0,0 @@
--- Initial plot-benchmarks.cabal generated by cabal init.  For further
--- documentation, see http://haskell.org/cabal/users-guide/
-
-name:                plot-benchmarks
-version:             0.2.0.0
-synopsis:            Plot benchmarks in .csv format over time
-license:             BSD3
-license-file:        ../../LICENSE
-author:              Chris Tetreault
-maintainer:          ctetreau@ucsd.edu
-copyright:           University of California, San Diego.
-category:            Graphics
-build-type:          Simple
--- extra-source-files:
-cabal-version:       >=1.10
-
-executable plot-benchmarks
-  main-is:             Main.hs
-  -- other-modules:
-  -- other-extensions:
-  build-depends:       base
-                     , Chart
-                     , Chart-diagrams 
-                     , cassava
-                     , bytestring 
-                     , vector
-                     , containers 
-                     , time 
-                     , process 
-                     , directory 
-                     , unordered-containers
-                     , colour 
-                     , cmdargs 
-                     , filepath 
-  hs-source-dirs:      src
-  default-language:    Haskell2010
diff --git a/scripts/plot-benchmarks/src/Benchmark.hs b/scripts/plot-benchmarks/src/Benchmark.hs
deleted file mode 100644
--- a/scripts/plot-benchmarks/src/Benchmark.hs
+++ /dev/null
@@ -1,56 +0,0 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE FlexibleInstances #-}
-
-module Benchmark where
-
-import Data.Csv
-import qualified Data.Map as Map
-import Data.Foldable
-import Data.Time.LocalTime
-
-data Benchmark =
-   Benchmark { benchName :: String,
-               benchTimestamp :: LocalTime,
-               benchTime :: Double,
-               benchPass :: Bool
-               }
-   deriving (Eq)
-
-instance Ord Benchmark where
-   compare lhs rhs = compare (benchTimestamp lhs) (benchTimestamp rhs)
-
-unionAppend :: Map.Map String [Benchmark]
-               -> Map.Map String Benchmark
-               -> Map.Map String [Benchmark]
-unionAppend l r = Map.unionWith (++) l r'
-   where
-      r' = fmap (\a -> [a]) r
-
-toBenchMap :: (Foldable f)
-              => f Benchmark
-              -> Map.Map String Benchmark
-toBenchMap f = foldl' fn Map.empty f
-   where
-      fn m b = Map.insert (benchName b) b m
-
-instance FromRecord Benchmark where
-   parseRecord r = Benchmark
-                   <$> r .! 0
-                   <*> pure (error ("Shouldn't be evaluated until after"
-                                    ++ " reassignment!"))
-                   <*> r .! 1
-                   <*> do asStr <- r .! 2
-                          return $ read asStr {- Since the test suite
-   generates this field by calling show, this read Should Be Safe (TM) -}
-
-csvOutName = "Name"
-csvOutDate = "Committer Date"
-csvOutTime = "Time (Seconds)"
-csvOutPass = "Success"
-
-instance ToNamedRecord (LocalTime, Benchmark) where
-   toNamedRecord (_, bm) = namedRecord [csvOutName .= benchName bm,
-                                   csvOutDate .= (show $ benchTimestamp bm),
-                                   csvOutTime .= (benchTime bm),
-                                   csvOutPass .= (show $ benchPass bm)]
diff --git a/scripts/plot-benchmarks/src/Config.hs b/scripts/plot-benchmarks/src/Config.hs
deleted file mode 100644
--- a/scripts/plot-benchmarks/src/Config.hs
+++ /dev/null
@@ -1,50 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-
-module Config where
-
-import System.Console.CmdArgs
-import System.Directory
-
-data OutputType =
-   Svg
-   | Csv
-     deriving (Eq, Data, Typeable, Show)
-
-data Config =
-   Config { logDir :: FilePath,
-            outputDir :: FilePath,
-            outputType :: OutputType,
-            plotCompare :: [(String, String)],
-            plot :: [String]
-          } deriving (Eq, Data, Typeable, Show)
-
-pwd :: FilePath
-pwd = "."
-
-instance Default Config where
-   def = Config { logDir = pwd,
-                  outputDir = pwd,
-                  outputType = Csv,
-                  plotCompare = def,
-                  plot = def
-                }
-
-config :: Config
-config = Config
-            { logDir = pwd &= help "The directory that contains the logs",
-              outputDir = pwd &= help "The diretory to output graphs to",
-              outputType = Csv &= help "The type of output to produce",
-              plotCompare = def &= help "Pairs of benchmarks to compare",
-              plot = def &= help "Benchmarks to plot"
-            }
-            &= program "plot-benchmarks"
-            &= summary ("plot-benchmarks - Copyright 2016 Regents of"
-                        ++ "the University of California.")
-            &= details ["Plot LiquidHaskell benchmarks over time"]
-
-getConfig :: IO Config
-getConfig = do
-   conf <- cmdArgs config
-   ld <- makeAbsolute $ logDir conf
-   od <- makeAbsolute $ outputDir conf
-   return $ conf {logDir = ld, outputDir = od}
diff --git a/scripts/plot-benchmarks/src/Main.hs b/scripts/plot-benchmarks/src/Main.hs
deleted file mode 100644
--- a/scripts/plot-benchmarks/src/Main.hs
+++ /dev/null
@@ -1,30 +0,0 @@
-module Main where
-
-import Plot
-import Config
-import Parse
-
-main :: IO ()
-main = do
-   conf <- getConfig
-   case (outputType conf) of
-      Csv -> do
-         csvData <- getAllData
-                       (logDir conf)
-                       (plot conf)
-         dumpLogs
-            (outputDir conf)
-            csvData
-      Svg -> do
-         timeData <- getTimeData
-                        (logDir conf)
-                        (plot conf)
-         plotTimeData
-            (outputDir conf)
-            timeData
-         compareTimeData <- getCompareTimeData
-                               (logDir conf)
-                               (plotCompare conf)
-         plotCompareTimeData
-            (outputDir conf)
-            compareTimeData
diff --git a/scripts/plot-benchmarks/src/Parse.hs b/scripts/plot-benchmarks/src/Parse.hs
deleted file mode 100644
--- a/scripts/plot-benchmarks/src/Parse.hs
+++ /dev/null
@@ -1,80 +0,0 @@
-module Parse where
-
-import Benchmark
-import Data.Csv
-import Data.List
-import System.Directory
-import Data.Either
-import qualified Data.Vector as V
-import qualified Data.ByteString.Lazy.Char8 as BS
-import Data.Time.Clock.POSIX
-import Data.Time.LocalTime
-import System.FilePath
-
-gulpLogs :: FilePath -> IO [V.Vector Benchmark]
-gulpLogs f = do
-   conts <- getDirectoryContents f
-   let justCsv = filter (isSuffixOf ".csv") conts
-   let noHidden = filter (\a -> not (isPrefixOf "." a)) justCsv
-   let toGulp = fmap (\a -> f </> a) noHidden
-   logs <- sequence $ fmap parseLog toGulp
-   return $ rights logs
-
-parseLog :: FilePath -> IO (Either String (V.Vector Benchmark))
-parseLog p = do
-   file <- BS.readFile p
-   let (hdr, csv) = splitHeader file delimiter
-   timezone <- getCurrentTimeZone
-   case (getEpochTime hdr) of
-      Nothing -> return $ Left "missing timestamp!"
-      Just ts -> case (decode HasHeader csv) of
-         Right bm ->
-            return $ Right $ fmap
-               (\a -> a {benchTimestamp = utcToLocalTime
-                                             timezone
-                                             $ posixSecondsToUTCTime
-                                               $ realToFrac ts})
-               bm
-
-delimiter :: String
-delimiter = take 80 $ repeat '-'
-
-getEpochTime :: [String] -> Maybe Int
-getEpochTime s = do
-   elm <- find (isPrefixOf "Epoch Timestamp:") s
-   elm' <- stripPrefix "Epoch Timestamp:" elm
-   return (read elm' :: Int)
-
-splitHeader :: BS.ByteString -> String -> ([String], BS.ByteString)
-splitHeader msg delim = (hdr, BS.pack $ unlines csv)
-   where
-      (hdr, csv) = let ((hdrr, csvr), _) = foldl' foldFn initAcc lns in
-         (reverse hdrr, reverse csvr)
-      lns = lines $ BS.unpack msg
-      initAcc = (([],[]), False)
-      foldFn ((ls, rs), True) e = ((ls, e:rs), True)
-      foldFn ((ls, rs), False) e = if e == delim
-                                      then
-                                      ((ls, rs), True)
-                                      else
-                                      ((e:ls, rs), False)
-
-dumpLogs :: FilePath -> [(String, [(LocalTime, Benchmark)])] -> IO ()
-dumpLogs out dps = sequence_ $ fmap dumpLog dps
-   where
-      dumpLog :: (String, [(LocalTime, Benchmark)]) -> IO ()
-      dumpLog (n, dps') = do
-         let n' = specToUscore n
-         let dps'' = encodeByName
-                        (V.fromList [csvOutName,
-                                     csvOutDate,
-                                     csvOutTime,
-                                     csvOutPass])
-                        dps'
-         BS.writeFile (out </> n' ++ ".csv") dps''
-      specToUscore s = fmap mapper s
-         where
-            mapper c = case c of
-               '/' -> '_'
-               '.' -> '_'
-               c' -> c'
diff --git a/scripts/plot-benchmarks/src/Plot.hs b/scripts/plot-benchmarks/src/Plot.hs
deleted file mode 100644
--- a/scripts/plot-benchmarks/src/Plot.hs
+++ /dev/null
@@ -1,161 +0,0 @@
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE FlexibleContexts #-}
-
-module Plot where
-
-import Benchmark
-import Parse
-import qualified Data.Map as Map
-import Data.Foldable
-import Data.List
-import Graphics.Rendering.Chart.Easy
-import Graphics.Rendering.Chart.Backend.Diagrams
-import Data.Time.LocalTime
-import Data.Colour ()
-import Data.Colour.Names ()
-import System.FilePath
-
-fileOptions :: FileOptions
-fileOptions = def-- (def {_fo_size = (1024, 768)} :: FileOptions)
-
-lineColor1 :: AlphaColour Double
-lineColor1 = withOpacity darkred 0.5
-
-pointColor1 :: AlphaColour Double
-pointColor1 = opaque red
-
-lineColor2 :: AlphaColour Double
-lineColor2 = withOpacity darkgreen 0.5
-
-pointColor2 :: AlphaColour Double
-pointColor2 = opaque green
-
-plotData :: (Default r, ToRenderable r)
-            => FilePath
-            -> [(String, [(LocalTime, a)])]
-            -> (String -> [(LocalTime, a)] -> EC r ())
-            -> IO ()
-plotData out dps with = sequence_ $ fmap plotDp dps
-   where
-      plotDp (n, dps') = do
-         let n' = specToUscore n
-         let options = fileOptions
-         toFile options (out </> n' ++ ".svg") $ with n dps'
-      specToUscore s = fmap mapper s
-         where
-            mapper c = case c of
-               '/' -> '_'
-               '.' -> '_'
-               c' -> c'
-
-plotCompareData :: (Default r, ToRenderable r)
-                   => FilePath
-                   -> [((String, [(LocalTime, a)]),(String, [(LocalTime, a)]))]
-                   -> (String
-                       -> String
-                       -> ([(LocalTime, a)],[(LocalTime, a)]) -> EC r ())
-                   -> IO ()
-plotCompareData out dps with = sequence_ $ fmap plotDp dps
-   where
-      plotDp ((ln, ldps'), (rn, rdps')) = do
-         let ln' = specToUscore ln
-         let rn' = specToUscore rn
-         let dps' = (ldps', rdps')
-         let options = fileOptions
-         toFile
-            options
-            (out </> ln' ++ "_vs_" ++ rn' ++ ".svg")
-            $ with ln rn dps'
-      specToUscore s = fmap mapper s
-         where
-            mapper c = case c of
-               '/' -> '_'
-               '.' -> '_'
-               c' -> c'
-
-plotCompareTimeData :: FilePath
-                       -> [((String, [(LocalTime, Double)]),
-                            (String, [(LocalTime, Double)]))]
-                       -> IO ()
-plotCompareTimeData out dps = plotCompareData out dps with
-   where
-      with ln rn (ldps, rdps) = do
-         layoutlr_title .= ln ++ " vs. " ++ rn ++ " Times"
-         setColors [lineColor1, lineColor2, pointColor1, pointColor2]
-         setShapes [PointShapeCircle, PointShapeCircle]
-         plotLeft $ line "" [ldps]
-         plotRight $ line "" [rdps]
-         plotLeft $ points ln ldps
-         plotRight $ points rn rdps
-
-plotTimeData :: FilePath -> [(String, [(LocalTime, Double)])] -> IO ()
-plotTimeData out dps = plotData out dps with
-   where
-      with n' dps' = do
-            layout_title .= n' ++ " Times"
-            setColors [lineColor1, pointColor1]
-            plot $ line "" [dps']
-            plot $ points n' dps'
-
-getCompareData :: ([Benchmark] -> [(LocalTime, a)])
-                  -> FilePath
-                  -> [(String, String)]
-                  -> IO [((String, [(LocalTime, a)]),
-                          (String, [(LocalTime, a)]))]
-getCompareData mapper f bps = sequence $ fmap pairUp bps
-   where
-      pairUp (l, r) = do
-         [l'] <- getData mapper f [l]
-         [r'] <- getData mapper f [r]
-         return (l', r')
-
-getData :: ([Benchmark] -> [(LocalTime, a)])
-                -> FilePath
-                -> [String]
-                -> IO [(String, [(LocalTime, a)])]
-getData mapper f bs = do
-   logs <- gulpLogs f
-   let logMaps = fmap toBenchMap logs
-   let combined = foldl' unionAppend Map.empty logMaps
-   let onlyBs = Map.filterWithKey (\k _ -> k `elem` bs) combined
-   let dataPs = Map.toList $ fmap mapper onlyBs
-   let sorted =  fmap sortMapper dataPs
-   return sorted
-   where
-      comparator (tsl, _) (tsr, _) = compare tsl tsr
-      sortMapper (name, dps) = (name, sortBy comparator dps)
-
-getTimeData :: FilePath -> [String] -> IO [(String, [(LocalTime, Double)])]
-getTimeData = getData timeDataMapper
-
-
-getCompareTimeData :: FilePath
-                   -> [(String, String)]
-                   -> IO [((String, [(LocalTime, Double)]),
-                           (String, [(LocalTime, Double)]))]
-getCompareTimeData = getCompareData timeDataMapper
-
-timeDataMapper :: [Benchmark] -> [(LocalTime, Double)]
-timeDataMapper bs' = [(benchTimestamp x, benchTime x) | x <- bs' ]
-
-
-
-getSuccessData :: FilePath -> [String] -> IO [(String, [(LocalTime, Bool)])]
-getSuccessData = getData mapper
-   where
-      mapper bs' = [(benchTimestamp x, benchPass x) | x <- bs' ]
-
-plotSuccessData :: FilePath -> [(String, [(LocalTime, Bool)])] -> IO ()
-plotSuccessData out dps = plotData out dps with
-   where
-      dps'' v = fmap (\(l, r) -> case r of
-                                  True -> (l, (1 :: Integer))
-                                  False -> (l, 0)) v
-      with n' dps' = do
-         layout_title .= n' ++ " Test Result"
-         plot (line n' [dps'' dps'])
-
-getAllData :: FilePath -> [String] -> IO [(String, [(LocalTime, Benchmark)])]
-getAllData = getData mapper
-   where
-      mapper bs' = [(benchTimestamp x, x) | x <- bs']
diff --git a/scripts/plot-benchmarks/stack.yaml b/scripts/plot-benchmarks/stack.yaml
deleted file mode 100644
--- a/scripts/plot-benchmarks/stack.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-resolver: lts-4.0
-
-packages:
-- .
-
-extra-deps:
-- Chart-diagrams-1.5.4 
-- SVGFonts-1.5.0.0
-- tuple-0.3.0.2
-- OneTuple-0.2.1
-- lucid-svg-0.5.0.0
diff --git a/scripts/travis b/scripts/travis
deleted file mode 100644
--- a/scripts/travis
+++ /dev/null
@@ -1,162 +0,0 @@
-#!/bin/bash
-
-set -eu
-set -o pipefail
-
-## Helper Functions
-
-function loud {
-  echo "$ $@"
-  $@
-}
-
-function stack {
-  $HOME/.local/bin/stack --no-terminal "$@"
-}
-
-# Source: https://github.com/travis-ci/travis-build/blob/fc4ae8a2ffa1f2b3a2f62533bbc4f8a9be19a8ae/lib/travis/build/script/templates/header.sh#L104-L123
-RED="\033[31;1m"
-GREEN="\033[32;1m"
-RESET="\033[0m"
-function travis_retry {
-  local result=0
-  local count=1
-  while [ $count -le 3 ]; do
-    [ $result -ne 0 ] && {
-      echo -e "\n${RED}The command \"$@\" failed. Retrying, $count of 3.${RESET}\n" >&2
-    }
-    set +e
-    "$@"
-    result=$?
-    set -e
-    [ $result -eq 0 ] && break
-    count=$(($count + 1))
-    sleep 1
-  done
-
-  [ $count -eq 4 ] && {
-    echo "\n${RED}The command \"$@\" failed 3 times.${RESET}\n" >&2
-  }
-
-  return $result
-}
-
-function prevent_timeout {
-  local cmd="$@"
-
-  $cmd &
-  local cmd_pid=$!
-
-  poke_stdout &
-  local poke_pid=$!
-
-  wait $cmd_pid
-  exit_code=$?
-
-  kill $poke_pid
-  (wait $poke_pid 2>/dev/null) || true
-
-  return $exit_code
-}
-
-function poke_stdout {
-  # Print an invisible character every minute
-  while true; do
-    echo -ne "\xE2\x80\x8B"
-    sleep 60
-  done
-}
-
-function pastebin {
-  curl -s -F 'clbin=<-' https://clbin.com
-}
-
-## Setup Stages
-
-function install_smt {
-  local smt="$1"
-
-  mkdir -p "${HOME}/.local/bin"
-  loud curl "http://goto.ucsd.edu/~gridaphobe/$smt" -o "${HOME}/.local/bin/$smt"
-  loud chmod a+x "${HOME}/.local/bin/$smt"
-}
-
-function install_stack {
-  local stack_version="$1"
-
-  mkdir -p "${HOME}/.local/bin"
-  mkdir -p '/tmp/stack'
-
-  pushd '/tmp/stack'
-
-  local dir_name="stack-${stack_version}-x86_64-linux"
-  local archive_name="${dir_name}.tar.gz"
-  local stack_url="https://github.com/commercialhaskell/stack/releases/download/v${stack_version}/${archive_name}"
-
-  loud wget "${stack_url}"
-  loud tar -xzvf "./${archive_name}"
-  loud cp "./${dir_name}/stack" "${HOME}/.local/bin/stack"
-  loud chmod a+x "${HOME}/.local/bin/stack"
-
-  popd
-}
-
-function configure_stack {
-  local ghc_version="$1"
-
-  echo "Configuring stack.yaml for ${ghc_version}..."
-
-  cat << EOF > 'stack.yaml'
-resolver: ${ghc_version}
-
-packages:
-- ./liquid-fixpoint
-- .
-EOF
-
-  loud cat stack.yaml
-}
-
-function setup_ghc {
-  loud stack setup
-  loud stack ghc -- --version
-}
-
-function install_dependencies {
-  echo "Solving dependency constraints..."
-  loud stack update
-  loud stack solver --update-config
-
-  echo "Installing dependencies..."
-  loud stack build liquidhaskell --only-dependencies --test --no-run-tests --no-haddock-deps
-}
-
-## Building & Testing Stages
-
-function do_build {
-  loud stack build liquidhaskell --test --no-run-tests --haddock --no-haddock-deps --flag liquidhaskell:devel
-}
-
-function do_test {
-  local tests="$1"
-  local smt="$2"
-
-  local test_runner="$(stack path --dist-dir)/build/test/test"
-
-  loud prevent_timeout stack exec -- "${test_runner}" --pattern "$tests/" --smtsolver "$smt" -j2 +RTS -N2 -RTS
-}
-
-function dump_fail_logs {
-  find tests/logs/cur -type f -name '*log.fail' -print0 | while IFS= read -r -d $'\0' file; do
-    echo "${file}:"
-    echo "    $(pastebin < "${file}")"
-  done
-}
-
-## Run Test Stage
-
-stage="$1"
-shift
-
-$stage "$@"
-
diff --git a/src/LHi.hs b/src/LHi.hs
deleted file mode 100644
--- a/src/LHi.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE OverloadedStrings #-}
-
-import           System.Environment      (getArgs)
-import           System.Daemon
-import           Control.Concurrent.MVar ( newMVar )
-import           Data.Default ( def )
-import           Language.Haskell.Liquid.Interactive.Types
-import qualified Language.Haskell.Liquid.Interactive.Handler as H
-import           Language.Haskell.Liquid.UX.CmdLine (getOpts)
-import           Language.Haskell.Liquid.UX.Config  (port)
-
-daemonName :: String
-daemonName = "lhi0"
-
-main :: IO ()
-main = do
-  st  <- newMVar H.initial
-  cmd <- command
-  ensureDaemonRunning daemonName (options cmd) (H.handler st)
-  res <- client cmd
-  print res
-
-options :: Command -> DaemonOptions
-options cmd = def { daemonPort = port cmd }
-
-client :: Command -> IO (Maybe Response)
-client cmd = runClient "localhost" (port cmd) cmd
-
----------------------------------------------------------------------------------
--- | Parsing Command Line -------------------------------------------------------
----------------------------------------------------------------------------------
-command :: IO Command
--------------------------------------------------------------------------------
-command = getOpts =<< getArgs
diff --git a/src/Language/Haskell/Liquid/Bare.hs b/src/Language/Haskell/Liquid/Bare.hs
--- a/src/Language/Haskell/Liquid/Bare.hs
+++ b/src/Language/Haskell/Liquid/Bare.hs
@@ -165,11 +165,11 @@
   where
     res              = fromListSEnv binds
     emb              = gsTcEmbeds sp
-    binds            =  [(x,        rSort t) | (x, Loc _ _ t) <- gsMeas sp]
+    binds            =  (F.notracepp "ghcSpecEnv1" $ [(x,        rSort t) | (x, Loc _ _ t) <- gsMeas sp])
                      ++ [(symbol v, rSort t) | (v, Loc _ _ t) <- gsCtors sp]
                      ++ [(x,        vSort v) | (x, v)         <- gsFreeSyms sp,
                                                                  isConLikeId v ]
-                     ++ concatMap adtEnv (gsADTs sp)
+                     -- ++ (F.tracepp "ghcSpecEnv2" $ concatMap adtEnv (gsADTs sp))
     rSort            = rTypeSortedReft emb
     vSort            = rSort . varRSort
     varRSort         :: Var -> RSort
@@ -180,8 +180,8 @@
     -- env1             = fromListSEnv (tracepp "PROPBINDS" propBinds)
     -- propBinds        = [ propCtor d          | d <- gsADTs sp, isPropDecl d  ]
 
-adtEnv      :: F.DataDecl -> [(F.Symbol, F.SortedReft)]
-adtEnv      = map (mapSnd thySort) . Thy.dataDeclSymbols
+_adtEnv     :: F.DataDecl -> [(F.Symbol, F.SortedReft)]
+_adtEnv     = map (mapSnd thySort) . Thy.dataDeclSymbols
   where
     thySort = F.trueSortedReft . F.tsSort
 
@@ -209,15 +209,59 @@
 
 makeLiftedSpec0 :: Config -> TCEmb TyCon -> [CoreBind] -> [TyCon] -> Ms.BareSpec
                 -> BareM Ms.BareSpec
-makeLiftedSpec0 cfg embs cbs tcs mySpec = do
-  xils   <- makeHaskellInlines  embs cbs mySpec
-  ms     <- makeHaskellMeasures embs cbs mySpec
-  return  $ mempty { Ms.ealiases  = lmapEAlias . snd <$> xils
-                   , Ms.measures  = F.tracepp "MS-MEAS" $ ms
-                   , Ms.reflects  = F.tracepp "MS-REFLS" $ Ms.reflects mySpec
-                   , Ms.dataDecls = F.tracepp "MS-DATADECL" $ makeHaskellDataDecls cfg mySpec tcs
-                   }
+makeLiftedSpec0 cfg embs cbs defTcs mySpec = do
+  xils      <- makeHaskellInlines  embs cbs mySpec
+  ms        <- makeHaskellMeasures embs cbs mySpec
+  let refTcs = reflectedTyCons cfg embs cbs mySpec
+  let tcs    = defTcs ++ refTcs
+  return     $ mempty
+                { Ms.ealiases  = lmapEAlias . snd <$> xils
+                , Ms.measures  = F.notracepp "MS-MEAS" $ ms
+                , Ms.reflects  = F.notracepp "MS-REFLS" $ Ms.reflects mySpec
+                , Ms.dataDecls = F.notracepp "MS-DATADECL" $ makeHaskellDataDecls cfg mySpec tcs
+                }
 
+-- | '_reflectedTyCons' returns the list of `[TyCon]` that must be reflected but
+--   which are defined *outside* the current module e.g. in Base or somewhere
+--   that we don't have access to the code.
+_reflectedTyCons :: Config -> Ms.BareSpec -> BareM [TyCon]
+_reflectedTyCons cfg spec
+  | exactDC cfg = mapM (lookupGhcTyCon "reflectedTyCons") $ tycName <$> Ms.dataDecls spec
+  | otherwise   = return []
+
+reflectedTyCons :: Config -> TCEmb TyCon -> [CoreBind] -> Ms.BareSpec -> [TyCon]
+reflectedTyCons cfg embs cbs spec
+  | exactDC cfg = filter (not . isEmbedded embs)
+                $ concatMap varTyCons
+                $ reflectedVars spec cbs
+
+  | otherwise   = []
+
+-- | We cannot reflect embedded tycons (e.g. Bool) as that gives you a sort
+--   conflict: e.g. what is the type of is-True? does it take a GHC.Types.Bool
+--   or its embedding, a bool?
+isEmbedded :: TCEmb TyCon -> TyCon -> Bool
+isEmbedded embs c = M.member c embs
+
+varTyCons :: Var -> [TyCon]
+varTyCons = specTypeCons . ofType . varType
+
+specTypeCons           :: SpecType -> [TyCon]
+specTypeCons           = foldRType tc []
+  where
+    tc acc t@(RApp {}) = (rtc_tc $ rt_tycon t) : acc
+    tc acc _           = acc
+
+reflectedVars :: Ms.BareSpec -> [CoreBind] -> [Var]
+reflectedVars spec cbs = fst <$> xDefs
+  where
+    xDefs              = mapMaybe (`GM.findVarDef` cbs) reflSyms
+    reflSyms           = fmap val . S.toList . Ms.reflects $ spec
+
+-- findVarDef :: Symbol -> [CoreBind] -> Maybe (Var, CoreExpr)
+
+-- makeASize       = mapM (lookupGhcTyCon "makeASize") [v | (m, s) <- specs, m == name, v <- S.toList (Ms.autosize s)]
+
 makeLiftedSpec1
   :: FilePath -> ModName -> Ms.BareSpec -> [(Var, LocSpecType)] -> [AxiomEq]
   -> BareM ()
@@ -225,8 +269,8 @@
   = liftIO $ saveLiftedSpec file name lSpec1
   where
     xbs    = [ (varLocSym x, specToBare <$> t) | (x, t) <- xts ]
-    lSpec1 = lSpec0 { Ms.asmSigs  = F.tracepp "ASM-SIGS"  xbs
-                    , Ms.reflSigs = F.tracepp "REFL-SIGS" xbs
+    lSpec1 = lSpec0 { Ms.asmSigs  = F.notracepp "ASM-SIGS"  xbs
+                    , Ms.reflSigs = F.notracepp "REFL-SIGS" xbs
                     , Ms.axeqs    = axs }
 
 varLocSym :: Var -> LocSymbol
@@ -326,7 +370,7 @@
   name           <- modName <$> get
   let mySpec      = fromMaybe mempty (lookup name specs0)
   embs           <- makeNumericInfo instenv <$> (mconcat <$> mapM makeTyConEmbeds specs0)
-  lSpec0         <- makeLiftedSpec0 cfg embs cbs (GM.tracePpr "TCS" tcs) mySpec
+  lSpec0         <- makeLiftedSpec0 cfg embs cbs tcs mySpec
   let fullSpec    = mySpec `mappend` lSpec0
   lmap           <- lmSymDefs . logicEnv    <$> get
   let specs       = insert name fullSpec specs0
@@ -424,7 +468,7 @@
   _       <- makeLiftedSpec1 file name lSpec0 xts mAxs
   let xts' = xts ++ gsAsmSigs sp
   let vts  = [ (v, t)        | (v, t) <- xts', let vx = GM.dropModuleNames $ symbol v, S.member vx rfls ]
-  let msR  = tracepp "makeGhcAxioms:msR" [ (symbol v, t) | (v, t) <- vts ]
+  let msR  = [ (symbol v, t) | (v, t) <- vts ]
   let vs   = [ v             | (v, _) <- vts ]
   return   $ sp { gsAsmSigs  = xts'                   -- the IMPORTED refl-sigs are in gsAsmSigs sp
                 , gsMeas     = msR ++ gsMeas     sp   -- we must add them to gsMeas to allow the names in specifications
@@ -656,7 +700,6 @@
            , M.HashMap TyCon RTyCon
            , [F.DataDecl]
            )
-
 makeGhcSpecCHOP1 cfg specs embs syms = do
   (tcDds, dcs)    <- mconcat <$> mapM makeConTypes specs
   let tcs          = [(x, y) | (_, x, y, _)       <- tcDds]
@@ -664,10 +707,11 @@
   let tyi          = qualifyRTyCon (qualifySymbol syms) <$> makeTyConInfo tycons
   datacons        <- makePluggedDataCons embs tyi (concat dcs ++ wiredDataCons)
   let tds          = [(name, tc, dd) | (name, tc, _, Just dd) <- tcDds]
-  let adts         = makeDataDecls cfg embs tds datacons
+  myName          <- modName <$> get
+  let adts         = makeDataDecls cfg embs myName tds datacons
   dm              <- gets dcEnv
   _               <- setDataDecls adts
-  let dcSelectors  = concatMap (makeMeasureSelectors cfg dm) $ F.tracepp "CHOP1-datacons" datacons
+  let dcSelectors  = concatMap (makeMeasureSelectors cfg dm) $ F.notracepp "CHOP1-datacons" datacons
   recSels         <- makeRecordSelectorSigs datacons
   return             (tycons, second val <$> datacons, dcSelectors, recSels, tyi, adts)
 
@@ -746,8 +790,7 @@
 makeGhcSpecCHOP2 specs dcSelectors datacons cls embs = do
   measures'   <- mconcat <$> mapM makeMeasureSpec specs
   tyi         <- gets tcEnv
-  let measures = mconcat [ measures'
-                         , Ms.mkMSpec' dcSelectors]
+  let measures = mconcat [ measures' , Ms.mkMSpec' dcSelectors]
   let (cs, ms) = makeMeasureSpec' measures
   let cms      = makeClassMeasureSpec measures
   let cms'     = [ (x, Loc l l' $ cSort t) | (Loc l l' x, t) <- cms ]
@@ -838,7 +881,7 @@
                              env' (zip ty_binds ty_args)
            let res  = substa (f env) ty_res
            let t'   = fromRTypeRep $ t { ty_args = args, ty_res = res }
-           let msg  = ErrTySpec (GM.sourcePosSrcSpan l) (  {- text "replaceLocalBindsOne" <+> -} pprint v) t'
+           let msg  = ErrTySpec (GM.sourcePosSrcSpan l) ( {- text "replaceLocalBindsOne" <+> -} pprint v) t'
            case checkTy allowHO msg emb tyi fenv (Loc l l' t') of
              Just err -> Ex.throw err
              Nothing  -> modify (first $ M.insert v (Loc l l' t'))
diff --git a/src/Language/Haskell/Liquid/Bare/DataType.hs b/src/Language/Haskell/Liquid/Bare/DataType.hs
--- a/src/Language/Haskell/Liquid/Bare/DataType.hs
+++ b/src/Language/Haskell/Liquid/Bare/DataType.hs
@@ -90,25 +90,87 @@
 
 type DataPropDecl = (DataDecl, Maybe SpecType)
 
-makeDataDecls :: Config -> F.TCEmb TyCon -> [(ModName, TyCon, DataPropDecl)]
+makeDataDecls :: Config -> F.TCEmb TyCon -> ModName
+              -> [(ModName, TyCon, DataPropDecl)]
               -> [(DataCon, Located DataConP)]
               -> [F.DataDecl]
-makeDataDecls cfg tce tds ds
-  | makeDecls = [ makeFDataDecls tce tc dd ctors
+makeDataDecls cfg tce name tds ds
+  | makeDecls = [ makeFDataDecls tce tc dd (F.notracepp "Make-Decl-CTORS" ctors)
                 | (tc, (dd, ctors)) <- groupDataCons tds' ds ]
   | otherwise = []
   where
     makeDecls = exactDC cfg && not (noADT cfg)
-    tds'      = [ (tc, ({- qualifyDataDecl m -} d, t)) | (_, tc, (d, t)) <- tds ]
+    tds'      = F.notracepp "makeDataDecls-TYCONS" $ resolveTyCons name tds --[ (tc, (d, t)) | (_, tc, (d, t)) <- F.tracepp "makeDataDecls-TYCONS" tds ]
 
-groupDataCons :: [(TyCon, DataPropDecl)] -> [(DataCon, Located DataConP)]
+-- [NOTE:Orphan-TyCons]
+
+{- | 'resolveTyCons' will prune duplicate 'TyCon' definitions, as follows:
+
+      Let the "home" of a 'TyCon' be the module where it is defined.
+      There are three kinds of 'DataDecl' definitions:
+
+      1. A  "home"-definition is one that belongs to its home module,
+      2. An "orphan"-definition is one that belongs to some non-home module.
+
+      A 'DataUser' definition MUST be a "home" definition
+          - otherwise you can avoid importing the definition
+            and hence, unsafely pass its invariants!
+
+      So, 'resolveTyConDecls' implements the following protocol:
+
+      (a) If there is a "Home" definition,
+          then use it, and IGNORE others.
+
+      (b) If there are ONLY "orphan" definitions,
+          then pick the one from module being analyzed.
+
+      We COULD relax to allow for exactly one orphan `DataUser` definition
+      which is the one that should be selected, but that seems like a
+      slippery slope, as you can avoid importing the definition
+      and hence, unsafely pass its invariants! (Feature not bug?)
+
+-}
+resolveTyCons :: ModName -> [(ModName, TyCon, DataPropDecl)]
+              -> [(TyCon, (ModName, DataPropDecl))]
+resolveTyCons m mtds = [(tc, (m, d)) | (tc, mds) <- M.toList tcDecls
+                                     , (m, d)    <- maybeToList $ resolveDecls m tc mds ]
+  where
+    tcDecls          = Misc.group [ (tc, (m, d)) | (m, tc, d) <- mtds ]
+
+-- | See [NOTE:Orphan-TyCons], the below function tells us which of (possibly many)
+--   DataDecls to use.
+resolveDecls :: ModName -> TyCon -> Misc.ListNE (ModName, DataPropDecl)
+             -> Maybe (ModName, DataPropDecl)
+resolveDecls mName tc mds  = Misc.firstMaybes $ (`L.find` mds) <$> [ isHomeDef , isMyDef]
+  where
+    isMyDef                = (mName ==)             . fst
+    isHomeDef              = (tcHome ==) . F.symbol . fst
+    tcHome                 = GM.takeModuleNames (F.symbol tc)
+
+
+groupDataCons :: [(TyCon, (ModName, DataPropDecl))]
+              -> [(DataCon, Located DataConP)]
               -> [(TyCon, (DataPropDecl, [(DataCon, DataConP)]))]
-groupDataCons tds ds = M.toList $ M.intersectionWith (,) declM ctorM
+groupDataCons tds ds = [ (tc, (d, dds')) | (tc, ((m, d), dds)) <- tcDataCons
+                                         , let dds' = filter (isResolvedDataConP m . snd) dds
+                       ]
   where
+    tcDataCons       = M.toList $ M.intersectionWith (,) declM ctorM
     declM            = M.fromList tds
     ctorM            = Misc.group [(dataConTyCon d, (d, val dp)) | (d, dp) <- ds]
 
+isResolvedDataConP :: ModName -> DataConP -> Bool
+isResolvedDataConP m dp = F.symbol m == dcpModule dp
 
+_groupDataCons :: [(TyCon, DataPropDecl)]
+              -> [(DataCon, Located DataConP)]
+              -> [(TyCon, (DataPropDecl, [(DataCon, DataConP)]))]
+_groupDataCons tds ds = M.toList $ M.intersectionWith (,) declM ctorM
+  where
+    declM             = M.fromList tds
+    ctorM             = Misc.group [(dataConTyCon d, (d, val dp)) | (d, dp) <- ds]
+
+
 makeFDataDecls :: F.TCEmb TyCon -> TyCon -> DataPropDecl -> [(DataCon, DataConP)]
                -> F.DataDecl
 makeFDataDecls tce tc dd ctors = makeDataDecl tce tc (fst dd) ctors
@@ -306,7 +368,7 @@
             -> Maybe DataDecl
             -> (Maybe (LocSymbol, [Variance]))
             -> BareM ((ModName, TyCon, TyConP, Maybe DataPropDecl), [(DataCon, Located DataConP)])
-ofBDataDecl name (Just dd@(D tc as ps ls cts0 _ sfun pt)) maybe_invariance_info
+ofBDataDecl name (Just dd@(D tc as ps ls cts0 _ sfun pt _)) maybe_invariance_info
   = do πs            <- mapM ofBPVar ps
        tc'           <- lookupGhcTyCon "ofBDataDecl" tc
        when (not $ checkDataDecl tc' dd) (Ex.throw err)
@@ -389,9 +451,9 @@
   let cs        = RT.ofType <$> dataConStupidTheta c'
   let t0'       = fromMaybe t0 res'
   cfg          <- gets beConfig
-  let (yts, ot) = qualifyDataCtor (exactDC cfg && not isGadt) name dLoc (zip xs ts', t0')
+  let (yts, ot) = F.notracepp "OFBDataCTOR" $ qualifyDataCtor (exactDC cfg && not isGadt) name dLoc (zip xs ts', t0')
   let zts       = zipWith (normalizeField c') [1..] (reverse yts)
-  return          (c', DataConP l αs πs ls cs zts ot isGadt l')
+  return          (c', DataConP l αs πs ls cs zts ot isGadt (F.symbol name) l')
   where
     (xs, ts) = unzip xts
     rs       = [RT.rVar α | RTV α <- αs]
@@ -433,7 +495,7 @@
 qualifyName :: ModName -> F.Symbol -> F.Symbol
 qualifyName n = GM.qualifySymbol nSym
  where
-   nSym      = F.symbol n
+   nSym       = F.symbol n
 
 makeTyConEmbeds :: (ModName,Ms.Spec ty bndr) -> BareM (F.TCEmb TyCon)
 makeTyConEmbeds (mod, spec)
diff --git a/src/Language/Haskell/Liquid/Bare/Lookup.hs b/src/Language/Haskell/Liquid/Bare/Lookup.hs
--- a/src/Language/Haskell/Liquid/Bare/Lookup.hs
+++ b/src/Language/Haskell/Liquid/Bare/Lookup.hs
@@ -204,7 +204,6 @@
     fv (AConLike (RealDataCon x)) = Just $ dataConWorkId x
     fv _                          = Nothing
 
-
 lookupGhcTyCon   ::  GhcLookup a => String -> a -> BareM TyCon
 lookupGhcTyCon src s = do
   lookupGhcThing err ftc (Just tcName) s  `catchError` \_ ->
diff --git a/src/Language/Haskell/Liquid/Bare/Measure.hs b/src/Language/Haskell/Liquid/Bare/Measure.hs
--- a/src/Language/Haskell/Liquid/Bare/Measure.hs
+++ b/src/Language/Haskell/Liquid/Bare/Measure.hs
@@ -37,7 +37,7 @@
 import Data.Maybe
 import Data.Char (toUpper)
 
-import TysWiredIn (boolTyCon)
+import TysWiredIn (boolTyCon, wiredInTyCons)
 
 import Data.Traversable (forM, mapM)
 import Text.PrettyPrint.HughesPJ (text)
@@ -77,17 +77,21 @@
 --------------------------------------------------------------------------------
 makeHaskellDataDecls cfg spec
   | exactDC cfg = mapMaybe tyConDataDecl
+                -- . traceShow "VanillaTCs 2 "
                 . zipMap   (hasDataDecl spec)
-                . filter    isVanillaAlgTyCon
+                . F.notracepp "VanillaTCs 1 "
+                . liftableTyCons
+
   | otherwise   = const []
 
+liftableTyCons :: [TyCon] -> [TyCon]
+liftableTyCons = filter   (not . isBoxedTupleTyCon)
+               . filter   isVanillaAlgTyCon
+               . (`sortDiff` wiredInTyCons)
+
 zipMap :: (a -> b) -> [a] -> [(a, b)]
 zipMap f xs = zip xs (map f xs)
 
-data HasDataDecl
-  = NoDecl  (Maybe SizeFun)
-  | HasDecl
-
 hasDataDecl :: Ms.BareSpec -> TyCon -> HasDataDecl
 hasDataDecl spec = \tc -> M.lookupDefault def (tcSym tc) decls
   where
@@ -95,13 +99,6 @@
     tcSym        = GM.dropModuleNamesAndUnique . symbol
     decls        = M.fromList [ (symbol d, hasDecl d) | d <- Ms.dataDecls spec ]
 
-hasDecl :: DataDecl -> HasDataDecl
-hasDecl d
-  | Just s <- tycSFun d, null (tycDCons d)
-  = NoDecl (Just s)
-  | otherwise
-  = HasDecl
-
 {-@ tyConDataDecl :: {tc:TyCon | isAlgTyCon tc} -> Maybe DataDecl @-}
 tyConDataDecl :: (TyCon, HasDataDecl) -> Maybe DataDecl
 tyConDataDecl (_, HasDecl)
@@ -116,6 +113,7 @@
       , tycSrcPos = GM.getSourcePos tc
       , tycSFun   = szF
       , tycPropTy = Nothing
+      , tycKind   = DataReflected
       }
       where decls = map dataConDecl . tyConDataCons
 
@@ -199,7 +197,7 @@
 meetLoc t1 t2 = t1 {val = val t1 `meet` val t2}
 
 makeMeasureSelectors :: Config -> DataConMap -> (DataCon, Located DataConP) -> [Measure SpecType DataCon]
-makeMeasureSelectors cfg dm (dc, Loc l l' (DataConP _ vs _ _ _ xts resTy isGadt _))
+makeMeasureSelectors cfg dm (dc, Loc l l' (DataConP _ vs _ _ _ xts resTy isGadt _ _))
   = (condNull (exactDC cfg) $ checker : catMaybes (go' <$> fields)) --  internal measures, needed for reflection
  ++ (condNull (autofields)  $           catMaybes (go  <$> fields)) --  user-visible measures.
   where
diff --git a/src/Language/Haskell/Liquid/Bare/Spec.hs b/src/Language/Haskell/Liquid/Bare/Spec.hs
--- a/src/Language/Haskell/Liquid/Bare/Spec.hs
+++ b/src/Language/Haskell/Liquid/Bare/Spec.hs
@@ -91,7 +91,7 @@
                  let sts = [(val s, unClass $ val t) | (s, _)    <- ms
                                                      | (_, _, t) <- vts]
                  let t   = rCls tc as'
-                 let dcp = DataConP l αs [] [] (val <$> ss') (reverse sts) t False l'
+                 let dcp = DataConP l αs [] [] (val <$> ss') (reverse sts) t False (F.symbol mod) l'
                  return ((dc,dcp),vts)
 
 makeQualifiers :: (ModName, Ms.Spec ty bndr)
diff --git a/src/Language/Haskell/Liquid/Desugar/PmExpr.hs b/src/Language/Haskell/Liquid/Desugar/PmExpr.hs
deleted file mode 100644
--- a/src/Language/Haskell/Liquid/Desugar/PmExpr.hs
+++ /dev/null
@@ -1,440 +0,0 @@
-{-
-Author: George Karachalias <george.karachalias@cs.kuleuven.be>
-
-Haskell expressions (as used by the pattern matching checker) and utilities.
--}
-
-{-# LANGUAGE CPP #-}
-
-module Language.Haskell.Liquid.Desugar.PmExpr (
-        PmExpr(..), PmLit(..), SimpleEq, ComplexEq, toComplex, eqPmLit,
-        truePmExpr, falsePmExpr, isTruePmExpr, isFalsePmExpr, isNotPmExprOther,
-        lhsExprToPmExpr, hsExprToPmExpr, substComplexEq, filterComplex,
-        pprPmExprWithParens, runPmPprM
-    ) where
-
-
-import HsSyn
-import Id
-import Name
-import NameSet
-import DataCon
-import TysWiredIn
-import Outputable
-import Util
-import SrcLoc
-
-#if __GLASGOW_HASKELL__ < 709
-import Data.Functor ((<$>))
-#endif
-import Data.Maybe (mapMaybe)
-import Data.List (groupBy, sortBy, nubBy)
-import Control.Monad.Trans.State.Lazy
-
-{-
-%************************************************************************
-%*                                                                      *
-                         Lifted Expressions
-%*                                                                      *
-%************************************************************************
--}
-
-{- Note [PmExprOther in PmExpr]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Since there is no plan to extend the (currently pretty naive) term oracle in
-the near future, instead of playing with the verbose (HsExpr Id), we lift it to
-PmExpr. All expressions the term oracle does not handle are wrapped by the
-constructor PmExprOther. Note that we do not perform substitution in
-PmExprOther. Because of this, we do not even print PmExprOther, since they may
-refer to variables that are otherwise substituted away.
--}
-
--- ----------------------------------------------------------------------------
--- ** Types
-
--- | Lifted expressions for pattern match checking.
-data PmExpr = PmExprVar   Name
-            | PmExprCon   DataCon [PmExpr]
-            | PmExprLit   PmLit
-            | PmExprEq    PmExpr PmExpr  -- Syntactic equality
-            | PmExprOther (HsExpr Id)    -- Note [PmExprOther in PmExpr]
-
--- | Literals (simple and overloaded ones) for pattern match checking.
-data PmLit = PmSLit HsLit                                    -- simple
-           | PmOLit Bool {- is it negated? -} (HsOverLit Id) -- overloaded
-
--- | Equality between literals for pattern match checking.
-eqPmLit :: PmLit -> PmLit -> Bool
-eqPmLit (PmSLit    l1) (PmSLit    l2) = l1 == l2
-eqPmLit (PmOLit b1 l1) (PmOLit b2 l2) = b1 == b2 && l1 == l2
-  -- See Note [Undecidable Equality for Overloaded Literals]
-eqPmLit _              _              = False
-
-{- Note [Undecidable Equality for Overloaded Literals]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Equality on overloaded literals is undecidable in the general case. Consider
-the following example:
-
-  instance Num Bool where
-    ...
-    fromInteger 0 = False -- C-like representation of booleans
-    fromInteger _ = True
-
-    f :: Bool -> ()
-    f 1 = ()        -- Clause A
-    f 2 = ()        -- Clause B
-
-Clause B is redundant but to detect this, we should be able to solve the
-constraint: False ~ (fromInteger 2 ~ fromInteger 1) which means that we
-have to look through function `fromInteger`, whose implementation could
-be anything. This poses difficulties for:
-
-1. The expressive power of the check.
-   We cannot expect a reasonable implementation of pattern matching to detect
-   that fromInteger 2 ~ fromInteger 1 is True, unless we unfold function
-   fromInteger. This puts termination at risk and is undecidable in the
-   general case.
-
-2. Performance.
-   Having an unresolved constraint False ~ (fromInteger 2 ~ fromInteger 1)
-   lying around could become expensive really fast. Ticket #11161 illustrates
-   how heavy use of overloaded literals can generate plenty of those
-   constraints, effectively undermining the term oracle's performance.
-
-3. Error nessages/Warnings.
-   What should our message for `f` above be? A reasonable approach would be
-   to issue:
-
-     Pattern matches are (potentially) redundant:
-       f 2 = ...    under the assumption that 1 == 2
-
-   but seems to complex and confusing for the user.
-
-We choose to treat overloaded literals that look different as different. The
-impact of this is the following:
-
-  * Redundancy checking is rather conservative, since it cannot see that clause
-    B above is redundant.
-
-  * We have instant equality check for overloaded literals (we do not rely on
-    the term oracle which is rather expensive, both in terms of performance and
-    memory). This significantly improves the performance of functions `covered`
-    `uncovered` and `divergent` in deSugar/Check.hs and effectively addresses
-    #11161.
-
-  * The warnings issued are simpler.
-
-  * We do not play on the safe side, strictly speaking. The assumption that
-    1 /= 2 makes the redundancy check more conservative but at the same time
-    makes its dual (exhaustiveness check) unsafe. This we can live with, mainly
-    for two reasons:
-    1. At the moment we do not use the results of the check during compilation
-       where this would be a disaster (could result in runtime errors even if
-       our function was deemed exhaustive).
-    2. Pattern matcing on literals can never be considered exhaustive unless we
-       have a catch-all clause. Hence, this assumption affects mainly the
-       appearance of the warnings and is, in practice safe.
--}
-
-nubPmLit :: [PmLit] -> [PmLit]
-nubPmLit = nubBy eqPmLit
-
--- | Term equalities
-type SimpleEq  = (Id, PmExpr) -- We always use this orientation
-type ComplexEq = (PmExpr, PmExpr)
-
--- | Lift a `SimpleEq` to a `ComplexEq`
-toComplex :: SimpleEq -> ComplexEq
-toComplex (x,e) = (PmExprVar (idName x), e)
-
--- | Expression `True'
-truePmExpr :: PmExpr
-truePmExpr = PmExprCon trueDataCon []
-
--- | Expression `False'
-falsePmExpr :: PmExpr
-falsePmExpr = PmExprCon falseDataCon []
-
--- ----------------------------------------------------------------------------
--- ** Predicates on PmExpr
-
--- | Check if an expression is lifted or not
-isNotPmExprOther :: PmExpr -> Bool
-isNotPmExprOther (PmExprOther _) = False
-isNotPmExprOther _expr           = True
-
--- | Check whether a literal is negated
-isNegatedPmLit :: PmLit -> Bool
-isNegatedPmLit (PmOLit b _) = b
-isNegatedPmLit _other_lit   = False
-
--- | Check whether a PmExpr is syntactically equal to term `True'.
-isTruePmExpr :: PmExpr -> Bool
-isTruePmExpr (PmExprCon c []) = c == trueDataCon
-isTruePmExpr _other_expr      = False
-
--- | Check whether a PmExpr is syntactically equal to term `False'.
-isFalsePmExpr :: PmExpr -> Bool
-isFalsePmExpr (PmExprCon c []) = c == falseDataCon
-isFalsePmExpr _other_expr      = False
-
--- | Check whether a PmExpr is syntactically e
-isNilPmExpr :: PmExpr -> Bool
-isNilPmExpr (PmExprCon c _) = c == nilDataCon
-isNilPmExpr _other_expr     = False
-
--- | Check whether a PmExpr is syntactically equal to (x == y).
--- Since (==) is overloaded and can have an arbitrary implementation, we use
--- the PmExprEq constructor to represent only equalities with non-overloaded
--- literals where it coincides with a syntactic equality check.
-isPmExprEq :: PmExpr -> Maybe (PmExpr, PmExpr)
-isPmExprEq (PmExprEq e1 e2) = Just (e1,e2)
-isPmExprEq _other_expr      = Nothing
-
--- | Check if a DataCon is (:).
-isConsDataCon :: DataCon -> Bool
-isConsDataCon con = consDataCon == con
-
--- ----------------------------------------------------------------------------
--- ** Substitution in PmExpr
-
--- | We return a boolean along with the expression. Hence, if substitution was
--- a no-op, we know that the expression still cannot progress.
-substPmExpr :: Name -> PmExpr -> PmExpr -> (PmExpr, Bool)
-substPmExpr x e1 e =
-  case e of
-    PmExprVar z | x == z    -> (e1, True)
-                | otherwise -> (e, False)
-    PmExprCon c ps -> let (ps', bs) = mapAndUnzip (substPmExpr x e1) ps
-                      in  (PmExprCon c ps', or bs)
-    PmExprEq ex ey -> let (ex', bx) = substPmExpr x e1 ex
-                          (ey', by) = substPmExpr x e1 ey
-                      in  (PmExprEq ex' ey', bx || by)
-    _other_expr    -> (e, False) -- The rest are terminals (We silently ignore
-                                 -- Other). See Note [PmExprOther in PmExpr]
-
--- | Substitute in a complex equality. We return (Left eq) if the substitution
--- affected the equality or (Right eq) if nothing happened.
-substComplexEq :: Name -> PmExpr -> ComplexEq -> Either ComplexEq ComplexEq
-substComplexEq x e (ex, ey)
-  | bx || by  = Left  (ex', ey')
-  | otherwise = Right (ex', ey')
-  where
-    (ex', bx) = substPmExpr x e ex
-    (ey', by) = substPmExpr x e ey
-
--- -----------------------------------------------------------------------
--- ** Lift source expressions (HsExpr Id) to PmExpr
-
-lhsExprToPmExpr :: LHsExpr Id -> PmExpr
-lhsExprToPmExpr (L _ e) = hsExprToPmExpr e
-
-hsExprToPmExpr :: HsExpr Id -> PmExpr
-
-hsExprToPmExpr (HsVar         x) = PmExprVar (idName (unLoc x))
-hsExprToPmExpr (HsOverLit  olit) = PmExprLit (PmOLit False olit)
-hsExprToPmExpr (HsLit       lit) = PmExprLit (PmSLit lit)
-
-hsExprToPmExpr e@(NegApp _ neg_e)
-  | PmExprLit (PmOLit False ol) <- synExprToPmExpr neg_e
-  = PmExprLit (PmOLit True ol)
-  | otherwise = PmExprOther e
-hsExprToPmExpr (HsPar (L _ e)) = hsExprToPmExpr e
-
-hsExprToPmExpr e@(ExplicitTuple ps boxity)
-  | all tupArgPresent ps = PmExprCon tuple_con tuple_args
-  | otherwise            = PmExprOther e
-  where
-    tuple_con  = tupleDataCon boxity (length ps)
-    tuple_args = [ lhsExprToPmExpr e | L _ (Present e) <- ps ]
-
-hsExprToPmExpr e@(ExplicitList _elem_ty mb_ol elems)
-  | Nothing <- mb_ol = foldr cons nil (map lhsExprToPmExpr elems)
-  | otherwise        = PmExprOther e {- overloaded list: No PmExprApp -}
-  where
-    cons x xs = PmExprCon consDataCon [x,xs]
-    nil       = PmExprCon nilDataCon  []
-
-hsExprToPmExpr (ExplicitPArr _elem_ty elems)
-  = PmExprCon (parrFakeCon (length elems)) (map lhsExprToPmExpr elems)
-
--- we want this but we would have to make evrything monadic :/
--- ./compiler/deSugar/DsMonad.hs:397:dsLookupDataCon :: Name -> DsM DataCon
---
--- hsExprToPmExpr (RecordCon   c _ binds) = do
---   con  <- dsLookupDataCon (unLoc c)
---   args <- mapM lhsExprToPmExpr (hsRecFieldsArgs binds)
---   return (PmExprCon con args)
-hsExprToPmExpr e@(RecordCon   _ _ _ _) = PmExprOther e
-
-hsExprToPmExpr (HsTick            _ e) = lhsExprToPmExpr e
-hsExprToPmExpr (HsBinTick       _ _ e) = lhsExprToPmExpr e
-hsExprToPmExpr (HsTickPragma  _ _ _ e) = lhsExprToPmExpr e
-hsExprToPmExpr (HsSCC           _ _ e) = lhsExprToPmExpr e
-hsExprToPmExpr (HsCoreAnn       _ _ e) = lhsExprToPmExpr e
-hsExprToPmExpr (ExprWithTySig     e _) = lhsExprToPmExpr e
-hsExprToPmExpr (ExprWithTySigOut  e _) = lhsExprToPmExpr e
-hsExprToPmExpr (HsWrap            _ e) =  hsExprToPmExpr e
-hsExprToPmExpr e = PmExprOther e -- the rest are not handled by the oracle
-
-synExprToPmExpr :: SyntaxExpr Id -> PmExpr
-synExprToPmExpr = hsExprToPmExpr . syn_expr  -- ignore the wrappers
-
-{-
-%************************************************************************
-%*                                                                      *
-                            Pretty printing
-%*                                                                      *
-%************************************************************************
--}
-
-{- 1. Literals
-~~~~~~~~~~~~~~
-Starting with a function definition like:
-
-    f :: Int -> Bool
-    f 5 = True
-    f 6 = True
-
-The uncovered set looks like:
-    { var |> False == (var == 5), False == (var == 6) }
-
-Yet, we would like to print this nicely as follows:
-   x , where x not one of {5,6}
-
-Function `filterComplex' takes the set of residual constraints and packs
-together the negative constraints that refer to the same variable so we can do
-just this. Since these variables will be shown to the programmer, we also give
-them better names (t1, t2, ..), hence the SDoc in PmNegLitCt.
-
-2. Residual Constraints
-~~~~~~~~~~~~~~~~~~~~~~~
-Unhandled constraints that refer to HsExpr are typically ignored by the solver
-(it does not even substitute in HsExpr so they are even printed as wildcards).
-Additionally, the oracle returns a substitution if it succeeds so we apply this
-substitution to the vectors before printing them out (see function `pprOne' in
-Check.hs) to be more precice.
--}
-
--- -----------------------------------------------------------------------------
--- ** Transform residual constraints in appropriate form for pretty printing
-
-type PmNegLitCt = (Name, (SDoc, [PmLit]))
-
-filterComplex :: [ComplexEq] -> [PmNegLitCt]
-filterComplex = zipWith rename nameList . map mkGroup
-              . groupBy name . sortBy order . mapMaybe isNegLitCs
-  where
-    order x y = compare (fst x) (fst y)
-    name  x y = fst x == fst y
-    mkGroup l = (fst (head l), nubPmLit $ map snd l)
-    rename new (old, lits) = (old, (new, lits))
-
-    isNegLitCs (e1,e2)
-      | isFalsePmExpr e1, Just (x,y) <- isPmExprEq e2 = isNegLitCs' x y
-      | isFalsePmExpr e2, Just (x,y) <- isPmExprEq e1 = isNegLitCs' x y
-      | otherwise = Nothing
-
-    isNegLitCs' (PmExprVar x) (PmExprLit l) = Just (x, l)
-    isNegLitCs' (PmExprLit l) (PmExprVar x) = Just (x, l)
-    isNegLitCs' _ _             = Nothing
-
-    -- Try nice names p,q,r,s,t before using the (ugly) t_i
-    nameList :: [SDoc]
-    nameList = map text ["p","q","r","s","t"] ++
-                 [ text ('t':show u) | u <- [(0 :: Int)..] ]
-
--- ----------------------------------------------------------------------------
-
-runPmPprM :: PmPprM a -> [PmNegLitCt] -> (a, [(SDoc,[PmLit])])
-runPmPprM m lit_env = (result, mapMaybe is_used lit_env)
-  where
-    (result, (_lit_env, used)) = runState m (lit_env, emptyNameSet)
-
-    is_used (x,(name, lits))
-      | elemNameSet x used = Just (name, lits)
-      | otherwise         = Nothing
-
-type PmPprM a = State ([PmNegLitCt], NameSet) a
--- (the first part of the state is read only. make it a reader?)
-
-addUsed :: Name -> PmPprM ()
-addUsed x = modify (\(negated, used) -> (negated, extendNameSet used x))
-
-checkNegation :: Name -> PmPprM (Maybe SDoc) -- the clean name if it is negated
-checkNegation x = do
-  negated <- gets fst
-  return $ case lookup x negated of
-    Just (new, _) -> Just new
-    Nothing       -> Nothing
-
--- | Pretty print a pmexpr, but remember to prettify the names of the variables
--- that refer to neg-literals. The ones that cannot be shown are printed as
--- underscores.
-pprPmExpr :: PmExpr -> PmPprM SDoc
-pprPmExpr (PmExprVar x) = do
-  mb_name <- checkNegation x
-  case mb_name of
-    Just name -> addUsed x >> return name
-    Nothing   -> return underscore
-
-pprPmExpr (PmExprCon con args) = pprPmExprCon con args
-pprPmExpr (PmExprLit l)        = return (ppr l)
-pprPmExpr (PmExprEq _ _)       = return underscore -- don't show
-pprPmExpr (PmExprOther _)      = return underscore -- don't show
-
-needsParens :: PmExpr -> Bool
-needsParens (PmExprVar   {}) = False
-needsParens (PmExprLit    l) = isNegatedPmLit l
-needsParens (PmExprEq    {}) = False -- will become a wildcard
-needsParens (PmExprOther {}) = False -- will become a wildcard
-needsParens (PmExprCon c es)
-  | isTupleDataCon c || isPArrFakeCon c
-  || isConsDataCon c || null es = False
-  | otherwise                   = True
-
-pprPmExprWithParens :: PmExpr -> PmPprM SDoc
-pprPmExprWithParens expr
-  | needsParens expr = parens <$> pprPmExpr expr
-  | otherwise        =            pprPmExpr expr
-
-pprPmExprCon :: DataCon -> [PmExpr] -> PmPprM SDoc
-pprPmExprCon con args
-  | isTupleDataCon con = mkTuple <$> mapM pprPmExpr args
-  |  isPArrFakeCon con = mkPArr  <$> mapM pprPmExpr args
-  |  isConsDataCon con = pretty_list
-  | dataConIsInfix con = case args of
-      [x, y] -> do x' <- pprPmExprWithParens x
-                   y' <- pprPmExprWithParens y
-                   return (x' <+> ppr con <+> y')
-      -- can it be infix but have more than two arguments?
-      list   -> pprPanic "pprPmExprCon:" (ppr list)
-  | null args = return (ppr con)
-  | otherwise = do args' <- mapM pprPmExprWithParens args
-                   return (fsep (ppr con : args'))
-  where
-    mkTuple, mkPArr :: [SDoc] -> SDoc
-    mkTuple = parens     . fsep . punctuate comma
-    mkPArr  = paBrackets . fsep . punctuate comma
-
-    -- lazily, to be used in the list case only
-    pretty_list :: PmPprM SDoc
-    pretty_list = case isNilPmExpr (last list) of
-      True  -> brackets . fsep . punctuate comma <$> mapM pprPmExpr (init list)
-      False -> parens   . hcat . punctuate colon <$> mapM pprPmExpr list
-
-    list = list_elements args
-
-    list_elements [x,y]
-      | PmExprCon c es <- y,  nilDataCon == c = [x,y]
-      | PmExprCon c es <- y, consDataCon == c = x : list_elements es
-      | otherwise = [x,y]
-    list_elements list  = pprPanic "list_elements:" (ppr list)
-
-instance Outputable PmLit where
-  ppr (PmSLit     l) = pmPprHsLit l
-  ppr (PmOLit neg l) = (if neg then char '-' else empty) <> ppr l
-
--- not really useful for pmexprs per se
-instance Outputable PmExpr where
-  ppr e = fst $ runPmPprM (pprPmExpr e) []
diff --git a/src/Language/Haskell/Liquid/GHC.hs b/src/Language/Haskell/Liquid/GHC.hs
deleted file mode 100644
--- a/src/Language/Haskell/Liquid/GHC.hs
+++ /dev/null
@@ -1,6 +0,0 @@
--- | This module re-exports the GHC API as a single blob.
-
-module Language.Haskell.Liquid.GHC (module X) where
-
-import Language.Haskell.Liquid.GHC.Interface as X
-import Language.Haskell.Liquid.GHC.Misc      as X
diff --git a/src/Language/Haskell/Liquid/Measure.hs b/src/Language/Haskell/Liquid/Measure.hs
--- a/src/Language/Haskell/Liquid/Measure.hs
+++ b/src/Language/Haskell/Liquid/Measure.hs
@@ -72,7 +72,6 @@
   , decr       :: ![(LocSymbol, [Int])]          -- ^ Information on decreasing arguments
   , lvars      :: ![LocSymbol]                   -- ^ Variables that should be checked in the environment they are used
   , lazy       :: !(S.HashSet LocSymbol)         -- ^ Ignore Termination Check in these Functions
-  -- , axioms     :: !(S.HashSet LocSymbol)         -- ^ Binders to turn into SMT axioms
   , reflects   :: !(S.HashSet LocSymbol)         -- ^ Binders to reflect
   , autois     :: !(M.HashMap LocSymbol (Maybe Int))  -- ^ Automatically instantiate axioms in these Functions with maybe specified fuel
   , hmeas      :: !(S.HashSet LocSymbol)         -- ^ Binders to turn into measures using haskell definitions
diff --git a/src/Language/Haskell/Liquid/Parse.hs b/src/Language/Haskell/Liquid/Parse.hs
--- a/src/Language/Haskell/Liquid/Parse.hs
+++ b/src/Language/Haskell/Liquid/Parse.hs
@@ -1405,7 +1405,7 @@
 
 emptyDecl :: LocSymbol -> SourcePos -> Maybe SizeFun -> DataDecl
 emptyDecl x pos fsize
-  = D x [] [] [] [] pos fsize Nothing
+  = D x [] [] [] [] pos fsize Nothing DataReflected
 
 dataDeclBodyP :: SourcePos -> LocSymbol -> Maybe SizeFun -> Parser DataDecl
 dataDeclBodyP pos x fsize = do
@@ -1413,7 +1413,7 @@
   ps         <- predVarDefsP
   (pTy, dcs) <- dataCtorsP
   whiteSpace
-  return      $ D x ts ps [] dcs pos fsize pTy
+  return      $ D x ts ps [] dcs pos fsize pTy DataUser
 
 dataCtorsP :: Parser (Maybe BareType, [DataCtor])
 dataCtorsP
diff --git a/src/Language/Haskell/Liquid/Types.hs b/src/Language/Haskell/Liquid/Types.hs
--- a/src/Language/Haskell/Liquid/Types.hs
+++ b/src/Language/Haskell/Liquid/Types.hs
@@ -87,6 +87,8 @@
   , DataDecl (..)
   , DataCtor (..)
   , DataConP (..)
+  , HasDataDecl (..), hasDecl
+  , DataDeclKind (..)
   , TyConP   (..)
 
   -- * Pre-instantiated RType
@@ -121,7 +123,9 @@
   , efoldReft, foldReft, foldReft'
   , mapReft, mapReftM, mapPropM
   , mapBot, mapBind
+  , foldRType
 
+
   -- * ???
   , Oblig(..)
   , ignoreOblig
@@ -246,7 +250,7 @@
 import qualified Data.HashSet                           as S
 import           Data.Maybe                             (fromMaybe, mapMaybe)
 
-import           Data.List                              (nub)
+import           Data.List                              (foldl', nub)
 import           Data.Text                              (Text)
 
 
@@ -444,9 +448,11 @@
   , tyArgs     :: ![(Symbol, SpecType)]   -- ^ Value parameters
   , tyRes      :: !SpecType               -- ^ Result type
   , dcpIsGadt  :: !Bool                   -- ^ Was this specified in GADT style (if so, DONT use function names as fields)
+  , dcpModule  :: !F.Symbol               -- ^ Which module was this defined in
   , dc_locE    :: !F.SourcePos
   } deriving (Generic, Data, Typeable)
 
+
 instance F.Loc DataConP where
   srcSpan d = F.SS (dc_loc d) (dc_locE d)
 
@@ -1098,6 +1104,7 @@
   , tycSrcPos :: !F.SourcePos          -- ^ Source Position
   , tycSFun   :: Maybe SizeFun         -- ^ Default termination measure
   , tycPropTy :: Maybe BareType        -- ^ Type of Ind-Prop
+  , tycKind   :: !DataDeclKind         -- ^ User-defined or Auto-lifted
   } deriving (Data, Typeable, Generic)
 
 -- | Data Constructor
@@ -1113,6 +1120,12 @@
   | SymSizeFun F.LocSymbol -- ^ \x -> f x
   deriving (Data, Typeable, Generic)
 
+-- | What kind of `DataDecl` is it?
+data DataDeclKind
+  = DataUser           -- ^ User defined data-definitions (should have refined fields)
+  | DataReflected      -- ^ Automatically lifted data-definitions (do not have refined fields)
+  deriving (Data, Typeable, Generic)
+
 instance Show SizeFun where
   show IdSizeFun      = "IdSizeFun"
   show (SymSizeFun x) = "SymSizeFun " ++ show (F.val x)
@@ -1121,9 +1134,24 @@
 szFun IdSizeFun      = F.EVar
 szFun (SymSizeFun f) = \x -> F.mkEApp (F.symbol <$> f) [F.EVar x]
 
+data HasDataDecl
+  = NoDecl  (Maybe SizeFun)
+  | HasDecl
+  deriving (Show)
+
+hasDecl :: DataDecl -> HasDataDecl
+hasDecl d
+  | null (tycDCons d)
+  = NoDecl (tycSFun d)
+  -- // | Just s <- tycSFun d, null (tycDCons d)
+  -- // = NoDecl (Just s)
+  | otherwise
+  = HasDecl
+
 instance NFData   SizeFun
 instance B.Binary SizeFun
-
+instance NFData   DataDeclKind
+instance B.Binary DataDeclKind
 instance B.Binary DataCtor
 instance B.Binary DataDecl
 
@@ -1446,6 +1474,26 @@
     go γ (RRTy e r o t)     = RRTy  (mapSnd (go γ) <$> e) r o (go γ t)
     mo _ t@(RProp _ (RHole {})) = t
     mo γ (RProp s t)            = RProp s (go γ t)
+
+
+foldRType :: (acc -> RType c tv r -> acc) -> acc -> RType c tv r -> acc
+foldRType f = go
+  where
+    step a t                = go (f a t) t
+    prep a (RProp _ (RHole {})) = a
+    prep a (RProp _ t)      = step a t
+    go a (RVar {})          = a
+    go a (RHole {})         = a
+    go a (RExprArg {})      = a
+    go a (RAllT _ t)        = step a t
+    go a (RAllP _ t)        = step a t
+    go a (RAllS _ t)        = step a t
+    go a (RFun _ t t' _)    = foldl' step a [t, t']
+    go a (RAllE _ t t')     = foldl' step a [t, t']
+    go a (REx _ t t')       = foldl' step a [t, t']
+    go a (RAppTy t t' _)    = foldl' step a [t, t']
+    go a (RApp _ ts rs _)   = foldl' prep (foldl' step a ts) rs
+    go a (RRTy e _ _ t)     = foldl' step a (t : (snd <$> e))
 
 ------------------------------------------------------------------------------------------------------
 -- isBase' x t = traceShow ("isBase: " ++ showpp x) $ isBase t
diff --git a/src/Language/Haskell/Liquid/Types/Annotations.hs b/src/Language/Haskell/Liquid/Types/Annotations.hs
deleted file mode 100644
--- a/src/Language/Haskell/Liquid/Types/Annotations.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-
-module Language.Haskell.Liquid.Types.Annotations (
-  ) where
-
-import Data.Data
-import Data.Typeable
-
-import Language.Haskell.TH.Syntax
-
diff --git a/src/Language/Haskell/Liquid/Types/PredType.hs b/src/Language/Haskell/Liquid/Types/PredType.hs
--- a/src/Language/Haskell/Liquid/Types/PredType.hs
+++ b/src/Language/Haskell/Liquid/Types/PredType.hs
@@ -63,7 +63,7 @@
     pvs' = subts (zip αs' τs) <$> ps
 
 dataConPSpecType :: DataCon -> DataConP -> SpecType
-dataConPSpecType dc (DataConP _ vs ps ls cs yts rt _ _)
+dataConPSpecType dc (DataConP _ vs ps ls cs yts rt _ _ _)
   = mkArrow makeVars ps ls ts' rt'
   where
     (xs, ts) = unzip $ reverse yts
@@ -90,13 +90,14 @@
  show = showpp -- showSDoc . ppr
 
 instance PPrint DataConP where
-  pprintTidy k (DataConP _ vs ps ls cs yts t isGadt _)
-     =  (parens $ hsep (punctuate comma (pprintTidy k <$> vs)))  
+  pprintTidy k (DataConP _ vs ps ls cs yts t isGadt mname _)
+     =  (parens $ hsep (punctuate comma (pprintTidy k <$> vs)))
     <+> (parens $ hsep (punctuate comma (pprintTidy k <$> ps)))
     <+> (parens $ hsep (punctuate comma (pprintTidy k <$> ls)))
     <+> (parens $ hsep (punctuate comma (pprintTidy k <$> cs)))
     <+> (parens $ hsep (punctuate comma (pprintTidy k <$> yts)))
     <+> (pprintTidy k isGadt)
+    <+> (pprintTidy k mname)
     <+>  pprintTidy k t
 
 instance Show DataConP where
diff --git a/src/Language/Haskell/Liquid/UX/Server.hs b/src/Language/Haskell/Liquid/UX/Server.hs
deleted file mode 100644
--- a/src/Language/Haskell/Liquid/UX/Server.hs
+++ /dev/null
@@ -1,58 +0,0 @@
-module Language.Haskell.Liquid.UX.Server (getType) where
-
-import           Prelude hiding (error)
-
--- import           Control.Monad ((<<))
-import           Language.Haskell.Liquid.Types (Output(..))
-import qualified Language.Haskell.Liquid.UX.ACSS as A
-import           Text.PrettyPrint.HughesPJ    hiding (Mode)
-import           Language.Fixpoint.Utils.Files
-import           System.Directory
-import           Data.Time.Clock (UTCTime)
-import qualified Control.Exception as Ex
-import           Data.Aeson
-import qualified Data.ByteString.Lazy   as B
-
--- data Time = TimeTodo deriving (Eq, Ord, Show)
-
-getType :: IO (Output Doc) -> FilePath -> Int -> Int -> IO String
-getType k srcF line col = do
-  act <- action srcF
-  case act of
-    Reuse    -> getTypeInfo line col <$>       getAnnMap srcF
-    Rebuild  -> getTypeInfo line col <$> (k >> getAnnMap srcF)
-    NoSource -> return "Missing Source"
-
---------------------------------------------------------------------------------
--- | How to Get Info
---------------------------------------------------------------------------------
-
-data Action = Rebuild | Reuse | NoSource
-
-action :: FilePath -> IO Action
-action srcF = timeAction <$> modificationTime srcF <*> modificationTime jsonF
-  where
-    jsonF   = extFileName Json srcF
-
-timeAction :: Maybe UTCTime -> Maybe UTCTime -> Action
-timeAction (Just srcT) (Just jsonT)
-  | srcT < jsonT  = Reuse
-timeAction (Just _) _ = Rebuild
-timeAction Nothing _  = NoSource
-
-modificationTime :: FilePath -> IO (Maybe UTCTime)
-modificationTime f = (Just <$> getModificationTime f) `Ex.catch` handler
-  where
-    handler :: IOError -> IO (Maybe UTCTime)
-    handler = const (return Nothing)
-
---------------------------------------------------------------------------------
-
-getTypeInfo :: Int -> Int -> Maybe A.AnnMap -> String
-getTypeInfo _ _ Nothing     = "ERROR: corrupt annotation info"
-getTypeInfo l c (Just info) = error "TODO: getTypeInfo"
-
-getAnnMap :: FilePath -> IO (Maybe A.AnnMap)
-getAnnMap srcF = decode <$> B.readFile jsonF
-  where
-    jsonF      = extFileName Json srcF
diff --git a/src/Language/Haskell/Liquid/WiredIn.hs b/src/Language/Haskell/Liquid/WiredIn.hs
--- a/src/Language/Haskell/Liquid/WiredIn.hs
+++ b/src/Language/Haskell/Liquid/WiredIn.hs
@@ -119,8 +119,8 @@
 
 listTyDataCons :: ([(TyCon, TyConP)] , [(DataCon, DataConP)])
 listTyDataCons   = ( [(c, TyConP l0 [RTV tyv] [p] [] [Covariant] [Covariant] (Just fsize))]
-                   , [(nilDataCon , DataConP l0 [RTV tyv] [p] [] [] [] lt False l0)
-                     ,(consDataCon, DataConP l0 [RTV tyv] [p] [] [] cargs  lt  False l0)])
+                   , [(nilDataCon , DataConP l0 [RTV tyv] [p] [] [] [] lt False wiredInName l0)
+                     ,(consDataCon, DataConP l0 [RTV tyv] [p] [] [] cargs  lt  False wiredInName l0)])
     where
       l0         = dummyPos "LH.Bare.listTyDataCons"
       c          = listTyCon
@@ -137,9 +137,12 @@
       cargs      = [(xs, xst), (x, xt)]
       fsize      = SymSizeFun (dummyLoc "len")
 
+wiredInName :: Symbol
+wiredInName = "WiredIn"
+
 tupleTyDataCons :: Int -> ([(TyCon, TyConP)] , [(DataCon, DataConP)])
 tupleTyDataCons n = ( [(c, TyConP l0 (RTV <$> tyvs) ps [] tyvarinfo pdvarinfo Nothing)]
-                    , [(dc, DataConP l0 (RTV <$> tyvs) ps [] []  cargs  lt False l0)])
+                    , [(dc, DataConP l0 (RTV <$> tyvs) ps [] []  cargs  lt False wiredInName l0)])
   where
     tyvarinfo     = replicate n     Covariant
     pdvarinfo     = replicate (n-1) Covariant
diff --git a/stack.yaml b/stack.yaml
deleted file mode 100644
--- a/stack.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-resolver: lts-8.9
-
-packages:
-- liquid-fixpoint/
-- '.'
-
-extra-deps:
-- aeson-0.11.3.0
-- csv-table-0.1.0.1
-- dotgen-0.4.2
-- fgl-visualize-0.1.0.1
-- intern-0.9.1.4
-- located-base-0.1.1.0
-
-flags:
-  liquidhaskell:
-    devel: true
-
-extra-package-dbs: []
diff --git a/syntax/hsannot.css b/syntax/hsannot.css
deleted file mode 100644
--- a/syntax/hsannot.css
+++ /dev/null
@@ -1,51 +0,0 @@
-
-.hs-keyglyph, .hs-layout {color: red;}
-.hs-keyword {color: blue;}
-.hs-comment, .hs-comment a {color: green;}
-.hs-str, .hs-chr {color: teal;}
-.hs-keyword,.hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {}
-
-/*
-a.annot{
-    position:relative; 
-    color:#000;
-    text-decoration:none
-  }
-
-a.annot:hover{z-index:25; background-color:#ff0}
-
-a.annot span{display: none}
-
-a.annot:hover span{ 
-    display:block;
-    position:absolute;
-    top:2em; 
-    left:2em; 
-    border:5px solid #b4eeb4; 
-    background-color: #b4eeb4;
-    color:#000;
-    text-align: left 
-  }
-*/
-
-.annot{
-    position:relative; 
-    color:#000;
-    text-decoration:none
-  }
-
-.annot:hover{z-index:25; background-color:#ff0}
-
-.anntitle {display: none}
-
-.annot:hover span{ /*the span will display just on :hover state*/
-    display:block;
-    position:absolute;
-    top:2em; 
-    left:2em; 
-    border:5px solid #b4eeb4; 
-    background-color: #b4eeb4;
-    color:#000;
-    text-align: left 
-  }
-
diff --git a/syntax/hscolour.css b/syntax/hscolour.css
deleted file mode 100644
--- a/syntax/hscolour.css
+++ /dev/null
@@ -1,46 +0,0 @@
-.hs-keyglyph, .hs-layout {color: red;}
-.hs-keyword {color: blue;}
-.hs-comment, .hs-comment a {color: green;}
-.hs-str, .hs-chr {color: teal;}
-.hs-keyword,.hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {}
-
-a.annot{
-    position:relative; 
-    color:#000;
-    text-decoration:none
-  }
-
-a.annot:hover{z-index:25; background-color:#ff0}
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 2px solid #FFAD33;
-  padding: 0.8em 1em;
-}
-
-/* 
-.classic { padding: 0.8em 1em; }
-.custom { padding: 0.5em 0.8em 0.8em 2em; }
-* html a:hover { background: transparent; }
-.classic {background: #FFFFAA; border: 1px solid #FFAD33; }
-.critical { background: #FFCCAA; border: 1px solid #FF3334;	}
-.help { background: #9FDAEE; border: 1px solid #2BB0D7;	}
-.info { background: #9FDAEE; border: 1px solid #2BB0D7;	}
-.warning { background: #FFFFAA; border: 1px solid #FFAD33; }
-*/
diff --git a/syntax/liquidBody.css b/syntax/liquidBody.css
deleted file mode 100644
--- a/syntax/liquidBody.css
+++ /dev/null
@@ -1,145 +0,0 @@
-html {
-    font-family: "helvetica";
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-/* pygments */
-
-pre {
-	background-color: #f0f0f0;
-	border-top: 1px solid #ccc;
-	border-bottom: 1px solid #ccc;
-	padding: 5px;
-	font-size: 13px;
-	font-family: Bitstream Vera Sans Mono,monospace;
-}
-
-/********************** Links **************************************/
-
-a:hover { 
-  color: black; /* #1d4c77; */
-  /* text-decoration:underline */
-}
-
-
-/********************** General Divs ********************************/
-
-div#navigation {
-    text-align: center;
-    border-bottom: 4px solid black;
-}
-
-div#navigation a {
-    color: white;
-    text-decoration: none;
-    background-color: black;
-    padding: 3px 10px 3px 10px;
-    margin: 0px 10px 0px 10px;
-}
-
-body {
-    width: 700px;
-    /* width: 900px; */
-    margin: 0px auto 0px auto;
-}
-
-div#header {
-    height: 32px;
-    padding: 20px 0px 20px 60px;
-}
-
-div#header img {
-    display: inline;
-    vertical-align: middle;
-}
-
-div#header h1 {
-    padding-left: 10px;
-    display: inline;
-    text-transform: uppercase;
-    vertical-align: middle;
-}
-
-div#main {
-    margin: 0px auto 0px auto;
-    width: 760px;
-}
-
-div#sidebar {
-    margin-right: 30px;
-    width: 160px;
-    float: left;
-    text-align: right;
-}
-
-div#sidebar a {
-    display: block;
-    font-size: 110%;
-    text-decoration: none;
-    margin-bottom: 10px;
-    text-transform: uppercase;
-}
-
-div#content {
-    width: 570px;
-    float: right;
-}
-
-div#footer {
-    padding-top: 30px;
-    clear: both;
-    font-size: 90%;
-    text-align: center;
-}
-
-
-h2 {
-    font-size: 120%;
-    text-transform: uppercase;
-}
-
-h3 {
-    font-size: 100%;
-    text-transform: uppercase;
-}
-
-div.column {
-    width: 50%;
-    float: left;
-}
-
-div.column p {
-    padding-right: 15px;
-}
-
-img {
-    display: block;
-    margin: 10px auto 10px auto;
-    border: none;
-}
-
-ul {
-    list-style-type: square;
-    padding-left: 1em;
-    margin-left: 1em;
-}
-
-
-
-p.caption {
-    display: none;
-}
-
-img {
-  border:0px;
-  margin-left:auto;
-  margin-right:auto;
-  display:block
-}
diff --git a/syntax/liquid_dark_blog.css b/syntax/liquid_dark_blog.css
deleted file mode 100644
--- a/syntax/liquid_dark_blog.css
+++ /dev/null
@@ -1,101 +0,0 @@
-.hs-linenum {
-  color: #666666; //CCCCCC;
-  font-style: italic;
-}
-
-.hs-error {
-  background-color: #B80000 ;
-}
-
-.hs-keyglyph, .hs-layout { /* color: red; */ 
-  color: white;
-}
-
-.hs-keyword {
-  color: #75D075 ; 
-  //font-weight: bold;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: #7FFFD4;}
-
-.hs-conid { 
-  color: #00FFFF; 
-  //font-weight: bold; 
-}
-
-.hs-definition { 
-  color: #FFFFFF;   /* #ADFF2F; */
-  // font-weight: bold; 
-}
-
-.hs-varid, .hs-varop {
-  color: white; /* #BDDEFF; */
-}
-
-.hs-num, .hs-conop {
-  color: aquamarine;
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none;
-  white-space: pre; 
-}
-
-// a.annot:hover { 
-//   z-index:25; 
-//   background-color:#585858;
-//   /* background-color:#ff0  */
-// }
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  
-  border-radius: 5px 5px;
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  white-space:pre ;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 9999;
-  margin-left: 5; 
-  padding: 0.8em 1em;
-  border: 3px solid #6495ED ; // #5F9EA0; #FFAD33;
-  background: #EBF5FF; // #C3F6FA  #F7F8FD  #C1CDCD #FFFFAA; 
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-pre {
-  border-radius: 5px 5px;
-  // font-family: Bitstream Vera Sans Mono,monospace;
-  font-size: 100%;
-  // color: rgb(255, 255, 255);
-  // background-color: rgb(0, 0, 0);
-  // margin-bottom: 2em;
-  padding: 8px;
-  display: block;
-  overflow: visible; 
-}
-
diff --git a/syntax/liquid_light_blog.css b/syntax/liquid_light_blog.css
deleted file mode 100644
--- a/syntax/liquid_light_blog.css
+++ /dev/null
@@ -1,106 +0,0 @@
-.hs-linenum {
-  color: #CCCCCC;
-  font-style: italic;
-}
-
-
-.hs-error {
-  background-color: #FF8585 ;
-}
-
-.hs-keyglyph {
-  color: #007020
-}
-
-.hs-keyword {
-  color: #007020;
-  // font-weight: bold;
-}
-
-.hs-comment, .hs-comment a {color: green;}
-
-.hs-str, .hs-chr {color: teal;}
-
-.hs-conid { 
-  color: #902000;   /* color: #00FFFF; color: #0E84B5; */
-  //font-weight: bold;  
-}
-
-.hs-definition { 
-  color: #06287E 
-  /* font-weight: bold; */ 
-}
-
-.hs-varid, .hs-varop, .hs-layout {
-  color: black; 
-}
-
-.hs-num {
-  color: #40A070;
-}
-
-.hs-conop {
-  color: #902000; 
-}
-
-.hs-cpp {
-  color: orange;
-}
-
-.hs-sel  {}
-
-a.annot {
-  position:relative; 
-  color:#000;
-  text-decoration:none; 
-  white-space: pre; 
-}
-
-a.annot:hover { 
-  z-index:25; 
-  background-color: #D8D8D8;
-}
-
-a.annot span.annottext{display: none}
-
-a.annot:hover span.annottext{ 
-  
-  border-radius: 5px 5px;
-  
-  -moz-border-radius: 5px; 
-  -webkit-border-radius: 5px; 
-  
-  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); 
-  -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); 
-
-  white-space:pre;
-  display:block;
-  position: absolute; 
-  left: 1em; top: 2em; 
-  z-index: 99;
-  margin-left: 5; 
-  background: #FFFFAA; 
-  border: 3px solid #FFAD33;
-  padding: 0.8em 1em;
-}
-
-code {
-   /* font-weight: bold; */
-   background-color: rgb(250, 250, 250); 
-   border: 1px solid rgb(200, 200, 200);
-   padding-left: 4px;
-   padding-right: 4px;
-}
-
-pre {
-  background-color: #f0f0f0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  padding: 5px;
-  font-size: 120%;
-  // font-family: Bitstream Vera Sans Mono,monospace;
-  display: block;
-  overflow: visible;
-}
-
diff --git a/tests/TestCommits.hs b/tests/TestCommits.hs
deleted file mode 100644
--- a/tests/TestCommits.hs
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/env runhaskell
-
-{- GeneralizedNewtypeDeriving -}
-
-import System.Environment   (getArgs)
-import System.Process       (system)
-import Text.Printf          (printf)
-import Data.List            (isSuffixOf, stripPrefix)
-import Data.Maybe           (fromMaybe)
-
-{- | Run this script as:
-
-     $ ./TestCommit.hs commits.txt
-
-     where commits.txt is a file with a single git commit on each line, OR
-
-     $ ./TestCommit.hs NUMBER
-
-     which will get the last N(UMBER) of commits from the `branch`
-
- -}
-
---------------------------------------------------------------------------------
--- | Configuration parameters
---------------------------------------------------------------------------------
-
-project :: String
-project = "liquidhaskell"
--- project = "liquidhaskell --fast --test-arguments=\"-p Peano\""
-
-branch :: String
-branch = "develop"
-
-tmpFile :: FilePath
-tmpFile = "/tmp/commits"
-
-summaryPath :: FilePath
-summaryPath = "/Users/rjhala/research/stack/lh-test/tests/logs/cur/summary.csv"
-
---------------------------------------------------------------------------------
-main :: IO ()
---------------------------------------------------------------------------------
-main = do
-  p <- strParam . head <$> getArgs
-  case p of
-    File f -> testCommits f
-    Size n -> makeCommits n
-
-makeCommits :: Int -> IO ()
-makeCommits n = do
-  system (genCommand n)
-  putStrLn $ "Wrote commits into: " ++ tmpFile
-
-testCommits :: FilePath -> IO ()
-testCommits f = do
-  is <- readCommits f
-  putStrLn "Generating test summaries for:"
-  mapM_ (putStrLn . ("  " ++)) is
-  runCmd setupCmd
-  mapM_ runCommit is
-  runCmd setupCmd
-
-strParam :: String -> Param
-strParam s
-  | ".txt" `isSuffixOf` s = File s
-  | otherwise             = Size (read s)
-
---------------------------------------------------------------------------------
--- | Types
---------------------------------------------------------------------------------
-data Param = File FilePath
-           | Size Int
-
-type CommitId = String
-type Command  = [String]
-
-
---------------------------------------------------------------------------------
-_commits :: Param -> IO [CommitId]
---------------------------------------------------------------------------------
-_commits (File f) = readCommits f
-_commits (Size n) = system (genCommand n) >> readCommits tmpFile
-
-genCommand :: Int -> String
-genCommand n = printf "git log -n %d --walk-reflogs %s | grep \"commit \" > %s"
-                 n branch tmpFile
-
-readCommits :: FilePath -> IO [CommitId]
-readCommits f = map strCommit . lines <$> readFile f
-
-strCommit :: String -> CommitId
-strCommit s = fromMaybe s (stripPrefix "commit " s)
-
-
---------------------------------------------------------------------------------
-runCommit :: CommitId -> IO ()
---------------------------------------------------------------------------------
-runCommit i = do
-  putStrLn ("Running commit: " ++ i)
-  runCmd (commitCmd i)
-
-runCmd :: Command -> IO ()
-runCmd = mapM_ system
-
-setupCmd :: Command
-setupCmd = [ printf "git checkout %s" branch ]
-
-commitCmd :: CommitId -> Command
-commitCmd i =
-  [ printf "git checkout %s"       i
-  ,        "git submodule update"
-  , printf "stack test %s"         project
-  , printf "cp %s ~/tmp/summary-%s.csv" summaryPath i
-  ]
-
diff --git a/tests/equationalproofs/neg/Append.hs b/tests/equationalproofs/neg/Append.hs
deleted file mode 100644
--- a/tests/equationalproofs/neg/Append.hs
+++ /dev/null
@@ -1,93 +0,0 @@
-{-
-  A first example in equalional reasoning. 
-  From the definition of append we should be able to 
-  semi-automatically prove the three axioms.
- -}
-
-{-@ LIQUID "--no-termination" @-}
-
-module Append where
-
-data L a = N |  C a (L a) deriving (Eq)
-
-data Proof = Proof 
-
-
-append :: L a -> L a -> L a 
-append N xs        = xs
-append (C y ys) xs = C y (append ys xs) 
-
-
-{- All the followin will be autocatically generated by the definition of append
-  and a liquid annotation
-
-  axiomatize append
-
- -}
-
-{-@ measure append :: L a -> L a -> L a @-}
-{-@ assume append :: xs:L a -> ys:L a -> {v:L a | v == append xs ys } @-}
-
-{-@ assume axiom_append_nil :: xs:L a -> {v:Proof | append N xs == xs} @-} 
-axiom_append_nil :: L a -> Proof 
-axiom_append_nil xs = Proof
-
-{-@ assume axiom_append_cons :: x:a -> xs: L a -> ys: L a 
-          -> {v:Proof | append (C x xs) ys == C x (append xs ys) } @-} 
-axiom_append_cons :: a -> L a -> L a -> Proof 
-axiom_append_cons x xs ys = Proof
-
-
--- | Proof library: 
-
-{-@ toProof :: l:a -> r:{a|l = r} -> {v:Proof | l = r } @-}
-toProof :: a -> a -> Proof
-toProof x y = Proof
-
-{-@ eqProof :: l:a -> r:a -> {v:Proof | l = r} -> {v:a | v = l } @-}
-eqProof :: a -> a -> Proof -> a 
-eqProof x y _ = y 
-
-
-
--- | Proof 1: N is neutral element 
-
-{-@ prop_nil :: xs:L a -> {v:Proof | (append xs N == xs) <=> true } @-}
-prop_nil     :: Eq a => L a -> Proof
-prop_nil N   =  axiom_append_nil N 
-
-prop_nil (C x xs) = toProof e1 $ eqProof e1 (eqProof e2 e3 pr2) pr1
-   where
-   	e1  = append (C x xs) N
-   	pr1 = prop_nil xs
-   	e2  = C x (append xs N)
-   	pr2 = prop_nil xs
-   	e3  = C x xs
-
-
--- | Proof 2: append is associative
-
-
-{-@ prop_assoc :: xs:L a -> ys:L a -> zs:L a
-               -> {v:Proof | (append (append xs ys) zs == append N (append ys zs))} @-}
-prop_assoc :: Eq a => L a -> L a -> L a -> Proof
-prop_assoc N ys zs = toProof (append (append N ys) zs) $
-	                 eqProof (append (append N ys) zs) 
-                    (eqProof (append ys zs) 
-                             (append N (append ys zs))
-                             (axiom_append_nil (append ys zs))
-                    )(axiom_append_nil ys)     
-
-prop_assoc (C x xs) ys zs = 
-	toProof e1 $ 
-	eqProof e1 (eqProof e2 (eqProof e3 (eqProof e4 e5 pr4) pr3) pr2) pr1 
-  where
-  	e1  = append (append (C x xs) ys) zs
-  	pr1 = axiom_append_cons x xs ys
-  	e2  = append (C x (append xs ys)) zs
-  	pr2 = axiom_append_cons x (append xs ys) zs
-  	e3  = C x (append (append xs ys) zs)
-  	pr3 = prop_assoc xs ys zs
-  	e4  = C x (append xs (append ys zs))
-  	pr4 = axiom_append_cons x xs (append ys zs)
-  	e5  = append (C x xs) (append ys zs)
diff --git a/tests/equationalproofs/neg/Axiomatize.hs b/tests/equationalproofs/neg/Axiomatize.hs
deleted file mode 100644
--- a/tests/equationalproofs/neg/Axiomatize.hs
+++ /dev/null
@@ -1,119 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE QuasiQuotes #-}
-module Axiomatize where
-
-import Language.Haskell.TH
-import Language.Haskell.TH.Quote
-
-import Debug.Trace
-
-import Control.Applicative
-import Data.List ((\\))
-import Data.Maybe (fromMaybe)
-
-data Proof = Proof
-
-axiomatize :: Q [Dec] -> Q [Dec]
-axiomatize q = do d <- q
-                  let vts = [(x, t) | FunD x _ <- d, SigD y t <- d, x == y ]
-                  ds <- mapM (axiomatizeOne vts) d
-                  return $ trace (show d) $ concat ds
-
-axiomatizeOne :: [(Name, Type)] -> Dec -> Q [Dec]
-axiomatizeOne env f@(FunD name cs)
-  = do axioms <- makeAxioms (lookup name env) name cs
-       return $ f:axioms
-axiomatizeOne _ (SigD _ _)
-  = return []
-axiomatizeOne _ d
-  = error $ "axiomatizeOne: Cannot axiomatize" ++ show d
-
-makeAxioms :: Maybe Type -> Name -> [Clause] -> Q [Dec]
-makeAxioms t f cs = concat <$> mapM go cs
-  where
-    go :: Clause -> Q [Dec]
-    go (Clause ps (NormalB (CaseE e ms)) []) = mapM (makeAxiomMatch f ps e) ms
-    go (Clause ps (NormalB _) [])            = makeAxiomPattern t f ps
-    go d = error $ "makeAxioms: Cannot axiomatize\n" ++ show d
-
-
-
-makeAxiomPattern :: Maybe Type -> Name -> [Pat] -> Q [Dec]
-makeAxiomPattern t g ps
-  = do ifs <- mapM reify (fst <$> ds)
-       ff <- makeFun f xs <$> axiom_body
-       ft <- makeSigT t f ps
-       return $ [ff] ++ ft
-  where
-    f = mkName $ makeNamePattern g (fst <$> ds)
-    ds = [(n, dps) |  ConP n dps <- ps]
-    xs = [x | VarP x <- (ps ++ concat (snd <$> ds))]
-
-makeSigT Nothing _ _
-  = return []
-makeSigT (Just t) f ps
-  = do r <- [t|Proof|]
-       ifs <- mapM reify (fst . snd <$> ds)
-       let ts2 = concat $ zipWith makePTys ds ifs
-       return $ [SigD f $ mkUnivArrow (as, ts1 ++ ts2, r)]
-  where
-    (as, ts, _) = bkUnivFun t
-    ts1 = [t | (t, VarP _) <- zip ts ps]
-    ds  = [(t, (n, dps)) |  (t, ConP n dps) <- zip ts ps]
-
-makePTys :: (Type, (Name, [Pat])) -> Info -> [Type]
-makePTys (tr, (n, dps)) (DataConI m t _ _) | n == m
-  = (applySub θ <$> [t | (t, VarP _) <- zip ts dps])
-  where (as, ts, r) = bkUnivFun t
-        θ = unify r tr
-makePTys _ _ = error "makePTys: on invalid arguments"
-
-
-unify (VarT n) t = [(n,t)]
-unify t (VarT n) = [(n,t)]
-unify (AppT t1 t2) (AppT t1' t2') = unify t1 t1' ++ unify t2 t2'
-unify (ForallT _ _ t1) t2 = unify t1 t2
-unify t1 (ForallT _ _ t2) = unify t1 t2
-unify _ _  = []
-
-applySub :: [(Name, Type)] -> Type -> Type
-applySub θ t@(VarT v) = fromMaybe t (lookup v θ)
-applySub θ (AppT t1 t2) = AppT (applySub θ t1) (applySub θ t2)
-applySub θ (ForallT _ _ _) = error "applySub: TODO"
-applySub θ t = t
-
-
-bkUnivFun = go [] []
-  where
-    go as xs (ForallT vs _ t)   = go (as ++ vs) xs t
-    go as xs (AppT (AppT ArrowT tx) t) = go as (tx:xs) t
-    go as xs t                  = (as, reverse xs, t)
-
-mkUnivArrow (as, ts, r) = ForallT as [] $ mkArrow ts r
-  where
-    mkArrow []     r = r
-    mkArrow (t:ts) r = AppT (AppT ArrowT t) $ mkArrow ts r
-
-makeAxiomMatch :: Name -> [Pat] -> Exp -> Match -> Q Dec
-makeAxiomMatch g ps (VarE x) (Match (ConP dc dps) bd decs)
-  = makeFun f xs <$> axiom_body
-  where f  = mkName $ makeName g x dc
-        xs = [p | VarP p <- ps ++ dps] \\ [x]
-
-makeFun :: Name -> [Name] -> Exp -> Dec
-makeFun f xs bd = FunD f [Clause (VarP <$> xs) (NormalB bd) []]
-
-axiom_body :: Q Exp
-axiom_body = [|Proof|]
-
-sep = "_"
-mkSep :: [String] -> String
-mkSep []  = []
-mkSep [x] = x
-mkSep (x:xs) = x ++ sep ++ mkSep xs
-
-eq  = "is"
-makeName fname x dc
-  = mkSep ["axiom", nameBase fname, nameBase x, eq, nameBase dc]
-
-makeNamePattern fname dcs = mkSep $ ["axiom", nameBase fname] ++ (nameBase <$> dcs)
diff --git a/tests/equationalproofs/neg/Equational.hs b/tests/equationalproofs/neg/Equational.hs
deleted file mode 100644
--- a/tests/equationalproofs/neg/Equational.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-module Equational where
-
-
-import Language.Haskell.Liquid.Prelude
-import Axiomatize
-
-
-{-@ toProof :: l:a -> r:{a | l == r} -> {v:Proof | l == r } @-}
-toProof :: a -> a -> Proof
-toProof x y = Proof
-
-
-{-@ (===) :: l:a -> r:a -> {v:Proof | l = r} -> {v:a | v = l } @-}
-(===) :: a -> a -> Proof -> a
-(===) x y _ = y
-
-
-
-{-@ type Equal X Y = {v:Proof | X == Y} @-}
-
-{-@ bound chain @-}
-chain :: (Proof -> Bool) -> (Proof -> Bool) -> (Proof -> Bool)
-      -> Proof -> Proof -> Proof -> Bool
-chain p q r = \v1 v2 v3 -> p v1 ==> q v2 ==> r v3
-
-{-@  by :: forall <p :: Proof -> Prop, q :: Proof -> Prop, r :: Proof -> Prop>.
-                 {vp::Proof<p> |- Proof<q> <: Proof<r> }
-                 Proof<p> -> Proof<q> -> Proof<r>
-@-}
-by :: Proof -> Proof -> Proof
-by _ r = r
-
-{-@ refl :: x:a -> Equal x x @-}
-refl :: a -> Proof
-refl x = Proof
diff --git a/tests/equationalproofs/neg/Fibonacci.hs b/tests/equationalproofs/neg/Fibonacci.hs
deleted file mode 100644
--- a/tests/equationalproofs/neg/Fibonacci.hs
+++ /dev/null
@@ -1,67 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell      #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-{-# LANGUAGE FlexibleContexts     #-}
-{-@ LIQUID "--higherorder"     @-}
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-{-@ LIQUID "--no-prune"        @-}
-
-
-module FunctionAbstraction where
-import Axiomatize
-import Equational 
-
-
-{-@ measure fib :: Int -> Int @-}
-{-@ assume fib ::
-         n:Nat 
-      -> {v:Nat| v == fib n && if n == 0 then v == 0 else (if n == 1 then v == 1 else v == fib (n-1) + fib (n-2)) } @-}
-fib :: Int -> Int 
-fib n 
-  | n <  0    = error "cannot happen" 
-  | n == 0    = 0 
-  | n == 1    = 1
-  | otherwise = fib (n-1) + fib (n-2)
-
-infixr 2 `with`
-
-{-@ with :: forall <p :: Bool -> Prop, q::Bool -> Prop, r :: Bool -> Prop>. 
-                 {vp::Bool<p> |- Bool<q> <: Bool<r> }
-                 Bool<p> -> Bool<q> -> Bool<r> @-}
-
-with :: Bool -> Bool -> Bool
-with _ r = r
-
-fib_increasing0 :: Int -> Bool
-{-@ fib_increasing0 :: x:{Nat | x > 1} -> {v:Bool | fib x > 0} @-}
-fib_increasing0 x 
-  | x == 2
-  = fib 2 == fib 1 + fib 0 `with` fib x > 0 
-  | x > 2 
-  = fib_increasing0 (x-1) `with` 
-    fib (x-2) >= 0        `with` 
-    fib x > 0
-
-{-@ fib_increasing :: x:Nat -> y:{Nat | x < y} -> {v:Bool | fib x < fib y} / [x, y] @-} 
-fib_increasing :: Int -> Int -> Bool 
-fib_increasing x y 
-  | x == 0, y == 1
-  = fib y == 1 `with` fib x == 0
-  | x == 0
-  = fib_increasing0 y `with` fib x == 0 
-  | x == 1, y == 2
-  = fib x == 1 `with`
-    fib y == fib (y-1) + fib (y-2) 
-  | x == 1, 2 < y
-  = fib x == 1 `with` fib y == fib (y-1) + fib (y-2) `with`
-    2 < y `with` fib_increasing 1 (y-1) `with`
-    1 < fib (y-1) `with` 0 < fib (y-2) 
-  | otherwise
-  = fib x == fib (x-1) + fib (x-2) `with`
-    fib y == fib (y-1) + fib (y-2) `with`
-    fib_increasing (x-1) (y-1) `with`
-    fib (x-1) <= fib (y-1) `with` 
-    fib_increasing (x-2) (y-2) `with`
-    fib (x-2) <= fib (y-2) 
diff --git a/tests/equationalproofs/pos/AppendArrow.hs b/tests/equationalproofs/pos/AppendArrow.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/AppendArrow.hs
+++ /dev/null
@@ -1,106 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
--- |   A first example in equalional reasoning.
--- |  From the definition of append we should be able to
--- |  semi-automatically prove the two axioms.
-
--- | Note for soundness we need
--- | totallity: all the cases should be covered
--- | termination: we cannot have diverging things into proofs
-
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-module Append where
-
-import Axiomatize
-import Equational
-
-data L a = N |  C a (L a)
-
-instance Eq a => Eq (L a) where
-  N == N                 = True
-  (C x xs) == (C x' xs') = x == x' && xs == xs'
-
-{-@ axiomatize append @-}
-
-$(axiomatize
-  [d| append :: L a -> L a -> L a
-      append N xs        = xs
-      append (C y ys) xs = C y (append ys xs)
-    |])
-
-
-
-{-
-axiom_append_N :: xs: L a -> {v:Proof  |  append N xs == xs }
-axiom_append_N xs = Proof  
-
-axiom_append_C :: xs: L a -> y:a > ys: L a 
-                -> {v:Proof  |  append (C y ys) xs == C y (append ys xs) }
-axiom_append_C xs y ys  = Proof 
--}
-
-
-
--- | Proof 1: N is neutral element
-
-
--- | axiomatixation of append will not be a haskell function anymore,
--- | thus the user cannot directly access it.
--- | use a function called `use_axiom` to apply these axioms.
-
--- prop_app_nil :: Eq a => L a -> Proof
-
-{-@ prop_app_nil :: ys:L a -> {v:Proof | append ys N == ys} @-}
-prop_app_nil :: (Eq a) => L a -> Proof
-prop_app_nil N        = axiom_append_N N
-prop_app_nil (C x xs)
-    = 
-                                      -- (C x xs) ++ N
-           (axiom_append_C N x xs)
-                                      -- == C x (xs ++ N)
-      `by` (prop_app_nil xs)
-                                      -- == C x xs
-
-
-
-
--- | Proof 2: append is associative
-
-{-@ prop_assoc :: xs:L a -> ys:L a -> zs:L a
-               -> {v:Proof | append (append xs ys) zs == append xs (append ys zs) } @-}
-
-prop_assoc :: Eq a => L a -> L a -> L a -> Proof
-
-prop_assoc N ys zs  = auto 2 (append (append N ys) zs == append N (append ys zs))
--- =    refl (append (append N ys) zs) 
---           axiom_append_N ys             -- == append ys zs
---      `by` axiom_append_N (append ys zs) -- == append N (append ys zs)
-
-
-prop_assoc (C x xs) ys zs
-    = auto 2 (append (append (C x xs) ys) zs == append (C x xs) (append ys zs))
---      = refl e1
---        `by` pr1 `by` pr2 `by` pr3 `by` pr4
-  where
-    e1  = append (append (C x xs) ys) zs
-    pr1 = axiom_append_C ys x xs
-    e2  = append (C x (append xs ys)) zs
-    pr2 = axiom_append_C zs x (append xs ys)
-    e3  = C x (append (append xs ys) zs)
-    pr3 = prop_assoc xs ys zs
-    e4  = C x (append xs (append ys zs))
-    pr4 = axiom_append_C (append ys zs) x xs
-    e5  = append (C x xs) (append ys zs)
-
-
-{-@ data L [llen] @-}
-{-@ invariant {v: L a | llen v >= 0} @-}
-
-{-@ measure llen @-}
-llen :: L a -> Int
-llen N = 0
-llen (C x xs) = 1 + llen xs
diff --git a/tests/equationalproofs/pos/AppendAxiom.hs b/tests/equationalproofs/pos/AppendAxiom.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/AppendAxiom.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-
-{-@ LIQUID "--no-termination" @-}
-
-import Axiomatize
-
-data L a = N | C a (L a)
-
-
-{-@ axiomatize append @-}
-$(axiomatize
-  [d| append :: L a -> L a -> L a
-      append xs N = xs
-      append xs (C y ys) = xs
-    |])
-
-$(axiomatize
-      [d| appendCase xs ys = case xs of {N -> ys; C x xs -> C x (append xs ys)}
-    |])
-
-use_axiomN, use_axiomCaseN :: L a -> Proof
-use_axiomN xs = axiom_append_N xs
-use_axiomCaseN = axiom_appendCase_xs_is_N
-
-use_axiomC, use_axiomCaseC :: L a -> a -> L a -> Proof
-use_axiomC = axiom_append_C
-use_axiomCaseC = axiom_appendCase_xs_is_C
diff --git a/tests/equationalproofs/pos/AppendVerbose.hs b/tests/equationalproofs/pos/AppendVerbose.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/AppendVerbose.hs
+++ /dev/null
@@ -1,110 +0,0 @@
--- |   A first example in equalional reasoning.
--- |  From the definition of append we should be able to
--- |  semi-automatically prove the two axioms.
-
--- | Note for soundness we need
--- | totallity: all the cases should be covered
--- | termination: we cannot have diverging things into proofs
-
-{-@ LIQUID "--totality" @-}
-
-module Append where
-
-import Language.Haskell.Liquid.Prelude
-
-data L a = N |  C a (L a) deriving (Eq)
-
-{-@ N :: {v:L a | llen v == 0 && v == N } @-}
-{-@ C :: x:a -> xs:L a -> {v:L a | llen v == llen xs + 1 && v == C x xs } @-}
-
-{-@ data L [llen] @-}
-{-@ invariant {v: L a | llen v >= 0} @-}
-
-{-@ measure llen :: L a -> Int @-}
-llen :: L a -> Int
-llen N = 0
-llen (C x xs) = 1 + llen xs
-
-
-append :: L a -> L a -> L a
-append N xs        = xs
-append (C y ys) xs = C y (append ys xs)
-
-
--- | All the followin will be autocatically generated by the definition of append
--- |  and a liquid annotation
--- |
--- |  axiomatize append
--- |
-
-{-@ measure append :: L a -> L a -> L a @-}
-{-@ assume append :: xs:L a -> ys:L a -> {v:L a | v == append xs ys } @-}
-
-{-@ assume axiom_append_nil :: xs:L a -> {v:Proof | append N xs == xs} @-}
-axiom_append_nil :: L a -> Proof
-axiom_append_nil xs = Proof
-
-{-@ assume axiom_append_cons :: x:a -> xs: L a -> ys: L a
-          -> {v:Proof | append (C x xs) ys == C x (append xs ys) } @-}
-axiom_append_cons :: a -> L a -> L a -> Proof
-axiom_append_cons x xs ys = Proof
-
-
--- | Proof library:
-
-data Proof = Proof
-
-
-{-@ toProof :: l:a -> r:{a|l = r} -> {v:Proof | l = r } @-}
-toProof :: a -> a -> Proof
-toProof x y = Proof
-
-
-{-@ (===) :: l:a -> r:a -> {v:Proof | l = r} -> {v:a | v = l } @-}
-(===) :: a -> a -> Proof -> a
-(===) x y _ = y
-
--- | Proof 1: N is neutral element
-
-{-@ prop_nil :: xs:L a -> {v:Proof | (append xs N == xs) } @-}
-prop_nil     :: Eq a => L a -> Proof
-prop_nil N   =  axiom_append_nil N
-
-prop_nil (C x xs) = toProof e1 $ ((
-  e1 === e2) pr1
-     === e3) pr2
-   where
-   	e1  = append (C x xs) N
-   	pr1 = axiom_append_cons x xs N
-   	e2  = C x (append xs N)
-   	pr2 = prop_nil xs
-   	e3  = C x xs
-
--- | Proof 2: append is associative
-
-
-
-{-@ prop_assoc :: xs:L a -> ys:L a -> zs:L a
-               -> {v:Proof | (append (append xs ys) zs == append xs (append ys zs))} @-}
-prop_assoc :: Eq a => L a -> L a -> L a -> Proof
-prop_assoc N ys zs =
-  toProof (append (append N ys) zs) $ ((
-    append (append N ys) zs === append ys zs)             (axiom_append_nil ys)
-                            === append N (append ys zs))  (axiom_append_nil (append ys zs))
-
-prop_assoc (C x xs) ys zs =
-  toProof e1 $ ((((
-   e1  === e2) pr1
-       === e3) pr2
-       === e4) pr3
-       === e5) pr4
-  where
-    e1  = append (append (C x xs) ys) zs
-    pr1 = axiom_append_cons x xs ys
-    e2  = append (C x (append xs ys)) zs
-    pr2 = axiom_append_cons x (append xs ys) zs
-    e3  = C x (append (append xs ys) zs)
-    pr3 = prop_assoc xs ys zs
-    e4  = C x (append xs (append ys zs))
-    pr4 = axiom_append_cons x xs (append ys zs)
-    e5  = append (C x xs) (append ys zs)
diff --git a/tests/equationalproofs/pos/Arrow.hs b/tests/equationalproofs/pos/Arrow.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/Arrow.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-module Arrow where
-
-data Arrow a b = Arr {runFun :: a -> b}
diff --git a/tests/equationalproofs/pos/Axiomatize.hs b/tests/equationalproofs/pos/Axiomatize.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/Axiomatize.hs
+++ /dev/null
@@ -1,136 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE QuasiQuotes     #-}
-
-module Axiomatize where
-
-import Language.Haskell.TH
-import Language.Haskell.TH.Quote
-import Language.Haskell.TH.Syntax
-
-import Debug.Trace
-
-import Control.Applicative
-import Data.List ((\\))
-import Data.Maybe (fromMaybe)
-
-data Proof = Proof
-
-
-{-@ auto :: Int -> b:{v:Bool |Prop v} -> Proof @-}
-auto :: Int -> Bool -> Proof
-auto _ _ = Proof
-
-
-{-@ rewrite :: Int -> b:{v:Bool |Prop v} -> Proof @-}
-rewrite :: Int -> Bool -> Proof
-rewrite _ _ = Proof
-
-{-@ cases :: Int -> b:{v:Bool |Prop v} -> Proof @-}
-cases :: Int -> Bool -> Proof
-cases _ _ = Proof
-
-
-axiomatize :: Q [Dec] -> Q [Dec]
-axiomatize q = do d <- q
-                  let vts = [(x, t) | FunD x _ <- d, SigD y t <- d, x == y ]
-                  ds <- mapM (axiomatizeOne vts) d
-                  return $ concat ds
-
-axiomatizeOne :: [(Name, Type)] -> Dec -> Q [Dec]
-axiomatizeOne env f@(FunD name cs)
-  = do axioms <- makeAxioms (lookup name env) name cs
-       return $ f:axioms
-axiomatizeOne _ (SigD _ _)
-  = return []
-axiomatizeOne _ d
-  = error $ "axiomatizeOne: Cannot axiomatize" ++ show d
-
-makeAxioms :: Maybe Type -> Name -> [Clause] -> Q [Dec]
-makeAxioms t f cs = concat <$> mapM go cs
-  where
-    go :: Clause -> Q [Dec]
-    go (Clause ps (NormalB (CaseE e ms)) []) = mapM (makeAxiomMatch f ps e) ms
-    go (Clause ps (NormalB _) [])            = makeAxiomPattern t f ps
-    go d = error $ "makeAxioms: Cannot axiomatize\n" ++ show d
-
-
-
-makeAxiomPattern :: Maybe Type -> Name -> [Pat] -> Q [Dec]
-makeAxiomPattern t g ps
-  = do ifs <- mapM reify (fst <$> ds)
-       ff <- makeFun f xs <$> axiom_body
-       ft <- makeSigT t f ps
-       return $ [ff] ++ ft
-  where
-    f = mkName $ makeNamePattern g (fst <$> ds)
-    ds = [(n, dps) |  ConP n dps <- ps]
-    xs = [x | VarP x <- (ps ++ concat (snd <$> ds))]
-
-makeSigT Nothing _ _
-  = return []
-makeSigT (Just t) f ps
-  = do r <- [t|Proof|]
-       ifs <- mapM reify (fst . snd <$> ds)
-       let ts2 = concat $ zipWith makePTys ds ifs
-       return [SigD f $ mkUnivArrow (as, ts1 ++ ts2, r)]
-  where
-    (as, ts, _) = bkUnivFun t
-    ts1 = [t | (t, VarP _) <- zip ts ps]
-    ds  = [(t, (n, dps)) |  (t, ConP n dps) <- zip ts ps]
-
-makePTys :: (Type, (Name, [Pat])) -> Info -> [Type]
-makePTys (tr, (n, dps)) (DataConI m t _ _) | n == m
-  = (applySub θ <$> [t | (t, VarP _) <- zip ts dps])
-  where (as, ts, r) = bkUnivFun t
-        θ = unify r tr
-makePTys _ _ = error "makePTys: on invalid arguments"
-
-
-unify (VarT n) t = [(n,t)]
-unify t (VarT n) = [(n,t)]
-unify (AppT t1 t2) (AppT t1' t2') = unify t1 t1' ++ unify t2 t2'
-unify (ForallT _ _ t1) t2 = unify t1 t2
-unify t1 (ForallT _ _ t2) = unify t1 t2
-unify _ _  = []
-
-applySub :: [(Name, Type)] -> Type -> Type
-applySub θ t@(VarT v) = fromMaybe t (lookup v θ)
-applySub θ (AppT t1 t2) = AppT (applySub θ t1) (applySub θ t2)
-applySub θ (ForallT _ _ _) = error "applySub: TODO"
-applySub θ t = t
-
-
-bkUnivFun = go [] []
-  where
-    go as xs (ForallT vs _ t)   = go (as ++ vs) xs t
-    go as xs (AppT (AppT ArrowT tx) t) = go as (tx:xs) t
-    go as xs t                  = (as, reverse xs, t)
-
-mkUnivArrow (as, ts, r) = ForallT as [] $ mkArrow ts r
-  where
-    mkArrow []     r = r
-    mkArrow (t:ts) r = AppT (AppT ArrowT t) $ mkArrow ts r
-
-makeAxiomMatch :: Name -> [Pat] -> Exp -> Match -> Q Dec
-makeAxiomMatch g ps (VarE x) (Match (ConP dc dps) bd decs)
-  = makeFun f xs <$> axiom_body
-  where f  = mkName $ makeName g x dc
-        xs = [p | VarP p <- ps ++ dps] \\ [x]
-
-makeFun :: Name -> [Name] -> Exp -> Dec
-makeFun f xs bd = FunD f [Clause (VarP <$> xs) (NormalB bd) []]
-
-axiom_body :: Q Exp
-axiom_body = [|Proof|]
-
-sep = "_"
-mkSep :: [String] -> String
-mkSep []  = []
-mkSep [x] = x
-mkSep (x:xs) = x ++ sep ++ mkSep xs
-
-eq  = "is"
-makeName fname x dc
-  = mkSep ["axiom", nameBase fname, nameBase x, eq, nameBase dc]
-
-makeNamePattern fname dcs = mkSep $ ["axiom", nameBase fname] ++ (nameBase <$> dcs)
diff --git a/tests/equationalproofs/pos/ConcatMap.hs b/tests/equationalproofs/pos/ConcatMap.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/ConcatMap.hs
+++ /dev/null
@@ -1,98 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--higherorder"     @-}
-{- LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-
-module ConcatMap where
-
-import Axiomatize
-import Equational 
-import Prelude hiding (map, concatMap, concat)
-
-data L a = N |  C a (L a)
-
-instance Eq a => Eq (L a) where
-  N == N                 = True
-  (C x xs) == (C x' xs') = x == x' && xs == xs'
-
-{-@ axiomatize append @-}
-$(axiomatize
-  [d| append :: L a -> L a -> L a 
-      append N ys        = ys 
-      append (C x xs) ys = C x (append xs ys)
-    |])
-
-{-@ axiomatize map @-}
-$(axiomatize
-  [d| map :: (a -> b) -> L a -> L b
-      map f N        = N
-      map f (C x xs) = f x `C` map f xs 
-    |])
-
-{-@ axiomatize concatMap @-}
-$(axiomatize
-  [d| concatMap :: (a -> L b) -> L a -> L b
-      concatMap f N        = N 
-      concatMap f (C x xs) = append (f x) (concatMap f xs)
-    |])
-
-
-{-@ axiomatize concatt @-}
-
-$(axiomatize
-  [d| concatt :: L (L a) -> L a 
-      concatt N        = N 
-      concatt (C x xs) = append x (concatt xs)
-     |])
-
-
---   "concat/map" forall f xs . concat $ map f xs = concatMap f xs
-
-{-@ prop_concatMap :: f:(a -> L (L a)) -> xs:L a
-                   -> {v:Proof | (concatt (map f xs) == concatMap f xs) }  @-}
-
-prop_concatMap :: Eq a => (a -> L (L a)) -> L a -> Proof  
-prop_concatMap f xs
-   = cases 2 (concatt (map f xs) == concatMap f xs)
-
-{- 
-prop_concatMap f (C x xs)
-   = auto 1 (concatt (map f (C x xs)) == concatMap f (C x xs))
--} 
--- prop_concatMap f N
---    = auto 1 (concatt (map f N) == concatMap f N)
---   = refl e1 `by` pr1 `by` pr2 `by` pr3 
-{- 
-  where
-    e1  = concatt (map f N)
-    pr1 = axiom_map_N f
-    e2  = concatt N
-    pr2 = axiom_concatt_N
-    e3  = N
-    pr3 = axiom_concatMap_N f 
-    e4  = concatMap f N
--}
-
--- prop_concatMap f (C x xs) 
---   = auto 2 (concatt (map f (C x xs)) == concatMap f (C x xs))
-{-
-  = refl e1 `by` pr1 `by` pr2 `by` pr3 `by` pr4 
-  where 
-    e1  = concatt (map f (C x xs)) 
-    pr1 = axiom_concatt_C (f x) (map f xs)
-    pr2 = axiom_concatMap_C f x xs 
-    pr3 = axiom_map_C f x xs 
-    pr4 = prop_concatMap f xs  
--}
-
-{-@ data L [llen] @-}
-{-@ invariant {v: L a | llen v >= 0} @-}
-
-{-@ measure llen @-}
-llen          :: L a -> Int
-llen N        = 0
-llen (C x xs) = 1 + llen xs
diff --git a/tests/equationalproofs/pos/Equational.hs b/tests/equationalproofs/pos/Equational.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/Equational.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-module Equational where
-
-
-import Language.Haskell.Liquid.Prelude
-import Axiomatize
-
-
-{-@ toProof :: l:a -> r:{a | l == r} -> {v:Proof | l == r } @-}
-toProof :: a -> a -> Proof
-toProof x y = Proof
-
-
-{-@ (===) :: l:a -> r:a -> {v:Proof | l = r} -> {v:a | v = l } @-}
-(===) :: a -> a -> Proof -> a
-(===) x y _ = y
-
-
-
-{-@ type Equal X Y = {v:Proof | X == Y} @-}
-
-{-@ bound chain @-}
-chain :: (Proof -> Bool) -> (Proof -> Bool) -> (Proof -> Bool)
-      -> Proof -> Proof -> Proof -> Bool
-chain p q r = \v1 v2 v3 -> p v1 ==> q v2 ==> r v3
-
-{-@  by :: forall <p :: Proof -> Prop, q :: Proof -> Prop, r :: Proof -> Prop>.
-                 {vp::Proof<p> |- Proof<q> <: Proof<r> }
-                 Proof<p> -> Proof<q> -> Proof<r>
-@-}
-by :: Proof -> Proof -> Proof
-by _ r = r
-
-{-@ refl :: x:a -> Equal x x @-}
-refl :: a -> Proof
-refl x = Proof
diff --git a/tests/equationalproofs/pos/MapAppend.hs b/tests/equationalproofs/pos/MapAppend.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/MapAppend.hs
+++ /dev/null
@@ -1,79 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-
-module Append where
-
-import Axiomatize
-import Equational 
-import Prelude hiding (map)
-
-data L a = N |  C a (L a)
-
-instance Eq a => Eq (L a) where
-  N == N                 = True
-  (C x xs) == (C x' xs') = x == x' && xs == xs'
-
-{-@ axiomatize map @-}
-$(axiomatize
-  [d| map :: (a -> b) -> L a -> L b
-      map f N        = N
-      map f (C x xs) = C (f x) (map f xs) 
-    |])
-
-
-{-@ axiomatize append @-}
-$(axiomatize
-  [d| append :: L a -> L a -> L a 
-      append N ys        = ys 
-      append (C x xs) ys = C x (append xs ys)
-    |])
-
-
-
---   "map/append" forall f xs ys. map f (xs ++ ys) = map f xs ++ map f ys
-{-@ prop_map_append ::  f:(a -> a) -> xs:L a -> ys:L a 
-                    -> {v:Proof | map f (append xs ys) == append (map f xs) (map f ys) }
-  @-}
-prop_map_append :: Eq a => (a -> a) -> L a -> L a -> Proof
--- prop_map_append f N ys = auto 2 (map f (N `append` ys) == map f N `append` map f ys) 
--- prop_map_append f N ys = auto 2 (map f (N `append` ys) == map f N `append` map f ys) 
-prop_map_append f xs ys = cases 2 (map f (xs `append` ys) == map f xs `append` map f ys) 
-
-{- Generated axioms: 
-1. axiom_append_N (map f ys)
-2. axiom_append_N ys 
-3. axiom_map_N f 
--}  
-
-{-  
-prop_map_append f (C x xs) ys = 
-  auto 2  (map f (append (C x xs) ys) == append (map f (C x xs)) (map f ys))
-  -- refl (append (map f (C x xs)) (map f ys))
-  --   `by` pr1 `by` pr2 `by` pr3 `by` pr4 `by` pr5 
-    where
-      e1  = append (map f (C x xs)) (map f ys)
-      pr1 = axiom_map_C f x xs
-      e2  = append (C (f x) (map f xs)) (map f ys)
-      pr2 = axiom_append_C  (map f ys) (f x) (map f xs)
-      e3  = C (f x) (append (map f xs) (map f ys))
-      pr3 = prop_map_append f xs ys
-      e4 = C (f x) (map f (append xs ys))
-      pr4 = axiom_map_C f x (append xs ys)
-      e5  = map f (C x (append xs ys))
-      pr5 = axiom_append_C ys x xs
-      e6  = map f (append (C x xs) ys)
--}
-
-
-{-@ data L [llen] @-}
-{-@ invariant {v: L a | llen v >= 0} @-}
-
-{-@ measure llen @-}
-llen          :: L a -> Int
-llen N        = 0
-llen (C x xs) = 1 + llen xs
diff --git a/tests/equationalproofs/pos/MonadicLaws.hs b/tests/equationalproofs/pos/MonadicLaws.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/MonadicLaws.hs
+++ /dev/null
@@ -1,88 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
-{-@ LIQUID "--higherorder"      @-}
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-module Append where
-
-import Axiomatize
-import Equational
-import Prelude hiding (return, (>>=))
-
-
-data L a = N |  C a (L a)
-
--- | Definition of the list monad
-
-{-@ axiomatize return @-}
-$(axiomatize
-  [d| return :: a -> L a
-      return x = C x N
-    |])
-
-
-{-@ axiomatize append @-}
-$(axiomatize
-  [d| append :: L a -> L a -> L a
-      append N ys        = ys
-      append (C x xs) ys = C x (append xs ys)
-    |])
-
-{-@ axiomatize bind @-}
-$(axiomatize
-  [d| bind :: L a -> (a -> L a) -> L a
-      bind N        f = N
-      bind (C x xs) f = append (f x) (xs `bind` f)
-    |])
-
-
--- NV TODO:
--- 2. check why failure to prove takes so long
-
--- | Left identity: return a >>= f ≡ f a
-
-prop_left_identity :: Eq a => a -> (a -> L a) -> Proof
-{-@ prop_left_identity :: x:a -> f:(a -> L a)
-                       -> {v:Proof | bind (return x) f == f x} @-}
-prop_left_identity x f = auto 2 (bind (return x) f == f x)
-{- 
-  where
-    e1  = bind (return x) f
-    pr1 = axiom_return x
-    e2  = bind (C x N) f
-    pr2 = axiom_bind_C f x N
-    e3  = append (f x) (bind N f)
-    pr3 = axiom_bind_N f
-    e4  = append (f x) N
-    pr4 = prop_app_nil (f x)
-    e5  = f x
--}
-
--- | Right Identity m >>= return ≡  m
-{-@ prop_right_identity :: Eq a => xs:L a -> {v:Proof | bind xs return == xs } @-}
-prop_right_identity :: Eq a => L a -> Proof
-prop_right_identity xs =  cases 2 (bind xs return == xs) 
-
-{-@ prop_app_nil :: ys:L a -> {v:Proof | append ys N == ys} @-}
-prop_app_nil :: (Eq a) => L a -> Proof
-prop_app_nil N        = auto 1 (append N N        == N     )
-prop_app_nil (C x xs) = auto 1 (append (C x xs) N == C x xs)
-
-
--- | List definition
-
-
-instance Eq a => Eq (L a) where
-  N == N                 = True
-  (C x xs) == (C x' xs') = x == x' && xs == xs'
-
-{-@ data L [llen] @-}
-{-@ invariant {v: L a | llen v >= 0} @-}
-
-{-@ measure llen @-}
-llen :: L a -> Int
-llen N = 0
-llen (C x xs) = 1 + llen xs
diff --git a/tests/equationalproofs/pos/MonadicLawsMaybe.hs b/tests/equationalproofs/pos/MonadicLawsMaybe.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/MonadicLawsMaybe.hs
+++ /dev/null
@@ -1,79 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
-{-@ LIQUID "--higherorder"      @-}
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-module Append where
-
-import Axiomatize
-import Equational
-import Prelude hiding (Monad(..), Maybe (..))
-
-
-data Maybe a = Nothing | Just a deriving (Eq)
-
--- | Definition of the list monad
-
-{-@ axiomatize return @-}
-$(axiomatize
-  [d| return :: a -> Maybe a
-      return x = Just x 
-    |])
-
-{-@ axiomatize bind @-}
-$(axiomatize
-  [d| bind :: Maybe a -> (a -> Maybe b) -> Maybe b
-      bind Nothing  f = Nothing
-      bind (Just x) f = f x 
-    |])
-
--- | Left identity: return a >>= f ≡ f a
-
-{-@ prop_left_identity :: x:a -> f:(a -> Maybe a) -> {v:Proof | bind (return x) f == f x} @-}
-prop_left_identity :: Eq a => a -> (a -> Maybe a) -> Proof
-prop_left_identity x  f = rewrite 3 (bind (return x) f == f x)
-
-{- 
-prop_left_identity x  f = pr1 `by` pr2 
-  where
-    e1  = bind (return x) f 
-    pr1 = axiom_return x 
-    e2  = bind (Just x) f 
-    pr2 = axiom_bind_Just f x 
-    e3  = f x   
--}
-
-
--- | Right Identity m >>= return ≡  m
-{-@ prop_right_identity :: m:Maybe a -> {v:Proof | bind m return == m } @-}
-prop_right_identity :: Eq a => Maybe a -> Proof
-prop_right_identity Nothing  = rewrite 0 (bind Nothing  return == Nothing) 
-prop_right_identity (Just x) = rewrite 0 (bind (Just x) return == Just x)  
-
-{- 
-prop_right_identity Nothing = pr1 
-  where
-    e1  = bind Nothing return
-    pr1 = axiom_bind_Nothing return
-    e2  = Nothing
-
-prop_right_identity (Just x) = pr1 `by` pr2 
-  where
-    e1  = bind (Just x) return 
-    pr1 = axiom_bind_Just return x 
-    e2  = return x 
-    pr2 = axiom_return x 
-    e3  = Just x 
--}
-
-
--- | Left Associativity: (m >>= f) >>= g ≡  m >>= (\x -> f x >>= g)
-
-prop_left_associativity :: Eq a => Maybe a -> (a -> Maybe a) -> (a -> Maybe a) -> Proof 
-prop_left_associativity m f g = Proof
-
-
-
diff --git a/tests/equationalproofs/pos/MonadicLawsMaybeAssoc.hs b/tests/equationalproofs/pos/MonadicLawsMaybeAssoc.hs
deleted file mode 100644
--- a/tests/equationalproofs/pos/MonadicLawsMaybeAssoc.hs
+++ /dev/null
@@ -1,57 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
-{-@ LIQUID "--higherorder"      @-}
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-module Append where
-
-import Axiomatize
-import Equational
-import Prelude hiding (Monad(..), Maybe (..))
-
-
-data Maybe a = Nothing | Just a deriving (Eq)
-
--- | Definition of the list monad
-
-{-@ axiomatize return @-}
-$(axiomatize
-  [d| return :: a -> Maybe a
-      return x = Just x 
-    |])
-
-{-@ axiomatize bind @-}
-$(axiomatize
-  [d| bind :: Maybe a -> (a -> Maybe b) -> Maybe b
-      bind Nothing  f = Nothing
-      bind (Just x) f = f x 
-    |])
-
-
--- HERE 
-
--- | Left Associativity: (m >>= f) >>= g ≡  m >>= (\x -> f x >>= g)
-
-{- prop_left_associativity :: m:Maybe a -> f:(a -> Maybe a) -> g:(a -> Maybe a) 
-                            -> {v: Proof |  bind (bind m f) g == bind m (\x:a -> (bind (f x) g ))} @-}
-prop_left_associativity :: Eq a => Maybe a -> (a -> Maybe a) -> (a -> Maybe a) ->  Proof 
-prop_left_associativity Nothing f g = pr1 `by` pr2 `by` pr3 
-  where
-  	h   =  \x -> (bind (f x) g)
-  	e1  = bind (bind Nothing f) g 
-  	pr1 = axiom_bind_Nothing f
-  	e2  = bind Nothing g 
-  	pr2 = axiom_bind_Nothing g 
-  	e3  = Nothing 
-  	pr3 = axiom_bind_Nothing h 
-  	e4  = bind Nothing h 
-
-{- prop_left_associativity :: m:Maybe a -> f:(a -> Maybe a) -> g:(a -> Maybe a) 
-                            -> {v: Proof |  bind (bind m f) g == bind m (\x:a -> (bind (f x) g ))} @-}
-prop_left_associativity (Just x) f g = undefined --  bind (bind m f) g == bind m (\x -> (bind (f x) g ))
-
-
-
diff --git a/tests/equationalproofs/todo/Helper.hs b/tests/equationalproofs/todo/Helper.hs
deleted file mode 100644
--- a/tests/equationalproofs/todo/Helper.hs
+++ /dev/null
@@ -1,72 +0,0 @@
-
--- | Proving ackermann properties from
--- | http://www.cs.yorku.ca/~gt/papers/Ackermann-function.pdf
-
-{-@ LIQUID "--higherorder"   @-}
-{-@ LIQUID "--autoproofs"    @-}
-{-@ LIQUID "--totality"      @-}
-{-@ LIQUID "--maxparams=10"  @-}
-{-@ LIQUID "--higherorderqs" @-}
-{-@ LIQUID "--eliminate"     @-}
-
-
-module Helper (
-
-  gen_increasing, gen_increasing2
-
-  , abstract
-
-  ) where
-
-import Proves
-
--- | Function abstractio: Can I prove this?
-
-{-@ assume abstract :: f:(a -> b) -> g:(a -> b) -> (x:a -> {v:Proof | f x == g x })
-             -> {v:Proof | f == g } @-}
-abstract :: (a -> b) -> (a -> b) -> (a -> Proof) -> Proof
-abstract _ _ _ = simpleProof
-
-
-
-
--- | forall f :: a -> a
--- |   if    forall x:Nat.   f x < f (x+1)
--- |   then  forall x,y:Nat.  x < y => f x < f y
-
-
-gen_increasing :: (Int -> Int) -> (Int -> Proof) -> (Int -> Int -> Proof)
-
-
-
-{-@ gen_increasing :: f:(Nat -> Int)
-                   -> (z:Nat -> {v:Proof | f z < f (z+1) })
-                   ->  x:Nat -> y:{Nat | x < y } -> {v:Proof | f x < f y } / [y] @-}
-gen_increasing f thm x y
-
-  | x + 1 == y
-  = proof $
-      f y ==! f (x + 1)
-           >! f x       ?  thm x
-
-  | x + 1 < y
-  = proof $
-      f x  <! f (y-1)   ?   gen_increasing f thm x (y-1)
-           <! f y       ?   thm (y-1)
-
-
-gen_increasing2 :: (Int -> a -> Int) -> (a -> Int -> Proof) -> (a -> Int -> Int -> Proof)
-{-@ gen_increasing2 :: f:(Nat -> a -> Int)
-                    -> (w:a -> z:Nat -> {v:Proof | f z w < f (z+1) w })
-                    ->  c:a -> x:Nat -> y:{Nat | x < y } -> {v:Proof | f x c < f y c } / [y] @-}
-gen_increasing2 f thm c x y
-  | x + 1 == y
-  = proof $
-      f y c ==! f (x + 1) c
-             >! f x c        ? thm c x
-
-  | x + 1 < y
-  = proof $
-      f x c <! f (y-1) c    ? gen_increasing2 f thm c x (y-1)
-            <! f y c        ? thm c (y-1)
-
diff --git a/tests/equationalproofs/todo/MapFusion.hs b/tests/equationalproofs/todo/MapFusion.hs
deleted file mode 100644
--- a/tests/equationalproofs/todo/MapFusion.hs
+++ /dev/null
@@ -1,90 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
--- |   A first example in equalional reasoning.
--- |  From the definition of append we should be able to
--- |  semi-automatically prove the two axioms.
-
--- | Note for soundness we need
--- | totallity: all the cases should be covered
--- | termination: we cannot have diverging things into proofs
-
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-module Append where
-
-import Axiomatize
-import Equational 
-import Prelude hiding (map)
-
-data L a = N |  C a (L a)
-
-instance Eq a => Eq (L a) where
-  N == N                 = True
-  (C x xs) == (C x' xs') = x == x' && xs == xs'
-
-{-@ axiomatize map @-}
-
-
-$(axiomatize
-  [d| map :: (a -> b) -> L a -> L b
-      map f N        = N
-      map f (C x xs) = f x `C` map f xs 
-    |])
-
--- axioms: 
--- axiom_map_N :: forall f. map f N == N
--- axiom_map_C :: forall f x xs. map f (C x xs) == C (f x) (map f xs) 
-
-{-@ axiomatize compose @-}
-
-$(axiomatize
-  [d| compose :: (b -> c) ->(a -> b) -> (a -> c)
-      compose f g x = f (g x) 
-    |])
-
-{-@ prop_fusion :: f:(a -> a) -> g:(a -> a) -> xs:L a
-                -> {v:Proof | map f (map g xs) ==  map (compose f g) xs }  @-}
-prop_fusion     :: Eq a => (a -> a) -> (a -> a) -> L a -> Proof
-
-prop_fusion f g N = 
---   refl e1 `by` pr1 `by` pr2 `by` pr3
-    auto 2 (map f (map g N)  ==  map (compose f g) N)
-{-
-  where
-    e1  = map f (map g N)
-    pr1 = axiom_map_N g
-    e2  = map f N
-    pr2 = axiom_map_N f
-    e3  = N
-    pr3 = axiom_map_N (compose f g)
-    e4  = map (compose f g) N
--}
-
-prop_fusion f g (C x xs) = 
-   auto 2 (map f (map g (C x xs)) == map (compose f g) (C x xs))
---    refl e1 `by` pr1 `by` pr2 `by` pr3 `by` pr4 `by` pr5
-{-
-  where
-    e1 = map f (map g (C x xs))
-    pr1 = axiom_map_C g x xs
-    e2 = map f (C (g x) (map g xs))
-    pr2 = axiom_map_C f (g x) (map g xs)
-    e3 = C (f (g x)) (map f (map g xs))
-    pr3 = prop_fusion f g xs
-    e4 = C (f (g x)) (map (compose f g) xs)
-    pr4 = axiom_compose f g x
-    e5 = C ((compose f g) x) (map (compose f g) xs)
-    pr5 = axiom_map_C (compose f g) x xs
-    e6 = map (compose f g) (C x xs)
--}
-
-{-@ data L [llen] @-}
-{-@ invariant {v: L a | llen v >= 0} @-}
-
-{-@ measure llen @-}
-llen          :: L a -> Int
-llen N        = 0
-llen (C x xs) = 1 + llen xs
diff --git a/tests/equationalproofs/todo/MonadicLawsAssoc.hs b/tests/equationalproofs/todo/MonadicLawsAssoc.hs
deleted file mode 100644
--- a/tests/equationalproofs/todo/MonadicLawsAssoc.hs
+++ /dev/null
@@ -1,122 +0,0 @@
-
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
-{-@ LIQUID "--higherorder"      @-}
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-module Append where
-
-import Axiomatize
-import Equational
-import Prelude hiding (return, (>>=))
-
-
-data L a = N |  C a (L a)
-
--- | Definition of the list monad
-
-{-@ axiomatize return @-}
-$(axiomatize
-  [d| return :: a -> L a
-      return x = C x N
-    |])
-
-
-{-@ axiomatize append @-}
-$(axiomatize
-  [d| append :: L a -> L a -> L a
-      append N ys        = ys
-      append (C x xs) ys = C x (append xs ys)
-    |])
-
-{-@ axiomatize bind @-}
-$(axiomatize
-  [d| bind :: L a -> (a -> L a) -> L a
-      bind N        f = N
-      bind (C x xs) f = append (f x) (xs `bind` f)
-    |])
-
--- | Left Associativity: (m >>= f) >>= g ≡  m >>= (\x -> f x >>= g)
-
-
-helper :: Eq a => a -> L a -> (a -> L a) -> (a -> L a) -> Proof
-{-@ helper ::  x:a -> xs:L a -> f:(a -> L a) -> g:(a -> L a) 
-            ->   {v: Proof| bind (append (f x) (bind N f)) g == append (bind (f x) g) (bind (bind N f) g)} @-}
-helper x xs f g 
---   = auto 2 (bind (append fx N) g == bind fx  g )
---     = refl (bind (append (f x) (bind N f)) g) `by` pr1 `by` pr2 `by` pr3 `by` pr4 `by` pr5 
-     = auto 2 (bind (append (f x) N) g ==  bind (f x) g ) 
-  where 
-{- 
-    e1  = bind (append (f x) (bind N f)) g
-    pr1 = axiom_bind_N f 
-    e2  = bind (append (f x) N) g
-    pr2 = prop_app_nil (f x)
-    e3  = bind (f x) g 
-    pr3 = prop_app_nil (bind (f x)  g)
-    e4  = append (bind (f x) g) N
-    pr4 = axiom_bind_N f     
-    e5  = append (bind (f x) g) (bind N f)
-    pr5 = axiom_bind_N g   
-    e6  = append (bind (f x) g) (bind (bind N f) g)
-
--}
-
-
-helper x xs f g 
-  = undefined -- auto 2 ((append (f x) (xs `bind` f)) `bind` g ==  append (f x `bind` g) ((xs `bind` f) `bind` g)) 
-
-
-{-@ prop_app_nil :: ys:L a -> {v:Proof | append ys N == ys} @-}
-prop_app_nil :: (Eq a) => L a -> Proof
-prop_app_nil N        = auto 1 (append N N        == N     )
-prop_app_nil (C x xs) = auto 1 (append (C x xs) N == C x xs)
-
-prop_left_assoc :: Eq a => L a -> (a -> L a) -> (a -> L a) -> Proof
-{-@ prop_left_assoc :: m: L a -> f:(a -> L a) -> g:(a -> L a) -> Proof @-}
-prop_left_assoc N f g 
-  = refl ((N `bind` f) `bind` g) `by` pr1 `by` pr2 `by` pr3 
-  where
-    e1  = (N `bind` f) `bind` g
-    pr1 = axiom_bind_N f 
-    e2  = N `bind` g
-    pr2 = axiom_bind_N g
-    e3  = N
-    pr3 = axiom_bind_N ((\x -> f x `bind` g))
-    e4  = N `bind` (\x -> f x `bind` g)
-
-
-prop_left_assoc (C x xs) f g 
-  = undefined -- refl ((C x xs `bind` f) `bind` g) 
-  where
-    e1  = (C x xs `bind` f) `bind` g
-
-    e2 = (append (f x) (xs `bind` f)) `bind` g 
-
-
-
-
-    ei =  append (f x `bind` g) ((xs `bind` f) `bind` g)
-    ej =  append ((\x -> f x `bind` g) x) ((xs `bind` f) `bind` g)
-
-
-
-    ek =  append ((\x -> f x `bind` g) x) (xs `bind` (\x -> f x `bind` g))
-    en =  C x xs `bind` (\x -> f x `bind` g)
-
--- | List definition
-
-
-instance Eq a => Eq (L a) where
-  N == N                 = True
-  (C x xs) == (C x' xs') = x == x' && xs == xs'
-
-{-@ data L [llen] @-}
-{-@ invariant {v: L a | llen v >= 0} @-}
-
-{-@ measure llen @-}
-llen :: L a -> Int
-llen N = 0
-llen (C x xs) = 1 + llen xs
diff --git a/tests/gradual/neg/Gradual.hs b/tests/gradual/neg/Gradual.hs
deleted file mode 100644
--- a/tests/gradual/neg/Gradual.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-module Gradual where
-
-{-@ LIQUID "--gradual" @-}
-{-@ LIQUID "--eliminate=none" @-}
-
-{-@ unsafe :: {v:Int | ?? } -> Int  -> (Int, Int) @-}
-unsafe :: Int -> Int -> (Int, Int)
-unsafe _ x = (bar1 x, bar2 x)
-
-
-{-@ bar1 :: {v:Int | v < 0} -> Int @-}
-bar1 :: Int -> Int 
-bar1 x = x 
-
-{-@ bar2 :: {v:Int | v = 0} -> Int @-}
-bar2 :: Int -> Int 
-bar2 x = x
diff --git a/tests/gradual/neg/Interpretations.hs b/tests/gradual/neg/Interpretations.hs
deleted file mode 100644
--- a/tests/gradual/neg/Interpretations.hs
+++ /dev/null
@@ -1,19 +0,0 @@
--- | Sec 4 from Gradual Refinement Types 
-
-module Interpretations where
-{-@ LIQUID "--gradual" @-}
-{-@ LIQUID "--eliminate=none" @-}
-
-{-@ g :: Int -> {v:Int | v == 0 && ?? } -> Int @-} 
-g :: Int -> Int -> Int 
-g = div 
-
-
-{-@ h :: {v:Int | ?? } -> {v:Int | ?? } -> {v:Int | v == 0 && ?? } -> Int @-} 
-h :: Int -> Int -> Int -> Int 
-h x y = div (x + y)
-
-
-{-@ f :: {v:Int | ?? } -> Int -> Int @-} 
-f :: Int -> Int -> Int 
-f = div
diff --git a/tests/gradual/neg/Intro.hs b/tests/gradual/neg/Intro.hs
deleted file mode 100644
--- a/tests/gradual/neg/Intro.hs
+++ /dev/null
@@ -1,36 +0,0 @@
--- | Sec 1 from Gradual Refinement Types 
-
-module Intro where
-
-{-@ LIQUID "--gradual" @-}
-{-@ LIQUID "--eliminate=none" @-}
-
-
-checkPos :: Int -> Int 
-{-@ checkPos :: {v:Int | 0 < v} -> {v:Int | 0 < v} @-}
-checkPos x = x 
-
-{-@ check :: {v:Int | true } -> {v:Bool | true } -} 
-check :: Int -> Bool 
-check x = undefined 
-
-safe x = if check x then checkPos x else checkPos (-x) 
-
-
-a :: Int -> Bool 
-{-@ a :: {v:Int | v < 0} -> Bool @-}
-a = undefined
-
-
-b :: Int -> Int 
-{-@ b :: {v:Int | v < 10} -> Int @-}
-b = undefined
-
-
-{-@ g0 :: {v:Int | true } -> Int @-} 
-g0 :: Int -> Int 
-g0 x = if a x then 1 `div` x else b x 
-
-{-@ g1 :: {v:Int | 0 < v && ?? } -> Int @-} 
-g1 :: Int -> Int 
-g1 x = if a x then 1 `div` x else b x 
diff --git a/tests/gradual/pos/Discussion.hs b/tests/gradual/pos/Discussion.hs
deleted file mode 100644
--- a/tests/gradual/pos/Discussion.hs
+++ /dev/null
@@ -1,35 +0,0 @@
--- | Sec 9 from Gradual Refinement Types 
-
-module Discussion where
-{-@ LIQUID "--gradual" @-}
-{-@ LIQUID "--savequery" @-}
-
-{-@ check0 :: x:Int -> {v:Bool | ?? } @-} 
-check0 :: Int -> Bool 
-check0 = undefined 
-
-{-@ get :: {v:Int | 0 <= v } -> Int @-} 
-get :: Int -> Int 
-get = undefined 
-
-safe0 x = if check0 x then get x else get (-x)
-
-{-@ assume qual :: x:Int -> {v:Bool | (not v) => (x <= 0)} @-}
-qual :: Int -> Bool 
-qual = undefined 
-
-{-@ check1 :: x:Int -> {v:Bool | (v => 0 <= x) && (not v => x < 0) } @-} 
-check1 :: Int -> Bool 
-check1 = undefined 
-
-safe1 x = if check1 x then get x else get (-x)
-
-
--- | Part 2 
- 
-{-@ assume check2 :: x:Int -> {v:Bool | (v => (0 <= x)) && ?? } @-} 
-check2 :: Int -> Bool 
-check2 = undefined 
-
-safe2 :: Int -> Int 
-safe2 x = if check2 x then get x else get (-x)
diff --git a/tests/gradual/pos/Dynamic.hs b/tests/gradual/pos/Dynamic.hs
deleted file mode 100644
--- a/tests/gradual/pos/Dynamic.hs
+++ /dev/null
@@ -1,14 +0,0 @@
--- | Sec 5 from Gradual Refinement Types 
-
-module Interpretations where
-{-@ LIQUID "--gradual" @-}
-{-@ LIQUID "--eliminate=none" @-}
-
-{-@ f :: {v:Int | 0 < v } -> Int @-} 
-f :: Int -> Int 
-f = undefined  
-
-
-{-@ g :: x:{Int | ?? } -> y:{Int | x <= y } -> Int @-} 
-g :: Int -> Int -> Int 
-g x y = f y + x 
diff --git a/tests/gradual/pos/Gradual.hs b/tests/gradual/pos/Gradual.hs
deleted file mode 100644
--- a/tests/gradual/pos/Gradual.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-module Gradual where
- 
-{-@ LIQUID "--gradual"        @-}
-{-@ LIQUID "--savequery"      @-}
-{-@ LIQUID "--ginteractive"   @-}
- 
-{-@ safe :: {v:Int | ?? } -> Int @-}
-safe   :: Int ->  Int
-safe x = if foo () then bar1 x else bar2 x
- 
-{-@ foo :: () -> {v:Bool | true } @-} 
-foo :: () -> Bool 
-foo = undefined 
-
-{-@ bar1 :: {v:Int | v < 0 } -> Int @-}
-bar1   :: Int -> Int 
-bar1 x = x 
-
-{-@ bar2 :: {v:Int | v = 0} -> Int @-}
-bar2 :: Int -> Int 
-bar2 x = x
diff --git a/tests/gradual/pos/Interpretations.hs b/tests/gradual/pos/Interpretations.hs
deleted file mode 100644
--- a/tests/gradual/pos/Interpretations.hs
+++ /dev/null
@@ -1,19 +0,0 @@
--- | Sec 4 from Gradual Refinement Types 
-
-module Interpretations where
-{-@ LIQUID "--gradual"        @-}
-{-@ LIQUID "--savequery"      @-}
-{-@ LIQUID "--eliminate=none"      @-}
-
-
-{-@ f :: {v:Int | ?? } -> Int -> Int @-} 
-f :: Int -> Int -> Int 
-f = flip div
-
-{-@ g :: Int -> {v:Int | ?? } -> Int @-} 
-g :: Int -> Int -> Int 
-g = div 
-
-{-@ h :: {v:Int | ?? } -> {v:Int | ?? } -> {v:Int |  ?? } -> Int @-} 
-h :: Int -> Int -> Int -> Int 
-h x y z = div (x + y) z
diff --git a/tests/gradual/pos/Intro.hs b/tests/gradual/pos/Intro.hs
deleted file mode 100644
--- a/tests/gradual/pos/Intro.hs
+++ /dev/null
@@ -1,35 +0,0 @@
--- | Sec 1 from Gradual Refinement Types 
-
-module Intro where
-
-{-@ LIQUID "--gradual"        @-}
-{-@ LIQUID "--savequery"      @-}
-
-
-checkPos :: Int -> Int 
-{-@ checkPos :: {v:Int | 0 < v} -> {v:Int | 0 < v} @-}
-checkPos x = x 
-
-{-@ assume check :: {v:Int | ?? } -> {v:Bool | ?? } @-} 
-check :: Int -> Bool 
-check x = undefined 
-
-safe x = if check x then checkPos x else checkPos (-x) 
-
-a :: Int -> Bool 
-{-@ a :: {v:Int | v < 0} -> Bool @-}
-a = undefined
-
-
-b :: Int -> Int 
-{-@ b :: {v:Int | v < 10} -> Int @-}
-b = undefined
-
-
-{-@ g0 :: {v:Int | ?? } -> Int @-} 
-g0 :: Int -> Int 
-g0 x = if a x then 1 `div` x else b x 
-
-{-@ g1 :: {v:Int | 0 < v && ?? } -> Int @-} 
-g1 :: Int -> Int 
-g1 x = if a (x-2) then 1 `div` x else b x 
diff --git a/tests/gradual/todo/Measures.hs b/tests/gradual/todo/Measures.hs
deleted file mode 100644
--- a/tests/gradual/todo/Measures.hs
+++ /dev/null
@@ -1,12 +0,0 @@
--- | Sec 8 from Gradual Refinement Types 
-
-module Measures where
-{-@ LIQUID "--gradual" @-}
-{-@ LIQUID "--extensionality" @-}
-{-@ LIQUID "--eliminate=none" @-}
-{-@ LIQUID "--scrape-used-imports" @-}
-
--- This does not work because I need the special locality treatment for measures
-{-@ f :: x:{v:[a] | ?? } -> {v:Int | ?? } -> a -> Bool @-}
-f :: Eq a => [a] -> Int -> a -> Bool  
-f xs i y= xs!!i == y 
diff --git a/tests/import/client/ListClient.hs b/tests/import/client/ListClient.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/client/ListClient.hs
@@ -0,0 +1,38 @@
+-- | A "client" that uses the reflected definitions.
+
+{-@ LIQUID "--exact-data-con"                      @-}
+{-@ LIQUID "--higherorder"                         @-}
+{-@ LIQUID "--automatic-instances=liquidinstances" @-} 
+
+module ListClient where
+
+import Prelude hiding (concat, filter, foldr, map)
+import ListLib
+
+{-@ reflect incr @-}
+incr :: Int -> Int
+incr x = x + 1
+
+{-@ reflect isPos @-}
+isPos :: Int -> Bool 
+isPos x = x > 0 
+
+{-@ reflect ints0 @-}
+ints0 :: [Int] 
+ints0 = [0, 1, 2] 
+
+{-@ reflect ints1 @-}
+ints1 :: [Int] 
+ints1 = [1, 2, 3] 
+
+{-@ reflect ints2 @-}
+ints2 :: [Int] 
+ints2 = [1, 2] 
+
+{-@ mapProp :: () -> { map incr ints0 == ints1 } @-}
+mapProp () = ()
+
+{-@ filterProp :: () -> { filter isPos ints0 == ints2 } @-}
+filterProp () = ()
+
+
diff --git a/tests/import/lib/Bools.hs b/tests/import/lib/Bools.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/Bools.hs
@@ -0,0 +1,16 @@
+{-@ LIQUID "--exact-data-con" @-}
+
+module Bools where 
+
+{-@ measure amTrue @-}
+amTrue :: Bool -> Bool
+amTrue True = True 
+amTrue False = False 
+
+{-@ reflect boo @-}
+boo :: Bool -> Bool
+boo True = True 
+boo False = False 
+
+data Bow = Pow Int
+
diff --git a/tests/import/lib/ListLib.hs b/tests/import/lib/ListLib.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/ListLib.hs
@@ -0,0 +1,33 @@
+-- | A module with some definitions for Lists
+
+{-@ LIQUID "--exact-data-con" @-}
+{-@ LIQUID "--higherorder" @-}
+
+module ListLib where
+
+import Prelude hiding (concat, filter, foldr, map)
+
+{-@ reflect map @-}
+map :: (a -> b) -> [a] -> [b]
+map f []     = []
+map f (x:xs) = f x : map f xs
+
+{-@ reflect filter @-}
+filter :: (a -> Bool) -> [a] -> [a]
+filter f []     = []
+filter f (x:xs) = if f x then x : filter f xs else filter f xs
+
+{-@ reflect append @-}
+append :: [a] -> [a] -> [a]
+append []     ys = ys
+append (x:xs) ys = x : append xs ys
+
+{-@ reflect concat @-}
+concat :: [[a]] -> [a]
+concat []     = []
+concat (l:ls) = append l (concat ls)
+
+{-@ reflect foldr @-}
+foldr :: (a -> b -> b) -> b -> [a] -> b
+foldr f i [ ]    = i
+foldr f i (x:xs) = f x (foldr f i xs)
diff --git a/tests/import/lib/T1112.hs b/tests/import/lib/T1112.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/T1112.hs
@@ -0,0 +1,19 @@
+
+{-@ LIQUID "--higherorder"    @-}
+{-@ LIQUID "--exact-data-con" @-}
+
+module T1112 where
+
+import T1112Lib
+
+{-@ data Product @-}
+
+{-@ axiomatize leqProd @-}
+leqProd :: Eq (f p)
+        => (f p -> f p -> Bool) -> (g p -> g p -> Bool)
+        -> Product f g p -> Product f g p -> Bool
+leqProd leqFP leqGP (Product x1 y1) (Product x2 y2) =
+  if x1 == x2
+    then leqGP y1 y2
+    else leqFP x1 x2
+{-# INLINE leqProd #-}
diff --git a/tests/import/lib/T1112Lib.hs b/tests/import/lib/T1112Lib.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/T1112Lib.hs
@@ -0,0 +1,3 @@
+module T1112Lib where
+
+data Product f g p = Product (f p) (g p) deriving Eq
diff --git a/tests/import/lib/T1117.hs b/tests/import/lib/T1117.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/T1117.hs
@@ -0,0 +1,26 @@
+{-@ LIQUID "--higherorder"        @-}
+{-@ LIQUID "--exactdc"            @-}
+
+module T1117 where
+
+import T1117Lib 
+
+import Language.Haskell.Liquid.ProofCombinators
+
+{-@ axiomatize leqU1 @-}
+leqU1 :: U1 p -> U1 p -> Bool
+leqU1 _ _ = True
+
+{-@ leqU1Refl :: x:U1 p -> { leqU1 x x } @-}
+leqU1Refl :: U1 p -> Proof
+leqU1Refl U1 = leqU1 U1 U1 ==. True *** QED
+
+{-@ axiomatize leqProd @-}
+leqProd :: Eq (f p)
+        => (f p -> f p -> Bool) -> (g p -> g p -> Bool)
+        -> Product f g p -> Product f g p -> Bool
+leqProd leqFP leqGP (Product x1 y1) (Product x2 y2) =
+  if x1 == x2
+    then leqGP y1 y2
+    else leqFP x1 x2
+{-# INLINE leqProd #-}
diff --git a/tests/import/lib/T1117Lib.hs b/tests/import/lib/T1117Lib.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/T1117Lib.hs
@@ -0,0 +1,8 @@
+{-@ LIQUID "--higherorder"        @-}
+{-@ LIQUID "--exactdc"            @-}
+
+module T1117Lib where
+
+data U1 p = U1
+
+data Product f g p = Product (f p) (g p)
diff --git a/tests/import/lib/T1118.hs b/tests/import/lib/T1118.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/T1118.hs
@@ -0,0 +1,25 @@
+{-@ LIQUID "--higherorder"        @-}
+{-@ LIQUID "--exactdc"            @-}
+module T1118 where
+
+import T1118Lib2 
+import T1118Lib1
+import Language.Haskell.Liquid.ProofCombinators
+
+{-@ axiomatize leqU1 @-}
+leqU1 :: U1 p -> U1 p -> Bool
+leqU1 _ _ = True
+
+{-@ leqU1Refl :: x:U1 p -> { leqU1 x x } @-}
+leqU1Refl :: U1 p -> Proof
+leqU1Refl U1 = leqU1 U1 U1 ==. True *** QED
+
+{-@ axiomatize leqProd @-}
+leqProd :: Eq (f p)
+        => (f p -> f p -> Bool) -> (g p -> g p -> Bool)
+        -> Product f g p -> Product f g p -> Bool
+leqProd leqFP leqGP (Product x1 y1) (Product x2 y2) =
+  if x1 == x2
+    then leqGP y1 y2
+    else leqFP x1 x2
+{-# INLINE leqProd #-}
diff --git a/tests/import/lib/T1118Lib1.hs b/tests/import/lib/T1118Lib1.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/T1118Lib1.hs
@@ -0,0 +1,7 @@
+{-@ LIQUID "--higherorder"        @-}
+{-@ LIQUID "--exactdc"            @-}
+module T1118Lib1 where
+
+import T1118Lib2 
+
+{-@ data Product @-}
diff --git a/tests/import/lib/T1118Lib2.hs b/tests/import/lib/T1118Lib2.hs
new file mode 100644
--- /dev/null
+++ b/tests/import/lib/T1118Lib2.hs
@@ -0,0 +1,4 @@
+module T1118Lib2 where
+
+data U1 p = U1
+data Product f g p = Product (f p) (g p)
diff --git a/tests/log/summary-develop.csv b/tests/log/summary-develop.csv
deleted file mode 100644
--- a/tests/log/summary-develop.csv
+++ /dev/null
@@ -1,690 +0,0 @@
- (HEAD, origin/develop, develop) : 282e73b5d0aec4d7b9d4b650508fc02ec377ef0a
-Timestamp: 2016-05-06 17:22:05 -0700
-Epoch Timestamp: 1462580525
---------------------------------------------------------------------------------
-test, time(s), result
-
-Tests/Unit/pos/zipW2.hs, 0.8046, True
-Tests/Unit/pos/zipW1.hs, 0.7420, True
-Tests/Unit/pos/zipW.hs, 0.7591, True
-Tests/Unit/pos/zipSO.hs, 0.8517, True
-Tests/Unit/pos/zipper000.hs, 0.9855, True
-Tests/Unit/pos/zipper0.hs, 1.2729, True
-Tests/Unit/pos/zipper.hs, 3.0113, True
-Tests/Unit/pos/wrap1.hs, 0.9779, True
-Tests/Unit/pos/wrap0.hs, 0.7580, True
-Tests/Unit/pos/Words1.hs, 0.6964, True
-Tests/Unit/pos/Words.hs, 0.6662, True
-Tests/Unit/pos/WBL0.hs, 1.8904, True
-Tests/Unit/pos/WBL.hs, 1.4032, True
-Tests/Unit/pos/vector2.hs, 1.3548, True
-Tests/Unit/pos/vector1b.hs, 1.0504, True
-Tests/Unit/pos/vector1a.hs, 1.0712, True
-Tests/Unit/pos/vector1.hs, 1.0077, True
-Tests/Unit/pos/vector00.hs, 0.7860, True
-Tests/Unit/pos/vector0.hs, 1.2047, True
-Tests/Unit/pos/vecloop.hs, 0.9001, True
-Tests/Unit/pos/Variance.hs, 0.6916, True
-Tests/Unit/pos/unusedtyvars.hs, 0.6755, True
-Tests/Unit/pos/tyvar.hs, 0.6821, True
-Tests/Unit/pos/TypeAlias.hs, 0.6753, True
-Tests/Unit/pos/tyfam0.hs, 0.7293, True
-Tests/Unit/pos/tyExpr.hs, 0.6789, True
-Tests/Unit/pos/tyclass0.hs, 0.6572, True
-Tests/Unit/pos/tupparse.hs, 0.7410, True
-Tests/Unit/pos/tup0.hs, 0.6751, True
-Tests/Unit/pos/transTAG.hs, 1.6077, True
-Tests/Unit/pos/transpose.hs, 1.8173, True
-Tests/Unit/pos/trans.hs, 1.0137, True
-Tests/Unit/pos/ToyMVar.hs, 0.9254, True
-Tests/Unit/pos/TopLevel.hs, 0.7259, True
-Tests/Unit/pos/top0.hs, 0.7734, True
-Tests/Unit/pos/TokenType.hs, 0.6585, True
-Tests/Unit/pos/testRec.hs, 0.7121, True
-Tests/Unit/pos/Test761.hs, 0.7347, True
-Tests/Unit/pos/test2.hs, 0.7204, True
-Tests/Unit/pos/test1.hs, 0.7415, True
-Tests/Unit/pos/test00c.hs, 0.8976, True
-Tests/Unit/pos/test00b.hs, 0.7311, True
-Tests/Unit/pos/test000.hs, 0.7302, True
-Tests/Unit/pos/test00.old.hs, 0.7125, True
-Tests/Unit/pos/test00.hs, 0.7197, True
-Tests/Unit/pos/test00-int.hs, 0.7304, True
-Tests/Unit/pos/test0.hs, 0.7181, True
-Tests/Unit/pos/TerminationNum0.hs, 0.6990, True
-Tests/Unit/pos/TerminationNum.hs, 0.6751, True
-Tests/Unit/pos/Termination.lhs, 1.2537, True
-Tests/Unit/pos/term0.hs, 0.8020, True
-Tests/Unit/pos/Term.hs, 0.7211, True
-Tests/Unit/pos/take.hs, 1.0053, True
-Tests/Unit/pos/tagBinder.hs, 0.6522, True
-Tests/Unit/pos/T598.hs, 0.8593, True
-Tests/Unit/pos/T595a.hs, 0.6777, True
-Tests/Unit/pos/T595.hs, 0.7500, True
-Tests/Unit/pos/T531.hs, 0.6583, True
-Tests/Unit/pos/Sum.hs, 0.7563, True
-Tests/Unit/pos/StructRec.hs, 0.6970, True
-Tests/Unit/pos/Strings.hs, 0.7272, True
-Tests/Unit/pos/StringLit.hs, 0.6739, True
-Tests/Unit/pos/string00.hs, 0.7237, True
-Tests/Unit/pos/StrictPair1.hs, 0.9248, True
-Tests/Unit/pos/StrictPair0.hs, 0.7165, True
-Tests/Unit/pos/StreamInvariants.hs, 0.6783, True
-Tests/Unit/pos/stateInvarint.hs, 0.8960, True
-Tests/Unit/pos/StateF00.hs, 0.7136, True
-Tests/Unit/pos/StateConstraints00.hs, 0.6941, True
-Tests/Unit/pos/StateConstraints0.hs, 8.5580, True
-Tests/Unit/pos/StateConstraints.hs, 4.7533, True
-Tests/Unit/pos/State1.hs, 0.7221, True
-Tests/Unit/pos/state00.hs, 0.7158, True
-Tests/Unit/pos/State.hs, 0.8828, True
-Tests/Unit/pos/stacks0.hs, 0.7889, True
-Tests/Unit/pos/StackClass.hs, 0.7319, True
-Tests/Unit/pos/spec0.hs, 0.8261, True
-Tests/Unit/pos/Solver.hs, 1.1833, True
-Tests/Unit/pos/SimplerNotation.hs, 0.6711, True
-Tests/Unit/pos/selfList.hs, 0.9645, True
-Tests/Unit/pos/scanr.hs, 0.8346, True
-Tests/Unit/pos/SafePartialFunctions.hs, 0.7138, True
-Tests/Unit/pos/risers.hs, 1.2191, True
-Tests/Unit/pos/ResolvePred.hs, 0.6941, True
-Tests/Unit/pos/ResolveB.hs, 0.6481, True
-Tests/Unit/pos/ResolveA.hs, 0.6623, True
-Tests/Unit/pos/Resolve.hs, 0.6608, True
-Tests/Unit/pos/repeatHigherOrder.hs, 1.0108, True
-Tests/Unit/pos/Repeat.hs, 0.7135, True
-Tests/Unit/pos/RelativeComplete.hs, 0.7293, True
-Tests/Unit/pos/recursion0.hs, 0.7034, True
-Tests/Unit/pos/RecSelector.hs, 0.7960, True
-Tests/Unit/pos/RecQSort0.hs, 0.9562, True
-Tests/Unit/pos/RecQSort.hs, 1.0206, True
-Tests/Unit/pos/RecordSelectorError.hs, 0.7164, True
-Tests/Unit/pos/record1.hs, 0.7421, True
-Tests/Unit/pos/record0.hs, 0.8318, True
-Tests/Unit/pos/rec_annot_go.hs, 0.8982, True
-Tests/Unit/pos/RealProps1.hs, 0.7265, True
-Tests/Unit/pos/RealProps.hs, 0.7535, True
-Tests/Unit/pos/RBTree.hs, 1.0661, True
-Tests/Unit/pos/RBTree-ord.hs, 8.2893, True
-Tests/Unit/pos/RBTree-height.hs, 3.4410, True
-Tests/Unit/pos/RBTree-color.hs, 3.7845, True
-Tests/Unit/pos/RBTree-col-height.hs, 5.2851, True
-Tests/Unit/pos/rangeAdt.hs, 1.6620, True
-Tests/Unit/pos/range1.hs, 0.8005, True
-Tests/Unit/pos/range.hs, 0.9886, True
-Tests/Unit/pos/qualTest.hs, 0.7478, True
-Tests/Unit/pos/QSort.hs, 1.4716, True
-Tests/Unit/pos/propmeasure1.hs, 0.6626, True
-Tests/Unit/pos/propmeasure.hs, 0.7961, True
-Tests/Unit/pos/Propability.hs, 0.7806, True
-Tests/Unit/pos/profcrasher.hs, 0.7105, True
-Tests/Unit/pos/Product.hs, 1.0069, True
-Tests/Unit/pos/primInt0.hs, 0.8484, True
-Tests/Unit/pos/pred.hs, 0.7099, True
-Tests/Unit/pos/pragma0.hs, 0.6917, True
-Tests/Unit/pos/poslist_dc.hs, 0.8027, True
-Tests/Unit/pos/poslist.hs, 0.9802, True
-Tests/Unit/pos/polyqual.hs, 0.9248, True
-Tests/Unit/pos/polyfun.hs, 0.7572, True
-Tests/Unit/pos/poly4.hs, 0.7345, True
-Tests/Unit/pos/poly3a.hs, 0.7303, True
-Tests/Unit/pos/poly3.hs, 0.7437, True
-Tests/Unit/pos/poly2.hs, 0.7846, True
-Tests/Unit/pos/poly2-degenerate.hs, 0.7547, True
-Tests/Unit/pos/poly1.hs, 0.7808, True
-Tests/Unit/pos/poly0.hs, 0.7877, True
-Tests/Unit/pos/PointDist.hs, 0.9880, True
-Tests/Unit/pos/PlugHoles.hs, 0.6744, True
-Tests/Unit/pos/PersistentVector.hs, 0.8074, True
-Tests/Unit/pos/Permutation.hs, 2.0219, True
-Tests/Unit/pos/partialmeasure.hs, 0.7036, True
-Tests/Unit/pos/partial-tycon.hs, 0.6908, True
-Tests/Unit/pos/pargs1.hs, 0.6910, True
-Tests/Unit/pos/pargs.hs, 0.6989, True
-Tests/Unit/pos/PairMeasure0.hs, 0.7290, True
-Tests/Unit/pos/PairMeasure.hs, 0.7137, True
-Tests/Unit/pos/pair00.hs, 1.2826, True
-Tests/Unit/pos/pair0.hs, 1.4063, True
-Tests/Unit/pos/pair.hs, 1.5088, True
-Tests/Unit/pos/Overwrite.hs, 0.7084, True
-Tests/Unit/pos/OrdList.hs, 20.4459, True
-Tests/Unit/pos/nullterm.hs, 1.0949, True
-Tests/Unit/pos/NoExhaustiveGuardsError.hs, 0.7121, True
-Tests/Unit/pos/NoCaseExpand.hs, 1.0609, True
-Tests/Unit/pos/niki1.hs, 0.7688, True
-Tests/Unit/pos/niki.hs, 0.7512, True
-Tests/Unit/pos/nats.hs, 1.1694, True
-Tests/Unit/pos/MutualRec.hs, 1.9639, True
-Tests/Unit/pos/mutrec.hs, 0.7172, True
-Tests/Unit/pos/MultipleInvariants.hs, 0.7027, True
-Tests/Unit/pos/multi-pred-app-00.hs, 0.6771, True
-Tests/Unit/pos/Moo.hs, 0.6658, True
-Tests/Unit/pos/monad7.hs, 0.9704, True
-Tests/Unit/pos/monad6.hs, 0.7766, True
-Tests/Unit/pos/monad5.hs, 0.9161, True
-Tests/Unit/pos/monad2.hs, 0.6981, True
-Tests/Unit/pos/monad1.hs, 0.6731, True
-Tests/Unit/pos/modTest.hs, 0.7711, True
-Tests/Unit/pos/Mod2.hs, 0.6876, True
-Tests/Unit/pos/Mod1.hs, 0.6902, True
-Tests/Unit/pos/MergeSort.hs, 2.2196, True
-Tests/Unit/pos/Merge1.hs, 0.8288, True
-Tests/Unit/pos/MeasureSets.hs, 0.7270, True
-Tests/Unit/pos/Measures1.hs, 0.6718, True
-Tests/Unit/pos/Measures.hs, 0.6792, True
-Tests/Unit/pos/MeasureDups.hs, 0.7601, True
-Tests/Unit/pos/MeasureContains.hs, 0.7507, True
-Tests/Unit/pos/meas9.hs, 0.7991, True
-Tests/Unit/pos/meas8.hs, 0.7465, True
-Tests/Unit/pos/meas7.hs, 0.7121, True
-Tests/Unit/pos/meas6.hs, 0.8840, True
-Tests/Unit/pos/meas5.hs, 1.2681, True
-Tests/Unit/pos/meas4.hs, 0.8438, True
-Tests/Unit/pos/meas3.hs, 0.8466, True
-Tests/Unit/pos/meas2.hs, 0.7545, True
-Tests/Unit/pos/meas11.hs, 0.7639, True
-Tests/Unit/pos/meas10.hs, 0.8027, True
-Tests/Unit/pos/meas1.hs, 0.7810, True
-Tests/Unit/pos/meas0a.hs, 0.7873, True
-Tests/Unit/pos/meas00a.hs, 0.7200, True
-Tests/Unit/pos/meas00.hs, 0.7592, True
-Tests/Unit/pos/meas0.hs, 0.7601, True
-Tests/Unit/pos/maybe4.hs, 0.7064, True
-Tests/Unit/pos/maybe3.hs, 0.7180, True
-Tests/Unit/pos/maybe2.hs, 1.1633, True
-Tests/Unit/pos/maybe1.hs, 0.8372, True
-Tests/Unit/pos/maybe000.hs, 0.7200, True
-Tests/Unit/pos/maybe00.hs, 0.6818, True
-Tests/Unit/pos/maybe0.hs, 0.7295, True
-Tests/Unit/pos/maybe.hs, 1.1110, True
-Tests/Unit/pos/mapTvCrash.hs, 0.7188, True
-Tests/Unit/pos/maps1.hs, 0.8033, True
-Tests/Unit/pos/maps.hs, 0.7911, True
-Tests/Unit/pos/mapreduce.hs, 1.8906, True
-Tests/Unit/pos/mapreduce-bare.hs, 3.5676, True
-Tests/Unit/pos/Map2.hs, 16.4156, True
-Tests/Unit/pos/Map0.hs, 15.6414, True
-Tests/Unit/pos/Map.hs, 15.3783, True
-Tests/Unit/pos/malformed0.hs, 1.1082, True
-Tests/Unit/pos/Loo.hs, 0.6856, True
-Tests/Unit/pos/LocalTermExpr.hs, 0.7751, True
-Tests/Unit/pos/LocalSpecImp.hs, 0.6857, True
-Tests/Unit/pos/LocalSpec0.hs, 0.6765, True
-Tests/Unit/pos/LocalSpec.hs, 0.7340, True
-Tests/Unit/pos/LocalLazy.hs, 0.7356, True
-Tests/Unit/pos/LocalHole.hs, 0.7306, True
-Tests/Unit/pos/lit.hs, 0.6990, True
-Tests/Unit/pos/ListSort.hs, 2.9328, True
-Tests/Unit/pos/listSetDemo.hs, 0.8246, True
-Tests/Unit/pos/listSet.hs, 0.8183, True
-Tests/Unit/pos/ListReverse-LType.hs, 0.7676, True
-Tests/Unit/pos/ListRange.hs, 0.8350, True
-Tests/Unit/pos/ListRange-LType.hs, 0.8313, True
-Tests/Unit/pos/listqual.hs, 0.7386, True
-Tests/Unit/pos/ListQSort.hs, 1.4220, True
-Tests/Unit/pos/ListQSort-LType.hs, 1.3387, True
-Tests/Unit/pos/ListMSort.hs, 2.4582, True
-Tests/Unit/pos/ListMSort-LType.hs, 4.0770, True
-Tests/Unit/pos/ListLen.hs, 1.3169, True
-Tests/Unit/pos/ListLen-LType.hs, 1.2292, True
-Tests/Unit/pos/ListKeys.hs, 0.7766, True
-Tests/Unit/pos/ListISort.hs, 1.1008, True
-Tests/Unit/pos/ListISort-LType.hs, 1.2977, True
-Tests/Unit/pos/ListElem.hs, 0.8845, True
-Tests/Unit/pos/ListConcat.hs, 1.0046, True
-Tests/Unit/pos/listAnf.hs, 0.8492, True
-Tests/Unit/pos/LiquidClass.hs, 0.7707, True
-Tests/Unit/pos/LiquidArray.hs, 0.8232, True
-Tests/Unit/pos/lex.hs, 0.8430, True
-Tests/Unit/pos/lets.hs, 1.2676, True
-Tests/Unit/pos/LazyWhere1.hs, 0.8079, True
-Tests/Unit/pos/LazyWhere.hs, 0.7932, True
-Tests/Unit/pos/LambdaEvalTiny.hs, 1.5356, True
-Tests/Unit/pos/LambdaEvalSuperTiny.hs, 1.6086, True
-Tests/Unit/pos/LambdaEvalMini.hs, 3.4929, True
-Tests/Unit/pos/LambdaEval.hs, 24.2819, True
-Tests/Unit/pos/LambdaDeBruijn.hs, 1.6556, True
-Tests/Unit/pos/kmpVec.hs, 1.4646, True
-Tests/Unit/pos/kmpIO.hs, 0.8855, True
-Tests/Unit/pos/kmp.hs, 1.8785, True
-Tests/Unit/pos/Keys.hs, 0.7501, True
-Tests/Unit/pos/jeff.hs, 10.8492, True
-Tests/Unit/pos/ite1.hs, 0.6996, True
-Tests/Unit/pos/ite.hs, 0.7147, True
-Tests/Unit/pos/invlhs.hs, 0.6895, True
-Tests/Unit/pos/Invariants.hs, 1.0537, True
-Tests/Unit/pos/Interpreter.lhs, 3.0512, True
-Tests/Unit/pos/inline1.hs, 0.9490, True
-Tests/Unit/pos/inline.hs, 0.9680, True
-Tests/Unit/pos/initarray.hs, 1.2632, True
-Tests/Unit/pos/infix.hs, 0.8903, True
-Tests/Unit/pos/Infinity.hs, 0.8567, True
-Tests/Unit/pos/incRec.hs, 0.7327, True
-Tests/Unit/pos/implies.hs, 0.8057, True
-Tests/Unit/pos/imp0.hs, 0.7640, True
-Tests/Unit/pos/idNat0.hs, 0.7022, True
-Tests/Unit/pos/idNat.hs, 0.7317, True
-Tests/Unit/pos/IcfpDemo.hs, 0.9190, True
-Tests/Unit/pos/Holes.hs, 0.8138, True
-Tests/Unit/pos/hole-fun.hs, 0.7088, True
-Tests/Unit/pos/hole-app.hs, 0.7188, True
-Tests/Unit/pos/HigherOrderRecFun.hs, 0.7236, True
-Tests/Unit/pos/hello.hs, 1.0276, True
-Tests/Unit/pos/HedgeUnion.hs, 0.8780, True
-Tests/Unit/pos/HaskellMeasure.hs, 0.7298, True
-Tests/Unit/pos/HasElem.hs, 0.7334, True
-Tests/Unit/pos/grty3.hs, 0.7470, True
-Tests/Unit/pos/grty2.hs, 0.7321, True
-Tests/Unit/pos/grty1.hs, 0.7348, True
-Tests/Unit/pos/grty0.hs, 0.7204, True
-Tests/Unit/pos/Graph.hs, 0.9780, True
-Tests/Unit/pos/Gradual.hs, 0.0003, True
-Tests/Unit/pos/GoodHMeas.hs, 0.7365, True
-Tests/Unit/pos/Goo.hs, 0.8339, True
-Tests/Unit/pos/go_ugly_type.hs, 1.0360, True
-Tests/Unit/pos/go.hs, 1.0016, True
-Tests/Unit/pos/gimme.hs, 0.8045, True
-Tests/Unit/pos/GhcSort3.T.hs, 1.6722, True
-Tests/Unit/pos/GhcSort3.hs, 3.7254, True
-Tests/Unit/pos/GhcSort2.hs, 2.9714, True
-Tests/Unit/pos/GhcSort1.hs, 3.6082, True
-Tests/Unit/pos/GhcListSort.hs, 6.7895, True
-Tests/Unit/pos/GeneralizedTermination.hs, 0.8259, True
-Tests/Unit/pos/GCD.hs, 0.9686, True
-Tests/Unit/pos/GADTs.hs, 0.7504, True
-Tests/Unit/pos/gadtEval.hs, 1.2798, True
-Tests/Unit/pos/Fractional.hs, 0.7503, True
-Tests/Unit/pos/forloop.hs, 0.8764, True
-Tests/Unit/pos/for.hs, 0.9395, True
-Tests/Unit/pos/Foo.hs, 0.7369, True
-Tests/Unit/pos/foldr.hs, 0.8026, True
-Tests/Unit/pos/foldN.hs, 0.7592, True
-Tests/Unit/pos/Foldl.hs, 5.6430, True
-Tests/Unit/pos/Fixme.hs, 0.4782, False
-Tests/Unit/pos/filterAbs.hs, 0.8910, True
-Tests/Unit/pos/FFI.hs, 0.8925, True
-Tests/Unit/pos/failName.hs, 0.7885, True
-Tests/Unit/pos/extype.hs, 0.7870, True
-Tests/Unit/pos/exp0.hs, 0.8220, True
-Tests/Unit/pos/ex1.hs, 0.8220, True
-Tests/Unit/pos/ex01.hs, 0.7283, True
-Tests/Unit/pos/ex0.hs, 0.7740, True
-Tests/Unit/pos/Even0.hs, 0.7382, True
-Tests/Unit/pos/Even.hs, 0.6989, True
-Tests/Unit/pos/Eval.hs, 0.8454, True
-Tests/Unit/pos/eqelems.hs, 0.7296, True
-Tests/Unit/pos/elim01.hs, 0.7712, True
-Tests/Unit/pos/elim00.hs, 0.9294, True
-Tests/Unit/pos/elems.hs, 0.7497, True
-Tests/Unit/pos/elements.hs, 1.2040, True
-Tests/Unit/pos/duplicate-bind.hs, 0.7624, True
-Tests/Unit/pos/dropwhile.hs, 1.1568, True
-Tests/Unit/pos/div000.hs, 0.7194, True
-Tests/Unit/pos/Diff.hs, 0.7179, True
-Tests/Unit/pos/deptupW.hs, 0.8146, True
-Tests/Unit/pos/deptup3.hs, 0.8304, True
-Tests/Unit/pos/deptup1.hs, 1.0227, True
-Tests/Unit/pos/deptup0.hs, 0.9218, True
-Tests/Unit/pos/deptup.hs, 1.2726, True
-Tests/Unit/pos/deppair1.hs, 0.8677, True
-Tests/Unit/pos/deppair0.hs, 0.9051, True
-Tests/Unit/pos/deepmeas0.hs, 0.8856, True
-Tests/Unit/pos/DB00.hs, 0.8001, True
-Tests/Unit/pos/dataConQuals.hs, 0.7328, True
-Tests/Unit/pos/datacon1.hs, 0.7359, True
-Tests/Unit/pos/datacon0.hs, 0.8782, True
-Tests/Unit/pos/datacon-inv.hs, 0.7463, True
-Tests/Unit/pos/DataBase.hs, 0.7912, True
-Tests/Unit/pos/data2.hs, 0.8629, True
-Tests/Unit/pos/cut00.hs, 0.9637, True
-Tests/Unit/pos/csgordon_issue_296.hs, 0.9568, True
-Tests/Unit/pos/CountMonad.hs, 0.8422, True
-Tests/Unit/pos/coretologic.hs, 0.9599, True
-Tests/Unit/pos/contra0.hs, 0.8227, True
-Tests/Unit/pos/ConstraintsAppend.hs, 1.3965, True
-Tests/Unit/pos/Constraints.hs, 0.8104, True
-Tests/Unit/pos/comprehensionTerm.hs, 1.1129, True
-Tests/Unit/pos/CompareConstraints.hs, 1.2335, True
-Tests/Unit/pos/compare2.hs, 0.7855, True
-Tests/Unit/pos/compare1.hs, 0.7883, True
-Tests/Unit/pos/compare.hs, 0.8621, True
-Tests/Unit/pos/CommentedOut.hs, 1.1233, True
-Tests/Unit/pos/Coercion.hs, 0.7177, True
-Tests/Unit/pos/cmptag0.hs, 0.7769, True
-Tests/Unit/pos/ClojurVector.hs, 0.9000, True
-Tests/Unit/pos/ClassReg.hs, 0.7063, True
-Tests/Unit/pos/Class2.hs, 0.6933, True
-Tests/Unit/pos/Class.hs, 1.1571, True
-Tests/Unit/pos/case-lambda-join.hs, 1.1120, True
-Tests/Unit/pos/BST000.hs, 1.8360, True
-Tests/Unit/pos/BST.hs, 8.7355, True
-Tests/Unit/pos/bounds1.hs, 0.7379, True
-Tests/Unit/pos/Books.hs, 0.7995, True
-Tests/Unit/pos/BinarySearch.hs, 0.9454, True
-Tests/Unit/pos/bar.hs, 0.7507, True
-Tests/Unit/pos/bangPatterns.hs, 0.7607, True
-Tests/Unit/pos/AVLRJ.hs, 2.6742, True
-Tests/Unit/pos/AVL.hs, 2.2005, True
-Tests/Unit/pos/Avg.hs, 0.7753, True
-Tests/Unit/pos/AutoTerm1.hs, 0.7302, True
-Tests/Unit/pos/AutoTerm.hs, 0.8322, True
-Tests/Unit/pos/AutoSize.hs, 0.7583, True
-Tests/Unit/pos/AssumedRecursive.hs, 0.6913, True
-Tests/Unit/pos/Assume0.hs, 0.7300, True
-Tests/Unit/pos/Assume.hs, 0.7824, True
-Tests/Unit/pos/anish1.hs, 0.7696, True
-Tests/Unit/pos/anftest.hs, 0.7671, True
-Tests/Unit/pos/anfbug.hs, 0.8209, True
-Tests/Unit/pos/AmortizedQueue.hs, 0.9068, True
-Tests/Unit/pos/alphaconvert-Set.hs, 1.0940, True
-Tests/Unit/pos/alphaconvert-List.hs, 1.3082, True
-Tests/Unit/pos/alias01.hs, 1.1252, True
-Tests/Unit/pos/alias00.hs, 0.8920, True
-Tests/Unit/pos/adt0.hs, 1.0042, True
-Tests/Unit/pos/Ackermann.hs, 0.7849, True
-Tests/Unit/pos/absref-crash0.hs, 0.7734, True
-Tests/Unit/pos/absref-crash.hs, 0.6982, True
-Tests/Unit/pos/Abs.hs, 0.7181, True
-Tests/Unit/neg/wrap1.hs, 1.3518, True
-Tests/Unit/neg/wrap0.hs, 0.9953, True
-Tests/Unit/neg/vector2.hs, 1.7215, True
-Tests/Unit/neg/vector1a.hs, 1.9218, True
-Tests/Unit/neg/vector0a.hs, 0.9550, True
-Tests/Unit/neg/vector00.hs, 0.9021, True
-Tests/Unit/neg/vector0.hs, 1.0318, True
-Tests/Unit/neg/Variance1.hs, 0.7439, True
-Tests/Unit/neg/Variance.hs, 0.7758, True
-Tests/Unit/neg/tyclass0-unsafe.hs, 0.6881, True
-Tests/Unit/neg/truespec.hs, 0.7141, True
-Tests/Unit/neg/trans.hs, 1.5066, True
-Tests/Unit/neg/TopLevel.hs, 0.7302, True
-Tests/Unit/neg/testRec.hs, 0.7466, True
-Tests/Unit/neg/test2.hs, 0.7476, True
-Tests/Unit/neg/test1.hs, 0.7466, True
-Tests/Unit/neg/test00c.hs, 0.6952, True
-Tests/Unit/neg/test00b.hs, 0.7418, True
-Tests/Unit/neg/test00a.hs, 0.8298, True
-Tests/Unit/neg/test00.hs, 0.9917, True
-Tests/Unit/neg/TermReal.hs, 0.7058, True
-Tests/Unit/neg/TerminationNum0.hs, 0.7346, True
-Tests/Unit/neg/TerminationNum.hs, 0.7075, True
-Tests/Unit/neg/T602.hs, 0.6791, True
-Tests/Unit/neg/sumPoly.hs, 0.7132, True
-Tests/Unit/neg/sumk.hs, 0.7128, True
-Tests/Unit/neg/Sum.hs, 0.7617, True
-Tests/Unit/neg/Strings.hs, 0.6868, True
-Tests/Unit/neg/string00.hs, 0.7364, True
-Tests/Unit/neg/StrictPair1.hs, 0.9501, True
-Tests/Unit/neg/StrictPair0.hs, 0.6993, True
-Tests/Unit/neg/StreamInvariants.hs, 0.7106, True
-Tests/Unit/neg/Strata.hs, 0.7056, True
-Tests/Unit/neg/StateConstraints00.hs, 0.7992, True
-Tests/Unit/neg/StateConstraints0.hs, 16.0782, True
-Tests/Unit/neg/StateConstraints.hs, 1.2671, True
-Tests/Unit/neg/state00.hs, 0.7449, True
-Tests/Unit/neg/state0.hs, 0.7596, True
-Tests/Unit/neg/stacks.hs, 1.0375, True
-Tests/Unit/neg/Solver.hs, 1.2094, True
-Tests/Unit/neg/SafePartialFunctions.hs, 0.7671, True
-Tests/Unit/neg/risers.hs, 0.8194, True
-Tests/Unit/neg/RG.hs, 1.0699, True
-Tests/Unit/neg/revshape.hs, 0.7196, True
-Tests/Unit/neg/RecSelector.hs, 0.6860, True
-Tests/Unit/neg/RecQSort.hs, 0.9479, True
-Tests/Unit/neg/record0.hs, 0.7339, True
-Tests/Unit/neg/range.hs, 1.2283, True
-Tests/Unit/neg/qsloop.hs, 0.8831, True
-Tests/Unit/neg/prune0.hs, 0.8038, True
-Tests/Unit/neg/Propability0.hs, 0.7573, True
-Tests/Unit/neg/Propability.hs, 0.9722, True
-Tests/Unit/neg/pred.hs, 0.6142, True
-Tests/Unit/neg/pragma0-unsafe.hs, 0.6792, True
-Tests/Unit/neg/poslist.hs, 0.9945, True
-Tests/Unit/neg/polypred.hs, 0.7344, True
-Tests/Unit/neg/poly2.hs, 0.7499, True
-Tests/Unit/neg/poly2-degenerate.hs, 0.7735, True
-Tests/Unit/neg/poly1.hs, 0.7975, True
-Tests/Unit/neg/poly0.hs, 0.8463, True
-Tests/Unit/neg/partial.hs, 0.7387, True
-Tests/Unit/neg/pargs1.hs, 0.6893, True
-Tests/Unit/neg/pargs.hs, 0.6881, True
-Tests/Unit/neg/PairMeasure.hs, 0.7136, True
-Tests/Unit/neg/pair0.hs, 1.5614, True
-Tests/Unit/neg/pair.hs, 1.8548, True
-Tests/Unit/neg/NoMethodBindingError.hs, 0.9186, True
-Tests/Unit/neg/NoExhaustiveGuardsError.hs, 1.0346, True
-Tests/Unit/neg/nestedRecursion.hs, 0.7612, True
-Tests/Unit/neg/MultipleInvariants.hs, 0.7557, True
-Tests/Unit/neg/multi-pred-app-00.hs, 0.7912, True
-Tests/Unit/neg/mr00.hs, 0.8983, True
-Tests/Unit/neg/monad7.hs, 1.0344, True
-Tests/Unit/neg/monad6.hs, 0.7788, True
-Tests/Unit/neg/monad5.hs, 0.8094, True
-Tests/Unit/neg/monad4.hs, 0.8482, True
-Tests/Unit/neg/monad3.hs, 0.8773, True
-Tests/Unit/neg/MergeSort.hs, 2.3962, True
-Tests/Unit/neg/MeasureDups.hs, 0.9041, True
-Tests/Unit/neg/MeasureContains.hs, 0.8477, True
-Tests/Unit/neg/meas9.hs, 0.8463, True
-Tests/Unit/neg/meas7.hs, 0.6972, True
-Tests/Unit/neg/meas5.hs, 1.3677, True
-Tests/Unit/neg/meas3.hs, 0.8661, True
-Tests/Unit/neg/meas2.hs, 0.8490, True
-Tests/Unit/neg/meas0.hs, 0.8479, True
-Tests/Unit/neg/maps.hs, 0.8663, True
-Tests/Unit/neg/mapreduce.hs, 1.9294, True
-Tests/Unit/neg/mapreduce-tiny.hs, 0.7899, True
-Tests/Unit/neg/LocalSpec.hs, 0.7284, True
-Tests/Unit/neg/lit.hs, 0.7143, True
-Tests/Unit/neg/ListRange.hs, 0.8867, True
-Tests/Unit/neg/ListQSort.hs, 1.1796, True
-Tests/Unit/neg/listne.hs, 0.7354, True
-Tests/Unit/neg/ListMSort.hs, 3.0937, True
-Tests/Unit/neg/ListKeys.hs, 0.7417, True
-Tests/Unit/neg/ListISort.hs, 1.4745, True
-Tests/Unit/neg/ListISort-LType.hs, 0.9603, True
-Tests/Unit/neg/ListElem.hs, 0.7397, True
-Tests/Unit/neg/ListConcat.hs, 0.7548, True
-Tests/Unit/neg/list00.hs, 0.7566, True
-Tests/Unit/neg/LiquidClass1.hs, 0.7092, True
-Tests/Unit/neg/LiquidClass.hs, 0.7203, True
-Tests/Unit/neg/LazyWhere1.hs, 0.8003, True
-Tests/Unit/neg/LazyWhere.hs, 0.9225, True
-Tests/Unit/neg/inc2.hs, 0.7466, True
-Tests/Unit/neg/HolesTop.hs, 0.9127, True
-Tests/Unit/neg/HigherOrder.hs, 0.7817, True
-Tests/Unit/neg/HasElem.hs, 0.7434, True
-Tests/Unit/neg/grty3.hs, 0.7035, True
-Tests/Unit/neg/grty2.hs, 0.8840, True
-Tests/Unit/neg/grty1.hs, 0.8554, True
-Tests/Unit/neg/grty0.hs, 0.6871, True
-Tests/Unit/neg/Gradual.hs, 0.6900, True
-Tests/Unit/neg/GeneralizedTermination.hs, 0.7566, True
-Tests/Unit/neg/GADTs.hs, 0.6887, True
-Tests/Unit/neg/FunSoundness.hs, 0.7136, True
-Tests/Unit/neg/foldN1.hs, 0.9769, True
-Tests/Unit/neg/foldN.hs, 0.7434, True
-Tests/Unit/neg/filterAbs.hs, 1.0046, True
-Tests/Unit/neg/ex1-unsafe.hs, 0.8217, True
-Tests/Unit/neg/ex0-unsafe.hs, 0.9005, True
-Tests/Unit/neg/Even.hs, 0.9582, True
-Tests/Unit/neg/Eval.hs, 0.9271, True
-Tests/Unit/neg/errorloc.hs, 0.8200, True
-Tests/Unit/neg/errmsg.hs, 0.8111, True
-Tests/Unit/neg/elim000.hs, 0.7172, True
-Tests/Unit/neg/deptupW.hs, 0.8099, True
-Tests/Unit/neg/deppair0.hs, 0.7881, True
-Tests/Unit/neg/datacon-eq.hs, 0.6728, True
-Tests/Unit/neg/csv.hs, 2.8290, True
-Tests/Unit/neg/coretologic.hs, 0.7554, True
-Tests/Unit/neg/contra0.hs, 0.7926, True
-Tests/Unit/neg/ConstraintsAppend.hs, 1.3149, True
-Tests/Unit/neg/Constraints.hs, 0.7211, True
-Tests/Unit/neg/concat2.hs, 1.0606, True
-Tests/Unit/neg/concat1.hs, 1.1431, True
-Tests/Unit/neg/concat.hs, 0.9653, True
-Tests/Unit/neg/CompareConstraints.hs, 1.2517, True
-Tests/Unit/neg/Class5.hs, 0.6889, True
-Tests/Unit/neg/Class4.hs, 0.7185, True
-Tests/Unit/neg/Class3.hs, 0.7414, True
-Tests/Unit/neg/Class2.hs, 0.7606, True
-Tests/Unit/neg/Class1.hs, 0.8845, True
-Tests/Unit/neg/CastedTotality.hs, 0.7359, True
-Tests/Unit/neg/Books.hs, 0.7527, True
-Tests/Unit/neg/BigNum.hs, 0.6869, True
-Tests/Unit/neg/Baz.hs, 0.7232, True
-Tests/Unit/neg/BadHMeas.hs, 0.6922, True
-Tests/Unit/neg/AutoTerm1.hs, 0.7150, True
-Tests/Unit/neg/AutoTerm.hs, 0.6996, True
-Tests/Unit/neg/AutoSize.hs, 0.6847, True
-Tests/Unit/neg/Ast.hs, 0.7312, True
-Tests/Unit/neg/ass0.hs, 0.6693, True
-Tests/Unit/neg/alias00.hs, 0.7076, True
-Tests/Unit/neg/AbsApp.hs, 0.7236, True
-Tests/Unit/crash/Unbound.hs, 0.6585, True
-Tests/Unit/crash/typeAliasDup.hs, 0.7039, True
-Tests/Unit/crash/T691.hs, 0.3838, True
-Tests/Unit/crash/T649.hs, 0.6714, True
-Tests/Unit/crash/RClass.hs, 0.6643, True
-Tests/Unit/crash/Qualif.hs, 0.6772, True
-Tests/Unit/crash/predparams.hs, 0.6148, True
-Tests/Unit/crash/num-float-error1.hs, 0.6533, True
-Tests/Unit/crash/num-float-error.hs, 0.6597, True
-Tests/Unit/crash/MultipleRecordSelectors.hs, 0.6499, True
-Tests/Unit/crash/Mismatch.hs, 0.6438, True
-Tests/Unit/crash/LocalTermExpr.hs, 0.6758, True
-Tests/Unit/crash/LocalHole.hs, 0.6734, True
-Tests/Unit/crash/issue594.hs, 0.6514, True
-Tests/Unit/crash/hole-crash3.hs, 0.6306, True
-Tests/Unit/crash/hole-crash2.hs, 0.6071, True
-Tests/Unit/crash/hole-crash1.hs, 0.6453, True
-Tests/Unit/crash/HigherOrder.hs, 0.6374, True
-Tests/Unit/crash/HaskellMeasure.hs, 0.6146, True
-Tests/Unit/crash/FunRef2.hs, 0.6536, True
-Tests/Unit/crash/FunRef1.hs, 0.6525, True
-Tests/Unit/crash/funref.hs, 0.6751, True
-Tests/Unit/crash/errmsg-mismatch.hs, 0.6581, True
-Tests/Unit/crash/errmsg-dc-type.hs, 0.6385, True
-Tests/Unit/crash/errmsg-dc-num.hs, 0.6550, True
-Tests/Unit/crash/CyclicTypeAlias3.hs, 0.5705, True
-Tests/Unit/crash/CyclicTypeAlias2.hs, 0.5883, True
-Tests/Unit/crash/CyclicTypeAlias1.hs, 0.5971, True
-Tests/Unit/crash/CyclicTypeAlias0.hs, 0.5745, True
-Tests/Unit/crash/CyclicPredAlias3.hs, 0.6564, True
-Tests/Unit/crash/CyclicPredAlias2.hs, 0.7405, True
-Tests/Unit/crash/CyclicPredAlias1.hs, 0.5976, True
-Tests/Unit/crash/CyclicPredAlias0.hs, 0.6159, True
-Tests/Unit/crash/CyclicExprAlias3.hs, 0.6998, True
-Tests/Unit/crash/CyclicExprAlias2.hs, 0.7905, True
-Tests/Unit/crash/CyclicExprAlias1.hs, 0.7896, True
-Tests/Unit/crash/CyclicExprAlias0.hs, 0.7455, True
-Tests/Unit/crash/BadSyn4.hs, 0.6347, True
-Tests/Unit/crash/BadSyn3.hs, 0.6292, True
-Tests/Unit/crash/BadSyn2.hs, 0.8681, True
-Tests/Unit/crash/BadSyn1.hs, 0.6858, True
-Tests/Unit/crash/BadPragma2.hs, 0.4173, True
-Tests/Unit/crash/BadPragma1.hs, 0.3918, True
-Tests/Unit/crash/BadPragma0.hs, 0.3815, True
-Tests/Unit/crash/BadExprArg.hs, 0.6657, True
-Tests/Unit/crash/Ast.hs, 0.7110, True
-Tests/Unit/crash/Assume1.hs, 0.6973, True
-Tests/Unit/crash/Assume.hs, 0.7036, True
-Tests/Unit/crash/AbsRef.hs, 0.8573, True
-Tests/Unit/parser/pos/TokensAsPrefixes.hs, 0.6883, True
-Tests/Unit/parser/pos/Parens.hs, 0.8073, True
-Tests/Unit/error/crash/TerminationExpr1.hs, 0.8753, True
-Tests/Unit/error/crash/TerminationExpr.hs, 0.7385, True
-Tests/Benchmarks/text/Setup.lhs, 1.4109, True
-Tests/Benchmarks/text/Data/Text.hs, 68.9904, True
-Tests/Benchmarks/text/Data/Text/UnsafeChar.hs, 3.7855, True
-Tests/Benchmarks/text/Data/Text/Unsafe.hs, 2.8610, True
-Tests/Benchmarks/text/Data/Text/Search.hs, 12.8558, True
-Tests/Benchmarks/text/Data/Text/Private.hs, 2.2493, True
-Tests/Benchmarks/text/Data/Text/Lazy.hs, 77.9932, True
-Tests/Benchmarks/text/Data/Text/Internal.hs, 3.9795, True
-Tests/Benchmarks/text/Data/Text/Fusion.hs, 21.5058, True
-Tests/Benchmarks/text/Data/Text/Foreign.hs, 3.1733, True
-Tests/Benchmarks/text/Data/Text/Encoding.hs, 79.9221, True
-Tests/Benchmarks/text/Data/Text/Array.hs, 1.7552, True
-Tests/Benchmarks/text/Data/Text/Lazy/Search.hs, 94.5214, True
-Tests/Benchmarks/text/Data/Text/Lazy/Internal.hs, 5.0826, True
-Tests/Benchmarks/text/Data/Text/Lazy/Fusion.hs, 8.3652, True
-Tests/Benchmarks/text/Data/Text/Lazy/Encoding.hs, 13.1258, True
-Tests/Benchmarks/text/Data/Text/Lazy/Builder.hs, 16.1850, True
-Tests/Benchmarks/text/Data/Text/Fusion/Size.hs, 1.6748, True
-Tests/Benchmarks/bytestring/Data/ByteString.T.hs, 50.2732, True
-Tests/Benchmarks/bytestring/Data/ByteString.hs, 45.2544, True
-Tests/Benchmarks/bytestring/Data/ByteString/Unsafe.hs, 2.4628, True
-Tests/Benchmarks/bytestring/Data/ByteString/LazyZip.hs, 95.9668, True
-Tests/Benchmarks/bytestring/Data/ByteString/Lazy.hs, 77.7830, True
-Tests/Benchmarks/bytestring/Data/ByteString/Internal.hs, 5.1267, True
-Tests/Benchmarks/bytestring/Data/ByteString/Fusion.T.hs, 19.2232, True
-Tests/Benchmarks/bytestring/Data/ByteString/Fusion.hs, 15.2251, True
-Tests/Benchmarks/bytestring/Data/ByteString/Char8.hs, 7.7081, True
-Tests/Benchmarks/bytestring/Data/ByteString/Lazy/Internal.hs, 1.5104, True
-Tests/Benchmarks/bytestring/Data/ByteString/Lazy/Char8.hs, 8.9567, True
-Tests/Benchmarks/esop/Toy.hs, 1.3708, True
-Tests/Benchmarks/esop/Splay.hs, 11.5167, True
-Tests/Benchmarks/esop/ListSort.hs, 3.0115, True
-Tests/Benchmarks/esop/GhcListSort.hs, 5.8081, True
-Tests/Benchmarks/esop/Fib.hs, 1.8856, True
-Tests/Benchmarks/esop/Base.hs, 120.6181, True
-Tests/Benchmarks/esop/Array.hs, 4.5661, True
-Tests/Benchmarks/vect-algs/Setup.lhs, 1.1730, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Termination.hs, 0.9729, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Search.hs, 4.3748, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Radix.hs, 2.7923, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Optimal.hs, 7.0432, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Merge.hs, 4.8165, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Intro.hs, 6.9406, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Insertion.hs, 1.3704, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Heap.hs, 26.8470, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Common.hs, 1.0665, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Combinators.hs, 0.7115, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/AmericanFlag.hs, 4.9445, True
-Tests/Benchmarks/hscolour/Setup.hs, 0.7075, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour.hs, 5.2269, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/TTY.hs, 1.1365, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Output.hs, 0.8852, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Options.hs, 0.7858, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/MIRC.hs, 2.4293, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/LaTeX.hs, 19.0297, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/InlineCSS.hs, 1.6110, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/HTML.hs, 4.3644, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/General.hs, 0.7459, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/CSS.hs, 1.5377, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Colourise.hs, 2.7581, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/ColourHighlight.hs, 2.5077, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Classify.hs, 182.7523, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/ANSI.hs, 1.7264, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Anchors.hs, 45.4617, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/ACSS.hs, 9.6555, True
-Tests/Benchmarks/icfp_pos/WhileTest.hs, 1.0173, True
-Tests/Benchmarks/icfp_pos/WhileM.hs, 0.9205, True
-Tests/Benchmarks/icfp_pos/TwiceM.hs, 5.8141, True
-Tests/Benchmarks/icfp_pos/TestM.hs, 0.7240, True
-Tests/Benchmarks/icfp_pos/RIO2.hs, 14.6012, True
-Tests/Benchmarks/icfp_pos/Privileges.hs, 0.7326, True
-Tests/Benchmarks/icfp_pos/Overview.lhs, 6.0587, True
-Tests/Benchmarks/icfp_pos/Incr.hs, 0.9888, True
-Tests/Benchmarks/icfp_pos/Incr-elim.hs, 0.8710, True
-Tests/Benchmarks/icfp_pos/IfM2.hs, 3.0492, True
-Tests/Benchmarks/icfp_pos/IfM.hs, 5.0953, True
-Tests/Benchmarks/icfp_pos/ICFP15.lhs, 1.5533, True
-Tests/Benchmarks/icfp_pos/FoldL.hs, 5.1710, True
-Tests/Benchmarks/icfp_pos/FoldAbs.hs, 4.8517, True
-Tests/Benchmarks/icfp_pos/FindRec.hs, 8.9019, True
-Tests/Benchmarks/icfp_pos/Filter.lhs, 0.9800, True
-Tests/Benchmarks/icfp_pos/dropwhile.hs, 0.8640, True
-Tests/Benchmarks/icfp_pos/DBMovies.hs, 4.0305, True
-Tests/Benchmarks/icfp_pos/CopyRec.hs, 16.2289, True
-Tests/Benchmarks/icfp_pos/Composition.hs, 0.8499, True
-Tests/Benchmarks/icfp_pos/CompareConstraints.hs, 1.1438, True
-Tests/Benchmarks/icfp_pos/Append.hs, 1.0370, True
-Tests/Benchmarks/icfp_neg/WhileM.hs, 1.1374, True
-Tests/Benchmarks/icfp_neg/TwiceM.hs, 31.7745, True
-Tests/Benchmarks/icfp_neg/TestM.hs, 0.8845, True
-Tests/Benchmarks/icfp_neg/Records.hs, 0.8419, True
-Tests/Benchmarks/icfp_neg/IfM.hs, 5.1471, True
-Tests/Benchmarks/icfp_neg/DBMovies.hs, 3.6141, True
-Tests/Benchmarks/icfp_neg/Composition.hs, 0.8425, True
diff --git a/tests/log/summary-map_fusion.csv b/tests/log/summary-map_fusion.csv
deleted file mode 100644
--- a/tests/log/summary-map_fusion.csv
+++ /dev/null
@@ -1,693 +0,0 @@
- (HEAD, origin/map_fusion, alive) : 39270565bff1a7e9759178f4512ecbd54d1c5321
-Timestamp: 2016-05-13 14:33:42 -0700
-Epoch Timestamp: 1463175222
---------------------------------------------------------------------------------
-test, time(s), result
-
-Tests/Unit/pos/zipW2.hs, 0.8528, True
-Tests/Unit/pos/zipW1.hs, 0.7792, True
-Tests/Unit/pos/zipW.hs, 0.8702, True
-Tests/Unit/pos/zipSO.hs, 1.2959, True
-Tests/Unit/pos/zipper000.hs, 1.4411, True
-Tests/Unit/pos/zipper0.hs, 1.9472, True
-Tests/Unit/pos/zipper.hs, 3.9550, True
-Tests/Unit/pos/wrap1.hs, 1.6970, True
-Tests/Unit/pos/wrap0.hs, 1.2780, True
-Tests/Unit/pos/Words1.hs, 0.8589, True
-Tests/Unit/pos/Words.hs, 0.6962, True
-Tests/Unit/pos/WBL0.hs, 2.8234, True
-Tests/Unit/pos/WBL.hs, 2.0757, True
-Tests/Unit/pos/vector2.hs, 1.5296, True
-Tests/Unit/pos/vector1b.hs, 1.0971, True
-Tests/Unit/pos/vector1a.hs, 1.1458, True
-Tests/Unit/pos/vector1.hs, 1.2775, True
-Tests/Unit/pos/vector00.hs, 0.8321, True
-Tests/Unit/pos/vector0.hs, 1.3749, True
-Tests/Unit/pos/vecloop.hs, 0.9556, True
-Tests/Unit/pos/Variance.hs, 0.7168, True
-Tests/Unit/pos/unusedtyvars.hs, 0.6860, True
-Tests/Unit/pos/tyvar.hs, 0.6717, True
-Tests/Unit/pos/TypeAlias.hs, 0.8266, True
-Tests/Unit/pos/tyfam0.hs, 0.8357, True
-Tests/Unit/pos/tyExpr.hs, 0.8061, True
-Tests/Unit/pos/tyclass0.hs, 0.8227, True
-Tests/Unit/pos/tupparse.hs, 0.7772, True
-Tests/Unit/pos/tup0.hs, 0.7000, True
-Tests/Unit/pos/transTAG.hs, 1.7704, True
-Tests/Unit/pos/transpose.hs, 1.8750, True
-Tests/Unit/pos/trans.hs, 1.0275, True
-Tests/Unit/pos/ToyMVar.hs, 0.9426, True
-Tests/Unit/pos/TopLevel.hs, 0.7082, True
-Tests/Unit/pos/top0.hs, 0.7992, True
-Tests/Unit/pos/TokenType.hs, 0.6787, True
-Tests/Unit/pos/testRec.hs, 0.7470, True
-Tests/Unit/pos/Test761.hs, 0.7316, True
-Tests/Unit/pos/test2.hs, 0.7369, True
-Tests/Unit/pos/test1.hs, 0.7590, True
-Tests/Unit/pos/test00c.hs, 0.9207, True
-Tests/Unit/pos/test00b.hs, 0.7364, True
-Tests/Unit/pos/test000.hs, 0.7571, True
-Tests/Unit/pos/test00.old.hs, 0.7179, True
-Tests/Unit/pos/test00.hs, 0.7389, True
-Tests/Unit/pos/test00-int.hs, 0.7191, True
-Tests/Unit/pos/test0.hs, 0.7547, True
-Tests/Unit/pos/TerminationNum0.hs, 0.7110, True
-Tests/Unit/pos/TerminationNum.hs, 0.6873, True
-Tests/Unit/pos/Termination.lhs, 0.9198, True
-Tests/Unit/pos/term0.hs, 0.7938, True
-Tests/Unit/pos/Term.hs, 0.7501, True
-Tests/Unit/pos/take.hs, 1.0478, True
-Tests/Unit/pos/tagBinder.hs, 0.6868, True
-Tests/Unit/pos/T598.hs, 0.8284, True
-Tests/Unit/pos/T595a.hs, 0.7056, True
-Tests/Unit/pos/T595.hs, 0.7731, True
-Tests/Unit/pos/T531.hs, 0.6767, True
-Tests/Unit/pos/Sum.hs, 0.7500, True
-Tests/Unit/pos/StructRec.hs, 0.7115, True
-Tests/Unit/pos/Strings.hs, 0.7493, True
-Tests/Unit/pos/StringLit.hs, 0.6792, True
-Tests/Unit/pos/string00.hs, 0.7272, True
-Tests/Unit/pos/StrictPair1.hs, 0.9594, True
-Tests/Unit/pos/StrictPair0.hs, 0.7250, True
-Tests/Unit/pos/StreamInvariants.hs, 0.7065, True
-Tests/Unit/pos/stateInvarint.hs, 0.8923, True
-Tests/Unit/pos/StateF00.hs, 0.7380, True
-Tests/Unit/pos/StateConstraints00.hs, 0.7112, True
-Tests/Unit/pos/StateConstraints0.hs, 9.0070, True
-Tests/Unit/pos/StateConstraints.hs, 5.0289, True
-Tests/Unit/pos/State1.hs, 0.7464, True
-Tests/Unit/pos/state00.hs, 0.7187, True
-Tests/Unit/pos/State.hs, 0.8953, True
-Tests/Unit/pos/stacks0.hs, 0.7687, True
-Tests/Unit/pos/StackClass.hs, 0.7493, True
-Tests/Unit/pos/spec0.hs, 0.7465, True
-Tests/Unit/pos/Solver.hs, 1.3001, True
-Tests/Unit/pos/SimplerNotation.hs, 0.7016, True
-Tests/Unit/pos/selfList.hs, 0.9824, True
-Tests/Unit/pos/scanr.hs, 0.8671, True
-Tests/Unit/pos/SafePartialFunctions.hs, 0.7173, True
-Tests/Unit/pos/risers.hs, 1.2471, True
-Tests/Unit/pos/ResolvePred.hs, 0.7165, True
-Tests/Unit/pos/ResolveB.hs, 0.6875, True
-Tests/Unit/pos/ResolveA.hs, 0.6866, True
-Tests/Unit/pos/Resolve.hs, 0.6838, True
-Tests/Unit/pos/repeatHigherOrder.hs, 1.0747, True
-Tests/Unit/pos/Repeat.hs, 0.7129, True
-Tests/Unit/pos/RelativeComplete.hs, 0.7572, True
-Tests/Unit/pos/recursion0.hs, 0.6741, True
-Tests/Unit/pos/RecSelector.hs, 0.6985, True
-Tests/Unit/pos/RecQSort0.hs, 0.9423, True
-Tests/Unit/pos/RecQSort.hs, 0.9312, True
-Tests/Unit/pos/RecordSelectorError.hs, 0.6907, True
-Tests/Unit/pos/record1.hs, 0.7025, True
-Tests/Unit/pos/record0.hs, 0.7664, True
-Tests/Unit/pos/rec_annot_go.hs, 0.8130, True
-Tests/Unit/pos/RealProps1.hs, 0.7242, True
-Tests/Unit/pos/RealProps.hs, 0.7193, True
-Tests/Unit/pos/RBTree.hs, 1.0337, True
-Tests/Unit/pos/RBTree-ord.hs, 8.6139, True
-Tests/Unit/pos/RBTree-height.hs, 3.6764, True
-Tests/Unit/pos/RBTree-color.hs, 4.1123, True
-Tests/Unit/pos/RBTree-col-height.hs, 5.7649, True
-Tests/Unit/pos/rangeAdt.hs, 1.6879, True
-Tests/Unit/pos/range1.hs, 0.7895, True
-Tests/Unit/pos/range.hs, 0.9926, True
-Tests/Unit/pos/qualTest.hs, 0.7269, True
-Tests/Unit/pos/QSort.hs, 1.5270, True
-Tests/Unit/pos/propmeasure1.hs, 0.6906, True
-Tests/Unit/pos/propmeasure.hs, 0.8038, True
-Tests/Unit/pos/Propability.hs, 0.7855, True
-Tests/Unit/pos/profcrasher.hs, 0.7098, True
-Tests/Unit/pos/Product.hs, 0.9849, True
-Tests/Unit/pos/primInt0.hs, 0.8456, True
-Tests/Unit/pos/pred.hs, 0.6819, True
-Tests/Unit/pos/pragma0.hs, 0.6887, True
-Tests/Unit/pos/poslist_dc.hs, 0.8020, True
-Tests/Unit/pos/poslist.hs, 0.9693, True
-Tests/Unit/pos/polyqual.hs, 0.9144, True
-Tests/Unit/pos/polyfun.hs, 0.7682, True
-Tests/Unit/pos/poly4.hs, 0.7299, True
-Tests/Unit/pos/poly3a.hs, 0.7401, True
-Tests/Unit/pos/poly3.hs, 0.7206, True
-Tests/Unit/pos/poly2.hs, 0.7619, True
-Tests/Unit/pos/poly2-degenerate.hs, 0.7452, True
-Tests/Unit/pos/poly1.hs, 0.7786, True
-Tests/Unit/pos/poly0.hs, 0.8114, True
-Tests/Unit/pos/PointDist.hs, 0.9659, True
-Tests/Unit/pos/PlugHoles.hs, 0.6665, True
-Tests/Unit/pos/PersistentVector.hs, 0.8253, True
-Tests/Unit/pos/Permutation.hs, 2.0695, True
-Tests/Unit/pos/partialmeasure.hs, 0.7052, True
-Tests/Unit/pos/partial-tycon.hs, 0.6759, True
-Tests/Unit/pos/pargs1.hs, 0.6972, True
-Tests/Unit/pos/pargs.hs, 0.6676, True
-Tests/Unit/pos/PairMeasure0.hs, 0.7061, True
-Tests/Unit/pos/PairMeasure.hs, 0.7296, True
-Tests/Unit/pos/pair00.hs, 1.2709, True
-Tests/Unit/pos/pair0.hs, 1.4192, True
-Tests/Unit/pos/pair.hs, 1.5429, True
-Tests/Unit/pos/Overwrite.hs, 0.7086, True
-Tests/Unit/pos/OrdList.hs, 20.5398, True
-Tests/Unit/pos/nullterm.hs, 1.1325, True
-Tests/Unit/pos/NoExhaustiveGuardsError.hs, 0.6783, True
-Tests/Unit/pos/NoCaseExpand.hs, 1.0695, True
-Tests/Unit/pos/niki1.hs, 0.7662, True
-Tests/Unit/pos/niki.hs, 0.7621, True
-Tests/Unit/pos/nats.hs, 1.1961, True
-Tests/Unit/pos/MutualRec.hs, 2.0458, True
-Tests/Unit/pos/mutrec.hs, 0.6668, True
-Tests/Unit/pos/MultipleInvariants.hs, 0.7023, True
-Tests/Unit/pos/multi-pred-app-00.hs, 0.6800, True
-Tests/Unit/pos/Moo.hs, 0.6848, True
-Tests/Unit/pos/monad7.hs, 0.9964, True
-Tests/Unit/pos/monad6.hs, 0.7881, True
-Tests/Unit/pos/monad5.hs, 0.9191, True
-Tests/Unit/pos/monad2.hs, 0.6958, True
-Tests/Unit/pos/monad1.hs, 0.6724, True
-Tests/Unit/pos/modTest.hs, 0.7454, True
-Tests/Unit/pos/Mod2.hs, 0.6896, True
-Tests/Unit/pos/Mod1.hs, 0.6863, True
-Tests/Unit/pos/MergeSort.hs, 2.3064, True
-Tests/Unit/pos/Merge1.hs, 0.8075, True
-Tests/Unit/pos/MeasureSets.hs, 0.7265, True
-Tests/Unit/pos/Measures1.hs, 0.6825, True
-Tests/Unit/pos/Measures.hs, 0.6871, True
-Tests/Unit/pos/MeasureDups.hs, 0.7670, True
-Tests/Unit/pos/MeasureContains.hs, 0.7668, True
-Tests/Unit/pos/meas9.hs, 0.7964, True
-Tests/Unit/pos/meas8.hs, 0.7598, True
-Tests/Unit/pos/meas7.hs, 0.7200, True
-Tests/Unit/pos/meas6.hs, 0.8775, True
-Tests/Unit/pos/meas5.hs, 1.2901, True
-Tests/Unit/pos/meas4.hs, 0.8424, True
-Tests/Unit/pos/meas3.hs, 0.9236, True
-Tests/Unit/pos/meas2.hs, 0.8421, True
-Tests/Unit/pos/meas11.hs, 0.7747, True
-Tests/Unit/pos/meas10.hs, 1.0118, True
-Tests/Unit/pos/meas1.hs, 0.8098, True
-Tests/Unit/pos/meas0a.hs, 0.8181, True
-Tests/Unit/pos/meas00a.hs, 0.7804, True
-Tests/Unit/pos/meas00.hs, 0.7954, True
-Tests/Unit/pos/meas0.hs, 0.9204, True
-Tests/Unit/pos/maybe4.hs, 0.7214, True
-Tests/Unit/pos/maybe3.hs, 0.7700, True
-Tests/Unit/pos/maybe2.hs, 1.3847, True
-Tests/Unit/pos/maybe1.hs, 0.8465, True
-Tests/Unit/pos/maybe000.hs, 0.7242, True
-Tests/Unit/pos/maybe00.hs, 0.7019, True
-Tests/Unit/pos/maybe0.hs, 0.7512, True
-Tests/Unit/pos/maybe.hs, 1.1640, True
-Tests/Unit/pos/mapTvCrash.hs, 0.7246, True
-Tests/Unit/pos/maps1.hs, 0.7821, True
-Tests/Unit/pos/maps.hs, 0.7983, True
-Tests/Unit/pos/mapreduce.hs, 1.9086, True
-Tests/Unit/pos/mapreduce-bare.hs, 3.6304, True
-Tests/Unit/pos/Map2.hs, 17.0360, True
-Tests/Unit/pos/Map0.hs, 16.2161, True
-Tests/Unit/pos/Map.hs, 16.0974, True
-Tests/Unit/pos/malformed0.hs, 1.0894, True
-Tests/Unit/pos/Loo.hs, 0.7135, True
-Tests/Unit/pos/LogicCurry1.hs, 0.6988, True
-Tests/Unit/pos/LocalTermExpr.hs, 0.7624, True
-Tests/Unit/pos/LocalSpecImp.hs, 0.6871, True
-Tests/Unit/pos/LocalSpec0.hs, 0.6888, True
-Tests/Unit/pos/LocalSpec.hs, 0.7359, True
-Tests/Unit/pos/LocalLazy.hs, 0.7538, True
-Tests/Unit/pos/LocalHole.hs, 0.7003, True
-Tests/Unit/pos/lit.hs, 0.6867, True
-Tests/Unit/pos/ListSort.hs, 3.0662, True
-Tests/Unit/pos/listSetDemo.hs, 0.8502, True
-Tests/Unit/pos/listSet.hs, 0.8194, True
-Tests/Unit/pos/ListReverse-LType.hs, 0.7473, True
-Tests/Unit/pos/ListRange.hs, 0.8483, True
-Tests/Unit/pos/ListRange-LType.hs, 0.8656, True
-Tests/Unit/pos/listqual.hs, 0.7576, True
-Tests/Unit/pos/ListQSort.hs, 1.5069, True
-Tests/Unit/pos/ListQSort-LType.hs, 1.4536, True
-Tests/Unit/pos/ListMSort.hs, 2.5027, True
-Tests/Unit/pos/ListMSort-LType.hs, 4.1713, True
-Tests/Unit/pos/ListLen.hs, 1.3365, True
-Tests/Unit/pos/ListLen-LType.hs, 1.2209, True
-Tests/Unit/pos/ListKeys.hs, 0.7467, True
-Tests/Unit/pos/ListISort.hs, 0.8343, True
-Tests/Unit/pos/ListISort-LType.hs, 1.2448, True
-Tests/Unit/pos/ListElem.hs, 0.7250, True
-Tests/Unit/pos/ListConcat.hs, 0.7536, True
-Tests/Unit/pos/listAnf.hs, 0.8096, True
-Tests/Unit/pos/LiquidClass.hs, 0.6951, True
-Tests/Unit/pos/LiquidArray.hs, 0.6959, True
-Tests/Unit/pos/lex.hs, 0.7251, True
-Tests/Unit/pos/lets.hs, 0.9316, True
-Tests/Unit/pos/LazyWhere1.hs, 0.7493, True
-Tests/Unit/pos/LazyWhere.hs, 0.7300, True
-Tests/Unit/pos/LambdaEvalTiny.hs, 1.4872, True
-Tests/Unit/pos/LambdaEvalSuperTiny.hs, 1.3447, True
-Tests/Unit/pos/LambdaEvalMini.hs, 3.4729, True
-Tests/Unit/pos/LambdaEval.hs, 22.9920, True
-Tests/Unit/pos/LambdaDeBruijn.hs, 1.7372, True
-Tests/Unit/pos/kmpVec.hs, 1.4790, True
-Tests/Unit/pos/kmpIO.hs, 0.9020, True
-Tests/Unit/pos/kmp.hs, 1.9554, True
-Tests/Unit/pos/Keys.hs, 0.7337, True
-Tests/Unit/pos/jeff.hs, 10.4850, True
-Tests/Unit/pos/ite1.hs, 0.6742, True
-Tests/Unit/pos/ite.hs, 0.6699, True
-Tests/Unit/pos/invlhs.hs, 0.6897, True
-Tests/Unit/pos/Invariants.hs, 0.7945, True
-Tests/Unit/pos/Interpreter.lhs, 2.4786, True
-Tests/Unit/pos/inline1.hs, 0.6883, True
-Tests/Unit/pos/inline.hs, 0.7969, True
-Tests/Unit/pos/initarray.hs, 1.1261, True
-Tests/Unit/pos/infix.hs, 0.7606, True
-Tests/Unit/pos/Infinity.hs, 0.7888, True
-Tests/Unit/pos/incRec.hs, 0.7025, True
-Tests/Unit/pos/implies.hs, 0.6735, True
-Tests/Unit/pos/imp0.hs, 0.7653, True
-Tests/Unit/pos/idNat0.hs, 0.6918, True
-Tests/Unit/pos/idNat.hs, 0.6888, True
-Tests/Unit/pos/IcfpDemo.hs, 0.8872, True
-Tests/Unit/pos/Holes.hs, 0.7794, True
-Tests/Unit/pos/hole-fun.hs, 0.6994, True
-Tests/Unit/pos/hole-app.hs, 0.6982, True
-Tests/Unit/pos/HigherOrderRecFun.hs, 0.7036, True
-Tests/Unit/pos/hello.hs, 0.6933, True
-Tests/Unit/pos/HedgeUnion.hs, 0.8088, True
-Tests/Unit/pos/HaskellMeasure.hs, 0.7136, True
-Tests/Unit/pos/HasElem.hs, 0.7159, True
-Tests/Unit/pos/grty3.hs, 0.6993, True
-Tests/Unit/pos/grty2.hs, 0.7079, True
-Tests/Unit/pos/grty1.hs, 0.7014, True
-Tests/Unit/pos/grty0.hs, 0.6925, True
-Tests/Unit/pos/Graph.hs, 0.9958, True
-Tests/Unit/pos/Gradual.hs, 0.0000, True
-Tests/Unit/pos/GoodHMeas.hs, 0.7229, True
-Tests/Unit/pos/Goo.hs, 0.6819, True
-Tests/Unit/pos/go_ugly_type.hs, 0.7420, True
-Tests/Unit/pos/go.hs, 0.7327, True
-Tests/Unit/pos/gimme.hs, 0.7565, True
-Tests/Unit/pos/GhcSort3.T.hs, 1.6066, True
-Tests/Unit/pos/GhcSort3.hs, 3.4542, True
-Tests/Unit/pos/GhcSort2.hs, 1.7322, True
-Tests/Unit/pos/GhcSort1.hs, 3.3754, True
-Tests/Unit/pos/GhcListSort.hs, 6.2816, True
-Tests/Unit/pos/GeneralizedTermination.hs, 0.8132, True
-Tests/Unit/pos/GCD.hs, 0.9483, True
-Tests/Unit/pos/GADTs.hs, 0.7085, True
-Tests/Unit/pos/gadtEval.hs, 1.2299, True
-Tests/Unit/pos/Fractional.hs, 0.6829, True
-Tests/Unit/pos/forloop.hs, 0.8802, True
-Tests/Unit/pos/for.hs, 0.9460, True
-Tests/Unit/pos/Foo.hs, 0.7051, True
-Tests/Unit/pos/foldr.hs, 0.7497, True
-Tests/Unit/pos/foldN.hs, 0.6917, True
-Tests/Unit/pos/Foldl.hs, 5.5228, True
-Tests/Unit/pos/Fixme.hs, 0.7429, True
-Tests/Unit/pos/filterAbs.hs, 0.8607, True
-Tests/Unit/pos/FFI.hs, 0.7952, True
-Tests/Unit/pos/failName.hs, 0.6865, True
-Tests/Unit/pos/extype.hs, 0.7185, True
-Tests/Unit/pos/exp0.hs, 0.7337, True
-Tests/Unit/pos/ExactFunApp.hs, 0.7115, True
-Tests/Unit/pos/ex1.hs, 0.8145, True
-Tests/Unit/pos/ex01.hs, 0.6953, True
-Tests/Unit/pos/ex0.hs, 0.7638, True
-Tests/Unit/pos/Even0.hs, 0.6909, True
-Tests/Unit/pos/Even.hs, 0.7056, True
-Tests/Unit/pos/Eval.hs, 0.8518, True
-Tests/Unit/pos/eqelems.hs, 0.7153, True
-Tests/Unit/pos/elim01.hs, 0.7121, True
-Tests/Unit/pos/elim00.hs, 0.9034, True
-Tests/Unit/pos/elems.hs, 0.7153, True
-Tests/Unit/pos/elements.hs, 1.0981, True
-Tests/Unit/pos/duplicate-bind.hs, 0.7398, True
-Tests/Unit/pos/dropwhile.hs, 1.0136, True
-Tests/Unit/pos/div000.hs, 0.6968, True
-Tests/Unit/pos/Diff.hs, 0.6876, True
-Tests/Unit/pos/deptupW.hs, 0.8036, True
-Tests/Unit/pos/deptup3.hs, 0.7814, True
-Tests/Unit/pos/deptup1.hs, 0.8788, True
-Tests/Unit/pos/deptup0.hs, 0.8329, True
-Tests/Unit/pos/deptup.hs, 1.1026, True
-Tests/Unit/pos/deppair1.hs, 0.7486, True
-Tests/Unit/pos/deppair0.hs, 0.7978, True
-Tests/Unit/pos/deepmeas0.hs, 0.8098, True
-Tests/Unit/pos/DB00.hs, 0.7154, True
-Tests/Unit/pos/dataConQuals.hs, 0.7065, True
-Tests/Unit/pos/datacon1.hs, 0.6839, True
-Tests/Unit/pos/datacon0.hs, 0.8219, True
-Tests/Unit/pos/datacon-inv.hs, 0.6972, True
-Tests/Unit/pos/DataBase.hs, 0.7366, True
-Tests/Unit/pos/data2.hs, 0.8244, True
-Tests/Unit/pos/cut00.hs, 0.7379, True
-Tests/Unit/pos/csgordon_issue_296.hs, 0.6822, True
-Tests/Unit/pos/CountMonad.hs, 0.8612, True
-Tests/Unit/pos/coretologic.hs, 0.7212, True
-Tests/Unit/pos/contra0.hs, 0.7967, True
-Tests/Unit/pos/ConstraintsAppend.hs, 1.3035, True
-Tests/Unit/pos/Constraints.hs, 0.7532, True
-Tests/Unit/pos/comprehensionTerm.hs, 1.1147, True
-Tests/Unit/pos/CompareConstraints.hs, 1.1311, True
-Tests/Unit/pos/compare2.hs, 0.7335, True
-Tests/Unit/pos/compare1.hs, 0.7887, True
-Tests/Unit/pos/compare.hs, 0.7460, True
-Tests/Unit/pos/CommentedOut.hs, 0.7105, True
-Tests/Unit/pos/Coercion.hs, 0.7183, True
-Tests/Unit/pos/cmptag0.hs, 0.7756, True
-Tests/Unit/pos/ClojurVector.hs, 0.9158, True
-Tests/Unit/pos/ClassReg.hs, 0.7012, True
-Tests/Unit/pos/Class2.hs, 0.7033, True
-Tests/Unit/pos/Class.hs, 0.9615, True
-Tests/Unit/pos/case-lambda-join.hs, 0.8371, True
-Tests/Unit/pos/BST000.hs, 1.7448, True
-Tests/Unit/pos/BST.hs, 8.4547, True
-Tests/Unit/pos/bounds1.hs, 0.6778, True
-Tests/Unit/pos/Books.hs, 0.7485, True
-Tests/Unit/pos/BinarySearch.hs, 0.8419, True
-Tests/Unit/pos/bar.hs, 0.6809, True
-Tests/Unit/pos/bangPatterns.hs, 0.7430, True
-Tests/Unit/pos/AVLRJ.hs, 2.8586, True
-Tests/Unit/pos/AVL.hs, 2.1135, True
-Tests/Unit/pos/Avg.hs, 0.7128, True
-Tests/Unit/pos/AutoTerm1.hs, 0.7127, True
-Tests/Unit/pos/AutoTerm.hs, 0.7645, True
-Tests/Unit/pos/AutoSize.hs, 0.7104, True
-Tests/Unit/pos/AssumedRecursive.hs, 0.6793, True
-Tests/Unit/pos/Assume0.hs, 0.6779, True
-Tests/Unit/pos/Assume.hs, 0.7437, True
-Tests/Unit/pos/anish1.hs, 0.6688, True
-Tests/Unit/pos/anftest.hs, 0.7171, True
-Tests/Unit/pos/anfbug.hs, 0.7674, True
-Tests/Unit/pos/AmortizedQueue.hs, 0.8550, True
-Tests/Unit/pos/alphaconvert-Set.hs, 1.0662, True
-Tests/Unit/pos/alphaconvert-List.hs, 1.2694, True
-Tests/Unit/pos/alias01.hs, 0.6916, True
-Tests/Unit/pos/alias00.hs, 0.6885, True
-Tests/Unit/pos/adt0.hs, 0.7412, True
-Tests/Unit/pos/Ackermann.hs, 0.7930, True
-Tests/Unit/pos/absref-crash0.hs, 0.7343, True
-Tests/Unit/pos/absref-crash.hs, 0.6963, True
-Tests/Unit/pos/Abs.hs, 0.6812, True
-Tests/Unit/neg/wrap1.hs, 0.9841, True
-Tests/Unit/neg/wrap0.hs, 0.8307, True
-Tests/Unit/neg/vector2.hs, 1.4819, True
-Tests/Unit/neg/vector1a.hs, 1.0415, True
-Tests/Unit/neg/vector0a.hs, 0.8404, True
-Tests/Unit/neg/vector00.hs, 0.8247, True
-Tests/Unit/neg/vector0.hs, 1.0024, True
-Tests/Unit/neg/Variance1.hs, 0.7097, True
-Tests/Unit/neg/Variance.hs, 0.7128, True
-Tests/Unit/neg/tyclass0-unsafe.hs, 0.6854, True
-Tests/Unit/neg/truespec.hs, 0.7262, True
-Tests/Unit/neg/trans.hs, 1.5919, True
-Tests/Unit/neg/TopLevel.hs, 0.7212, True
-Tests/Unit/neg/testRec.hs, 0.7473, True
-Tests/Unit/neg/test2.hs, 0.7374, True
-Tests/Unit/neg/test1.hs, 0.7464, True
-Tests/Unit/neg/test00c.hs, 0.6926, True
-Tests/Unit/neg/test00b.hs, 0.7444, True
-Tests/Unit/neg/test00a.hs, 0.7481, True
-Tests/Unit/neg/test00.hs, 0.7459, True
-Tests/Unit/neg/TermReal.hs, 0.7130, True
-Tests/Unit/neg/TerminationNum0.hs, 0.7172, True
-Tests/Unit/neg/TerminationNum.hs, 0.6776, True
-Tests/Unit/neg/T602.hs, 0.6866, True
-Tests/Unit/neg/sumPoly.hs, 0.6992, True
-Tests/Unit/neg/sumk.hs, 0.7262, True
-Tests/Unit/neg/Sum.hs, 0.7676, True
-Tests/Unit/neg/Strings.hs, 0.7092, True
-Tests/Unit/neg/string00.hs, 0.7372, True
-Tests/Unit/neg/StrictPair1.hs, 0.9510, True
-Tests/Unit/neg/StrictPair0.hs, 0.7065, True
-Tests/Unit/neg/StreamInvariants.hs, 0.7043, True
-Tests/Unit/neg/Strata.hs, 0.7213, True
-Tests/Unit/neg/StateConstraints00.hs, 0.7565, True
-Tests/Unit/neg/StateConstraints0.hs, 16.3760, True
-Tests/Unit/neg/StateConstraints.hs, 1.2937, True
-Tests/Unit/neg/state00.hs, 0.7326, True
-Tests/Unit/neg/state0.hs, 0.7258, True
-Tests/Unit/neg/stacks.hs, 1.0173, True
-Tests/Unit/neg/Solver.hs, 1.2482, True
-Tests/Unit/neg/SafePartialFunctions.hs, 0.7329, True
-Tests/Unit/neg/risers.hs, 0.7867, True
-Tests/Unit/neg/RG.hs, 1.0762, True
-Tests/Unit/neg/revshape.hs, 0.7057, True
-Tests/Unit/neg/RecSelector.hs, 0.6959, True
-Tests/Unit/neg/RecQSort.hs, 0.9517, True
-Tests/Unit/neg/record0.hs, 0.7081, True
-Tests/Unit/neg/range.hs, 1.1815, True
-Tests/Unit/neg/qsloop.hs, 0.8903, True
-Tests/Unit/neg/prune0.hs, 0.7643, True
-Tests/Unit/neg/Propability0.hs, 0.7706, True
-Tests/Unit/neg/Propability.hs, 0.9833, True
-Tests/Unit/neg/pred.hs, 0.5944, True
-Tests/Unit/neg/pragma0-unsafe.hs, 0.6986, True
-Tests/Unit/neg/poslist.hs, 1.0067, True
-Tests/Unit/neg/polypred.hs, 0.7298, True
-Tests/Unit/neg/poly2.hs, 0.7962, True
-Tests/Unit/neg/poly2-degenerate.hs, 0.7653, True
-Tests/Unit/neg/poly1.hs, 0.7629, True
-Tests/Unit/neg/poly0.hs, 0.7987, True
-Tests/Unit/neg/partial.hs, 0.6828, True
-Tests/Unit/neg/pargs1.hs, 0.6988, True
-Tests/Unit/neg/pargs.hs, 0.6891, True
-Tests/Unit/neg/PairMeasure.hs, 0.7215, True
-Tests/Unit/neg/pair0.hs, 1.4552, True
-Tests/Unit/neg/pair.hs, 1.5278, True
-Tests/Unit/neg/NoMethodBindingError.hs, 0.6995, True
-Tests/Unit/neg/NoExhaustiveGuardsError.hs, 0.6785, True
-Tests/Unit/neg/nestedRecursion.hs, 0.7081, True
-Tests/Unit/neg/MultipleInvariants.hs, 0.7133, True
-Tests/Unit/neg/multi-pred-app-00.hs, 0.6751, True
-Tests/Unit/neg/mr00.hs, 0.8605, True
-Tests/Unit/neg/monad7.hs, 0.9814, True
-Tests/Unit/neg/monad6.hs, 0.7613, True
-Tests/Unit/neg/monad5.hs, 0.7986, True
-Tests/Unit/neg/monad4.hs, 0.8129, True
-Tests/Unit/neg/monad3.hs, 0.8301, True
-Tests/Unit/neg/MergeSort.hs, 2.2934, True
-Tests/Unit/neg/MeasureDups.hs, 0.7674, True
-Tests/Unit/neg/MeasureContains.hs, 0.7485, True
-Tests/Unit/neg/meas9.hs, 0.7400, True
-Tests/Unit/neg/meas7.hs, 0.7322, True
-Tests/Unit/neg/meas5.hs, 1.3386, True
-Tests/Unit/neg/meas3.hs, 0.7675, True
-Tests/Unit/neg/meas2.hs, 0.7387, True
-Tests/Unit/neg/meas0.hs, 0.7580, True
-Tests/Unit/neg/maps.hs, 0.8050, True
-Tests/Unit/neg/mapreduce.hs, 1.9613, True
-Tests/Unit/neg/mapreduce-tiny.hs, 0.7830, True
-Tests/Unit/neg/LocalSpec.hs, 0.7468, True
-Tests/Unit/neg/lit.hs, 0.6997, True
-Tests/Unit/neg/ListRange.hs, 0.8129, True
-Tests/Unit/neg/ListQSort.hs, 1.2505, True
-Tests/Unit/neg/listne.hs, 0.7518, True
-Tests/Unit/neg/ListMSort.hs, 2.5944, True
-Tests/Unit/neg/ListKeys.hs, 0.7246, True
-Tests/Unit/neg/ListISort.hs, 1.4149, True
-Tests/Unit/neg/ListISort-LType.hs, 0.9118, True
-Tests/Unit/neg/ListElem.hs, 0.7270, True
-Tests/Unit/neg/ListConcat.hs, 0.7506, True
-Tests/Unit/neg/list00.hs, 0.7510, True
-Tests/Unit/neg/LiquidClass1.hs, 0.6964, True
-Tests/Unit/neg/LiquidClass.hs, 0.7039, True
-Tests/Unit/neg/LazyWhere1.hs, 0.7303, True
-Tests/Unit/neg/LazyWhere.hs, 0.7267, True
-Tests/Unit/neg/inc2.hs, 0.6780, True
-Tests/Unit/neg/HolesTop.hs, 0.7212, True
-Tests/Unit/neg/HigherOrder.hs, 0.6901, True
-Tests/Unit/neg/HasElem.hs, 0.7344, True
-Tests/Unit/neg/grty3.hs, 0.7173, True
-Tests/Unit/neg/grty2.hs, 0.8656, True
-Tests/Unit/neg/grty1.hs, 0.8576, True
-Tests/Unit/neg/grty0.hs, 0.7087, True
-Tests/Unit/neg/Gradual.hs, 0.7184, True
-Tests/Unit/neg/GeneralizedTermination.hs, 0.7589, True
-Tests/Unit/neg/GADTs.hs, 0.7276, True
-Tests/Unit/neg/FunSoundness.hs, 0.6839, True
-Tests/Unit/neg/FunctionRef.hs, 0.6951, True
-Tests/Unit/neg/foldN1.hs, 0.7202, True
-Tests/Unit/neg/foldN.hs, 0.7001, True
-Tests/Unit/neg/filterAbs.hs, 0.8667, True
-Tests/Unit/neg/ex1-unsafe.hs, 0.7907, True
-Tests/Unit/neg/ex0-unsafe.hs, 0.7971, True
-Tests/Unit/neg/Even.hs, 0.7039, True
-Tests/Unit/neg/Eval.hs, 0.8437, True
-Tests/Unit/neg/errorloc.hs, 0.7539, True
-Tests/Unit/neg/errmsg.hs, 0.7611, True
-Tests/Unit/neg/elim000.hs, 0.6731, True
-Tests/Unit/neg/deptupW.hs, 0.7992, True
-Tests/Unit/neg/deppair0.hs, 0.7797, True
-Tests/Unit/neg/datacon-eq.hs, 0.7061, True
-Tests/Unit/neg/csv.hs, 2.7885, True
-Tests/Unit/neg/coretologic.hs, 0.7469, True
-Tests/Unit/neg/contra0.hs, 0.7854, True
-Tests/Unit/neg/ConstraintsAppend.hs, 1.3196, True
-Tests/Unit/neg/Constraints.hs, 0.7303, True
-Tests/Unit/neg/concat2.hs, 1.0765, True
-Tests/Unit/neg/concat1.hs, 1.1396, True
-Tests/Unit/neg/concat.hs, 0.9843, True
-Tests/Unit/neg/CompareConstraints.hs, 1.2089, True
-Tests/Unit/neg/Class5.hs, 0.7063, True
-Tests/Unit/neg/Class4.hs, 0.7311, True
-Tests/Unit/neg/Class3.hs, 0.7468, True
-Tests/Unit/neg/Class2.hs, 0.7623, True
-Tests/Unit/neg/Class1.hs, 0.8863, True
-Tests/Unit/neg/CastedTotality.hs, 0.7444, True
-Tests/Unit/neg/Books.hs, 0.7463, True
-Tests/Unit/neg/BigNum.hs, 0.6787, True
-Tests/Unit/neg/Baz.hs, 0.7174, True
-Tests/Unit/neg/BadHMeas.hs, 0.7251, True
-Tests/Unit/neg/AutoTerm1.hs, 0.7106, True
-Tests/Unit/neg/AutoTerm.hs, 0.7116, True
-Tests/Unit/neg/AutoSize.hs, 0.7179, True
-Tests/Unit/neg/Ast.hs, 0.7219, True
-Tests/Unit/neg/ass0.hs, 0.6778, True
-Tests/Unit/neg/alias00.hs, 0.6759, True
-Tests/Unit/neg/AbsApp.hs, 0.6915, True
-Tests/Unit/crash/Unbound.hs, 0.6514, True
-Tests/Unit/crash/typeAliasDup.hs, 0.6731, True
-Tests/Unit/crash/T691.hs, 0.3826, True
-Tests/Unit/crash/T649.hs, 0.6888, True
-Tests/Unit/crash/RClass.hs, 0.6956, True
-Tests/Unit/crash/Qualif.hs, 0.6775, True
-Tests/Unit/crash/predparams.hs, 0.5925, True
-Tests/Unit/crash/num-float-error1.hs, 0.6243, True
-Tests/Unit/crash/num-float-error.hs, 0.6628, True
-Tests/Unit/crash/MultipleRecordSelectors.hs, 0.6811, True
-Tests/Unit/crash/Mismatch.hs, 0.6546, True
-Tests/Unit/crash/LocalTermExpr.hs, 0.6490, True
-Tests/Unit/crash/LocalHole.hs, 0.6494, True
-Tests/Unit/crash/issue594.hs, 0.6215, True
-Tests/Unit/crash/hole-crash3.hs, 0.5995, True
-Tests/Unit/crash/hole-crash2.hs, 0.5739, True
-Tests/Unit/crash/hole-crash1.hs, 0.6743, True
-Tests/Unit/crash/HigherOrder.hs, 0.6908, True
-Tests/Unit/crash/HaskellMeasure.hs, 0.6188, True
-Tests/Unit/crash/FunRef2.hs, 1.0977, True
-Tests/Unit/crash/FunRef1.hs, 0.7355, True
-Tests/Unit/crash/funref.hs, 0.7499, True
-Tests/Unit/crash/errmsg-mismatch.hs, 0.7222, True
-Tests/Unit/crash/errmsg-dc-type.hs, 0.6533, True
-Tests/Unit/crash/errmsg-dc-num.hs, 0.7039, True
-Tests/Unit/crash/CyclicTypeAlias3.hs, 0.8474, True
-Tests/Unit/crash/CyclicTypeAlias2.hs, 0.6661, True
-Tests/Unit/crash/CyclicTypeAlias1.hs, 0.6326, True
-Tests/Unit/crash/CyclicTypeAlias0.hs, 0.6337, True
-Tests/Unit/crash/CyclicPredAlias3.hs, 0.5894, True
-Tests/Unit/crash/CyclicPredAlias2.hs, 0.7191, True
-Tests/Unit/crash/CyclicPredAlias1.hs, 0.8122, True
-Tests/Unit/crash/CyclicPredAlias0.hs, 0.7416, True
-Tests/Unit/crash/CyclicExprAlias3.hs, 0.6427, True
-Tests/Unit/crash/CyclicExprAlias2.hs, 0.8072, True
-Tests/Unit/crash/CyclicExprAlias1.hs, 0.7761, True
-Tests/Unit/crash/CyclicExprAlias0.hs, 0.8904, True
-Tests/Unit/crash/BadSyn4.hs, 0.7476, True
-Tests/Unit/crash/BadSyn3.hs, 0.6519, True
-Tests/Unit/crash/BadSyn2.hs, 0.7303, True
-Tests/Unit/crash/BadSyn1.hs, 0.6036, True
-Tests/Unit/crash/BadPragma2.hs, 0.3794, True
-Tests/Unit/crash/BadPragma1.hs, 0.3789, True
-Tests/Unit/crash/BadPragma0.hs, 0.3898, True
-Tests/Unit/crash/BadExprArg.hs, 0.6408, True
-Tests/Unit/crash/Ast.hs, 0.6996, True
-Tests/Unit/crash/Assume1.hs, 0.6570, True
-Tests/Unit/crash/Assume.hs, 0.6578, True
-Tests/Unit/crash/AbsRef.hs, 0.6484, True
-Tests/Unit/parser/pos/TokensAsPrefixes.hs, 0.7558, True
-Tests/Unit/parser/pos/Parens.hs, 0.8460, True
-Tests/Unit/error/crash/TerminationExpr1.hs, 0.7590, True
-Tests/Unit/error/crash/TerminationExpr.hs, 0.7199, True
-Tests/Benchmarks/text/Setup.lhs, 1.0767, True
-Tests/Benchmarks/text/Data/Text.hs, 78.8323, True
-Tests/Benchmarks/text/Data/Text/UnsafeChar.hs, 3.8402, True
-Tests/Benchmarks/text/Data/Text/Unsafe.hs, 3.0271, True
-Tests/Benchmarks/text/Data/Text/Search.hs, 13.5542, True
-Tests/Benchmarks/text/Data/Text/Private.hs, 2.3065, True
-Tests/Benchmarks/text/Data/Text/Lazy.hs, 84.4276, True
-Tests/Benchmarks/text/Data/Text/Internal.hs, 3.9791, True
-Tests/Benchmarks/text/Data/Text/Fusion.hs, 21.8294, True
-Tests/Benchmarks/text/Data/Text/Foreign.hs, 3.3420, True
-Tests/Benchmarks/text/Data/Text/Encoding.hs, 83.5714, True
-Tests/Benchmarks/text/Data/Text/Array.hs, 1.7703, True
-Tests/Benchmarks/text/Data/Text/Lazy/Search.hs, 99.3453, True
-Tests/Benchmarks/text/Data/Text/Lazy/Internal.hs, 5.2354, True
-Tests/Benchmarks/text/Data/Text/Lazy/Fusion.hs, 8.6566, True
-Tests/Benchmarks/text/Data/Text/Lazy/Encoding.hs, 12.9045, True
-Tests/Benchmarks/text/Data/Text/Lazy/Builder.hs, 16.6088, True
-Tests/Benchmarks/text/Data/Text/Fusion/Size.hs, 1.8858, True
-Tests/Benchmarks/bytestring/Data/ByteString.T.hs, 53.4369, True
-Tests/Benchmarks/bytestring/Data/ByteString.hs, 43.8906, True
-Tests/Benchmarks/bytestring/Data/ByteString/Unsafe.hs, 2.1725, True
-Tests/Benchmarks/bytestring/Data/ByteString/LazyZip.hs, 106.6598, True
-Tests/Benchmarks/bytestring/Data/ByteString/Lazy.hs, 83.8147, True
-Tests/Benchmarks/bytestring/Data/ByteString/Internal.hs, 5.4251, True
-Tests/Benchmarks/bytestring/Data/ByteString/Fusion.T.hs, 20.3200, True
-Tests/Benchmarks/bytestring/Data/ByteString/Fusion.hs, 16.3425, True
-Tests/Benchmarks/bytestring/Data/ByteString/Char8.hs, 7.8844, True
-Tests/Benchmarks/bytestring/Data/ByteString/Lazy/Internal.hs, 1.5160, True
-Tests/Benchmarks/bytestring/Data/ByteString/Lazy/Char8.hs, 9.4135, True
-Tests/Benchmarks/esop/Toy.hs, 1.4097, True
-Tests/Benchmarks/esop/Splay.hs, 12.9665, True
-Tests/Benchmarks/esop/ListSort.hs, 3.2645, True
-Tests/Benchmarks/esop/GhcListSort.hs, 6.3996, True
-Tests/Benchmarks/esop/Fib.hs, 1.9210, True
-Tests/Benchmarks/esop/Base.hs, 133.3911, True
-Tests/Benchmarks/esop/Array.hs, 5.6528, True
-Tests/Benchmarks/vect-algs/Setup.lhs, 1.2515, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Termination.hs, 1.0673, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Search.hs, 5.4597, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Radix.hs, 3.0635, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Optimal.hs, 7.7343, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Merge.hs, 6.2357, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Intro.hs, 7.2033, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Insertion.hs, 1.3879, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Heap.hs, 30.4117, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Common.hs, 1.1672, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/Combinators.hs, 0.7574, True
-Tests/Benchmarks/vect-algs/Data/Vector/Algorithms/AmericanFlag.hs, 6.2854, True
-Tests/Benchmarks/hscolour/Setup.hs, 0.7381, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour.hs, 5.4899, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/TTY.hs, 1.1312, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Output.hs, 0.9022, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Options.hs, 0.7994, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/MIRC.hs, 2.4523, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/LaTeX.hs, 20.4751, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/InlineCSS.hs, 1.6541, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/HTML.hs, 5.0603, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/General.hs, 0.7785, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/CSS.hs, 1.6909, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Colourise.hs, 3.1406, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/ColourHighlight.hs, 2.6411, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Classify.hs, 201.4628, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/ANSI.hs, 1.7359, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/Anchors.hs, 56.6807, True
-Tests/Benchmarks/hscolour/Language/Haskell/HsColour/ACSS.hs, 9.8183, True
-Tests/Benchmarks/icfp_pos/WhileTest.hs, 1.0479, True
-Tests/Benchmarks/icfp_pos/WhileM.hs, 0.9189, True
-Tests/Benchmarks/icfp_pos/TwiceM.hs, 5.9998, True
-Tests/Benchmarks/icfp_pos/TestM.hs, 0.7572, True
-Tests/Benchmarks/icfp_pos/RIO2.hs, 16.0765, True
-Tests/Benchmarks/icfp_pos/Privileges.hs, 0.7616, True
-Tests/Benchmarks/icfp_pos/Overview.lhs, 6.1984, True
-Tests/Benchmarks/icfp_pos/Incr.hs, 1.0211, True
-Tests/Benchmarks/icfp_pos/Incr-elim.hs, 0.9909, True
-Tests/Benchmarks/icfp_pos/IfM2.hs, 3.2683, True
-Tests/Benchmarks/icfp_pos/IfM.hs, 5.3661, True
-Tests/Benchmarks/icfp_pos/ICFP15.lhs, 1.6548, True
-Tests/Benchmarks/icfp_pos/FoldL.hs, 5.4424, True
-Tests/Benchmarks/icfp_pos/FoldAbs.hs, 5.1555, True
-Tests/Benchmarks/icfp_pos/FindRec.hs, 8.8446, True
-Tests/Benchmarks/icfp_pos/Filter.lhs, 0.9865, True
-Tests/Benchmarks/icfp_pos/dropwhile.hs, 0.8829, True
-Tests/Benchmarks/icfp_pos/DBMovies.hs, 4.0810, True
-Tests/Benchmarks/icfp_pos/CopyRec.hs, 15.8345, True
-Tests/Benchmarks/icfp_pos/Composition.hs, 0.8756, True
-Tests/Benchmarks/icfp_pos/CompareConstraints.hs, 1.1962, True
-Tests/Benchmarks/icfp_pos/Append.hs, 1.1225, True
-Tests/Benchmarks/icfp_neg/WhileM.hs, 1.2369, True
-Tests/Benchmarks/icfp_neg/TwiceM.hs, 33.5061, True
-Tests/Benchmarks/icfp_neg/TestM.hs, 0.9055, True
-Tests/Benchmarks/icfp_neg/Records.hs, 0.8576, True
-Tests/Benchmarks/icfp_neg/IfM.hs, 5.8415, True
-Tests/Benchmarks/icfp_neg/DBMovies.hs, 3.7073, True
-Tests/Benchmarks/icfp_neg/Composition.hs, 0.8709, True
diff --git a/tests/neg/ListRange.dat b/tests/neg/ListRange.dat
deleted file mode 100644
--- a/tests/neg/ListRange.dat
+++ /dev/null
@@ -1,1 +0,0 @@
-data List a << p:a (fld:a)>> = Nil | Cons x:a^True y:List a^p(x) << p(fld) >> --
diff --git a/tests/neg/Sumk.hquals b/tests/neg/Sumk.hquals
deleted file mode 100644
--- a/tests/neg/Sumk.hquals
+++ /dev/null
@@ -1,2 +0,0 @@
-qualif PPLUS0(v:int): v >= ~A + ~B
-qualif PPLUS1(v:int): v > ~A + ~B
diff --git a/tests/parser/pos/Parens.hs b/tests/parser/pos/Parens.hs
deleted file mode 100644
--- a/tests/parser/pos/Parens.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module Parens where
-
-{-@ data Node a = Branch (BranchList a) @-}
-data Node a = Branch (BranchList a)
-data BranchList a = BL a
-
-{-@ test :: v:a -> (a, a) @-}
-test :: a -> (a,a)
-test x = (x,x)
-
-{-@
-measure listlen :: [a] -> Int
-listlen [] = 0
-listlen (x:xs) = 1 + listlen xs
-@-}
diff --git a/tests/parser/pos/TokensAsPrefixes.hs b/tests/parser/pos/TokensAsPrefixes.hs
deleted file mode 100644
--- a/tests/parser/pos/TokensAsPrefixes.hs
+++ /dev/null
@@ -1,5 +0,0 @@
-module Fixme where
-
-{-@ instancesB :: Int -> Int @-}
-instancesB :: Int -> Int
-instancesB x = x
diff --git a/tests/pmap.py b/tests/pmap.py
deleted file mode 100644
--- a/tests/pmap.py
+++ /dev/null
@@ -1,30 +0,0 @@
-import itertools as it
-import threading, Queue
-
-class PMapWorker (threading.Thread):
-    def __init__ (self, f, q):
-        threading.Thread.__init__ (self)
-        self.results = list ()
-        self.f       = f
-        self.q       = q
-
-    def run(self):
-        while True:
-            try:
-                x = self.q.get_nowait ()
-                self.results.append (self.f (x))
-                self.q.task_done ()
-            except Queue.Empty:
-                return
-
-def map (threadcount, f, xs):
-    q = Queue.Queue ()
-    for x in xs:
-        q.put (x)
-
-    workers = [PMapWorker (f, q) for i in range (0, threadcount)]
-    for worker in workers:
-        worker.start ()
-    q.join ()
-
-    return it.chain (*[worker.results for worker in workers])
diff --git a/tests/pos/Deptup1.pred b/tests/pos/Deptup1.pred
deleted file mode 100644
--- a/tests/pos/Deptup1.pred
+++ /dev/null
@@ -1,1 +0,0 @@
-assumep mkPair :: forall a b. forAll p:b(fld:a). a -> b -> Pair a b <<p>>
diff --git a/tests/pos/GhcSort3.T.hs b/tests/pos/GhcSort3.T.hs
deleted file mode 100644
--- a/tests/pos/GhcSort3.T.hs
+++ /dev/null
@@ -1,41 +0,0 @@
-module GhcSort () where
-
-{-@ type OList a =  [a]<{\fld v -> (v >= fld)}>  @-}
-
-{-@ assert sort3 :: (Ord a) => w:a -> [{v:a|v<=w}] -> OList a @-}
-sort3 :: (Ord a) => a -> [a] -> [a]
-sort3 w ls = qsort w ls [] (length ls) 0
-
-{-@ decrease qsort 5 6 @-}
-{-@ decrease rqsort 5 6 @-}
-{-@ decrease qpart 8 9 @-}
-{-@ decrease rqpart 8 9 @-}
-qsort :: (Ord a) =>  a -> [a] -> [a] -> Int -> Int -> [a]
-{-@ qsort, rqsort :: (Ord a) =>  w:a -> xs:[{v:a|v<=w}] -> OList {v:a|v>=w} -> {v:Int | v = (len xs) } -> {v:Int | v = 0 } -> OList a @-}
-qsort _ []     r _ _ = r
-qsort _ [x]    r _ _ = x:r
-qsort w (x:xs) r _ _ = qpart w x xs [] [] r (length xs) (length xs + 1)
-
-{-@ qpart, rqpart :: (Ord a) => w:a -> x:{v:a|v<=w} -> xs:[{v:a|v <= w}] -> lt:[{v:a|((v<=x) && (v<=w))}] -> ge:[{v:a|((v >= x) && (v<=w))}] -> rs:(OList {v:a|v >= w}) -> {v:Int | v = ((len xs) + (len lt) + (len ge))} -> {v:Int|v = (len xs) + 1} -> OList a @-}
-qpart :: (Ord a) => a -> a -> [a] -> [a] -> [a] -> [a] -> Int -> Int -> [a]
-qpart w x [] rlt rge r _ _ =
-    rqsort x rlt (x:rqsort w rge r (length rge) 0) (length rlt) 0
-qpart w x (y:ys) rlt rge r d1 d2 =
-    case compare x y of
-        GT -> qpart w x ys (y:rlt) rge r d1 (d2 - 1)
-        _  -> qpart w x ys rlt (y:rge) r d1 (d2 - 1)
-
-{- rqsort :: (Ord a) =>  w:a -> xs:[{v:a|v<=w}] -> OList {v:a|v>=w} -> {v:Int | v = (len xs) } -> {v:Int | v = 0 } -> OList a @-}
-rqsort :: (Ord a) => a -> [a] -> [a] -> Int -> Int -> [a]
-rqsort _ []     r _ _ = r
-rqsort _ [x]    r _ _ = x:r
-rqsort w (x:xs) r _ _ = rqpart w x xs [] [] r (length xs) (length xs + 1)
-
-rqpart :: (Ord a) => a -> a -> [a] -> [a] -> [a] -> [a] -> Int -> Int -> [a]
-rqpart w x [] rle rgt r _ _ =
-    qsort x rle (x:qsort w rgt r (length rgt) 0) (length rle) 0 
-rqpart w x (y:ys) rle rgt r d1 d2 =
-    case compare y x of
-        GT -> rqpart w x ys rle (y:rgt) r d1 (d2-1)
-        _  -> rqpart w x ys (y:rle) rgt r d1 (d2-1)
-
diff --git a/tests/pos/T1045.hs-boot b/tests/pos/T1045.hs-boot
deleted file mode 100644
--- a/tests/pos/T1045.hs-boot
+++ /dev/null
@@ -1,3 +0,0 @@
-module T1045 where
-
-foo :: Int -> Int
diff --git a/tests/pos/T1092.hs b/tests/pos/T1092.hs
new file mode 100644
--- /dev/null
+++ b/tests/pos/T1092.hs
@@ -0,0 +1,65 @@
+{-@ LIQUID "--higherorder"        @-}
+{-@ LIQUID "--exactdc"            @-}
+module VerifiedEqInstances where
+
+import Language.Haskell.Liquid.ProofCombinators
+
+{-@ data VerifiedEq a = VEQ {
+      eq :: a -> a -> Bool
+    , refl :: x:a -> { v:() | eq x x }
+    , sym :: x:a -> y:a -> { v:() | eq x y ==> eq y x }
+    , trans :: x:a -> y:a -> z:a -> { v:() | eq x y && eq y z ==> eq x z }
+    }
+@-}
+data VerifiedEq a = VEQ {
+    eq    :: a -> a -> Bool
+  , refl  :: a -> Proof
+  , sym   :: a -> a -> Proof
+  , trans :: a -> a -> a -> Proof
+  }
+
+{-@ axiomatize eqInt @-}
+eqInt :: Int -> Int -> Bool
+eqInt x y = x == y
+{-# INLINE eqInt #-}
+
+{-@ eqIntRefl :: x:Int -> { eqInt x x } @-}
+eqIntRefl :: Int -> Proof
+eqIntRefl x = eqInt x x ==. x == x *** QED
+
+{-@ eqIntSym :: x:Int -> y:Int -> { eqInt x y ==> eqInt y x } @-}
+eqIntSym :: Int -> Int -> Proof
+eqIntSym x y = eqInt x y ==. x == y ==. y == x *** QED
+
+{-@ eqIntTrans :: x:Int -> y:Int -> z:Int -> { eqInt x y && eqInt y z ==> eqInt x z } @-}
+eqIntTrans :: Int -> Int -> Int -> Proof
+eqIntTrans x y z = (eqInt x y && eqInt y z) ==. (x == y && y == z) ==. x == z *** QED
+
+veqInt :: VerifiedEq Int
+veqInt = VEQ eqInt eqIntRefl eqIntSym eqIntTrans
+
+{-@ axiomatize eqDouble @-}
+eqDouble :: Double -> Double -> Bool
+eqDouble x y = x == y
+{-# INLINE eqDouble #-}
+
+{-@ eqDoubleRefl :: x:Double -> { eqDouble x x } @-}
+eqDoubleRefl :: Double -> Proof
+eqDoubleRefl x = eqDouble x x ==. x == x *** QED
+
+{-@ eqDoubleSym :: x:Double -> y:Double
+                -> { eqDouble x y ==> eqDouble y x } @-}
+eqDoubleSym :: Double -> Double -> Proof
+eqDoubleSym x y = eqDouble x y ==. x == y ==. y == x *** QED
+
+{-@ eqDoubleTrans :: x:Double -> y:Double -> z:Double
+                  -> { eqDouble x y && eqDouble y z ==> eqDouble x z } @-}
+eqDoubleTrans :: Double -> Double -> Double -> Proof
+eqDoubleTrans x y z
+  =   (eqDouble x y && eqDouble y z)
+  ==. (x == y       && y == z)
+  ==. x == z
+  *** QED
+
+veqDouble :: VerifiedEq Double
+veqDouble = VEQ eqDouble eqDoubleRefl eqDoubleSym eqDoubleTrans
diff --git a/tests/pos/T1120A.hs b/tests/pos/T1120A.hs
new file mode 100644
--- /dev/null
+++ b/tests/pos/T1120A.hs
@@ -0,0 +1,44 @@
+{-@ LIQUID "--higherorder"        @-}
+{-@ LIQUID "--exactdc"            @-}
+module Bug where
+
+import Language.Haskell.Liquid.ProofCombinators
+
+data U1 p = U1
+data M1 i c f p = M1 { unM1 :: f p }
+data C
+data D
+type C1 = M1 C
+type D1 = M1 D
+
+data MyUnit = MyUnit deriving (Eq)
+
+data A
+data B
+type RepMyUnit = D1 A (C1 B U1)
+
+{-@ axiomatize fromMyUnit @-}
+fromMyUnit :: MyUnit -> RepMyUnit x_at0x
+fromMyUnit MyUnit = M1 (M1 U1)
+
+{-@ axiomatize toMyUnit @-}
+toMyUnit :: RepMyUnit x_at0x -> MyUnit
+toMyUnit (M1 (M1 U1)) = MyUnit
+
+{-@ fotMyUnit :: a:RepMyUnit x
+              -> { fromMyUnit (toMyUnit a) == a }
+@-}
+fotMyUnit :: RepMyUnit x_at0x -> Proof
+fotMyUnit z_at0y@(M1 (M1 U1))
+  = ((((fromMyUnit (toMyUnit z_at0y)) ==. (fromMyUnit MyUnit))
+      ==. z_at0y)
+     *** QED)
+
+{-@ tofMyUnit :: a:MyUnit
+              -> { toMyUnit (fromMyUnit a) == a }
+@-}
+tofMyUnit :: MyUnit -> Proof
+tofMyUnit z_at0y@MyUnit
+  = ((((toMyUnit (fromMyUnit z_at0y)) ==. (toMyUnit (M1 (M1 U1))))
+      ==. z_at0y)
+     *** QED)
diff --git a/tests/pos/T385.hs b/tests/pos/T385.hs
new file mode 100644
--- /dev/null
+++ b/tests/pos/T385.hs
@@ -0,0 +1,37 @@
+module Compose where
+
+import Prelude hiding (Functor, Monad)
+
+data ST s a = ST {runState :: s -> (a,s)}
+
+{-@ data ST s a <p :: s -> Bool, q :: s -> s -> Bool, r :: s -> a -> Bool> 
+  = ST (runState :: x:s<p> -> (a<r x>, s<q x>)) @-}
+
+{-@ runState :: forall <p :: s -> Bool, q :: s -> s -> Bool, r :: s -> a -> Bool>. ST <p, q, r> s a -> x:s<p> -> (a<r x>, s<q x>) @-}
+
+class Functor f where
+  fmap :: (a -> b) -> f a -> f b
+
+instance Functor (ST s) where
+  fmap f (ST g) = ST (\s -> let (a, s') = g s in (f a, s'))
+
+class Functor m => Monad m where
+  (>>) :: m a -> m b -> m b
+
+instance Monad (ST s) where
+  {-@ instance Monad ST s where
+    >>  :: forall s a b  < pref :: s -> Bool, postf :: s -> s -> Bool
+              , pre  :: s -> Bool, postg :: s -> s -> Bool
+              , post :: s -> s -> Bool
+              , rg   :: s -> a -> Bool
+              , rf   :: s -> b -> Bool
+              , r    :: s -> b -> Bool
+              >. 
+       {x::s<pre>, y::s<postg x> |- b<rf y> <: b<r x>}
+       {xx::s<pre>, w::s<postg xx> |- s<postf w> <: s<post xx>}
+       {ww::s<pre> |- s<postg ww> <: s<pref>}
+       (ST <pre, postg, rg> s a)
+    -> (ST <pref, postf, rf> s b)
+    -> (ST <pre, post, r> s b)
+    @-}
+  (ST g) >>  f = ST (\x -> case g x of {(y, s) -> (runState f) s})    
diff --git a/tests/pos/Termination.lhs b/tests/pos/Termination.lhs
deleted file mode 100644
--- a/tests/pos/Termination.lhs
+++ /dev/null
@@ -1,37 +0,0 @@
-\begin{code}
-module Termination where
-import Prelude hiding (sum)
-type Value = Int
-
-type Vec = Int -> Value
-
-{-@ sum :: Vec -> Nat -> Value @-}
-sum :: Vec -> Int -> Value
-sum a 0 = a 0
-sum a i = a i + sum a (i-1)
-
-{-@ sum' :: Vec -> Value -> n:Nat -> Value / [n] @-}
-sum' :: Vec -> Value -> Int -> Value
-sum' a acc 0 = acc + a 0
-sum' a acc i = sum' a (acc + a i) (i-1)
-
-type Vec2D = Int -> Int -> Value
-
-{-@ sum2D :: Vec2D -> Nat -> Nat -> Value @-}
-sum2D :: Vec2D -> Int -> Int -> Value
-sum2D a n m = go n m
-  where
-    {-@ go :: ink:Nat -> joe:Nat -> Value / [ink, joe] @-}
-    go 0 0        = a 0 0
-    go i j
-      | j == 0    =  a i 0 + go (i-1) m
-      | otherwise =  a i j + go i (j-1)
-
-{-@ sumFromTo :: Vec -> lo:Nat -> hi:{v:Nat|v>=lo} -> Value @-}
-sumFromTo :: Vec -> Int -> Int ->  Value
-sumFromTo a lo hi = go lo hi
-  where
-       {-@ go :: lo:Nat -> hi:{v:Nat|v>=lo} -> Value / [hi-lo] @-}
-        go lo hi | lo == hi  =  a lo
-                 | otherwise =  a lo + go (lo+1) hi
-\end{code}
diff --git a/tests/pos/fixme.hs b/tests/pos/fixme.hs
new file mode 100644
--- /dev/null
+++ b/tests/pos/fixme.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE GADTs #-}
+
+{-@ LIQUID "--no-termination" @-}
+
+{-@ data List a where
+       Nil  :: List a
+     | Cons :: poopy:a -> listTail:List a -> List a
+  @-}
+
+data List a where
+  Nil  :: List a
+  Cons :: a -> List a -> List a
+
+test :: List a -> Int
+test Nil = 1
+test (Cons x xs) = 1 + test xs
diff --git a/tests/pos/monad0.hs b/tests/pos/monad0.hs
new file mode 100644
--- /dev/null
+++ b/tests/pos/monad0.hs
@@ -0,0 +1,13 @@
+module Monad where
+
+{- LIQUID "--no-pattern-inline" @-}
+
+-- create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteString
+create l = do
+    fp <- mallocByteString l
+    return ()
+
+data P a = P a
+
+mallocByteString :: a -> IO (P a)
+mallocByteString l = undefined
diff --git a/tests/pos/test00.old.hs b/tests/pos/test00.old.hs
deleted file mode 100644
--- a/tests/pos/test00.old.hs
+++ /dev/null
@@ -1,11 +0,0 @@
-module Test0 () where
-
-import Language.Haskell.Liquid.Prelude
-
-x = choose 0
-
-prop_abs = if x `gt` 0 then baz x else False
-
-baz   :: Int -> Bool
-baz z = liquidAssertB (z `geq` 0)
-
diff --git a/tests/pos/test000.hs.hquals b/tests/pos/test000.hs.hquals
deleted file mode 100644
--- a/tests/pos/test000.hs.hquals
+++ /dev/null
@@ -1,1 +0,0 @@
-qualif Foo(v: Int): v = 10
diff --git a/tests/regrtest.py b/tests/regrtest.py
deleted file mode 100644
--- a/tests/regrtest.py
+++ /dev/null
@@ -1,176 +0,0 @@
-#!/usr/bin/python
-# Copyright (c) 2009 The Regents of the University of California. All rights reserved.
-#
-# Permission is hereby granted, without written agreement and without
-# license or royalty fees, to use, copy, modify, and distribute this
-# software and its documentation for any purpose, provided that the
-# above copyright notice and the following two paragraphs appear in
-# all copies of this software.
-#
-# IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
-# FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
-# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
-# IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY
-# OF SUCH DAMAGE.
-#
-# THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
-# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
-# AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
-# ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION
-# TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
-
-import time, subprocess, optparse, sys, socket, os
-sys.path.append("../")
-import rtest as rtest
-
-solve         = "liquid ".split()
-null          = open("/dev/null", "w")
-now	          = (time.asctime(time.localtime(time.time()))).replace(" ","_")
-logfile       = "../tests/logs/regrtest_results_%s_%s" % (socket.gethostname (), now)
-argcomment    = "--! run with "
-liquidcomment = "{--! run liquid with "
-endcomment    = "-}"
-
-def logged_sys_call(args, out=None, err=None, dir=None):
-  print "exec: " + " ".join(args)
-  return subprocess.call(args, stdout=out, stderr=err, cwd=dir)
- 
-def solve_quals(dir,file,bare,time,quiet,flags,lflags):
-  if quiet: out = null
-  else: out = None
-  if time: time = ["time"]
-  else: time = []
-  if lflags: lflags = ["--" + f for f in lflags]
-  hygiene_flags = []
-  (dn, bn) = os.path.split(file)
-  try:
-    os.makedirs(os.path.join(dir,dn,".liquid"))
-  except OSError:
-    pass
-  out = open(os.path.join(dir,dn,".liquid",bn) + ".log", "w")
-  rv  = logged_sys_call(time + solve + flags + lflags + hygiene_flags + [file],
-                        out=None, err=subprocess.STDOUT, dir=dir)
-  out.close()
-  return rv
-
-def run_script(file,quiet):
-  if quiet: out = null
-  else: out = None
-  return logged_sys_call(file, out)
-
-def getfileargs(file):
-  f = open(file)
-  l = f.readline()
-  f.close()
-  if l.startswith(argcomment):
-    return l[len(argcomment):].strip().split(" ")
-  else:
-    return []
-
-def getliquidargs(file):
-  f = open(file)
-  l = f.readline()
-  f.close()
-  if l.startswith(liquidcomment):
-    return [arg for arg in l[len(liquidcomment):].strip().split(" ")
-                     if arg!=endcomment]
-  else:
-    return []
-
-
-class Config (rtest.TestConfig):
-  def __init__ (self, dargs, testdirs, logfile, threadcount):
-    rtest.TestConfig.__init__ (self, testdirs, logfile, threadcount)
-    self.dargs = dargs
-
-  def run_test (self, dir, file):
-    path = os.path.join(dir,file)
-    if self.is_test(file):
-      lflags = getliquidargs(path)
-      fargs  = getfileargs(path)
-      fargs  = self.dargs + fargs  
-      return solve_quals(dir, file, True, False, True, fargs, lflags)
-    elif file.endswith(".sh"):
-      return run_script(path, True)
-
-  def is_test (self, file):
-    return file.endswith(".hs") # or file.endswith(".lhs")
-
-#####################################################################################
-
-#DEFAULT
-
-textIgnored = { "Data/Text/Axioms.hs"
-              , "Data/Text/Encoding/Error.hs"
-              , "Data/Text/Encoding/Fusion.hs"
-              , "Data/Text/Encoding/Fusion/Common.hs"
-              , "Data/Text/Encoding/Utf16.hs"
-              , "Data/Text/Encoding/Utf32.hs"
-              , "Data/Text/Encoding/Utf8.hs"
-              , "Data/Text/Fusion/CaseMapping.hs"
-              , "Data/Text/Fusion/Common.hs"
-              , "Data/Text/Fusion/Internal.hs"
-              , "Data/Text/IO.hs"
-              , "Data/Text/IO/Internal.hs"
-              , "Data/Text/Lazy/Builder/Functions.hs"
-              , "Data/Text/Lazy/Builder/Int.hs"
-              , "Data/Text/Lazy/Builder/Int/Digits.hs"
-              , "Data/Text/Lazy/Builder/Internal.hs"
-              , "Data/Text/Lazy/Builder/RealFloat.hs"
-              , "Data/Text/Lazy/Builder/RealFloat/Functions.hs"
-              , "Data/Text/Lazy/Encoding/Fusion.hs"
-              , "Data/Text/Lazy/IO.hs"
-              , "Data/Text/Lazy/Read.hs"
-              , "Data/Text/Read.hs"
-              , "Data/Text/Unsafe/Base.hs"
-              , "Data/Text/UnsafeShift.hs"
-              , "Data/Text/Util.hs"
-              }
-
-demosIgnored = { "Composition.hs"
-               , "Eval.hs"
-               , "Inductive.hs"
-               , "Loop.hs"
-               , "TalkingAboutSets.hs"
-               , "refinements101reax.hs"
-               }
-
-regtestdirs  = [ ("pos", {}, 0)
-               , ("neg", {}, 1)
-               , ("crash", {}, 2)
-               , ("parser/pos", {}, 0)
-               , ("error_messages/pos", {}, 0)
-               , ("error_messages/crash", {}, 2)
-               ]
-
-benchtestdirs = [ ("../web/demos", demosIgnored, 0)
-                , ("../benchmarks/esop2013-submission", {"Base0.hs"}, 0)
-                , ("../benchmarks/bytestring-0.9.2.1", {}, 0)
-                , ("../benchmarks/text-0.11.2.3", textIgnored, 0)
-                , ("../benchmarks/vector-algorithms-0.5.4.2", {}, 0)
-                , ("../benchmarks/hscolour-1.20.0.0", {}, 0)
-                ]
-
-parser = optparse.OptionParser()
-parser.add_option("-a", "--all", action="store_true", dest="alltests", help="run all tests")
-parser.add_option("-t", "--threads", dest="threadcount", default=1, type=int, help="spawn n threads")
-parser.add_option("-o", "--opts", dest="opts", default=[], action='append', type=str, help="additional arguments to liquid")
-parser.disable_interspersed_args()
-options, args = parser.parse_args()
-
-print "options =", options
-print "args =", args
-
-def testdirs():
-  global testdirs
-  if options.alltests:
-    return regtestdirs + benchtestdirs
-  else:
-    return regtestdirs
-
-testdirs = testdirs()
-
-clean = os.path.abspath("../cleanup")
-[os.system(("cd %s; %s; cd ../" % (d,clean))) for (d,_,_) in testdirs]
-runner = rtest.TestRunner (Config (options.opts, testdirs, logfile, options.threadcount))
-sys.exit(runner.run())
diff --git a/tests/rtest.py b/tests/rtest.py
deleted file mode 100644
--- a/tests/rtest.py
+++ /dev/null
@@ -1,114 +0,0 @@
-import time, os, os.path
-import pmap
-import itertools as it
-import threading, Queue
-
-class LogWriter (threading.Thread):
-    def __init__ (self, logfile, q):
-        threading.Thread.__init__ (self)
-        self.log  = open (logfile, "w")
-        self.q    = q
-        self.halt = False
-        self.log.write("test, time(s), result \n")
-
-    def __del__ (self):
-        self.log.close ()
-
-    def run (self):
-        while not self.halt:
-            try:
-                file, runtime, ok = self.q.get (timeout=1)
-                self.log.write("%s, %f, %s \n" % (file, runtime, ok))
-                self.log.flush()
-                self.q.task_done ()
-            except Queue.Empty:
-                pass
-
-class TestConfig:
-    def __init__ (self, testdirs, logfile = None, threadcount = 1):
-        self.testdirs    = testdirs
-        self.valid_exits = [x for d, i, x in self.testdirs]
-        if logfile != None:
-            self.logq   = Queue.Queue ()
-            self.logger = LogWriter (logfile, self.logq)
-            self.logger.start ()
-        else:
-            self.logger = None
-        self.exceptions  = list()
-        self.threadcount = threadcount
-
-    def finalize (self):
-        if self.logger != None:
-            self.logger.halt = True
-
-    def is_test (self, file):
-        pass
-
-    def run_test (self, file):
-        pass
-
-    def log_test (self, file, runtime, ok):
-        if self.logger != None:
-            self.logq.put ((file, runtime, ok))
-
-        if ok not in self.valid_exits:
-            self.exceptions.append (file)
-  
-class TestRunner:
-    def __init__ (self, config):
-        self.config = config
-
-    def run_test (self, (dir, file, expected_statuses)):
-        path    = os.path.join(dir, file)
-        start   = time.time ()
-        status  = self.config.run_test (dir, file)
-        runtime = time.time () - start
-        print "%f seconds" % (runtime)
-
-        if hasattr (expected_statuses, '__iter__'):
-          ok = (status in expected_statuses) 
-        else:
-          ok = (status == expected_statuses)
-        if ok:
-            print "\033[1;32mSUCCESS!\033[1;0m (%s)\n" % (path)
-        else:
-            print "\033[1;31mFAILURE :(\033[1;0m (%s) \n" % (path)
-        self.config.log_test(path, runtime, ok)
-        
-        return (dir + "/" + file, ok, status not in self.config.valid_exits)
-
-    def run_tests (self, tests):
-        results   = pmap.map (self.config.threadcount, self.run_test, tests)
-        self.config.finalize()
-        failed    = sorted([(result[0], result[2]) for result in results if result[1] == False])
-        failcount = len(failed)
-        if failcount == 0:
-            print "\n\033[1;32mPassed all tests! :D\033[1;0m"
-        else:
-            failnames  = [fail[0] for fail in failed]
-            print "\n\033[1;31mFailed %d tests:\033[1;0m \n %s \n" % (failcount, ",\n  ".join(failnames))
-
-            exceptions = [fail[0] for fail in failed if fail[1]]
-            if exceptions != []:
-                print "\n\033[1;31mExceptions thrown on %d tests:\033[1;0m \n  %s \n" % (len(exceptions), ",\n  ".join(exceptions))
-
-        return (failcount != 0)
-
-    def directory_tests (self, dir, ignored, expected_status):
-        paths = [(dir, os.path.relpath(os.path.join(d, f), dir))
-                 for d,_,files in os.walk(dir)
-                 for f in files]
-        return it.chain([(dir, file, expected_status)
-                         for dir, file in paths
-                         if self.config.is_test (file) and file not in ignored])
-
-        # return it.chain(*[[(dir, os.path.relpath(os.path.join (dir_, file),dir),
-        #                     expected_status)
-        #                    for file in files
-        #                    if self.config.is_test (file) and file not in ignored]
-        #                   for dir_, _, files in os.walk(dir)])
-
-    def run (self):
-        return self.run_tests (it.chain (*[self.directory_tests (dir, ignored, expected_status)
-                                           for dir, ignored, expected_status
-                                           in self.config.testdirs]))
diff --git a/tests/strings/neg/StringIndexingStep1.hs b/tests/strings/neg/StringIndexingStep1.hs
deleted file mode 100644
--- a/tests/strings/neg/StringIndexingStep1.hs
+++ /dev/null
@@ -1,52 +0,0 @@
-{-# LANGUAGE KindSignatures      #-}
-{-# LANGUAGE DataKinds           #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE GADTs               #-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--stringtheory"    @-}
-
-module StringIndexing where
-
-
-import GHC.TypeLits
-import Data.String 
-
-import Data.Proxy 
--- Structure that defines valid indeces of a type level target 
--- symbol in a value level string
-
-data MI (tagret :: Symbol) s where 
-  MI :: IsString s => s        -- input string
-                   -> [Int]    -- valid indeces of target in input
-                   -> MI target s
-
-{-@ MI :: input:s 
-       -> [{i:Int |	 subString input i (stringLen target)  == target }]
-       -> MI s @-}
-
-
--- STEP 1:    Verification of valid structures
--- CHALLENGE: String interepretations from SMT 
-
--- THESE SHOULD BE SAFE 
-misafe1 :: MI "cat" String 
-misafe1 = MI "catdogcatsdots" []
-
-misafe2 :: MI "cat" String
-misafe2 = MI "catdogcatsdots" [0]
-
-misafe3 :: MI "cat" String
-misafe3 = MI "catdogcatsdots" [0, 6]
-
-misafe4 :: MI "cat" String
-misafe4 = MI "catdogcatsdots" [6, 0]
-
-misafe5 :: MI "cat" String
-misafe5 = MI "catdogcatsdots" [6]
-
-
--- THIS SHOULD BE UNSAFE 
-miunsafe :: MI "dog" String
-miunsafe = MI "catdogcatsdots" [1]
diff --git a/tests/strings/pos/DivideAndQunquer.hs b/tests/strings/pos/DivideAndQunquer.hs
deleted file mode 100644
--- a/tests/strings/pos/DivideAndQunquer.hs
+++ /dev/null
@@ -1,315 +0,0 @@
-{-@ LIQUID "--higherorder"         @-}
-{-@ LIQUID "--totality"            @-}
-{-@ LIQUID "--exactdc"             @-}
-
-
-module DivideAndQunquer where 
-
-import Prelude hiding (mconcat, map, split, take, drop)
-import Language.Haskell.Liquid.ProofCombinators 
-
-
-{-@ divideAndQunquer
-     :: f:(List i -> List o)
-     -> thm:(x1:List i -> x2:List i -> {f (append x1 x2) == append (f x1) (f x2)} )
-     -> is:List i 
-     -> n:Int 
-     -> m:Int 
-     -> {f is == pmconcat m (map f (chunk n is))}
-     / [llen is] 
-  @-}
-
-divideAndQunquer 
-  :: (List i -> List o) 
-  -> (List i -> List i -> Proof)
-  -> List i -> Int -> Int -> Proof
-divideAndQunquer f thm is n m  
-  =   pmconcat m (map f (chunk n is))
-  ==. mconcat (map f (chunk n is))
-       ? pmconcatEquivalence m (map f (chunk n is))
-  ==. f is 
-       ? distributeInput f thm is n 
-  *** QED 
-
-{-@ distributeInput
-     :: f:(List i -> List o)
-     -> thm:(x1:List i -> x2:List i -> {f (append x1 x2) == append (f x1) (f x2)} )
-     -> is:List i 
-     -> n:Int 
-     -> {f is == mconcat (map f (chunk n is))}
-     / [llen is] 
-  @-}
-
-distributeInput 
-  :: (List i -> List o) 
-  -> (List i -> List i -> Proof)
-  -> List i -> Int -> Proof
-distributeInput f thm is n  
-  | llen is <= n || n <= 1
-  =   mconcat (map f (chunk n is))
-  ==. mconcat (map f (C is N))
-  ==. mconcat (f is `C` map f N)
-  ==. mconcat (f is `C` N)
-  ==. append (f is) (mconcat N)
-  ==. append (f is) N
-  ==. f is ? appendRightIdentity (f is)
-  *** QED 
-  | otherwise
-  =   mconcat (map f (chunk n is))
-  ==. mconcat (map f (C (take n is) (chunk n (drop n is)))) 
-  ==. mconcat (f (take n is) `C` map f (chunk n (drop n is)))
-  ==. append (f (take n is)) (mconcat (map f (chunk n (drop n is))))
-  ==. append (f (take n is)) (f (drop n is))
-       ? distributeInput f thm (drop n is) n  
-  ==. f (append (take n is) (drop n is))
-       ? thm (take n is) (drop n is)
-  ==. f is 
-       ? appendTakeDrop n is 
-  *** QED 
-
-pmconcatEquivalence ::Int -> List (List a) -> Proof
-{-@ pmconcatEquivalence :: i:Int -> is:List (List a) 
-    -> {pmconcat i is == mconcat is} 
-    / [llen is] @-}
-pmconcatEquivalence i is 
-  | i <= 1
-  = pmconcat i is ==. mconcat is *** QED 
-pmconcatEquivalence i N 
-  =   pmconcat i N 
-  ==. N 
-  ==. mconcat N 
-  *** QED 
-pmconcatEquivalence i (C x N) 
-  =   pmconcat i (C x N)
-  ==. x 
-  ==. append x N
-       ? appendRightIdentity x  
-  ==. mconcat (C x (mconcat N)) 
-  ==. mconcat (C x N) 
-  *** QED 
-pmconcatEquivalence i xs 
-  | llen xs <= i 
-  =   pmconcat i xs 
-  ==. pmconcat i (map mconcat (chunk i xs))
-  ==. pmconcat i (map mconcat (C xs N))
-  ==. pmconcat i (mconcat xs `C`  map mconcat N)
-  ==. pmconcat i (mconcat xs `C`  N)
-  ==. mconcat xs
-  *** QED 
-pmconcatEquivalence i xs
-  =   pmconcat i xs 
-  ==. pmconcat i (map mconcat (chunk i xs))
-  ==. mconcat (map mconcat (chunk i xs))
-       ? pmconcatEquivalence i (map mconcat (chunk i xs))
-  ==. mconcat xs
-       ? mconcatAssoc i xs
-  *** QED 
-
--------------------------------------------------------------------------------
------------  List Definition --------------------------------------------------
--------------------------------------------------------------------------------
-
-
-{-@ data List [llen] a = N | C {lhead :: a, ltail :: List a} @-}
-data List a = N | C a (List a)
-
-llen :: List a -> Int 
-{-@ measure llen @-}
-{-@ llen :: List a -> Nat @-}
-llen N        = 0 
-llen (C _ xs) = 1 + llen xs
-
--------------------------------------------------------------------------------
------------  List Manipulation ------------------------------------------------
--------------------------------------------------------------------------------
-
--- Distribution 
-
-{-@ reflect map @-}
-{-@ map :: (a -> b) -> xs:List a -> {v:List b | llen v == llen xs } @-}
-map :: (a -> b) -> List a -> List b
-map _  N       = N
-map f (C x xs) = f x `C` map f xs 
-
-{-@ reflect chunk @-}
-{-@ chunk :: i:Int -> xs:List a -> {v:List (List a) | if (i <= 1 || llen xs <= i) then (llen v == 1) else (llen v < llen xs) } / [llen xs] @-}
-chunk :: Int -> List a -> List (List a)
-chunk i xs 
-  | i <= 1 
-  = C xs N 
-  | llen xs <= i 
-  = C xs N 
-  | otherwise
-  = C (take i xs) (chunk i (drop i xs))
-
-{-@ reflect drop @-}
-{-@ drop :: i:Nat -> xs:{List a | i <= llen xs } -> {v:List a | llen v == llen xs - i } @-} 
-drop :: Int -> List a -> List a 
-drop i N = N 
-drop i (C x xs)
-  | i == 0 
-  = C x xs  
-  | otherwise 
-  = drop (i-1) xs 
-
-{-@ reflect take @-}
-{-@ take :: i:Nat -> xs:{List a | i <= llen xs } -> {v:List a | llen v == i} @-} 
-take :: Int -> List a -> List a 
-take i N = N 
-take i (C x xs)
-  | i == 0 
-  = N  
-  | otherwise 
-  = C x (take (i-1) xs)
-
--- Monoid
-
-{-@ reflect mconcat @-}
-mconcat :: List (List a) -> List a 
-mconcat N        = N 
-mconcat (C x xs) = append x (mconcat xs)
-
-
-{-@ reflect pmconcat @-}
-pmconcat :: Int -> List (List a) -> List a  
-{-@ pmconcat :: i:Int -> is:List (List a) -> List a  /[llen is] @-}
-
-pmconcat i xs
-  | i <= 1 
-  = mconcat xs 
-pmconcat i N   
-  = N 
-pmconcat i (C x N) 
-  = x
-pmconcat i xs 
-  = pmconcat i (map mconcat (chunk i xs))
-
-{-@ reflect append @-}
-append :: List a -> List a -> List a 
-append N        ys = ys  
-append (C x xs) ys = x `C` (append xs ys)
-
-
--------------------------------------------------------------------------------
------------  Helper Theorems --------------------------------------------------
--------------------------------------------------------------------------------
-
--- List is a Monoid 
-
-appendRightIdentity :: List a -> Proof 
-{-@ appendRightIdentity :: xs:List a -> { append xs N == xs } @-}
-
-appendRightIdentity N 
-  = append N N ==. N *** QED 
-appendRightIdentity (C x xs)
-  =   append (C x xs) N 
-  ==. C x (append xs N) ? appendRightIdentity xs 
-  ==. C x xs 
-  *** QED   
-
-appendAssoc :: List a -> List a -> List a -> Proof 
-{-@ appendAssoc :: x:List a -> y:List a -> z:List a 
-  -> {append (append x y) z == append x (append y z)} @-}
-appendAssoc N y z 
-  =   append (append N y) z 
- -- ==. append y z
-  ==. append N (append y z)
-  *** QED 
-appendAssoc (C x xs) y z 
-  =   append (append (C x xs) y) z 
-  ==. append (x `C` (append xs y)) z 
-  ==. x `C` (append (append xs y) z)
-  ==. x `C` (append xs (append y z))
-       ? appendAssoc xs y z
-  ==. append (C x xs) (append y z)
-  *** QED   
-
-
--- | Monoid implications 
-
-mconcatAssocOne :: Int -> List (List a) -> Proof 
-{-@ mconcatAssocOne :: i:Nat -> xs:{List (List a) | i <= llen xs} 
-     -> {mconcat xs == append (mconcat (take i xs)) (mconcat (drop i xs))}
-     /[i]
-  @-} 
-mconcatAssocOne i N 
-  =   append (mconcat (take i N)) (mconcat (drop i N)) 
-  ==. append (mconcat N) (mconcat N)
-  ==. append N N 
-      --  ? leftIdentity N 
-  ==. N 
-  ==. mconcat N 
-  *** QED 
-mconcatAssocOne i (C x xs)
-  | i == 0
-  =   append (mconcat (take i (C x xs))) (mconcat (drop i (C x xs))) 
-  ==. append (mconcat N) (mconcat (C x xs))
-  ==. append N (mconcat (C x xs))
-  ==. mconcat (C x xs)
-      -- ? leftIdentity (C x xs)
-  *** QED 
-  | otherwise    
-  =   append (mconcat (take i (C x xs))) (mconcat (drop i (C x xs))) 
-  ==. append (mconcat (C x (take (i-1) xs))) (mconcat (drop (i-1) xs))
-  ==. append (append x (mconcat (take (i-1) xs))) (mconcat (drop (i-1) xs))
-       ? appendAssoc x (mconcat (take (i-1) xs)) (mconcat (drop (i-1) xs))
-  ==. append x (append (mconcat (take (i-1) xs)) (mconcat (drop (i-1) xs)))
-       ? mconcatAssocOne (i-1) xs
-  ==. append x (mconcat xs)
-  ==. mconcat (C x xs)
-  *** QED 
-
--- Generalization to chunking  
-
-mconcatAssoc :: Int -> List (List a) -> Proof 
-{-@ mconcatAssoc :: 
-    i:Int -> xs:List (List a) 
-  -> { mconcat xs == mconcat (map mconcat (chunk i xs))}
-  /  [llen xs] @-}
-mconcatAssoc i xs 
-  | i <= 1 || llen xs <= i
-  =   mconcat (map mconcat (chunk i xs))
-  ==. mconcat (map mconcat (C xs N))
-  ==. mconcat (mconcat xs `C` map mconcat N)
-  ==. mconcat (mconcat xs `C` N)
-  ==. append (mconcat xs) (mconcat N)
-  ==. append (mconcat xs) N
-  ==. mconcat xs 
-       ? appendRightIdentity (mconcat xs)
-  *** QED  
-   | otherwise
-   =   mconcat (map mconcat (chunk i xs))
-   ==. mconcat (map mconcat (take i xs `C` chunk i (drop i xs)))
-   ==. mconcat (mconcat (take i xs) `C` map mconcat (chunk i (drop i xs)))
-   ==. append (mconcat (take i xs)) (mconcat (map mconcat (chunk i (drop i xs))))
-   ==. append (mconcat (take i xs)) (mconcat (drop i xs))
-        ? mconcatAssoc i (drop i xs)
-   ==. mconcat xs 
-        ? mconcatAssocOne i xs 
-   *** QED 
-
-
-
--- | For input Distribution 
-{-@ appendTakeDrop :: i:Nat -> xs:{List a | i <= llen xs} 
-  -> {xs == append (take i xs) (drop i xs) }  @-}
-
-appendTakeDrop :: Int -> List a -> Proof 
-appendTakeDrop i N 
-  =   append (take i N) (drop i N)
-  ==. append N N 
-  ==. N 
-  *** QED 
-appendTakeDrop i (C x xs)
-  | i == 0 
-  =   append (take 0 (C x xs)) (drop 0 (C x xs))
-  ==. append N (C x xs)
-  ==. C x xs 
-  *** QED 
-  | otherwise
-  =   append (take i (C x xs)) (drop i (C x xs))
-  ==. append (C x (take (i-1) xs)) (drop (i-1) xs)
-  ==. C x (append (take (i-1) xs) (drop (i-1) xs))
-  ==. C x xs ? appendTakeDrop (i-1) xs 
-  *** QED 
-
diff --git a/tests/strings/pos/Proves.hs b/tests/strings/pos/Proves.hs
deleted file mode 100644
--- a/tests/strings/pos/Proves.hs
+++ /dev/null
@@ -1,250 +0,0 @@
-{-@ LIQUID "--higherorder"     @-}
-
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE FlexibleInstances     #-}
-{-# LANGUAGE FlexibleContexts      #-}
-{-# LANGUAGE TypeFamilies          #-}
-{-# LANGUAGE IncoherentInstances   #-}
-module Proves (
-
-    (==:), (<=:), (<:), (>:)
-
-  , (==?)
-
-  , (==.), (<=.), (<.), (>.), (>=.)
-
-  -- Function Equality
-  , Arg
-
-  , (=*=.)
-
-  , (?), (∵), (***)
-
-  , (==>), (&&&)
-
-  , proof, toProof, simpleProof
-
-  , QED(..)
-
-  , Proof
-
-  , byTheorem
-
-  , todo
-
-  ) where
-
-
--- | proof operators requiring proof terms
-infixl 3 ==:, <=:, <:, >:, ==?
-
--- | proof operators with optional proof terms
-infixl 3 ==., <=., <., >., >=., =*=.
-
--- provide the proof terms after ?
-infixl 3 ?
-infixl 3 ∵
-
-infixl 2 ***
-
-
-type Proof = ()
-
-
-byTheorem :: a -> Proof -> a
-byTheorem a _ = a
-
-(?) :: (Proof -> a) -> Proof -> a
-f ? y = f y
-
-(∵) :: (Proof -> a) -> Proof -> a
-f ∵ y = f y
-
-
-
-data QED = QED
-
-
-todo :: a
-{-@ assume todo :: {v:a | false} @-}
-todo = undefined
-
-(***) :: a -> QED -> Proof
-_ *** _ = ()
-
-{-@ measure proofBool :: Proof -> Bool @-}
-
--- | Proof combinators (are Proofean combinators)
-{-@ (==>) :: p:Proof
-          -> q:Proof
-          -> {v:Proof |
-          ((Prop (proofBool p)) && (Prop (proofBool p) => Prop (proofBool q)))
-          =>
-          ((Prop (proofBool p) && Prop (proofBool q)))
-          } @-}
-(==>) :: Proof -> Proof -> Proof
-p ==> q = ()
-
-
-{-@ (&&&) :: p:{Proof | Prop (proofBool p) }
-          -> q:{Proof | Prop (proofBool q) }
-          -> {v:Proof | Prop (proofBool p) && Prop (proofBool q) } @-}
-(&&&) :: Proof -> Proof -> Proof
-p &&& q = ()
-
-
--- | proof goes from Int to resolve types for the optional proof combinators
-proof :: Int -> Proof
-proof _ = ()
-
-toProof :: a -> Proof
-toProof _ = ()
-
-simpleProof :: Proof
-simpleProof = ()
-
--- | Comparison operators requiring proof terms
-
-(<=:) :: a -> a -> Proof -> a
-{-@ (<=:) :: x:a -> y:a -> {v:Proof | x <= y } -> {v:a | v == x } @-}
-(<=:) x y _ = x
-
-(<:) :: a -> a -> Proof -> a
-{-@ (<:) :: x:a -> y:a -> {v:Proof | x < y } -> {v:a | v == x } @-}
-(<:) x y _ = x
-
-
-(>:) :: a -> a -> Proof -> a
-{-@ (>:) :: x:a -> y:a -> {v:Proof | x >y } -> {v:a | v == x } @-}
-(>:) x _ _ = x
-
-
-(==:) :: a -> a -> Proof -> a
-{-@ (==:) :: x:a -> y:a -> {v:Proof| x == y} -> {v:a | v == x && v == y } @-}
-(==:) x _ _ = x
-
-
-
--- | Comparison operators requiring proof terms optionally
-
-
--- | ToProve is undefined and is only used to assume some equalities in
--- | the proof proccess. It is a cut, a la Coq
-
-class ToProve a r where
-  (==?) :: a -> a -> r
-
-
-instance (a~b) => ToProve a b where
-{-@ instance ToProve a b where
-  ==? :: x:a -> y:a -> {v:b | v ~~ x }
-  @-}
-  (==?)  = undefined
-
-instance (a~b) => ToProve a (Proof -> b) where
-{-@ instance ToProve a (Proof -> b) where
-  ==? :: x:a -> y:a -> Proof -> {v:b | v ~~ x  }
-  @-}
-  (==?) = undefined
-
-
-class OptEq a r where
-  (==.) :: a -> a -> r
-
-instance (a~b) => OptEq a (Proof -> b) where
-{-@ instance OptEq a (Proof -> b) where
-  ==. :: x:a -> y:a -> {v:Proof | x == y} -> {v:b | v ~~ x && v ~~ y}
-  @-}
-  (==.) x _ _ = x
-
-instance (a~b) => OptEq a b where
-{-@ instance OptEq a b where
-  ==. :: x:a -> y:{a| x == y} -> {v:b | v ~~ x && v ~~ y }
-  @-}
-  (==.) x _ = x
-
-
-class OptLEq a r where
-  (<=.) :: a -> a -> r
-
-
-instance (a~b) => OptLEq a (Proof -> b) where
-{-@ instance OptLEq a (Proof -> b) where
-  <=. :: x:a -> y:a -> {v:Proof | x <= y} -> {v:b | v ~~ x }
-  @-}
-  (<=.) x _ _ = x
-
-instance (a~b) => OptLEq a b where
-{-@ instance OptLEq a b where
-  <=. :: x:a -> y:{a | x <= y} -> {v:b | v ~~ x }
-  @-}
-  (<=.) x _ = x
-
-class OptGEq a r where
-  (>=.) :: a -> a -> r
-
-instance OptGEq a (Proof -> a) where
-{-@ instance OptGEq a (Proof -> a) where
-  >=. :: x:a -> y:a -> {v:Proof| x >= y} -> {v:a | v == x }
-  @-}
-  (>=.) x _ _ = x
-
-instance OptGEq a a where
-{-@ instance OptGEq a a where
-  >=. :: x:a -> y:{a| x >= y} -> {v:a | v == x  }
-  @-}
-  (>=.) x _ = x
-
-
-class OptLess a r where
-  (<.) :: a -> a -> r
-
-instance (a~b) => OptLess a (Proof -> b) where
-{-@ instance OptLess a (Proof -> b) where
-  <. :: x:a -> y:a -> {v:Proof | x < y} -> {v:b | v ~~ x  }
-  @-}
-  (<.) x _ _ = x
-
-instance (a~b) => OptLess a b where
-{-@ instance OptLess a b where
-  <. :: x:a -> y:{a| x < y} -> {v:b | v ~~ x  }
-  @-}
-  (<.) x _ = x
-
-
-class OptGt a r where
-  (>.) :: a -> a -> r
-
-instance (a~b) => OptGt a (Proof -> b) where
-{-@ instance OptGt a (Proof -> b) where
-  >. :: x:a -> y:a -> {v:Proof| x > y} -> {v:b | v ~~ x }
-  @-}
-  (>.) x _ _ = x
-
-instance (a~b) => OptGt a b where
-{-@ instance OptGt a b where
-  >. :: x:a -> y:{a| x > y} -> {v:b | v ~~ x  }
-  @-}
-  (>.) x y = x
-
-
-
--- | Function Equality
-
-{- TO REFINE
-class FunEq a b r where
-  (=*=.) :: (a -> b) -> (a -> b) -> r
-
-instance (c~(a -> b)) => FunEq a b ((a -> Proof) -> c) where
-  {-@ instance FunEq a b ((a -> Proof) -> a -> b) where
-   =*=. :: f:(a -> b) -> g:(a -> b) -> (r:a -> {f r == g r}) -> {v:_ | f == g && v ~~ f && v ~~ g}
-   @-}
-   f =*=. g = undefined
--}
-
-class Arg a where
-
-
-{-@ assume (=*=.) :: Arg a => f:(a -> b) -> g:(a -> b) -> (r:a -> {f r == g r}) -> {v:(a -> b) | f == g} @-}
-(=*=.) :: Arg a => (a -> b) -> (a -> b) -> (a -> Proof) -> (a -> b)
-(=*=.) f g p = f
diff --git a/tests/strings/pos/String.hs b/tests/strings/pos/String.hs
deleted file mode 100644
--- a/tests/strings/pos/String.hs
+++ /dev/null
@@ -1,139 +0,0 @@
-{-# LANGUAGE OverloadedStrings   #-}
-
-{-@ LIQUID "--higherorder"         @-}
-{-@ LIQUID "--totality"            @-}
-{-@ LIQUID "--exactdc"             @-}
-
-module String where
-
-import qualified Data.ByteString as BS
-import qualified Data.String     as ST
-import Language.Haskell.Liquid.ProofCombinators 
-
-
-{-@ embed SMTString as Str @-}
-
-data SMTString = S BS.ByteString 
-  deriving (Eq, Show)
-
-------------------------------------------------------------------------------
----------------  SMTString Interface in Logic --------------------------------
-------------------------------------------------------------------------------
-
-
-{-@ invariant {s:SMTString | 0 <= stringLen s } @-}
-
-{-@ measure stringEmp    :: SMTString @-}
-{-@ measure stringLen    :: SMTString -> Int @-}
-{-@ measure subString    :: SMTString -> Int -> Int -> SMTString @-}
-{-@ measure concatString :: SMTString -> SMTString -> SMTString @-}
-{-@ measure fromString   :: String -> SMTString @-}
-{-@ measure takeString   :: Int -> SMTString -> SMTString @-}
-{-@ measure dropString   :: Int -> SMTString -> SMTString @-}
-
-------------------------------------------------------------------------------
----------------  SMTString operators -----------------------------------------
-------------------------------------------------------------------------------
-
-{-@ assume concatString :: x:SMTString -> y:SMTString 
-                 -> {v:SMTString | v == concatString x y && stringLen v == stringLen x + stringLen y } @-}
-concatString :: SMTString -> SMTString -> SMTString
-concatString (S s1) (S s2) = S (s1 `BS.append` s2)
-
-{-@ assume stringEmp :: {v:SMTString | v == stringEmp  && stringLen v == 0 } @-}
-stringEmp :: SMTString
-stringEmp = S (BS.empty)
-
-stringLen :: SMTString -> Int  
-{-@ assume stringLen :: x:SMTString -> {v:Nat | v == stringLen x} @-}
-stringLen (S s) = BS.length s 
-
-{-@ assume subString  :: s:SMTString -> offset:Int -> ln:Int -> {v:SMTString | v == subString s offset ln } @-}
-subString :: SMTString -> Int -> Int -> SMTString 
-subString (S s) o l = S (BS.take l $ BS.drop o s) 
-
-{-@ assume takeString :: i:Nat -> xs:{SMTString | i <= stringLen xs } -> {v:SMTString | stringLen v == i && v == takeString i xs } @-} 
-takeString :: Int -> SMTString -> SMTString
-takeString i (S s) = S (BS.take i s)
-
-{-@ assume dropString :: i:Nat -> xs:{SMTString | i <= stringLen xs } -> {v:SMTString | stringLen v == stringLen xs - i && v == dropString i xs } @-} 
-dropString :: Int -> SMTString -> SMTString
-dropString i (S s) = S (BS.drop i s)
-
-{-@ assume fromString :: i:String -> {o:SMTString | i == o && o == fromString i} @-}
-fromString :: String -> SMTString
-fromString = S . ST.fromString 
-
-{-@ assume isNullString :: i:SMTString -> {b:Bool | Prop b <=> stringLen i == 0 } @-} 
-isNullString :: SMTString -> Bool 
-isNullString (S s) = BS.length s == 0 
-
-------------------------------------------------------------------------------
----------------  Properties assumed for SMTStrings ---------------------------
-------------------------------------------------------------------------------
-
--- | Empty Strings 
-
-{-@ assume stringEmpProp :: x:SMTString  -> { stringLen x == 0 <=> x == stringEmp } @-}
-stringEmpProp :: SMTString -> Proof
-stringEmpProp _ = trivial 
- 
-concatStringNeutralLeft :: SMTString -> Proof
-{-@ assume concatStringNeutralLeft :: x:SMTString -> {concatString x stringEmp == x} @-}
-concatStringNeutralLeft _ = trivial
-
-concatStringNeutralRight :: SMTString -> Proof
-{-@ assume concatStringNeutralRight :: x:SMTString -> {concatString stringEmp x == x} @-}
-concatStringNeutralRight _ = trivial
-
-{-@ concatEmpLeft :: xi:{SMTString | stringLen xi == 0} -> yi:SMTString -> {concatString xi yi == yi} @-}
-concatEmpLeft :: SMTString -> SMTString -> Proof
-concatEmpLeft xi yi 
-  =   concatString xi yi 
-  ==. concatString stringEmp yi ? stringEmpProp xi 
-  ==. yi                        ? concatStringNeutralRight yi
-  *** QED 
-
-
-{-@ concatEmpRight :: xi:SMTString -> yi:{SMTString | stringLen yi == 0} -> {concatString xi yi == xi} @-}
-concatEmpRight :: SMTString -> SMTString -> Proof
-concatEmpRight xi yi 
-  =   concatString xi yi 
-  ==. concatString xi stringEmp ? stringEmpProp yi 
-  ==. xi                        ? concatStringNeutralLeft xi 
-  *** QED 
-
--- | Concat
-
-{-@ assume concatTakeDrop :: i:Nat -> xs:{SMTString | i <= stringLen xs} 
-    -> {xs == concatString (takeString i xs) (dropString i xs) }  @-}
-concatTakeDrop :: Int -> SMTString -> Proof 
-concatTakeDrop _ _ = trivial
-
-concatLen :: SMTString -> SMTString -> Proof
-{-@ assume concatLen :: x:SMTString -> y:SMTString -> { stringLen (concatString x y) == stringLen x + stringLen y } @-}
-concatLen _ _ = trivial
-
-concatStringAssoc :: SMTString -> SMTString -> SMTString -> Proof
-{-@ assume concatStringAssoc :: x:SMTString -> y:SMTString -> z:SMTString 
-     -> {concatString (concatString x y) z == concatString x (concatString y z) } @-}
-concatStringAssoc _ _ _ = trivial
-
-
--- | Substrings 
-
-{-@ assume subStringConcatBack :: input:SMTString -> input':SMTString -> j:Int -> i:{Int | i + j <= stringLen input }
-  -> { (subString input i j == subString (concatString input input') i j) 
-    && (stringLen input <= stringLen (concatString input input'))
-     } @-}
-subStringConcatBack :: SMTString -> SMTString -> Int -> Int -> Proof 
-subStringConcatBack _ _ _ _ = trivial  
-
-
-{-@ assume subStringConcatFront  
-  :: input:SMTString -> input':SMTString -> j:Int -> i:Int 
-  -> { (subString input i j == subString (concatString input' input) (stringLen input' + i) j)
-      && (stringLen (concatString input' input) == stringLen input + stringLen input')
-    } @-}
-subStringConcatFront :: SMTString -> SMTString -> Int -> Int -> Proof
-subStringConcatFront _ _ _ _ = trivial
diff --git a/tests/strings/pos/StringIndexing.hs b/tests/strings/pos/StringIndexing.hs
deleted file mode 100644
--- a/tests/strings/pos/StringIndexing.hs
+++ /dev/null
@@ -1,2266 +0,0 @@
-{-# LANGUAGE KindSignatures      #-}
-{-# LANGUAGE DataKinds           #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE GADTs               #-}
-
-
-{-@ LIQUID "--cores=10"            @-}
-{-@ LIQUID "--higherorder"         @-}
-{-@ LIQUID "--totality"            @-}
-{-@ LIQUID "--exactdc"             @-}
-
-module Main where
-
-import Prelude hiding ( mempty, mappend, id, mconcat, map
-                      , take, drop  
-                      , error, undefined
-                      )
-
-
-import System.Environment   
-import Data.String hiding (fromString)
-import GHC.TypeLits
-import Data.Maybe 
-
-import String
-import Language.Haskell.Liquid.ProofCombinators 
-
-import Data.Proxy 
-
-{-@ symbolVal :: forall n proxy. KnownSymbol n => x:proxy n 
-  -> {v:String | v == n && v == symbolVal x } @-}
-{-@ measure symbolVal :: p n -> String @-}
-
--------------------------------------------------------------------------------
------------- | String Matching Main Theorem  ----------------------------------
--------------------------------------------------------------------------------
-
-{-@ distributionOfStringMatching :: MI target -> is:SMTString  -> n:Int -> m:Int
-   -> {toMI is == pmconcat m (map toMI (chunkString n is))} @-}
-
-distributionOfStringMatching :: forall (target :: Symbol). (KnownSymbol target) => MI target -> SMTString -> Int -> Int -> Proof
-distributionOfStringMatching _ is n m  
-  =   (pmconcat m (map toMI (chunkString n is)) :: MI target)
-  ==. mconcat (map toMI (chunkString n is))
-       ? pmconcatEquivalence m (map toMI (chunkString n is) :: List (MI target))
-  ==. toMI is 
-       ? distributionOfMI (mempty :: MI target) is n 
-  *** QED 
-
-
--------------------------------------------------------------------------------
------------- | Interface ------------------------------------------------------
--------------------------------------------------------------------------------
-
-main :: IO ()
-main = 
-  do args      <- getArgs
-     case args of 
-       (i:fname:target:_) -> do input <- fromString <$> readFile fname 
-                                runMatching (read i :: Int) input target
-       _                -> putStrLn $ "Wrong input: You need to provide the chunksize," ++
-                                      "the input filename and the target string. For example:\n\n\n" ++ 
-                                      "./StringIndexing 10 input.txt abcab\n\n"
-     
-
-runMatching :: Int -> SMTString -> String -> IO ()
-runMatching chunksize input tg =
-  case someSymbolVal tg of 
-    SomeSymbol (_ :: Proxy target) -> do            
-      let mi1    = toMI input :: MI target 
-      let is1    = indicesMI mi1 
-      putStrLn   $ "Serial   Indices: " ++ show is1
-      let mi2    = toMIPar chunksize input :: MI target 
-      let is2    = indicesMI mi2 
-      putStrLn   $ "Parallel Indices: " ++ show is2
-      putStrLn   $ "Are equal? " ++ show (is1 == is2)
-
-test = indicesMI (toMI (fromString $ clone 100 "ababcabcab")  :: MI "abcab" )
-  where
-    clone i xs = concat (replicate i xs) 
-
-
-
-{-@ reflect toMI @-}
-toMI :: forall (target :: Symbol). (KnownSymbol target) => SMTString -> MI target 
-toMI input  
-  | stringLen input == 0 
-  = mempty
-  | otherwise          
-  = MI input (makeIndices input (fromString (symbolVal (Proxy :: Proxy target))) 0 (stringLen input - 1))
-
-toMIPar :: forall (target :: Symbol). (KnownSymbol target) => Int -> SMTString -> MI target  
-toMIPar chunksize input 
-  = pmconcat chunksize (map toMI (chunkString chunksize input))
-
--------------------------------------------------------------------------------
-----------  Indexing Structure Definition -------------------------------------
--------------------------------------------------------------------------------
-
-data MI (target :: Symbol) where 
-  MI :: SMTString       -- | input string
-     -> (List Int)      -- | valid indices of target in input
-     -> MI target
-  deriving (Show)
-
-{-@ data MI target 
-  = MI { input   :: SMTString
-       , indices :: List (GoodIndex input target)
-       } @-}
-
-{-@ type GoodIndex Input Target 
-  = {i:Int | IsGoodIndex Input Target i }
-  @-}
-
-{-@ type GoodIndexTwo Input X Target 
-  = {i:Int | (IsGoodIndex Input Target i)  && (IsGoodIndex (concatString Input X) Target i) }
-  @-}
-
-
-{-@ predicate IsGoodIndex Input Target I
-  =  (subString Input I (stringLen Target)  == Target)
-  && (I + stringLen Target <= stringLen Input)
-  && (0 <= I)
-  @-}
-
-{-@ measure indicesMI @-}
-indicesMI (MI _ is) = is 
-
-{-@ measure inputMI @-}
-inputMI (MI i _) = i 
-
--------------------------------------------------------------------------------
-----------  Monoid Operators on MI --------------------------------------------
--------------------------------------------------------------------------------
-
-{-@ reflect mempty @-}
-mempty :: forall (target :: Symbol). (KnownSymbol target) =>  MI target
-mempty = MI stringEmp N
-
-{-@ reflect mconcat @-}
-mconcat :: forall (target :: Symbol). (KnownSymbol target) => List (MI target) -> MI target 
-mconcat N        = mempty
-mconcat (C x xs) = mappend x (mconcat xs)
-
-{-@ reflect pmconcat @-}
-pmconcat :: forall (target :: Symbol). (KnownSymbol target) => Int -> List (MI target) -> MI target 
-{-@ pmconcat :: forall (target :: Symbol). (KnownSymbol target) => 
-  Int -> is:List (MI target) -> MI target /[llen is] @-}
-
-pmconcat i xs
-  | i <= 1 
-  = mconcat xs 
-pmconcat i N   
-  = mempty
-pmconcat i (C x N) 
-  = x
-pmconcat i xs 
-  = pmconcat i (map mconcat (chunk i xs))
-
-
-
-{-@ reflect mappend @-}
-mappend :: forall (target :: Symbol).  (KnownSymbol target) => MI target -> MI target -> MI target
-mappend (MI i1 is1) (MI i2 is2)
-  = MI (concatString i1 i2)
-       ((castGoodIndexRightList (fromString (symbolVal (Proxy :: Proxy target))) i1 i2 is1
-          `append`
-        makeNewIndices i1 i2 (fromString (symbolVal (Proxy :: Proxy target)))
-       ) `append`
-       (map (shiftStringRight (fromString (symbolVal (Proxy :: Proxy target))) i1 i2) is2)) 
-
--- | Helpers 
-{-@ reflect shiftStringRight @-}
-shiftStringRight :: SMTString -> SMTString -> SMTString -> Int -> Int 
-{-@ shiftStringRight :: target:SMTString -> left:SMTString -> right:SMTString -> i:GoodIndex right target 
-  -> {v:(GoodIndex {concatString left right} target) | v == i + stringLen left } @-}
-shiftStringRight target left right i 
-  = cast (subStringConcatFront right left (stringLen target) i) (shift (stringLen left) i)
-
-{-@ reflect makeNewIndices @-}
-{-@ makeNewIndices :: s1:SMTString -> s2:SMTString -> target:SMTString -> List (GoodIndex {concatString s1 s2} target) @-}
-makeNewIndices :: SMTString -> SMTString -> SMTString -> List Int 
-makeNewIndices s1 s2 target
-  | stringLen target < 2 
-  = N
-  | otherwise
-  = makeIndices (concatString s1 s2) target
-                (maxInt (stringLen s1 - (stringLen target-1)) 0)
-                (stringLen s1 - 1)
-
-{-@ reflect maxInt @-}
-maxInt :: Int -> Int -> Int 
-maxInt x y = if x <= y then y else x 
-
-{-@ reflect shift @-}
-shift :: Int -> Int -> Int 
-shift x y = x + y 
-
--- | Casting good indices: the below operators are liquid casts and behave like id at runtime
-
--- NV: The recursion is required as there is no other way to (access &) cast _each_ element of the input list
-{-@ reflect castGoodIndexRightList @-}
-castGoodIndexRightList :: SMTString -> SMTString -> SMTString -> List Int -> List Int    
-{-@ castGoodIndexRightList :: target:SMTString -> input:SMTString -> x:SMTString -> is:List (GoodIndex input target) 
-    -> {v:List (GoodIndexTwo input x target) | v == is} @-}
-castGoodIndexRightList target input x N 
-  = N 
-castGoodIndexRightList target input x (C i is) 
-  = C (castGoodIndexRight target input x i) (castGoodIndexRightList target input x is)  
-
-
-{-@ reflect castGoodIndexRight @-}
-castGoodIndexRight :: SMTString -> SMTString -> SMTString -> Int -> Int  
-{-@ castGoodIndexRight :: target:SMTString -> input:SMTString -> x:SMTString -> i:GoodIndex input target 
-   -> {v:(GoodIndexTwo input x target)| v == i} @-}
-castGoodIndexRight target input x i  = cast (subStringConcatBack input x (stringLen target) i) i
-
-
--------------------------------------------------------------------------------
-----------  Indices' Generation -----------------------------------------------
--------------------------------------------------------------------------------
-
-{-@ reflect makeIndices @-}
-makeIndices :: SMTString -> SMTString -> Int -> Int -> List Int 
-{-@ makeIndices :: input:SMTString -> target:SMTString -> lo:Nat -> hi:Int -> List (GoodIndex input target) 
-  / [hi - lo] @-}
-makeIndices input target lo hi 
-  | hi < lo 
-  = N
-  | lo == hi, isGoodIndex input target lo
-  = lo `C` N
-  | lo == hi 
-  = N
-makeIndices input target lo hi 
-  | isGoodIndex input target lo
-  = lo `C` (makeIndices input target (lo + 1) hi)
-  | otherwise 
-  =    makeIndices input target (lo + 1) hi 
-
-{-@ reflect isGoodIndex @-}
-isGoodIndex :: SMTString -> SMTString -> Int -> Bool 
-{-@ isGoodIndex :: input:SMTString -> target:SMTString -> i:Int 
-  -> {b:Bool | Prop b <=> IsGoodIndex input target i} @-}
-isGoodIndex input target i 
-  =  subString input i (stringLen target)  == target  
-  && i + stringLen target <= stringLen input
-  && 0 <= i    
-
-
--------------------------------------------------------------------------------
-----------  List Structure ----------------------------------------------------
--------------------------------------------------------------------------------
-   
-data List a = N | C a (List a) deriving (Show, Eq)
-{-@ data List [llen] a 
-  = N | C {lhead :: a , ltail :: List a} @-}
-
-
-{-@ measure llen @-}
-{-@ llen :: List a -> Nat @-} 
-llen :: List a -> Int 
-llen N        = 0 
-llen (C _ xs) = 1 + llen xs 
-
-{-@ reflect map @-}
-{-@ map :: (a -> b) -> is:List a -> {os:List b | llen is == llen os} @-}
-map :: (a -> b) -> List a -> List b
-map _ N        = N
-map f (C x xs) = C (f x) (map f xs)
-
-{-@ reflect append @-}
-append :: List a -> List a -> List a 
-append N        ys = ys 
-append (C x xs) ys = x `C` (append xs ys)
-
-
-{-@ reflect chunk @-}
-{-@ chunk :: i:Int -> xs:List a -> {v:List (List a) | if (i <= 1 || llen xs <= i) then (llen v == 1) else (llen v < llen xs) } / [llen xs] @-}
-chunk :: Int -> List a -> List (List a)
-chunk i xs 
-  | i <= 1
-  = C xs N 
-  | llen xs <= i 
-  = C xs N 
-  | otherwise
-  = C (take i xs) (chunk i (drop i xs))
-
-{-@ reflect drop @-}
-{-@ drop :: i:Nat -> xs:{List a | i <= llen xs } -> {v:List a | llen v == llen xs - i } @-} 
-drop :: Int -> List a -> List a 
-drop i N = N 
-drop i (C x xs)
-  | i == 0 
-  = C x xs  
-  | otherwise 
-  = drop (i-1) xs 
-
-{-@ reflect take @-}
-{-@ take :: i:Nat -> xs:{List a | i <= llen xs } -> {v:List a | llen v == i} @-} 
-take :: Int -> List a -> List a 
-take i N = N 
-take i (C x xs)
-  | i == 0 
-  = N  
-  | otherwise 
-  = C x (take (i-1) xs)
-
-
--------------------------------------------------------------------------------
-----------  String Chunking ---------------------------------------------------
--------------------------------------------------------------------------------
-
-{-@ reflect chunkString @-}
-{-@ chunkString :: Int -> xs:SMTString -> List (SMTString) / [stringLen xs] @-}
-chunkString :: Int -> SMTString -> List (SMTString)
-chunkString i xs 
-  | i <= 1
-  = C xs N 
-  | stringLen xs <= i 
-  = C xs N 
-  | otherwise
-  = C (takeString i xs) (chunkString i (dropString i xs))
-
-
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------- Liquid Proofs Start HERE -----------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-
-
--------------------------------------------------------------------------------
-----------  Proof that toMI distributes ---------------------------------------
--------------------------------------------------------------------------------
-
-{-@ distributionOfMI :: MI target -> is:SMTString -> n:Int -> {toMI is == mconcat (map toMI (chunkString n is))} @-}
-
-distributionOfMI :: forall (target :: Symbol). (KnownSymbol target) => MI target -> SMTString -> Int -> Proof
-distributionOfMI _ is n = distributeInput (toMI :: SMTString -> MI target) (distributestoMI (mempty :: MI target)) is n 
-
-
-{-@ distributeInput
-     :: f:(SMTString -> MI target)
-     -> thm:(x1:SMTString -> x2:SMTString -> {f (concatString x1 x2) == mappend (f x1) (f x2)} )
-     -> is:SMTString
-     -> n:Int 
-     -> {f is == mconcat (map f (chunkString n is))}
-     / [stringLen is] 
-  @-}
-
-distributeInput :: forall (target :: Symbol). (KnownSymbol target) 
-  => (SMTString -> MI target)
-  -> (SMTString -> SMTString -> Proof)
-  -> SMTString -> Int -> Proof
-distributeInput f thm is n  
-  | stringLen is <= n || n <= 1
-  =   mconcat (map f (chunkString n is))
-  ==. mconcat (map f (C is N))
-  ==. mconcat (f is `C` map f N)
-  ==. mconcat (f is `C` N)
-  ==. mappend (f is) (mconcat N)
-  ==. mappend (f is) (mempty :: MI target)
-  ==. f is ? mempty_left (f is)
-  *** QED 
-  | otherwise
-  =   mconcat (map f (chunkString n is))
-  ==. mconcat (map f (C (takeString n is) (chunkString n (dropString n is)))) 
-  ==. mconcat (f (takeString n is) `C` map f (chunkString n (dropString n is)))
-  ==. mappend (f (takeString n is)) (mconcat (map f (chunkString n (dropString n is))))
-  ==. mappend (f (takeString n is)) (f (dropString n is))
-       ? distributeInput f thm (dropString n is) n  
-  ==. f (concatString (takeString n is) (dropString n is))
-       ? thm (takeString n is) (dropString n is)
-  ==. f is 
-       ? concatTakeDrop n is 
-  *** QED 
-
-
-
-distributestoMI :: forall (target :: Symbol). (KnownSymbol target) => MI target -> SMTString -> SMTString -> Proof 
-{-@ distributestoMI :: MI target -> x1:SMTString -> x2:SMTString -> {toMI (concatString x1 x2) == mappend (toMI x1) (toMI x2)} @-} 
-distributestoMI _ x1 x2
-  | stringLen x1 == 0, stringLen x2 == 0 
-  =   mappend (toMI x1) (toMI x2)
-  ==. mappend (mempty :: MI target) (mempty :: MI target)
-       ? mempty_left (mempty :: MI target) 
-  ==. (mempty :: MI target)
-  ==. toMI (concatString x1 x2)
-  *** QED 
-
-distributestoMI _ x1 x2
-  | stringLen x1 == 0 
-  =   mappend (toMI x1) (toMI x2)
-  ==. mappend (mempty :: MI target) (toMI x2 :: MI target)
-  ==. toMI x2 
-      ? mempty_right (toMI x2 :: MI target)
-  ==. toMI (concatString x1 x2)
-      ? concatEmpLeft x1 x2 
-  *** QED 
-
-distributestoMI _ x1 x2
-  | stringLen x2 == 0 
-  =   mappend (toMI x1) (toMI x2)
-  ==. mappend (toMI x1) (mempty :: MI target)
-  ==. (toMI x1 :: MI target)
-      ? mempty_left (toMI x1 :: MI target)
-  ==. toMI (concatString x1 x2)
-      ? concatEmpRight x1 x2 
-  *** QED 
-
-distributestoMI _ x1 x2 
-  | stringLen (fromString (symbolVal (Proxy :: Proxy target))) < 2 
-  =   let tg = (fromString (symbolVal (Proxy :: Proxy target))) in 
-      mappend (toMI x1 :: MI target) (toMI x2 :: MI target)  
-  ==. mappend (MI x1 (makeIndices x1 tg 0 (stringLen x1 - 1)))
-              (MI x2 (makeIndices x2 tg 0 (stringLen x2 - 1)))
-  ==. MI (concatString x1 x2)
-         ((castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-          `append`
-           makeNewIndices x1 x2 tg
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         ((castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-          `append`
-           N
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         (castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-           `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-      ? appendNil (castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1)))
-  ==. MI (concatString x1 x2)
-         (castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-           `append`
-          (makeIndices (concatString x1 x2) tg (stringLen x1) (stringLen x1 + stringLen x2 -1))) 
-      ? shiftIndexesRight' 0 (stringLen x2 - 1) x1 x2 tg 
-  ==. MI (concatString x1 x2)
-         ( (makeIndices (concatString x1 x2) tg 0 (stringLen x1 - 1))
-           `append`
-          (makeIndices (concatString x1 x2) tg (stringLen x1) (stringLen x1 + stringLen x2 -1))) 
-      ? (concatmakeNewIndices 0 (stringLen x1 -1) tg x1 x2) 
-  ==. MI (concatString x1 x2)
-         (makeIndices (concatString x1 x2) tg 0 (stringLen x1 - 1)
-           `append`
-          makeIndices (concatString x1 x2) tg (stringLen x1) (stringLen x1 + stringLen x2 -1)) 
-  ==. MI (concatString x1 x2)
-         (makeIndices (concatString x1 x2) tg 0 (stringLen x1 - 1)
-           `append`
-          makeIndices (concatString x1 x2) tg (stringLen x1) (stringLen (concatString x1 x2) -1)) 
-  ==. MI (concatString x1 x2) 
-         (makeIndices (concatString x1 x2) tg 0 (stringLen (concatString x1 x2) - 1))
-      ? mergeIndices (concatString x1 x2) tg 0 (stringLen x1 -1) (stringLen (concatString x1 x2) - 1) 
-  ==. toMI (concatString x1 x2)
-  *** QED 
-
-distributestoMI _ x1 x2
-  | 0 <= stringLen x1 - stringLen (fromString (symbolVal (Proxy :: Proxy target))) 
-  =   let tg = (fromString (symbolVal (Proxy :: Proxy target))) in 
-      mappend (toMI x1 :: MI target) (toMI x2:: MI target)  
-  ==. mappend (MI x1 (makeIndices x1 tg 0 (stringLen x1 - 1)))
-              (MI x2 (makeIndices x2 tg 0 (stringLen x2 - 1)))
-  ==. MI (concatString x1 x2)
-         ((castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-          `append`
-           makeNewIndices x1 x2 tg
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         ((castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-          `append`
-           makeIndices (concatString x1 x2) tg (maxInt (stringLen x1 - stringLen tg +1) 0) (stringLen x1 -1)
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         ((castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-          `append`
-           makeIndices (concatString x1 x2) tg (stringLen x1 - stringLen tg +1) (stringLen x1 -1)
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         ((makeIndices (concatString x1 x2) tg 0 (stringLen x1 - stringLen tg)
-          `append`
-           makeIndices (concatString x1 x2) tg (stringLen x1 - stringLen tg +1) (stringLen x1 -1)
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-         ? catIndices x1 x2 tg 0 (stringLen x1 -1 ) -- HERE HERE requires stringLen tg <= stringLen x1
-  ==. MI (concatString x1 x2)
-         ((makeIndices (concatString x1 x2) tg 0 (stringLen x1 - stringLen tg)
-          `append`
-           makeIndices (concatString x1 x2) tg (stringLen x1 - stringLen tg +1) (stringLen x1 -1)
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         (makeIndices (concatString x1 x2) tg 0 (stringLen x1 -1)
-         `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-          ? mergeIndices (concatString x1 x2) tg 0 (stringLen x1 -stringLen tg) (stringLen x1-1)
-  ==. MI (concatString x1 x2)
-         (makeIndices (concatString x1 x2) tg 0 (stringLen x1 -1)
-         `append`
-          makeIndices (concatString x1 x2) tg (stringLen x1) (stringLen x1 + stringLen x2 - 1))
-          ? shiftIndexesRight' 0 (stringLen x2 -1) x1 x2 tg 
-  ==. MI (concatString x1 x2)
-         (makeIndices (concatString x1 x2) tg 0 (stringLen x1 -1)
-         `append`
-          makeIndices (concatString x1 x2) tg (stringLen x1) (stringLen (concatString x1 x2) - 1))
-  ==. MI (concatString x1 x2) 
-         (makeIndices (concatString x1 x2) tg 0 (stringLen (concatString x1 x2) - 1))
-          ? mergeIndices (concatString x1 x2) tg 0 (stringLen x1- 1) (stringLen (concatString x1 x2) - 1)
-  ==. toMI (concatString x1 x2)
-  *** QED 
-distributestoMI _ x1 x2
-  | stringLen x1 - stringLen (fromString (symbolVal (Proxy :: Proxy target))) < 0 
-  =   let tg = (fromString (symbolVal (Proxy :: Proxy target))) in 
-      mappend (toMI x1 :: MI target) (toMI x2:: MI target)  
-  ==. mappend (MI x1 (makeIndices x1 tg 0 (stringLen x1 - 1)))
-              (MI x2 (makeIndices x2 tg 0 (stringLen x2 - 1)))
-  ==. MI (concatString x1 x2)
-         ((castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-          `append`
-           makeNewIndices x1 x2 tg
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         ((castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-          `append`
-           makeIndices (concatString x1 x2) tg (maxInt (stringLen x1 - stringLen tg +1) 0) (stringLen x1 -1)
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         ((castGoodIndexRightList tg x1 x2 (makeIndices x1 tg 0 (stringLen x1 - 1))
-          `append`
-           makeIndices (concatString x1 x2) tg 0 (stringLen x1 -1)
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-          
-  ==. MI (concatString x1 x2)
-         ((N
-          `append`
-           makeIndices (concatString x1 x2) tg 0 (stringLen x1 -1)
-          ) `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-         ? makeNewIndicesNullSmallInput x1 tg 0 (stringLen x1 - 1)  
-  ==. MI (concatString x1 x2)
-         (makeIndices (concatString x1 x2) tg 0 (stringLen x1 -1)
-           `append`
-          (map (shiftStringRight tg x1 x2) (makeIndices x2 tg 0 (stringLen x2 - 1)))) 
-  ==. MI (concatString x1 x2)
-         (makeIndices (concatString x1 x2) tg 0 (stringLen x1 -1)
-         `append`
-          makeIndices (concatString x1 x2) tg (stringLen x1) (stringLen x1 + stringLen x2 - 1))
-          ? shiftIndexesRight' 0 (stringLen x2 -1) x1 x2 tg 
-  ==. MI (concatString x1 x2)
-         (makeIndices (concatString x1 x2) tg 0 (stringLen x1 -1)
-         `append`
-          makeIndices (concatString x1 x2) tg (stringLen x1) (stringLen (concatString x1 x2) - 1))
-  ==. MI (concatString x1 x2) 
-         (makeIndices (concatString x1 x2) tg 0 (stringLen (concatString x1 x2) - 1))
-          ? mergeIndices (concatString x1 x2) tg 0 (stringLen x1- 1) (stringLen (concatString x1 x2) - 1)
-  ==. toMI (concatString x1 x2)
-  *** QED 
-
--------------------------------------------------------------------------------
-----------  Parallelization: pmconcat i is == mconcat is ----------------------
--------------------------------------------------------------------------------
-
-pmconcatEquivalence :: forall (target :: Symbol). (KnownSymbol target) => Int -> List (MI target) -> Proof
-{-@ pmconcatEquivalence :: i:Int -> is:List (MI target) -> {pmconcat i is == mconcat is} / [llen is] @-}
-pmconcatEquivalence i is 
-  | i <= 1
-  = pmconcat i is ==. mconcat is *** QED 
-pmconcatEquivalence i N 
-  =   pmconcat i N 
-  ==. (mempty :: MI target) 
-  ==. mconcat N 
-  *** QED 
-pmconcatEquivalence i (C x N) 
-  =   pmconcat i (C x N)
-  ==. x 
-  ==. mappend x mempty 
-      ? mempty_left x
-  ==. mappend x (mconcat N) 
-  ==. mconcat (C x N) 
-  *** QED 
-pmconcatEquivalence i xs 
-  | llen xs <= i 
-  =   pmconcat i xs 
-  ==. pmconcat i (map mconcat (chunk i xs))
-  ==. pmconcat i (map mconcat (C xs N))
-  ==. pmconcat i (mconcat xs `C`  map mconcat N)
-  ==. pmconcat i (mconcat xs `C`  N)
-  ==. mconcat xs
-  *** QED 
-pmconcatEquivalence i xs
-  =   pmconcat i xs 
-  ==. pmconcat i (map mconcat (chunk i xs))
-  ==. mconcat (map mconcat (chunk i xs))
-       ? pmconcatEquivalence i (map mconcat (chunk i xs))
-  ==. mconcat xs
-       ? mconcatAssoc i xs
-  *** QED 
-
--- | Monoid implications 
-
-mconcatAssocOne :: forall (target :: Symbol). (KnownSymbol target) => Int -> List (MI target) -> Proof 
-{-@ mconcatAssocOne :: i:Nat -> xs:{List (MI target) | i <= llen xs} 
-     -> {mconcat xs == mappend (mconcat (take i xs)) (mconcat (drop i xs))}
-     /[i]
-  @-} 
-mconcatAssocOne i N 
-  =   mappend (mconcat (take i N)) (mconcat (drop i N)) 
-  ==. mappend (mconcat N) (mconcat N)
-  ==. mappend (mempty :: MI target) (mempty :: MI target)
-  ==. (mempty :: MI target) 
-      ? mempty_left  (mempty :: MI target)
-  ==. mconcat N 
-  *** QED 
-
-mconcatAssocOne i (C x xs)
-  | i == 0
-  =   mappend (mconcat (take i (C x xs))) (mconcat (drop i (C x xs))) 
-  ==. mappend (mconcat N) (mconcat (C x xs))
-  ==. mappend mempty (mconcat (C x xs))
-  ==. mconcat (C x xs)
-      ? mempty_right (mconcat (C x xs))
-  *** QED 
-  | otherwise    
-  =   mappend (mconcat (take i (C x xs))) (mconcat (drop i (C x xs))) 
-  ==. mappend (mconcat (C x (take (i-1) xs))) (mconcat (drop (i-1) xs))
-  ==. mappend (mappend x (mconcat (take (i-1) xs))) (mconcat (drop (i-1) xs))
-       ? mappend_assoc x (mconcat (take (i-1) xs)) (mconcat (drop (i-1) xs))
-  ==. mappend x (mappend (mconcat (take (i-1) xs)) (mconcat (drop (i-1) xs)))
-       ? mconcatAssocOne (i-1) xs
-  ==. mappend x (mconcat xs)
-  ==. mconcat (C x xs)
-  *** QED 
-
--- Generalization to chunking  
-
-mconcatAssoc :: forall (target :: Symbol). (KnownSymbol target) => Int -> List (MI target) -> Proof 
-{-@ mconcatAssoc :: i:Int -> xs:List (MI target) 
-  -> { mconcat xs == mconcat (map mconcat (chunk i xs))}
-  /  [llen xs] @-}
-mconcatAssoc i xs  
-  | i <= 1 || llen xs <= i
-  =   mconcat (map mconcat (chunk i xs))
-  ==. mconcat (map mconcat (C xs N))
-  ==. mconcat (mconcat xs `C` map mconcat N)
-  ==. mconcat (mconcat xs `C` N)
-  ==. mappend (mconcat xs) (mconcat N)
-  ==. mappend (mconcat xs) (mempty :: MI target)
-  ==. mconcat xs 
-       ? mempty_left (mconcat xs)
-  *** QED  
-   | otherwise
-   =   mconcat (map mconcat (chunk i xs))
-   ==. mconcat (map mconcat (take i xs `C` chunk i (drop i xs)))
-   ==. mconcat (mconcat (take i xs) `C` map mconcat (chunk i (drop i xs)))
-   ==. mappend (mconcat (take i xs)) (mconcat (map mconcat (chunk i (drop i xs))))
-   ==. mappend (mconcat (take i xs)) (mconcat (drop i xs))
-        ? mconcatAssoc i (drop i xs)
-   ==. mconcat xs 
-        ? mconcatAssocOne i xs 
-   *** QED 
-
-
--------------------------------------------------------------------------------
-----------  Proof that MI is a Monoid -----------------------------------------
--------------------------------------------------------------------------------
-
-mempty_left :: forall (target :: Symbol). (KnownSymbol target) => MI target -> Proof
-{-@ mempty_left :: xs:MI target -> {mappend xs mempty == xs } @-}
-mempty_left (MI i1 is1) 
-  = let tg = fromString (symbolVal (Proxy :: Proxy target)) in 
-      mappend (MI i1 is1) (mempty :: MI target)
-  ==. mappend (MI i1 is1) (MI stringEmp N) 
-  ==. MI (concatString i1 stringEmp)
-         ((castGoodIndexRightList tg i1 stringEmp is1
-            `append`
-           makeNewIndices i1 stringEmp tg 
-         ) `append`
-         (map (shiftStringRight tg i1 stringEmp) N))
-      ? concatStringNeutralLeft i1 
-        -- NV ordering is important! 
-        -- concatString i1 stringEmp == i1 should come before application of MI
-  ==. MI i1
-         ((castGoodIndexRightList tg i1 stringEmp is1
-            `append`
-           makeNewIndices i1 stringEmp tg
-         ) `append`
-         (map (shiftStringRight tg i1 stringEmp) N))
-  ==. MI i1 ((is1 `append` N) `append` (map (shiftStringRight tg i1 stringEmp) N))
-      ? makeNewIndicesNullLeft i1 tg 
-  ==. MI i1 (is1 `append` map (shiftStringRight tg i1 stringEmp) N)
-      ? appendNil is1  
-  ==. MI i1 (is1 `append` N)
-      ? appendNil is1  
-  ==. MI i1 is1 
-  *** QED 
-
-mempty_right :: forall (target :: Symbol). (KnownSymbol target) => MI target -> Proof
-{-@ mempty_right :: xs:MI target -> {mappend mempty xs == xs } @-}
-mempty_right (MI i is)
-  =   let tg = (fromString (symbolVal (Proxy :: Proxy target))) in 
-      mappend (mempty :: MI target) (MI i is) 
-  ==. mappend (MI stringEmp N) (MI i is) 
-  ==. MI (concatString stringEmp i)
-       ((castGoodIndexRightList tg stringEmp i N
-          `append`
-        makeNewIndices stringEmp i tg 
-       ) `append`
-       (map (shiftStringRight tg stringEmp i) is)) 
-       ? concatStringNeutralRight i
-  ==. MI i
-        ((N`append` makeNewIndices stringEmp i tg
-        ) `append`
-        (map (shiftStringRight tg stringEmp i) is)) 
-  ==. MI i
-       (makeNewIndices stringEmp i tg
-        `append`
-       (map (shiftStringRight tg stringEmp i) is)) 
-  ==. MI i (N `append` (map (shiftStringRight tg stringEmp i) is)) 
-       ? makeNewIndicesNullRight i tg
-  ==. MI i (map (shiftStringRight tg stringEmp i) is)
-       ? mapShiftZero tg i is 
-  ==. MI i is 
-  *** QED 
-
-{-@ mappend_assoc :: x:MI target -> y:MI target -> z:MI target
-  -> { mappend x (mappend y z) = mappend (mappend x y) z}
-  @-}
-mappend_assoc 
-     :: forall (target :: Symbol). (KnownSymbol target) 
-     => MI target ->  MI target ->  MI target -> Proof
-mappend_assoc x@(MI xi xis) y@(MI yi yis) z@(MI zi zis)
-  | stringLen (fromString (symbolVal (Proxy :: Proxy target))) <= stringLen yi 
-  = let tg = (fromString (symbolVal (Proxy :: Proxy target))) in 
-      mappend x (mappend y z)
-  ==. mappend (MI xi xis) (mappend (MI yi yis) (MI zi zis))
-  ==. mappend (MI xi xis) 
-              (MI (concatString yi zi)
-                  ((castGoodIndexRightList tg yi zi yis
-                     `append`
-                   makeNewIndices yi zi tg
-                   ) `append`
-                  (map (shiftStringRight tg yi zi) zis)))
-  ==. MI (concatString xi (concatString yi zi))
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) ((castGoodIndexRightList tg yi zi yis
-                     `append`
-                   makeNewIndices yi zi tg
-                   ) `append`
-                  (map (shiftStringRight tg yi zi) zis))))
-      ? concatStringAssoc xi yi zi 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) ((castGoodIndexRightList tg yi zi yis
-                     `append`
-                   makeNewIndices yi zi tg
-                   ) `append`
-                  (map (shiftStringRight tg yi zi) zis))))
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) (castGoodIndexRightList tg yi zi yis
-                     `append`
-                   makeNewIndices yi zi tg
-                   ))
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-      ? mapAppend (shiftStringRight tg xi (concatString yi zi))
-                  (castGoodIndexRightList tg yi zi yis
-                     `append`
-                   makeNewIndices yi zi tg
-                   )
-                   (map (shiftStringRight tg yi zi) zis)
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) (castGoodIndexRightList tg yi zi yis)
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)
-           )
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-      ? mapAppend (shiftStringRight tg xi (concatString yi zi))
-                  (castGoodIndexRightList tg yi zi yis)
-                  (makeNewIndices yi zi tg)
--- ((x1~x2) ~ (x3~x4)) ~ x5
--- == 
--- (x1~x2) ~ x3 ~ x4 ~ x5 
-
-  ==. MI (concatString (concatString xi yi) zi)
-         ((((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          map (shiftStringRight tg xi (concatString yi zi)) (castGoodIndexRightList tg yi zi yis))
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)
-           )
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-      ? appendReorder (castGoodIndexRightList tg xi (concatString yi zi) xis)
-                      (makeNewIndices xi (concatString yi zi) tg)
-                      (map (shiftStringRight tg xi (concatString yi zi)) (castGoodIndexRightList tg yi zi yis))
-                      (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))
-                      (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-
-  ==. MI (concatString (concatString xi yi) zi)
-         ((((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis) 
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          map (shiftStringRight tg xi (concatString yi zi)) (castGoodIndexRightList tg yi zi yis))
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)
-           )
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-      ? castConcat tg xi yi zi xis 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis)
-           `append`
-           castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)
-          ) `append`
-          map (shiftStringRight tg xi (concatString yi zi)) (castGoodIndexRightList tg yi zi yis))
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)
-           )
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-      ? shiftIndexesLeft xi yi zi tg 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis)
-           `append`
-           castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)
-          ) `append`
-          castGoodIndexRightList tg (concatString xi yi) zi (map (shiftStringRight tg xi yi) yis))
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)
-           )
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-         ? castEq3 tg xi yi zi yis 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis)
-           `append`
-           castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)
-          ) `append`
-          castGoodIndexRightList tg (concatString xi yi) zi (map (shiftStringRight tg xi yi) yis))
-            `append`
-           makeNewIndices (concatString xi yi) zi tg
-           )
-            `append`
-           map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-         ? shiftIndexesRight xi yi zi tg 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis)
-           `append`
-           castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)
-          ) `append`
-          castGoodIndexRightList tg (concatString xi yi) zi (map (shiftStringRight tg xi yi) yis))
-            `append`
-           makeNewIndices (concatString xi yi) zi tg
-           )
-            `append`
-           map (shiftStringRight tg (concatString xi yi) zi) zis)
-         ? mapLenFusion tg xi yi zi zis 
-  ==. MI (concatString (concatString xi yi) zi)
-         (((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis)
-              `append`
-           castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)
-           ) `append`
-           castGoodIndexRightList tg (concatString xi yi) zi (map (shiftStringRight tg xi yi) yis)
-            `append`
-          makeNewIndices (concatString xi yi) zi tg
-          ) `append`
-         (map (shiftStringRight tg (concatString xi yi) zi) zis)) 
-        ? castAppend tg (concatString xi yi) zi 
-                     (castGoodIndexRightList tg xi yi xis)
-                     (makeNewIndices xi yi tg)
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis
-              `append`
-            makeNewIndices xi yi tg
-           ) `append`
-           castGoodIndexRightList tg (concatString xi yi) zi (map (shiftStringRight tg xi yi) yis)
-            `append`
-          makeNewIndices (concatString xi yi) zi tg
-         ) `append`
-         (map (shiftStringRight tg (concatString xi yi) zi) zis)) 
-        ? castAppend tg (concatString xi yi) zi 
-             (castGoodIndexRightList tg xi yi xis
-              `append`
-             makeNewIndices xi yi tg
-             )
-             (map (shiftStringRight tg xi yi) yis)
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg (concatString xi yi) zi ((castGoodIndexRightList tg xi yi xis
-              `append`
-            makeNewIndices xi yi tg
-           ) `append`
-           (map (shiftStringRight tg xi yi) yis))
-            `append`
-          makeNewIndices (concatString xi yi) zi tg
-         ) `append`
-         (map (shiftStringRight tg (concatString xi yi) zi) zis)) 
-  ==. mappend (
-        MI (concatString xi yi)
-           ((castGoodIndexRightList tg xi yi xis
-              `append`
-            makeNewIndices xi yi tg
-           ) `append`
-           (map (shiftStringRight tg xi yi) yis))) (MI zi zis) 
-  ==. mappend (mappend (MI xi xis) (MI yi yis)) (MI zi zis)
-  *** QED 
-
-mappend_assoc x@(MI xi xis) y@(MI yi yis) z@(MI zi zis)
-  | stringLen yi < stringLen (fromString (symbolVal (Proxy :: Proxy target))) 
-  = let tg = (fromString (symbolVal (Proxy :: Proxy target))) in 
-      mappend x (mappend y z)
-  ==. mappend (MI xi xis) (mappend (MI yi yis) (MI zi zis))
-  ==. mappend (MI xi xis) 
-              (MI (concatString yi zi)
-                  ((castGoodIndexRightList tg yi zi yis
-                     `append`
-                   makeNewIndices yi zi tg
-                   ) `append`
-                  (map (shiftStringRight tg yi zi) zis)))
-  ==. MI (concatString xi (concatString yi zi))
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) ((castGoodIndexRightList tg yi zi yis
-                     `append`
-                   makeNewIndices yi zi tg
-                   ) `append`
-                  (map (shiftStringRight tg yi zi) zis))))
-      ? concatStringAssoc xi yi zi 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) ((castGoodIndexRightList tg yi zi yis
-                     `append`
-                   makeNewIndices yi zi tg
-                   ) `append`
-                  (map (shiftStringRight tg yi zi) zis))))
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) ((castGoodIndexRightList tg yi zi N
-                     `append`
-                   makeNewIndices yi zi tg
-                   ) `append`
-                  (map (shiftStringRight tg yi zi) zis))))
-        ? emptyIndices y yis
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) (
-                   makeNewIndices yi zi tg
-                   `append`
-                  (map (shiftStringRight tg yi zi) zis))))
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg xi (concatString yi zi) xis
-           `append`
-           makeNewIndices xi (concatString yi zi) tg
-          ) `append`
-          (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg) 
-             `append` 
-           map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis)))
-      ? mapAppend (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg) (map (shiftStringRight tg yi zi) zis)
-  ==. MI (concatString (concatString xi yi) zi)
-         (((castGoodIndexRightList tg xi (concatString yi zi) xis)
-           `append`
-           ((makeNewIndices xi (concatString yi zi) tg)
-           `append`
-           (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))))
-            `append`
-           (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis)))
-      ? appendGroupNew (castGoodIndexRightList tg xi (concatString yi zi) xis)
-                       (makeNewIndices xi (concatString yi zi) tg)
-                       (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))
-                       (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-  ==. MI (concatString (concatString xi yi) zi)
-         ( (castGoodIndexRightList tg xi (concatString yi zi) xis)
-           `append`
-           ((castGoodIndexRightList tg (concatString xi yi) zi ((makeNewIndices xi yi) tg))
-           `append`
-           (makeNewIndices (concatString xi yi) zi tg))
-            `append`
-           (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis)))
-      ? shiftNewIndices xi yi zi tg 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((((castGoodIndexRightList tg xi (concatString yi zi) xis)
-           `append`
-           (castGoodIndexRightList tg (concatString xi yi) zi ((makeNewIndices xi yi) tg)))
-           `append`
-           (makeNewIndices (concatString xi yi) zi tg))
-            `append`
-           (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis)))
-      ? appendUnGroupNew (castGoodIndexRightList tg xi (concatString yi zi) xis)
-                         (castGoodIndexRightList tg (concatString xi yi) zi ((makeNewIndices xi yi) tg))
-                         (makeNewIndices (concatString xi yi) zi tg)
-                         (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis))
-  ==. MI (concatString (concatString xi yi) zi)
-         ((((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis))
-           `append`
-           (castGoodIndexRightList tg (concatString xi yi) zi ((makeNewIndices xi yi) tg)))
-           `append`
-           (makeNewIndices (concatString xi yi) zi tg))
-            `append`
-           (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis)))
-      ? castConcat tg xi yi zi xis 
-  ==. MI (concatString (concatString xi yi) zi)
-         ( ((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis)
-            `append`
-             castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)
-           )
-            `append`
-          makeNewIndices (concatString xi yi) zi tg
-           ) `append`
-         (map (shiftStringRight tg (concatString xi yi) zi) zis)) 
-      ? mapLenFusion tg xi yi zi zis 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis
-              `append`
-            makeNewIndices xi yi tg
-           )
-            `append`
-          makeNewIndices (concatString xi yi) zi tg
-           ) `append`
-         (map (shiftStringRight tg (concatString xi yi) zi) zis)) 
-      ? castAppend tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis) (makeNewIndices xi yi tg)
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg (concatString xi yi) zi ((castGoodIndexRightList tg xi yi xis
-              `append`
-            makeNewIndices xi yi tg
-           ) `append`
-           N)
-            `append`
-          makeNewIndices (concatString xi yi) zi tg
-         ) `append`
-         (map (shiftStringRight tg (concatString xi yi) zi) zis)) 
-         ? appendNil (castGoodIndexRightList tg xi yi xis `append` makeNewIndices xi yi tg)
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg (concatString xi yi) zi ((castGoodIndexRightList tg xi yi xis
-              `append`
-            makeNewIndices xi yi tg
-           ) `append`
-           (map (shiftStringRight tg xi yi) N))
-            `append`
-          makeNewIndices (concatString xi yi) zi tg
-         ) `append`
-         (map (shiftStringRight tg (concatString xi yi) zi) zis)) 
-  ==. MI (concatString (concatString xi yi) zi)
-         ((castGoodIndexRightList tg (concatString xi yi) zi ((castGoodIndexRightList tg xi yi xis
-              `append`
-            makeNewIndices xi yi tg
-           ) `append`
-           (map (shiftStringRight tg xi yi) yis))
-            `append`
-          makeNewIndices (concatString xi yi) zi tg
-         ) `append`
-         (map (shiftStringRight tg (concatString xi yi) zi) zis)) 
-         ? emptyIndices y yis 
-  ==. mappend (
-        MI (concatString xi yi)
-           ((castGoodIndexRightList tg xi yi xis
-              `append`
-            makeNewIndices xi yi tg
-           ) `append`
-           (map (shiftStringRight tg xi yi) yis))) (MI zi zis) 
-  ==. mappend (mappend (MI xi xis) (MI yi yis)) (MI zi zis)
-  *** QED 
-
--------------------------------------------------------------------------------
-----------  Lemmata on Casts --------------------------------------------------
--------------------------------------------------------------------------------
-
-{-@ castAppend :: target:SMTString -> input:SMTString -> x:SMTString 
-     -> is1:List (GoodIndex input target) 
-     -> is2:List (GoodIndex input target) -> 
-   {castGoodIndexRightList target input x (append is1 is2) == append (castGoodIndexRightList target input x is1) (castGoodIndexRightList target input x is2)}
-    @-}
-castAppend :: SMTString -> SMTString -> SMTString -> List Int -> List Int -> Proof 
-castAppend target input x is1 is2 
-  =   castGoodIndexRightList target input x (append is1 is2)
-  ==. append is1 is2 
-  ==. append (castGoodIndexRightList target input x is1) (castGoodIndexRightList target input x is2)
-  *** QED 
-
-castConcat :: SMTString -> SMTString -> SMTString -> SMTString -> List Int -> Proof
-{-@ castConcat :: tg:SMTString -> xi:SMTString -> yi:SMTString -> zi:SMTString 
-             ->  xis:List (GoodIndex xi tg) 
-        -> {castGoodIndexRightList tg xi (concatString yi zi) xis == castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis)} @-}
-castConcat tg xi yi zi xis 
-  =   castGoodIndexRightList tg xi (concatString yi zi) xis
-  ==. xis 
-  ==. castGoodIndexRightList tg xi yi xis
-  ==. castGoodIndexRightList tg (concatString xi yi) zi (castGoodIndexRightList tg xi yi xis)
-  *** QED 
-
-
-castEq3 :: SMTString -> SMTString -> SMTString -> SMTString -> List Int -> Proof
-{-@ castEq3 :: tg:SMTString -> xi:SMTString -> yi:SMTString -> zi:SMTString 
-             ->  yis:List (GoodIndex yi tg) 
-        -> {castGoodIndexRightList tg (concatString xi yi) zi (map (shiftStringRight tg xi yi) yis) == map (shiftStringRight tg xi (concatString yi zi)) (castGoodIndexRightList tg yi zi yis)} @-}
-castEq3 tg xi yi zi yis 
-  =   castGoodIndexRightList tg (concatString xi yi) zi (map (shiftStringRight tg xi yi) yis)
-  ==. map (shiftStringRight tg xi yi) yis 
-  ==. map (shiftStringRight tg xi (concatString yi zi)) (castGoodIndexRightList tg yi zi yis)
-        ? mapShiftIndex tg xi yi zi yis 
-  *** QED 
-
-
--------------------------------------------------------------------------------
-----------  Lemmata on Lists --------------------------------------------------
--------------------------------------------------------------------------------
-
-{-@ appendNil :: xs:List a -> { append xs N = xs } @-} 
-appendNil :: List a -> Proof 
-appendNil N 
-  =   append N N
-  ==. N
-  *** QED 
-appendNil (C x xs) 
-  =   append (C x xs) N
-  ==. C x (append xs N)
-  ==. C x xs ? appendNil xs 
-  *** QED 
-
--- (x1 ~ x2) ~ (x3 ~ x4)
--- == 
--- ((x1 ~ (x2 ~ x3)) ~ x4)
-
-
-appendGroupNew :: List a -> List a -> List a -> List a -> Proof
-{-@ appendGroupNew 
-  :: x1:List a 
-  -> x2:List a 
-  -> x3:List a 
-  -> x4:List a 
-  -> {   (append (append x1 x2) (append x3 x4))
-      == (append (append x1 (append x2 x3)) x4)
-     } @-}
-appendGroupNew x1 x2 x3 x4 
-  =   (append (append x1 x2) (append x3 x4))
-  ==. (append (append (append x1 x2) x3) x4)
-      ? appendAssoc (append x1 x2) x3 x4  
-  ==. (append (append x1 (append x2 x3)) x4)
-      ? appendAssoc x1 x2 x3
-  *** QED 
-
-
-
--- (x1 ~ (x2 ~ x3)) ~ x4 == ((x1 ~ x2) ~ x3) ~ x4
-
-appendUnGroupNew :: List a -> List a -> List a -> List a -> Proof
-{-@ appendUnGroupNew 
-  :: x1:List a 
-  -> x2:List a 
-  -> x3:List a 
-  -> x4:List a 
-  -> {   ((append (append (append x1 x2) x3) x4))
-      == (append (append x1 (append x2 x3)) x4)
-     } @-}
-appendUnGroupNew x1 x2 x3 x4 
-  =   append (append (append x1 x2) x3) x4
-  ==. append (append x1 (append x2 x3)) x4
-      ? appendAssoc x1 x2 x3 
-  *** QED 
-
-
-
-appendReorder :: List a -> List a -> List a -> List a -> List a -> Proof
-{-@ appendReorder 
-  :: x1:List a 
-  -> x2:List a 
-  -> x3:List a 
-  -> x4:List a 
-  -> x5:List a 
-  -> {   (append (append x1 x2) (append (append x3 x4) x5))
-      == (append (append (append (append x1 x2) x3) x4) x5)
-     } @-}
-appendReorder x1 x2 x3 x4 x5 
-  =   append (append x1 x2) (append (append x3 x4) x5)
-  ==. append (append x1 x2) (append x3 (append x4 x5))
-       ? appendAssoc x3 x4 x5 
-  ==. append (append (append x1 x2) x3) (append x4 x5)
-      ? appendAssoc (append x1 x2) x3 (append x4 x5) 
-  ==. append ((append (append (append x1 x2) x3)) x4) x5
-      ? appendAssoc (append (append x1 x2) x3) x4 x5 
-  *** QED 
-
-{-@ appendAssoc :: x:List a -> y:List a -> z:List a 
-     -> {(append x (append y z)) == (append (append x y) z) } @-}
-appendAssoc :: List a -> List a -> List a -> Proof
-appendAssoc N y z 
-  =   append N (append y z)
-  ==. append y z
-  ==. append (append N y) z
-  *** QED 
-appendAssoc (C x xs) y z
-  =   append (C x xs) (append y z) 
-  ==. C x (append xs (append y z))
-  ==. C x (append (append xs y) z)
-        ? appendAssoc xs y z
-  ==. append (C x (append xs y)) z
-  ==. append (append (C x xs) y) z
-  *** QED 
-
-
-mapAppend :: (a -> b) -> List a -> List a -> Proof
-{-@ mapAppend 
-     :: f:(a -> b) -> xs:List a -> ys:List a 
-     -> {map f (append xs ys) == append (map f xs) (map f ys)}
-  @-}
-mapAppend f N ys 
-  =   map f (append N ys)
-  ==. map f ys 
-  ==. append N (map f ys)
-  ==. append (map f N) (map f ys)
-  *** QED 
-mapAppend f (C x xs) ys 
-  =   map f (append (C x xs) ys)
-  ==. map f (x `C` (append xs ys))
-  ==. f x `C` (map f (append xs ys))
-  ==. f x `C` (append (map f xs) (map f ys))
-      ? mapAppend f xs ys 
-  ==. append (f x `C` map f xs) (map f ys)
-  ==. append (map f (x `C` xs)) (map f ys)
-  *** QED 
-
-
--------------------------------------------------------------------------------
-----------  Lemmata on Empty Indices ------------------------------------------
--------------------------------------------------------------------------------
-
-emptyIndices :: forall (target :: Symbol). (KnownSymbol target) => MI target -> List Int  -> Proof
-{-@ emptyIndices :: mi:MI target
-                 -> is:{List (GoodIndex (inputMI mi) target) | is == indicesMI mi && stringLen (inputMI mi) < stringLen target}
-                 -> { is == N } @-}
-emptyIndices (MI _ _) N 
-  = trivial 
-emptyIndices (MI _ _) (C _ _)
-  = trivial 
-
-makeNewIndicesNullLeft :: SMTString -> SMTString -> Proof 
-{-@ makeNewIndicesNullLeft 
-  :: s:SMTString 
-  -> t:SMTString 
-  -> {makeNewIndices s stringEmp t == N } @-} 
-makeNewIndicesNullLeft s t 
-  | stringLen t < 2 
-  = makeNewIndices s stringEmp t ==. N *** QED 
-makeNewIndicesNullLeft  s t 
-  | 1 + stringLen s <= stringLen t
-  =   makeNewIndices s stringEmp t
-  ==. makeIndices (concatString s stringEmp) t
-                   (maxInt (1 + stringLen s - stringLen t)  0)
-                   (stringLen s - 1)
-  ==. makeIndices s t
-                   0
-                   (stringLen s - 1) 
-                   ? concatStringNeutralLeft s
-  ==. makeIndices s t
-                   0
-                   (stringLen s - 1)
-  ==. N ? makeNewIndicesNullSmallInput s t 0 (stringLen s - 1)
-  *** QED 
-makeNewIndicesNullLeft s t 
-  =   makeNewIndices s stringEmp t
-  ==. makeIndices (concatString s stringEmp) t
-                   (maxInt (1 + stringLen s - stringLen t)  0)
-                   (stringLen s - 1)
-  ==. makeIndices (concatString s stringEmp) t
-                   (1 + stringLen s - stringLen t)
-                   (stringLen s - 1)
-  ==. makeIndices s t
-                   (1 + stringLen s - stringLen t)
-                   (stringLen s - 1) ? concatStringNeutralLeft s 
-  ==. N ? makeNewIndicesNullSmallIndex s t (1 + stringLen s - stringLen t) (stringLen s - 1)
-  *** QED 
-
-makeNewIndicesNullSmallInput :: SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ makeNewIndicesNullSmallInput 
-  :: s:SMTString 
-  -> t:{SMTString | 1 + stringLen s <= stringLen t } 
-  -> lo:Nat 
-  -> hi:Int
-  -> {makeIndices s t lo hi == N } / [hi - lo] @-} 
-makeNewIndicesNullSmallInput s1 t lo hi
-  | hi < lo 
-  = makeIndices s1 t lo hi ==. N *** QED 
-  | lo == hi, not (isGoodIndex s1 t lo)
-  = makeIndices s1 t lo hi ==. N *** QED  
-  | not (isGoodIndex s1 t lo)
-  =   makeIndices s1 t lo hi
-  ==. makeIndices s1 t (lo + 1) hi 
-  ==. N ? makeNewIndicesNullSmallInput s1 t (lo+1) hi
-  *** QED 
-
-
-makeNewIndicesNullSmallIndex :: SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ makeNewIndicesNullSmallIndex 
-  :: s:SMTString 
-  -> t:{SMTString | stringLen t < 2 + stringLen s } 
-  -> lo:{Nat | 1 + stringLen s - stringLen t <= lo  } 
-  -> hi:{Int | lo <= hi}
-  -> {makeIndices s t lo hi == N } / [hi - lo] @-} 
-makeNewIndicesNullSmallIndex s1 t lo hi
-  | lo == hi, not (isGoodIndex s1 t lo)
-  = makeIndices s1 t lo hi ==. N *** QED  
-  | not (isGoodIndex s1 t lo)
-  =   makeIndices s1 t lo hi
-  ==. makeIndices s1 t (lo + 1) hi 
-  ==. N ? makeNewIndicesNullSmallIndex s1 t (lo+1) hi
-  *** QED 
-
-
-makeNewIndicesNullRight :: SMTString -> SMTString -> Proof 
-{-@ makeNewIndicesNullRight 
-  :: s1:SMTString 
-  -> t:SMTString 
-  -> {makeNewIndices stringEmp s1 t == N } @-} 
-makeNewIndicesNullRight s t 
-  | stringLen t < 2 
-  = makeNewIndices stringEmp s t  ==. N *** QED 
-makeNewIndicesNullRight s t 
-  =   makeNewIndices stringEmp s t
-  ==. makeIndices (concatString stringEmp s) t
-                   (maxInt (1 + stringLen stringEmp - stringLen t) 0)
-                   (stringLen stringEmp - 1)
-  ==. makeIndices s t
-                   (maxInt (1 - stringLen t) 0)
-                   (-1)
-      ? concatStringNeutralRight s 
-  ==. makeIndices s t 0 (-1)
-  ==. N  
-  *** QED
-
--------------------------------------------------------------------------------
-----------  Lemmata on Shifting Indices ---------------------------------------
--------------------------------------------------------------------------------
-
-mapLenFusion :: SMTString -> SMTString -> SMTString -> SMTString -> List Int -> Proof
-{-@ mapLenFusion :: tg:SMTString -> xi:SMTString -> yi:SMTString -> zi:SMTString 
-            -> zis:List (GoodIndex zi tg) 
-        -> {map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) zis) == map (shiftStringRight tg (concatString xi yi) zi) zis} 
-        / [llen zis ] @-}
-mapLenFusion tg xi yi zi N  
-  =   map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) N)
-  ==. map (shiftStringRight tg xi (concatString yi zi)) N 
-  ==. N 
-  ==. map (shiftStringRight tg (concatString xi yi) zi) N 
-  *** QED  
-mapLenFusion tg xi yi zi (C i is)  
-  =   map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) (C i is))
-  ==. map (shiftStringRight tg xi (concatString yi zi)) (shiftStringRight tg yi zi i `C` map (shiftStringRight tg yi zi) is)
-  ==. shiftStringRight tg xi (concatString yi zi) (shiftStringRight tg yi zi i) `C` (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) is))
-  ==. shiftStringRight tg (concatString xi yi) zi i `C` (map (shiftStringRight tg xi (concatString yi zi)) (map (shiftStringRight tg yi zi) is))
-  ==. shiftStringRight tg (concatString xi yi) zi i `C` (map (shiftStringRight tg (concatString xi yi) zi) is)
-       ? mapLenFusion tg xi yi zi is 
-  ==. map (shiftStringRight tg (concatString xi yi) zi) (C i is)
-  *** QED  
-
-{-@ shiftIndexesRight
-  :: xi:SMTString 
-  -> yi:SMTString 
-  -> zi:SMTString 
-  -> tg:{SMTString | stringLen tg <= stringLen yi } 
-  -> { map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg) == makeNewIndices (concatString xi yi) zi tg }
-  @-}
-shiftIndexesRight :: SMTString -> SMTString -> SMTString -> SMTString -> Proof
-shiftIndexesRight xi yi zi tg
-  | stringLen tg < 2 
-  =   makeNewIndices (concatString xi yi) zi tg 
-  ==. N
-  ==. map (shiftStringRight tg xi (concatString yi zi)) N
-  ==. map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)
-  *** QED 
-shiftIndexesRight xi yi zi tg
--- NV NV NV 
--- This is suspicious!!! it should require exactly the precondition 
--- || tg || <= || yi || 
---   | stringLen tg  <= stringLen yi + 1 
-  =   makeNewIndices (concatString xi yi) zi tg  
-  ==. makeIndices (concatString (concatString xi yi) zi) tg 
-                   (maxInt (stringLen (concatString xi yi) - (stringLen tg -1)) 0)
-                   (stringLen (concatString xi yi) - 1 )
-  ==. makeIndices (concatString (concatString xi yi) zi) tg 
-                   (stringLen (concatString xi yi) - (stringLen tg -1))
-                   (stringLen (concatString xi yi) - 1 )
-  ==. makeIndices (concatString (concatString xi yi) zi) tg 
-                   (stringLen xi + stringLen yi - stringLen tg + 1)
-                   (stringLen xi + stringLen yi - 1 )
-  ==. makeIndices (concatString xi (concatString yi zi)) tg 
-                   (stringLen xi + stringLen yi - stringLen tg + 1)
-                   (stringLen xi + stringLen yi - 1 )
-       ?concatStringAssoc xi yi zi
-  ==. map (shiftStringRight tg xi (concatString yi zi)) (makeIndices (concatString yi zi) tg (stringLen yi - stringLen tg + 1) (stringLen yi - 1))
-       ? shiftIndexesRight' (stringLen yi - stringLen tg + 1)
-                            (stringLen yi - 1)
-                            xi 
-                            (concatString yi zi)
-                            tg 
-  ==. map (shiftStringRight tg xi (concatString yi zi)) 
-               (makeIndices (concatString yi zi) tg 
-                             (maxInt (stringLen yi - (stringLen tg -1)) 0)
-                             (stringLen yi -1))
-  ==. map (shiftStringRight tg xi (concatString yi zi)) 
-          (makeNewIndices yi zi tg)
-  *** QED
-
-{-@ shiftIndexesRight'
-  :: lo:Nat 
-  -> hi:Int  
-  -> x:SMTString 
-  -> input:SMTString 
-  -> target:SMTString
-  -> { map (shiftStringRight target x input) (makeIndices input target lo hi) == makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi) }
-  / [if hi < lo then 0 else  hi-lo]
-  @-}
-shiftIndexesRight' :: Int -> Int -> SMTString -> SMTString -> SMTString -> Proof
-shiftIndexesRight' lo hi x input target
-  | hi < lo 
-  =   map (shiftStringRight target x input) (makeIndices input target lo hi)
-  ==. map (shiftStringRight target x input) N
-  ==. N
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-  *** QED 
-  | lo == hi, isGoodIndex input target lo 
-  =   map (shiftStringRight target x input) (makeIndices input target lo hi)
-  ==. map (shiftStringRight target x input) (lo `C` N)
-  ==. (shiftStringRight target x input lo) `C` (map (shiftStringRight target x input) N)
-  ==. (stringLen x + lo) `C` N
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-     ? isGoodIndexConcatFront input x target lo  -- ( => IsGoodIndex (concatString x input) target (stringLen x + lo))
-  *** QED 
-  | lo == hi
-  =   map (shiftStringRight target x input) (makeIndices input target lo hi)
-  ==. map (shiftStringRight target x input) N
-  ==. N
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-     ? (isGoodIndexConcatFront input x target lo *** QED)
-  *** QED 
-
-shiftIndexesRight' lo hi x input target
-  | isGoodIndex input target lo
-  =   map (shiftStringRight target x input) (makeIndices input target lo hi)
-  ==. map (shiftStringRight target x input) (lo `C` makeIndices input target (lo+1) hi)
-  ==. (shiftStringRight target x input lo) `C` (map (shiftStringRight target x input) (makeIndices input target (lo+1) hi))
-  ==. (shift (stringLen x) lo) `C` (makeIndices (concatString x input) target (stringLen x + (lo+1)) (stringLen x + hi))
-      ? shiftIndexesRight' (lo+1) hi x input target
-  ==. (stringLen x + lo) `C` (makeIndices (concatString x input) target (stringLen x + (lo+1)) (stringLen x + hi))
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-     ? (isGoodIndexConcatFront input x target lo *** QED)
-  *** QED 
-  | otherwise
-  =   map (shiftStringRight target x input) (makeIndices input target lo hi)
-  ==. map (shiftStringRight target x input) (makeIndices input target (lo + 1) hi)
-  ==. makeIndices (concatString x input) target (stringLen x + (lo+1)) (stringLen x + hi)
-      ? shiftIndexesRight' (lo+1) hi x input target
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-     ? (isGoodIndexConcatFront input x target lo *** QED)
-  *** QED 
-
-
-{-@ shiftIndexesLeft
-  :: xi:SMTString 
-  -> yi:SMTString 
-  -> zi:SMTString 
-  -> tg:{SMTString | stringLen tg <= stringLen yi } 
-  -> {  makeNewIndices xi (concatString yi zi) tg == castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)}
-  @-}
-shiftIndexesLeft :: SMTString -> SMTString -> SMTString -> SMTString -> Proof
-shiftIndexesLeft xi yi zi tg
-  | stringLen tg < 2 
-  =   makeNewIndices xi (concatString yi zi) tg 
-  ==. N
-  ==. makeNewIndices xi yi tg 
-  ==. castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)
-  *** QED 
-  | otherwise
-  =   makeNewIndices xi (concatString yi zi) tg 
-  ==. makeIndices (concatString xi (concatString yi zi)) tg 
-                   (maxInt (stringLen xi - (stringLen tg-1)) 0)
-                   (stringLen xi - 1)
-  ==. makeIndices (concatString (concatString xi yi) zi) tg 
-                   (maxInt (stringLen xi - (stringLen tg-1)) 0)
-                   (stringLen xi - 1)
-     ?concatStringAssoc xi yi zi 
-  ==. makeIndices (concatString xi yi) tg 
-                   (maxInt (stringLen xi - (stringLen tg-1)) 0)
-                   (stringLen xi - 1)                
-      ? concatmakeNewIndices (maxInt (stringLen xi - (stringLen tg-1)) 0) (stringLen xi - 1) tg (concatString xi yi) zi 
-  ==. makeNewIndices xi yi tg 
-  ==. castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)
-  *** QED 
-
-{-@ concatmakeNewIndices
-  :: lo:Nat -> hi:Int
-  -> target: SMTString
-  -> input : {SMTString | hi + stringLen target <= stringLen input } 
-  -> input': SMTString   
-  -> {  makeIndices (concatString input input') target lo hi == makeIndices input target lo hi }
-  / [hi - lo]  @-}
-concatmakeNewIndices :: Int -> Int -> SMTString -> SMTString -> SMTString  -> Proof
-concatmakeNewIndices lo hi target input input'
-  | hi < lo 
-  =   makeIndices input target lo hi
-  ==. N
-  ==. makeIndices (concatString input input') target lo hi 
-  *** QED 
-  | lo == hi, isGoodIndex input target lo
-  =   makeIndices input target lo hi
-  ==. lo `C` N
-  ==. makeIndices (concatString input input') target lo hi 
-      ? isGoodIndexConcatString input input' target lo  
-  *** QED 
-  | lo == hi
-  =  makeIndices input target lo hi 
-  ==. N
-  ==. makeIndices (concatString input input') target lo hi
-      ? isGoodIndexConcatString input input' target lo  
-  *** QED 
-concatmakeNewIndices lo hi target input input' 
-  | isGoodIndex input target lo
-  =   makeIndices input target lo hi
-  ==. lo `C` (makeIndices input target (lo + 1) hi)
-  ==. lo `C` (makeIndices (concatString input input') target (lo + 1) hi)
-       ? concatmakeNewIndices (lo+1) hi target input input'
-  ==. makeIndices  (concatString input input') target lo hi
-      ? isGoodIndexConcatString input input' target lo  
-  *** QED 
-  | otherwise 
-  =   makeIndices input target lo hi
-  ==. makeIndices input target (lo + 1) hi
-  ==. makeIndices (concatString input input') target (lo + 1) hi
-       ? concatmakeNewIndices (lo+1) hi target input input'
-  ==. makeIndices  (concatString input input') target lo hi
-      ? isGoodIndexConcatString input input' target lo  
-  *** QED 
-
-
-
-{-@ isGoodIndexConcatFront 
-  :: input:SMTString -> input':SMTString -> tg:SMTString -> i:Nat
-  -> {((isGoodIndex input tg i) <=> isGoodIndex (concatString input' input) tg (stringLen input' + i) )
-     } @-}
-isGoodIndexConcatFront :: SMTString -> SMTString -> SMTString -> Int -> Proof 
-isGoodIndexConcatFront input input' tg i 
-  =   isGoodIndex input tg i 
-  ==. (subString input i (stringLen tg)  == tg  
-      && i + stringLen tg <= stringLen input 
-      && 0 <= i)  
-  ==. (subString input i (stringLen tg)  == tg  
-      && (stringLen input' + i) + stringLen tg <= stringLen (concatString input' input) 
-      && 0 <= i)  
-  ==. (subString (concatString input' input) (stringLen input' + i) (stringLen tg)  == tg  
-      && (stringLen input' + i) + stringLen tg <= stringLen (concatString input' input) 
-      && 0 <= (stringLen input' + i))  
-      ? (subStringConcatFront input input' (stringLen tg) i *** QED)
-  ==. isGoodIndex (concatString input' input) tg (stringLen input' + i) 
-  *** QED 
-
-
-{-@ isGoodIndexConcatString 
-  :: input:SMTString -> input':SMTString -> tg:SMTString -> i:{Int | i + stringLen tg <= stringLen input }
-  -> {((isGoodIndex input tg i) <=> isGoodIndex (concatString input input') tg i)
-     } @-}
-isGoodIndexConcatString :: SMTString -> SMTString -> SMTString -> Int -> Proof 
-isGoodIndexConcatString input input' tg i 
-  =   isGoodIndex input tg i 
-  ==. (subString input i (stringLen tg)  == tg  
-      && i + stringLen tg <= stringLen input
-      && 0 <= i) 
-  ==. (subString (concatString input input') i (stringLen tg)  == tg  
-      && i + stringLen tg <= stringLen input 
-      && 0 <= i)   
-      ? (subStringConcatBack input input' (stringLen tg) i *** QED )
-  ==. (subString (concatString input input') i (stringLen tg)  == tg  
-      && i + stringLen tg <= stringLen (concatString input input') 
-      && 0 <= i)   
-      ? (((stringLen input <= stringLen (concatString input input') *** QED ) &&& (concatLen input input') *** QED))
-  ==. isGoodIndex (concatString input input') tg i 
-  *** QED 
-
-
-mapShiftZero :: SMTString -> SMTString -> List Int -> Proof
-{-@ mapShiftZero :: target:SMTString -> i:SMTString -> is:List (GoodIndex i target) 
-  -> {map (shiftStringRight target stringEmp i) is == is } 
-  / [llen is] @-}
-mapShiftZero target i N
-  =   map (shiftStringRight target stringEmp i) N ==. N *** QED  
-mapShiftZero target i (C x xs)
-  =   map (shiftStringRight target stringEmp i) (C x xs) 
-  ==. shiftStringRight target stringEmp i x `C` map (shiftStringRight target stringEmp i) xs
-  ==. shift (stringLen stringEmp) x `C` map (shiftStringRight target stringEmp i) xs
-  ==. shift 0 x `C` map (shiftStringRight target stringEmp i) xs
-  ==. x `C` map (shiftStringRight target stringEmp i) xs
-  ==. x `C` xs ? mapShiftZero target i xs 
-  *** QED 
-
-
-{-@ mapShiftIndex :: tg:SMTString -> xi:SMTString -> yi:SMTString -> zi:SMTString -> xs:List (GoodIndex yi tg)
-  -> {map (shiftStringRight tg xi yi) xs == map (shiftStringRight tg xi (concatString yi zi)) xs} / [llen xs] @-}
-mapShiftIndex :: SMTString -> SMTString -> SMTString -> SMTString -> List Int -> Proof
-mapShiftIndex tg xi yi zi N 
-  = map (shiftStringRight tg xi yi) N ==. N ==. map (shiftStringRight tg xi (concatString yi zi)) N *** QED 
-  *** QED 
-mapShiftIndex tg xi yi zi zs@(C i0 is0)
-  =   let is = castGoodIndexRightList tg yi zi is0 
-          i  = castGoodIndexRight     tg yi zi i0  in 
-      map (shiftStringRight tg xi yi) (C i is) 
-  ==. C (shiftStringRight tg xi yi i) (map (shiftStringRight tg xi yi) is)
-  ==. C (shift (stringLen xi) i) (map (shiftStringRight tg xi yi) is)
-  ==. C (shiftStringRight tg xi (concatString yi zi) i) (map (shiftStringRight tg xi yi) is)
-  ==. C (shiftStringRight tg xi (concatString yi zi) i) (map (shiftStringRight tg xi (concatString yi zi)) is)
-       ? mapShiftIndex tg xi yi zi is
-  ==. map (shiftStringRight tg xi (concatString yi zi)) (C i is)
-  *** QED 
-
-
-
-{-@ shiftNewIndices
-  :: xi:SMTString 
-  -> yi:SMTString 
-  -> zi:SMTString 
-  -> tg:{SMTString | stringLen yi < stringLen tg  } 
-  -> {  append (makeNewIndices xi (concatString yi zi) tg) (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)) == append (castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)) (makeNewIndices (concatString xi yi) zi tg)
-     }
-  @-}
-shiftNewIndices :: SMTString -> SMTString -> SMTString -> SMTString -> Proof
-shiftNewIndices xi yi zi tg 
-  | stringLen tg < 2 
-  =   append (makeNewIndices xi (concatString yi zi) tg) (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)) 
-  ==. append N (map (shiftStringRight tg xi (concatString yi zi)) N) 
-  ==. map (shiftStringRight tg xi (concatString yi zi)) N 
-  ==. N 
-  ==. append N N
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-
-shiftNewIndices xi yi zi tg 
-  | stringLen xi == 0 
-  =   append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))
-  ==. append (makeNewIndices stringEmp (concatString yi zi) tg) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))
-  ? stringEmpProp xi 
-  ==. append (makeNewIndices stringEmp (concatString yi zi) tg) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))
-  ? makeNewIndicesNullRight (concatString yi zi) tg
-  ==. append N
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))
-  ==. map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)
-       ? stringEmpProp xi
-  ==. map (shiftStringRight tg stringEmp (concatString yi zi)) (makeNewIndices yi zi tg)
-      ? mapShiftZero tg (concatString yi zi) (makeNewIndices yi zi tg)
-  ==. makeNewIndices yi zi tg
-  ==. makeNewIndices (concatString xi yi) zi tg
-        ? concatEmpLeft xi yi 
-  ==. append N (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (makeNewIndices stringEmp yi tg) (makeNewIndices (concatString xi yi) zi tg)
-       ? makeNewIndicesNullRight yi tg
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-      ? stringEmpProp xi
-  ==. append (castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-  | stringLen yi == 0 
-  =   append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))
-  ==. append (makeNewIndices xi zi tg) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg))
-      ? (stringEmpProp yi &&& concatEmpLeft yi zi)
-  ==. append (makeNewIndices xi zi tg) 
-                  (map (shiftStringRight tg xi zi) (makeNewIndices stringEmp zi tg))
-  ==. append (makeNewIndices xi zi tg) 
-                  (map (shiftStringRight tg xi (concatString stringEmp zi)) N)
-      ? makeNewIndicesNullRight zi tg 
-  ==. append (makeNewIndices xi zi tg) 
-                  N
-  ==. makeNewIndices xi zi tg 
-       ? appendNil (makeNewIndices xi zi tg)
-  ==. makeNewIndices (concatString xi yi) zi tg
-       ? concatEmpRight xi yi
-  ==. append N (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (makeNewIndices xi stringEmp tg) (makeNewIndices (concatString xi yi) zi tg)
-       ? makeNewIndicesNullLeft xi tg 
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)) (makeNewIndices (concatString xi yi) zi tg)
-       ? stringEmpProp yi
-  *** QED 
-  | stringLen yi - stringLen tg == -1 
-  = let minidx = maxInt (stringLen xi - stringLen tg + 1) 0 in 
-      append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          (maxInt (stringLen yi - stringLen tg +1) 0)
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          (maxInt 0 0)
-                                          (stringLen yi -1)
-                            ))  
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          0
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString xi (concatString yi zi)) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? shiftIndexesRight' 0 (stringLen yi -1) xi (concatString yi zi) tg 
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? concatStringAssoc xi yi zi 
-
-  ==. append (append 
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi)
-                                (stringLen xi -1))
-
-                                ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) 
-      ? mergeIndices (concatString (concatString xi yi) zi) tg 
-                     minidx -- maxInt (stringLen xi - stringLen tg + 1) 0
-                     (stringLen xi -1)
-                     (stringLen xi -1)
-  ==. append (append 
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                  N
-
-                                ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) 
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) 
-      ? appendNil (makeIndices (concatString (concatString xi yi) zi) tg
-                                    minidx
-                                    (stringLen xi + stringLen yi - stringLen tg))
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi -1))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                ((stringLen xi))
-                                (stringLen xi + stringLen yi -1))
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx 
-                                (stringLen (concatString xi yi)  - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1))
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-      ? catIndices (concatString xi yi) zi tg minidx (stringLen xi-1)
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx 
-                                -- maxInt (stringLen xi - stringLen tg + 1) 0 && 2 <= stringLen tg
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen xi) 0)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen xi + stringLen yi - stringLen tg + 1) 0)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeIndices (concatString xi yi) tg 
-                                (maxInt (stringLen xi - stringLen tg +1) 0)
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-shiftNewIndices xi yi zi tg 
--- THIS ALWAYS HOLDS 
---   | stringLen yi + 1 <= stringLen tg
-  | 0 <= stringLen xi + stringLen yi - stringLen tg
- --  , 0 < stringLen xi 
-  = let minidx = maxInt (stringLen xi - stringLen tg + 1) 0 in 
-      append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          (maxInt (stringLen yi - stringLen tg +1) 0)
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) 
-                            (makeIndices (concatString yi zi) tg
-                                           0
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString xi (concatString yi zi)) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? shiftIndexesRight' 0 (stringLen yi -1) xi (concatString yi zi) tg 
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? concatStringAssoc xi yi zi 
-
-  ==. append (append 
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg + 1)
-                                (stringLen xi -1))
-
-                                ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) 
-      ? mergeIndices (concatString (concatString xi yi) zi) tg 
-                     minidx -- maxInt (stringLen xi - stringLen tg + 1) 0
-                     (stringLen xi + stringLen yi - stringLen tg)
-                     (stringLen xi -1)
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx 
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                 (append
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg +1)
-                                (stringLen xi -1))
-
-                                
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) )
-      ? appendAssoc
-              (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-              (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg+1)
-                                (stringLen xi -1))
-              (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1))
-
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                ((stringLen xi + stringLen yi - stringLen tg+1))
-                                (stringLen xi + stringLen yi -1))
-     ? mergeIndices (concatString (concatString xi yi) zi) tg 
-                  ((stringLen xi + stringLen yi - stringLen tg+1))
-                  (stringLen xi-1)
-                  (stringLen xi + stringLen yi -1)
-
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx 
-                                (stringLen (concatString xi yi)  - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg + 1)
-                                (stringLen xi + stringLen yi -1))
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg + 1)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-      ? catIndices (concatString xi yi) zi tg minidx (stringLen xi-1)
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen xi + stringLen yi - stringLen tg + 1) 0)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeIndices (concatString xi yi) tg 
-                                (maxInt (stringLen xi - stringLen tg +1) 0)
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-
---   | stringLen yi + 1 <= stringLen tg
-  | stringLen xi + stringLen yi < stringLen tg
-  =   append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) (makeNewIndices yi zi tg)) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          (maxInt (stringLen yi - stringLen tg +1) 0)
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                0
-                                (stringLen xi -1)) 
-                  (map (shiftStringRight tg xi (concatString yi zi)) 
-                            (makeIndices (concatString yi zi) tg
-                                           0
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                0
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString xi (concatString yi zi)) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? shiftIndexesRight' 0 (stringLen yi -1) xi (concatString yi zi) tg 
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                0
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? concatStringAssoc xi yi zi 
-
-  ==. makeIndices (concatString (concatString xi yi) zi) tg
-                                0
-                                (stringLen (concatString xi yi) - 1)
-      ? mergeIndices (concatString (concatString xi yi) zi) tg 
-                    0 
-                    (stringLen xi-1) 
-                    (stringLen (concatString xi yi) -1)
-
-  ==. append N    (makeIndices (concatString (concatString xi yi) zi) tg
-                                0
-                                (stringLen (concatString xi yi) - 1)
-                  )
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                0
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                0
-                                (stringLen (concatString xi yi) - 1)
-                  )
-      ? smallInput (concatString xi yi) tg 0 (stringLen xi -1)
-  ==. append (makeIndices (concatString xi yi) tg 
-                                (maxInt (stringLen xi - stringLen tg +1) 0)
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (castGoodIndexRightList tg (concatString xi yi) zi (makeNewIndices xi yi tg)) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-
-
-smallInput :: SMTString -> SMTString -> Int -> Int -> Proof  
-{-@ smallInput :: input:SMTString -> target:{SMTString | stringLen input < stringLen target } -> lo:Nat -> hi:Int 
-           -> {makeIndices input target lo hi == N } 
-           / [hi -lo]
-  @-}
-smallInput input target lo hi 
-  | hi < lo 
-  = makeIndices input target lo hi 
-  ==. N
-  *** QED  
-  | lo == hi, not (isGoodIndex input target lo)
-  = makeIndices input target lo hi 
-  ==. N
-  *** QED  
-  | not (isGoodIndex input target lo)
-  = makeIndices input target lo hi 
-  ==. makeIndices input target (lo+1) hi
-  ==. N ? smallInput input target (lo+1) hi 
-  *** QED  
-
-maxIndices :: SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ maxIndices 
-  :: input:SMTString -> target:SMTString -> lo:{Nat | stringLen input < lo + stringLen target} -> hi:Int
-  -> {makeIndices input target lo hi = N}
-  / [hi - lo ] @-}
-maxIndices input target lo hi 
-  | hi < lo 
-  =   makeIndices input target lo hi  
-  ==. N
-  *** QED 
-  | lo == hi, not (isGoodIndex input target lo)
-  =   makeIndices input target lo hi  
-  ==. N
-  *** QED 
-  | not (isGoodIndex input target lo)
-  =   makeIndices input target lo hi
-  ==. N 
-  ==. makeIndices input target (lo+1) hi 
-      ? maxIndices input target (lo+1) hi 
-  *** QED 
-
-
-mergeIndices :: SMTString -> SMTString -> Int -> Int -> Int -> Proof
-{-@ mergeIndices 
-  :: input:SMTString -> target:SMTString -> lo:Nat -> mid:{Int | lo <= mid} -> hi:{Int | mid <= hi} 
-  -> {makeIndices input target lo hi == append (makeIndices input target lo mid) (makeIndices input target (mid+1) hi)} 
-  / [mid] @-}
-mergeIndices input target lo mid hi 
-  | lo == mid, isGoodIndex input target lo 
-  =   append (makeIndices input target lo mid) (makeIndices input target (mid+1) hi)
-  ==. append (makeIndices input target lo lo)  (makeIndices input target (mid+1) hi)
-  ==. append (lo `C` N)  (makeIndices input target (mid+1) hi)
-  ==. lo  `C` (append N  (makeIndices input target (lo+1) hi))
-  ==. lo  `C` (makeIndices input target (lo+1) hi)
-  ==. makeIndices input target lo hi
-  *** QED 
-  | lo == mid, not (isGoodIndex input target lo)
-  =   append (makeIndices input target lo mid) (makeIndices input target (mid+1) hi)
-  ==. append (makeIndices input target lo lo)  (makeIndices input target (mid+1) hi)
-  ==. append (lo `C` N)  (makeIndices input target (mid+1) hi)
-  ==. (append N  (makeIndices input target (lo+1) hi))
-  ==. makeIndices input target lo hi
-  *** QED 
-  | lo < mid, not (isGoodIndex input target mid)
-  =   makeIndices input target lo hi
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (makeIndices input target mid hi)
-       ? mergeIndices input target lo (mid-1) hi 
-
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (makeIndices input target (mid+1) hi)
-
-  ==. append (makeIndices input target lo mid) 
-                  (makeIndices input target (mid+1) hi)
-      ?makeNewIndicesBadLast input target lo mid
-  *** QED 
-  | lo < mid, isGoodIndex input target mid
-  =   makeIndices input target lo hi
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (makeIndices input target mid hi)
-       ? mergeIndices input target lo (mid-1) hi 
-
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (mid `C` makeIndices input target (mid+1) hi)
-
-
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (mid `C` (append N (makeIndices input target (mid+1) hi)))
-
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (append (C mid N) (makeIndices input target (mid+1) hi))
-
-  ==. append (append (makeIndices input target lo (mid-1)) (C mid N)) 
-                  (makeIndices input target (mid+1) hi)
-      ? appendAssoc (makeIndices input target lo (mid-1)) (C mid N) (makeIndices input target (mid+1) hi)
-
-  ==. append (makeIndices input target lo mid) 
-                  (makeIndices input target (mid+1) hi)
-      ?makeNewIndicesGoodLast input target lo mid
-  *** QED 
-
-
-makeNewIndicesGoodLast, makeNewIndicesBadLast 
-  :: SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ makeNewIndicesGoodLast 
-  :: input:SMTString -> target:SMTString -> lo:Nat -> hi:{Int | lo <= hi && (isGoodIndex input target hi)}
-  -> {makeIndices input target lo hi == append (makeIndices input target lo (hi-1)) (C hi N)}
-  / [hi - lo] @-}
-makeNewIndicesGoodLast input target lo hi 
-  | lo == hi, (isGoodIndex input target lo)
-  =   makeIndices input target lo hi 
-  ==. hi `C` N 
-  ==. append (N) (C hi N)
-  ==. append (makeIndices input target lo (hi-1)) (C hi N)
-  *** QED 
-  | not (isGoodIndex input target lo), isGoodIndex input target hi 
-  =   makeIndices input target lo hi 
-  ==. makeIndices input target (lo+1) hi
-  ==. append (makeIndices input target (lo+1) (hi-1)) (C hi N)
-       ? makeNewIndicesGoodLast input target (lo+1) hi  
-  ==. append (makeIndices input target lo (hi-1)) (C hi N)
-  *** QED 
-  | isGoodIndex input target lo, isGoodIndex input target hi
-  =   makeIndices input target lo hi 
-  ==. lo `C` makeIndices input target (lo+1) hi
-  ==. lo `C` (append (makeIndices input target (lo+1) (hi-1)) (C hi N))
-       ? makeNewIndicesGoodLast input target (lo+1) hi  
-  ==. (append (lo `C` makeIndices input target (lo+1) (hi-1)) (C hi N))
-  ==. append (makeIndices input target lo (hi-1)) (C hi N)
-  *** QED 
-
-{-@ makeNewIndicesBadLast 
-  :: input:SMTString -> target:SMTString -> lo:Nat -> hi:{Int | lo <= hi && (not (isGoodIndex input target hi))}
-  -> {makeIndices input target lo hi == makeIndices input target lo (hi-1)}
-  / [hi - lo]
-@-}
--- NV sweet proof 
-makeNewIndicesBadLast input target lo hi 
-  | lo == hi, not (isGoodIndex input target lo)
-  =   makeIndices input target lo (hi-1) 
-  ==. N 
-  ==. makeIndices input target lo hi
-  *** QED 
-  | not (isGoodIndex input target lo), not (isGoodIndex input target hi) 
-  =   makeIndices input target lo hi 
-  ==. makeIndices input target (lo+1) hi
-  ==. makeIndices input target (lo+1) (hi-1)
-       ? makeNewIndicesBadLast input target (lo+1) hi   
-  ==. makeIndices input target lo (hi-1)
-  *** QED 
-  | isGoodIndex input target lo , not (isGoodIndex input target hi) 
-  =   makeIndices input target lo hi 
-  ==. lo `C` makeIndices input target (lo+1) hi
-  ==. lo `C` makeIndices input target (lo+1) (hi-1)
-       ? makeNewIndicesBadLast input target (lo+1) hi   
-  ==. makeIndices input target lo (hi-1)
-  *** QED 
-
-
-catIndices :: SMTString -> SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ catIndices 
-     :: input:SMTString -> x:SMTString 
-     -> target:{SMTString | 0 <= stringLen input - stringLen target + 1} 
-     -> lo:{Nat | lo <= stringLen input - stringLen target } 
-     -> hi:{Int | stringLen input - stringLen target <= hi}
-     -> { makeIndices input target lo hi == makeIndices (concatString input x) target lo (stringLen input - stringLen target) }
-  @-}
-catIndices input x target lo hi 
-  =   makeIndices input target lo hi
-  ==. append (makeIndices input target lo (stringLen input - stringLen target))
-                  (makeIndices input target (stringLen input - stringLen target + 1) hi)
-       ? mergeIndices input target lo (stringLen input - stringLen target) hi
-  ==. append (makeIndices input target lo (stringLen input - stringLen target))
-                  N
-       ? maxIndices input target (stringLen input - stringLen target + 1) hi
-  ==. makeIndices input target lo (stringLen input - stringLen target)
-       ? appendNil (makeIndices input target lo (stringLen input - stringLen target))
-  ==. makeIndices (concatString input x) target lo (stringLen input - stringLen target)
-       ? concatmakeNewIndices lo (stringLen input - stringLen target) target input x 
-  *** QED 
-
diff --git a/tests/strings/pos/StringIndexingStep1.hs b/tests/strings/pos/StringIndexingStep1.hs
deleted file mode 100644
--- a/tests/strings/pos/StringIndexingStep1.hs
+++ /dev/null
@@ -1,44 +0,0 @@
-{-# LANGUAGE KindSignatures      #-}
-{-# LANGUAGE DataKinds           #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE GADTs               #-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--stringtheory"    @-}
-
-module StringIndexing where
-
-
-import GHC.TypeLits
-import Data.String 
-
-import Data.Proxy 
--- Structure that defines valid indeces of a type level target 
--- symbol in a value level string
-
-data MI (tagret :: Symbol) s where 
-  MI :: IsString s => s        -- input string
-                   -> [Int]    -- valid indeces of target in input
-                   -> MI target s
-
-{-@ MI :: input:s 
-       -> [{i:Int |	 subString input i (stringLen target)  == target }]
-       -> MI s @-}
-
--- STEP 1:    Verification of valid structures
-
-misafe1 :: MI "cat" String 
-misafe1 = MI "catdogcatsdots" []
-
-misafe2 :: MI "cat" String
-misafe2 = MI "catdogcatsdots" [0]
-
-misafe3 :: MI "cat" String
-misafe3 = MI "catdogcatsdots" [0, 6]
-
-misafe4 :: MI "cat" String
-misafe4 = MI "catdogcatsdots" [6, 0]
-
-misafe5 :: MI "cat" String
-misafe5 = MI "catdogcatsdots" [6]
diff --git a/tests/strings/pos/StringIndexingStep2.hs b/tests/strings/pos/StringIndexingStep2.hs
deleted file mode 100644
--- a/tests/strings/pos/StringIndexingStep2.hs
+++ /dev/null
@@ -1,91 +0,0 @@
-{-# LANGUAGE KindSignatures      #-}
-{-# LANGUAGE DataKinds           #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE GADTs               #-}
-
-
-{-@ LIQUID "--totality"          @-}
-{-@ LIQUID "--stringtheory"      @-}
-
-module StringIndexing where
-
-
-import GHC.TypeLits
-import Data.String 
-
-import Data.Proxy 
--- Structure that defines valid indeces of a type level target 
--- symbol in a value level string
-
-data MI (tagret :: Symbol) s where 
-  MI :: IsString s => s        -- input string
-                   -> [Int]    -- valid indeces of target in input
-                   -> MI target s
-
-{-@ MI :: input:s 
-       -> [GoodIndex input target]
-       -> MI s @-}
-
-
-{-@ type GoodIndex Input Target 
-  = {i:Int |  IsGoodIndex Input Target i}
-  @-}
-
-{-@ predicate IsGoodIndex Input Target I
-  =  (subString Input I (stringLen Target)  == Target)
-  && (I + stringLen Target < stringLen Input)
-  && (0 <= I)
-  @-}
-
-{-@ measure stringLen    :: String -> Int @-}
-{-@ measure subString    :: String -> Int -> Int -> String @-}
-{-@ measure concatString :: String -> String -> String @-}
-
-mempty :: forall (target :: Symbol). MI target String
-mempty = MI "" []
-
-
-mappend :: forall (target :: Symbol). (KnownSymbol target) => MI target String -> MI target String -> MI target String
-mappend (MI i1 is1) (MI i2 is2)
-  = MI input (is ++ is1 ++ map ((length i1) +) is2)
-  where 
-    is     = filterIndex input target [(len1 - len) .. (len1 + len)]
-    input  = i1 `concatString` i2 
-    len1   = length i1 
-    len    = length target 
-    target = symbolVal (Proxy :: Proxy target)
-
-
-{-@ symbolVal :: forall n proxy. KnownSymbol n => proxy n -> {v:String | v == n} @-}
-
-filterIndex :: String -> String -> [Int] -> [Int]
-{-@ filterIndex :: input:String -> target:String -> is:[Int] -> [GoodIndex input target] / [len is] @-}
-filterIndex _ _ [] = []
-filterIndex input target (i:is)
-  | isGoodIndex input target i
-  = i:filterIndex input target is 
-  | otherwise 
-  =   filterIndex input target is 
-
-
-isGoodIndex :: String -> String -> Int -> Bool 
-{-@ isGoodIndex :: input:String -> target:String -> i:Int 
-  -> {b:Bool | Prop b <=> IsGoodIndex input target i} @-}
-isGoodIndex input target i 
-  =  subString input i (stringLen target)  == target  
-  && i + stringLen target < stringLen input
-  && 0 <= i
-
-{-@ concatString :: x:String -> y:String -> {v:String | v == concatString x y && stringLen v == stringLen x + stringLen y } @-}
-concatString :: String -> String -> String
-concatString = undefined 
-
-{-@ stringLen    :: s:String -> {v:Int | v == stringLen s} @-}
-stringLen :: String -> Int 
-stringLen = length 
-
-{-@ subString  :: s:String -> offset:Int -> ln:Int -> {v:String |v == subString s offset ln } @-}
-subString :: String -> Int -> Int -> String 
-subString = undefined 
diff --git a/tests/strings/pos/StringIndexingStep3.hs b/tests/strings/pos/StringIndexingStep3.hs
deleted file mode 100644
--- a/tests/strings/pos/StringIndexingStep3.hs
+++ /dev/null
@@ -1,1735 +0,0 @@
-{-
-NV TODO 
-1. refine data type
-2. connect it with Steps 1 & 2
-3. connect it with dyn programming 
--}
-
-
-
-{-# LANGUAGE KindSignatures      #-}
-{-# LANGUAGE DataKinds           #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE GADTs               #-}
-
-
-{-@ LIQUID "--higherorder"         @-}
-{-@ LIQUID "--totality"            @-}
-{-@ LIQUID "--exactdc"             @-}
-
-module Main where
-
-import Language.Haskell.Liquid.String
-import GHC.TypeLits
-import Data.String hiding (fromString)
-import Data.Proxy 
-import Prelude hiding (mempty, mappend, id, mconcat, map)
-import Language.Haskell.Liquid.ProofCombinators 
-
-import Data.Maybe 
-
--- | Interface 
-
-main :: IO ()
-main = 
-   do input     <- fromString <$> readFile "input.txt"
-      let mi1    = toMI input :: MI "abcab" SMTString
-      let is1    = getIndex mi1 
-      putStrLn ("Serial   Indices: " ++ show is1)
-      let mi2    = toMIPar input :: MI "abcab" SMTString
-      let is2    = getIndex mi2 
-      putStrLn ("Parallel Indices: " ++ show is2)
-      putStrLn ("Are equal? " ++ show (is1 == is2))
-
-{-
-main :: IO ()
-main = 
-  do input     <- fromString <$> readFile "input.txt"
-     case someSymbolVal "x" of 
-            SomeSymbol (_ :: Proxy y) ->            
-      let mi1    = toMI input :: MI y SMTString
-      let is1    = getIndex mi1 
-      putStrLn ("Serial   Indices: " ++ show is1)
-      let mi2    = toMIPar input :: MI "abcab" SMTString
-      let is2    = getIndex mi2 
-      putStrLn ("Parallel Indices: " ++ show is2)
-      putStrLn ("Are equal? " ++ show (is1 == is2))
-
-
--}
-
-test1   = indices input1 
-input1  = fromString $ clone 100 "ababcabcab"
-
-
-indices :: SMTString -> List Int 
-indices input 
-  = case toMI input :: MI "abcab" SMTString  of 
-      MI _ i -> i 
-
-
-{-
-
-
-
-  |
--}
-
-mconcatPar :: forall (target :: Symbol). (KnownSymbol target) =>  Int -> [MI target SMTString] -> MI target SMTString
-mconcatPar n xs = mconcat (mconcatPar' n xs)
-
-{-@ Lazy mconcatPar' @-}
--- Termination proof is terribly slow and will change... 
-{-@ mconcatPar' :: forall (target :: Symbol). (KnownSymbol target) =>  Int -> xs:[MI target SMTString] -> [MI target SMTString] @-}
-mconcatPar' :: forall (target :: Symbol). (KnownSymbol target) =>  Int -> [MI target SMTString] -> [MI target SMTString]
-mconcatPar' n xs | length xs <= n = [mconcat xs]  
-mconcatPar' n xs = let (x, r) = splitAt n xs 
-                   in mconcatPar' n (mconcat x:mconcatPar' n r)
-
-toMIPar :: forall (target :: Symbol). (KnownSymbol target) => SMTString -> MI target SMTString 
-toMIPar input = undefined 
-
-toMI :: forall (target :: Symbol). (KnownSymbol target) => SMTString -> MI target SMTString 
-toMI input = if isNullString input then mempty else  MI input (makeIndices input (fromString (symbolVal (Proxy :: Proxy target))) 0 (stringLen input - 1))
-
-getIndex :: forall (target :: Symbol).  MI target SMTString -> List Int 
-getIndex (MI _ i) = i 
-
-clone :: Int -> [a] -> [a]
-clone i xs | i <= 0 = [] 
-clone 1 xs = xs 
-clone n xs = xs ++ clone (n-1) xs
-
-mconcat :: forall (target :: Symbol). (KnownSymbol target) => [MI target SMTString] -> MI target SMTString
-mconcat []       = mempty 
-mconcat [x]      = x 
-mconcat [x1, x2] = mappend x1 x2 
-mconcat (x:xs)   = mappend x (mconcat xs)
-
-
--- | Indexing Structure Definition 
-
--- Structure that defines valid indeces of a type level target 
--- symbol in a value level string
-
-data MI (target :: Symbol) s where 
-  MI :: SMTString        -- input string
-     -> (List Int)      -- valid indeces of target in input
-     -> MI target s
-  deriving (Show)
-
-{-@ data MI target s 
-  = MI { input :: SMTString
-       , idxes   :: List Int 
-       } @-}
-
-
-{- data MI target s 
-  = MI { input :: SMTString
-       , List :: List (GoodIndex input target)
-       } @-}
-
-
-{-@ measure indixesMI @-}
-indixesMI (MI _ is) = is 
-{-@ measure inputMI @-}
-inputMI (MI i _) = i 
-
-
-
-{-@ type GoodIndex Input Target 
-  = {i:Int |  IsGoodIndex Input Target i}
-  @-}
-
-{-@ type GoodIndexTwo Input Input2 Target 
-  = {i:Int |  IsGoodIndex Input Target i && IsGoodIndex (concatString Input Input2) Target i }
-  @-}
-
-{-@ predicate IsGoodIndex Input Target I
-  =  (subString Input I (stringLen Target)  == Target)
-  && (I + stringLen Target <= stringLen Input)
-  && (0 <= I)
-  @-}
-
-
--- | Monoid methods 
-
-{-@ reflect mempty @-}
-mempty :: forall (target :: Symbol). MI target SMTString
-mempty = MI stringEmp N
-
-{-@ reflect mappend @-}
-mappend :: forall (target :: Symbol).  (KnownSymbol target) => MI target SMTString -> MI target SMTString -> MI target SMTString
-mappend (MI i1 is1) (MI i2 is2)
-  = MI (concatString i1 i2) -- (mappendMakeIndixes i1 i2 (fromString (symbolVal (Proxy :: Proxy target))) is1 is2)
-    ((is1 
-        `append` 
-      makeNewIndices i1 i2 (fromString (symbolVal (Proxy :: Proxy target))))
-        `append` 
-      map (shift (stringLen i1)) is2)            
- 
-
--------------------------------------------------------------------------------
---------------- PROOFS  -------------------------------------------------------
--------------------------------------------------------------------------------
-
-mempty_left :: forall (target :: Symbol). (KnownSymbol target) => MI target SMTString -> Proof
-{-@ mempty_left :: xs:MI target SMTString -> {mappend xs mempty == xs } @-}
-mempty_left (MI i1 is1)
-  =   mappend (MI i1 is1) (mempty :: MI target SMTString)
-  ==. mappend (MI i1 is1) (MI stringEmp N) 
-  ==. MI (concatString i1 stringEmp)  
-       (is1 `append` map (shift (stringLen i1)) N
-            `append` makeNewIndices i1 stringEmp (fromString (symbolVal (Proxy :: Proxy target))))
-  ==. MI (concatString i1 stringEmp)  
-       ((is1 `append` N)
-            `append` makeNewIndices i1 stringEmp (fromString (symbolVal (Proxy :: Proxy target))))
-  ==. MI (concatString i1 stringEmp)  
-       (is1 `append` makeNewIndices i1 stringEmp (fromString (symbolVal (Proxy :: Proxy target))))
-      ? appendEmp is1 
-  ==. MI (concatString i1 stringEmp)  
-       (is1 `append` N) 
-      ? makeNewIndicesNullLeft i1 (fromString (symbolVal (Proxy :: Proxy target)))
-  ==. MI (concatString i1 stringEmp) is1 
-      ? appendEmp is1 
-  ==. MI i1 is1 
-      ? concatStringNeutral i1 
-  *** QED 
-
-
-
-
-
-mempty_right :: forall (target :: Symbol). (KnownSymbol target) => MI target SMTString -> Proof
-{-@ mempty_right :: xs:MI target SMTString -> {mappend mempty xs == xs } @-}
-mempty_right (MI i is)
-  =   mappend (mempty :: MI target SMTString) (MI i is) 
-  ==. mappend (MI stringEmp N) (MI i is) 
-  ==. MI (concatString stringEmp i)  
-       (N `append` makeNewIndices stringEmp i (fromString (symbolVal (Proxy :: Proxy target)))
-               `append` map (shift (stringLen stringEmp)) is)
-  ==. MI (concatString stringEmp i)  
-       ( makeNewIndices stringEmp i (fromString (symbolVal (Proxy :: Proxy target)))
-        `append`
-         map (shift (stringLen stringEmp)) is)
-  ==. MI (concatString stringEmp i)  
-       ( makeNewIndices stringEmp i (fromString (symbolVal (Proxy :: Proxy target)))
-         `append` 
-         map (shift 0) is)
-  ==. MI (concatString stringEmp i)  
-       (makeNewIndices stringEmp i (fromString (symbolVal (Proxy :: Proxy target)))
-        `append` 
-        is)
-       ? mapShiftZero is 
-  ==. MI (concatString stringEmp i)  
-       (N `append` is) 
-      ? makeNewIndicesNullRight i (fromString (symbolVal (Proxy :: Proxy target)))
-  ==. MI (concatString stringEmp i) is 
-  ==. MI i is 
-      ? concatStringNeutralRight i
-  *** QED 
-
-{-@ mappend_assoc 
-  :: x:MI target SMTString -> y:MI target SMTString -> z:MI target SMTString
-  -> {v:Proof | mappend x (mappend y z) = mappend (mappend x y) z}
-  @-}
-mappend_assoc 
-     :: forall (target :: Symbol). (KnownSymbol target) 
-     => MI target SMTString ->  MI target SMTString ->  MI target SMTString -> Proof
-mappend_assoc x@(MI xi xis) y@(MI yi yis) z@(MI zi zis)
-  | stringLen (fromString (symbolVal (Proxy :: Proxy target))) <= stringLen yi 
-  =   mappend x (mappend y z)
-  ==. mappend (MI xi xis) (mappend (MI yi yis) (MI zi zis))
-  ==. mappend (MI xi xis) 
-              (MI (concatString yi zi)  
-                  ((yis 
-                    `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                    `append` map (shift (stringLen yi)) zis))
-  ==. MI (concatString xi (concatString yi zi))  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  map (shift (stringLen xi)) 
-                  ((yis 
-                    `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                    `append` map (shift (stringLen yi)) zis)
-              )
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  map (shift (stringLen xi)) 
-                  ((yis 
-                    `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                    `append` map (shift (stringLen yi)) zis)
-              )
-      ? concatStringAssoc xi yi zi 
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  (
-                    (map (shift (stringLen xi)) (yis 
-                    `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target)))))
-                    `append` 
-                    map (shift (stringLen xi)) (map (shift (stringLen yi)) zis))
-              )
-      ? map_append (shift (stringLen xi)) 
-                   (yis `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target)))) 
-                   (map (shift (stringLen yi)) zis)
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  (
-                    (map (shift (stringLen xi)) yis 
-                    `append` (map (shift (stringLen xi)) (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))))
-                    `append` 
-                    map (shift (stringLen xi)) (map (shift (stringLen yi)) zis))
-              )
-      ? map_append (shift (stringLen xi)) yis (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  (
-                    (map (shift (stringLen xi)) yis 
-                    `append` (map (shift (stringLen xi)) (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))))
-                    `append` 
-                    map (shift (stringLen (concatString xi yi))) zis)
-              )
-      ? map_len_fusion xi yi zis 
--- ((x1~x2) ~ ((x3~x4) ~ x5))
--- == 
---   ((((x1~x2) ~x3) ~x4) ~x5
-  ==. MI (concatString (concatString xi yi) zi)
-         (((( xis 
-               `append` 
-              makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))                      `append` map (shift (stringLen xi)) yis)
-               `append` 
-              map (shift (stringLen xi)) yis)
-               `append`
-              map (shift (stringLen (concatString xi yi))) zis)
-
-      ? appendReorder xis
-                      (makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-                      (map (shift (stringLen xi)) yis)
-                      (map (shift (stringLen xi)) (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target)))))
-                      (map (shift (stringLen (concatString xi yi))) zis)
--- ((((x1 ~ x2) ~ x3) ~ x4) ~ x5)
--- 
--- ((((x1 ~ x2) ~ x3) ~ x4) ~ x5)
-
-  ==. MI (concatString (concatString xi yi) zi)
-         (((( xis 
-               `append` 
-              makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-              map (shift (stringLen xi)) yis)
-               `append`
-              makeNewIndices (concatString xi yi) zi (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-              map (shift (stringLen (concatString xi yi))) zis 
-          )
-      ? shiftIndexes xi yi zi (fromString (symbolVal (Proxy :: Proxy target)))
-  ==. mappend (MI (concatString xi yi)  
-                  ( (xis `append` makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-                       `append` map (shift (stringLen xi)) yis
-                  )
-              ) (MI zi zis)
-  ==. mappend (mappend (MI xi xis) (MI yi yis)) (MI zi zis)
-  *** QED 
-
-
-
-mappend_assoc x@(MI xi xis) y@(MI yi yis) z@(MI zi zis)
-  | stringLen yi < stringLen (fromString (symbolVal (Proxy :: Proxy target))) 
-  =   mappend x (mappend y z)
-  ==. mappend (MI xi xis) (mappend (MI yi yis) (MI zi zis))
-  ==. mappend (MI xi xis) 
-              (MI (concatString yi zi)  
-                  ((yis 
-                    `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                    `append` map (shift (stringLen yi)) zis))
-  ==. MI (concatString xi (concatString yi zi))  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  map (shift (stringLen xi)) 
-                  ((yis 
-                    `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                    `append` map (shift (stringLen yi)) zis)
-              )
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  map (shift (stringLen xi)) 
-                  ((yis 
-                    `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                    `append` map (shift (stringLen yi)) zis)
-              )
-      ? concatStringAssoc xi yi zi 
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  map (shift (stringLen xi)) 
-                  ((N 
-                    `append` makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                    `append` map (shift (stringLen yi)) zis)
-              )
-        ? emptyIndexes y (assumeGoodIndex yi (fromString (symbolVal (Proxy :: Proxy target))) yis)
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  map (shift (stringLen xi)) 
-                  (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target)))
-                    `append` map (shift (stringLen yi)) zis)
-              )
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                  `append` map (shift (stringLen xi)) (map (shift (stringLen yi)) zis))
-              )
-      ? map_append (shift (stringLen xi)) 
-                   (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target)))) 
-                   (map (shift (stringLen yi)) zis)
-
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-               `append` 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target))))
-                  `append` map (shift (stringLen xi)) (map (shift (stringLen yi)) zis))
-              )
-      ? map_len_fusion xi yi zis 
--- ((x1~x2) ~ (x3~x4))
--- == 
--- (x1 ~ (x2~x3)) ~ x4
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               (makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target)))
-               `append` 
-                map (shift (stringLen xi)) (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target)))))
-                  `append` map (shift (stringLen xi)) (map (shift (stringLen yi)) zis))
-              )
-      ? appendGroupNew xis
-                       (makeNewIndices xi (concatString yi zi) (fromString (symbolVal (Proxy :: Proxy target))))
-                       (map (shift (stringLen xi)) (makeNewIndices yi zi (fromString (symbolVal (Proxy :: Proxy target)))))
-                       (map (shift (stringLen xi)) (map (shift (stringLen yi)) zis))
-
-
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               (makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target)))
-               `append` 
-                makeNewIndices (concatString xi yi) zi (fromString (symbolVal (Proxy :: Proxy target))))
-                  `append` map (shift (stringLen xi)) (map (shift (stringLen yi)) zis))
-              )
-      ? shiftNewIndexes xi yi zi (fromString (symbolVal (Proxy :: Proxy target)))
-  ==. MI (concatString (concatString xi yi) zi)  
-         ((xis `append` 
-               (makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target)))
-               `append` 
-                makeNewIndices (concatString xi yi) zi (fromString (symbolVal (Proxy :: Proxy target))))
-                  `append` map (shift (stringLen (concatString xi yi))) zis)
-              )
-      ? map_len_fusion xi yi zis 
-
--- (x1 ~ (x2 ~ x3)) ~ x4 == ((x1 ~ x2) ~ x3) ~ x4
-  ==. MI (concatString (concatString xi yi) zi)  
-         (((xis `append` makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-         `append`
-            (makeNewIndices (concatString xi yi) zi (fromString (symbolVal (Proxy :: Proxy target)))))
-         `append` 
-            map (shift (stringLen (concatString xi yi))) zis )
-      ? appendUnGroupNew xis 
-                         (makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-                         (makeNewIndices (concatString xi yi) zi (fromString (symbolVal (Proxy :: Proxy target))))
-                         (map (shift (stringLen (concatString xi yi))) zis)
-
-  ==. MI (concatString (concatString xi yi) zi)  
-        ((((xis `append` makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-                       `append` N
-                  )
-         `append`
-            (makeNewIndices (concatString xi yi) zi (fromString (symbolVal (Proxy :: Proxy target)))))
-         `append` 
-            map (shift (stringLen (concatString xi yi))) zis )
-          ? appendEmp (xis `append` makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-  ==. MI (concatString (concatString xi yi) zi)  
-        ((((xis `append` makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-                       `append` map (shift (stringLen xi)) N
-                  )
-         `append`
-            (makeNewIndices (concatString xi yi) zi (fromString (symbolVal (Proxy :: Proxy target)))))
-         `append` 
-            map (shift (stringLen (concatString xi yi))) zis )
-  ==. MI (concatString (concatString xi yi) zi)  
-        ((((xis `append` makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-                       `append` map (shift (stringLen xi)) yis
-                  )
-         `append`
-            (makeNewIndices (concatString xi yi) zi (fromString (symbolVal (Proxy :: Proxy target)))))
-         `append` 
-            map (shift (stringLen (concatString xi yi))) zis )
-      ?emptyIndexes y (assumeGoodIndex yi (fromString (symbolVal (Proxy :: Proxy target))) yis)
-  ==. mappend (MI (concatString xi yi)  
-                  ( (xis `append` makeNewIndices xi yi (fromString (symbolVal (Proxy :: Proxy target))))
-                         `append` map (shift (stringLen xi)) yis
-                  )
-              ) (MI zi zis)
-  ==. mappend (mappend (MI xi xis) (MI yi yis)) (MI zi zis)
-  *** QED 
-
--------------------------------------------------------------------------------
------------------- Helper Proofs ----------------------------------------------
--------------------------------------------------------------------------------
-
-
-{-@ assumeGoodIndex :: input:SMTString -> target:SMTString -> is:List Int 
-                    -> {v:List (GoodIndex input target) | v == is} @-} 
-assumeGoodIndex :: SMTString -> SMTString -> List Int -> List Int 
-assumeGoodIndex input target is 
-  = if isJust (areGoodIndexes input target is) then fromJust (areGoodIndexes input target is) else error ""  
-
-
-{-@ areGoodIndexes :: input:SMTString -> target:SMTString -> is:List Int 
-                   -> Maybe ({v:List (GoodIndex input target) | v == is}) @-} 
-areGoodIndexes :: SMTString -> SMTString -> List Int -> Maybe (List Int) 
-areGoodIndexes input target N
-  = Just N
-areGoodIndexes input target (C x xs)
-  | isGoodIndex input target x 
-  = case areGoodIndexes input target xs of 
-       Nothing -> Nothing 
-       Just is -> Just (C x is) 
-  | otherwise
-  = Nothing 
-
-  
-emptyIndexes :: forall (target :: Symbol). (KnownSymbol target) => MI target SMTString -> List Int  -> Proof
-{-@ emptyIndexes :: mi:MI target SMTString
-                 -> is:{List (GoodIndex (inputMI mi) target) | is == indixesMI mi && stringLen (inputMI mi) < stringLen target}
-                 -> { is == N } @-}
-emptyIndexes (MI _ _) N 
-  = trivial 
-emptyIndexes (MI _ _) (C _ _)
-  = trivial 
-
-
-{-@ shiftIndexes
-  :: xi:SMTString 
-  -> yi:SMTString 
-  -> zi:SMTString 
-  -> tg:{SMTString | stringLen tg <= stringLen yi } 
-  -> {  (makeNewIndices xi (concatString yi zi) tg == makeNewIndices xi yi tg)  
-        && 
-        (map (shift (stringLen xi)) (makeNewIndices yi zi tg) == makeNewIndices (concatString xi yi) zi tg)
-     }
-  @-}
-shiftIndexes :: SMTString -> SMTString -> SMTString -> SMTString -> Proof
-shiftIndexes xi yi zi tg = shiftIndexesLeft xi yi zi tg &&& shiftIndexesRight xi yi zi tg 
-
-{-@ reflect chunkString @-}
-{-@ chunkString :: Int -> xs:SMTString -> List (SMTString) / [stringLen xs] @-}
-chunkString :: Int -> SMTString -> List (SMTString)
-chunkString i xs 
-  | i <= 0 
-  = C xs N 
-  | stringLen xs <= i 
-  = C xs N 
-  | otherwise
-  = C (takeString i xs) (chunkString i (dropString i xs))
-
-
-
-{-@ shiftIndexesLeft
-  :: xi:SMTString 
-  -> yi:SMTString 
-  -> zi:SMTString 
-  -> tg:{SMTString | stringLen tg <= stringLen yi } 
-  -> {  makeNewIndices xi (concatString yi zi) tg == makeNewIndices xi yi tg}
-  @-}
-shiftIndexesLeft :: SMTString -> SMTString -> SMTString -> SMTString -> Proof
-shiftIndexesLeft xi yi zi tg
-  | stringLen tg < 2 
-  =   makeNewIndices xi (concatString yi zi) tg 
-  ==. N
-  ==. makeNewIndices xi yi tg 
-  *** QED 
-  | otherwise
-  =   makeNewIndices xi (concatString yi zi) tg 
-  ==. makeIndices (concatString xi (concatString yi zi)) tg 
-                   (maxInt (stringLen xi - (stringLen tg-1)) 0)
-                   (stringLen xi - 1)
-  ==. makeIndices (concatString (concatString xi yi) zi) tg 
-                   (maxInt (stringLen xi - (stringLen tg-1)) 0)
-                   (stringLen xi - 1)
-     ?concatStringAssoc xi yi zi 
-  ==. makeIndices (concatString xi yi) tg 
-                   (maxInt (stringLen xi - (stringLen tg-1)) 0)
-                   (stringLen xi - 1)                
-      ? concatmakeNewIndices (maxInt (stringLen xi - (stringLen tg-1)) 0) (stringLen xi - 1) tg (concatString xi yi) zi 
-  ==. makeNewIndices xi yi tg 
-  *** QED 
-
-
-
-{-@ concatmakeNewIndices
-  :: lo:Nat -> hi:Int
-  -> target: SMTString
-  -> input : {SMTString | hi + stringLen target <= stringLen input } 
-  -> input': SMTString   
-  -> {  makeIndices (concatString input input') target lo hi == makeIndices input target lo hi }
-  / [hi - lo]  @-}
-concatmakeNewIndices :: Int -> Int -> SMTString -> SMTString -> SMTString  -> Proof
-concatmakeNewIndices lo hi target input input'
-  | hi < lo 
-  =   makeIndices input target lo hi
-  ==. N
-  ==. makeIndices (concatString input input') target lo hi 
-  *** QED 
-  | lo == hi, isGoodIndex input target lo
-  =   makeIndices input target lo hi
-  ==. lo `C` N
-  ==. makeIndices (concatString input input') target lo hi 
-      ? isGoodIndexConcatString input input' target lo  
-  *** QED 
-  | lo == hi
-  =  makeIndices input target lo hi 
-  ==. N
-  ==. makeIndices (concatString input input') target lo hi
-      ? isGoodIndexConcatString input input' target lo  
-  *** QED 
-concatmakeNewIndices lo hi target input input' 
-  | isGoodIndex input target lo
-  =   makeIndices input target lo hi
-  ==. lo `C` (makeIndices input target (lo + 1) hi)
-  ==. lo `C` (makeIndices (concatString input input') target (lo + 1) hi)
-       ? concatmakeNewIndices (lo+1) hi target input input'
-  ==. makeIndices  (concatString input input') target lo hi
-      ? isGoodIndexConcatString input input' target lo  
-  *** QED 
-  | otherwise 
-  =   makeIndices input target lo hi
-  ==. makeIndices input target (lo + 1) hi
-  ==. makeIndices (concatString input input') target (lo + 1) hi
-       ? concatmakeNewIndices (lo+1) hi target input input'
-  ==. makeIndices  (concatString input input') target lo hi
-      ? isGoodIndexConcatString input input' target lo  
-  *** QED 
-
-
-
-{-@ isGoodIndexConcatFront 
-  :: input:SMTString -> input':SMTString -> tg:SMTString -> i:Nat
-  -> {((isGoodIndex input tg i) <=> isGoodIndex (concatString input' input) tg (stringLen input' + i) )
-     } @-}
-isGoodIndexConcatFront :: SMTString -> SMTString -> SMTString -> Int -> Proof 
-isGoodIndexConcatFront input input' tg i 
-  =   isGoodIndex input tg i 
-  ==. (subString input i (stringLen tg)  == tg  
-      && i + stringLen tg <= stringLen input 
-      && 0 <= i)  
-  ==. (subString input i (stringLen tg)  == tg  
-      && (stringLen input' + i) + stringLen tg <= stringLen (concatString input' input) 
-      && 0 <= i)  
-  ==. (subString (concatString input' input) (stringLen input' + i) (stringLen tg)  == tg  
-      && (stringLen input' + i) + stringLen tg <= stringLen (concatString input' input) 
-      && 0 <= (stringLen input' + i))  
-      ? (subStringConcatFront input input' (stringLen tg) i *** QED)
-  ==. isGoodIndex (concatString input' input) tg (stringLen input' + i) 
-  *** QED 
-
-
-{-@ isGoodIndexConcatString 
-  :: input:SMTString -> input':SMTString -> tg:SMTString -> i:{Int | i + stringLen tg <= stringLen input }
-  -> {((isGoodIndex input tg i) <=> isGoodIndex (concatString input input') tg i)
-     } @-}
-isGoodIndexConcatString :: SMTString -> SMTString -> SMTString -> Int -> Proof 
-isGoodIndexConcatString input input' tg i 
-  =   isGoodIndex input tg i 
-  ==. (subString input i (stringLen tg)  == tg  
-      && i + stringLen tg <= stringLen input
-      && 0 <= i) 
-  ==. (subString (concatString input input') i (stringLen tg)  == tg  
-      && i + stringLen tg <= stringLen input 
-      && 0 <= i)   
-      ? (subStringConcat input input' (stringLen tg) i *** QED )
-  ==. (subString (concatString input input') i (stringLen tg)  == tg  
-      && i + stringLen tg <= stringLen (concatString input input') 
-      && 0 <= i)   
-      ? (((stringLen input <= stringLen (concatString input input') *** QED ) &&& (lenConcat input input') *** QED))
-  ==. isGoodIndex (concatString input input') tg i 
-  *** QED 
-
-
-
-
-
-
-{-@ shiftIndexesRight
-  :: xi:SMTString 
-  -> yi:SMTString 
-  -> zi:SMTString 
-  -> tg:{SMTString | stringLen tg <= stringLen yi } 
-  -> { map (shift (stringLen xi)) (makeNewIndices yi zi tg) == makeNewIndices (concatString xi yi) zi tg }
-  @-}
-shiftIndexesRight :: SMTString -> SMTString -> SMTString -> SMTString -> Proof
-shiftIndexesRight xi yi zi tg
-  | stringLen tg < 2 
-  =   makeNewIndices (concatString xi yi) zi tg 
-  ==. N
-  ==. map (shift (stringLen xi)) N
-  ==. map (shift (stringLen xi)) (makeNewIndices yi zi tg)
-  *** QED 
-shiftIndexesRight xi yi zi tg
--- NV NV NV 
--- This is suspicious!!! it should require exactly the precondition 
--- || tg || <= || yi || 
---   | stringLen tg  <= stringLen yi + 1 
-  =   makeNewIndices (concatString xi yi) zi tg  
-  ==. makeIndices (concatString (concatString xi yi) zi) tg 
-                   (maxInt (stringLen (concatString xi yi) - (stringLen tg -1)) 0)
-                   (stringLen (concatString xi yi) - 1 )
-  ==. makeIndices (concatString (concatString xi yi) zi) tg 
-                   (stringLen (concatString xi yi) - (stringLen tg -1))
-                   (stringLen (concatString xi yi) - 1 )
-  ==. makeIndices (concatString (concatString xi yi) zi) tg 
-                   (stringLen xi + stringLen yi - stringLen tg + 1)
-                   (stringLen xi + stringLen yi - 1 )
-  ==. makeIndices (concatString xi (concatString yi zi)) tg 
-                   (stringLen xi + stringLen yi - stringLen tg + 1)
-                   (stringLen xi + stringLen yi - 1 )
-       ?concatStringAssoc xi yi zi
-  ==. map (shift (stringLen xi)) (makeIndices (concatString yi zi) tg (stringLen yi - stringLen tg + 1) (stringLen yi - 1))
-       ? shiftIndexesRight' (stringLen yi - stringLen tg + 1)
-                            (stringLen yi - 1)
-                            xi 
-                            (concatString yi zi)
-                            tg 
-  ==. map (shift (stringLen xi)) 
-               (makeIndices (concatString yi zi) tg 
-                             (maxInt (stringLen yi - (stringLen tg -1)) 0)
-                             (stringLen yi -1))
-  ==. map (shift (stringLen xi)) 
-               (makeNewIndices yi zi tg)
-  *** QED
-
-{-@ shiftIndexesRight'
-  :: lo:Nat 
-  -> hi:Int  
-  -> x:SMTString 
-  -> input:SMTString 
-  -> tg:SMTString
-  -> { map (shift (stringLen x)) (makeIndices input tg lo hi) == makeIndices (concatString x input) tg (stringLen x + lo) (stringLen x + hi) }
-  / [if hi < lo then 0 else  hi-lo]
-  @-}
-shiftIndexesRight' :: Int -> Int -> SMTString -> SMTString -> SMTString -> Proof
-shiftIndexesRight' lo hi x input target
-  | hi < lo 
-  =   map (shift (stringLen x)) (makeIndices input target lo hi)
-  ==. map (shift (stringLen x)) N
-  ==. N
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-  *** QED 
-  | lo == hi, isGoodIndex input target lo 
-  =   map (shift (stringLen x)) (makeIndices input target lo hi)
-  ==. map (shift (stringLen x)) (lo `C` N)
-  ==. ((shift (stringLen x)) lo) `C` (map (shift (stringLen x)) N)
-  ==. (stringLen x + lo) `C` N
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-     ? isGoodIndexConcatFront input x target lo  -- ( => IsGoodIndex (concatString x input) target (stringLen x + lo))
-  *** QED 
-  | lo == hi
-  =   map (shift (stringLen x)) (makeIndices input target lo hi)
-  ==. map (shift (stringLen x)) N
-  ==. N
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-     ? (isGoodIndexConcatFront input x target lo *** QED)
-  *** QED 
-
-shiftIndexesRight' lo hi x input target
-  | isGoodIndex input target lo
-  =   map (shift (stringLen x)) (makeIndices input target lo hi)
-  ==. map (shift (stringLen x)) (lo `C`(makeIndices input target (lo+1) hi))
-  ==. (shift (stringLen x) lo) `C` (map (shift (stringLen x)) (makeIndices input target (lo+1) hi))
-  ==. (shift (stringLen x) lo) `C` (makeIndices (concatString x input) target (stringLen x + (lo+1)) (stringLen x + hi))
-      ? shiftIndexesRight' (lo+1) hi x input target
-  ==. (stringLen x + lo) `C` (makeIndices (concatString x input) target (stringLen x + (lo+1)) (stringLen x + hi))
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-     ? (isGoodIndexConcatFront input x target lo *** QED)
-  *** QED 
-  | otherwise
-  =   map (shift (stringLen x)) (makeIndices input target lo hi)
-  ==. map (shift (stringLen x)) (makeIndices input target (lo + 1) hi)
-  ==. makeIndices (concatString x input) target (stringLen x + (lo+1)) (stringLen x + hi)
-      ? shiftIndexesRight' (lo+1) hi x input target
-  ==. makeIndices (concatString x input) target (stringLen x + lo) (stringLen x + hi)
-     ? (isGoodIndexConcatFront input x target lo *** QED)
-  *** QED 
-
-
-{-@ shiftNewIndexes
-  :: xi:SMTString 
-  -> yi:SMTString 
-  -> zi:SMTString 
-  -> tg:{SMTString | stringLen yi < stringLen tg  } 
-  -> {  append (makeNewIndices xi (concatString yi zi) tg) (map (shift (stringLen xi)) (makeNewIndices yi zi tg)) == append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-     }
-  @-}
-shiftNewIndexes :: SMTString -> SMTString -> SMTString -> SMTString -> Proof
-shiftNewIndexes xi yi zi tg 
-  | stringLen tg < 2 
-  =   append (makeNewIndices xi (concatString yi zi) tg) (map (shift (stringLen xi)) (makeNewIndices yi zi tg)) 
-  ==. append N (map (shift (stringLen xi)) N) 
-  ==. map (shift (stringLen xi)) N 
-  ==. N 
-  ==. append N N
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-
-shiftNewIndexes xi yi zi tg 
-  | stringLen xi == 0 
-  =   append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg))
-  ==. append (makeNewIndices stringEmp (concatString yi zi) tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg))
-  ? stringEmpProp xi 
-  ==. append (makeNewIndices stringEmp (concatString yi zi) tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg))
-  ? makeNewIndicesNullRight (concatString yi zi) tg
-  ==. append N
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg))
-  ==. map (shift (stringLen xi)) (makeNewIndices yi zi tg)
-  ==. map (shift 0) (makeNewIndices yi zi tg)
-      ? mapShiftZero (makeNewIndices yi zi tg)
-  ==. makeNewIndices yi zi tg
-  ==. makeNewIndices (concatString xi yi) zi tg
-        ? concatEmpLeft xi yi 
-  ==. append N (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (makeNewIndices stringEmp yi tg) (makeNewIndices (concatString xi yi) zi tg)
-       ? makeNewIndicesNullRight yi tg
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-      ? stringEmpProp xi
-  *** QED 
-  | stringLen yi == 0 
-  =   append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg))
-  ==. append (makeNewIndices xi zi tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg))
-      ? concatEmpLeft yi zi 
-  ==. append (makeNewIndices xi zi tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices stringEmp zi tg))
-      ? stringEmpProp yi
-  ==. append (makeNewIndices xi zi tg) 
-                  (map (shift (stringLen xi)) N)
-      ? makeNewIndicesNullRight zi tg 
-  ==. append (makeNewIndices xi zi tg) 
-                  N
-  ==. makeNewIndices xi zi tg 
-       ?appendEmp (makeNewIndices xi zi tg)
-  ==. makeNewIndices (concatString xi yi) zi tg
-       ? concatEmpRight xi yi
-  ==. append N (makeNewIndices (concatString xi yi) zi tg)
-  ==. append (makeNewIndices xi stringEmp tg) (makeNewIndices (concatString xi yi) zi tg)
-       ? makeNewIndicesNullLeft xi tg 
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-       ? stringEmpProp yi
-  *** QED 
-  | stringLen yi - stringLen tg == -1 
-  = let minidx = maxInt (stringLen xi - stringLen tg + 1) 0 in 
-      append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg)) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shift (stringLen xi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          (maxInt (stringLen yi - stringLen tg +1) 0)
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shift (stringLen xi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          (maxInt 0 0)
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shift (stringLen xi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          0
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString xi (concatString yi zi)) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? shiftIndexesRight' 0 (stringLen yi -1) xi (concatString yi zi) tg 
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? concatStringAssoc xi yi zi 
-
-  ==. append (append 
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi)
-                                (stringLen xi -1))
-
-                                ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) 
-      ? mergeIndixes (concatString (concatString xi yi) zi) tg 
-                     minidx -- maxInt (stringLen xi - stringLen tg + 1) 0
-                     (stringLen xi -1)
-                     (stringLen xi -1)
-  ==. append (append 
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                  N
-
-                                ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) 
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) 
-      ?appendEmp (makeIndices (concatString (concatString xi yi) zi) tg
-                                    minidx
-                                    (stringLen xi + stringLen yi - stringLen tg))
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi -1))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                ((stringLen xi))
-                                (stringLen xi + stringLen yi -1))
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx 
-                                (stringLen (concatString xi yi)  - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1))
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-      ? catIndixes (concatString xi yi) zi tg minidx (stringLen xi-1)
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx 
-                                -- maxInt (stringLen xi - stringLen tg + 1) 0 && 2 <= stringLen tg
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen xi) 0)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen xi + stringLen yi - stringLen tg + 1) 0)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeIndices (concatString xi yi) tg 
-                                (maxInt (stringLen xi - stringLen tg +1) 0)
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-shiftNewIndexes xi yi zi tg 
--- THIS ALWAYS HOLDS 
---   | stringLen yi + 1 <= stringLen tg
-  | 0 <= stringLen xi + stringLen yi - stringLen tg
- --  , 0 < stringLen xi 
-  = let minidx = maxInt (stringLen xi - stringLen tg + 1) 0 in 
-      append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg)) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shift (stringLen xi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          (maxInt (stringLen yi - stringLen tg +1) 0)
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (map (shift (stringLen xi)) 
-                            (makeIndices (concatString yi zi) tg
-                                           0
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString xi (concatString yi zi)) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? shiftIndexesRight' 0 (stringLen yi -1) xi (concatString yi zi) tg 
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? concatStringAssoc xi yi zi 
-
-  ==. append (append 
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg + 1)
-                                (stringLen xi -1))
-
-                                ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) 
-      ? mergeIndixes (concatString (concatString xi yi) zi) tg 
-                     minidx -- maxInt (stringLen xi - stringLen tg + 1) 0
-                     (stringLen xi + stringLen yi - stringLen tg)
-                     (stringLen xi -1)
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx 
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                 (append
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg +1)
-                                (stringLen xi -1))
-
-                                
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1)) )
-      ? appendAssoc
-              (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-              (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg+1)
-                                (stringLen xi -1))
-              (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi)
-                                (stringLen xi + stringLen yi -1))
-
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx
-                                (stringLen xi + stringLen yi - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                ((stringLen xi + stringLen yi - stringLen tg+1))
-                                (stringLen xi + stringLen yi -1))
-     ? mergeIndixes (concatString (concatString xi yi) zi) tg 
-                  ((stringLen xi + stringLen yi - stringLen tg+1))
-                  (stringLen xi-1)
-                  (stringLen xi + stringLen yi -1)
-
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                minidx 
-                                (stringLen (concatString xi yi)  - stringLen tg))
-
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg + 1)
-                                (stringLen xi + stringLen yi -1))
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (stringLen xi + stringLen yi - stringLen tg + 1)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-      ? catIndixes (concatString xi yi) zi tg minidx (stringLen xi-1)
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen xi + stringLen yi - stringLen tg + 1) 0)
-                                (stringLen xi + stringLen yi  - 1)
-                  )
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                minidx
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeIndices (concatString xi yi) tg 
-                                (maxInt (stringLen xi - stringLen tg +1) 0)
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-
---   | stringLen yi + 1 <= stringLen tg
-  | stringLen xi + stringLen yi < stringLen tg
-  =   append (makeNewIndices xi (concatString yi zi) tg) 
-                  (map (shift (stringLen xi)) (makeNewIndices yi zi tg)) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                (maxInt (stringLen xi - stringLen tg + 1) 0)
-                                (stringLen xi -1)) 
-                  (map (shift (stringLen xi)) 
-                            (makeIndices (concatString yi zi) tg
-                                          (maxInt (stringLen yi - stringLen tg +1) 0)
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                0
-                                (stringLen xi -1)) 
-                  (map (shift (stringLen xi)) 
-                            (makeIndices (concatString yi zi) tg
-                                           0
-                                          (stringLen yi -1)
-                            )) 
-  ==. append (makeIndices (concatString xi (concatString yi zi)) tg
-                                0
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString xi (concatString yi zi)) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? shiftIndexesRight' 0 (stringLen yi -1) xi (concatString yi zi) tg 
-  ==. append (makeIndices (concatString (concatString xi yi) zi) tg
-                                0
-                                (stringLen xi -1)) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg 
-                                (stringLen xi) 
-                                (stringLen xi + stringLen yi -1)) 
-      ? concatStringAssoc xi yi zi 
-
-  ==. makeIndices (concatString (concatString xi yi) zi) tg
-                                0
-                                (stringLen (concatString xi yi) - 1)
-      ?mergeIndixes (concatString (concatString xi yi) zi) tg 
-                    0 
-                    (stringLen xi-1) 
-                    (stringLen (concatString xi yi) -1)
-
-  ==. append N 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                0
-                                (stringLen (concatString xi yi) - 1)
-                  )
-
-  ==. append (makeIndices (concatString xi yi) tg 
-                                0
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                0
-                                (stringLen (concatString xi yi) - 1)
-                  )
-      ? smallInput (concatString xi yi) tg 0 (stringLen xi -1)
-  ==. append (makeIndices (concatString xi yi) tg 
-                                (maxInt (stringLen xi - stringLen tg +1) 0)
-                                (stringLen xi-1)
-                  ) 
-                  (makeIndices (concatString (concatString xi yi) zi) tg
-                                (maxInt (stringLen (concatString xi yi) - stringLen tg + 1) 0)
-                                (stringLen (concatString xi yi) - 1)
-                  )
-  ==. append (makeNewIndices xi yi tg) (makeNewIndices (concatString xi yi) zi tg)
-  *** QED 
-
--- NIKI CHECK: Feels have done this proof before 
-maxIndixes 
-  :: SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ maxIndixes 
-  :: input:SMTString -> target:SMTString -> lo:{Nat | stringLen input < lo + stringLen target} -> hi:Int
-  -> {makeIndices input target lo hi = N}
-  / [hi - lo ] @-}
-maxIndixes input target lo hi 
-  | hi < lo 
-  =   makeIndices input target lo hi  
-  ==. N
-  *** QED 
-  | lo == hi, not (isGoodIndex input target lo)
-  =   makeIndices input target lo hi  
-  ==. N
-  *** QED 
-  | not (isGoodIndex input target lo)
-  =   makeIndices input target lo hi
-  ==. N 
-  ==. makeIndices input target (lo+1) hi 
-      ? maxIndixes input target (lo+1) hi 
-  *** QED 
-
-
-mergeIndixes :: SMTString -> SMTString -> Int -> Int -> Int -> Proof
-{-@ mergeIndixes 
-  :: input:SMTString -> target:SMTString -> lo:Nat -> mid:{Int | lo <= mid} -> hi:{Int | mid <= hi} 
-  -> {makeIndices input target lo hi == append (makeIndices input target lo mid) (makeIndices input target (mid+1) hi)} 
-  / [mid] @-}
-mergeIndixes input target lo mid hi 
-  | lo == mid, isGoodIndex input target lo 
-  =   append (makeIndices input target lo mid) (makeIndices input target (mid+1) hi)
-  ==. append (makeIndices input target lo lo)  (makeIndices input target (mid+1) hi)
-  ==. append (lo `C` N)  (makeIndices input target (mid+1) hi)
-  ==. lo  `C` (append N  (makeIndices input target (lo+1) hi))
-  ==. lo  `C` (makeIndices input target (lo+1) hi)
-  ==. makeIndices input target lo hi
-  *** QED 
-  | lo == mid, not (isGoodIndex input target lo)
-  =   append (makeIndices input target lo mid) (makeIndices input target (mid+1) hi)
-  ==. append (makeIndices input target lo lo)  (makeIndices input target (mid+1) hi)
-  ==. append (lo `C` N)  (makeIndices input target (mid+1) hi)
-  ==. (append N  (makeIndices input target (lo+1) hi))
-  ==. makeIndices input target lo hi
-  *** QED 
-  | lo < mid, not (isGoodIndex input target mid)
-  =   makeIndices input target lo hi
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (makeIndices input target mid hi)
-       ? mergeIndixes input target lo (mid-1) hi 
-
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (makeIndices input target (mid+1) hi)
-
-  ==. append (makeIndices input target lo mid) 
-                  (makeIndices input target (mid+1) hi)
-      ?makeNewIndicesBadLast input target lo mid
-  *** QED 
-  | lo < mid, isGoodIndex input target mid
-  =   makeIndices input target lo hi
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (makeIndices input target mid hi)
-       ? mergeIndixes input target lo (mid-1) hi 
-
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (mid `C` makeIndices input target (mid+1) hi)
-
-
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (mid `C` (append N (makeIndices input target (mid+1) hi)))
-
-  ==. append (makeIndices input target lo (mid-1)) 
-                  (append (C mid N) (makeIndices input target (mid+1) hi))
-
-  ==. append (append (makeIndices input target lo (mid-1)) (C mid N)) 
-                  (makeIndices input target (mid+1) hi)
-      ? appendAssoc (makeIndices input target lo (mid-1)) (C mid N) (makeIndices input target (mid+1) hi)
-
-  ==. append (makeIndices input target lo mid) 
-                  (makeIndices input target (mid+1) hi)
-      ?makeNewIndicesGoodLast input target lo mid
-  *** QED 
-
-
-makeNewIndicesGoodLast, makeNewIndicesBadLast 
-  :: SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ makeNewIndicesGoodLast 
-  :: input:SMTString -> target:SMTString -> lo:Nat -> hi:{Int | lo <= hi && (isGoodIndex input target hi)}
-  -> {makeIndices input target lo hi == append (makeIndices input target lo (hi-1)) (C hi N)}
-  / [hi - lo] @-}
-makeNewIndicesGoodLast input target lo hi 
-  | lo == hi, (isGoodIndex input target lo)
-  =   makeIndices input target lo hi 
-  ==. hi `C` N 
-  ==. append (N) (C hi N)
-  ==. append (makeIndices input target lo (hi-1)) (C hi N)
-  *** QED 
-  | not (isGoodIndex input target lo), isGoodIndex input target hi 
-  =   makeIndices input target lo hi 
-  ==. makeIndices input target (lo+1) hi
-  ==. append (makeIndices input target (lo+1) (hi-1)) (C hi N)
-       ? makeNewIndicesGoodLast input target (lo+1) hi  
-  ==. append (makeIndices input target lo (hi-1)) (C hi N)
-  *** QED 
-  | isGoodIndex input target lo, isGoodIndex input target hi
-  =   makeIndices input target lo hi 
-  ==. lo `C` makeIndices input target (lo+1) hi
-  ==. lo `C` (append (makeIndices input target (lo+1) (hi-1)) (C hi N))
-       ? makeNewIndicesGoodLast input target (lo+1) hi  
-  ==. (append (lo `C` makeIndices input target (lo+1) (hi-1)) (C hi N))
-  ==. append (makeIndices input target lo (hi-1)) (C hi N)
-  *** QED 
-
-{-@ makeNewIndicesBadLast 
-  :: input:SMTString -> target:SMTString -> lo:Nat -> hi:{Int | lo <= hi && (not (isGoodIndex input target hi))}
-  -> {makeIndices input target lo hi == makeIndices input target lo (hi-1)}
-  / [hi - lo]
-@-}
--- NV sweet proof 
-makeNewIndicesBadLast input target lo hi 
-  | lo == hi, not (isGoodIndex input target lo)
-  =   makeIndices input target lo (hi-1) 
-  ==. N 
-  ==. makeIndices input target lo hi
-  *** QED 
-  | not (isGoodIndex input target lo), not (isGoodIndex input target hi) 
-  =   makeIndices input target lo hi 
-  ==. makeIndices input target (lo+1) hi
-  ==. makeIndices input target (lo+1) (hi-1)
-       ? makeNewIndicesBadLast input target (lo+1) hi   
-  ==. makeIndices input target lo (hi-1)
-  *** QED 
-  | isGoodIndex input target lo , not (isGoodIndex input target hi) 
-  =   makeIndices input target lo hi 
-  ==. lo `C` makeIndices input target (lo+1) hi
-  ==. lo `C` makeIndices input target (lo+1) (hi-1)
-       ? makeNewIndicesBadLast input target (lo+1) hi   
-  ==. makeIndices input target lo (hi-1)
-  *** QED 
-
-
-catIndixes :: SMTString -> SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ catIndixes 
-     :: input:SMTString -> x:SMTString 
-     -> target:{SMTString | 0 <= stringLen input - stringLen target + 1} 
-     -> lo:{Nat | lo <= stringLen input - stringLen target } 
-     -> hi:{Int | stringLen input - stringLen target <= hi}
-     -> { makeIndices input target lo hi == makeIndices (concatString input x) target lo (stringLen input - stringLen target) }
-  @-}
-catIndixes input x target lo hi 
-  =   makeIndices input target lo hi
-  ==. append (makeIndices input target lo (stringLen input - stringLen target))
-                  (makeIndices input target (stringLen input - stringLen target + 1) hi)
-       ? mergeIndixes input target lo (stringLen input - stringLen target) hi
-  ==. append (makeIndices input target lo (stringLen input - stringLen target))
-                  N
-       ? maxIndixes input target (stringLen input - stringLen target + 1) hi
-  ==. makeIndices input target lo (stringLen input - stringLen target)
-       ? appendEmp (makeIndices input target lo (stringLen input - stringLen target))
-  ==. makeIndices (concatString input x) target lo (stringLen input - stringLen target)
-       ? concatmakeNewIndices lo (stringLen input - stringLen target) target input x 
-  *** QED 
-
-
-
-
-map_len_fusion :: SMTString -> SMTString -> List Int -> Proof
-{-@ map_len_fusion 
-  :: xi:SMTString 
-  -> yi:SMTString 
-  -> zis:List Int 
-  -> {  map (shift (stringLen (concatString xi yi))) zis == map (shift (stringLen xi)) (map (shift (stringLen yi)) zis) 
-     }
-  @-}
-map_len_fusion xi yi N 
-  =   map (shift (stringLen (concatString xi yi))) N
-  ==. N
-  ==. map (shift (stringLen xi)) N
-  ==. map (shift (stringLen xi)) (map (shift (stringLen yi)) N)
-  *** QED  
-map_len_fusion xi yi (C i is)
-  =   map (shift (stringLen (concatString xi yi))) (C i is)
-  ==. shift (stringLen (concatString xi yi)) i `C` map (shift (stringLen (concatString xi yi))) is 
-  ==. shift (stringLen xi + stringLen yi) i `C` map (shift (stringLen (concatString xi yi))) is 
-      ? concatLen xi yi 
-  ==. shift (stringLen xi) (shift (stringLen yi) i) `C` map (shift (stringLen (concatString xi yi))) is 
-      ? concatLen xi yi 
-  ==. shift (stringLen xi) (shift (stringLen yi) i) `C` map (shift (stringLen xi)) (map (shift (stringLen yi)) is)
-      ? map_len_fusion xi yi is 
-  ==. map (shift (stringLen xi)) (shift (stringLen yi) i `C` map (shift (stringLen yi)) is)
-  ==. map (shift (stringLen xi)) (map (shift (stringLen yi)) (i `C` is))
-  *** QED 
-
-smallInput :: SMTString -> SMTString -> Int -> Int -> Proof  
-{-@ smallInput :: input:SMTString -> target:{SMTString | stringLen input < stringLen target } -> lo:Nat -> hi:Int 
-           -> {makeIndices input target lo hi == N } 
-           / [hi -lo]
-  @-}
-smallInput input target lo hi 
-  | hi < lo 
-  = makeIndices input target lo hi 
-  ==. N
-  *** QED  
-  | lo == hi, not (isGoodIndex input target lo)
-  = makeIndices input target lo hi 
-  ==. N
-  *** QED  
-  | not (isGoodIndex input target lo)
-  = makeIndices input target lo hi 
-  ==. makeIndices input target (lo+1) hi
-  ==. N ? smallInput input target (lo+1) hi 
-  *** QED  
-
-
-
--------------------------------------------------------------------------------
-----------  Indexing ----------------------------------------------------------
--------------------------------------------------------------------------------
-
-   
-data List a = N | C a (List a) deriving (Show, Eq)
-{-@ data List [idxlen] a = N | C {idxhd :: a , idxtl :: List a} @-}
-
-
-{-@ measure idxlen @-}
-{-@ idxlen :: List a -> Nat @-} 
-idxlen :: List a -> Int 
-idxlen N = 0 
-idxlen (C _ xs) = 1 + idxlen xs 
-
-{-@ reflect map @-}
-map :: (a -> b) -> List a -> List b
-map _ N = N
-map f (C x xs) = C (f x) (map f xs)
-
-{-@ reflect append @-}
-append :: List a -> List a -> List a 
-append N xs = xs 
-append (C x xs) ys = C x (append xs ys)
-
-{-@ reflect shift @-}
-shift :: Int -> Int -> Int 
-shift x y = x + y 
-
-{-@ symbolVal :: forall n proxy. KnownSymbol n => x:proxy n 
-  -> {v:String | v == n && v == symbolVal x } @-}
-{-@ measure symbolVal :: p n -> String @-}
-
-{-@ reflect makeNewIndices @-}
-{-@ makeNewIndices :: s1:SMTString -> s2:SMTString -> target:SMTString -> List (GoodIndex {concatString s1 s2} target) @-}
-makeNewIndices :: SMTString -> SMTString -> SMTString -> List Int 
-makeNewIndices s1 s2 target
-  | stringLen target < 2 
-  = N
-  | otherwise
-  = makeIndices (concatString s1 s2) target
-                 (maxInt (stringLen s1 - (stringLen target-1)) 0)
-                 (stringLen s1 - 1)
-
-
-{-@ reflect maxInt @-}
-maxInt :: Int -> Int -> Int 
-maxInt x y = if x <= y then y else x 
-
-{-@ reflect makeIndices @-}
-
-makeIndices :: SMTString -> SMTString -> Int -> Int -> List Int 
-{-@ makeIndices :: input:SMTString -> target:SMTString -> lo:{Int | 0 <= lo} -> hi:Int -> List (GoodIndex input target) 
-  / [hi - lo] @-}
-makeIndices input target lo hi 
-  | hi < lo 
-  = N
-  | lo == hi, isGoodIndex input target lo
-  = lo `C` N
-  | lo == hi 
-  = N
-makeIndices input target lo hi 
-  | isGoodIndex input target lo
-  = lo `C` (makeIndices input target (lo + 1) hi)
-  | otherwise 
-  =    makeIndices input target (lo + 1) hi 
-
-{-@ reflect isGoodIndex @-}
-isGoodIndex :: SMTString -> SMTString -> Int -> Bool 
-{-@ isGoodIndex :: input:SMTString -> target:SMTString -> i:Int 
-  -> {b:Bool | Prop b <=> IsGoodIndex input target i} @-}
-isGoodIndex input target i 
-  =  subString input i (stringLen target)  == target  
-  && i + stringLen target <= stringLen input
-  && 0 <= i    
--------------------------------------------------------------------------------
-----------  Indexing Properties -----------------------------------------------
--------------------------------------------------------------------------------
-
-{-@ appendEmp :: xs:List a -> {append xs N = xs } @-} 
-appendEmp :: List a -> Proof 
-appendEmp N 
-  =   append N N
-  ==. N
-  *** QED 
-appendEmp (C x xs) 
-  =   append (C x xs) N
-  ==. C x (append xs N)
-  ==. C x xs ? appendEmp xs 
-  *** QED 
-
-
-{-@ appendAssoc :: x:List a -> y:List a -> z:List a 
-     -> {(append x (append y z)) == (append (append x y) z) } @-}
-appendAssoc :: List a -> List a -> List a -> Proof
-appendAssoc N y z 
-  =   append N (append y z)
-  ==. append y z
-  ==. append (append N y) z
-  *** QED 
-appendAssoc (C x xs) y z
-  =   append (C x xs) (append y z) 
-  ==. C x (append xs (append y z))
-  ==. C x (append (append xs y) z)
-        ? appendAssoc xs y z
-  ==. append (C x (append xs y)) z
-  ==. append (append (C x xs) y) z
-  *** QED 
-
-
-
-
-makeNewIndicesNullRight :: SMTString -> SMTString -> Proof 
-{-@ makeNewIndicesNullRight 
-  :: s1:SMTString 
-  -> t:SMTString 
-  -> {makeNewIndices stringEmp s1 t == N } @-} 
-makeNewIndicesNullRight s t 
-  | stringLen t < 2 
-  = makeNewIndices stringEmp s t  ==. N *** QED 
-makeNewIndicesNullRight s t 
-  =   makeNewIndices stringEmp s t
-  ==. makeIndices (concatString stringEmp s) t
-                   (maxInt (1 + stringLen stringEmp - stringLen t) 0)
-                   (stringLen stringEmp - 1)
-  ==. makeIndices s t
-                   (maxInt (1 - stringLen t) 0)
-                   (-1)
-      ? concatStringNeutralRight s 
-  ==. makeIndices s t 0 (-1)
-  ==. N ? makeNewIndicesNullRightEmp s t  
-  *** QED 
-
-
--- (x1 ~ x2) ~ (x3 ~ x4)
--- == 
--- ((x1 ~ (x2 ~ x3)) ~ x4)
-
-
-appendGroupNew :: List a -> List a -> List a -> List a -> Proof
-{-@ appendGroupNew 
-  :: x1:List a 
-  -> x2:List a 
-  -> x3:List a 
-  -> x4:List a 
-  -> {   (append (append x1 x2) (append x3 x4))
-      == (append (append x1 (append x2 x3)) x4)
-     } @-}
-appendGroupNew x1 x2 x3 x4 
-  =   (append (append x1 x2) (append x3 x4))
-  ==. (append (append (append x1 x2) x3) x4)
-      ? appendAssoc (append x1 x2) x3 x4  
-  ==. (append (append x1 (append x2 x3)) x4)
-      ? appendAssoc x1 x2 x3
-  *** QED 
-
-
-
--- (x1 ~ (x2 ~ x3)) ~ x4 == ((x1 ~ x2) ~ x3) ~ x4
-
-appendUnGroupNew :: List a -> List a -> List a -> List a -> Proof
-{-@ appendUnGroupNew 
-  :: x1:List a 
-  -> x2:List a 
-  -> x3:List a 
-  -> x4:List a 
-  -> {   ((append (append (append x1 x2) x3) x4))
-      == (append (append x1 (append x2 x3)) x4)
-     } @-}
-appendUnGroupNew x1 x2 x3 x4 
-  =   append (append (append x1 x2) x3) x4
-  ==. append (append x1 (append x2 x3)) x4
-      ? appendAssoc x1 x2 x3 
-  *** QED 
-
-
-appendReorder :: List a -> List a -> List a -> List a -> List a -> Proof
-{-@ appendReorder 
-  :: x1:List a 
-  -> x2:List a 
-  -> x3:List a 
-  -> x4:List a 
-  -> x5:List a 
-  -> {   (append (append x1 x2) (append (append x3 x4) x5))
-      == (append (append (append (append x1 x2) x3) x4) x5)
-     } @-}
-appendReorder x1 x2 x3 x4 x5 
-  =   append (append x1 x2) (append (append x3 x4) x5)
-  ==. append (append x1 x2) (append x3 (append x4 x5))
-       ? appendAssoc x3 x4 x5 
-  ==. append (append (append x1 x2) x3) (append x4 x5)
-      ? appendAssoc (append x1 x2) x3 (append x4 x5) 
-  ==. append ((append (append (append x1 x2) x3)) x4) x5
-      ? appendAssoc (append (append x1 x2) x3) x4 x5 
-  *** QED 
-
--- ((x1~x2) ~ ((x3~x4) ~ x5))
--- == 
---   ((((x1~x2) ~x3) ~x4) ~x5
-
-map_append :: (a -> b) -> List a -> List a -> Proof
-{-@ map_append 
-     :: f:(a -> b) -> xs:List a -> ys:List a 
-     -> {map f (append xs ys) == append (map f xs) (map f ys)}
-  @-}
-map_append f N ys 
-  =   map f (append N ys)
-  ==. map f ys 
-  ==. append N (map f ys)
-  ==. append (map f N) (map f ys)
-  *** QED 
-map_append f (C x xs) ys 
-  =   map f (append (C x xs) ys)
-  ==. map f (x `C` (append xs ys))
-  ==. f x `C` (map f (append xs ys))
-  ==. f x `C` (append (map f xs) (map f ys))
-      ? map_append f xs ys 
-  ==. append (f x `C` map f xs) (map f ys)
-  ==. append (map f (x `C` xs)) (map f ys)
-  *** QED 
-
-mapShiftZero :: List Int -> Proof
-{-@ mapShiftZero :: is:List Int -> {map (shift 0) is == is } @-}
-mapShiftZero N 
-  = map (shift 0) N ==. N *** QED
-mapShiftZero (C i is)
-  =   map (shift 0) (C i is)
-  ==. shift 0 i `C` map (shift 0) is 
-  ==. i `C` is ? mapShiftZero is  
-  *** QED 
-
-
-{-@ makeNewIndicesNullRightEmp :: s:SMTString -> t:SMTString -> {makeIndices s t 0 (-1) == N } @-}
-makeNewIndicesNullRightEmp :: SMTString -> SMTString -> Proof
-makeNewIndicesNullRightEmp s t 
-  =   makeIndices s t 0 (-1) 
-  ==. N
-  *** QED 
-
-makeNewIndicesNullLeft :: SMTString -> SMTString -> Proof 
-{-@ makeNewIndicesNullLeft 
-  :: s:SMTString 
-  -> t:SMTString 
-  -> {makeNewIndices s stringEmp t == N } @-} 
-makeNewIndicesNullLeft s t 
-  | stringLen t < 2 
-  = makeNewIndices s stringEmp t ==. N *** QED 
-makeNewIndicesNullLeft  s t 
-  | 1 + stringLen s <= stringLen t
-  =   makeNewIndices s stringEmp t
-  ==. makeIndices (concatString s stringEmp) t
-                   (maxInt (1 + stringLen s - stringLen t)  0)
-                   (stringLen s - 1)
-  ==. makeIndices s t
-                   0
-                   (stringLen s - 1) 
-                   ? concatStringNeutral s
-  ==. makeIndices s t
-                   0
-                   (stringLen s - 1)
-  ==. N ? makeNewIndicesNull1 s t 0 (stringLen s - 1)
-  *** QED 
-makeNewIndicesNullLeft s t 
-  =   makeNewIndices s stringEmp t
-  ==. makeIndices (concatString s stringEmp) t
-                   (maxInt (1 + stringLen s - stringLen t)  0)
-                   (stringLen s - 1)
-  ==. makeIndices (concatString s stringEmp) t
-                   (1 + stringLen s - stringLen t)
-                   (stringLen s - 1)
-  ==. makeIndices s t
-                   (1 + stringLen s - stringLen t)
-                   (stringLen s - 1) ? concatStringNeutral s 
-  ==. N ? makeNewIndicesNull2 s t (1 + stringLen s - stringLen t) (stringLen s - 1)
-  *** QED 
-
-
-makeNewIndicesNull1 :: SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ makeNewIndicesNull1 
-  :: s:SMTString 
-  -> t:{SMTString | 1 + stringLen s <= stringLen t } 
-  -> lo:Nat 
-  -> hi:Int
-  -> {makeIndices s t lo hi == N } / [hi - lo] @-} 
-makeNewIndicesNull1 s1 t lo hi
-  | hi < lo 
-  = makeIndices s1 t lo hi ==. N *** QED 
-  | lo == hi, not (isGoodIndex s1 t lo)
-  = makeIndices s1 t lo hi ==. N *** QED  
-  | not (isGoodIndex s1 t lo)
-  =   makeIndices s1 t lo hi
-  ==. makeIndices s1 t (lo + 1) hi 
-  ==. N ? makeNewIndicesNull1 s1 t (lo+1) hi
-  *** QED 
-
-
-makeNewIndicesNull2 :: SMTString -> SMTString -> Int -> Int -> Proof 
-{-@ makeNewIndicesNull2 
-  :: s:SMTString 
-  -> t:{SMTString | stringLen t < 2 + stringLen s } 
-  -> lo:{Int | -1 <= lo && 1 + stringLen s - stringLen t <= lo  } 
-  -> hi:{Int | lo <= hi}
-  -> {makeIndices s t lo hi == N } / [hi - lo] @-} 
-makeNewIndicesNull2 s1 t lo hi
-  | lo == hi, not (isGoodIndex s1 t lo)
-  = makeIndices s1 t lo hi ==. N *** QED  
-  | not (isGoodIndex s1 t lo)
-  =   makeIndices s1 t lo hi
-  ==. makeIndices s1 t (lo + 1) hi 
-  ==. N ? makeNewIndicesNull2 s1 t (lo+1) hi
-  *** QED 
- 
diff --git a/tests/strings/todo/Boyer_Moore.hs b/tests/strings/todo/Boyer_Moore.hs
deleted file mode 100644
--- a/tests/strings/todo/Boyer_Moore.hs
+++ /dev/null
@@ -1,232 +0,0 @@
-{-@ LIQUID "--higherorder"       @-}
-{-@ LIQUID "--totality"          @-}
-{-@ LIQUID "--exactdc"           @-}
-
-module BoyerMoore where
-
-import Prelude hiding 
-  (foldl, map, fst, snd, scanl, filter, length, compose, endsWith, inits, reverse, take, 
-  Bool(..))
-
-import Proves 
-
-target, input :: L Int 
-target = C 1 (C 2 (C 3 (C 1 (C 2 N))))
-
-input = C 1 (C 2 N) `append` target `append` (C 3 (C 1 (C 2 N)))
-
-
-{-@ reflect map @-}
-{-@ reflect foldl @-}
-{-@ reflect fstV @-}
-{-@ reflect sndV @-}
-{-@ reflect scanl @-}
-{-@ reflect filter @-}
-{-@ reflect endsWith @-}
-{-@ reflect inits @-}
-{-@ reflect reverse @-}
-{-@ reflect append @-}
-{-@ reflect take @-}
-{-@ reflect range @-}
-{-@ reflect fork @-}
-
-matches ws = map length `compose` filter (endsWith ws) `compose` inits
-
-
--- with map f `compose` filter p == map fst `compose` filter snd `compose` map (fork f p)
-
--- matches ws = map fst `compose` filter snd `compose` map (fork length (endsWith ws)) `compose` inits
-
--- with  map (fork length (endsWith ws)) `compose` inits == scanl step (P 0 N)
-
--- matches ws = map fst `compose` filter snd `compose` scanl step (P 0 N)
-
-
-matchesBM ws
-  =  map fstV 
-      `compose`
-     filter ((reverse ws `isSubString`) `compose` sndV) 
-      `compose`
-     scanl step (P 0 N)
-
-
-
-
-
-
--- Prop 16.1
-
-map_filter :: (a -> b) -> (a -> Bool) -> L a -> Proof 
-{-@ map_filter :: f:(a -> b) -> p:(a -> Bool) -> xs:L a 
-    ->  {map fstV (filter sndV (map (fork f p) xs)) == map f (filter p xs) }
-  @-}
-map_filter f p N 
-  =   map fstV (filter sndV (map (fork f p) N))
-  ==. map fstV (filter sndV N)
-  ==. map fstV N
-  ==. N
-  ==. map f N
-  ==. map f (filter p N) 
-  *** QED 
-
-map_filter f p (C x xs) | p x == True 
-  =   map fstV (filter sndV (map (fork f p) (C x xs)))
-  ==. map fstV (filter sndV ((fork f p x) `C` map (fork f p) xs))
-  ==. map fstV (filter sndV ((P (f x) (p x)) `C` map (fork f p) xs))
-       ? (sndV (P (f x) (p x)) ==. p x *** QED )  
-  ==. map fstV (P (f x) (p x) `C` filter sndV (map (fork f p) xs))
-  ==. fstV (P (f x) (p x)) `C` map fstV (filter sndV (map (fork f p) xs))
-  ==. (f x)  `C` map f (filter p xs) ? map_filter f p xs 
-  ==. map f (x `C` filter p xs) 
-  ==. map f (filter p (C x xs)) 
-  *** QED 
-
-map_filter f p (C x xs) 
-  =   map fstV (filter sndV (map (fork f p) (C x xs)))
-  ==. map fstV (filter sndV ((fork f p x) `C` map (fork f p) xs))
-  ==. map fstV (filter sndV ((P (f x) (p x)) `C` map (fork f p) xs))
-       ? (sndV (P (f x) (p x)) ==. p x *** QED )  
-  ==. map fstV (filter sndV (map (fork f p) xs))
-  ==. map f (filter p xs) ? map_filter f p xs 
-  ==. map f (filter p (C x xs)) 
-  *** QED 
-
-
-
-
-{-@ scan_lemma :: op:(b -> a -> b) -> e:b -> xs:L a 
-  -> {map (foldl op e) (inits xs) == scanl op e xs } @-}
-scan_lemma :: (b -> a -> b) -> b -> L a -> Proof
-scan_lemma op e N  
-  =   map (foldl op e) (inits N)
-  ==. map (foldl op e) (map (\i -> take i N) (range 0 (length N)))
-  ==. map (foldl op e) (map (\i -> take i N) (range 0 0))
-  ==. map (foldl op e) (map (\i -> take i N) (C 0 N))
-  ==. map (foldl op e) (take 0 N `C` map (\i -> take i N) N)
-  ==. map (foldl op e) (N `C` N)
-  ==. foldl op e N `C` N
-  ==. scanl op e N 
-  *** QED 
-
-scan_lemma op e xs  
-  =   map (foldl op e) (inits xs)
-  ==. scanl op e xs 
-  *** QED 
-
-step :: P Int (L a) -> a -> P Int (L a)
-step (P n sx) x = P (n+1) (x `C` sx)
-
--- with reverse xs = foldl (flip C) N xs 
-
-
-fork :: (a -> b) -> (a -> c) -> a -> P b c 
-fork f g x = P (f x) (g x) 
-
-fstV :: P a b -> a 
-fstV (P x y) = x 
-
-sndV :: P a b -> b 
-sndV (P x y) = y 
-
-isSubString :: L Int -> L Int -> Bool 
-isSubString (C x xs) (C y ys)
-  | x == y 
-  = isSubString xs ys 
-  | otherwise 
-  = False 
-isSubString N _ 
-  = True 
-isSubString _ _ 
-  = False  
-
-compose :: (b -> c) -> (a -> b) -> a -> c
-compose f g x = f (g x)
-
-
-{-@ endsWith :: L Int -> xs:L Int -> Bool / [length xs] @-}
-endsWith :: L Int -> L Int -> Bool 
-endsWith N        N = True 
-endsWith N  (C _ _) = False
-endsWith (C _ _)  N = False
-endsWith (C x xs) (C y ys)
-  | x == y 
-  = endsWith xs ys 
-  | otherwise 
-  = endsWith (C x xs) ys 
-
-
-foldl :: (b -> a -> b) -> b -> L a -> b 
-foldl f b N        = b 
-foldl f b (C x xs) = foldl f (f b x) xs
-
-
-inits :: L a -> L (L a)
-inits xs = map f rng -- (`take` xs) (range 0 (length xs))
-  where
-    {-@ rng :: L {v:Nat | v <= length xs} @-}
-    rng = range 0 (length xs)
-    {-@ f :: i:{Nat | i <= length xs} -> L a @-}
-    f i = take i xs
-
-{-@ range :: i:Nat -> j:{Nat | i <= j} 
-          -> L {v:Nat | i <= v && v <= j} / [j - i] 
-  @-}
-range :: Int -> Int -> L Int 
-range i j 
-  | i == j 
-  = C i N 
-  | i <= j 
-  = C i (range (i+1) j)
-  | otherwise
-  = N
-
-{-@ measure length @-}
-{-@ length :: L a -> Nat @-} 
-length :: L a -> Int 
-length N        = 0 
-length (C _ xs) = 1 + length xs
-
-{-@ take :: i:Nat -> {v:L a | i <= length v} -> L a @-} 
-take :: Int -> L a -> L a 
-take i N        = N 
-take i (C x xs) = if i == 0 then N else x `C` take (i-1) xs 
-
-filter :: (a -> Bool) -> L a -> L a 
-filter _ N = N 
-filter p (C x xs)
-  | p x == True 
-  = x `C` filter p xs 
-  | otherwise
-  = filter p xs 
-
-reverse :: L a -> L a 
-reverse N = N 
-reverse (C x xs) = reverse xs `append` C x N 
-
-append :: L a -> L a -> L a 
-append N        ys = ys 
-append (C x xs) ys = C x (append xs ys)
-
-map :: (a -> b) -> L a -> L b 
-map _ N = N 
-map f (C x xs) = f x `C` map f xs 
-
-
-scanl :: (b -> a -> b) -> b -> L a -> L b
-scanl f q ls  = q `C` (case ls of
-                         N      -> N
-                         C x xs -> scanl f (f q x) xs)
-
-
-{-@ data P a b = P {pFs :: a, pSnd :: b} @-} 
-
-{-@ data Bool = True | False @-} 
-data Bool = True | False 
-  deriving (Show, Eq)
-
-data P a b = P a b 
-  deriving (Show)
-
-{-@ data L [length] a = N | C {lhead :: a, lCons :: (L a)} @-}
-data L a = N | C a (L a)
-  deriving (Show)
diff --git a/tests/strings/todo/StringIndexing.hs b/tests/strings/todo/StringIndexing.hs
deleted file mode 100644
--- a/tests/strings/todo/StringIndexing.hs
+++ /dev/null
@@ -1,89 +0,0 @@
-{-# LANGUAGE KindSignatures      #-}
-{-# LANGUAGE DataKinds           #-}
-{-# LANGUAGE OverloadedStrings   #-}
-{-# LANGUAGE RankNTypes          #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE GADTs               #-}
-{-@ LIQUID "--totality"        @-}
-
-module StringIndexing where
-
-
-import GHC.TypeLits
-import Data.String 
-
-import Data.Proxy 
--- Structure that defines valid indeces of a type level target 
--- symbol in a value level string
-
-data MI (tagret :: Symbol) s where 
-  MI :: IsString s => s        -- input string
-                   -> [Int]    -- valid indeces of target in input
-                   -> MI target s
-
-{-@ MI :: input:s 
-       -> [{i:Int |	 str.substr input i (str.len target)  == target }]
-       -> MI s @-}
-
--- STEP 1:    Verification of valid structures
--- CHALLENGE: String interepretations from SMT 
-
-
--- THESE SHOULD BE SAFE 
-misafe1 :: MI "cat" String 
-misafe1 = MI "catdogcatsdots" []
-
-misafe2 :: MI "cat" String
-misafe2 = MI "catdogcatsdots" [1]
-
-misafe3 :: MI "cat" String
-misafe3 = MI "catdogcatsdots" [1, 7]
-
-misafe4 :: MI "cat" String
-misafe4 = MI "catdogcatsdots" [7, 1]
-
-misafe5 :: MI "cat" String
-misafe5 = MI "catdogcatsdots" [7]
-
-
--- THIS SHOULD BE UNSAFE 
-miunsafe :: MI "dog" String
-miunsafe = MI "catdogcatsdots" [1]
-
-
--- STEP 2: Verify that mempty and mappend satisfy the invariants 
-{-@ axiomatize mempty @-}
-mempty :: forall (target :: Symbol). MI target String
-mempty = MI "" []
-
-{-@ axiomatize mappend @-}
-mappend :: forall (target :: Symbol). (KnownSymbol target) => MI target String -> MI target String -> MI target String
-mappend (MI i1 is1) (MI i2 is2)
-  = MI input (is1 ++ (map (+ length i1) is2) ++ is)
-  where 
-  	is     = filter (\i -> substr input i len  == target) [(len1 - len) .. (len1 + len)]
-  	input  = i1 ++ i2 
-  	len1   = length i1 
-  	len    = length target 
-  	target = symbolVal (Proxy :: Proxy target)
-
-
-substr :: IsString s => s -> Int -> Int -> s 
-substr = undefined 
-
-
--- STEP 3: Verify that mempty and mappend satisfy the monoid laws
-
-mempty_left      :: forall (target :: Symbol) s. IsString s => MI target s -> ()
-{-@ mempty_left  :: x:MI target s -> {mappend mempty x == x } @-}
-mempty_left _    = undefined 
-
-
-mempty_right     :: forall (target :: Symbol) s. IsString s => MI target s -> ()
-{-@ mempty_right :: x:MI target s -> {mappend x mempty == x } @-}
-mempty_right _   = undefined 
-
-mappend_assoc     :: forall (target :: Symbol) s. IsString s => MI target s -> MI target s -> MI target s -> ()
-{-@ mappend_assoc :: x:MI target s -> y:MI target s -> z:MI target s 
-                  -> {mappend x (mappend y z) == mappend (mappend x y) z } @-}
-mappend_assoc _ _ _ = undefined 
diff --git a/tests/theorem_proving/T1106.hs b/tests/theorem_proving/T1106.hs
deleted file mode 100644
--- a/tests/theorem_proving/T1106.hs
+++ /dev/null
@@ -1,48 +0,0 @@
-{-@ LIQUID "--exactdc"     @-}
-{-@ LIQUID "--higherorder" @-}
-
-module T1106 where
-
-import T1106Defs 
-
-import Language.Haskell.Liquid.ProofCombinators
-
-data Foo a = Foo a 
-  deriving Eq
-
-{-@ reflect mapFoo @-}
-mapFoo :: (b1 -> b2) -> Foo b1 -> Foo b2
-mapFoo f (Foo b) = Foo (f b)
-
-thmRef :: (Eq b) => b -> c -> (c -> b -> b) -> ()
-{-@ 
-thmRef :: b:b -> c:c 
-    -> f:(c -> b -> b) 
-    -> {mapFoo (bar c) (Foo b) = Foo (bar c b)}
-  @-}
-thmRef b c f
-  = mapFoo (bar c) (Foo b) == Foo (bar c b) *** QED 
-
-thmVar :: (Eq b) => b -> c -> (c -> b -> b) -> ()
-{-@ 
-thmVar :: b:b -> c:c 
-    -> f:(c -> b -> b) 
-    -> {mapFoo (f c) (Foo b) = Foo (f c b)}
-  @-}
-thmVar b c f
-  = mapFoo (f c) (Foo b) == Foo (f c b) *** QED 
-
-thmImp :: (Eq b) => b -> c -> (c -> b -> b) -> ()
-{-@ 
-thmImp :: b:b -> c:c 
-    -> f:(c -> b -> b) 
-    -> {mapFoo (foo c) (Foo b) = Foo (foo c b)}
-  @-}
-thmImp b c f
-  = mapFoo (foo c) (Foo b) == Foo (foo c b) *** QED 
-
-
-
-
-{-@reflect bar @-}
-bar c t = t  
diff --git a/tests/theorem_proving/T1106Defs.hs b/tests/theorem_proving/T1106Defs.hs
deleted file mode 100644
--- a/tests/theorem_proving/T1106Defs.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-{-@ LIQUID "--higherorder" @-}
-
-module T1106Defs where
-
-
-{-@reflect foo @-}
-foo c t = t
diff --git a/tests/tmp/Class2.hs b/tests/tmp/Class2.hs
deleted file mode 100644
--- a/tests/tmp/Class2.hs
+++ /dev/null
@@ -1,86 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-{-@ LIQUID "--no-termination" @-}
-module Class () where
-
-import Language.Haskell.Liquid.Prelude
-import Prelude hiding (sum, length, (!!), Functor(..))
-
-{- qualif Size(v:Int, xs:a): v = size xs @-}
-{- qualif Size(v:Int, xs:MList a): v = size xs @-}
-
-data MList a = Nil | Cons a (MList a)
-
-{-@ (!!) :: xs:MList a -> {v:Nat | v < sz xs} -> a @-}
-(!!) :: MList a -> Int -> a
-(Cons x _)  !! 0 = x
-(Cons _ xs) !! i = xs !! (i - 1)
-
-{-@ class measure sz :: forall a. a -> Int  @-}
-
-{-@ class Sized s where
-      size :: forall a. x:s a -> {v:Nat | v = sz x}
-  @-}
-class Sized s where
-  size :: s a -> Int
-
-instance Sized MList where
-  {-@ instance measure sz :: MList a -> Int
-      sz (Nil)       = 0
-      sz (Cons x xs) = 1 + sz xs
-    @-}
-  size = length
-
-{-@ length :: xs:MList a -> {v:Nat | v = sz xs} @-}
-length :: MList a -> Int
-length Nil         = 0
-length (Cons _ xs) = 1 + length xs
-
-{-@ bob :: xs:MList a -> {v:Nat | v = sz xs} @-}
-bob :: MList a -> Int
-bob = length
-
-
-instance Sized [] where
-  {-@ instance measure sz :: [a] -> Int
-      sz ([])   = 0
-      sz (x:xs) = 1 + (sz xs)
-    @-}
-  size [] = 0
-  size (_:xs) = 1 + size xs
-
-{-@ class (Sized s) => Indexable s where
-      index :: forall a. x:s a -> {v:Nat | v < sz x} -> a
-  @-}
-class (Sized s) => Indexable s where
-  index :: s a -> Int -> a
-
-
-
-instance Indexable MList where
-  index = (!!)
-
-{-@ sum :: Indexable s => s Int -> Int @-}
-sum :: Indexable s => s Int -> Int
-sum xs = go n 0
-  where
-    n = size xs
-    go (d::Int) i
-      | i < n     = index xs i + go (d-1) (i+1)
-      | otherwise = 0
-
-
-{-@ sumMList :: MList Int -> Int @-}
-sumMList :: MList Int -> Int
-sumMList xs = go max 0
-  where
-    max = size xs
-    go (d::Int) i
-      | i < max   = index xs i + go (d-1) (i+1)
-      | otherwise = 0
-
-
-{-@ mlist3 :: {v:MList Int | sz v = 3}  @-}
-mlist3 :: MList Int
-mlist3 = 1 `Cons` (2 `Cons` (3 `Cons` Nil))
-
-foo = liquidAssert $ size (Cons 1 Nil) == size [1]
diff --git a/tests/tmp/Class3.hs b/tests/tmp/Class3.hs
deleted file mode 100644
--- a/tests/tmp/Class3.hs
+++ /dev/null
@@ -1,16 +0,0 @@
--- | LH refuses to parse the `allPos` measure
-
-module Class3 where
-
-{-@ class Pos s where
-      allPos :: x:s Int -> {v:Bool | Prop v <=> allPos x}
-  @-}
-class Pos s where
-  allPos :: s Int -> Bool
-
-instance Pos [] where
-  {-@ instance measure allPos :: [Int] -> Bool
-      allPos ([])   = true
-      allPos (x:xs) = ((x > 0) && (allPos xs))          @-}
-  allPos []     = True
-  allPos (x:xs) = (x > 0) && (allPos xs)
diff --git a/tests/tmp/LiquidR.hs b/tests/tmp/LiquidR.hs
deleted file mode 100644
--- a/tests/tmp/LiquidR.hs
+++ /dev/null
@@ -1,328 +0,0 @@
--- The following file includes several refinements that have been
--- commented out, marked with 'UNCOMMENT'. As-is, running LiquidHaskell
--- on this file produces the message:
---    liquid: Prelude.head: empty list
--- The refinemnts marked with UNCOMMENT can be uncommented one-by-one,
--- each producing a different error.
-
-{-# LANGUAGE
-      Rank2Types,
-      TypeFamilies,
-      ExplicitForAll,
-      FlexibleInstances,
-      MultiParamTypeClasses,
-      ConstraintKinds,
-      FunctionalDependencies
- #-}
-
-module LiquidR
-  (array,
-   combine,
-   and,
-   add,
-   indexNullary,
-   indexUnary,
-   indexNAry) where
-
-import Prelude ()
--- UNCOMMENT this to avoid 'Not in scope' error
--- Note that `Char` isn't used anywhere in this file.
-import Data.Char
-import Data.Int
-import Data.Bool
-import Data.Ord
-import Data.Maybe
-
-import qualified Mode
-
-unimplemented :: a
-unimplemented = unimplemented
-
-------------------------------------------------------------------------
--- Container Types -----------------------------------------------------
-------------------------------------------------------------------------
-
-type Vector a = [a]
-
-data Array a = Array{
-    shape :: [Mode.Numeric],
-    elems :: [a]
-  }
-
-{-@ type ListN a N =
-      {v:[a] | (size v) = N}
-@-}
-
-{-@ measure product :: [Mode.Numeric] -> real
-      product([]) = 1
-      product(x:xs) = (fromJust x) * (product xs)
-@-}
-
-{-@ data Array a = Array{
-      shape :: (NonEmptyList PositiveNumeric),
-      elems :: (ListN a (product shape))
-    }
-@-}
-
-{-@ type NonEmptyList a =
-      {v:[a] | (size v) > 0}
-@-}
-
-{-@ type NonNegativeNumeric =
-      {v:Mode.Numeric |
-        (isJust v) =>
-          (fromJust v) >= 0 }
-@-}
-
-{-@ type PositiveNumeric =
-      {v:Mode.Numeric |
-        (isJust v) =>
-          (fromJust v) > 0 }
-@-}
-
-{-@ measure nonNegativeNumeric :: (Mode.Numeric) -> Bool @-}
-nonNegativeNumeric (Just a)  = a >= 0
-nonNegativeNumeric (Nothing) = True
-
-{-@ measure nonPositiveNumeric :: (Mode.Numeric) -> Bool @-}
-nonPositiveNumeric (Just a)  = a <= 0
-nonPositiveNumeric (Nothing) = True
-
-{-@ type NonPositiveNumeric =
-      {v:Mode.Numeric |
-        (isJust v) =>
-          (fromJust v) >= 0 }
-@-}
-
-{-@ class measure allNonNegative :: (R a) -> Bool @-}
-{-@ instance measure allNonNegative :: (Array a) -> Bool
-  allNonNegative (Array shape elems) = allNonNegative elems
-@-}
-
-{-@ instance measure allNonNegative :: [(Mode.Numeric)] -> Bool @-}
-allNonNegative ([])   = True
-allNonNegative (y:ys) = (nonNegativeNumeric y) && (allNonNegative ys)
-
-{-@ class measure allNonPositive :: (R a) -> Bool @-}
-{-@ instance measure allNonPositive :: (Array a) -> Bool
-  allNonPositive (Array shape elems) = allNonPositive elems
-@-}
-{-@ instance measure allNonPositive :: [(Mode.Numeric)] -> Bool @-}
-allNonPositive ([])   = True
-allNonPositive (y:ys) = (nonPositiveNumeric y) && (allNonPositive ys)
-
-{-@ instance measure size :: [a] -> Int
-    size ([])   = 0
-    size (x:xs) = 1 + (size xs)
-@-}
-
-{-@ instance measure size :: (Array a) -> Int
-  size (Array shape elems)   = len elems
-@-}
-
-class R m where
-  type Elem m
-  length :: m -> Int
-  length = unimplemented
-
-instance R (Vector a) where
-  type Elem (Vector a) = a
-
-instance R (Array a) where
-  type Elem (Array a) = a
-
-type ROf c m = (R c, Elem c ~ m)
-
-{-@ type RNonEmpty t m =
-      {v:(R t m) | (size v) > 0}
-  @-}
-
-{-@ type RNonEmptyOf t m =
-      {v:(ROf t m) | (size v) > 0}
-@-}
-
-
-------------------------------------------------------------------------
--- Container Constructors ----------------------------------------------
-------------------------------------------------------------------------
-
--- Constructor for vectors
-{-@ measure lsize :: [[a]] -> Int
-    lsize ([])   = 0
-    lsize (x:xs) = (size x) + (lsize xs)
-@-}
-
-{-@ combine ::
-     ys:([[_]]) ->
-     {v:([_]) | (size v) = (lsize ys)}
-@-}
-combine :: [[a]] ->  [a]
-combine = unimplemented
-
--- Constructor for arrays
-{- array :: forall t u m.(R t, R u, Mode.Mode m) =>
-    a:(RNonEmptyOf t NonNegativeNumeric) => t ->
-    b:(RNonEmptyOf u m)                  => u ->
-      (Array m)
-@-}
-array :: forall a b m.(R a, R b, Mode.Mode m) =>
-            (ROf b Mode.Numeric) => b
-         -> (ROf a m) => a
-         -> (Array m)
-array shape elems = unimplemented
-
-
--- x = array [Just 2.0 :: Mode.Numeric] [Just 2.0 :: Mode.Numeric]
-
-------------------------------------------------------------------------
--- Subscript -----------------------------------------------------------
-------------------------------------------------------------------------
--- UNCOMMENT; Produces error:
--- > Error: Bad Type Specification
--- > LiquidR.indexNullary :: (R a, Mode b) =>
--- >                         ((R a), (~ (Elem a) b)) -> a -> {VV : [b] | size a == size VV}
--- >     Sort Error in Refinement: {VV : [m_a17t] | size a == size VV}
--- >     Unbound Symbol a
--- > Perhaps you meant: VV
-
-{- indexNullary :: forall t m.(R t, Mode.Mode m) =>
-      a:(ROf t m) => t ->
-     {b:(Vector m) | (size a) = (size b) }
-@-}
-indexNullary :: forall t m.(R t, Mode.Mode m) =>
-  (ROf t m) => t -> (Vector m)
-indexNullary _ = unimplemented
-
-
-class (R a, R b, Mode.Mode c, (Elem b) ~ c)
-    => UnarySubscript a b c where
-  indexUnary :: a -> b -> (Vector (Elem a))
-  indexUnary = unimplemented
-
--- UNCOMMENT; produces error:
--- > liquid: <no location info>: Error: Uh oh.
--- >     This should never happen! If you are seeing this message,
--- > please submit a bug report at
--- > https://github.com/ucsd-progsys/liquidhaskell/issues
--- > with this message and the source file that caused this error.
--- >
--- > RefType.toType cannot handle: {v##0 : _ | allNonNegative a
--- >             || allNonPositive v##0}
-{- instance (R t, R u, _)
-      => UnarySubscript t u (Mode.Numeric) where
-  indexUnary ::
-    a:t ->
-    b:{v:_ |
-          (allNonNegative a)
-       || (allNonPositive v)} ->
-   {c:t | if (allNonNegative b)
-          then (size c) == (size b)
-          else if (allNonPositive b)
-          then (size c) <= (size b)
-          else false}
-@-}
-instance (R a, R b, (Elem b) ~ Mode.Numeric)
-    => UnarySubscript a b Mode.Numeric
-
-{- don't know how to say anything meaningful here yet -}
-instance (R a, R b, (Elem b) ~ Mode.Logical)
-    => UnarySubscript a b Mode.Logical
-
-
-class (R a, R b) => NarySubscript a b where
-  indexNAry :: (R c, Elem a ~ Elem c) => a -> [b] -> c
-  indexNAry = unimplemented
-
-instance (Mode.Mode a, R b) => NarySubscript (Array a) b
-
-
-
-------------------------------------------------------------------------
---Binary Operations ----------------------------------------------------
-------------------------------------------------------------------------
-
--- The length of the result of any numeric or logical binary operation
--- should be the length of the longest operand. The length of the
--- longest operand must be a multiple of the length of the shortest
--- operand. If either operand has length 0, the length of the result
--- is 0.
-{-@ predicate ArithmeticResult A B C =
-      if (size A) = 0 || (size B) = 0
-      then (size C) = 0
-      else if (size A) >= (size B)
-           && (size A) mod (size B) = 0
-        then (size C) = (size A)
-      else if (size A) < (size B)
-           && (size B) mod (size A) = 0
-        then (size C) = (size B)
-      else false
-@-}
-
--- UNCOMMENT; (error omitted for brevity)
-{- class (R t, R u, R v) => Addition t u v where
-    add :: a:t ->
-           b:u ->
-          {c:v | ArithmeticResult a b c }
-@-}
-class (R a, R b, R c) => Addition a b c | a b -> c  where
-  add  :: a -> b -> c
-  add  = unimplemented
-
--- Container type of binop result depends on
--- container type of arguments:
---    Vector `op` Vector = Array
---    Vector `op` Array  = Array
---    Array  `op` Vector = Array
---    Array  `op` Array  = Array
-
-instance (Mode.IntoNumeric a, Mode.IntoNumeric b)
-    => Addition (Vector a) (Vector b) (Vector Mode.Numeric)
-
-instance (Mode.IntoNumeric a, Mode.IntoNumeric b)
-    => Addition (Array a) (Vector b) (Array Mode.Numeric)
-
-instance (Mode.IntoNumeric a, Mode.IntoNumeric b)
-    => Addition (Vector a) (Array b) (Array Mode.Numeric)
-
-instance (Mode.IntoNumeric a, Mode.IntoNumeric b)
-    => Addition (Array a) (Array b) (Array Mode.Numeric)
-
--- UNCOMMENT; produces same error as previous class annotation
-{- class (R t, R u, R v) => Conjunction t u v where
-    and :: a:t ->
-           b:u ->
-          {c:v | ArithmeticResult a b c }
-@-}
-class (R a, R b, R c) => Conjunction a b c | a b -> c  where
-  and :: a -> b -> c
-  and = unimplemented
-
--- Alternatively, we can use instance refinements. These produce errors
--- as well, but note that the error changes between one being
--- uncommented vs. multiple being uncommented.
--- UNCOMMENT;
-{-@ instance (Mode.IntoLogical t, Mode.IntoLogical u)
-    => Conjunction (Vector t) (Vector u) (Vector Mode.Logical) where
-    and :: a:(Vector t) ->
-           b:(Vector u) ->
-          {c:(Vector Mode.Logical) | ArithmeticResult a b c }
-@-}
-instance (Mode.IntoLogical a, Mode.IntoLogical b)
-    => Conjunction (Vector a) (Vector b) (Vector Mode.Logical)
--- UNCOMMENT;
-{- instance (Mode.IntoLogical t, Mode.IntoLogical u)
-    => Conjunction (Array t) (Vector u) (Array Mode.Logical) where
-    and :: a:(Array t) ->
-           b:(Vector u) ->
-          {c:(Array Mode.Logical) | ArithmeticResult a b c }
-@-}
-instance (Mode.IntoLogical a, Mode.IntoLogical b)
-    => Conjunction (Array a) (Vector b) (Array Mode.Logical)
-
-instance (Mode.IntoLogical a, Mode.IntoLogical b)
-    => Conjunction (Vector a) (Array b) (Array Mode.Logical)
-
-instance (Mode.IntoLogical a, Mode.IntoLogical b)
-    => Conjunction (Array a) (Array b) (Array Mode.Logical)
-
--- and so on...
diff --git a/tests/tmp/LiquidR2.hs b/tests/tmp/LiquidR2.hs
deleted file mode 100644
--- a/tests/tmp/LiquidR2.hs
+++ /dev/null
@@ -1,150 +0,0 @@
-{-@ LIQUID "--prune-unsorted" @-}
-{-@ LIQUID "--total"          @-}
-
-{-# LANGUAGE TypeSynonymInstances #-}
-{-# LANGUAGE FlexibleInstances    #-}
-{-# LANGUAGE QuasiQuotes          #-}
-
-module LiquidR
-  ( array
-  , combine
-  , indexNullary
-   -- and,
-   -- add,
-   -- indexUnary,
-   -- indexNAry
-  ) where
-
-import Prelude hiding (product, length)
--- import LiquidHaskell
-
---------------------------------------------------------------------------------
--- Basic List Refinements ------------------------------------------------------
---------------------------------------------------------------------------------
-
-{-@ class measure size :: forall a. a -> Int @-}
-
-{-@ instance measure size :: xs:[a] -> Int
-    size []     = 0
-    size (_:xs) = 1 + size xs   @-}
-
-{-@ listLength :: xs:[a] -> {v:Nat | v = size xs} @-}
-listLength :: [a] -> Int
-listLength []     = 0
-listLength (x:xs) = 1 + listLength xs
-
-{-@ type ListN a N = {v:[a] | size v = N} @-}
-{-@ type ListNE a = {v:[a] | size v > 0}  @-}
-{-@ type Pos      = {v:Int | 0 < v}       @-}
-
--- Generic R Container Types ---------------------------------------------------
-
-{-@ class R c where
-      index  :: forall a. c a -> Int -> a
-      length :: forall a. me:c a -> {v:Nat | v = size me}
-  @-}
-class R c where
-  index  :: c a -> Int -> a
-  length :: c a -> Int
-
--- A Generic Non-Empty Container -----------------------------------------------
-
-{-@ type RNE c a = {v:c a | 0 < size v} @-}
-
--- Vector Instance -------------------------------------------------------------
-
-newtype Vector a = V [a]
-
-{-@ instance measure size :: Vector a -> Int
-    size (V xs) = size xs
-  @-}
-
-instance R Vector where
-  index  (V xs) i = xs `at` i
-  length (V xs)   = listLength xs
-
-at :: [a] -> Int -> a
-at (x:_) 0  = x
-at (_:xs) n = at xs (n-1)
-at _      _ = undefined
-
--- Arrays ----------------------------------------------------------------------
-
-data Array a = Array {
-    shape :: [Int]
-  , elems :: [a]
-  }
-
-{-@ measure product @-}
-product :: [Int] -> Int
-product []     = 1
-product (x:xs) = x * product xs
-
-{-@ data Array a = Array {
-      shape :: ListNE Pos,
-      elems :: ListN a (product shape)
-    }                                     @-}
-
-instance R Array where
-  index  = undefined
-  length = undefined
-
--- Modes -----------------------------------------------------------------------
-
-class Mode a
-
-type Logical = Maybe Bool
-type Numeric = Maybe Int
-
--- | `Dim` is a refinement of `Numeric` where the values are defined
-
-type Dim = Numeric
-{-@ type Dim = {v:Numeric | isJust v} @-}
-
-instance Mode Logical
-instance Mode Numeric
-
-class (Mode a) => IntoNumeric a where
-  intoNumeric :: a -> Numeric
-
-instance IntoNumeric Numeric where
-  intoNumeric = id
-
-instance IntoNumeric Logical where
-  intoNumeric Nothing = Nothing
-  intoNumeric (Just True)  = Just 1 -- (1.0 :: Double)
-  intoNumeric (Just False) = Just 0 -- (0.0 :: Double)
-
--- Constructor for Arrays ------------------------------------------------------
-
-array :: (R sh, R el, Mode v) => sh Dim -> el v -> Array v
-
-{-@ array :: (R sh, R el, Mode v) => RNE sh Dim -> RNE el v -> Array v @-}
-array _shape _elems = undefined
-
--- IndexNullary ----------------------------------------------------------------
-{-@ type VectorN a N = {v:Vector a | size v = N} @-}
-
-{-@ indexNullary :: (R c) => a:(c m) -> VectorN m (size a) @-}
-indexNullary :: (R c) => c a -> (Vector a)
-indexNullary _ = undefined
-
---------------------------------------------------------------------------------
--- Container Constructors ------------------------------------------------------
---------------------------------------------------------------------------------
-
-{-@ append :: xs:_ -> ys:_ -> ListN _ {size xs + size ys} @-}
-append :: [a] -> [a] -> [a]
-append []     ys = ys
-append (x:xs) ys = x : append xs ys
-
--- Constructor for vectors
-{-@ measure lsize :: [[a]] -> Int
-    lsize []     = 0
-    lsize (x:xs) = size x + lsize xs
-  @-}
-
-{-@ combine :: ys:[[a]] -> ListN a (lsize ys) @-}
-combine :: [[a]] ->  [a]
-combine []       = []
-combine (xs:xss) = append xs (combine xss)
diff --git a/tests/tmp/Mode.hs b/tests/tmp/Mode.hs
deleted file mode 100644
--- a/tests/tmp/Mode.hs
+++ /dev/null
@@ -1,45 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-
-module Mode where
-
-type Logical = Maybe Bool
-type Numeric = Maybe Double
-
-class Mode a
-instance Mode Logical
-instance Mode Numeric
-
-
-class (Mode a) => IntoNumeric a where
-  intoNumeric :: a -> Numeric
-
-instance IntoNumeric Numeric where
-  intoNumeric = id
-
-instance IntoNumeric Logical where
-  intoNumeric Nothing = Nothing
-  intoNumeric (Just True)  = Just (1.0 :: Double)
-  intoNumeric (Just False) = Just (0.0 :: Double)
-
-
-class (Mode a) => IntoLogical a where
-  intoLogical :: a -> Logical
-
-instance IntoLogical Logical where
-  intoLogical = id
-
-instance IntoLogical Numeric where
-  intoLogical Nothing    = Nothing
-  intoLogical (Just 0.0) = Just False
-  intoLogical (Just   _) = Just True
-
-
-add :: (IntoNumeric a, IntoNumeric b) => a -> b -> Numeric
-add l r = case (intoNumeric l, intoNumeric r) of
-  ((Just l),(Just r)) -> Just (l + r)
-  (       _,       _) -> Nothing
-
-and :: (IntoLogical a, IntoLogical b) => a -> b -> Logical
-and l r = case (intoLogical l, intoLogical r) of
-  ((Just l),(Just r)) -> Just (l && r)
-  (       _,       _) -> Nothing
diff --git a/tests/tmp/T776.hs b/tests/tmp/T776.hs
deleted file mode 100644
--- a/tests/tmp/T776.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-{- | There are 2 bugs here, that have to do with `--prune-unsorted`.
-
-     1. Why is the `prod` measure being used in the generic `size`
-        function where it doesn't fit?
-
-     2. Why are we getting such a meaningless error message?!
-
-        At the very least some mention of try `prune-unsorted` ?
-
-        Can we not put in a simple check in Bare for now:
-
-        The measure `prod` is not-polymorphic, please run with --prune-unsorted.
-        
- -}
-
-{-@ LIQUID "--prune-unsorted" @-}
-
-module LiquidR where
-
-{-@ measure size @-}
-size        :: [a] -> Int
-size []     = 0
-size (_:xs) = 1 + size xs
-
-{-@ measure prod @-}
-prod :: [Int] -> Int
-prod []     = 1
-prod (x:xs) = x + prod xs
diff --git a/tests/tmp/T777.hs b/tests/tmp/T777.hs
deleted file mode 100644
--- a/tests/tmp/T777.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-module Goo where 
-
-{-@ instance measure glub @-}
-glub :: [Int] -> Bool
-glub []     = True
-glub (x:xs) = ((x > 0) && (glub xs))
diff --git a/tests/todo/12-case-study-AVL.lhs b/tests/todo/12-case-study-AVL.lhs
deleted file mode 100644
--- a/tests/todo/12-case-study-AVL.lhs
+++ /dev/null
@@ -1,821 +0,0 @@
-Case Study: AVL Trees {#case-study-avltree}
-================================
-
-
-\begin{comment}
-\begin{code}
-{- Example of AVL trees by michaelbeaumont -}
-
-{-@ LIQUID "--diff"           @-}
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--totality"       @-}
-
-module AVL (AVL, empty, singleton, insert, insert', delete) where
-
-import qualified Data.Set as S
-import Prelude hiding (max)
--- import Language.Haskell.Liquid.Prelude (liquidAssume)
-
--- Test
-main = do
-    mapM_ print [a, b, c, d]
-  where
-    a = singleton 5
-    b = insert 2 a
-    c = insert 3 b
-    d = insert 7 c
-
--- | Height is actual height (will disappear with measure-generated-invariants) ------------
-
-{-@ invariant {v:AVL a | 0 <= realHeight v && realHeight v = getHeight v} @-}
-
-{-@ inv_proof  :: t:AVL a -> {v:_ | 0 <= realHeight t && realHeight t = getHeight t } @-}
-inv_proof Leaf           = True
-inv_proof (Node k l r n) = inv_proof l && inv_proof r
-
-{-@ node :: x:a -> l:AVLL a x -> r:{AVLR a x | isBal l r 1} -> {v:AVL a | realHeight v = nodeHeight l r} @-}
-node v l r = Node v l r (nodeHeight l r)
-
-balR0, balRL, balRR :: a -> AVL a -> AVL a -> AVL a
-insR :: a -> AVL a -> AVL a
-merge :: a -> AVL a -> AVL a -> AVL a
-member :: (Ord a) => a -> AVL a -> Bool
--- FIXME bigHt l r t  = if (realHeight l >= realHeight r) then (eqOrUp l t) else (eqOrUp r t)
-\end{code}
-\end{comment}
-
-
-One of the most fundamental abstractions in computing is that of a
-*collection* of values -- names, numbers, records -- into which we can
-rapidly `insert`, `delete` and check for `member`ship.
-
-\newthought{Trees} offer an an attractive means of implementing
-collections in the immutable setting. We can *order* the values
-to ensure that each operation takes time proportional to the
-*path* from the root to the datum being operated upon.
-If we additionally keep the tree *balanced* then each path
-is small (relative to the size of the collection), thereby
-giving us an efficient implementation for collections.
-
-\newthought{As in real life}
-maintaining order and balance is rather easier said than done.
-Often we must go through rather sophisticated gymnastics to ensure
-everything is in its right place. Fortunately, LiquidHaskell can help.
-Lets see a concrete example, that should be familiar from your introductory
-data structures class: the Georgy Adelson-Velsky and Landis' or [AVL Tree][avl-wiki].
-
-AVL Trees
----------
-
-An `AVL` tree is defined by the following Haskell datatype:^[This chapter is based on code by Michael Beaumont.]
-
-\begin{code}
-data AVL a =
-    Leaf
-  | Node { key :: a      -- value
-         , l   :: AVL a  -- left subtree
-         , r   :: AVL a  -- right subtree
-         , ah  :: Int    -- height
-         }
-    deriving (Show)
-\end{code}
-
-While the Haskell type signature describes any old binary tree, an
-`AVL` tree like that shown in Figure [auto](#fig:avl) actually satisfies
-two crucial invariants: it should be binary search ordered and
-balanced.
-
-<div class="marginfigure"
-     id="fig:avl"
-     height="150px"
-     file="img/avl.png"
-     caption="An AVL tree is an ordered, height-balanced tree.">
-</div>
-
-\newthought{A Binary Search Ordered} tree is one where at *each*
-`Node`, the values of the `left` and `right` subtrees are strictly
-less and greater than the values at the `Node`. In the
-tree in Figure [auto](#fig:avl) the root has value `50` while its left
-and right subtrees have values in the range `9-23` and `54-76`
-respectively.  This holds at all nodes, not just the root. For
-example, the node `12` has left and right children strictly less and
-greater than `12`.
-
-\newthought{A Balanced} tree is one where at *each* node, the *heights*
-of the left and right subtrees differ by at most `1`. In
-Figure [auto](#fig:avl), at the root, the heights of the left and right subtrees
-are the same, but at the node `72` the left subtree has height `2` which is
-one more then the right subtree.
-
-\newthought{The Invariants Lead To Fast Operations.}
-Order ensures that there is at most a single path of `left` and
-`right` moves from the root at which an element can be found; balance
-ensures that each such path in the tree is of size $O(\log\ n)$ where
-$n$ is the numbers of nodes. Thus, together they ensure that the
-collection operations are efficient: they take time logarithmic in the
-size of the collection.
-
-Specifying AVL Trees
---------------------
-
-The tricky bit is to ensure order and balance. Before we can ensure
-anything, lets tell LiquidHaskell what we mean by these terms, by
-defining legal or valid AVL trees.
-
-\newthought{To Specify Order} we just define two aliases `AVLL` and `AVLR`
--- read *AVL-left* and *AVL-right* -- for trees whose values are strictly less
-than and greater than some value `X`:
-
-\begin{code}
--- | Trees with value less than X
-{-@ type AVLL a X = AVL {v:a | v < X}  @-}
-
--- | Trees with value greater than X
-{-@ type AVLR a X = AVL {v:a | X < v}  @-}
-\end{code}
-
-
-\newthought{The Real Height} of a tree is defined recursively as `0`
-for `Leaf`s and one more than the larger of left and right subtrees
-for `Node`s.  Note that we cannot simply use the `ah` field because
-thats just some arbitrary `Int` -- there is nothing to prevent a buggy
-implementation from just filling that field with `0` everywhere.  In
-short, we need the ground truth: a measure that computes the *actual*
-height of a tree. ^[**FIXME** The `inline` pragma indicates that the
-Haskell functions can be directly lifted into and used inside the
-refinement logic and measures.]
-
-\begin{code}
-{-@ measure realHeight @-}
-realHeight                :: AVL a -> Int
-realHeight Leaf           = 0
-realHeight (Node _ l r _) = nodeHeight l r
-
-{-@ inline nodeHeight @-}
-nodeHeight l r = 1 + max hl hr
-  where
-    hl         = realHeight l
-    hr         = realHeight r
-
-{-@ inline max @-}
-max :: Int -> Int -> Int
-max x y = if x > y then x else y
-\end{code}
-
-\newthought{A Reality Check} predicate ensures that a value
-`v` is indeed the *real* height of a node with subtrees `l` and `r`:
-
-\begin{code}
-{-@ inline isReal @-}
-isReal v l r = v == nodeHeight l r
-\end{code}
-
-\newthought{A Node is $n$-Balanced} if its left and right subtrees
-have a (real) height difference of at most $n$. We can specify this
-requirement as a predicate `isBal l r n`
-
-\begin{code}
-{-@ inline isBal @-}
-isBal l r n = 0 - n <= d && d <= n
-  where
-    d       = realHeight l - realHeight r
-\end{code}
-
-\newthought{A Legal AVL Tree} can now be defined via the following
-[refined data type](#refineddatatypes), which states that each `Node`
-is $1$-balanced, and that the saved height field is indeed the *real* height:
-
-\begin{code}
-{-@ data AVL a = Leaf
-               | Node { key :: a
-                      , l   :: AVLL a key
-                      , r   :: {v:AVLR a key | isBal l v 1}
-                      , ah  :: {v:Nat        | isReal v l r}
-                      }                                  @-}
-\end{code}
-
-Smart Constructors
-------------------
-
-Lets use the type to construct a few small trees which will
-also be handy in a general collection API. First, lets write
-an alias for trees of a given height:
-
-\begin{code}
--- | Trees of height N
-{-@ type AVLN a N = {v: AVL a | realHeight v = N} @-}
-
--- | Trees of height equal to that of another T
-{-@ type AVLT a T = AVLN a {realHeight T} @-}
-\end{code}
-
-\newthought{An Empty} collection is represented by a `Leaf`,
-which has height `0`:
-
-\begin{code}
-{-@ empty :: AVLN a 0 @-}
-empty = Leaf
-\end{code}
-
-<div class="hwex" id="Singleton">
-Consider the function `singleton` that builds an `AVL`
-tree from a single element. Fix the code below so that
-it is accepted by LiquidHaskell.
-</div>
-
-\begin{code}
-{-@ singleton :: a -> AVLN a 1 @-}
-singleton x =  Node x empty empty 0
-\end{code}
-
-As you can imagine, it can be quite tedious to keep the saved height
-field `ah` *in sync* with the *real* height. In general in such
-situations, which arose also with [lazy queues](#lazyqueue), the right
-move is to eschew the data constructor and instead use a *smart
-constructor* that will fill in the appropriate values correctly. ^[Why
-bother to save the height anyway? Why not just recompute it instead?]
-
-\newthought{The Smart Constructor} `node` takes as input the node's value `x`,
-left and right subtrees `l` and `r` and returns a tree by filling in the right
-value for the height field.
-
-\begin{code}
-{-@ mkNode :: a -> l:AVL a -> r:AVL a
-           -> AVLN a {nodeHeight l r}
-  @-}
-mkNode v l r = Node v l r h
- where
-   h       = 1 + max hl hr
-   hl      = getHeight l
-   hr      = getHeight r
-\end{code}
-
-<div class="hwex" id="Constructor">Unfortunately, LiquidHaskell  rejects
-the above smart constructor `node`. Can you explain why? Can you fix the
-code (implementation or specification) so that the function is accepted?
-</div>
-
-\hint Think about the (refined) type of the actual constructor `Node`, and
-the properties it requires and ensures.
-
-
-Inserting Elements
-------------------
-
-Next, lets turn our attention to the problem of *adding* elements to
-an `AVL` tree. The basic strategy is this:
-
-1. *Find* the appropriate location (per ordering) to add the value,
-2. *Replace* the `Leaf` at that location with the singleton value.
-
-\noindent If you prefer the spare precision of code to the
-informality of English, here is a first stab at implementing
-insertion: ^[`node` is a fixed variant of the smart
-constructor `mkNode`. Do the exercise *without* looking at it.]
-
-
-\begin{code}
-{-@ insert0    :: (Ord a) => a -> AVL a -> AVL a @-}
-insert0 y t@(Node x l r _)
-  | y < x      = insL0 y t
-  | x < y      = insR0 y t
-  | otherwise  = t
-insert0 y Leaf = singleton y
-
-insL0 y (Node x l r _) = node x (insert0 y l) r
-insR0 y (Node x l r _) = node x l (insert0 y r)
-\end{code}
-
-
-\newthought{Unfortunately} `insert0` does not work.
-If you did the exercise above, you can replace it with `mkNode` and
-you will see that the above function is rejected by LiquidHaskell.
-The error message would essentially say that at the calls to the
-smart constructor, the arguments violate the balance requirement.
-
-\newthought{Insertion Increases The Height} of a sub-tree, making
-it *too large* relative to its sibling. For example, consider the
-tree `t0` defined as:
-
-~~~~~{.ghci}
-ghci> let t0 = Node { key = 'a'
-                    , l   = Leaf
-                    , r   = Node {key = 'd'
-                                 , l  = Leaf
-                                 , r  = Leaf
-                                 , ah = 1 }
-                    , ah = 2}
-~~~~~
-
-If we use `insert0` to add the key `'e'` (which goes after `'d'`) then we end up
-with the result:
-
-\vfill
-
-~~~~~{.ghci}
-ghci> insert0 'e' t0
-  Node { key = 'a'
-       , l   = Leaf
-       , r   = Node { key = 'd'
-                    , l   = Leaf
-                    , r   = Node { key = 'e'
-                                 , l   = Leaf
-                                 , r   = Leaf
-                                 , ah  = 1   }
-                    , ah = 2                 }
-       , ah = 3}
-~~~~~
-
-<div class="marginfigure"
-     height="150px"
-     file="img/avl-insert0.png"
-     id="fig:avl-insert0"
-     caption="Naive insertion breaks balancedness">
-</div>
-
-
-\noindent In the above, illustrated in Figure [auto](#fig:avl-insert0)
-the value `'e'` is inserted into the valid tree `t0`; it is inserted
-using `insR0`, into the *right* subtree of `t0` which already has
-height `1` and causes its height to go up to `2` which is too large
-relative to the empty left subtree of height `0`.
-
-\newthought{LiquidHaskell catches the imbalance} by rejecting `insert0`.
-The new value `y` is inserted into the right subtree `r`, which (may
-already be bigger than the left by a factor of `1`).
-As insert can return a tree with arbitrary height, possibly
-much larger than `l` and hence, LiquidHaskell rejects the call to
-the constructor `node` as the balance requirement does not hold.
-
-\newthought{Two lessons} can be drawn from the above exercise. First,
-`insert` may *increase* the height of a tree by at most `1`. So,
-second, we need a way to *rebalance* sibling trees where one has
-height `2` more than the other.
-
-Rebalancing Trees
------------------
-
-The brilliant insight of Adelson-Velsky and Landis was that we can,
-in fact, perform such a rebalancing with a clever bit of gardening.
-Suppose we have inserted a value into the *left* subtree `l` to
-obtain a new tree `l'` (the right case is symmetric.)
-
-\newthought{The relative heights} of `l'` and `r` fall under one of three cases:
-
-+ *(RightBig)* `r`  is two more than `l'`,
-+ *(LeftBig)*  `l'` is two more than `r`, and otherwise
-+ *(NoBig)*    `l'` and `r` are within a factor of `1`,
-
-\newthought{We can specify} these cases as follows.
-
-\begin{code}
-{-@ inline leftBig @-}
-leftBig l r = diff l r == 2
-
-{-@ inline rightBig @-}
-rightBig l r = diff r l == 2
-
-{-@ inline diff @-}
-diff s t = getHeight s - getHeight t
-\end{code}
-
-\noindent the function `getHeight` accesses the saved height field.
-
-\begin{code}
-{-@ measure getHeight @-}
-getHeight Leaf           = 0
-getHeight (Node _ _ _ n) = n
-\end{code}
-
-In `insL`, the *RightBig* case cannot arise as `l'` is at least as
-big as `l`, which was within a factor of `1` of `r` in the valid
-input tree `t`.  In *NoBig*, we can safely link  `l'` and `r` with
-the smart constructor as they satisfy the balance requirements.
-The *LeftBig* case is the tricky one: we need a way to shuffle
-elements from the left subtree over to the right side.
-
-\newthought{What is a LeftBig tree?} Lets split into the possible
-cases for `l'`, immediately ruling out the *empty* tree because
-its height is `0` which cannot be `2` larger than any other tree.
-
-+ *(NoHeavy)* the left and right subtrees of `l'` have the same height,
-+ *(LeftHeavy)* the left subtree of `l'` is bigger than the right,
-+ *(RightHeavy)* the right subtree of `l'` is bigger than the left.
-
-\newthought{The Balance Factor} of a tree can be used to make the above
-cases precise. Note that while the `getHeight` function returns the saved
-height (for efficiency), thanks to the invariants, we know it is in fact
-equal to the `realHeight` of the given tree.
-
-\begin{code}
-{-@ measure balFac @-}
-balFac Leaf           = 0
-balFac (Node _ l r _) = getHeight l - getHeight r
-\end{code}
-
-\newthought{Heaviness} can be encoded by testing the balance factor:
-
-\begin{code}
-{-@ inline leftHeavy @-}
-leftHeavy  t = balFac t > 0
-
-{-@ inline rightHeavy @-}
-rightHeavy t = balFac t < 0
-
-{-@ inline noHeavy @-}
-noHeavy    t = balFac t == 0
-\end{code}
-
-Adelson-Velsky and Landis observed that once you've drilled
-down  into these three cases, the shuffling suggests itself.
-
-<div class="figure"
-     id="fig:avl-balL0"
-     height="150px"
-     file="img/avl-balL0.png"
-     caption="Rotating when in the LeftBig, NoHeavy case.">
-</div>
-
-\newthought{In the NoHeavy} case, illustrated in
-Figure [auto](#fig:avl-balL0),
-the subtrees  `ll` and `lr` have the same height which is one more than that
-of `r`. Hence, we can link up `lr` and `r` and link the result with `l`.
-Here's how you would implement the rotation. Note how the preconditions
-capture the exact case we're in: the left subtree is *NoHeavy* and the right
-subtree is smaller than the left by `2`. Finally, the output type captures
-the exact height of the result, relative to the input subtrees.
-
-\begin{code}
-{-@ balL0 :: x:a
-          -> l:{AVLL a x | noHeavy l}
-          -> r:{AVLR a x | leftBig l r}
-          -> AVLN a {realHeight l + 1 }
-  @-}
-balL0 v (Node lv ll lr _) r = node lv ll (node v lr r)
-\end{code}
-
-<div class="figure"
-     height="150px"
-     file="img/avl-balLL.png"
-     caption="Rotating when in the LeftBig, LeftHeavy case."
-     id="fig:avl-balLL">
-</div>
-
-\newthought{In the LeftHeavy} case, illustrated in
-Figure [auto](#fig:avl-balLL), the subtree `ll` is larger than `lr`;
-hence `lr` has the same height as `r`, and again we can link up
-`lr` and `r` and link the result with `l`. As in the *NoHeavy* case,
-the input types capture the exact case, and the output the height of
-the resulting tree.
-
- \begin{code}
-{-@ balLL :: x:a
-          -> l:{AVLL a x | leftHeavy l}
-          -> r:{AVLR a x | leftBig l r}
-          -> AVLT a l
-  @-}
-balLL v (Node lv ll lr _) r = node lv ll (node v lr r)
-\end{code}
-
-<div class="figure"
-     height="150px"
-     file="img/avl-balLR.png"
-     caption="Rotating when in the LeftBig, RightHeavy case."
-     id="fig:avl-balLR">
-</div>
-
-\newthought{In the RightHeavy} case, illustrated in Figure [auto](#fig:avl-balLR),
-the subtree  `lr` is larger than  `ll`. We cannot directly link it with `r` as
-the result would again be too large. Hence, we split it further into its own
-subtrees `lrl` and `lrr` and link the latter with `r`. Again, the types capture
-the requirements and guarantees of the rotation.
-
-\begin{code}
-{-@ balLR :: x:a
-          -> l:{AVLL a x | rightHeavy l}
-          -> r:{AVLR a x | leftBig l r}
-          -> AVLT a l
-  @-}
-balLR v (Node lv ll (Node lrv lrl lrr _) _) r
-  = node lrv (node lv ll lrl) (node v lrr r)
-\end{code}
-
-
-The *RightBig* cases are symmetric to the above cases where the
-left subtree is the larger one.
-
-<div class="hwex" id="RightBig, NoHeavy">
-Fix the implementation of `balR0` so that it implements the given type.
-</div>
-
-\vspace{1.0in}
-\vspace*{\fill}
-
-\begin{code}
-{-@ balR0 :: x:a
-          -> l: AVLL a x
-          -> r: {AVLR a x | rightBig l r && noHeavy r}
-          -> AVLN a {realHeight r + 1}
-  @-}
-balR0 v l r = undefined
-\end{code}
-
-<div class="hwex" id="RightBig, RightHeavy">
-Fix the implementation of `balRR` so that it implements the given type.
-</div>
-
-
-\begin{code}
-{-@ balRR :: x:a
-          -> l: AVLL a x
-          -> r:{AVLR a x | rightBig l r && rightHeavy r}
-          -> AVLT a r
-  @-}
-balRR v l r = undefined
-\end{code}
-
-<div class="hwex" id="RightBig, LeftHeavy">
-Fix the implementation of `balRL` so that it implements the given type.
-</div>
-
-\begin{code}
-{-@ balRL :: x:a
-          -> l: AVLL a x
-          -> r:{AVLR a x | rightBig l r && leftHeavy r}
-          -> AVLT a r
-  @-}
-balRL v l r = undefined
-\end{code}
-
-
-\newthought{To Correctly Insert} an element, we recursively add it
-to the left or right subtree as appropriate and then determine which
-of the above cases hold in order to call the corresponding *rebalance*
-function which restores the invariants.
-
-\begin{code}
-{-@ insert :: a -> s:AVL a -> {t: AVL a | eqOrUp s t} @-}
-insert y Leaf = singleton y
-insert y t@(Node x _ _ _)
-  | y < x     = insL y t
-  | y > x     = insR y t
-  | otherwise = t
-\end{code}
-
-\noindent The refinement, `eqOrUp` says that the height of `t` is the same
-as `s` or goes *up* by atmost `1`.
-
-\begin{code}
-{-@ inline eqOrUp @-}
-eqOrUp s t = d == 0 || d == 1
-  where
-    d      = diff t s
-\end{code}
-
-\newthought{The hard work} happens inside `insL` and `insR`. Here's the
-first; it simply inserts into the left subtree to get `l'` and then determines
-which rotation to apply.
-
-\begin{code}
-{-@ insL :: x:a
-         -> t:{AVL a | x < key t && 0 < realHeight t}
-         -> {v: AVL a | eqOrUp t v}
-  @-}
-insL a (Node v l r _)
-  | isLeftBig && leftHeavy l'  = balLL v l' r
-  | isLeftBig && rightHeavy l' = balLR v l' r
-  | isLeftBig                  = balL0 v l' r
-  | otherwise                  = node  v l' r
-  where
-    isLeftBig                  = leftBig l' r
-    l'                         = insert a l
-\end{code}
-
-<div class="hwex" id="InsertRight"> \singlestar
-\noindent The code for `insR` is symmetric. To make sure you're
-following along, why don't you fill it in?
-</div>
-
-\begin{code}
-{-@ insR :: x:a
-         -> t:{AVL a  | key t < x && 0 < realHeight t }
-         -> {v: AVL a | eqOrUp t v}
-  @-}
-insR = undefined
-\end{code}
-
-Refactoring Rebalance
----------------------
-
-Next, lets write a function to `delete` an element from a tree.
-In general, we can apply the same strategy as `insert`:
-
-1. remove the element without worrying about heights,
-2. observe that deleting can *decrease* the height by at most `1`,
-3. perform a rotation to fix the imbalance caused by the decrease.
-
-\newthought{We painted ourselves into a corner} with `insert`: the code
-for actually inserting an element is intermingled with the code for
-determining and performing the rotation. That is, see how the code
-that determines which rotation to apply -- `leftBig`, `leftHeavy`, etc. --
-is *inside* the `insL` which does the insertion as well.
-This is correct, but it means we would have to *repeat* the case
-analysis when deleting a value, which is unfortunate.
-
-\newthought{Instead lets refactor} the rebalancing code into a
-separate function, that can be used by *both* `insert` and `delete`.
-It looks like this:
-
-\begin{code}
-{-@ bal :: x:a
-        -> l:AVLL a x
-        -> r:{AVLR a x | isBal l r 2}
-        -> {t:AVL a | reBal l r t}
-  @-}
-bal v l r
-  | isLeftBig  && leftHeavy l  = balLL v l r
-  | isLeftBig  && rightHeavy l = balLR v l r
-  | isLeftBig                  = balL0 v l r
-  | isRightBig && leftHeavy r  = balRL v l r
-  | isRightBig && rightHeavy r = balRR v l r
-  | isRightBig                 = balR0 v l r
-  | otherwise                  = node  v l r
-  where
-    isLeftBig                  = leftBig l r
-    isRightBig                 = rightBig l r
-\end{code}
-
-The `bal` function is a combination of the case-splits and rotation calls
-made by `insL` (and ahem, `insR`); it takes as input a value `x` and valid
-left and right subtrees for `x` whose heights are off by at most `2` because
-as we will have created them by inserting or deleting a value from a sibling
-whose height was at most `1` away. The `bal` function returns a valid `AVL` tree,
-whose height is constrained to satisfy the predicate `reBal l r t`, which says:
-
-+ (`bigHt`) The height of `t` is the same or one bigger than the larger of `l` and `r`, and
-+ (`balHt`) If `l` and `r` were already balanced (i.e. within `1`) then the height
-   of `t` is exactly equal to that of a tree built by directly linking `l`
-   and `r`.
-
-\begin{code}
-{-@ inline reBal @-}
-reBal l r t = bigHt l r t && balHt l r t
-
-{-@ inline balHt @-}
-balHt l r t = not (isBal l r 1) || isReal (realHeight t) l r
-
-{-@ inline bigHt @-}
-bigHt l r t = lBig && rBig
-  where
-    lBig    = not (hl >= hr) || (eqOrUp l t)
-    rBig    = (hl >= hr)     || (eqOrUp r t)
-    hl      = realHeight l
-    hr      = realHeight r
-\end{code}
-
-\newthought{Insert} can now be written very simply as the following function that
-recursively inserts into the appropriate subtree and then calls `bal` to fix any imbalance:
-
-\begin{code}
-{-@ insert' :: a -> s:AVL a -> {t: AVL a | eqOrUp s t} @-}
-insert' a t@(Node v l r n)
-  | a < v      = bal v (insert' a l) r
-  | a > v      = bal v l (insert' a r)
-  | otherwise  = t
-insert' a Leaf = singleton a
-\end{code}
-
-Deleting Elements
------------------
-
-Now we can write the `delete` function in a manner similar to `insert`:
-the easy cases are the recursive ones; here we just delete from the
-subtree and summon `bal` to clean up. Notice that the height of the
-output `t` is at most `1` *less* than that of the input `s`.
-
-\begin{code}
-{-@ delete    :: a -> s:AVL a -> {t:AVL a | eqOrDn s t} @-}
-delete y (Node x l r _)
-  | y < x     = bal x (delete y l) r
-  | x < y     = bal x l (delete y r)
-  | otherwise = merge x l r
-delete _ Leaf = Leaf
-
-{-@ inline eqOrDn @-}
-eqOrDn s t = eqOrUp t s
-\end{code}
-
-\newthought{The tricky case} is when we actually *find* the
-element that is to be removed. Here, we call `merge` to link
-up the two subtrees `l` and `r` after hoisting the smallest
-element from the right tree `r` as the new root which replaces
-the deleted element `x`.
-
-\begin{code}
-{-@ merge :: x:a -> l:AVLL a x -> r:{AVLR a x | isBal l r 1}
-          -> {t:AVL a | bigHt l r t}
-  @-}
-merge _ Leaf r = r
-merge _ l Leaf = l
-merge x l r    = bal y l r'
-  where
-   (y, r')     = getMin r
-\end{code}
-
-`getMin` recursively finds the smallest (i.e. leftmost) value
-in a tree, and returns the value and the remainder tree.  The height
-of each remainder `l'` may be lower than `l` (by at most `1`.) Hence,
-we use `bal` to restore the invariants when linking against the
-corresponding right subtree `r`.
-
-\begin{code}
-getMin (Node x Leaf r _) = (x, r)
-getMin (Node x l r _)    = (x', bal x l' r)
-  where
-    (x', l')             = getMin l
-\end{code}
-
-
-Functional Correctness
-----------------------
-
-We just saw how to implement some tricky data structure gynastics.
-Fortunately, with LiquidHaskell as a safety net we can be sure to have
-gotten all the rotation cases right and to have preserved the
-invariants crucial for efficiency and correctness.  However, there is
-nothing in the types above that captures "functional correctness",
-which, in this case, means that the operations actually implement a
-collection or set API, for example, as described [here](#mapapi).
-Lets use the techniques from that chapter to precisely specify
-and verify that our AVL operations indeed implement sets correctly, by:
-
-1. *Defining* the set of elements in a tree,
-2. *Specifying* the desired semantics of operations via types,
-3. *Verifying* the implemetation. ^[By adding [ghost operations](#lemmas), if needed.]
-
-We've done this [once before](#lemmas) already, so this is a good exercise
-to solidify your understanding of that material.
-
-\newthought{The Elements} of an `AVL` tree can be described via a measure
-defined as follows:
-
-\begin{code}
-{-@ measure elems @-}
-elems                :: (Ord a) => AVL a -> S.Set a
-elems (Node x l r _) = (S.singleton x) `S.union`
-                       (elems l)       `S.union`
-                       (elems r)
-elems Leaf           = S.empty
-\end{code}
-
-\noindent Let us use the above `measure` to specify and verify that our `AVL` library
-actually implements a `Set` or collection API.
-
-
-<div class="hwex" id="Membership">Complete the implementation of the implementation of
-`member` that checks if an element is in an `AVL` tree:
-</div>
-
-\begin{code}
--- FIXME https://github.com/ucsd-progsys/liquidhaskell/issues/332
-{-@ member :: (Ord a) => x:a -> t:AVL a -> {v: Bool | Prop v <=> hasElem x t} @-}
-member x t = undefined
-
-{-@ type BoolP P = {v:Bool | Prop v <=> Prop P} @-}
-
-{-@ inline hasElem @-}
-hasElem x t = True
--- FIXME hasElem x t = S.member x (elems t)
-\end{code}
-
-
-<div class="hwex" id="Insertion">Modify `insert'` to obtain
-a function `insertAPI` that states that the output tree
-contains the newly inserted element (in addition to the old elements):
-</div>
-
-\begin{code}
-{-@ insertAPI :: (Ord a) => a -> s:AVL a -> {t:AVL a | addElem x s t} @-}
-insertAPI x s = insert' x s
-
-{-@ inline addElem @-}
-addElem       :: Ord a => a -> AVL a -> AVL a -> Bool
-addElem x s t = True
--- FIXME addElem x s t = (elems t) == (elems s) `S.union` (S.singleton x)
-\end{code}
-
-
-<div class="hwex" id="Insertion">Modify `delete` to obtain
-a function `deleteAPI` that states that the output tree
-contains the old elements minus the removed element:
-</div>
-
-\begin{code}
-{-@ deleteAPI :: (Ord a) => a -> s:AVL a -> {t: AVL a | delElem x s t} @-}
-deleteAPI x s = delete x s
-
-{-@ inline delElem @-}
-delElem       :: Ord a => a -> AVL a -> AVL a -> Bool
-delElem x s t = True
--- FIXME delElem x s t = (elems t) == (elems s) `S.difference` (S.singleton x)
-\end{code}
diff --git a/tests/todo/2013-01-10-measuring-lists-I.lhs b/tests/todo/2013-01-10-measuring-lists-I.lhs
deleted file mode 100644
--- a/tests/todo/2013-01-10-measuring-lists-I.lhs
+++ /dev/null
@@ -1,299 +0,0 @@
----
-layout: post
-title: "Measuring Lists I"
-date: 2013-01-05 16:12
-author: Ranjit Jhala
-published: false 
-comments: true
-external-url:
-categories: basic
-demo: lenMapReduce.hs
----
-
-[Previously][vecbounds] we saw how liquid refinements can be pretty 
-handy for enforcing invariants about integers, for example the about 
-whether a `Vector` is being indexed within bounds. Now, lets see how
-they can be used to encode structural invariants about data types, in
-particular, lets see how to use the `measure` mechanism to talk about 
-the **size** of a list, and thereby write safe versions of potentially
-list manipulating functions.
-
-<!-- more -->
-
-\begin{code}
-module ListLengths where
-
-import Prelude hiding (length, map, filter, head, tail, foldl1)
--- import Language.Haskell.Liquid.Prelude (liquidError)
-import qualified Data.HashMap.Strict as M
-import Data.Hashable 
-
-liquidError = error 
-\end{code}
-
-Measuring the Length of a List
-------------------------------
-
-To begin, we need some instrument by which to measure the length of a list.
-[Recall][vecbounds] the auxiliary functions used to represent the number of 
-elements of a `Vector`. Lets reuse this mechanism, this time, providing a 
-[definition](https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/GHC/Base.spec)
-for the measure
-
-\begin{code}Specifying the length of a list 
-measure len :: forall a. [a] -> GHC.Types.Int
-len ([])     = 0
-len (y:ys)   = 1 + (len ys) 
-\end{code}
-
-The description of `len` above should be quite easy to follow. Underneath the 
-covers, LiquidHaskell transforms the above description into refined versions 
-of the types for the constructors `(:)` and `[]`,
-\begin{code}Something like 
-data [a] where 
-  []  :: forall a. {v: [a] | (len v) = 0 }
-  (:) :: forall a. y:a -> ys:[a] -> {v: [a] | (len v) = 1 + (len ys) } 
-\end{code}
-
-To appreciate this, note that we can now check that
-
-\begin{code}
-{-@ xs :: {v:[String] | (len v) = 1 } @-}
-xs = "dog" : []
-
-{-@ ys :: {v:[String] | (len v) = 2 } @-}
-ys = ["cat", "dog"]
-
-{-@ zs :: {v:[String] | (len v) = 3 } @-}
-zs = "hippo" : ys
-\end{code}
-
-Hover your mouse over the `:` and `[]` above to confirm their types!
-
-Dually, when we *de-construct* the lists, LiquidHaskell is able to relate
-the type of the outer list with its constituents. For example,
-
-\begin{code}
-{-@ zs' :: {v:[String] | (len v) = 2 } @-}
-zs' = case zs of 
-        h : t -> t
-\end{code}
-
-Here, from the use of the `:` in the pattern, LiquidHaskell can determine
-that `(len zs) = 1 + (len t)`; by combining this fact with the nugget
-that `(len zs) = 3` LiquidHaskell concludes that `t`, and hence, `zs'`
-contains two elements.
-
-Reasoning about Lengths
------------------------
-
-Great! Lets flex our new vocabulary by uttering types that describe the
-behavior of the usual list functions. 
-
-First up: a somewhat simplified version of the [standard library's][ghclist] 
-`length` from, slightly simplified for exposition.
-
-\begin{code}
-{-@ length :: xs:[a] -> {v: Int | v = (len xs)} @-}
-length :: [a] -> Int
-length []     = 0
-length (x:xs) = 1 + length xs
-\end{code}
-
-Similarly, we can speak and have confirmed, the types for the usual
-list-manipulators like
-
-\begin{code}
-{-@ map      :: (a -> b) -> xs:[a] -> {v:[b] | (len v) = (len xs)} @-}
-map _ []     = [] 
-map f (x:xs) = (f x) : (map f xs)
-\end{code}
-
-and
-
-\begin{code}
-{-@ filter :: (a -> Bool) -> xs:[a] -> {v:[a] | (len v) <= (len xs)} @-}
-filter _ []     = []
-filter f (x:xs) 
-  | f x         = x : filter f xs
-  | otherwise   = filter f xs
-\end{code}
-
-and, since, doubtless you are wondering,
-
-\begin{code}
-{-@ append :: xs:[a] -> ys:[a] -> {v:[a] | (len v) = (len xs) + (len ys)} @-}
-append [] ys     = ys 
-append (x:xs) ys = x : append xs ys
-\end{code}
-
-Warm Up: Safely Catching A List by The `head` (or `tail`)
----------------------------------------------------------
-
-Now, lets see how we can use these new incantations to banish, forever,
-certain irritating kinds of errors. To wit, recall how we always summon 
-functions like `head` and `tail` with a degree of trepidation, unsure
-whether the arguments are empty, which will awaken certain beasts
-
-```
-Prelude> head []
-*** Exception: Prelude.head: empty list
-```
-
-Well, now LiquidHaskell can allow us to use these functions with confidence
-and surety, once we type them as:
-
-\begin{code}
-{-@ head   :: {v:[a] | (len v) > 0} -> a @-}
-head (x:_) = x
-head []    = liquidError "Fear not! 'twill ne'er come to pass"
-\end{code}
-
-As with the case of [divide-by-zero][ref101], LiquidHaskell deduces that
-the second equation is *dead code* since the precondition (input) type
-states that the length of the input is strictly positive, which *precludes*
-the case where the parameter is `[]`.
-
-Similarly, we may write
-
-\begin{code}
-{-@ tail :: {v:[a] | (len v) > 0} -> [a] @-}
-tail (_:xs) = xs
-tail []     = liquidError "Relaxeth! this too shall ne'er be"
-\end{code}
-
-Once again, LiquidHaskell will use the precondition to verify that the 
-`liquidError` is never invoked. 
-
-Lets use the above to write a function that eliminates stuttering, that
-is which converts "ssstringssss liiiiiike thisss"` to "strings like this".
-
-\begin{code}
-{-@ eliminateStutter :: (Eq a) => [a] -> [a] @-}
-eliminateStutter xs = map head $ groupEq xs 
-\end{code}
-
-The heavy lifting is done by `groupEq`
-
-\begin{code}
-groupEq []     = []
-groupEq (x:xs) = (x:ys) : groupEq zs
-                 where (ys,zs) = span (x ==) xs
-\end{code}
-
-which gathers consecutive equal elements in the list into a single list.
-
- 
-By using the fact that *each element* in the output returned by 
-`groupEq` is in fact of the form `x:ys`, LiquidHaskell infers that
-`groupEq` returns a *list of non-empty lists*. 
-
-(Put your mouse over the `groupEq` identifier in the code above to see this.)
-
-Next, by automatically instantiating the type parameter for the `map` 
-in `eliminateStutter` to `(len v) > 0` LiquidHaskell deduces `head` 
-is only called on non-empty lists, thereby verifying the safety of 
-`eliminateStutter`.
-
-
-A Longer Example: MapReduce 
----------------------------
-
-The above examples of `head` and `tail` are simple, but non-empty lists pop
-up in many places, and it is rather convenient to have the type system
-track non-emptiness without having to make up special types. Here's a
-longer example.
-
-First, lets write a function `keyMap` that expands a list of inputs into a 
-list of key-value pairs:
-
-\begin{code}
-keyMap :: (a -> [(k, v)]) -> [a] -> [(k, v)]
-keyMap f xs = concatMap f xs
-\end{code}
-
-Next, lets write a function `group` that gathers the key-value pairs into a
-`Map` from *keys* to the lists of values with that same key.
-
-\begin{code}
-group kvs = foldr (\(k, v) m -> inserts k v m) M.empty kvs 
-\end{code}
-
-The function `inserts` simply adds the new value `v` to the list of 
-previously known values `lookupDefault [] k m` for the key `k`.
-
-\begin{code}
-inserts k v m = M.insert k (v : vs) m 
-  where vs    = M.lookupDefault [] k m
-\end{code}
-
-Finally, we can write a function that *reduces* the list of values for a given
-key in the table to a single value:
-
-\begin{code}
-reduce    :: (v -> v -> v) -> M.HashMap k [v] -> M.HashMap k v
-reduce op = M.map (foldl1 op)
-\end{code}
-
-where `foldl1` is a [left-fold over *non-empty* lists][foldl1]
-
-\begin{code}
-foldl1 f (x:xs) =  foldl f x xs
-foldl1 _ []     =  liquidError "will. never. happen."
-\end{code}
-
-We can put the whole thing together to write a (*very*) simple *Map-Reduce* library
-
-\begin{code}
-{-@ mapReduce   :: (Eq k, Hashable k) 
-                => (a -> [(k, v)]) -- ^ key-mapper
-                -> (v -> v -> v)   -- ^ reduction operator
-                -> [a]             -- ^ inputs
-                -> [(k, v)]        -- ^ output key-values
-  @-}
-
-mapReduce f op  = M.toList 
-                . reduce op 
-                . group 
-                . keyMap f
-\end{code}
-
-Now, if we want to compute the frequency of `Char` in a given list of words, we can write:
-
-\begin{code}
-{-@ charFrequency :: [String] -> [(Char, Int)] @-}
-charFrequency     :: [String] -> [(Char, Int)]
-charFrequency     = mapReduce wordChars (+)
-  where wordChars = map (\c -> (c, 1)) 
-\end{code}
-
-You can take it out for a spin like so:
-
-\begin{code}
-f0 = charFrequency [ "the", "quick" , "brown"
-                   , "fox", "jumped", "over"
-                   , "the", "lazy"  , "cow"   ]
-\end{code}
-
-
-LiquidHaskell will gobble the whole thing up, and verify that none of the
-undesirable `liquidError` calls are triggered. 
-
-Conveniently, we *needn't write down any types* for `mapReduce` and friends. 
-
-The main invariant, from which safety follows is that the `Map` 
-returned by the `group` function binds each key to a *non-empty* list 
-of values. LiquidHaskell deduces this invariant by inferring suitable 
-types for `group`, `inserts`, `foldl1` and `reduce`, thereby relieving 
-us of that tedium. 
-
-In short, by riding on the broad and high shoulders of SMT, LiquidHaskell 
-makes a little typing go a long way.
-
-
-
-[vecbounds]:  /blog/2012/01/05/bounding-vectors.lhs/ 
-[ghclist]  : https://github.com/ucsd-progsys/liquidhaskell/blob/master/include/GHC/List.lhs#L125
-[ref101]   :  /blog/2013/01/01/refinement-types-101.lhs/ 
-
-[foldl1]   : http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/Data-List.html#foldl1
diff --git a/tests/todo/A.hs b/tests/todo/A.hs
deleted file mode 100644
--- a/tests/todo/A.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-{-@ LIQUID "--exactdc" @-}
-
-module A where 
-
-data Foo a b= Foo {fooA :: a, fooB :: b} 
-{-@ data Foo a b = Foo {fooA :: a, fooB :: b} @-} 
diff --git a/tests/todo/AA.hs b/tests/todo/AA.hs
deleted file mode 100644
--- a/tests/todo/AA.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-{-@ LIQUID "--exactdc" @-}
-
-module AA where 
-
-data Foo a b = Foo {fooA :: a, fooB :: b}  |  Bar
-
-
-
-{-@ measure isFoo @-}
-isFoo :: Foo a b -> Bool
-isFoo (Foo _ _)= True 
-isFoo Bar = False 
diff --git a/tests/todo/AVLTree.hs b/tests/todo/AVLTree.hs
deleted file mode 100644
--- a/tests/todo/AVLTree.hs
+++ /dev/null
@@ -1,117 +0,0 @@
-module AVLTree where 
-
--- from: https://gist.github.com/gerard/109729
-
-data BT a = L 
-          | N { dep   :: !Int 
-              , value :: a   
-              , left  :: !(BT a)
-              , right :: !(BT a) 
-              }
-          deriving (Show, Eq)
-
-{-@ data BT a [dep] = L 
-                    | N (dep   :: !Int) 
-                        (value :: a   )
-                        (left  :: Bt a) 
-                        (right :: BT a) 
-  @-}
-
--- Nice, small and useful functions
-empty = L 
- 
--- You could say, depth L == Nothing depth (N v L L) == Just 0, but works for
--- me better this way:
-depth L = 0
-depth (N d _ _ _) = d 
-
-{-@ measure depth   :: BT a -> Int 
-    depth (L)         = 0
-    depth (N d x l r) = 1 + (if (depth l) <= (depth r) then (depth r) else (depth l)) 
-  @-}
-
-inorder             :: BT a -> [a]
-inorder L           = []
-inorder (N _ v l r) = inorder l ++ [v] ++ inorder r
- 
--- left (N _ t _) = t
--- right (N _ _ u) = u
--- value (N v _ _) = v
- 
-btmin = head . inorder
- 
--- FIXME: Could be cleaner BT -> Int using left and right of BT
-balFactor :: BT -> BT -> Int
-balFactor t u = (depth t) - (depth u)
- 
--- Tricky but easy: we return a binary list with the route to the node
-search :: BT -> Int -> Maybe [Int]
-search L s = Nothing
-search (N v t u) s 
-    | v == s                  = Just []
-    | (search t s) /= Nothing = fmap ((:) 0) (search t s)
-    | (search u s) /= Nothing = fmap ((:) 1) (search u s)
-    | otherwise               = Nothing
- 
--- Complementary to search: get the node with the path
-getelem :: BT -> [Int] -> Maybe Int
-getelem L _ = Nothing
-getelem (N v _ _) [] = Just v
-getelem (N v t u) (x:xs)
-    | x == 0    = getelem t xs
-    | otherwise = getelem u xs
- 
--- If you get confused (I do), check this nice picture:
--- http://en.wikipedia.org/wiki/Image:Tree_Rebalancing.gif
-balanceLL (N v (N vl tl ul) u)              = (N vl tl (N v ul u))
-balanceLR (N v (N vl tl (N vlr tlr ulr)) u) = (N vlr (N vl tl tlr) (N v ulr u))
-balanceRL (N v t (N vr (N vrl trl url) ur)) = (N vrl (N v t trl) (N vr url ur)) 
-balanceRR (N v t (N vr tr ur))              = (N vr (N v t tr) ur)
- 
--- Balanced insert
-insert :: BT -> Int -> BT
-insert L i = (N i L L)
-insert (N v t u) i
-    | i == v = (N v t u)
-    | i < v && (balFactor ti u) ==  2 && i < value t = balanceLL (N v ti u)
-    | i < v && (balFactor ti u) ==  2 && i > value t = balanceLR (N v ti u)
-    | i > v && (balFactor t ui) == -2 && i < value u = balanceRL (N v t ui)
-    | i > v && (balFactor t ui) == -2 && i > value u = balanceRR (N v t ui)
-    | i < v  = (N v ti u)
-    | i > v  = (N v t ui)
-        where ti = insert t i
-              ui = insert u i
- 
--- Balanced delete
-delete :: BT -> Int -> BT
-delete L d = L
-delete (N v L L) d = if v == d then L else (N v L L)
-delete (N v t L) d = if v == d then t else (N v t L)
-delete (N v L u) d = if v == d then u else (N v L u)
-delete (N v t u) d
-    | v == d                            = (N mu t dmin)
-    | v > d && abs (balFactor dt u) < 2 = (N v dt u)
-    | v < d && abs (balFactor t du) < 2 = (N v t du)
-    | v > d && (balFactor (left u) (right u)) < 0 = balanceRR (N v dt u) 
-    | v < d && (balFactor (left t) (right t)) > 0 = balanceLL (N v t du)
-    | v > d                                       = balanceRL (N v dt u)
-    | v < d                                       = balanceLR (N v t du)
-        where dmin = delete u mu
-              dt   = delete t d
-              du   = delete u d
-              mu   = btmin u
- 
--- Test Functions
-load :: BT -> [Int] -> BT
-load t []     = t
-load t (x:xs) = insert (load t xs) x
- 
-unload :: BT -> [Int] -> BT
-unload t []     = t
-unload t (x:xs) = delete (unload t xs) x
- 
-sort :: [Int] -> [Int]
-sort = inorder . (load empty)
- 
-isBalanced L = True
-isBalanced (N _ t u) = isBalanced t && isBalanced u && abs (balFactor t u) < 2
diff --git a/tests/todo/AbsRef.hs b/tests/todo/AbsRef.hs
deleted file mode 100644
--- a/tests/todo/AbsRef.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-module AbsRef where
-
-data F a = F a
-{-@ data F a <p :: a -> Prop> = F (x :: a)@-}
-
-
-
-{-@ foo :: F <{\v -> true}, {\v -> true}> Int @-}
-foo :: F Int
-foo = F 5
diff --git a/tests/todo/AbsRefNameClash.hs b/tests/todo/AbsRefNameClash.hs
deleted file mode 100644
--- a/tests/todo/AbsRefNameClash.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-
------------------------------------------------------------------------
--- Weight-Biased Leftist Heap, verified using LiquidHaskell -----------
------------------------------------------------------------------------
--- ORIGINAL SOURCE ----------------------------------------------------
------------------------------------------------------------------------
--- Copyright: 2014, Jan Stolarek, Politechnika Łódzka                --
---                                                                   --
--- License: See LICENSE file in root of the repo                     --
--- Repo address: https://github.com/jstolarek/dep-typed-wbl-heaps-hs --
---                                                                   --
--- Basic implementation of weight-biased leftist heap. No proofs     --
--- and no dependent types. Uses a two-pass merging algorithm.        --
------------------------------------------------------------------------
-
-{-@ LIQUID "--no-termination" @-}
-
-module WBL where 
-
-type Priority = Int
-
-type Rank     = Int
-
-type Nat      = Int
-
-data Heap a   = Empty | Node { pri   :: a
-                             , rnk   :: Rank
-                             , left  :: Heap a
-                             , right :: Heap a
-                             }
-
-{-@ data Heap a <p :: a -> a -> Prop> =
-      Empty | Node { pri   :: a
-                   , rnk   :: Nat 
-                   , left  :: {v: Heap<p> (a<p pri>) | ValidRank v}
-                   , right :: {v: Heap<p> (a<p pri>) | ValidRank v}
-                   }
- @-}
-
-{-@ predicate ValidRank V = okRank V && realRank V = rank V  @-}
-{-@ type PHeap a = {v:OHeap a | ValidRank v}                 @-} 
-{-@ type OHeap a = Heap <{\root v -> root <= v}> a           @-}
-
-{-@ measure okRank        :: Heap a -> Prop
-    okRank (Empty)        = true
-    okRank (Node p k l r) = (realRank l >= realRank r && k = 1 + realRank l + realRank r  )
-  @-}
-
-{-@ measure realRank :: Heap a -> Int 
-    realRank (Empty)        = 0
-    realRank (Node p k l r) = (1 + realRank l + realRank r)
-  @-}
-
-{-@ measure rank @-}
-{-@ rank :: h:PHeap a -> {v:Nat | v = realRank h} @-}
-rank Empty          = 0 
-rank (Node _ r _ _) = r
-
-
--- Creates heap containing a single element with a given Priority
-{-@ singleton :: a -> PHeap a  @-}
-singleton p = Node p 1 Empty Empty
-
--- Note [Two-pass merging algorithm]
--- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
--- We use a two-pass implementation of merging algorithm. One pass,
--- implemented by merge, performs merging in a top-down manner. Second
--- one, implemented by makeT, ensures that rank invariant of weight
--- biased leftist tree is not violated after merging.
---
--- Notation:
---
---  h1, h2 - heaps being merged
---  p1, p2 - priority of root element in h1 and h2
---  l1     - left  subtree in the first  heap
---  r1     - right subtree in the first  heap
---  l2     - left  subtree in the second heap
---  r2     - right subtree in the second heap
---
--- Merge function analyzes four cases. Two of them are base cases:
---
---    a) h1 is empty - return h2
---
---    b) h2 is empty - return h1
---
--- The other two cases form the inductive definition of merge:
---
---    c) priority p1 is higher than p2 - p1 becomes new root, l1
---       becomes its one child and result of merging r1 with h2
---       becomes the other child:
---
---               p1
---              /  \
---             /    \
---            l1  r1+h2 -- here "+" denotes merging
---
---    d) priority p2 is higher than p2 - p2 becomes new root, l2
---       becomes its one child and result of merging r2 with h1
---       becomes the other child.
---
---               p2
---              /  \
---             /    \
---            l2  r2+h1
---
--- Note that there is no guarantee that rank of r1+h2 (or r2+h1) will
--- be smaller than rank of l1 (or l2). To ensure that merged heap
--- maintains the rank invariant we pass both childred - ie. either l1
--- and r1+h2 or l2 and r2+h1 - to makeT, which creates a new node by
--- inspecting sizes of children and swapping them if necessary.
-
--- makeT takes an element (Priority) and two heaps (trees). It
--- constructs a new heap with element at the root and two heaps as
--- children. makeT ensures that WBL heap rank invariant is maintained
--- in the newly created tree by reversing left and right subtrees when
--- necessary (note the inversed r and l in the False alternative of
--- case expression).
-{-@ makeT   :: p:a -> h1:PHeap {v:a | p <= v} -> h2:PHeap {v:a | p <= v}
-            -> {v:PHeap a | realRank v = 1 + realRank h1 + realRank h2} @-}
-makeT p l r = case rank l >= rank r of
-                True  ->  Node p (1 + rank l + rank r) l r
-                False ->  Node p (1 + rank l + rank r) r l
-
--- merge combines two heaps into one. There are two base cases and two
--- recursive cases - see [Two-pass Merging algorithm]. Recursive cases
--- call makeT to ensure that rank invariant is maintained after
--- merging.
-{-@ merge :: (Ord a) => h1:PHeap a -> h2:PHeap a -> {v:PHeap a | realRank v = realRank h1 + realRank h2}  @-}
-merge Empty h2 = h2
-merge h1 Empty = h1
-merge h1@(Node p1 k1 l1 r1) h2@(Node p2 k2 l2 r2) = case p1 < p2 of
-  True  -> makeT p1 l1 (merge r1 (Node p2 k2 l2 r2))
-  False -> makeT p2 l2 (merge (Node p1 k1 l1 r1) r2)
-
--- Inserting into a heap is performed by merging that heap with newly
--- created singleton heap.
-{-@ insert :: (Ord a) => a -> PHeap a -> PHeap a @-}
-insert p h = merge (singleton p) h
-
--- findMin returns element with highest priority, ie. root
--- element. Here we encounter first serious problem: we can't return
--- anything sensible for empty node.
-{-@ findMin :: PHeap a -> a @-}
-findMin Empty          = undefined
-findMin (Node p _ _ _) = p
-
--- and write a safer version of findMinM
-{-@ findMinM :: PHeap a -> Maybe a @-} 
-findMinM Empty          = Nothing
-findMinM (Node p _ _ _) = Just p
-
--- deleteMin removes the element with the highest priority by merging
--- subtrees of a root element. Again the case of empty heap is
--- problematic. We could give it semantics by returning Empty, but
--- this just doesn't feel right. Why should we be able to remove
--- elements from an empty heap?
-{-@ deleteMin :: (Ord a) => PHeap a -> PHeap a @-}
-deleteMin Empty          = undefined -- should we insert empty?
-deleteMin (Node _ _ l r) = merge l r
-
--- As a quick sanity check let's construct some examples. Here's a
--- heap constructed by inserting following priorities into an empty
--- heap: 3, 0, 1, 2.
-{-@ heap :: PHeap Int @-}
-heap = insert (2 :: Int) 
-      (insert 1 
-      (insert 0 
-      (insert 3 Empty)))
-
--- Example usage of findMin
-findMinInHeap :: Priority
-findMinInHeap = findMin heap
-
--- Example usage of deleteMin
-deleteMinFromHeap :: Heap Int
-deleteMinFromHeap = deleteMin heap
diff --git a/tests/todo/Adt0.hs b/tests/todo/Adt0.hs
deleted file mode 100644
--- a/tests/todo/Adt0.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-{-@ LIQUID "--exact-data-con"                      @-}
-{-@ LIQUID "--higherorder"                         @-}
-{-@ LIQUID "--totality"                            @-}
-{-@ LIQUID "--automatic-instances=liquidinstances" @-}
-
-module Adt0 where
-
-{-@ data Vec a = Nil | Cons { vHead :: a, vTail :: Vec a } @-}
-data Vec a = Nil | Cons { vHead :: a, vTail :: Vec a }
-
-{-@ prop :: xs:(Vec a) -> y:a -> ys:(Vec a) -> {v:() | xs == Cons y ys} -> {y == vHead xs} @-}
-prop :: Vec a -> a -> Vec a -> () -> ()
-prop x y zs _ = ()
-
-{-@ zop :: x:a -> xs:Vec a -> { Cons x xs /= Nil } @-}
-p
-zop :: a -> Vec a -> ()
-zop x xs = ()
diff --git a/tests/todo/AdtBin.hs b/tests/todo/AdtBin.hs
deleted file mode 100644
--- a/tests/todo/AdtBin.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module AdtBin where
-
-data Bin = B0 | B1
-
-{-@ inductive Bin :: Int -> Prop where
-      B0 :: Prop (Bin 0)
-      B1 :: Prop (Bin 1)
-  @-}
-
--- test :: n:Int -> Prop (Bin n) -> { n == 0 || n == 1 }
-{-@ test :: n:Int -> {v:Bin | prop v = Bin n} -> { n == 0 || n == 1 } @-}
-test :: Int -> Bin -> ()
-test n B0 = ()
-test n B1 = ()
diff --git a/tests/todo/Aliases.hs b/tests/todo/Aliases.hs
deleted file mode 100644
--- a/tests/todo/Aliases.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module Foo where
-
-{-@ type Foos = [Foo] @-}
-
-{-@ type Foo = {v:Int | vv > 0} @-}
-
-foo :: [Int]
-{-@ foo :: Foos @-}
-foo = []
diff --git a/tests/todo/AmortizedQueue.hs b/tests/todo/AmortizedQueue.hs
deleted file mode 100644
--- a/tests/todo/AmortizedQueue.hs
+++ /dev/null
@@ -1,159 +0,0 @@
-module AmortizedQueue where
-
-import Prelude hiding (head)
-
-data AbsQueue a = AQ { front :: [a]
-                     , rear  :: [a] }
-
-{-@ data AbsQueue a = AQ { front :: [a]
-                         , rear  :: {v:[a] | size v <= size front} }  @-}
-
-{-@ die :: {v:String | false} -> a @-}
-die :: String -> a
-die x = error x
-
-{-@ measure size @-}
-size        :: [a] -> Int
-size []     = 0
-size (x:xs) = 1 + size xs
-
-{-@ measure qsize @-}
-qsize            :: AbsQueue a -> Int
-qsize (AQ xs ys) = size xs + size ys
-
-{-@ invariant {v:[a]        | size v >=  0} @-}
-{-@ invariant {v:AbsQueue a | qsize v >= 0} @-}
-
-{-@ type NEList  a = {v:[a]        | size v > 0} @-}
-{-@ type NEQueue a = {v:AbsQueue a | qsize v > 0} @-}
-
-
-makeQueue            :: [a] -> [a] -> AbsQueue a
-makeQueue f b
-  | size b <= size f = AQ f b
-  | otherwise        = AQ (f ++ reverse b) []
-
-                       
-{- measure qhead @-}
-
-{-@ qhead      :: NEQueue a -> a @-}
-qhead (AQ f _) = head f
-qhead _        = die "never"
-
-{- measure head @-}
-
-{-@ head   :: NEList a -> a @-}
-head (x:_) = x
--- head _     = die "never"
-
-
-{- toList :: q:AbsQueue a -> {v:[a] | 0 < len v => head v = front q} @-}
-toList :: AbsQueue a -> [a]
-toList = undefined 
--- forall q :: AbsQueue a, xs:: [a], x::a.
---    not (isEmpty(q)) && asList(q) == xs =>                    
-{-
-import leon.lang._
-import leon.annotation._
-
-object AmortizedQueue {
-  sealed abstract class List
-  case class Cons(head : Int, tail : List) extends List
-  case object Nil extends List
-
-  sealed abstract class AbsQueue
-  case class Queue(front : List, rear : List) extends AbsQueue
-
-  def size(list : List) : Int = (list match {
-    case Nil => 0
-    case Cons(_, xs) => 1 + size(xs)
-  }) ensuring(_ >= 0)
-
-  def content(l: List) : Set[Int] = l match {
-    case Nil => Set.empty[Int]
-    case Cons(x, xs) => Set(x) ++ content(xs)
-  }
-  
-  def asList(queue : AbsQueue) : List = queue match {
-    case Queue(front, rear) => concat(front, reverse(rear))
-  }
-
-  def concat(l1 : List, l2 : List) : List = (l1 match {
-    case Nil => l2
-    case Cons(x,xs) => Cons(x, concat(xs, l2))
-  }) ensuring (res => size(res) == size(l1) + size(l2) && content(res) == content(l1) ++ content(l2))
-
-  def isAmortized(queue : AbsQueue) : Boolean = queue match {
-    case Queue(front, rear) => size(front) >= size(rear)
-  }
-
-  def isEmpty(queue : AbsQueue) : Boolean = queue match {
-    case Queue(Nil, Nil) => true
-    case _ => false
-  }
-
-  def reverse(l : List) : List = (l match {
-    case Nil => Nil
-    case Cons(x, xs) => concat(reverse(xs), Cons(x, Nil))
-  }) ensuring (content(_) == content(l))
-
-  def amortizedQueue(front : List, rear : List) : AbsQueue = {
-    if (size(rear) <= size(front))
-      Queue(front, rear)
-    else
-      Queue(concat(front, reverse(rear)), Nil)
-  } ensuring(isAmortized(_))
-
-  def enqueue(queue : AbsQueue, elem : Int) : AbsQueue = (queue match {
-    case Queue(front, rear) => amortizedQueue(front, Cons(elem, rear))
-  }) ensuring(isAmortized(_))
-
-  def tail(queue : AbsQueue) : AbsQueue = {
-    require(isAmortized(queue) && !isEmpty(queue))
-    queue match {
-      case Queue(Cons(f, fs), rear) => amortizedQueue(fs, rear)
-    }
-  } ensuring (isAmortized(_))
-
-  def front(queue : AbsQueue) : Int = {
-    require(isAmortized(queue) && !isEmpty(queue))
-    queue match {
-      case Queue(Cons(f, _), _) => f
-    }
-  }
-
-  @induct
-  def propFront(queue : AbsQueue, list : List) : Boolean = {
-    require(!isEmpty(queue) && isAmortized(queue))
-    if (asList(queue) == list) {
-      list match {
-        case Cons(x, _) => front(queue) == x
-      }
-    } else
-      true
-  } holds
-
-  def enqueueAndFront(queue : AbsQueue, elem : Int) : Boolean = {
-    if (isEmpty(queue))
-      front(enqueue(queue, elem)) == elem
-    else
-      true
-  } holds
-
-  def enqueueDequeueThrice(queue : AbsQueue, e1 : Int, e2 : Int, e3 : Int) : Boolean = {
-    if (isEmpty(queue)) {
-      val q1 = enqueue(queue, e1)
-      val q2 = enqueue(q1, e2)
-      val q3 = enqueue(q2, e3)
-      val e1prime = front(q3)
-      val q4 = tail(q3)
-      val e2prime = front(q4)
-      val q5 = tail(q4)
-      val e3prime = front(q5)
-      e1 == e1prime && e2 == e2prime && e3 == e3prime
-    } else
-      true
-  } holds
-}
-
--}
diff --git a/tests/todo/Append.hs b/tests/todo/Append.hs
deleted file mode 100644
--- a/tests/todo/Append.hs
+++ /dev/null
@@ -1,41 +0,0 @@
-{-
-  A first example in equalional reasoning. 
-  From the definition of append we should be able to 
-  semi-automatically prove the three axioms.
- -}
-
-{-@ LIQUID "--newcheck" @-}
-{-@ LIQUID "--no-termination" @-}
-
-module Append where
-
-data L a = N |  C a (L a) deriving (Eq)
-
-{-@ measure append :: L a -> L a -> L a @-}
-append :: L a -> L a -> L a 
-append N xs        = xs
-append (C y ys) xs = C y (append ys xs) 
-
-
-{-@ type Valid = {v:Bool | Prop v <=> true } @-}
-
-{-@ prop_nil_left :: xs:L a -> Valid @-}
-prop_nil_left     :: Eq a => L a -> Bool
-prop_nil_left xs = let tmp1 = append N xs in 
-                   let tmp2 = axiom_nil_left tmp1 in 
-                   tmp2 == xs
-
-
-{-@ assume axiom_nil_left :: xs:L a ->  {v:L a | v == xs &&  append N v == v} @-}
-axiom_nil_left :: L a ->  L a
-axiom_nil_left xs = xs
-
-
-{- axiom_nil_right :: xs:L a ->  {v:L a | v == xs &&  append v N == v} @-}
-axiom_nil_right :: L a ->  L a
-axiom_nil_right xs = xs
-
-
-{- axiom_assoc :: xs:L a -> ys: L a ->  zs: L a -> {v: Bool | append xs (append ys zs) == append (append xs ys) zs } @-}
-axiom_assoc :: L a ->  L a -> L a -> Bool 
-axiom_assoc xs ys zs = True 
diff --git a/tests/todo/Append0.hs b/tests/todo/Append0.hs
deleted file mode 100644
--- a/tests/todo/Append0.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module Reverse where
-
-{-@ LIQUID "--no-termination" @-}
-
-import Prelude hiding (reverse)
-
-data List a = N | C a (List a)
-
-{-@ measure reverse @-}
-
-reverse :: List a -> List a -> List a
-reverse zs N        = zs 
-reverse zs (C y ys) = C y (reverse zs ys)
diff --git a/tests/todo/ApplicativeMaybe0.hs b/tests/todo/ApplicativeMaybe0.hs
deleted file mode 100644
--- a/tests/todo/ApplicativeMaybe0.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-{-@ LIQUID "--higherorder"     @-}
-{- LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-{-@ LIQUID "--automatic-instances=liquidinstances" @-}
-{-@ LIQUID "--fuel=10" @-}
-
-{-# LANGUAGE IncoherentInstances   #-}
-{-# LANGUAGE FlexibleContexts #-}
-module ListFunctors where
-
-import MaybeReflect0 
-import Prelude hiding (Maybe(..))
-import Language.Haskell.Liquid.ProofCombinators
-
-
-{-
-
-liquid: liquid: panic! (the 'impossible' happened)
-  (GHC version 7.10.3 for x86_64-apple-darwin):
-  lookupRdrNameInModule
-
-Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug
-
--}
-
-
-{-@ composition :: x:Maybe (a -> a)
-                -> y:Maybe (a -> a)
-                -> z:Maybe a
-                -> { seq x (seq y z)  = seq x (seq y z) } @-}
-composition :: Maybe (a -> a) -> Maybe (a -> a) -> Maybe a -> Proof
-composition = undefined 
-
-
-
diff --git a/tests/todo/ApplicativeMaybe1.hs b/tests/todo/ApplicativeMaybe1.hs
deleted file mode 100644
--- a/tests/todo/ApplicativeMaybe1.hs
+++ /dev/null
@@ -1,55 +0,0 @@
-{-@ LIQUID "--higherorder"     @-}
-{- LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-{-@ LIQUID "--automatic-instances=liquidinstances" @-}
-{-@ LIQUID "--fuel=10" @-}
-
-{-# LANGUAGE IncoherentInstances   #-}
-{-# LANGUAGE FlexibleContexts #-}
-module ListFunctors where
-
-import MaybeReflect1
-import Prelude hiding (Maybe(..))
-import Language.Haskell.Liquid.ProofCombinators
-
-
--- This is OK
-
-{-@ compositionOK :: x:Maybe (a -> a)
-                -> y:Maybe (a -> a)
-                -> z:Maybe a
-                -> { seqm x (seqm y z)  = seqm x (seqm y z) } @-}
-
-compositionOK :: Maybe (a -> a) -> Maybe (a -> a) -> Maybe a -> Proof
-compositionOK = undefined 
-
-
-
--- But the following says "unbound symbol seqm"
--- Which is weird as seqm is OK in the above signature
-
-{-
-
-
- /Users/niki/liquidtypes/liquidhaskell/tests/todo/ApplicativeMaybe1.hs:28:20: Error: Bad Type Specification
- ListFunctors.composition :: x:(Maybe (a -> a)) -> y:(Maybe (a -> a)) -> z:(Maybe a) -> {VV : () | seqm (seqm (seqm (purem composem) x) y) z == seqm x (seqm y z)}
-     Sort Error in Refinement: {VV : Tuple | seqm (seqm (seqm (purem composem) x) y) z == seqm x (seqm y z)}
-     Unbound Symbol seqm
- Perhaps you meant: head, len, snd
-
--}
-
-{-@ composition :: x:Maybe (a -> a)
-                -> y:Maybe (a -> a)
-                -> z:Maybe a
-                -> { (seqm (seqm (seqm (purem composem) x) y) z)  = seqm x (seqm y z) } @-}
-
-composition :: Maybe (a -> a) -> Maybe (a -> a) -> Maybe a -> Proof
-composition = undefined 
-
-
-
-
-
-
-
diff --git a/tests/todo/Ast.hs b/tests/todo/Ast.hs
deleted file mode 100644
--- a/tests/todo/Ast.hs
+++ /dev/null
@@ -1,69 +0,0 @@
--- FAILING TEST: this test SHOULD FAIL BUT DOESN'T
--- issue #519
-
-{-# LANGUAGE DeriveFunctor #-}
-module Main where
-
-data AstIndex = IxExpr | IxType
-
-{-@ measure isExprIndex @-}
-isExprIndex :: AstIndex -> Bool
-isExprIndex IxExpr = True
-isExprIndex _      = False
-
-{-@ measure isTypeIndex @-}
-isTypeIndex :: AstIndex -> Bool
-isTypeIndex IxType = True
-isTypeIndex _      = False
-
-data AstF f = Lit Int    AstIndex
-            | Var String AstIndex
-            | App f f
-            | Paren f
-
-{-@
-  data AstF f <ix :: AstIndex -> Prop>
-    = Lit Int    (i :: AstIndex<ix>)
-    | Var String (i :: AstIndex<ix>)
-    | App (fn :: f) (arg :: f)
-    | Paren (ast :: f)
-  @-}
-
-{-@ type AstFE = AstF <{\ix -> isExprIndex ix}> @-}
-{-@ type AstFT = AstF <{\ix -> isTypeIndex ix}> @-}
-
-
--- Now lets tie the knot!
-
-newtype Fix f = In { out :: f (Fix f) }
-
-{-@ In :: f (Fix f) -> Fix f @-}
-{- In :: f (Fix f) -> Fix f @-}
-
-type Ast = Fix AstF
-
-{-@ type AstE = Fix AstFE @-}
-{-@ type AstT = Fix AstFT @-}
-
-{-@ astExprF :: AstF <{\ix -> isExprIndex ix}> (Fix (AstF <{\ix -> isExprIndex ix}>)) @-}
-astExprF :: AstF Ast
-astExprF = Lit 10 IxExpr
-
-{-@ astExpr :: Fix (AstF <{\ix -> isExprIndex ix}>)  @-}
-astExpr :: Ast
-astExpr = In astExprF
-
-
-{-@ astType :: AstT @-}
-astType :: Ast 
-astType = In (Lit 10 IxType)
-
-{-@ app :: forall <p :: AstIndex -> Prop>. Fix (AstF <p>) -> Fix (AstF <p>) -> Fix (AstF <p>) @-}
-app f x = In $ App f x
-
-{-@ id1 :: forall <p :: AstIndex -> Prop>. Fix (AstF <p>) -> Fix (AstF <p>)  @-}
-id1 :: Fix AstF -> Fix AstF
-id1 z = z
-
-{-@ wrong :: AstT @-}
-wrong = id1 astExpr
diff --git a/tests/todo/AxiomBug.hs b/tests/todo/AxiomBug.hs
deleted file mode 100644
--- a/tests/todo/AxiomBug.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module Nats where
-
-{-@ poo :: {v:Int | v == 0 } @-}
-poo :: Int
-poo = 1
-
-data Peano = Z
-
-{-@ axiomatize zero @-}
-zero :: Peano
-zero = Z
-
-goober :: String
-goober = "I am a cat"
diff --git a/tests/todo/Axiomatize.hs b/tests/todo/Axiomatize.hs
deleted file mode 100644
--- a/tests/todo/Axiomatize.hs
+++ /dev/null
@@ -1,131 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE QuasiQuotes     #-}
-
-module Axiomatize where
-
-import Language.Haskell.TH
-import Language.Haskell.TH.Quote
-import Language.Haskell.TH.Syntax
-
-import Debug.Trace
-
-import Control.Applicative
-import Data.List ((\\))
-import Data.Maybe (fromMaybe)
-
-data Proof = Proof
-
-
-{-@ auto :: Int -> b:{v:Bool |Prop v} -> Proof @-}
-auto :: Int -> Bool -> Proof
-auto _ _ = Proof
-
-{-@ cases :: Int -> b:{v:Bool |Prop v} -> Proof @-}
-cases :: Int -> Bool -> Proof
-cases _ _ = Proof
-
-
-axiomatize :: Q [Dec] -> Q [Dec]
-axiomatize q = do d <- q
-                  let vts = [(x, t) | FunD x _ <- d, SigD y t <- d, x == y ]
-                  ds <- mapM (axiomatizeOne vts) d
-                  return $ concat ds
-
-axiomatizeOne :: [(Name, Type)] -> Dec -> Q [Dec]
-axiomatizeOne env f@(FunD name cs)
-  = do axioms <- makeAxioms (lookup name env) name cs
-       return $ f:axioms
-axiomatizeOne _ (SigD _ _)
-  = return []
-axiomatizeOne _ d
-  = error $ "axiomatizeOne: Cannot axiomatize" ++ show d
-
-makeAxioms :: Maybe Type -> Name -> [Clause] -> Q [Dec]
-makeAxioms t f cs = concat <$> mapM go cs
-  where
-    go :: Clause -> Q [Dec]
-    go (Clause ps (NormalB (CaseE e ms)) []) = mapM (makeAxiomMatch f ps e) ms
-    go (Clause ps (NormalB _) [])            = makeAxiomPattern t f ps
-    go d = error $ "makeAxioms: Cannot axiomatize\n" ++ show d
-
-
-
-makeAxiomPattern :: Maybe Type -> Name -> [Pat] -> Q [Dec]
-makeAxiomPattern t g ps
-  = do ifs <- mapM reify (fst <$> ds)
-       ff <- makeFun f xs <$> axiom_body
-       ft <- makeSigT t f ps
-       return $ [ff] ++ ft
-  where
-    f = mkName $ makeNamePattern g (fst <$> ds)
-    ds = [(n, dps) |  ConP n dps <- ps]
-    xs = [x | VarP x <- (ps ++ concat (snd <$> ds))]
-
-makeSigT Nothing _ _
-  = return []
-makeSigT (Just t) f ps
-  = do r <- [t|Proof|]
-       ifs <- mapM reify (fst . snd <$> ds)
-       let ts2 = concat $ zipWith makePTys ds ifs
-       return [SigD f $ mkUnivArrow (as, ts1 ++ ts2, r)]
-  where
-    (as, ts, _) = bkUnivFun t
-    ts1 = [t | (t, VarP _) <- zip ts ps]
-    ds  = [(t, (n, dps)) |  (t, ConP n dps) <- zip ts ps]
-
-makePTys :: (Type, (Name, [Pat])) -> Info -> [Type]
-makePTys (tr, (n, dps)) (DataConI m t _ _) | n == m
-  = (applySub θ <$> [t | (t, VarP _) <- zip ts dps])
-  where (as, ts, r) = bkUnivFun t
-        θ = unify r tr
-makePTys _ _ = error "makePTys: on invalid arguments"
-
-
-unify (VarT n) t = [(n,t)]
-unify t (VarT n) = [(n,t)]
-unify (AppT t1 t2) (AppT t1' t2') = unify t1 t1' ++ unify t2 t2'
-unify (ForallT _ _ t1) t2 = unify t1 t2
-unify t1 (ForallT _ _ t2) = unify t1 t2
-unify _ _  = []
-
-applySub :: [(Name, Type)] -> Type -> Type
-applySub θ t@(VarT v) = fromMaybe t (lookup v θ)
-applySub θ (AppT t1 t2) = AppT (applySub θ t1) (applySub θ t2)
-applySub θ (ForallT _ _ _) = error "applySub: TODO"
-applySub θ t = t
-
-
-bkUnivFun = go [] []
-  where
-    go as xs (ForallT vs _ t)   = go (as ++ vs) xs t
-    go as xs (AppT (AppT ArrowT tx) t) = go as (tx:xs) t
-    go as xs t                  = (as, reverse xs, t)
-
-mkUnivArrow (as, ts, r) = ForallT as [] $ mkArrow ts r
-  where
-    mkArrow []     r = r
-    mkArrow (t:ts) r = AppT (AppT ArrowT t) $ mkArrow ts r
-
-makeAxiomMatch :: Name -> [Pat] -> Exp -> Match -> Q Dec
-makeAxiomMatch g ps (VarE x) (Match (ConP dc dps) bd decs)
-  = makeFun f xs <$> axiom_body
-  where f  = mkName $ makeName g x dc
-        xs = [p | VarP p <- ps ++ dps] \\ [x]
-
-makeFun :: Name -> [Name] -> Exp -> Dec
-makeFun f xs bd = FunD f [Clause (VarP <$> xs) (NormalB bd) []]
-
-axiom_body :: Q Exp
-axiom_body = [|Proof|]
-
-sep = "_"
-mkSep :: [String] -> String
-mkSep []  = []
-mkSep [x] = x
-mkSep (x:xs) = x ++ sep ++ mkSep xs
-
-eq  = "is"
-makeName fname x dc
-  = mkSep ["axiom", nameBase fname, nameBase x, eq, nameBase dc]
-
-makeNamePattern fname dcs = mkSep $ ["axiom", nameBase fname] ++ (nameBase <$> dcs)
diff --git a/tests/todo/B.hs b/tests/todo/B.hs
deleted file mode 100644
--- a/tests/todo/B.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-{-@ LIQUID "--exactdc" @-}
-
-module B where 
-
-import A 
-
-data Bar = Bar {barFoo :: Foo Int Int} 
-{-@ data Bar = Bar {barFoo :: Foo} @-}
-
-{-@ reflect bar @-}
-bar :: Bar -> Int 
-bar (Bar (Foo x _)) = x 
diff --git a/tests/todo/BadArguments.hs b/tests/todo/BadArguments.hs
deleted file mode 100644
--- a/tests/todo/BadArguments.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-import Prelude hiding (init)
-
-data List a = Emp               -- Nil
-            | (:::) a (List a)  -- Cons
-
-
-{-@ init :: (Int -> a) -> n:Nat -> List a n @-}
-init :: (Int -> a) -> Int -> List a
-init _ 0 = Emp
-init f n = f n ::: init f (n-1)
diff --git a/tests/todo/Box.hs b/tests/todo/Box.hs
deleted file mode 100644
--- a/tests/todo/Box.hs
+++ /dev/null
@@ -1,67 +0,0 @@
-module Box (Box, get, put, emp) where
-
-import Data.Dynamic
-
---------------------------------------------------------------------------------
-type Key    = Int 
-newtype Box = Box [(Key, Dynamic)]
-
---------------------------------------------------------------------------------
-emp :: Box
---------------------------------------------------------------------------------
-emp = Box []
-
-
---------------------------------------------------------------------------------
--- put :: k:Key -> v -> b:Box -> {bb:Box | bb = upd b k (Just 't)}   
-put :: (Typeable v) => Key -> v -> Box -> Box
---------------------------------------------------------------------------------
-put k v (Box kvs) = Box ((k, toDyn v) : kvs) 
-
-
---------------------------------------------------------------------------------
--- get :: k:Key -> {b:Box | sel b k = Just 'v} -> v   
-get :: (Typeable v) => Key -> Box -> v 
---------------------------------------------------------------------------------
-get k (Box kvs) = fromJust k $ fromDynamic =<< lookup k kvs
-
-
---------------------------------------------------------------------------------
--- | Helpers
---------------------------------------------------------------------------------
-
-{-@ fromJust :: Key -> {v: Maybe a | isJust v} -> a @-}
-fromJust     :: Key -> Maybe a -> a
-fromJust _ (Just x) = x
-fromJust k Nothing  = safeError $ "Error on key: " ++ show k
-
-{-@ safeError :: {v:_ | false} -> a @-}
-safeError = error
-
---------------------------------------------------------------------------------
--- | Unit Test 
---------------------------------------------------------------------------------
-
-b0 :: Box
-b0 = put 0 "Apple"
-   $ put 1 (4.5 :: Double)
-   $ put 2 ([1,2,3] :: [Int])
-   $ emp
-
-okFruit  :: String
-okFruit  = get 0 b0
-
-badFruit :: String
-badFruit = get 1 b0
-
-okPi     :: Double
-okPi     = get 1 b0
-
-badPi    :: Double
-badPi    = get 0 b0
-
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
-
--- Whats a good signature for CONCATENATING two `Box`?
diff --git a/tests/todo/CatMaybes.hs b/tests/todo/CatMaybes.hs
deleted file mode 100644
--- a/tests/todo/CatMaybes.hs
+++ /dev/null
@@ -1,24 +0,0 @@
-module Fixme where
-
-
-import qualified Data.Set
-
-
-{-@ foo :: x:[a]  
-          -> {v:[a] | Set_sub (listElts v) (listElts x)}
-  @-}
-
-foo = catMaybes . map bar 
-  where
-    catMaybes [] = []
-    catMaybes (Nothing:xs) = catMaybes xs
-    catMaybes (Just x : xs) = x:catMaybes xs
-
-bar :: a -> Maybe a
-{-@ bar :: x:a -> Maybe {v:a | v = x } @-}
-bar x = if prop x then Nothing else Just x
-
-{-@ prop :: a -> Bool @-}
-prop :: a -> Bool
-prop = undefined
-
diff --git a/tests/todo/Class3.hs b/tests/todo/Class3.hs
deleted file mode 100644
--- a/tests/todo/Class3.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Class3 where
-
-{-@ class Pos s where
-      allPos :: x:s Int -> {v:Bool | Prop v <=> allPos x}
-  @-}
-class Pos s where
-  allPos :: s Int -> Bool
-
-instance Pos [] where
-  {-@ instance measure allPos :: [Int] -> Bool
-        allPos []     = (0 < 1)
-        allPos (x:xs) = (0 < 1)
-    @-}
-  allPos :: [a]
-  allPos []     = True
-  allPos (x:xs) = (x > 0) && (allPos xs)
diff --git a/tests/todo/Class4.hs b/tests/todo/Class4.hs
deleted file mode 100644
--- a/tests/todo/Class4.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module Class3 where
-
-{-@ class Pos s where
-      allPos :: s a -> Bool
-  @-}
-class Pos s where
-  allPos :: s a -> Bool
diff --git a/tests/todo/Class4Import.hs b/tests/todo/Class4Import.hs
deleted file mode 100644
--- a/tests/todo/Class4Import.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-{-@ LIQUID "--no-termination" @-}
-
-module Class4Import where
-
-import Class4
-
-instance Frog () where
diff --git a/tests/todo/CmpBug.hs b/tests/todo/CmpBug.hs
deleted file mode 100644
--- a/tests/todo/CmpBug.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-module Fixme where
-
-zipWith :: (Char -> Char -> a) -> b -> b -> [a]
-zipWith f = zipWith' ((. w2c) . f . w2c)
-
-zipWith' :: (b -> b -> a) -> c -> c -> [a]
-zipWith' = undefined
-
-w2c :: a -> Char
-w2c = undefined
diff --git a/tests/todo/CountMonadMap.hs b/tests/todo/CountMonadMap.hs
deleted file mode 100644
--- a/tests/todo/CountMonadMap.hs
+++ /dev/null
@@ -1,138 +0,0 @@
-module Count () where
-
-import Prelude hiding (map)
-
-
-{-@ measure count :: Count a -> Int @-}
-
-data Count a = Count a
-
-instance Functor Count where
-	fmap = undefined
-instance Applicative Count where
-  pure  = undefined
-  (<*>) = undefined
-
-instance Monad Count where
-{-@
-instance Monad Count where
-  >>=    :: forall <r :: Count a -> Prop, p :: Count b -> Prop, q :: Count b -> Prop>.
-            {x::Count a <<r>>, y :: Count b <<p>>  |- {v:Count b | count v == count x + count y} <: Count b <<q>>}
-            Count a <<r>> -> (a -> Count b<<p>>) -> Count b <<q>> ;
-  >>     :: x:Count a -> y:Count b -> {v:Count b | count v == count x + count y};
-  return :: a -> {v:Count a | count v == 0 }
-@-}
-  return x        = let r = Count x in assertCount 0 (Count x)
-  (Count x) >>= f = let r = f x in assertCount (getCount (Count x) + getCount r) r
-  x >> y = assertCount (getCount x + getCount y) y
-  fail          = error
-
-
-
-{-@ assume assertCount :: i:Int -> x:Count a -> {v:Count a | v == x && count v == i } @-}
-assertCount :: Int -> Count a -> Count a
-assertCount _ x = x
-
-{-@ assume getCount :: x:Count a -> {v:Int | v == count x } @-}
-getCount :: Count a -> Int
-getCount _ = 0
-
-
-{-@ assume incr :: a -> {v:Count a | count v == 1 } @-}
-incr :: a -> Count a
-incr = Count
-
-{-@ assume unit :: {v:Count () | count v == 0 } @-}
-unit = Count ()
-
-
-type L a = [a]
-
-{-@  map :: forall <p :: Count b -> Prop, q :: Count [b] -> Prop, l :: L a  -> Prop >.
-            {x::a, xs::[a], y :: Count b <<p>>, ys :: {v:Count [b] | count v == len xs * count y} |- {v:Count [b] | count v == count y * (len xs + 1)} <: Count [b] <<q>>}
-            (a -> Count b <<p>>) -> xs:L a -> Count {v:[b] | len v == len xs } <<q>>
-@-}
-
-map :: (a -> Count b) -> [a] -> Count [b]
--- map f []     = return []
-
-
-{-
-
-y :: Count b 
-ys :: {c:Count {v:[b] | len v == len xs} | count c == (count y) * (len xs) }
-
--}
-
-map f (x:xs) = 
-  let y  = f x   
-      ys = map f xs          -- count v == len xs * count y 
-      -- g y ys = return (y:ys) -- count v == 0 
-      -- h z = ys >>= (g xs y ys z)       -- count v == (len xs * count y) +count y
-  in  y >>= (h xs y ys)
-
-
-{-@ g :: xs:[a] -> y:Count b -> {v:Count [b] | count v == len xs * count y} -> z:b -> zs:[b] -> {v:Count {v:[b] | len v == len zs + 1} | count v == 0 } @-}
-g :: [a] -> Count b -> Count [b] -> b -> [b] -> Count [b]
-g _ _ _ y ys = return (y:ys)
-
-
-{-@ h :: xs:[a] -> y:Count b -> ys:{v:Count [b] | count v == len xs * count y} -> z:b -> {v:Count [b] | count v == (len xs) * (count y)} @-}
-h :: [a] -> Count b -> Count [b] -> b ->  Count [b]
-h xs y ys z = ys >>= (g xs y ys z)
-
-
-{-
-  do y <- f x
-     ys <- map f xs 
-     -- {v: ??? | count v == len xs * count c }
-     return (y:ys)
-
--}
-
-{-
-map f (x:xs) = 
-  let y  = f x 
-      ys = map f xs
-  in y:ys     
-
--}
-
-
---             {xs :: L a <<l>>, ys:: {v:[a] | len v == 0 && v == xs}|- {v:Count [b] | count v == 0} <: Count [b] <<q>>}
-
-{-@ map' :: c:Count b -> xs:[a] -> {v:Count [b] | count v == (len xs) * (count c)} @-}
-map' :: Count b -> [a] -> Count [b]
-map' f []     = return []
-map' f (x:xs) = 
-  do y <- f 
-     ys <- map' f xs 
-     return (y:ys)
-
-
-{-@ foo :: a -> {v:Count a | count v == 0 }  @-}
-foo :: a -> Count a
-foo y = return y
-
-{-@ test1 :: {v:Count () | count v == 0 } @-}
-test1 :: Count ()
-test1 = do
-  unit
-  unit
-  unit
-
-{-@ test2 :: {v:Count () | count v == 1 } @-}
-test2 = do
-  unit
-  y <- incr ()
-  unit
-  foo y
-  unit
-
-{-@ test3 :: {v:Count () | count v == 2 } @-}
-test3 = do
-  unit
-  unit
-  incr ()
-  incr ()
-  unit
diff --git a/tests/todo/DB0.hs b/tests/todo/DB0.hs
deleted file mode 100644
--- a/tests/todo/DB0.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "totality" @-}
-
-module DataBase (values) where
-
-{-@ values :: forall <range :: key -> val -> Prop>.
-  k:key -> [Dict <range> key val]  -> [val<range k>] @-}
-values :: key -> [Dict key val]  -> [val]
-values k = map go
-  where
-    go (D _ f) = f k
-
-data Dict key val = D {ddom :: [key], dfun :: key -> val}
-{-@ ddom :: forall <range :: key -> val -> Prop>.
-           x:Dict <range> key val  -> [key]
-  @-}
-
-{-@ dfun :: forall <range :: key -> val -> Prop>.
-               x:Dict <range> key val
-            -> i:key -> val<range i>
-  @-}
-
-{-@ data Dict key val <range :: key -> val -> Prop>
-  = D ( ddom :: [key])
-      ( dfun :: i:key -> val<range i>)
-  @-}
diff --git a/tests/todo/DBMovies0.hs b/tests/todo/DBMovies0.hs
deleted file mode 100644
--- a/tests/todo/DBMovies0.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-module MovieClient where
-
-
-data Tag 
-data Value
-
-
-type Table t v = [Dict t v]
-
-data Dict key val = D {ddom :: [key], dfun :: key -> val}
-
-
-{-@ fromList :: forall <range :: key -> val -> Prop, p :: Dict key val -> Prop>.
-                x:[Dict <range> key val <<p>>] -> {v:[Dict <range> key val <<p>>] | x = v}
-  @-}
-fromList :: [Dict key val] -> Table key val
-fromList xs = xs
-
-
-{-@ data Dict key val <range :: key -> val -> Prop>
-  = D ( ddom :: [key])
-      ( dfun :: i:key -> val<range i>)
-  @-}
-
-
-{-@ type Movies      = [MovieScheme] @-}
-{-@ type MovieScheme = {v:Dict <{\t val -> (t ~~ "year")}> Tag Value | true } @-}
-
-type Movies    = Table Tag Value
-
-movies :: Movies
-{-@ movies :: Movies @-}
-movies = fromList []
-
-y = "year"
diff --git a/tests/todo/DerivingRead.hs b/tests/todo/DerivingRead.hs
deleted file mode 100644
--- a/tests/todo/DerivingRead.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-{-@ checkNat :: Nat -> Int @-} 
-checkNat :: Int -> Int 
-checkNat x = x
-
-unsound :: Int
-unsound = checkNat (-1)
-
-
-data TestBS = TestBS Int deriving (Read)
-
--- | Possible fixes
--- | 1. add trust-internals flag to ignore the deriving instances
--- | 2. delete the deriving (Read) instance
diff --git a/tests/todo/DiffCheck.hs b/tests/todo/DiffCheck.hs
deleted file mode 100644
--- a/tests/todo/DiffCheck.hs
+++ /dev/null
@@ -1,68 +0,0 @@
-{- TODO: We need an automated test for DiffCheck. That said, our current
-   testing infrastructure isn't set up to test internals, so I'd have to
-   jimmy-rig it to work. Meanwhile, it has been decided (rightfully) that
-   the mechanism I had planned on using was an affront to all that is good,
-   and was fixed as a bug. So this test is now pointless. That said, it
-   should serve as the basis for a good test in the future, so I think we
-   should perserve it for posterity. What follows is my original plan for
-   this test.
-
-   Test diffcheck. Has been rigged with a saved diff in .liquid in the
-   following ways:
-
-   1) goodFn has changed from the saved diff.
-   2) badFn has not changed from the saved diff.
-   3) badFn has violated the invariant of badDep.
-
-   What should happen is: LH will test this file, and will test the
-   goodFn and amazingAlgorithm binders. It will see that goodDep has
-   not changed and is protected by a liquid type signature, and not
-   check it. It will see that badFn has not changed, and is protected
-   by a liquid type signature and not check it. LH will return safe,
-   having checked only goodFn and amazingAlorithm if the diff logic
-   works. If something is broken, it will check badFn and return unsafe. -}
-
-{-@ LIQUID "--diffcheck" @-}
-
-module DiffCheck where
-
-{-@ type Zero = {v:Int | v == 0} @-}
-{-@ type One = {v:Int | v == 1} @-}
-{-@ type Two = {v:Int | v == 2} @-}
-{-@ type Three = {v:Int | v == 3} @-}
-
-{-@ badFn :: Zero -> Bool @-}
-badFn :: Int -> Bool
-badFn 0 = badDep 0
-badFn _ = False
-
-{-@ goodFn :: One -> Bool @-}
-goodFn :: Int -> Bool
-goodFn 1 = goodDep 2 -- I changed!
-goodFn _ = False
-
-{-@ goodDep :: Two -> Bool @-}
-goodDep :: Int -> Bool
-goodDep 2 = True
-goodDep _ = False
-
-{-@ badDep :: Three -> Bool @-}
-badDep :: Int -> Bool
-badDep 3 = True
-badDep _ = False
-
-amazingAlgorithm :: (Bool, Bool)
-amazingAlgorithm = (goodFn 1, badFn 0)
-
--- These guys aren't involved in the above, and should be ignored
--- by DiffCheck
-
-{-@ innocentBystander :: One -> Bool @-}
-innocentBystander :: Int -> Bool
-innocentBystander 1 = goodSamaritan 1
-innocentBystander _ = True
-
-{-@ goodSamaritan :: One -> Bool @-}
-goodSamaritan :: Int -> Bool
-goodSamaritan 1 = True
-goodSamaritan _ = False
diff --git a/tests/todo/Eff0.hs b/tests/todo/Eff0.hs
deleted file mode 100644
--- a/tests/todo/Eff0.hs
+++ /dev/null
@@ -1,16 +0,0 @@
--- | Trivial test for effects
-
-module Eff0 (test0) where
-
-import EffSTT
-
-
-{-@ type IntN N = {v:Int | v = N} @-}
-
-{-@ test0 :: STT (IntN {10}) @-}
-test0 :: STT Int
-test0 =
-  newPtr 0       `bind` \p  ->
-  writePtr p 10  `bind` \_  ->
-  readPtr p      `bind` \v1 ->
-  return v1
diff --git a/tests/todo/Eff1.hs b/tests/todo/Eff1.hs
deleted file mode 100644
--- a/tests/todo/Eff1.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- | Trivial test for effects
-
-module Eff0 (test0, test1) where
-
-import EffSTT
-
-{-@ type IntN N = {v:Int | v = N} @-}
-
-{-@ test0 :: STT (IntN {10}) @-}
-test0 :: STT Int
-test0 = do p  <- newPtr 0
-           _  <- writePtr p 10
-           v1 <- readPtr p
-           return v1
-
-{-@ test1 :: STT (IntN {0}, IntN {10}) @-}
-test1 :: STT (Int, Int)
-test1 = do p  <- newPtr   0
-           v0 <- readPtr  p
-           _  <- writePtr p 10
-           v1 <- readPtr  p
-           return (v0, v1)
diff --git a/tests/todo/Eff2.hs b/tests/todo/Eff2.hs
deleted file mode 100644
--- a/tests/todo/Eff2.hs
+++ /dev/null
@@ -1,22 +0,0 @@
--- | Trivial test for effects
-
-module Eff0 (test0, test1) where
-
-import Data.IORef
-
-{-@ type IntN N = {v:Int | v = N} @-}
-
-{-@ test0 :: IO (IntN {0}) @-}
-test0 :: IO Int
-test0 = do p  <- newIORef   0
-           _  <- writeIORef p 10
-           v1 <- readIORef  p
-           return v1
-
-{-@ test1 :: IO (IntN {0}, IntN {10}) @-}
-test1 :: IO (Int, Int)
-test1 = do p  <- newIORef   0
-           v0 <- readIORef  p
-           _  <- writeIORef p 10
-           v1 <- readIORef  p
-           return (v0, v1)
diff --git a/tests/todo/EffSTT.hs b/tests/todo/EffSTT.hs
deleted file mode 100644
--- a/tests/todo/EffSTT.hs
+++ /dev/null
@@ -1,79 +0,0 @@
-module EffSTT (
-
-  -- * Basic STT type and instances
-    STT
-  , Ptr
-    
-  -- * Monadic operators
-  , ret
-  , bind
-
-  -- * Create a reference
-  , newPtr
- 
-  -- * Read a reference
-  , readPtr
-
-  -- * Write a reference
-  , writePtr
-    
-  )where
-
-import qualified Data.Map as M
-
-type State  = M.Map Int Int
-newtype Ptr = Ptr Int
-data STT a  = STT (State -> (a, State)) 
-
-----------------------------------------------------------------
--- | Accessing State via Ptr
-----------------------------------------------------------------
-
-{-@ newPtr :: forall <H :: HProp>.
-                 n:Int
-              -> STT <{H}, {\l -> H * l := n}> Ptr
-  @-} 
-newPtr   :: Int -> STT Ptr
-newPtr n = STT $ \m0 ->
-  let p  = M.size m0
-      m1 = M.insert p n m0
-  in
-      (Ptr p, m1)
-
-{-@ readPtr :: forall <p :: Int -> Prop, H :: HProp>.
-                  l:Ptr
-               -> STT <{H * l := Int<p>}, {\_ -> H * l := Int<p>}> Int<p>
-  @-}
-readPtr         :: Ptr -> STT Int
-readPtr (Ptr p) = STT $ \m0 ->
-  (M.findWithDefault (error "readPtr DIES") p m0, m0)
-
-
-{-@ writePtr :: forall <p :: Int -> Prop, H :: HProp>.
-                   l:Ptr
-                -> Int<p>
-                -> STT <{H * l := Int}, {\_ -> H * l := Int<p>}> () 
-  @-} 
-writePtr :: Ptr -> Int -> STT () 
-writePtr (Ptr p) n = STT $ \m0 ->
-  ((), M.insert p n m0)
-
-----------------------------------------------------------------
--- | Monad instance for STT
-----------------------------------------------------------------
-
-instance Monad STT where
-  return = ret
-  (>>=)  = bind
-
-ret   :: a -> STT a
-ret x = STT (\s0 -> (x, s0))
-
-bind :: STT a -> (a -> STT b) -> STT b
-bind (STT f) k = STT $ \s0 ->
-  let (x, s1) = f s0
-      STT fk  = k x
-  in
-      fk s1
-
-----------------------------------------------------------------
diff --git a/tests/todo/Ensure.hs b/tests/todo/Ensure.hs
deleted file mode 100644
--- a/tests/todo/Ensure.hs
+++ /dev/null
@@ -1,19 +0,0 @@
-module Ensure where
-
-{-@ qualif Diff(v:int,l:int,d:int): v = l-d @-}
-
-{-@ encodeUtf8 :: Nat -> Nat @-}
-encodeUtf8 :: Int -> Int
-encodeUtf8 len = start 1 0
-  where
-    start size n0 = go (len-n0) n0
-      where
-        go :: Int -> Int -> Int
-        go d n
-          | n == len  = n
-          | otherwise = ensure 1 (\n -> go (d-1) (n+1))
-              where
-                ensure :: Int -> (Int -> Int) -> Int
-                ensure k cont
-                  | size-k >= n = cont n
-                  | otherwise   = start (size*2) n
diff --git a/tests/todo/EnumFromTo.hs b/tests/todo/EnumFromTo.hs
deleted file mode 100644
--- a/tests/todo/EnumFromTo.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module Foo where
-
-new :: l -> [i] -> [sd] -> ([i], [(Int, sd)])
-new l wids m | not (null wids) && length m <= length wids && not (null m)
-  = (unseen, visi)
-  where (seen,unseen) = splitAt (length m) wids
-        (cur:visi)    = [ (s, sd) |  (s, sd) <- zip [0..(length m) ] m ]
-                -- now zip up visibles with their screen id
-new _ _ _ = error "non-positive argument to StackSet.new"
-
-foo :: Num a => a -> [a]
-foo = undefined
-{-@ assume foo :: Num a => x:a -> {v:[a] | (len v) = x} @-}
diff --git a/tests/todo/Equational.hs b/tests/todo/Equational.hs
deleted file mode 100644
--- a/tests/todo/Equational.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-module Equational where
-
-
-import Language.Haskell.Liquid.Prelude
-import Axiomatize
-
-
-{-@ toProof :: l:a -> r:{a | l == r} -> {v:Proof | l == r } @-}
-toProof :: a -> a -> Proof
-toProof x y = Proof
-
-
-{-@ (===) :: l:a -> r:a -> {v:Proof | l = r} -> {v:a | v = l } @-}
-(===) :: a -> a -> Proof -> a
-(===) x y _ = y
-
-
-
-{-@ type Equal X Y = {v:Proof | X == Y} @-}
-
-{-@ bound chain @-}
-chain :: (Proof -> Bool) -> (Proof -> Bool) -> (Proof -> Bool)
-      -> Proof -> Proof -> Proof -> Bool
-chain p q r = \v1 v2 v3 -> p v1 ==> q v2 ==> r v3
-
-{-@  by :: forall <p :: Proof -> Prop, q :: Proof -> Prop, r :: Proof -> Prop>.
-                 {vp::Proof<p> |- Proof<q> <: Proof<r> }
-                 Proof<p> -> Proof<q> -> Proof<r>
-@-}
-by :: Proof -> Proof -> Proof
-by _ r = r
-
-{-@ refl :: x:a -> Equal x x @-}
-refl :: a -> Proof
-refl x = Proof
diff --git a/tests/todo/ExactGADT.hs b/tests/todo/ExactGADT.hs
deleted file mode 100644
--- a/tests/todo/ExactGADT.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-{-# LANGUAGE  GADTs #-}
-
-module Query where
-
-{-@ data Field typ where
-        FldX :: Field Int
-      | FldY :: Field Int
-  @-}
-
-data Field typ where
-  FldX :: Field Int
-  FldY :: Field Int
-
-poogle = FldY
diff --git a/tests/todo/ExactGADT1.hs b/tests/todo/ExactGADT1.hs
deleted file mode 100644
--- a/tests/todo/ExactGADT1.hs
+++ /dev/null
@@ -1,11 +0,0 @@
-{-@ LIQUID "--exact-data-con"                      @-}
-
-{-# LANGUAGE  GADTs #-}
-
-module Query where
-
-data Field typ where
-  FldX :: Field Int
-  FldY :: Field Int
-
-poogle = FldY
diff --git a/tests/todo/ExactGADT2.hs b/tests/todo/ExactGADT2.hs
deleted file mode 100644
--- a/tests/todo/ExactGADT2.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-{-@ LIQUID "--exact-data-con" @-}
-
-{-# LANGUAGE  GADTs #-}
-
-module Query where
-
-{-@ data Field typ where
-        FldX :: Field Int
-      | FldY :: Field Int
-  @-}
-
-data Field typ where
-  FldX :: Field Int
-  FldY :: Field Int
-
-poogle = FldY
diff --git a/tests/todo/FixCrash.hs b/tests/todo/FixCrash.hs
deleted file mode 100644
--- a/tests/todo/FixCrash.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-module Interpreter where 
-
-{- The following code crashes fixpoint see issue 
-https://github.com/ucsd-progsys/liquid-fixpoint/issues/77
--}
-
-data List a = Nil 
-
-{-@ measure progDenote :: List Int -> Maybe (List Int) @-}
-{-@ compile :: {v:Bool | (progDenote Nil) == Nothing } @-}
-compile :: Bool
-compile = undefined 
diff --git a/tests/todo/FldBug.hs b/tests/todo/FldBug.hs
deleted file mode 100644
--- a/tests/todo/FldBug.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-module Foo where
-
-{-@ data Foo = F { thing :: Nat } @-}
-data Foo = F { thing :: Int }
-
-
-{-@ bar :: Foo -> Nat @-}
-bar z = thing z
-
-
diff --git a/tests/todo/Foo.hs b/tests/todo/Foo.hs
deleted file mode 100644
--- a/tests/todo/Foo.hs
+++ /dev/null
@@ -1,31 +0,0 @@
-{-@ LIQUID "--short-names" @-}
-{-@ LIQUID "--no-termination" @-}
-
-module Foo where
-
-import Prelude hiding (map, reverse)
-
-
-baz :: Int
-baz = 1
-
-{-@ poo :: ListN Int 1 @-}
-poo = [baz, baz]
-
-reverse :: [a] -> [a]
-
-{-@ measure size @-}
-size :: [a] -> Int
-size []     = 0
-size (_:xs) = size xs + 1
-
-{-@ type List  a    = [a]                    @-}
-{-@ type ListN a N  = {v:[a] | size v == N } @-}
-{-@ type ListX a Xs = ListN a {size Xs}      @-}
-
-{-@ reverse :: xs:List a -> ListN a {size xs} @-}
-reverse           = go []
-  where
-    {-@ go :: acc:_ -> xs:_ -> ListN a {1 + size acc + size xs} @-}
-    go acc []     = acc
-    go acc (x:xs) = go (x:acc) xs
diff --git a/tests/todo/GhcListSort.hs b/tests/todo/GhcListSort.hs
deleted file mode 100644
--- a/tests/todo/GhcListSort.hs
+++ /dev/null
@@ -1,101 +0,0 @@
-
----------------------------------------------------------------------------
----------------------------  Official GHC Sort ----------------------------
----------------------------------------------------------------------------
-
-sort1 = sortBy1 compare
-sortBy1 cmp = mergeAll . sequences
-  where
-    sequences (a:b:xs)
-      | a `cmp` b == GT = descending b [a]  xs
-      | otherwise       = ascending  b (a:) xs
-    sequences xs = [xs]
-
-    descending a as (b:bs)
-      | a `cmp` b == GT = descending b (a:as) bs
-    descending a as bs  = (a:as): sequences bs
-
-    ascending a as (b:bs)
-      | a `cmp` b /= GT = ascending b (\ys -> as (a:ys)) bs
-    ascending a as bs   = as [a]: sequences bs
-
-    mergeAll [x] = x
-    mergeAll xs  = mergeAll (mergePairs xs)
-
-    mergePairs (a:b:xs) = merge a b: mergePairs xs
-    mergePairs xs       = xs
-
-    merge as@(a:as') bs@(b:bs')
-      | a `cmp` b == GT = b:merge as  bs'
-      | otherwise       = a:merge as' bs
-    merge [] bs         = bs
-    merge as []         = as
-
----------------------------------------------------------------------------
-------------------- Mergesort ---------------------------------------------
----------------------------------------------------------------------------
-
-sort2 l = mergesort compare l
-sortBy2 cmp l = mergesort cmp l
-
-mergesort :: (a -> a -> Ordering) -> [a] -> [a]
-mergesort cmp = mergesort' cmp . map wrap
-
-mergesort' :: (a -> a -> Ordering) -> [[a]] -> [a]
-mergesort' _   [] = []
-mergesort' _   [xs] = xs
-mergesort' cmp xss = mergesort' cmp (merge_pairs cmp xss)
-
-merge_pairs :: (a -> a -> Ordering) -> [[a]] -> [[a]]
-merge_pairs _   [] = []
-merge_pairs _   [xs] = [xs]
-merge_pairs cmp (xs:ys:xss) = merge cmp xs ys : merge_pairs cmp xss
-
-merge :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
-merge _   [] ys = ys
-merge _   xs [] = xs
-merge cmp (x:xs) (y:ys)
- = case x `cmp` y of
-        GT -> y : merge cmp (x:xs)   ys
-        _  -> x : merge cmp    xs (y:ys)
-
-wrap :: a -> [a]
-wrap x = [x]
-
-----------------------------------------------------------------------
--------------------- QuickSort ---------------------------------------
-----------------------------------------------------------------------
-
-sort3 = qsort compare
-
--- qsort is stable and does not concatenate.
-qsort :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
-qsort _   []     r = r
-qsort _   [x]    r = x:r
-qsort cmp (x:xs) r = qpart cmp x xs [] [] r
-
--- qpart partitions and sorts the sublists
-qpart :: (a -> a -> Ordering) -> a -> [a] -> [a] -> [a] -> [a] -> [a]
-qpart cmp x [] rlt rge r =
-    -- rlt and rge are in reverse order and must be sorted with an
-    -- anti-stable sorting
-    rqsort cmp rlt (x:rqsort cmp rge r)
-qpart cmp x (y:ys) rlt rge r =
-    case cmp x y of
-        GT -> qpart cmp x ys (y:rlt) rge r
-        _  -> qpart cmp x ys rlt (y:rge) r
-
--- rqsort is as qsort but anti-stable, i.e. reverses equal elements
-rqsort :: (a -> a -> Ordering) -> [a] -> [a] -> [a]
-rqsort _   []     r = r
-rqsort _   [x]    r = x:r
-rqsort cmp (x:xs) r = rqpart cmp x xs [] [] r
-
-rqpart :: (a -> a -> Ordering) -> a -> [a] -> [a] -> [a] -> [a] -> [a]
-rqpart cmp x [] rle rgt r =
-    qsort cmp rle (x:qsort cmp rgt r)
-rqpart cmp x (y:ys) rle rgt r =
-    case cmp y x of
-        GT -> rqpart cmp x ys rle (y:rgt) r
-        _  -> rqpart cmp x ys (y:rle) rgt r
-
diff --git a/tests/todo/ImportBound.hs b/tests/todo/ImportBound.hs
deleted file mode 100644
--- a/tests/todo/ImportBound.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module ImportBound where
-
-data Proof
-
-{-@ bound chain @-}
-chain :: (Proof -> Bool) -> (Proof -> Bool) -> (Proof -> Bool)
-      -> Proof -> Bool
-chain p q r = \v -> p v
-
-{-@  by :: forall <p :: Proof -> Prop, q :: Proof -> Prop, r :: Proof -> Prop>.
-                 (Chain p q r) => Proof<p> -> Proof<q> -> Proof<r>
-@-}
-by :: Proof -> Proof -> Proof
-by _ r = r
diff --git a/tests/todo/ImportReflected.hs b/tests/todo/ImportReflected.hs
deleted file mode 100644
--- a/tests/todo/ImportReflected.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module ImportedReflect where
-
-import B 
-
-{-@ theorem :: x:Bar -> {bar x = bar x} @-}
-theorem :: Bar -> ()
-theorem _ = ()
diff --git a/tests/todo/ImportedNumericInstances.hs b/tests/todo/ImportedNumericInstances.hs
deleted file mode 100644
--- a/tests/todo/ImportedNumericInstances.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-module ImportedNumericInstances where
-
-{- embed System.Posix.Types.Fd as int @-}
-
-import System.Posix.Types (Fd)
--- Fd is a data type that is imported to be a num instance
-
-testToFix :: Maybe [a] -> Fd 
-testToFix =  maybe 0 (fromIntegral . getFoo)
-
-
-testOK :: Maybe [a] -> Boo 
-testOK =  maybe 0 (fromIntegral . getFoo)
-
-instance Num Boo where
-data Boo 
-
-{-@ getFoo :: {v:[a] | 0 <= len v}  -> Int @-} 
-getFoo :: [a] -> Int 
-getFoo = undefined 
diff --git a/tests/todo/Incr.hs b/tests/todo/Incr.hs
deleted file mode 100644
--- a/tests/todo/Incr.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-module Incr (incr) where 
-
-
-{-@ axiomatize incr @-}
-incr :: Int -> Int
-incr x = x + 1
diff --git a/tests/todo/InfiniteLists.hs b/tests/todo/InfiniteLists.hs
deleted file mode 100644
--- a/tests/todo/InfiniteLists.hs
+++ /dev/null
@@ -1,50 +0,0 @@
-module Fixme where
-
-import Prelude hiding (repeat, take, head)
-import Language.Haskell.Liquid.Prelude
-
-
-{-@ LIQUID "--no-termination" @-}
-
-{-@ measure inf :: [a] -> Prop 
-    inf([])   = false
-    inf(x:xs) = (inf xs)
-  @-}
-
-
--- or any pred *implied* by (inf v)
-{-@ repeat :: a -> {v:[a] | (inf v)} @-}
-repeat :: a -> [a]
-repeat x = x : repeat x
-
-{-@ repeat' :: l:Int -> a -> {v:[a] | (len v) = l} @-}
-repeat' :: Int -> a -> [a]
-repeat' k x = x : repeat' (k-1) x
-
-
-{-@ take :: xs:[a] -> {v:Nat|((inf xs) || (v < (len xs))) } -> [a] @-}
-take :: [a] -> Int -> [a]
-take [] _ = liquidError "take"
-take _ 0 = []
-take (x:xs) i = x : take xs (i-1)
-
-
-{-@ head :: {v:[a] | (((len v) > 0) || (inf v)) } -> a @-}
-head :: [a] -> a
-head (x:_) = x
-head _     = liquidError "head"
-
-
-
-good1 = let x = head (repeat 0) in liquidAssert (x == 0)
-good2 = let x = head ([0, 1]) in liquidAssert (True) -- x == 0
-bad1  = let x = head (repeat 0) in liquidAssert (x == 12)
-bad2  = let x = head [] in liquidAssert (x == 12)
-
-
-foo = take (repeat 0) 5
-
--- bar = (\x -> liquidAssert (False)) (repeat 0)
-
-
-
diff --git a/tests/todo/InlineMeasure.hs b/tests/todo/InlineMeasure.hs
deleted file mode 100644
--- a/tests/todo/InlineMeasure.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-
-module InlineMeasures where
-
-{-@ measure mmax @-}
-mmax       :: (Int, Int) -> Int
-mmax (x,y) = if x > y then x else y
-
-{-@ measure foo @-}
-foo        :: [Int] -> Int
-foo []     = 0
-foo (x:xs) = if (x > 0) then x else 0 
-
-{-@ measure bar @-}
-bar        :: [Int] -> Int
-bar []     = 0
-bar (x:xs) = y + z where y = x
-                         z = 10
-
-{-@ measure llen @-}
-llen        :: [a] -> Int
-llen []     = 0
-llen (x:xs) = 1 + z where z = llen xs
-
-{-@ goo :: _ -> xs:_ -> {v:_ | llen v = llen xs } @-}
-goo f []     = []
-goo f (x:xs) = f x : goo f xs 
diff --git a/tests/todo/IntInvariants.hs b/tests/todo/IntInvariants.hs
deleted file mode 100644
--- a/tests/todo/IntInvariants.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-module Invariant where
-
-
-{-@ invariant {v : Int | v > 0 } @-}
-
-
--- This is unsoundly safe
-
-{-@ bar :: Nat @-}
-bar :: Int
-bar = let x = -5 in x
-
--- but this is not
---
-{-@ foo :: Nat @-}
-foo :: Int
-foo = -5
-
diff --git a/tests/todo/Interpreter.hs b/tests/todo/Interpreter.hs
deleted file mode 100644
--- a/tests/todo/Interpreter.hs
+++ /dev/null
@@ -1,126 +0,0 @@
-module Interpreter where 
-{-@ LIQUID "--totality" @-}
-data BinOp a = Plus | Times
-
-data Exp a  = EConst Int | EBinOp (BinOp a) (Exp a) (Exp a)
-
-data Instr a = IConst Int | IBinOp (BinOp a)
-
-data List a = Nil | Cons a (List a)
-
-
-{-@ autosize Prog @-}
-data Prog a = Emp | PInst (Instr a) (Prog a)
-type Stack = List Int
-
-data SMaybe a = SNothing a | SJust a
-
-{-@ measure binOpDenote @-}
-binOpDenote :: Int -> Int -> BinOp a -> Int 
-binOpDenote x y Plus  = (x+y)
-binOpDenote x y Times = (x*y)
-
-{-@ measure expDenote @-}
-expDenote :: Exp a -> Int 
-expDenote (EConst n)       = n
-expDenote (EBinOp b e1 e2) = binOpDenote (expDenote e1) (expDenote e2) b
-
-{-@foo :: s:Stack -> {v:SMaybe Stack| v = SNothing s || v = SJust s } @-}
-foo :: Stack -> SMaybe Stack
-foo = undefined 
-
-{-@ measure instrDenote @-}
-instrDenote :: Stack -> Instr a -> SMaybe Stack
-{-@ instrDenote :: s:Stack -> i:{v:Instr a | isIBinOp v => lenL s >= 2} 
-                -> {v:SMaybe {st:Stack | if (isIBinOp i) then (lenL st = lenL s - 1) else (lenL st = lenL s + 1)} | v = instrDenote s i} @-}
-instrDenote s (IConst n) = SJust (Cons n s)
-instrDenote s (IBinOp b) = 
-	let x  = headL s in 
-	let s1 = tailL s in 
-	let y  = headL s1 in 
-	let s2 = tailL s1 in 
-	SJust (Cons (binOpDenote x y b) s2)
-
-
-{-@ invariant {v:Prog a | binOps v >= 0} @-}
-{-@ measure binOps @-}
-binOps :: Prog a -> Int 
-binOps Emp = 0 
-binOps (PInst x xs) = if isIBinOp x then 1 + (binOps xs) else binOps xs 
-
-
-
-{- measure progDenote :: Stack -> Prog -> SMaybe Stack @-}
-{-@ measure progDenote @-}
-{-@ Decrease progDenote 2 @-}
-progDenote :: Stack -> Prog a -> SMaybe Stack
-{-@ progDenote :: s:Stack -> p:{v:Prog a | lenL s >= 2 * binOps v }  -> {v: SMaybe Stack | v = progDenote s p} @-}
-progDenote s Emp = SJust s
-progDenote s (PInst x xs) = SNothing s 
-{-
-progDenote s (PInst x xs) | SJust s' <- instrDenote s x = progDenote s' xs
-                          | otherwise                   = SNothing s
--}
-
-{-
-{- compile :: e:Exp -> {v:Prog | (progDenote Nil v) == Nothing } @-}
-{- compile :: e:Exp -> {v:Prog | (progDenote Nil v) == Just (Cons (expDenote e) Nil)} @-}
-compile :: Exp -> Prog
-compile (EConst n)       = single (IConst n)  
-compile (EBinOp b e1 e2) = compile e2 `append` compile e1 `append` (single $ IBinOp b) 
-
--}
-
-
-
--- Hard Wire the measures so that I can provide exact types for Nil and Cons
-{-@ SNothing :: s:s -> {v:SMaybe s | v = SNothing s && not (isSJust v)} @-}
-{-@ SJust    :: s:s -> {v:SMaybe s | v = SJust s && (isSJust v) && (fromSJust v = s)} @-}
-{-@ Cons     :: x:a -> xs:List a -> {v:List a | v = Cons x xs && headL v = x && tailL v = xs && lenL v = 1 + lenL xs} @-}
-{-@ Nil      :: {v:List a | v = Nil  && lenL v = 0} @-}
-iconst = IConst
-
-
-{-@ measure isSJust :: SMaybe a -> Prop @-}
-{-@ isSJust :: x:SMaybe a -> {v:Bool | Prop v <=> isSJust x}  @-}
-isSJust (SJust _) = True 
-isSJust (SNothing _ ) = False
-
-{-@ measure fromSJust :: SMaybe a -> a @-}
-{-@ fromSJust :: x:{v:SMaybe a | isSJust v} -> {v:a | v = fromSJust x}  @-}
-fromSJust (SJust x) = x
-
-{-@ measure isIBinOp @-}
-isIBinOp (IBinOp _) = True
-isIBinOp _          = False
-
-{-@ measure headL :: List a -> a @-}
-{-@ headL :: xs:{v:List a | lenL v > 0} -> {v:a | v = headL xs} @-}
-headL :: List a -> a
-headL (Cons x _) = x
-
-{-@ measure tailL :: List a -> List a @-}
-{-@ tailL :: xs:{v:List a | lenL v > 0} -> {v: List a | v = tailL xs && lenL v = lenL xs - 1} @-}
-tailL :: List a -> List a
-tailL (Cons _ xs) = xs
-
-
-{-@ measure lenL :: List a -> Int @-}
-{-@ invariant {v:List a | lenL v >= 0 } @-}
-lenL :: List a -> Int 
-lenL (Cons _ xs) = 1 + lenL xs 
-lenL Nil         = 0 
-
-
-
--- List operations
-{-@ autosize Exp @-}
-{-@ data List [lenL] @-}
-
-(Cons x xs) `append` ys = cons x $ append xs ys
-Nil         `append` ys = ys 
-
-emp      = Nil
-single x = Cons x Nil
-cons x xs = Cons x xs
-
diff --git a/tests/todo/InvBug.hs b/tests/todo/InvBug.hs
deleted file mode 100644
--- a/tests/todo/InvBug.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-module Isort () where
-
-data F = F 
-
-{-@ measure lenF @-}
-lenF :: F -> Int
-lenF F = 0
-
-
-{- some interaction needed to check the def of lenF satisfies the invariant! -}
-
-{-@ using (F) as  {v: F | (lenF v > 0)} @-}
-
-{-
-
-Mt has type 
-
-  {v:F | lenF v == 0  }  -- from measure 
-  {v:F | lenF v > 0}  -- from invariant
-
-which is inconsistent !
--}
-
-{-@ insert :: F -> {v: F |  false }  @-}
-insert :: F -> F
-insert F = F
-
diff --git a/tests/todo/Invariants.hs b/tests/todo/Invariants.hs
deleted file mode 100644
--- a/tests/todo/Invariants.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Invariant where
-
-data F a = F {fx :: a, fy :: a, fzz :: a} 
-         | G {fx :: a, fy :: a}
-
-{-@ data F a = F {fx :: a, fy :: a, fz :: a}
-             | G {fx :: a, fy :: a} 
-  @-}
-
-{-@ invariant {v : F a | (fy v) = (fx v) } @-}
-
--- F :: x:a -> y:a -> z:a -> { prove this } -> F a
-
-
-bar :: a -> F a -> F a
-bar _ f@(F x y z) = f{fx = y}
diff --git a/tests/todo/Invariants1.hs b/tests/todo/Invariants1.hs
deleted file mode 100644
--- a/tests/todo/Invariants1.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module Foo where
-
-{-@ invariant {v:[Nat] | (sum v) >= 0} @-}
-
-{-@ measure sum :: [Int] -> Int
-    sum([]) = 0
-    sum(x:xs) = x + (sum xs)
-  @-}
-
-{-@ bad :: [Int] -> {v:[Nat] | (sum v) >= 0} @-}
-bad :: [Int] -> [Int]
-bad x = x
-
diff --git a/tests/todo/Invariants2.hs b/tests/todo/Invariants2.hs
deleted file mode 100644
--- a/tests/todo/Invariants2.hs
+++ /dev/null
@@ -1,11 +0,0 @@
-module Invariants where
-
-{-@ measure sum :: [Int] -> Nat
-    sum()     = 0
-    sum(x:xs) = x + (sum xs)
-  @-}
-
-
-{-@ good :: xs:[Int] -> {v:[Int] | (sum xs) >= 0} @-}
-good :: [Int] -> [Int]
-good x = x
diff --git a/tests/todo/InvariantsTermination.hs b/tests/todo/InvariantsTermination.hs
deleted file mode 100644
--- a/tests/todo/InvariantsTermination.hs
+++ /dev/null
@@ -1,52 +0,0 @@
-module InvariantsTermination where
-
-
-data Inv  
-  = InvZero
-  |	InvOne Inv 
-  | InvTwo Inv Inv 
-
-{-@ data Inv [isize] @-}
-
-{-@ measure isize @-}
-{-@ isize :: Inv -> Nat @-}
-isize :: Inv -> Int
-isize d = 
-  case d of 
-  	InvZero      -> 0  
-  	InvOne i     -> 1 + isize i 
-  	InvTwo i1 i2 -> let s1 = isize i1 
-  	                    s2 = isize i2 
-  	                in 1 + s1 + s2  
-
-{-
-to prove both the invariant 
-
-   {v:Inv | invariant v }
-
-  invariant v <=> 0 <= isize v 
-
-and termination on isize 
-the environment is extended with 
- 
-   forall v. 
-      isize v < isize d => invariant v  
-   
-This is not good enought to prove the InvTwo case: 
-
-  isize i1 < isize d => 0 <= isize i1  
-  isize i2 < isize d => 0 <= isize i2 
-  isize d = isize i1 + isize i2
-  ------------------------------
-  0 <= isize i1 < isize d 
-
-
-
-  isize i1 < 1 + isize i1 + isize i2 => 0 <= isize i1  
-  isize i2 < 1 + isize i1 + isize i2 => 0 <= isize i2 
-  ------------------------------
-    0 <  1+ isize i1 
-
-
-
--}
diff --git a/tests/todo/LambdaDeBruijn.hs b/tests/todo/LambdaDeBruijn.hs
deleted file mode 100644
--- a/tests/todo/LambdaDeBruijn.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module LambdaDeBruijn where
-
-{-@ LIQUID "--native" @-}
-type Var = Int
-data Typ
-data Expr = EVar Var
-          | ELam Typ Expr
-          | EUnit
-          | EApp Expr Expr
-
-{-@ autosize Expr @-}
-
-{-@measure isVar @-}
-isVar :: Expr -> Bool
-isVar (EVar _) = True
-isVar _        = False
diff --git a/tests/todo/LambdaDeBruijn0.hs b/tests/todo/LambdaDeBruijn0.hs
deleted file mode 100644
--- a/tests/todo/LambdaDeBruijn0.hs
+++ /dev/null
@@ -1,81 +0,0 @@
-module LambdaDeBruijn where
-
-{- Proving Termination of Parallel Substitutions,
-   see  § 3.2.2 of Dependent Types and Multi Monadic Effects in F*
- -}
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ LIQUID "--native"   @-}
-{-@ LIQUID "--totality" @-}
-
-type Var = Int
-{-@ type EVar = {v:Expr| isEVar v} @-}
-
-type Subst = [(Var,Expr)]
-{-@ type RenamingSubst = {su: [(Var,Expr)] | isRenaming su} @-}
-
-data Typ
-
-data Expr = EVar Var
-          | ELam Typ Expr
-          | EUnit
-          | EApp Expr Expr
-{-@ data Expr [elen] @-}
-
-{-@ type MEVar E SU = {e:Expr | if (isEVar E && isRenaming SU) then (isEVar e) else true } @-}
-
-{-@ sub :: su:Subst -> v:Var -> {v:Expr | if (isRenaming su) then (isEVar v) else true } @-}
-sub [] v                       = EVar v
-sub ((vx, x):su) v | v == vx   = x
-                   | otherwise = sub su v
-
-
-{-@ subst :: e:Expr -> su:Subst -> MEVar e su / [if (isEVar e) then 0 else 1, if (isRenaming su) then 0 else 1, elen e] @-}
-subst EUnit        su = EUnit
-subst (EVar v)     su = sub su v
-subst (EApp e1 e2) su = EApp (subst e1 su) (subst e2 su)
-
-subst (ELam t e)   su | isRenaming su =
-  let su' =  toRem $ (0, EVar 0): map (\i -> (i, subst (sub su (i-1)) $ incrsubst ())) [1..]
-  in ELam t $ subst e su'
-
-subst (ELam t e)   su = -- | not $ isRenaming su
-    let su' =  (0, EVar 0): map (\i -> (i, subst (sub su (i-1)) $ incrsubst ())) [1..]
-    in ELam t $ subst e su'
-
-
-
-
-{-@ incrsubst :: () -> RenamingSubst @-}
-incrsubst :: () -> Subst
-incrsubst _ = toRem $  map (\i -> (i, EVar $ i+1)) [0..]
-
-{-@ measure isEVar @-}
-isEVar :: Expr -> Bool
-isEVar (EVar _) = True
-isEVar _        = False
-
-
-
-toRem :: Subst -> Subst
-{-@ toRem :: [(Var, EVar)] -> RenamingSubst @-}
-toRem [] = []
-toRem ((x, y):sus) = (x, y):toRem sus
-
-
-{-@ measure isRenaming @-}
-isRenaming :: Subst -> Bool
-isRenaming (vx:sus) = isEVar (mysnd vx) && isRenaming sus
-isRenaming [] = True
-
-{-@ measure mysnd @-}
-mysnd (_,y) = y
-
-{-@ invariant {v:Expr | elen v >= 0 } @-}
-{-@ measure elen @-}
-elen :: Expr -> Int
-elen EUnit    = 0
-elen (EVar v) = 0
-elen (ELam _ e) = 1 + elen e
-elen (EApp e1 e2) = 1 + elen e1 + elen e2
diff --git a/tests/todo/LazyVar.hs b/tests/todo/LazyVar.hs
deleted file mode 100644
--- a/tests/todo/LazyVar.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module LazyVar where
-
-{-@ foo :: a -> Bool @-}
-foo :: a -> Bool
-foo = undefined
-
-{-@ bar :: [a] -> Nat -> a @-}
-bar :: [a] -> Int -> a
-bar xs i
-  | i < l && foo x = x
-  | otherwise      = undefined
-  where
-    l = length xs
-    {-@ LAZYVAR x @-}
-    x = xs !! i
diff --git a/tests/todo/LetRecStack.hs b/tests/todo/LetRecStack.hs
deleted file mode 100644
--- a/tests/todo/LetRecStack.hs
+++ /dev/null
@@ -1,43 +0,0 @@
-{-@ LIQUID "--eliminate=all" @-}
-
--- | This test case is to check that LH properly accounts for the case where GHC Core
---   contains stuff like:
---   foo :: T
---   foo =
---     let t1 = e1
---         t2 = e2
---         ...
---         tn = en
---     in
---     let rec bar = e
---     in
---       bar
---
---  where `T` is a liquid type specification. This sort of stuff is introduced by GHC8
---  in order to manage the implicit `CallStack` parameters, but it ends up generating
---  extra KVars where none are needed (as we already have the signature.)
-
-{-@ LIQUID "--no-termination" @-}
-
-module Foo (foo) where
-
-die :: String -> a
-die = error
-
---data Peano a = Z a | S (Peano a) | P (Peano a)
-data Peano = Z | S (Peano ) | P (Peano)
-
-{-@ foo :: Peano -> Nat @-}
-foo :: Peano -> Int
-foo =
-  let t0 = 0
-      t1 = 1
-  in
-  let baz p = case p of
-                Z   -> t0
-                S p -> t1 + baz p
-                P p -> die ms
-              where
-                ms = "yikes"
-  in
-    baz
diff --git a/tests/todo/ListDataCons-Neg.hs b/tests/todo/ListDataCons-Neg.hs
deleted file mode 100644
--- a/tests/todo/ListDataCons-Neg.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Fixme where
-
-data L a = N 
-
-
-{-@ lnil :: {v:L a | v == Fixme.N } @-} 
-lnil :: L a 
-lnil = N
-
-{-@ hnil :: {v:[Int] | v == []} @-} 
-hnil :: [Int] 
-hnil = [0] 
-
-{-@ hcons :: x:a -> a -> xs:[a] -> {v:[a] | v == x:xs} @-} 
-hcons :: a -> a -> [a] -> [a] 
-hcons _ = (:)
diff --git a/tests/todo/ListDataCons-Pos.hs b/tests/todo/ListDataCons-Pos.hs
deleted file mode 100644
--- a/tests/todo/ListDataCons-Pos.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Fixme where
-
-data L a = N 
-
-
-{-@ lnil :: {v:L a | v == Fixme.N } @-} 
-lnil :: L a 
-lnil = N
-
-{-@ hnil :: {v:[a] | v == []} @-} 
-hnil :: [a] 
-hnil = [] 
-
-{-@ hcons :: x:a -> xs:[a] -> {v:[a] | v == x:xs} @-} 
-hcons :: a -> [a] -> [a] 
-hcons = (:)
diff --git a/tests/todo/ListDataCons.hs b/tests/todo/ListDataCons.hs
deleted file mode 100644
--- a/tests/todo/ListDataCons.hs
+++ /dev/null
@@ -1,24 +0,0 @@
-module Fixme where
-
-
-{-@ hsig :: x:a -> {v:[a] | v == (x:[])} @-} 
-hsig :: a -> [a] 
-hsig x = [x] 
-
-
-{-
-
-This crashes with 
-
-(VV#F1 = fix#GHC.Types.#58##35#64([x#aJP; fix#GHC.Types.#91##93##35#6m([])]))
-
-z3Pred: error converting (VV#F1 = fix#GHC.Types.#58##35#64([x#aJP; fix#GHC.Types.#91##93##35#6m([])]))
-Fatal error: exception Failure("bracket hits exn: TpGen.MakeProver(SMT).Z3RelTypeError
-")
-
-Unless these edits
-
-https://github.com/ucsd-progsys/liquid-fixpoint/commit/63e1e1ccfbde4d7a26bd3e328ad111423172a7e9
-
-
--}
diff --git a/tests/todo/ListMem.hs b/tests/todo/ListMem.hs
deleted file mode 100644
--- a/tests/todo/ListMem.hs
+++ /dev/null
@@ -1,79 +0,0 @@
-module ListMem where
-
-
-import Data.Set hiding (partition)
-
-
-{-@ member' :: Eq a 
-           => x:a 
-           -> xs:[a] 
-           -> {v:([{vv:a|vv=x}], [{vv:a|vv!=x}]) | (PairEqElts xs v)}
-  @-}
-member' :: Eq a => a -> [a] -> ([a], [a])
-member' x ls = partition (cmp x) ls 
-
-{-@ member :: Eq a 
-           => x:a 
-           -> xs:[a] 
-           -> {v:Bool|((Prop v) <=> (ListElt x xs))}
-  @-}
-member :: Eq a => a -> [a] -> Bool
-member x ls 
-  = case partition (cmp x) ls of
-     ([], _) -> False -- can not prove this!
-     (_, _)  -> True
-
-{-@ predicate ListElt N LS =
-       (Set_mem N (listElts LS)) 
-  @-}
-
-{-@ predicate PairEqElts X P =
- ((listElts X) = (Set_cup (listElts (getFst P)) (listElts (getSnd P))))
-  @-}
-
-{-@ predicate UnionElts X Y Z W =
-       ((listElts X) = (Set_cup (listElts Y) (Set_cup (listElts Z) (listElts W)))) 
-  @-}
-
-{-@ measure getFst :: (a, b) -> a
-    getFst(a, b) = a 
-  @-}
-
-{-@ measure getSnd :: (a, b) -> b
-    getSnd(a, b) = b
-  @-}
-
-
-{-@ cmp :: Eq a 
-        => x:a 
-        -> y:a 
-        -> Either {v:a| ((v = y) && (v = x))} 
-                  {v:a| ((v != x) && (v = y))} 
-  @-}
-cmp :: Eq a => a -> a ->  Either a a
-cmp x y | x == y    = Left  y
-        | otherwise = Right y
-
-
-{-@ partition :: forall <p :: a -> Prop, q :: a -> Prop>.
-                 (x:a -> Either {v:a<p>|v = x} {v:a<q>|v=x})
-              -> xs:[a] 
-              -> {v:([a<p>], [a<q>]) | (PairEqElts xs v) }
-  @-}
-partition :: (a -> Either a a) -> [a] -> ([a], [a])
-partition f xs = partition' f xs xs ([], [])
-
-{-@ partition' :: forall <p :: a -> Prop, q :: a -> Prop>.
-                 (x:a -> Either {v:a<p>|v = x} {v:a<q>|v=x})
-              -> init:[a] 
-              -> xs:[a] 
-              -> ack:{v:([a<p>], [a<q>]) | ((listElts init) = (Set_cup (listElts xs) (Set_cup (listElts (getFst v)) (listElts (getSnd v))))) }
-              -> {v:([a<p>], [a<q>]) | (listElts init) = (Set_cup (listElts (getFst v)) (listElts (getSnd v)))}
-  @-}
-partition' :: (a -> Either a a) -> [a] -> [a] -> ([a], [a]) -> ([a], [a])
-partition' _ a [] (x, y) = (x, y)
-partition' f a (x:xs) (pos, neg) 
-  = case f x of
-    Left _  -> partition' f a xs (x:pos, neg) 
-    Right _ -> partition' f a xs (pos, x:neg) 
-
diff --git a/tests/todo/LocalRecursiveFuns.hs b/tests/todo/LocalRecursiveFuns.hs
deleted file mode 100644
--- a/tests/todo/LocalRecursiveFuns.hs
+++ /dev/null
@@ -1,37 +0,0 @@
-module Blank where
-
-data Tree a = Tip | Node a (Tree a) (Tree a)
-
-tmap                :: (a -> b) -> Tree a -> Tree b
-tmap f Tip          = Tip
-tmap f (Node x l r) = Node (f x) (tmap f l) (tmap f r)
-
------------------------------------------------------------
-{-@ union :: t1:(Tree a) -> t2:(Tree a) -> (Tree a) /[(sz t1) + (sz t2)] @-}
--- union :: Tree a -> Tree a -> Tree a
-union Tip          t = t
-union (Node x a b) t = Node x taa tbb
-  where
-    taa              = union ta a
-    tbb              = union tb b
-    (ta,  tb)        = split x t
-
------------------------------------------------------------
-
-{-@ split :: a -> t:Tree a -> (TreeLe a t, TreeLe a t) @-}
-split :: a -> Tree a -> (Tree a, Tree a)
-split = undefined
-
-{-@ type TreeLe a T = {v:Tree a | (sz v) <= (sz T)} @-}
-
-{-@ data Tree [sz]  @-}
-
-{-@ measure sz      :: Tree a -> Int
-    sz (Tip)        = 0
-    sz (Node x l r) = 1 + (sz l) + (sz r)
-  @-}
-  
-{-@ invariant {v:(Tree a) | (sz v) >= 0} @-}
-
-{-@ qualif TreeLt(v:Tree a, t:Tree b): (sz v) < (sz t) @-}
-
diff --git a/tests/todo/LocalSpec.hs b/tests/todo/LocalSpec.hs
deleted file mode 100644
--- a/tests/todo/LocalSpec.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-module LocalSpec () where
-
-import Language.Haskell.Liquid.Prelude (choose)
-
-
-prop = if x > 0 then bar x else foo x
-  where x = choose 0
-    {-@ Local bar :: Nat -> Nat @-}
-        bar :: Int -> Int
-        bar x = x
-    {-@ Local foo :: Nat -> Nat @-}
-        foo :: Int -> Int
-        foo x = x
-
-{-@ bar :: a -> {v:Int | v = 9} @-}
-bar :: a -> Int
-bar _ = 9
diff --git a/tests/todo/LocalSpec1.hs b/tests/todo/LocalSpec1.hs
deleted file mode 100644
--- a/tests/todo/LocalSpec1.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module Foo where
-
-{-@ filterElts :: forall <p :: a -> Prop>. Eq a => [a<p>] -> [a] -> [a<p>] @-}
-filterElts :: Eq a => [a] -> [a] -> [a]
-filterElts xs ys = go xs xs ys
-
-
-{-@ go :: forall <p :: a -> Prop>. Eq a => xs:[a<p>] -> ws:[a<p>] -> zs:[a] -> [a<p>] /[(len zs), (len ws)] @-}
-go :: Eq a => [a] -> [a] -> [a] -> [a]
-go xs (w:ws) (z:zs) | w == z    = z : go xs xs zs
-                    | otherwise = go xs ws (z:zs)
-go xs []     (z:zs)             = go xs xs zs
-go xs ws     []                 = []
-
diff --git a/tests/todo/LocalSpecImport.hs b/tests/todo/LocalSpecImport.hs
deleted file mode 100644
--- a/tests/todo/LocalSpecImport.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module LocalSpecImport where
-
-import LocalSpec
-
-{-@ baz :: Nat -> Nat @-}
-baz :: Int -> Int
-baz x = x
diff --git a/tests/todo/LocalSpecTyVar.hs b/tests/todo/LocalSpecTyVar.hs
deleted file mode 100644
--- a/tests/todo/LocalSpecTyVar.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module LocalSpecTyVar where
-
-foo = go
-  where
-    {-@ go :: xs:[a] -> {v:[a] | (len v) > (len xs)} @-}
-    go []     = []
-    go (x:xs) = x : go xs
diff --git a/tests/todo/LocalTermExpr1.hs b/tests/todo/LocalTermExpr1.hs
deleted file mode 100644
--- a/tests/todo/LocalTermExpr1.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-module LocalTermExpr where
-
-{-@ assume (!!) :: xs:[a] -> {v:Nat | v < len xs} -> a @-}
-
-mysum xs = go 0 0
-  where
-    i = 0
-    n = length xs
-    {-@ go :: i:_ -> _ -> _ / [len xs - i] @-}
-    go i acc
-      | i >= n    = acc
-      | otherwise = go (i+1) (acc + xs !! i)
-
-myfoo = foo 5 True
-  where
-    n = False
-    {-@ foo :: n:_ -> b:{_ | n >= 0 && Prop b} -> {v:_ | n >= 0 && (Prop b)} / [n-0] @-}
-    foo :: Int -> Bool -> Bool
-    foo 0 _ = True
-    foo n b = foo (n-1) b
diff --git a/tests/todo/Machine.hs b/tests/todo/Machine.hs
deleted file mode 100644
--- a/tests/todo/Machine.hs
+++ /dev/null
@@ -1,145 +0,0 @@
-{-# LANGUAGE LambdaCase, DeriveDataTypeable, OverloadedStrings, GeneralizedNewtypeDeriving #-}
-
-{-@ LIQUID "--no-case-expand" @-}
-{-@ LIQUID "--trustinternals" @-}
-
-import qualified Data.Map as Map
-import qualified Data.Generics as SYB
-import Data.String
-import Text.PrettyPrint
-
--- Syntax
-
-newtype Var = Var String
-  deriving (Eq, Ord, Show, SYB.Data, SYB.Typeable, IsString)
-
-newtype Con = Con String
-  deriving (Eq, Ord, Show, SYB.Data, SYB.Typeable, IsString)
-
-type Alts = [(Con, [Var], Expr)]
-
-data Expr
-  = EVar Var
-  | ELam Var Expr
-  | EApp Expr Var
-  | ELet [(Var, Expr)] Expr
-  | ECon Con [Var]
-  | ECase Expr Alts
-  deriving (Eq, Ord, Show, SYB.Data, SYB.Typeable)
-
-instance IsString Expr where
-  fromString = EVar . fromString
-
-isValue :: Expr -> Bool
-isValue = \case
-  ELam {} -> True
-  ECon {} -> True
-  _ -> False
-
--- Abstract machine
-type Heap = Map.Map Var Expr
-type Stack = [StackItem]
-data StackItem
-  = StackUpdate Var
-  | StackVar Var
-  | StackAlts Alts
-  deriving (Show, SYB.Data, SYB.Typeable)
-data Machine = Machine Heap Expr Stack
-  deriving (Show)
-
-step :: Machine -> Machine
-step (Machine heap e stack)
-  -- Lookup
-  | EVar x <- e =
-      let m = heap Map.! x
-      in Machine heap m (StackUpdate x : stack)
-  -- Update
-  | isValue e, StackUpdate v : stack' <- stack =
-      Machine (Map.insert v e heap) e stack'
-  -- Unwind
-  | EApp m x <- e = Machine heap m (StackVar x : stack)
-  -- Subst
-  | ELam x m <- e, StackVar y : stack' <- stack =
-      Machine heap (subst (Map.singleton x y) e) stack'
-  -- Case
-  | ECase m alts <- e = Machine heap m (StackAlts alts : stack)
-  -- Branch
-  | ECon con xs <- e, StackAlts alts : stack' <- stack =
-      let [(boundVars, body)] = [(boundVars, body) | (con', boundVars, body) <- alts, con == con']
-          e' = subst (Map.fromList $ zip boundVars xs) body
-      in Machine heap e' stack'
-  -- Letrec
-  | ELet binds body <- e = Machine (Map.union (Map.fromList binds) heap) body stack
-
-
--- Example refinements on Map.Map
-{-@ measure mlen :: Map.Map a b -> Int @-}
-{-@ invariant {v:Map.Map k v | (mlen v >= 0) } @-}
-{-@ assume Map.delete :: Ord k => x:k -> m:Map.Map k v -> {v:Map.Map k v |(melem x m) =>  mlen v < mlen m} @-}
-
-{-@ measure melem :: k -> Map.Map k v -> Prop @-}
--- 
-
--- Sizing Expressions:
--- TODO: define elen for the rest of the cases 
-
-{-@ invariant {v:Expr | elen v > 0} @-}
-{-@ measure elen :: Expr -> Int 
-    elen (ELam x e)   = 1 + (elen e)
-  @-}
-
-{-@ subst :: (Map.Map Var Var) -> e:Expr -> Expr / [elen e]  @-}
-subst :: Map.Map Var Var -> Expr -> Expr
-subst sm = \case
-  EVar x | Just y <- Map.lookup x sm -> EVar y
-  e@(ELam z body) -> ELam z (subst (Map.delete z sm) body)
-  e -> SYB.gmapT (SYB.mkT $ subst sm) e
-
-initMachine :: Expr -> Machine
-initMachine e = Machine Map.empty e []
-
-isFinished :: Machine -> Bool
-isFinished (Machine _ e stack) = isValue e && null stack
-
-run :: Machine -> Machine
-run m
-  | isFinished m = m
-  | otherwise = run $ step m
-
--- Pretty-printing
-ppVar (Var x) = text x
-ppCon (Con x) = text x
-ppExpr :: Expr -> Doc
-ppExpr = ppExpr' False
-ppExpr' :: Bool -> Expr -> Doc
-ppExpr' p e =
-  let maybeParens = if p then parens else id in
-  case e of
-    EVar x -> ppVar x
-    ELam x body -> maybeParens $
-      text "Î»" <> ppVar x <> text "." <> ppExpr' False body
-    EApp a b -> ppExpr' False a <+> ppVar b
-    ECon con xs -> sep $ ppCon con : map ppVar xs
-    ELet binds body ->
-      vcat
-        [ "let" $$ nest 2 (vcat (punctuate semi (map (\(v,e) -> ppVar v <+> hang "=" 2 (ppExpr e)) binds)))
-        , "in" $$ nest 2 (ppExpr body)
-        ]
-    ECase e alts ->
-      let ppAlt (con, vars, body) =
-            ppCon con <+> sep (map ppVar vars) <+> "->" <+> ppExpr body
-      in text "case" <+> ppExpr e <+> "of" $$ nest 2 (vcat (map ppAlt alts))
-
--- Some object-language programs
-nil, cons :: Expr
-nil = ECon "nil" []
-cons = ELam "x" $ ELam "y" $ ECon "cons" ["x", "y"]
-append = ELet [("append", appendBind)] "append"
-  where
-    appendBind =
-      ELam "a" $ ELam "b" $ ECase "a"
-        [("nil", [], "b")
-        ,("cons", ["x", "xs"],
-          ELet [("r", "append" `EApp` "xs" `EApp` "b")]
-            (cons `EApp` "x" `EApp` "r"))
-        ]
diff --git a/tests/todo/Map-strict.hs b/tests/todo/Map-strict.hs
deleted file mode 100644
--- a/tests/todo/Map-strict.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-module Data.Map.Base (Map(..), singleton) where
-
-data Map k a  = Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a)
-              | Tip
-
-type Size     = Int
-
-{-@ 
-  data Map k a <l :: root:k -> k -> Bool, r :: root:k -> k -> Bool>
-       = Bin (sz    :: Size) 
-             (key   :: k) 
-             (value :: a) 
-             (left  :: Map <l, r> (k <l key>) a) 
-             (right :: Map <l, r> (k <r key>) a) 
-       | Tip 
-  @-}
-
-{-@ type OMap k a = Map <{v:k | v < root}, {v:k | v > root}> k a @-}
-
-{-@ singleton :: k -> a -> OMap k a @-}
-singleton :: k -> a -> Map k a
-singleton k x = Bin 1 k x Tip Tip
-{-# INLINE singleton #-}
-
-
diff --git a/tests/todo/Map-wierd.hs b/tests/todo/Map-wierd.hs
deleted file mode 100644
--- a/tests/todo/Map-wierd.hs
+++ /dev/null
@@ -1,171 +0,0 @@
-module Map where
-
-import Language.Haskell.Liquid.Prelude
-
--- LIQUID: There is some bizarre interaction between the names in Map-pred
--- and Pair-pred -- because the error goes away if you remove "Pair"
--- altogether from the code.
-
-{-@ 
-  data Map k a <l :: x00:k -> x1:k -> Bool, r :: x00:k -> x1:k -> Bool>
-      = Tip 
-      | Bin (sz    :: Size) 
-            (key   :: k) 
-            (value :: a) 
-            (left  :: Map <l, r> (k <l key>) a) 
-            (right :: Map <l, r> (k <r key>) a) 
-  @-}
-
-{-@ type OMap k a = Map <{v:k | v < x00 }, {v:k | v > x00}> k a @-}
-
-data Map k a = Tip
-             | Bin Size k a (Map k a) (Map k a)
-
-type Size    = Int
-{-@
-data Pair k v <p :: x0:k -> x1:k -> Bool, l :: x0:k -> x1:k -> Bool, r :: x0:k -> x1:k -> Bool>
-  = P (fld0 :: k) (fld1 :: v) (tree :: Map <l, r> (k <p fld0>) v) 
-  @-}
-data Pair k v = P k v (Map k v)
-
-{-@ singleton :: k -> a -> OMap k a @-}
-singleton :: k -> a -> Map k a
-singleton k x
-  = Bin 1 k x Tip Tip
-
-{-@ insert :: Ord k => k -> a -> OMap k a -> OMap k a @-}
-insert :: Ord k => k -> a -> Map k a -> Map k a
-insert kx x t
-  = case t of 
-     Tip -> singleton kx x
-     Bin sz ky y l r
-         -> case compare kx ky of
-              LT -> balance ky y (insert kx x l) r
-              GT -> balance ky y l (insert kx x r)
-              EQ -> Bin sz kx x l r
-
-{-@ delete :: (Ord k) => k -> OMap k a -> OMap k a @-}
-delete :: Ord k => k -> Map k a -> Map k a
-delete k t 
-  = case t of 
-      Tip -> Tip
-      Bin _ kx x l r
-          -> case compare k kx of 
-               LT -> balance kx x (delete k l) r
-               GT -> balance kx x l (delete k r)
-               EQ -> glue kx l r 
-
-
-glue :: k -> Map k a -> Map k a -> Map k a
-glue k Tip r = r
-glue k l Tip = l
-glue k l r
-  | size l > size r = let P km1 vm lm = deleteFindMax l in balance km1 vm lm r
-  | otherwise       = let P km2 vm rm = deleteFindMin r in balance km2 vm l rm
-
-deleteFindMax :: Map k a -> Pair k a
-deleteFindMax t 
-  = case t of
-      Bin _ k x l Tip -> P k x l
-      Bin _ k x l r -> let P km3 vm rm = deleteFindMax r in P km3 vm (balance k x l rm) 
-      Tip             -> P (error ms) (error ms) Tip
-  where ms = "Map.deleteFindMax : can not return the maximal element of an empty Map"   
-
-
-deleteFindMin :: Map k a -> Pair k a
-deleteFindMin t 
-  = case t of
-      Bin _ k x Tip r -> P k x r
-      Bin _ k x l r -> let P km4 vm lm = deleteFindMin l in P km4 vm (balance k x lm r) 
-      Tip             -> P (error ms) (error ms) Tip
-  where ms = "Map.deleteFindMin : can not return the maximal element of an empty Map"   
-
-
--------------------------------------------------------------------------------
---------------------------------- BALANCE -------------------------------------
--------------------------------------------------------------------------------
-
-delta, ratio :: Int
-delta = 5
-ratio = 2
-
-balance :: k -> a -> Map k a -> Map k a -> Map k a 
-balance k x l r 
-  | sizeL + sizeR <= 1   = Bin sizeX k x l r
-  | sizeR >= delta*sizeL = rotateL k x l r
-  | sizeL >= delta*sizeR = rotateR k x l r
-  | otherwise            = Bin sizeX k x l r
-  where sizeL = size l
-        sizeR = size r
-        sizeX = sizeL + sizeR + 1
-
--- rotate
-rotateL :: a -> b -> Map a b -> Map a b -> Map a b
-rotateL k x l r@(Bin _ _ _ ly ry) 
-  | size ly < ratio*size ry  = singleL k x l r
-  | otherwise                = doubleL k x l r
-rotateL _ _ _ Tip = error "rotateL Tip"
-
-rotateR :: a -> b -> Map a b -> Map a b -> Map a b
-rotateR k x l@(Bin _ _ _ ly ry) r
-  | size ry < ratio*size ly  = singleR k x l r
-  | otherwise                = doubleR k x l r
-rotateR _ _ _ Tip = error "rotateR Tip"
-
--- basic rotations
-singleL, singleR :: a -> b -> Map a b -> Map a b -> Map a b
-singleL k1 x1 t1 (Bin _ k2 x2 t2 t3) = bin k2 x2 (bin k1 x1 t1 t2) t3
-singleL _  _  _ Tip = error "sinlgeL Tip"
-singleR k1 x1 (Bin _ k2 x2 t1 t2) t3 = Bin 0 k2 x2 t1 (Bin 0 k1 x1 t2 t3)
-singleR _  _  _ Tip = error "sinlgeR Tip"
-
-doubleL, doubleR :: a -> b -> Map a b -> Map a b -> Map a b
-doubleL k1 x1 t1 (Bin _ k2 x2 (Bin _ k3 x3 t2 t3) t4)
- =bin k3 x3 (bin k1 x1 t1 t2) (bin k2 x2 t3 t4)
-doubleL _ _ _ _ = error "doubleL" 
-doubleR k1 x1 (Bin _ k2 x2 t1 (Bin _ k3 x3 t2 t3)) t4 
-  = bin k3 x3 (bin k2 x2 t1 t2) (bin k1 x1 t3 t4)
-doubleR _ _ _ _ = error "doubleR" 
-
-bin :: k -> a -> Map k a -> Map k a -> Map k a
-bin k x l r 
-  = Bin (size l + size r + 1) k x l r
-
-size :: Map k a -> Int
-size t 
-  = case t of 
-      Tip            -> 0
-      Bin sz _ _ _ _ -> sz
-
-
-chkDel x Tip                = liquidAssertB True  
-chkDel x (Bin sz k v lt rt) = liquidAssertB (not (x == k)) && chkDel x lt && chkDel x rt
-
-chkMin x Tip                = liquidAssertB True  
-chkMin x (Bin sz k v lt rt) = liquidAssertB (x<k) && chkMin x lt && chkMin x rt
-
-chk Tip               = liquidAssertB True  
-chk (Bin s k v lt rt) = chk lt && chk rt && chkl k lt && chkr k rt
-		
-chkl k Tip              = liquidAssertB True
-chkl k (Bin _ kl _ _ _) = liquidAssertB (kl < k)
-
-chkr k Tip              = liquidAssertB True
-chkr k (Bin _ kr _ _ _) = liquidAssertB (k < kr)
-
-key, key1, val, val1 :: Int
-key = choose 0
-val = choose 1
-key1 = choose 0
-val1 = choose 1
-
-bst1 = insert key val Tip
-bst  = insert key val $ insert key1 val1 Tip
-
-mkBst = foldl (\t (k, v) -> insert k v t) Tip
-
-prop        = chk bst1
-prop1       = chk $ mkBst $ zip [1..] [1..]
-
-propDelete  = chk $ delete x bst
-   where x = choose 0
diff --git a/tests/todo/MaybeReflect0.hs b/tests/todo/MaybeReflect0.hs
deleted file mode 100644
--- a/tests/todo/MaybeReflect0.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-{-@ LIQUID "--higherorder"     @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-
-
-{-# LANGUAGE IncoherentInstances   #-}
-{-# LANGUAGE FlexibleContexts #-}
-module MaybeReflect0 where
-
-
-import Prelude hiding (Maybe(..))
-
-data Maybe a = Nothing | Just a
-{-@ data Maybe a = Nothing | Just a @-}
-
-
-{-@ reflect seq @-}
-seq :: Maybe (a -> b) -> Maybe a -> Maybe b
-seq (Just f) (Just x) = Just (f x)
-seq _         _       = Nothing
-
-{-@ reflect compose @-}
-compose :: (b -> c) -> (a -> b) -> a -> c
-compose f g x = f (g x)
-
-{-@ reflect pure @-}
-pure :: a -> Maybe a
-pure x = Just x
diff --git a/tests/todo/MaybeReflect1.hs b/tests/todo/MaybeReflect1.hs
deleted file mode 100644
--- a/tests/todo/MaybeReflect1.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-{-@ LIQUID "--higherorder"     @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-
-
-{-# LANGUAGE IncoherentInstances   #-}
-{-# LANGUAGE FlexibleContexts #-}
-module MaybeReflect1 where
-
-
-import Prelude hiding (Maybe(..))
-
-data Maybe a = Nothing | Just a
-{-@ data Maybe a = Nothing | Just a @-}
-
-
-{-@ reflect seqm @-}
-seqm :: Maybe (a -> b) -> Maybe a -> Maybe b
-seqm (Just f) (Just x) = Just (f x)
-seqm _         _       = Nothing
-
-{-@ reflect composem @-}
-composem :: (b -> c) -> (a -> b) -> a -> c
-composem f g x = f (g x)
-
-{-@ reflect purem @-}
-purem :: a -> Maybe a
-purem x = Just x
diff --git a/tests/todo/Means.hs b/tests/todo/Means.hs
deleted file mode 100644
--- a/tests/todo/Means.hs
+++ /dev/null
@@ -1,122 +0,0 @@
-{-# LANGUAGE TypeSynonymInstances #-}
-
-module Means where
-
-import Prelude hiding ((*))
-import qualified Prelude as Pr
-import Language.Haskell.Liquid.Prelude
-
-type Scalar = Double
-
-{-@ assume (*) :: x:Scalar -> y:Scalar -> {v:Scalar | v = (times x y)} @-}
-(*) :: Scalar -> Scalar -> Scalar
-(*) = (Pr.*)
-
-{-@ assume inverse :: x:{v:Scalar | v != 0} -> {v:Scalar | v = (inverse x)} @-}
-inverse :: Scalar -> Scalar
-inverse x | x == zero = error "inverse a zero value"
-          | otherwise = one / x
-
--- Double 1 does not take a singleton type
-{-@ assume one :: {v:Scalar | v = 1} @-}
-one :: Scalar
-one = 1
-
-{-@ assume two :: {v:Scalar | v = 2} @-}
-two :: Scalar
-two = 2
-
-{-@ assume zero :: {v:Scalar | v = 0} @-}
-zero :: Scalar
-zero = 0
-
-
-{-@
-  measure times :: Scalar -> Scalar -> Scalar
-  @-}
-
-{-@
-  measure inverse :: Scalar -> Scalar
-  @-}
-
--- Properties of multiplication
-
-{-@ mulNeutral :: x:Scalar -> {v:Bool | x = (times 1 x)} @-}
-mulNeutral :: Scalar -> Bool
-mulNeutral x | x == one * x = True
-      --        | otherwise  = error "mulNeutral fails"
-
-{-@ mulExpTwo :: x:Scalar -> {v:Bool | (times 2 x) = x + x } @-}
-mulExpTwo :: Scalar -> Bool
-mulExpTwo x  | two * x == x + x = True
-      --        | otherwise  = error "mulAssoc fails"
-
-{-@ mulTrans :: x:Scalar -> y:Scalar -> z:Scalar -> {v:Bool | (times (times x y) z) = (times x (times y z))} @-}
-mulTrans :: Scalar -> Scalar -> Scalar -> Bool
-mulTrans x y z | x * y * z == x * (y * z) = True
-      --        | otherwise  = error "mulAssoc fails"
-
-{-@ mulAssoc :: x:Scalar -> y:Scalar -> {v:Bool | (times x y) = (times y x)} @-}
-mulAssoc :: Scalar -> Scalar -> Bool
-mulAssoc x y | x * y == y * x = True
-      --        | otherwise  = error "mulAssoc fails"
-
-{-@ mulDivId :: x:{v:Scalar|v/= 0} -> {v:Bool | 1 = (times x (inverse x))} @-}
-mulDivId :: Scalar -> Bool
-mulDivId x | one == x * inverse x = True
-      --   | otherwise  = error "mulDivId fails"
-
--- Class Specifications
-class Vec a where
-  norm :: a -> Scalar
-  mean :: a -> a -> Scalar
-  {-@ dist :: Vec a => x:a -> y:a -> {v:Scalar | v = (dist x y) } @-}
-  dist :: a -> a -> Scalar
-
-{-@ class measure dist :: forall a . a -> a -> Scalar @-}
-
--- Assumptions:
--- Triangle Inequality
-
-{-@ triangleInequality :: Vec a => x:a -> y:a -> c:a ->
-      {v:Bool | ((((dist x c) + (dist c y)) >= (dist x y)))} @-}
-triangleInequality :: Vec a => a -> a -> a -> Bool
-triangleInequality x y c 
-  | (dist x c + dist c y) >= (dist x y) 
-  = True
-  | otherwise                           
-  = error "Vec.dist does not satisfy triangleInequality"            
-
-
-
-{-@ foo :: x:Scalar -> {v:Scalar |  v= x} @-}
-foo :: Scalar -> Scalar
-foo x = liquidAssume (mulNeutral x) $ one * x 
-
-
-{-@ type Valid = {v:Bool | ((Prop v) <=> true)} @-}
-
-{-@ prop1 :: Vec a => a -> a -> a -> Valid @-}
-prop1 :: Vec a => a -> a -> a -> Bool
-prop1 x y c = liquidAssume ( triangleInequality x y c 
-                          && mulNeutral dxy 
-                          && mulDivId two
-                          && mulTrans two itwo dxy
-                          && mulExpTwo itwo_dxy
-                           ) $ 
-              (dist x c) + (dist c y) >= (itwo_dxy + itwo_dxy')
-  where c'  = mean x y
-        dxy = dist x y
-        itwo = inverse two
-        itwo_dxy = itwo * dxy              -- = dist (y, mean x y)
-        itwo_dxy' = inverse two * dist x y -- = dist (x, mean x y)
-
-
--- Q: how do we enforce linear arithmetic now? tests/pos/mul.hs
--- Step 1: encode everything as Real and use nlsat tactick
---         (check-sat-using qfnra-nlsat)
---         http://rise4fun.com/Z3/1EYC
--- Step 2: encode class theorems, like triangleInequality
---         at every environment with 3 Vecs enforce the theorem
--- Step 3: "prove" the theorems for class instances
---           testing?
diff --git a/tests/todo/Measure.hs b/tests/todo/Measure.hs
deleted file mode 100644
--- a/tests/todo/Measure.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-module Measure where
-
-
-
-data Foo a = F a 
-
-{-@ measure foo :: a -> Int @-}
-
-{-@ measure bar :: (Foo a) -> Bool
-    bar(F xs) = (foo xs)         @-}
diff --git a/tests/todo/MeasureImport.hs b/tests/todo/MeasureImport.hs
deleted file mode 100644
--- a/tests/todo/MeasureImport.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-{-@ LIQUID "--exactdc" @-}
-
-import AA
-
-{-@ lazy bar @-}
-{-@ bar :: Foo a b -> {v:Foo a b | isFoo v} @-}
-bar :: Foo a b -> Foo a b
-bar x | isFoo x 
-  = x 
-bar x = bar x 
diff --git a/tests/todo/NameClash.hs b/tests/todo/NameClash.hs
deleted file mode 100644
--- a/tests/todo/NameClash.hs
+++ /dev/null
@@ -1,68 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-
-{-@ LIQUID "--no-termination" @-}
-
-module LinSpace () where
-
-
-data PVector = PVector [Integer] [Integer] (Space PVector) -- { 
-
--- | Orthogonalized vector bn* and squared lattice determinant 
-data Space a = Null | Real a Integer
-
-{-@ data PVector = PVector { 
-      pec_  :: [Integer]   
-    , mu_   :: [Integer] 
-    , orth_ :: {v: (Space (PVectorN (len pec_))) | (dim v) = (len mu_)}
-    } 
-  @-}
-
-{-@ data Space [dim] @-}
-
-{-@ measure dim     :: (Space PVector) -> Int 
-    dim (Null)      = 0
-    dim (Real pv n) = 1 + (dim (orthSpace pv))
-  @-}
-
-{-@ measure spaceVec     :: (Space PVector) -> PVector
-    spaceVec (Real pv n) = pv
-  @-}
-
-{-@ measure vec :: PVector -> [Integer]
-    vec (PVector p m o) = p
-  @-}
-{-@ measure orthSpace :: PVector -> (Space PVector)
-    orthSpace (PVector v m o) = o
-  @-}
-
-{-@ measure muCoeff :: PVector -> [Integer]
-    muCoeff (PVector v m o) = m 
-  @-}
-
---  If the above v is renames to anything else the test is SAFE
--- this v creates a type for PVector
--- PVector :: v{} -> m {} -> o{}
--- and the argument bind v clashs with the special value v....
-
-{-@ invariant {v: PVector | (Inv v) }    @-}
-{-@ invariant {v: Space | (dim v) >= 0 } @-}
-
--- RJ: Helpers for defining properties
-
-{-@ predicate Inv V        = (dim (orthSpace V)) = (len (muCoeff V)) @-}
-{-@ predicate SameLen  X Y = ((len (vec X))  = (len (vec Y)))  @-}
-{-@ predicate SameOrth X Y = ((orthSpace X) = (orthSpace Y)) @-}
-
--- RJ: Useful type aliases for specs
-
-{-@ type SameSpace X       = {v:PVector | ((Inv v) && (SameLen X v) && (SameOrth X v))} @-}
-{-@ type PVectorN N        = {v: PVector | (len (vec v)) = N}   @-} 
-{-@ type PVectorP P        = {v: PVector | (SameLen v P)}       @-} 
-
---------------------
-
-
-{-@ orthSpace_ :: p:PVector -> (Space (PVectorP p))  @-} 
-orthSpace_ (PVector v m o) = o
-
-
diff --git a/tests/todo/NativeFixCrash.hs b/tests/todo/NativeFixCrash.hs
deleted file mode 100644
--- a/tests/todo/NativeFixCrash.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module Interpreter where 
-
-data Instr = I
-
-data List a = Nil | Cons a (List a)
-
-type Prog  = List Instr
-type Stack = List Int
-
-{-@ measure progDenote :: Stack -> Prog -> Maybe Stack @-}
-progDenote :: Stack -> Prog -> Maybe Stack
-progDenote s Nil = Just s
-progDenote s (Cons x xs) | Just s' <- Just s  = progDenote s' xs
-
diff --git a/tests/todo/NeuralNetwork.hs b/tests/todo/NeuralNetwork.hs
deleted file mode 100644
--- a/tests/todo/NeuralNetwork.hs
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/usr/bin/env stack
--- stack --resolver lts-5.15 --install-ghc runghc --package hmatrix --package MonadRandom
-
--- FROM: https://github.com/mstksg/inCode/blob/master/code-samples/dependent-haskell/NetworkUntyped.hs
-
-{-# LANGUAGE BangPatterns        #-}
-{-# LANGUAGE FlexibleContexts    #-}
-{-# LANGUAGE GADTs               #-}
-{-# LANGUAGE KindSignatures      #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-
-import Control.Monad
-import Control.Monad.Random
-import Data.List
-import Data.Maybe
-import Numeric.LinearAlgebra
-import System.Environment
-import Text.Read
-
-data Weights = W { wBiases :: !(Vector Double)  -- n
-                 , wNodes  :: !(Matrix Double)  -- n x m
-                 }                              -- "m to n" layer
-
-data Network = Last !Weights
-             | Link !Weights Network
-
-logistic :: Floating a => a -> a
-logistic x = 1 / (1 + exp (-x))
-
-logistic' :: Floating a => a -> a
-logistic' x = logix * (1 - logix)
-  where
-    logix = logistic x
-
-runLayer :: Weights -> Vector Double -> Vector Double
-runLayer (W wB wN) v = wB + wN #> v
-
-runNet :: Network -> Vector Double -> Vector Double
-runNet (O w)      !v = logistic (runLayer w v)
-runNet (w :&~ n') !v = let v' = logistic (runLayer w v)
-                       in  runNet n' v'
-
-randomWeights :: MonadRandom m => Int -> Int -> m Weights
-randomWeights i o = do
-    seed1 :: Int <- getRandom
-    seed2 :: Int <- getRandom
-    let wB = randomVector  seed1 Uniform o * 2 - 1
-        wN = uniformSample seed2 o (replicate i (-1, 1))
-    return $ W wB wN
-
-randomNet :: MonadRandom m => Int -> [Int] -> Int -> m Network
-randomNet i []     o =     O <$> randomWeights i o
-randomNet i (h:hs) o = (:&~) <$> randomWeights i h <*> randomNet h hs o
-
-train :: Double           -- ^ learning rate
-      -> Vector Double    -- ^ input vector
-      -> Vector Double    -- ^ target vector
-      -> Network          -- ^ network to train
-      -> Network
-train rate x0 target = fst . go x0
-  where
-    go :: Vector Double    -- ^ input vector
-       -> Network          -- ^ network to train
-       -> (Network, Vector Double)
-    -- handle the output layer
-    go !x (O w@(W wB wN))
-        = let y    = runLayer w x
-              o    = logistic y
-              -- the gradient (how much y affects the error)
-              --   (logistic' is the derivative of logistic)
-              dEdy = logistic' y * (o - target)
-              -- new bias weights and node weights
-              wB'  = wB - scale rate dEdy
-              wN'  = wN - scale rate (dEdy `outer` x)
-              w'   = W wB' wN'
-              -- bundle of derivatives for next step
-              dWs  = tr wN #> dEdy
-          in  (O w', dWs)
-    -- handle the inner layers
-    go !x (w@(W wB wN) :&~ n)
-        = let y          = runLayer w x
-              o          = logistic y
-              -- get dWs', bundle of derivatives from rest of the net
-              (n', dWs') = go o n
-              -- the gradient (how much y affects the error)
-              dEdy       = logistic' y * dWs'
-              -- new bias weights and node weights
-              wB'  = wB - scale rate dEdy
-              wN'  = wN - scale rate (dEdy `outer` x)
-              w'   = W wB' wN'
-              -- bundle of derivatives for next step
-              dWs  = tr wN #> dEdy
-          in  (w' :&~ n', dWs)
-
-netTest :: MonadRandom m => Double -> Int -> m String
-netTest rate n = do
-    inps <- replicateM n $ do
-      s <- getRandom
-      return $ randomVector s Uniform 2 * 2 - 1
-    let outs = flip map inps $ \v ->
-                 if v `inCircle` (fromRational 0.33, 0.33)
-                      || v `inCircle` (fromRational (-0.33), 0.33)
-                   then fromRational 1
-                   else fromRational 0
-    net0 <- randomNet 2 [16,8] 1
-    let trained = foldl' trainEach net0 (zip inps outs)
-          where
-            trainEach :: Network -> (Vector Double, Vector Double) -> Network
-            trainEach nt (i, o) = train rate i o nt
-
-        outMat = [ [ render (norm_2 (runNet trained (vector [x / 25 - 1,y / 10 - 1])))
-                   | x <- [0..50] ]
-                 | y <- [0..20] ]
-        render r | r <= 0.2  = ' '
-                 | r <= 0.4  = '.'
-                 | r <= 0.6  = '-'
-                 | r <= 0.8  = '='
-                 | otherwise = '#'
-
-    return $ unlines outMat
-  where
-    inCircle :: Vector Double -> (Vector Double, Double) -> Bool
-    v `inCircle` (o, r) = norm_2 (v - o) <= r
-
-main :: IO ()
-main = do
-    args <- getArgs
-    let n    = readMaybe =<< (args !!? 0)
-        rate = readMaybe =<< (args !!? 1)
-    putStrLn "Training network..."
-    putStrLn =<< evalRandIO (netTest (fromMaybe 0.25   rate)
-                                     (fromMaybe 500000 n   )
-                            )
-
-(!!?) :: [a] -> Int -> Maybe a
-xs !!? i = listToMaybe (drop i xs)
diff --git a/tests/todo/NewType00.hs b/tests/todo/NewType00.hs
deleted file mode 100644
--- a/tests/todo/NewType00.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-module NT where
-
-{- newtype Natural = Natural { toInt :: Nat } @-}
-newtype Natural = Natural { toInt :: Int }
-
-foo :: Int -> Maybe Natural
-foo n
-  | 0 <= n    = Just (Natural n)
-  | otherwise = Nothing
-
-{-@ bar :: Natural -> Nat @-}
-bar (Natural n) = n
diff --git a/tests/todo/NoInlines.hs b/tests/todo/NoInlines.hs
deleted file mode 100644
--- a/tests/todo/NoInlines.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module Foo where
-
-foo :: IO ()
-foo =
-  if True 
-    then return ()
-    else return ()
diff --git a/tests/todo/NoInstance.hs b/tests/todo/NoInstance.hs
deleted file mode 100644
--- a/tests/todo/NoInstance.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module SClass where
-
-import qualified Data.Set
-
-data Stack a = S [a]
-
-data Foo a = F {stack :: Stack a}
-
-{-@ class measure elts  :: forall f a. f a -> Data.Set.Set a @-}
-
-{-@ measure  eltss :: [(Foo a)] -> (Data.Set.Set a)
-    eltss([]) = {v| (? (Set_emp v))}
-    eltss(x:xs) = (Set_cup (elts x) (eltss xs))
-  @-}
-
diff --git a/tests/todo/NotesOnProductivityTest.hs b/tests/todo/NotesOnProductivityTest.hs
deleted file mode 100644
--- a/tests/todo/NotesOnProductivityTest.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-module Fixme where
-
-import Prelude hiding (repeat, filter)
-
--- Checking productivity
---  1. Leino : syntactically ignore checks in syntactically productive locations
---  PLUS  fivesUp
-
-{-@ fivesUp :: n:Nat -> Int -> [Int] @-}
-fivesUp :: Int -> Int -> [Int]
-fivesUp n m | n == 0    = m : fivesUp 5 (m+1)
-            | otherwise = fivesUp (n-1) (m+1)
-
-
--- VS : Mini-adga: check that recursive calls return codata with *smaller* size
--- MINUS : fivesUp
--- PLUS  : depth preserving functions
-
-{-map :: f:(a -> b) -> xs:[a] -> {v : [a]| (len v) = (len xs)}
- -}
-bar (x:xs) = x : map id xs 
diff --git a/tests/todo/Parse.hs b/tests/todo/Parse.hs
deleted file mode 100644
--- a/tests/todo/Parse.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module Fixme where
-
-
-data L a
-  = C {x :: a , xs :: L a} 
-
-{-@ data L a 
-   = C { x:: a , xs :: L a} 
- @-}
diff --git a/tests/todo/Parse1.hs b/tests/todo/Parse1.hs
deleted file mode 100644
--- a/tests/todo/Parse1.hs
+++ /dev/null
@@ -1,5 +0,0 @@
-module BadParse where
-
-
-{-@ test :: v:a -> (r:a, l:a) @-}
-test x = (x, x)
diff --git a/tests/todo/PartialAbsApplication.hs b/tests/todo/PartialAbsApplication.hs
deleted file mode 100644
--- a/tests/todo/PartialAbsApplication.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module Fixme where
-
-data World = W Int
-{-@ data FIO a <pre :: World -> Prop, post :: World -> a -> World -> Prop>
-  = FIO (rs :: (x:World<pre> -> (a, World)<\y -> {v:World<post x y> | true}>))  @-}
-data FIO a  = FIO {runState :: World -> (a, World)}
-
-{-@ createFile :: forall <p :: Int -> World -> Prop,
-                          q :: Int -> World -> Int -> World -> Prop>.
-  {f::Int |- World<p f> <: World}
-  {f::Int, w::World<p f>,  x::Int |- World <: World<q f w x>}
-  a:Int -> FIO <p a, \x z -> {v:World<q a x z> | true}> Int @-}
-createFile :: Int -> FIO Int
-createFile = undefined
diff --git a/tests/todo/Plus.hs b/tests/todo/Plus.hs
deleted file mode 100644
--- a/tests/todo/Plus.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module Plus where
-
-go :: Int -> Int -> Int -> Int
-{-@ go :: x:Int -> y:Int -> {v:Int|v = x-y+1} -> Int @-}
-go _ _ _ = undefined
-
-
-go' :: Int -> Int -> Int -> Int
-{-@ go' :: x:Int -> y:Int -> {v:Int|v = (x-y)+1} -> Int @-}
-go' _ _ _ = undefined
-
-
-bar x y z 
-  = if z then go x y (x-y+1) 
-         else go' x y (x-y+1)
diff --git a/tests/todo/QualifCheck.hs b/tests/todo/QualifCheck.hs
deleted file mode 100644
--- a/tests/todo/QualifCheck.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-module Foo where
-
-{-@ qualif Foo(v:a, x:List a) : (Set_mem v (listElts xs)) @-}
-
-{-@ foo :: Nat -> Nat @-}
-foo :: Int -> Int
-foo x = x
-
diff --git a/tests/todo/RG.hs b/tests/todo/RG.hs
deleted file mode 100644
--- a/tests/todo/RG.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-{- this is a test for the "bug" introduced in liquid-fixpoint by 
-   commit: 9608cb6e4dd33bf142b50db4630c629defceb91e             -}
-
-module RG where
-
-data RGRef a
-
-{-@ measure tv :: RGRef a -> a @-}
-
-{-@ qualif TERMINALVALUE(r:RGRef a): (tv r) @-}
-
-
diff --git a/tests/todo/RecordAccessors.hs b/tests/todo/RecordAccessors.hs
deleted file mode 100644
--- a/tests/todo/RecordAccessors.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module RecordAccessors where
-
-{-@ data Foo = F { thing :: Nat } @-}
-data Foo = F { thing :: Int }
-
-{-@ bar :: Foo -> Nat @-}
-bar = thing
diff --git a/tests/todo/Recursion.hs b/tests/todo/Recursion.hs
deleted file mode 100644
--- a/tests/todo/Recursion.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-module Rec where
-
-import Language.Haskell.Liquid.Prelude
-
-newtype Rec a = In { out :: Rec a -> a }
- 
-y :: (a -> a) -> a
-y = \f -> (\x -> f (out x x)) (In (\x -> f (out x x)))
-
-
-{-@ foo :: n:Nat -> {v:Nat | v < n} @-}
-foo :: Int -> Int
-foo = y go
-  where go f n =  if n > 0 then n-1 else f n
-
-
-prop = let x = 0 in
-       liquidAssert ((\n -> 0==1) (foo 0))
diff --git a/tests/todo/Recursion1.hs b/tests/todo/Recursion1.hs
deleted file mode 100644
--- a/tests/todo/Recursion1.hs
+++ /dev/null
@@ -1,26 +0,0 @@
-module Rec1 where
-
-import Control.Monad.ST 
-import Data.IORef 
-
-import System.IO.Unsafe
-
--- recursion with references in ocaml
---
--- bar = 
---   let f = ref (fun _ => 0) in 
---   let foo f n = if n > 0 then n-1 else !f n
---   f := (foo f); !f
-
--- translation to Haskell
-
-f n = unsafePerformIO $ (unsafePerformIO bar) n
-
-bar :: IO (Int -> IO Int)
-bar  = do f <- newIORef (\_ -> return 0)
-          writeIORef f (foo f)
-          readIORef f
-
-foo     :: (IORef (Int -> IO Int)) -> Int -> IO Int
-foo f n  | n > 0     = return $ n-1 
-         | otherwise = readIORef f >>= \g -> g n
diff --git a/tests/todo/RedBlack.hs b/tests/todo/RedBlack.hs
deleted file mode 100644
--- a/tests/todo/RedBlack.hs
+++ /dev/null
@@ -1,90 +0,0 @@
-module RedBlack where
-
------------------------------------------------------------------------------------ 
--- From: http://www.mew.org/~kazu/proj/red-black-tree/ ----------------------------
------------------------------------------------------------------------------------ 
-
-data RBTree a = Leaf | Fork Color (RBTree a) a (RBTree a)
-data Color    = Red  | Black
-
-{-@
-inline measure cheight :: Color -> Int
-cheight (x) = if (x == Black) then 1 else 0
-@-}
-
-{-@ 
-measure height        :: RBTree a -> Int   
-height (Leaf)         = 0
-height (Fork c l x r) = (cheight c) + (height l)
-@-}
-
-{-@ 
-measure color        :: RBTree a -> Color 
-color (Leaf)         = Black
-color (Fork c l x r) = c
-@-}
-
-{-@ predicate isBlack X     = (X == Black)                                                 @-}
-{-@ predicate isRed X       = (X == Red)                                                   @-}
-{-@ predicate okRoot1 C L R = ((isRed C)  => ((isBlack (color L)) || (isBlack (color R)))) @-}
-{-@ predicate okRoot2 C L R = ((isRed C)  => ((isBlack (color L)) && (isBlack (color R)))) @-}
-{-@ predicate eqHeight  L R = ((height L) == (height R))                                   @-}
-
-{-@ 
-measure invKids2        :: RBTree a -> Prop 
-invKids2 (Leaf)         =  true
-invKids2 (Fork c l x r) =  (OkRoot2 c l r) && (invKids2 l) && (invKids2 r) 
-@-}
-
-{-@ 
-measure invKids1        :: RBTree a -> Prop 
-invKids1 (Leaf)         = true
-invKids1 (Fork c l x r) = (OkRoot1 c l r) && (invKids2 l) && (invKids2 r)
-@-}
-
-{-@ 
-measure invHeight        :: RBTree a -> Prop 
-invHeight (Leaf)         =  true
-invHeight (Fork c l x r) =  (eqHeight l r) && (invHeight l) && (invHeight r)
-@-}
-
-{-@ type RB1Tree a = {v: (RBTree a) | (invKids1 v) && (invHeight v)} @-}
-{-@ type RB2Tree a = {v: (RBTree a) | (invKids2 v) && (invHeight v)} @-}
-
------------------------------------------------------------------------------------ 
-
-{-@ empty :: IRBTree a @-}
-empty     = Leaf
-
-{-@ insert       :: Ord a => a -> RB2Tree a -> RB2Tree a @-}
-insert x t       = Fork Black d e f
-  where
-    Fork _ d e f = ins x t
-
-ins x Leaf             = Fork R Leaf x Leaf
-ins x t@(Fork c l y r) = case compare x y of
-                           LT -> balanceL c (ins x l) y r
-                           GT -> balanceR c l y (ins x r)
-                           EQ -> t
-
-{-@ balanceL :: c:Color 
-             -> l:(RB1Tree a) 
-             -> x:a 
-             -> r:{v : (RB2Tree a) | (eqHeight l v)} 
-             -> {v:(RB2Tree a) | (height v) = (cheight c) + (height l) } @-}
-balanceL :: Color -> RBTree a -> a -> RBTree a -> RBTree a
-balanceL B (Fork R (Fork R a x b) y c) z d = Fork R (Fork B a x b) y (Fork B c z d)
-balanceL B (Fork R a x (Fork R b y c)) z d = Fork R (Fork B a x b) y (Fork B c z d)
-balanceL k a x b                           = Fork k a x b
-
-{-@ balanceR :: c:Color 
-             -> l:(RB2Tree a) 
-             -> x:a 
-             -> r:{v : (RB1Tree a) | (eqHeight l v)} 
-             -> {v:(RB2Tree a) | (height v) = (cheight c) + (height l) } @-}
-balanceR :: Color -> RBTree a -> a -> RBTree a -> RBTree a
-balanceR B a x (Fork R b y (Fork R c z d)) = Fork R (Fork B a x b) y (Fork B c z d)
-balanceR B a x (Fork R (Fork R b y c) z d) = Fork R (Fork B a x b) y (Fork B c z d)
-balanceR k a x b                           = Fork k a x b
-
-
diff --git a/tests/todo/RefinedData.hs b/tests/todo/RefinedData.hs
deleted file mode 100644
--- a/tests/todo/RefinedData.hs
+++ /dev/null
@@ -1,5 +0,0 @@
-module Foo where
-
-data F = F {f1 :: Int, f2 :: Bool}
-
-{-@ data F = F {f2 :: Bool, f1 :: Int} @-}
diff --git a/tests/todo/ReflImp.hs b/tests/todo/ReflImp.hs
deleted file mode 100644
--- a/tests/todo/ReflImp.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-{-@ LIQUID "--higherorder"     @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-{-@ LIQUID "--higherorderqs"   @-}
-
-module Peano where
-
-import ProofCombinators
-
-import Incr (incr)
-
-{-@ pf :: () -> { incr 2 == 3 }  @-}
-pf () = incr 2 *** QED
-
-
-
-
-pf :: () -> Proof
diff --git a/tests/todo/SMTDiverge.hs b/tests/todo/SMTDiverge.hs
deleted file mode 100644
--- a/tests/todo/SMTDiverge.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module Chunks where
-
-{-@ go :: Nat -> {v:Int | 1 < v} -> () @-}
-go :: Int -> Int -> ()
-go d n 
-  | d <= n    = ()
-  | otherwise = go (d `div` n) n 
diff --git a/tests/todo/SS.hs b/tests/todo/SS.hs
deleted file mode 100644
--- a/tests/todo/SS.hs
+++ /dev/null
@@ -1,464 +0,0 @@
-{-# LANGUAGE PatternGuards #-}
-
------------------------------------------------------------------------------
--- |
--- Module      :  XMonad.StackSet
--- Copyright   :  (c) Don Stewart 2007
--- License     :  BSD3-style (see LICENSE)
---
--- Maintainer  :  dons@galois.com
--- Stability   :  experimental
--- Portability :  portable, Haskell 98
---
-
-module XMonad.StackSet where
-
-import Prelude hiding (filter, reverse, (++), elem) -- LIQUID
-import Data.Maybe   (listToMaybe,isJust,fromMaybe)
-import qualified Data.List as L (deleteBy,find,splitAt,filter,nub)
-import Data.List ( (\\) )
-import qualified Data.Map  as M (Map,insert,delete,empty)
-import qualified Data.Set -- LIQUID
-
--------------------------------------------------------------------------------
------------------------------ Refinements on  Lists ---------------------------
--------------------------------------------------------------------------------
-
--- measures
-
-{-@
-  measure head :: [a] -> a
-  head([])   = {v | false}
-  head(x:xs) = {v | v = x} 
-  @-}
-
-{-@
-  measure listDup :: [a] -> (Data.Set.Set a)
-  listDup([]) = {v | (? Set_emp (v))}
-  listDup(x:xs) = {v | v = ((Set_mem x (listElts xs))?(Set_cup (Set_sng x) (listDup xs)):(listDup xs)) }
-  @-}
-
--- predicates 
-
-{-@ predicate EqElts X Y =
-       ((listElts X) = (listElts Y)) @-}
-
-{-@ predicate SubElts X Y =
-       (Set_sub (listElts X) (listElts Y)) @-}
-
-{-@ predicate UnionElts X Y Z =
-       ((listElts X) = (Set_cup (listElts Y) (listElts Z))) @-}
-
-{-@ predicate ListElt N LS =
-       (Set_mem N (listElts LS)) @-}
-
-{-@ predicate ListUnique LS =
-       (Set_emp (listDup LS)) @-}
-
-{-@ predicate ListUniqueDif LS X =
-       ((ListUnique LS) && (not (ListElt X LS))) @-}
-
-
-{-@ predicate ListDisjoint X Y =
-       (Set_emp (Set_cap (listElts X) (listElts Y))) @-}
-
-
--- types
-
-{-@ type UList a = {v:[a] | (ListUnique v)} @-}
-
-{-@ type UListDif a N = {v:[a] | ((not (ListElt N v)) && (ListUnique v))} @-}
-
-
-
--------------------------------------------------------------------------------
------------------------------ Refinements on Stacks ---------------------------
--------------------------------------------------------------------------------
-
-{-@
-data Stack a = Stack { focus :: a   
-                     , up    :: UListDif a focus
-                     , down  :: UListDif a focus }
-@-}
-
-{-@ type UStack a = {v:(Stack a) | (ListDisjoint (getUp v) (getDown v))}@-}
-
-{-@ measure getUp :: forall a. (Stack a) -> [a] 
-    getUp (Stack focus up down) = up
-  @-}
-
-{-@ measure getDown :: forall a. (Stack a) -> [a] 
-    getDown (Stack focus up down) = down
-  @-}
-
-{-@ measure getFocus :: forall a. (Stack a) -> a
-    getFocus (Stack focus up down) = focus
-  @-}
-
-{-@ predicate StackElt N S =
-       (((ListElt N (getUp S)) 
-       || (Set_mem N (Set_sng (getFocus S))) 
-       || (ListElt N (getDown S))))
-  @-}
-
-{-@ predicate StackSetVisibleElt N S = true @-}
-{-@ predicate StackSetHiddenElt N S = true @-}
-
-
--------------------------------------------------------------------------------
------------------------  Grap StackSet Elements -------------------------------
--------------------------------------------------------------------------------
-
-{-@ measure stackSetElts :: (StackSet i l a sid sd) -> (Data.Set.Set a)
-    stackSetElts(StackSet current visible hidden f) = (Set_cup (Set_cup (screenElts current) (screensElts visible)) (workspacesElts hidden))
-   @-}
-
-{-@ measure screensElts :: [(Screen i l a sid sd)] -> (Data.Set.Set a)
-    screensElts([])   = {v|(? (Set_emp v))} 
-    screensElts(x:xs) = (Set_cup (screenElt x) (screensElts xs))
-  @-}
-
-{-@ measure screenElts :: (Screen i l a sid sd) -> (Data.Set.Set a)
-    screenElts(Screen w s sd) = (workspaceElts w) @-}
-
-{-@ measure workspacesElts :: [(Workspace i l a)] -> (Data.Set.Set a)
-    workspacesElts([])   = {v|(? (Set_emp v))} 
-    workspacesElts(x:xs) = (Set_cup (workspaceElts x) (workspacesElts xs))
-  @-}
-
-{-@ measure workspaceElts :: (Workspace i l a) -> (Data.Set.Set a)
-    workspaceElts(Workspace t l s) = {v| (if (isJust s) then (stackElts (fromJust s)) else (? (Set_emp v)))} @-}
-
-{-@ measure stackElts :: (StackSet i l a sid sd) -> (Data.Set.Set a)
-    stackElts(Stack f up down) = (Set_cup (Set_sng f) (Set_cup (listElts up) (listElts down))) @-}
-
-{-@ predicate EmptyStackSet X = (? (Set_emp (stackSetElts X)))@-}
-
-
--------------------------------------------------------------------------------
------------------------  Talking about Tags --- -------------------------------
--------------------------------------------------------------------------------
-
-{-@ measure getTag :: (Workspace i l a) -> i
-    getTag(Workspace t l s) = t
-  @-}
-
-{-@ predicate IsCurrentTag X Y = 
-      (X = (getTag (getWorkspaceScreen (getCurrentScreen Y))))
-  @-}
-
--- $intro
---
--- The 'StackSet' data type encodes a window manager abstraction. The
--- window manager is a set of virtual workspaces. On each workspace is a
--- stack of windows. A given workspace is always current, and a given
--- window on each workspace has focus. The focused window on the current
--- workspace is the one which will take user input. It can be visualised
--- as follows:
---
--- > Workspace  { 0*}   { 1 }   { 2 }   { 3 }   { 4 }
--- >
--- > Windows    [1      []      [3*     [6*]    []
--- >            ,2*]            ,4
--- >                            ,5]
---
--- Note that workspaces are indexed from 0, windows are numbered
--- uniquely. A '*' indicates the window on each workspace that has
--- focus, and which workspace is current.
-
--- $zipper
---
--- We encode all the focus tracking directly in the data structure, with a 'zipper':
---
---    A Zipper is essentially an `updateable' and yet pure functional
---    cursor into a data structure. Zipper is also a delimited
---    continuation reified as a data structure.
---
---    The Zipper lets us replace an item deep in a complex data
---    structure, e.g., a tree or a term, without an  mutation.  The
---    resulting data structure will share as much of its components with
---    the old structure as possible.
---
---      Oleg Kiselyov, 27 Apr 2005, haskell\@, "Zipper as a delimited continuation"
---
--- We use the zipper to keep track of the focused workspace and the
--- focused window on each workspace, allowing us to have correct focus
--- by construction. We closely follow Huet's original implementation:
---
---      G. Huet, /Functional Pearl: The Zipper/,
---      1997, J. Functional Programming 75(5):549-554.
--- and:
---      R. Hinze and J. Jeuring, /Functional Pearl: The Web/.
---
--- and Conor McBride's zipper differentiation paper.
--- Another good reference is:
---
---      The Zipper, Haskell wikibook
-
--- $xinerama
--- Xinerama in X11 lets us view multiple virtual workspaces
--- simultaneously. While only one will ever be in focus (i.e. will
--- receive keyboard events), other workspaces may be passively
--- viewable.  We thus need to track which virtual workspaces are
--- associated (viewed) on which physical screens.  To keep track of
--- this, 'StackSet' keeps separate lists of visible but non-focused
--- workspaces, and non-visible workspaces.
-
--- $focus
---
--- Each stack tracks a focused item, and for tiling purposes also tracks
--- a 'master' position. The connection between 'master' and 'focus'
--- needs to be well defined, particularly in relation to 'insert' and
--- 'delete'.
---
-
-------------------------------------------------------------------------
--- |
--- A cursor into a non-empty list of workspaces.
---
--- We puncture the workspace list, producing a hole in the structure
--- used to track the currently focused workspace. The two other lists
--- that are produced are used to track those workspaces visible as
--- Xinerama screens, and those workspaces not visible anywhere.
-
-data StackSet i l a sid sd =
-    StackSet { current  :: !(Screen i l a sid sd)    -- ^ currently focused workspace
-             , visible  :: [Screen i l a sid sd]     -- ^ non-focused workspaces, visible in xinerama
-             , hidden   :: [Workspace i l a]         -- ^ workspaces not visible anywhere
-             , floating :: M.Map a RationalRect      -- ^ floating windows
-             } deriving (Show, Eq)
--- LIQUID             } deriving (Show, Read, Eq)
-
-{-@ 
-data StackSet i l a sid sd =
-    StackSet { current  :: (Screen i l a sid sd)   
-             , visible  :: [Screen i l a sid sd]   
-             , hidden   :: [Workspace i l a]       
-             , floating :: M.Map a RationalRect    
-             }
-@-}
-
-{- invariant {v:(StackSet i l a sid sd) | 
-     (((?(
-       Set_emp (Set_cap (screenElts (getCurrentScreen v)) 
-                        (screensElts (getVisible v))
-      ))) && (?(
-       Set_emp (Set_cap (screenElts (getCurrentScreen v)) 
-                        (workspacesElts (getHidden v))
-      )))) && (?(
-       Set_emp (Set_cap (workspacesElts (getHidden v)) 
-                        (screensElts (getVisible v))
-      ))))} @-}
-
-{-@ measure getCurrentScreen :: (StackSet i l a sid sd) -> (Screen i l a sid sd)
-    getCurrentScreen(StackSet current v h f) = current @-}
-
-{-@ measure getVisible :: (StackSet i l a sid sd) -> [(Screen i l a sid sd)]
-    getVisible(StackSet current v h f) = v @-}
-
-{-@ measure getHidden :: (StackSet i l a sid sd) -> [(Workspace i l a)]
-    getHidden(StackSet current v h f) = h @-}
-
-{-@ predicate StackSetCurrentElt N S = 
-      (ScreenElt N (getCurrentScreen S))
-  @-}
-
-{-@ current :: s:(StackSet i l a sid sd) 
-            -> {v:(Screen i l a sid sd) | v = (getCurrentScreen s)}
-  @-}
-
-{-@ stack :: w:(Workspace i l a) 
-          -> {v:(Maybe (UStack a)) | v = (getStackWorkspace w)}
-  @-}
-
-{-@ workspace :: s:(Screen i l a sid sd) 
-              -> {v:(Workspace i l a) | v = (getWorkspaceScreen s)}
-  @-}
-
-{-@ tag :: w:(Workspace i l a) -> {v:i|v = (getTag w)} @-}
-
--- | Visible workspaces, and their Xinerama screens.
-data Screen i l a sid sd = Screen { workspace :: !(Workspace i l a)
-                                  , screen :: !sid
-                                  , screenDetail :: !sd }
-    deriving (Show, Eq)
--- LIQUID    deriving (Show, Read, Eq)
-
-{-@ 
-data Screen i l a sid sd = Screen { workspace :: (Workspace i l a)
-                                  , screen :: sid
-                                  , screenDetail :: sd }
-@-}
-
-{-@ measure getWorkspaceScreen :: (Screen i l a sid sd) -> (Workspace i l a)
-    getWorkspaceScreen(Screen w screen s) = w @-}
-
-
-{-@ predicate ScreenElt N S = 
-      (WorkspaceElt N (getWorkspaceScreen S))
-  @-}
-
-
--- |
--- A workspace is just a tag, a layout, and a stack.
---
-data Workspace i l a = Workspace  { tag :: !i, layout :: l, stack :: Maybe (Stack a) }
-    deriving (Show, Eq)
---     deriving (Show, Read, Eq)
-
-{-@
-data Workspace i l a = Workspace  { tag :: i, layout :: l, stack :: Maybe (UStack a) }
-  @-}
-
-{-@ measure getStackWorkspace :: (Workspace i l a) -> (Maybe(Stack a))
-    getStackWorkspace(Workspace t l stack) = stack @-}
-
-{-@ predicate WorkspaceElt N W =
-  ((isJust (getStackWorkspace W)) && (StackElt N (fromJust (getStackWorkspace W)))) @-}
-
--- | A structure for window geometries
-data RationalRect = RationalRect Rational Rational Rational Rational
-    deriving (Show, Read, Eq)
-
--- |
--- A stack is a cursor onto a window list.
--- The data structure tracks focus by construction, and
--- the master window is by convention the top-most item.
--- Focus operations will not reorder the list that results from
--- flattening the cursor. The structure can be envisaged as:
---
--- >    +-- master:  < '7' >
--- > up |            [ '2' ]
--- >    +---------   [ '3' ]
--- > focus:          < '4' >
--- > dn +----------- [ '8' ]
---
--- A 'Stack' can be viewed as a list with a hole punched in it to make
--- the focused position. Under the zipper\/calculus view of such
--- structures, it is the differentiation of a [a], and integrating it
--- back has a natural implementation used in 'index'.
---
-data Stack a = Stack { focus  :: !a        -- focused thing in this set
-                     , up     :: [a]       -- clowns to the left
-                     , down   :: [a] }     -- jokers to the right
-     deriving (Show, Eq)
--- LIQUID      deriving (Show, Read, Eq)
-{-@ predicate IsTagInStackSet T ST = 
-    ((( (T = (getTag (getWorkspaceScreen (getCurrentScreen ST))))
-     )) || ((
-      (Set_mem T (getTagScreens (getVisible ST)))
-    ) || (false)))
-  @-}
-
---       (Set_mem T (getTagScreens (getVisible ST)))
-{-@ view :: (Eq s, Eq i) 
-         => t:i 
-         -> st: {v:(StackSet i l a s sd) | true}
-         -> {v:StackSet i l a s sd|((IsTagInStackSet t st) => (IsCurrentTag t v))} @-}
-view :: (Eq s, Eq i) => i -> StackSet i l a s sd -> StackSet i l a s sd
-view i s
-    | i == currentTag s = s  -- current
-
-    | Just x <- findTagInScreen i (visible s)
-    -- if it is visible, it is just raised
-    = s { current = x, visible = current s : L.deleteBy (equating screen) x (visible s) }
-
---     | Just x <- findTagInWorkspace i (hidden  s) -- must be hidden then
-    -- if it was hidden, it is raised on the xine screen currently used
---     = s { current = (current s) { workspace = x }
---         , hidden = workspace (current s) : L.deleteBy (equating tag) x (hidden s) }
-
---     | otherwise = s -- not a member of the stackset
-
-  where equating f = \x y -> f x == f y
-
-{-@ findTagInScreen :: (Eq i) 
-         => t:i 
-         -> s:([Screen i l a sid sd])
-         -> {v:(Maybe (Screen i l a sid sd)) | ( ((isJust v) =>  (t = (getTag (getWorkspaceScreen (fromJust v))))))}
-  @-}
-findTagInScreen :: (Eq i) => i -> [Screen i l a sid sd] -> Maybe (Screen i l a sid sd)
-findTagInScreen i []     = Nothing
-findTagInScreen i (x:xs) 
-  | i == (tag (workspace x)) = Just x
-  | otherwise                = findTagInScreen i xs
-
-{-@ findTagInWorkspace :: (Eq i) 
-         => t:i 
-         -> [Workspace i l a] 
-         -> {v:(Maybe (Workspace i l a)) | ((isJust v) => (t = (getTag (fromJust v))))}
-  @-}
-findTagInWorkspace :: (Eq i) => i -> [Workspace i l a] -> Maybe (Workspace i l a)
-findTagInWorkspace i []     = Nothing
-findTagInWorkspace i (x:xs) 
-  | i == (tag x) = Just x
-  | otherwise    = findTagInWorkspace i xs
-
-{-@ qview :: x:(Workspace i l a) -> {v:(Screen i l a sid sd)|(getWorkspaceScreen v) = x} @-}
-qview :: Workspace i l a -> Screen i l a sid sd 
-qview = undefined
-
-{-@ qview1 :: x:(Screen i l a sid sd) -> {v:(StackSet i l a sid sd)|(getCurrentScreen v) = x} @-}
-qview1 :: Screen i l a sid sd -> StackSet i l a sid sd 
-qview1 = undefined
-
-{-@ qview2 :: x:([Workspace i l a]) -> {v:(StackSet i l a sid sd)|(getHidden v) = x} @-}
-qview2 :: [Workspace i l a] -> StackSet i l a sid sd 
-qview2 = undefined
-
-{-@ qview3 :: x:([Screen i l a sid sd]) -> {v:(StackSet i l a sid sd)|(getVisible v) = x} @-}
-qview3 :: [Screen i l a sid sd] -> StackSet i l a sid sd 
-qview3 = undefined
-
-{-@ 
-qview4 :: x : (Screen i l a sid sd)
-       -> y : ([Screen i l a sid sd])
-       -> z : Workspace i l a
-       -> {v:(StackSet i l a sid sd)|(stackSetElts v) = 
-         (Set_cup (Set_cup (screenElts x) (screensElts y)) 
-                   (workspaceElts z))}
-@-}
-qview4 :: (Screen i l a sid sd)
-       -> [Screen i l a sid sd]
-       -> Workspace i l a
-       -> StackSet i l a sid sd
-qview4 = undefined
-
-    -- 'Catch'ing this might be hard. Relies on monotonically increasing
-    -- workspace tags defined in 'new'
-    --
-    -- and now tags are not monotonic, what happens here?
-
--- |
--- Set focus to the given workspace.  If that workspace does not exist
--- in the stackset, the original workspace is returned.  If that workspace is
--- 'hidden', then display that workspace on the current screen, and move the
--- current workspace to 'hidden'.  If that workspace is 'visible' on another
--- screen, the workspaces of the current screen and the other screen are
--- swapped.
-
-{-@ measure getTagWorkspace :: (Workspace i l a) -> (Data.Set.Set i)
-    getTagWorkspace(Workspace t l s) = (Set_sng t)
-  @-}
-
-{-@ measure getTagScreen :: (Screen i l a sid sd) -> (Data.Set.Set i)
-    getTagScreen(Screen w s sd) = (getTagWorkspace w)
-  @-}
-
-{-@ measure getTagScreens :: ([(Screen i l a sid sd)]) -> (Data.Set.Set i)
-    getTagScreens([])   = {v | (?(Set_emp v))}
-    getTagScreens(x:xs) = (Set_cap (getTagScreen x) (getTagScreens xs))
-  @-}
-
-
-{-@ currentTag :: s: StackSet i l a s sd -> {v:i|(IsCurrentTag v s)} @-}
-currentTag :: StackSet i l a s sd -> i
-currentTag = tag . workspace . current
-
--- LIQUID : qualifier missing for currentTag
-{-@ qcurrentTag :: s:(StackSet i l a s sd) 
-                -> {v:(Workspace i l a) | v = (getWorkspaceScreen (getCurrentScreen s))} @-}
-qcurrentTag :: StackSet i l a s sd -> Workspace i l a 
-qcurrentTag = workspace . current
-
-
diff --git a/tests/todo/SYB_Literals.hs b/tests/todo/SYB_Literals.hs
deleted file mode 100644
--- a/tests/todo/SYB_Literals.hs
+++ /dev/null
@@ -1,125 +0,0 @@
-{-@ LIQUID "--no-case-expand" @-}
-{-# LANGUAGE LambdaCase, DeriveDataTypeable, OverloadedStrings, GeneralizedNewtypeDeriving #-}
-
-import qualified Data.Map as Map
-import qualified Data.Generics as SYB
-import Data.String
-import Text.PrettyPrint
-
--- Syntax
-
-newtype Var = Var String
-  deriving (Eq, Ord, Show, SYB.Data, SYB.Typeable, IsString)
-
-newtype Con = Con String
-  deriving (Eq, Ord, Show, SYB.Data, SYB.Typeable, IsString)
-
-type Alts = [(Con, [Var], Expr)]
-
-data Expr
-  = EVar Var
-  | ELam Var Expr
-  | EApp Expr Var
-  | ELet [(Var, Expr)] Expr
-  | ECon Con [Var]
-  | ECase Expr Alts
-  deriving (Eq, Ord, Show, SYB.Data, SYB.Typeable)
-
-instance IsString Expr where
-  fromString = EVar . fromString
-
-isValue :: Expr -> Bool
-isValue = \case
-  ELam {} -> True
-  ECon {} -> True
-  _ -> False
-
--- Abstract machine
-type Heap = Map.Map Var Expr
-type Stack = [StackItem]
-data StackItem
-  = StackUpdate Var
-  | StackVar Var
-  | StackAlts Alts
-  deriving (Show, SYB.Data, SYB.Typeable)
-data Machine = Machine Heap Expr Stack
-  deriving (Show)
-
-step :: Machine -> Machine
-step (Machine heap e stack)
-  -- Lookup
-  | EVar x <- e =
-      let m = heap Map.! x
-      in Machine heap m (StackUpdate x : stack)
-  -- Update
-  | isValue e, StackUpdate v : stack' <- stack =
-      Machine (Map.insert v e heap) e stack'
-  -- Unwind
-  | EApp m x <- e = Machine heap m (StackVar x : stack)
-  -- Subst
-  | ELam x m <- e, StackVar y : stack' <- stack =
-      Machine heap (subst (Map.singleton x y) e) stack'
-  -- Case
-  | ECase m alts <- e = Machine heap m (StackAlts alts : stack)
-  -- Branch
-  | ECon con xs <- e, StackAlts alts : stack' <- stack =
-      let [(boundVars, body)] = [(boundVars, body) | (con', boundVars, body) <- alts, con == con']
-          e' = subst (Map.fromList $ zip boundVars xs) body
-      in Machine heap e' stack'
-  -- Letrec
-  | ELet binds body <- e = Machine (Map.union (Map.fromList binds) heap) body stack
-
-subst :: Map.Map Var Var -> Expr -> Expr
-subst sm = \case
-  EVar x | Just y <- Map.lookup x sm -> EVar y
-  e@(ELam z body) -> ELam z (subst (Map.delete z sm) body)
-  e -> SYB.gmapT (SYB.mkT $ subst sm) e
-
-initMachine :: Expr -> Machine
-initMachine e = Machine Map.empty e []
-
-isFinished :: Machine -> Bool
-isFinished (Machine _ e stack) = isValue e && null stack
-
-run :: Machine -> Machine
-run m
-  | isFinished m = m
-  | otherwise = run $ step m
-
--- Pretty-printing
-ppVar (Var x) = text x
-ppCon (Con x) = text x
-ppExpr :: Expr -> Doc
-ppExpr = ppExpr' False
-ppExpr' :: Bool -> Expr -> Doc
-ppExpr' p e =
-  let maybeParens = if p then parens else id in
-  case e of
-    EVar x -> ppVar x
-    ELam x body -> maybeParens $
-      text "λ" <> ppVar x <> text "." <> ppExpr' False body
-    EApp a b -> ppExpr' False a <+> ppVar b
-    ECon con xs -> sep $ ppCon con : map ppVar xs
-    ELet binds body ->
-      vcat
-        [ "let" $$ nest 2 (vcat (punctuate semi (map (\(v,e) -> ppVar v <+> hang "=" 2 (ppExpr e)) binds)))
-        , "in" $$ nest 2 (ppExpr body)
-        ]
-    ECase e alts ->
-      let ppAlt (con, vars, body) =
-            ppCon con <+> sep (map ppVar vars) <+> "->" <+> ppExpr body
-      in text "case" <+> ppExpr e <+> "of" $$ nest 2 (vcat (map ppAlt alts))
-
--- Some object-language programs
-nil, cons :: Expr
-nil = ECon "nil" []
-cons = ELam "x" $ ELam "y" $ ECon "cons" ["x", "y"]
-append = ELet [("append", appendBind)] "append"
-  where
-    appendBind =
-      ELam "a" $ ELam "b" $ ECase "a"
-        [("nil", [], "b")
-        ,("cons", ["x", "xs"],
-          ELet [("r", "append" `EApp` "xs" `EApp` "b")]
-            (cons `EApp` "x" `EApp` "r"))
-        ]
diff --git a/tests/todo/SearchTree.hs b/tests/todo/SearchTree.hs
deleted file mode 100644
--- a/tests/todo/SearchTree.hs
+++ /dev/null
@@ -1,157 +0,0 @@
--- ISSUE: 
--- This file takes nearly a MINUTE when automatic-instances is off,
--- and FOREVER when automatic-instances is on.
-
-{-@ LIQUID "--exact-data-con"                      @-}
-{-@ LIQUID "--higherorder"                         @-}
-{-@ LIQUID "--totality"                            @-}
-
-{- LIQUID "--automatic-instances=liquidinstances" @-}
-
-module SearchTree where
-
-import Language.Haskell.Liquid.ProofCombinators
-import Prelude hiding (max)
-
--- | Options -------------------------------------------------------------------
-
-{-@ data Option a = None | Some a @-}
-data Option a = None | Some a
-
--- | Maps ----------------------------------------------------------------------
-
-{-@ data Map [size] k v =
-      Leaf
-    | Node { mKey   :: k
-           , mVal   :: v
-           , mLeft  :: Map k v
-           , mRigsize :: Map k v }
-  @-}
-
-data Map k v
-  = Leaf
-  | Node k v (Map k v) (Map k v)
-
-{-@ measure size @-}
-{-@ size :: Map k v -> Nat @-}
-size :: Map k v -> Int
-size Leaf           = 0
-size (Node k v l r) = 1 + size l + size r     -- TODO: silly termination error
-
-{-@ invariant {v:Map k v | 0 <= size v } @-}
-
--- | Map Operations ------------------------------------------------------------
-
-{-@ reflect get @-}
-
-get :: (Ord k) => k -> Map k v -> Option v
-get key Leaf           = None
-get key (Node k v l r)
-  | key == k           = Some v
-  | key <  k           = get key l
-  | otherwise          = get key r
-
-
-{-@ reflect put @-}
-
-put :: (Ord k) => k -> v -> Map k v -> Map k v
-put key val Leaf       = Node key val Leaf Leaf
-put key val (Node k v l r)
-  | key == k           = Node key val l r
-  | key <  k           = Node k v (put key val l) r
-  | otherwise          = Node k v l (put key val r)
-
--- | Map Laws ------------------------------------------------------------------
-
-{-@ thmGetEq :: (Ord k) => key:k -> val:v -> m:Map k v ->
-      { get key (put key val m) = Some val }
-  @-}
-thmGetEq :: (Ord k) => k -> v -> Map k v -> Proof
-thmGetEq key val Leaf =   get key (put key val Leaf)
-                      ==. get key (Node key val Leaf Leaf)
-                      ==. Some val
-                      *** QED
-
-thmGetEq key val (Node k v l r)
-  | key == k          =   get key (put key val (Node k v l r))
-                      ==. get key (Node key val l r)
-                      ==. Some val
-                      *** QED
-
-  | key <  k          =   get key (put key val (Node k v l r))
-                      ==. get key (Node k v (put key val l) r)    -- THIS LINE IS NEEDED
-                      ==. get key (put key val l)
-                          ? thmGetEq key val l
-                      ==. Some val
-                      *** QED
-
-  | otherwise         =   get key (put key val (Node k v l r))
-                      ==. get key (Node k v l (put key val r))    -- THIS LINE IS NEEDED
-                      ==. get key (put key val r)
-                          ? thmGetEq key val r
-                      ==. Some val
-                      *** QED
-
-{-@ thmGetNeq :: (Ord k) => k1:k -> k2:{k | k1 /= k2} -> v2:v -> m:Map k v ->
-      { get k1 (put k2 v2 m) = get k1 m }
-  @-}
-thmGetNeq :: (Ord k) => k -> k -> v -> Map k v -> Proof
-thmGetNeq k1 k2 v2 Leaf
-  | k1 < k2             =   get k1 (put k2 v2 Leaf)
-                        ==. get k1 (Node k2 v2 Leaf Leaf)
-                        ==. get k1 Leaf
-                        *** QED
-
-  | otherwise           =   get k1 (put k2 v2 Leaf)
-                        ==. get k1 (Node k2 v2 Leaf Leaf)
-                        ==. get k1 Leaf
-                        *** QED
-
-thmGetNeq k1 k2 v2 (Node k v l r)
-  | k1 <  k, k <  k2    =   get k1 (put k2 v2 (Node k v l r))
-                        ==. get k1 (Node k v l (put k2 v2 r))
-                        ==. get k1 (Node k v l r)
-                        *** QED
-
-  | k1 <  k, k == k2    =   get k1 (put k2 v2 (Node k v l r))
-                        ==. get k1 (Node k v2 l r)
-                        ==. get k1 (Node k v l r)
-                        *** QED
-
-  | k1 == k, k <  k2    =   get k1 (put k2 v2 (Node k v l r))
-                        ==. get k1 (Node k v l (put k2 v2 r))
-                        ==. get k1 (Node k v l r)
-                        *** QED
-
-
-  | k2 <  k, k <  k1    =   get k1 (put k2 v2 (Node k v l r))
-                        ==. get k1 (Node k v (put k2 v2 l) r)
-                        ==. get k1 r
-                        ==. get k1 (Node k v l r)
-                        *** QED
-
-  | k2 <  k, k == k1    =   get k1 (put k2 v2 (Node k v l r))
-                        ==. get k1 (Node k v (put k2 v2 l) r)
-                        ==. get k1 (Node k v l r)
-                        *** QED
-
-  | k2 == k, k < k1     =   get k1 (put k2 v2 (Node k v l r))
-                        ==. get k1 (Node k v2 l r)
-                        ==. get k1 (Node k v l r)
-                        *** QED
-
-  | k1 < k, k2 < k      =   get k1 (put k2 v2 (Node k v l r))
-                        ==. get k1 (Node k v (put k2 v2 l) r)
-                        ==. get k1 (put k2 v2 l)
-                            ? thmGetNeq k1 k2 v2 l
-                        ==. get k1 l
-                        ==. get k1 (Node k v l r)
-                        *** QED
-
-  | k < k1, k < k2      =   get k1 (put k2 v2 (Node k v l r))
-                        ==. get k1 (Node k v l (put k2 v2 r))
-                        ==. get k1 (put k2 v2 r)
-                            ? thmGetNeq k1 k2 v2 r
-                        ==. get k1 r
-                        ==. get k1 (Node k v l r)
-                        *** QED
diff --git a/tests/todo/SelfRefPredicates.hs b/tests/todo/SelfRefPredicates.hs
deleted file mode 100644
--- a/tests/todo/SelfRefPredicates.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Fixme where
-
-{-@ bindST :: forall <p :: s -> Prop, q :: s -> a -> s -> Prop, r :: s -> b -> s -> Prop>.
-            (xm:s<p> -> (a, s)<q xm>) 
-         -> (xbind:a ->  xk:(exists[xxxa:a].exists[xxa:s<p>].s<q xxa xxxa>) -> (b, s)<r xk>) 
-         -> xr:s<p> -> exists[xa:a]. exists[xxx:s<q xr xa>]. (b, s)<r xxx>
- @-}
-bindST :: (s -> (a, s)) -> (a -> (s -> (b, s))) -> (s ->  (b, s))
-bindST m k s =  let (a, s') = m s in (k a) s'
-
-
-
-{-@ returnST :: forall <p :: s -> a -> s -> Prop>.
-                   xa:a -> xs:s<p v xa> -> (a,s)<p xs> @-}
-returnST :: a -> s -> (a, s)
-returnST x s = (x, s) 
diff --git a/tests/todo/Signal.hs b/tests/todo/Signal.hs
deleted file mode 100644
--- a/tests/todo/Signal.hs
+++ /dev/null
@@ -1,77 +0,0 @@
-
---
--- The MoCC of Signal in Haskell (clocked)
--- Jean-Pierre.Talpin@inria.fr 12/3/15
---
-
-Module Signals where
-
--- an event is (now) present with a value or (determined) absent
-
-data Event a = absent | now a
-
--- a signal is a (non empty?) lazy list of events 
--- type Signal a = {v: [Event a] | len(v) > 0}
-
-type Signal a = [Event a]
-
--- the clock of a signal 
-
-measure clk :: a Signal -> Bool
-clk (absent : _) = false
-clk ((now _) : _) = true
-
--- the value of a signal 
-
-measure val :: a Signal -> a
-val ((now v) : _) = v
-
--- not defined if absent ... how to say that val v => clk v ?
-
--- feedback: pre initially returns w and then the stored head of x
--- pre's, y's and w property should be a fixpoint p
---
---      {-@ pre :: forall <p :: Prop>. Signal a<p> -> a<p> -> Signal a<p> @-}
---
--- p should contain clk x = clk pre here just true
-
-pre :: Signal a -> a -> Signal a
-pre (x as ((now v) : _) w = (now w) : pre x v
-pre (x as (absent  : _) w =  absent : pre x w
-infix pre
-
--- synchronous sample à la Lustre
-
-{-@ sample :: x:Signal a -> y:Signal Bool -> {v:Signal a| clk v = clk x = clk y} @-}
-
-sample :: Signal a -> Signal Bool -> Signal a
-sample ((now v) : x) ((now True)  : y) = v : sample x y
-sample ((now _) : x) ((now False) : y) = absent : sample x y
-sample (absent  : x) (absent      : y) = absent : sample x y
-
--- synchronous merge à la Lustre
-
-{-@ merge :: x:Signal Bool -> y:Signal a -> z:Signal a -> {v:Signal a| clk v = clk x = clk y = clk z} @-}
-
-merge :: Signal Bool -> Signal a -> Signal a -> Signal a
-merge ((now True)  : x) ((now v) : y) ((now _) : z) = v : merge x y z
-merge ((now False) : x) ((now _) : y) ((now v) : z) = v : merge x y z
-merge (absent      : x) (absent  : y) (absent  : z) = absent : merge x y z
-
--- sample à la Signal
-
-{-@ when :: x:Signal a -> y:Signal Bool -> {v:Signal a| clk v = clk x and val y} @-}
-
-when :: Signal a -> Signal Bool -> Signal a
-when ((now v) : x) ((now True)  : y) = v : when x y
-when (_       : x) ((now False) : y) = absent : when x y
-when (_       : x) (absent      : y) = absent : when x y
-
--- merge à la Signal
-
-{-@ combine :: x:Signal Bool -> y:Signal a -> z:Signal a -> {v:Signal a| clk v = clk x or clk y} @-}
-
-combine :: Signal a -> Signal a -> Signal a
-combine ((now v) : x) (_ : y) = v : combine x y 
-combine (absent  : x) (v : y) = v : combine x y
-
diff --git a/tests/todo/SortedLists.lhs b/tests/todo/SortedLists.lhs
deleted file mode 100644
--- a/tests/todo/SortedLists.lhs
+++ /dev/null
@@ -1,58 +0,0 @@
-\begin{code}
-module SortedLists where
-\end{code}
-
-I want to prove that in a sorted list every element is `>=` than the head:
-
-\begin{code}
-{-@ type SL a = [a]<{\x v -> x <= v}> @-}
-
-{-@ measure head :: [a] -> a
-    head (x:xs) = x
-  @-}
-\end{code}
-
-
-Turns out that to prove it I have to compose the list using `:`
-(liquidHaskell only proves `proveOK`)
-\begin{code}
-{-@ propOKA, propOKB, propBADA, propBADB, propBADC :: 
-      Ord a => xs:(SL a)  -> [{v:a|v >= (head xs)}] 
-  @-}
-propOKA, propOKB, propBADA, propBADB, propBADC :: 
-      Ord a => [a] -> [a]
-\end{code}
-
-\begin{code}
-propOKA xxs@(x:xs) = x:xs
-propOKB xxs@(x:xs) = listID xxs
-
-listID (x:xs) = (x:xs)
-listID []     = []
-\end{code}
-
-We know that both `x` and `xs` satisfy the desired property 
-but polymorphism on `:` is the way to transfer this information to the result.
-Any attempt that doesn't use this information fails:
-\begin{code}
-propBADA xxs@(x:xs) = xxs
-propBADB xxs@(x:xs) = id xxs
-propBADC xxs@(x:xs) = listID' xxs
-
-{-@ listID' :: forall <p :: a -> a -> Prop> . [a]<p> -> [a]<p> @-}
-listID' :: [a] -> [a]
-listID' (x:xs) = (x:xs)
-listID' []     = []
-\end{code}
-
-So, the following version of `merge` fails:
-
-\begin{code}
-{-@ LIQUID "--no-termination" @-}
-{-@ merge :: Ord a => (SL a) -> (SL a) -> (SL a) @-}
-merge :: Ord a => [a] -> [a] -> [a]
-merge xxs@(x:xs) yys@(y:ys)
-  | x <= y    = x : merge xs yys
-  | otherwise = y : merge xxs ys
-\end{code}
-
diff --git a/tests/todo/StateConstraints.hs b/tests/todo/StateConstraints.hs
deleted file mode 100644
--- a/tests/todo/StateConstraints.hs
+++ /dev/null
@@ -1,109 +0,0 @@
-module Compose where
-
-
-
-
-data ST s a = ST {runState :: s -> (a,s)}
-
-{-@ data ST s a <p :: s -> Prop, q :: s -> s -> Prop, r :: s -> a -> Prop> 
-  = ST (runState :: x:s<p> -> (a<r x>, s<q x>)) @-}
-
- {-@ runState :: forall <p :: s -> Prop, q :: s -> s -> Prop, r :: s -> a -> Prop>. ST <p, q, r> s a -> x:s<p> -> (a<r x>, s<q x>) @-}
-
-
-
-{-
-cmp :: forall < pref :: s -> Prop, postf :: s -> s -> Prop
-              , pre  :: s -> Prop, postg :: s -> s -> Prop
-              , post :: s -> s -> Prop
-              , rg   :: s -> a -> Prop
-              , rf   :: s -> b -> Prop
-              , r    :: s -> b -> Prop
-              >. 
-       {xx:s<pre> -> w:s<postg xx> -> s<postf w> -> s<post xx>}
-       {ww:s<pre> -> s<postg ww> -> s<pref>}
-       (ST <pre, postg, rg> s a)
-    -> (ST <pref, postf, rf> s b)
-    -> (ST <pre, post, r> s b)
-@-}
-
-cmp :: (ST s a)
-    -> (ST s b)
-    -> (ST s b)
-
-cmp (ST g) (ST f) = ST (\x -> case g x of {(_, s) -> f s})    
-
-{-@ 
-bind :: forall < pref :: s -> Prop, postf :: s -> s -> Prop
-              , pre  :: s -> Prop, postg :: s -> s -> Prop
-              , post :: s -> s -> Prop
-              , rg   :: s -> a -> Prop
-              , rf   :: s -> b -> Prop
-              , r    :: s -> b -> Prop
-              , pref0 :: a -> Prop 
-              >. 
-       {x:s<pre> -> a<rg x> -> a<pref0>}      
-       {x:s<pre> -> y:s<postg x> -> b<rf y> -> b<r x>}
-       {xx:s<pre> -> w:s<postg xx> -> s<postf w> -> s<post xx>}
-       {ww:s<pre> -> s<postg ww> -> s<pref>}
-       (ST <pre, postg, rg> s a)
-    -> (a<pref0> -> ST <pref, postf, rf> s b)
-    -> (ST <pre, post, r> s b)
-@-}
-
-bind :: (ST s a)
-    -> (a -> ST s b)
-    -> (ST s b)
-
-bind (ST g) f = ST (\x -> case g x of {(y, s) -> (runState (f y)) s})    
-
-
-{-@ unit :: forall s a <p :: s -> Prop>. x:a -> ST <p, {\s v -> v == s}, {\s v -> x == v}> s a @-}
-unit :: a -> ST s a
-unit x = ST $ \s -> (x, s)
-
-{-@ incr :: ST <{\x -> x >= 0}, {\x v -> v = x + 1}, {\x v -> v = x}>  Nat Nat @-}
-incr :: ST Int Int
-incr = ST $ \x ->  (x, x + 1)
-
-{-@ incr' :: ST <{\x -> x >= 0}, {\x v -> v = x + 1}, {\w vw -> vw = w}>  Nat Nat @-}
-incr' :: ST Int Int
-incr' = bind incr (\x -> unit x)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/todo/Strings.hs b/tests/todo/Strings.hs
deleted file mode 100644
--- a/tests/todo/Strings.hs
+++ /dev/null
@@ -1,39 +0,0 @@
-module DBC where
-
-import GHC.CString  -- This import interprets Strings as constants!
-
-
-import Data.Set
-{-
-bar :: () -> String 
-{- bar :: () -> {x:String | x = unpack "foo" && len x >= 0} @-}
-bar _ = "foo"
-
-
-{- prop :: {v:Bool | Prop v <=> true} @-}
-prop :: Bool
-prop = foo1 == foo2 
-  where foo1 = "foo"
-        foo2 = "foo"
--}
-
-
-data Foo = FFFF | QQQQ deriving Eq
-
-{-@ prop2 :: {v:Bool | Prop v <=> true} @-}
-prop2 :: Bool
-prop2 = foo1 /= foo2 
-  where foo1 = FFFF
-        foo2 = QQQQ
-
-
--- one character strings seems to crash....
-{-@ prop3 :: {v:[String] | listElts v ~~ Set_sng "x"} @-}
-prop3 :: [String]
-prop3 = ["x"]
-
-{-@ prop1 :: {v:Bool | Prop v <=> true} @-}
-prop1 :: Bool
-prop1 = foo1 /= foo2 
-  where foo1 = "foo"
-        foo2 = "bar"
diff --git a/tests/todo/SubType.hs b/tests/todo/SubType.hs
deleted file mode 100644
--- a/tests/todo/SubType.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-module HOSubtype where
-
-{-@ foo :: f:(x:{v:Int | false} -> {v:Int | v = x}) -> () @-}
-foo    :: (Int -> Int) -> ()
-foo pf = ()
-
-test0 :: ()
-test0  = foo useless_proof
-
-{-@ generic_accept_stable ::
-                    f:(x:a -> {v:a | (v = x)}) ->
-                    ()
-                    @-}
-generic_accept_stable :: (a -> a) -> ()
-generic_accept_stable pf = ()
-
-{-@ useless_proof :: x:{v:Int | v > 0} -> {v:Int | v > 0} @-}
-useless_proof :: Int -> Int
-useless_proof _ = 5
-
-test :: ()
-test = generic_accept_stable useless_proof
diff --git a/tests/todo/SuperClassBounds.hs b/tests/todo/SuperClassBounds.hs
deleted file mode 100644
--- a/tests/todo/SuperClassBounds.hs
+++ /dev/null
@@ -1,37 +0,0 @@
-module Compose where
-
-import Prelude hiding (Functor, Monad)
-
-data ST s a = ST {runState :: s -> (a,s)}
-
-{-@ data ST s a <p :: s -> Prop, q :: s -> s -> Prop, r :: s -> a -> Prop> 
-  = ST (runState :: x:s<p> -> (a<r x>, s<q x>)) @-}
-
-{-@ runState :: forall <p :: s -> Prop, q :: s -> s -> Prop, r :: s -> a -> Prop>. ST <p, q, r> s a -> x:s<p> -> (a<r x>, s<q x>) @-}
-
-class Functor f where
-  fmap :: (a -> b) -> f a -> f b
-
-instance Functor (ST s) where
-  fmap f (ST g) = ST (\s -> let (a, s') = g s in (f a, s'))
-
-class Functor m => Monad m where
-  (>>) :: m a -> m b -> m b
-
-instance Monad (ST s) where
-  {-@ instance Monad ST s where
-    >>  :: forall s a b  < pref :: s -> Prop, postf :: s -> s -> Prop
-              , pre  :: s -> Prop, postg :: s -> s -> Prop
-              , post :: s -> s -> Prop
-              , rg   :: s -> a -> Prop
-              , rf   :: s -> b -> Prop
-              , r    :: s -> b -> Prop
-              >. 
-       {x::s<pre>, y::s<postg x> |- b<rf y> <: b<r x>}
-       {xx::s<pre>, w::s<postg xx> |- s<postf w> <: s<post xx>}
-       {ww::s<pre> |- s<postg ww> <: s<pref>}
-       (ST <pre, postg, rg> s a)
-    -> (ST <pref, postf, rf> s b)
-    -> (ST <pre, post, r> s b)
-    @-}
-  (ST g) >>  f = ST (\x -> case g x of {(y, s) -> (runState f) s})    
diff --git a/tests/todo/T1037A.hs b/tests/todo/T1037A.hs
deleted file mode 100644
--- a/tests/todo/T1037A.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-{-@ LIQUID "--higherorder"        @-}
-{-@ LIQUID "--exactdc"            @-}
-
-module T1037A where
-
-import Language.Haskell.Liquid.ProofCombinators
-import qualified T1037C 
-import qualified T1037B 
-
diff --git a/tests/todo/T1037B.hs b/tests/todo/T1037B.hs
deleted file mode 100644
--- a/tests/todo/T1037B.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-{-@ LIQUID "--higherorder"        @-}
-{-@ LIQUID "--exactdc"            @-}
-
-module T1037B where
-
-import Language.Haskell.Liquid.ProofCombinators
-
-{-@ data Iso a b = Iso { to   :: a -> b
-                       , from :: b -> a
-                       , tof  :: y:b -> { to (from y) == y }
-                       , fot  :: x:a -> { from (to x) == x }
-                       }
-@-}
-data Iso a b = Iso { to   :: a -> b
-                   , from :: b -> a
-                   , tof  :: b -> Proof
-                   , fot  :: a -> Proof
-                   }
diff --git a/tests/todo/T1037C.hs b/tests/todo/T1037C.hs
deleted file mode 100644
--- a/tests/todo/T1037C.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-{-# LANGUAGE TypeFamilies #-}
-module T1037C where
-
-import Language.Haskell.Liquid.ProofCombinators
-
-class Generic a where
-  type Rep a :: * -> *
-  from :: a -> Rep a x
-  to   :: Rep a x -> a
diff --git a/tests/todo/T1089.hs b/tests/todo/T1089.hs
deleted file mode 100644
--- a/tests/todo/T1089.hs
+++ /dev/null
@@ -1,68 +0,0 @@
-
-{-@ LIQUID "--exact-data-con"                      @-}
-{-@ LIQUID "--higherorder"                         @-}
-{-@ LIQUID "--no-termination"                      @-}
-{-@ LIQUID "--automatic-instances=liquidinstances" @-}
-
-{-# LANGUAGE ExistentialQuantification, KindSignatures, TypeFamilies, GADTs #-}
-
-module Query where
-
-import Prelude hiding (filter)
-
-data PersistFilter = EQUAL | LE | GE
-
--- class PersistEntity record where
-    {- data EntityField @-}
-    -- data EntityField record :: * -> *
-
-{- data Filter record typ = Filter { filterField :: EntityField record typ, filterValue :: typ, filterFilter :: PersistFilter } @-}
-data Filter typ = Filter
-  { filterField  :: EntityField typ
-  , filterValue  :: typ
-  , filterFilter :: PersistFilter
-  }
-
-createEqQuery :: EntityField typ -> typ -> Filter typ
-createEqQuery field value = Filter
-  { filterField  = field
-  , filterValue  = value
-  , filterFilter = EQUAL
-  }
-
-data Blob  = B { xVal :: Int, yVal :: Int }
-
---instance PersistEntity Blob where
-    {- data EntityField record typ where
-        BlobXVal :: EntityField Blob Int
-      | BlobYVal :: EntityField Blob Int
-    @-}
-data EntityField typ where
-   BlobXVal :: EntityField Int
-   BlobYVal :: EntityField Int
-
-{-@ filter :: f:(a -> Bool) -> [a] -> [{v:a | f v}] @-}
-filter :: (a -> Bool) -> [a] -> [a]
-filter f (x:xs)
-  | f x         = x : filter f xs
-  | otherwise   =     filter f xs
-filter _ []     = []
-
-
-{-@ reflect evalQBlobXVal @-}
-evalQBlobXVal :: Int -> Int -> Bool
-evalQBlobXVal filter given = filter == given
-
-{-@ reflect evalQBlobYVal @-}
-evalQBlobYVal :: Int -> Int -> Bool
-evalQBlobYVal filter given = filter == given
-
-{-@ reflect evalQBlob @-}
-evalQBlob :: Filter typ -> Blob -> Bool
-evalQBlob filter blob = case filterField filter of
-    BlobXVal -> evalQBlobXVal (filterValue filter) (xVal blob)
-    BlobYVal -> evalQBlobYVal (filterValue filter) (yVal blob)
-
-{-@ filterQBlob :: f:(Filter a) -> [Blob] -> [{b:Blob | evalQBlob f b}] @-}
-filterQBlob :: Filter a -> [Blob] -> [Blob]
-filterQBlob q = filter (evalQBlob q)
diff --git a/tests/todo/T1094_Lib.hs b/tests/todo/T1094_Lib.hs
deleted file mode 100644
--- a/tests/todo/T1094_Lib.hs
+++ /dev/null
@@ -1,19 +0,0 @@
-{-@ LIQUID "--higherorder" @-}
-{-@ LIQUID "--exactdc"     @-}
-
-module T1094_Lib where
-
-import Language.Haskell.Liquid.ProofCombinators
-
-{-@ data Iso a b = Iso { to   :: a -> b
-                       , from :: b -> a
-                       , tof  :: y:b -> { to (from y) == y }
-                       , fot  :: x:a -> { from (to x) == x }
-                       }
-@-}
-
-data Iso a b = Iso { to   :: a -> b
-                   , from :: b -> a
-                   , tof  :: b -> Proof
-                   , fot  :: a -> Proof
-                   }
diff --git a/tests/todo/T1109.hs b/tests/todo/T1109.hs
deleted file mode 100644
--- a/tests/todo/T1109.hs
+++ /dev/null
@@ -1,200 +0,0 @@
--- | Unification for simple terms a la Zombie
--- | cite : http://www.seas.upenn.edu/~sweirich/papers/congruence-extended.pdf
-
--- RJ: for some odd reason, this file NEEDs cuts/qualifiers. It is tickled by
--- nonlinear-cuts (i.e. they add new cut vars that require qualifiers.) why?
--- where? switch off non-lin-cuts in higher-order mode?
-
-{-@ LIQUID "--higherorder"     @-}
-{-@ LIQUID "--exact-data-cons" @-}
-{-@ LIQUID "--eliminate=all"   @-}
-
-{-@ LIQUID "--automatic-instances=liquidinstanceslocal" @-}
-
-module Unify where
-
-import Language.Haskell.Liquid.ProofCombinators
-import qualified  Data.Set as S
-
--- | Data Types
-data Term = TBot | TVar Int | TFun Term Term
-  deriving (Eq)
-{-@ data Term [tsize] = TBot | TVar {tvar :: Int} | TFun {tfun1 :: Term, tfun2 ::  Term} @-}
-
-type Substitution = L (P Int Term)
-data P a b = P a b
-{-@ data P a b = P {pfst :: a, psnd :: b} @-}
-
--- | Unification
--- | If unification succeds then the returned substitution makes input terms equal
--- | Unification may fail with Nothing, or diverge
-
-{-@ lazy unify @-}
-{-@ unify :: t1:Term -> t2:Term
-          -> Maybe {θ:Substitution | apply θ t1 == apply θ t2 } @-}
-unify :: Term -> Term -> Maybe Substitution
-unify TBot TBot
-  = Just Emp
-unify t1@(TVar i) t2
-  | not (S.member i (freeVars t2))
-  = Just (C (P i t2) Emp `byTheorem` theoremVar t2 i)
-unify t1 t2@(TVar i)
-  | not (S.member i (freeVars t1))
-  = Just (C (P i t1) Emp `byTheorem` theoremVar t1 i)
-unify (TFun t11 t12) (TFun t21 t22)
-  = case unify t11 t21 of
-      Just θ1 -> case unify (apply θ1 t12) (apply θ1 t22) of
-                   Just θ2 -> Just (append θ2 θ1 `byTheorem` theoremFun t11 t12 t21 t22 θ1 θ2)
-                   Nothing -> Nothing
-      _       -> Nothing
-unify t1 t2
-  = Nothing
-
-
--- | Helper Functions
-
-{-@ measure freeVars @-}
-freeVars :: Term -> S.Set Int
-freeVars TBot = S.empty
-freeVars (TFun t1 t2) = S.union (freeVars t1) (freeVars t2)
-freeVars (TVar i)     = S.singleton i
-
-
-{-@ axiomatize apply @-}
-apply :: Substitution -> Term -> Term
-apply Emp t
-  = t
-apply (C s ss) t
-  = applyOne s (apply ss t)
-
-
-{-@ axiomatize applyOne @-}
-applyOne :: (P Int Term) -> Term -> Term
-applyOne su (TFun tx t)
-  = TFun (applyOne su tx) (applyOne su t)
-applyOne (P x t) (TVar v) | x == v
-  = t
-applyOne _ t 
-  = t
-
-
--- | Proving the required theorems
-
-{-@ automatic-instances theoremFun @-}
-
-theoremFun :: Term -> Term -> Term -> Term -> Substitution -> Substitution -> Proof
-{-@ theoremFun
-  :: t11:Term
-  -> t12:Term
-  -> t21:Term
-  -> t22:Term
-  -> s1:{θ1:Substitution | apply θ1 t11 == apply θ1 t21 }
-  -> s2:{θ2:Substitution | apply θ2 (apply s1 t12) == apply θ2 (apply s1 t22) }
-  -> { apply (append s2 s1) (TFun t11 t12) ==
-       apply (append s2 s1) (TFun t21 t22)  }
-  @-}
-theoremFun t11 t12 t21 t22 θ1 θ2
-  =   split_fun t11 t12 (append θ2 θ1)
-  &&& append_apply θ2 θ1 t11
-  &&& append_apply θ2 θ1 t12
-  &&& append_apply θ2 θ1 t21
-  &&& append_apply θ2 θ1 t22
-  &&& split_fun t21 t22 (append θ2 θ1)
-
-
-{-@ automatic-instances split_fun  @-}
-
-split_fun :: Term -> Term -> Substitution -> Proof
-{-@ split_fun :: t1:Term -> t2:Term -> θ:Substitution
-   -> {apply θ (TFun t1 t2) == TFun (apply θ t1) (apply θ t2)} / [llen θ] @-}
-
-{-
-HACK: the above spe creates the rewrite rule 
-  apply θ (TFun t1 t2) -> TFun (apply θ t1) (apply θ t2)
-If I change the order of the equality to 
-  TFun (apply θ t1) (apply θ t2) == apply θ (TFun t1 t2)
-then Liquid Haskell will not auto prove it  
--}
-
-split_fun t1 t2 Emp
-  = trivial
-split_fun t1 t2 (C su θ)
-   = split_fun t1 t2 θ --  &&& (applyOne su (TFun (apply θ t1) (apply θ t2)) *** QED) -- THIS 
-
-{-@ automatic-instances append_apply  @-}
-
-append_apply :: Substitution -> Substitution -> Term -> Proof
-{-@ append_apply
-   :: θ1:Substitution
-   -> θ2:Substitution
-   -> t :Term
-   -> {apply θ1 (apply θ2 t) == apply (append θ1 θ2) t}
-  @-}
-append_apply Emp θ2 t
-  = trivial
-append_apply (C su θ) θ2 t
-  = append_apply θ θ2 t --  &&&  append_len θ θ2
-
-{-@ automatic-instances append_len  @-}
-
-{-@ append_len ::  s1:Substitution -> s2:Substitution -> {llen (append s1 s2) == llen s1 + llen s2  } @-}
-append_len ::  Substitution -> Substitution -> Proof
-append_len Emp _       = trivial 
-append_len (C _ s1) s2 = append_len s1 s2 
-
-
-{-@ automatic-instances append_len  @-}
-
-
-{-@ automatic-instances theoremVar  @-}
-
-{-@ theoremVar :: t:Term
-             -> i:{Int | not (Set_mem i (freeVars t)) }
-             -> {apply (C (P i t) Emp) (TVar i) == apply (C (P i t) Emp) t } @-}
-theoremVar :: Term -> Int ->Proof
-theoremVar t i
-  =   theoremVarOne t i t 
-
-
-{-@ automatic-instances theoremVarOne  @-}
-{-@ theoremVarOne :: tiger:Term
-             -> i:{Int | not (Set_mem i (freeVars tiger)) }
-             -> ti:Term
-             -> { applyOne (P i ti) tiger == tiger } @-}
-theoremVarOne :: Term -> Int -> Term -> Proof
-theoremVarOne (TFun t1 t2) ink tonk
-  = theoremVarOne t1 ink tonk
-
-
--- | Helpers to lift Terms and Lists into logic...
--- | With some engineering all these can be automated...
--- | Lifting Terms into logic
-{-@ measure tsize @-}
-tsize :: Term -> Int
-{-@ invariant {t:Term | tsize t >= 0 } @-}
-
--- NV TODO: something goes wrong with measure invariants
-{-@ tsize :: Term -> Int  @-}
-tsize TBot     = 0
-tsize (TVar _) = 0
-tsize (TFun t1 t2) = 1 + (tsize t1) + (tsize t2)
-
-
-
-
--- | List Helpers
-{-@ axiomatize append @-}
-{-@ append :: xs:L a -> ys:L a -> {v:L a | llen v == llen xs + llen ys } @-}
-append :: L a -> L a -> L a
-append Emp ys = ys 
-append (C x xs) ys = C x (append xs ys)
-
-data L a = Emp | C a (L a)
-{-@ data L [llen] a = Emp | C {lhd :: a, ltl :: L a} @-}
-
-{-@ measure llen @-}
-llen :: L a -> Int
-{-@ llen :: L a -> Nat @-}
-llen Emp      = 0
-llen (C _ xs) = 1 + llen xs
-
diff --git a/tests/todo/T658.hs b/tests/todo/T658.hs
deleted file mode 100644
--- a/tests/todo/T658.hs
+++ /dev/null
@@ -1,13 +0,0 @@
--- #658, fails if you comment out test1 (and test2?)
-
-{-@ test1 :: n: {v : Int | v >= 0} -> lst: {v : [a] | n < len v} -> {v : [a] | len v = len lst - n } @-}
-test1 :: Int -> [a] -> [a]
-test1 n lst = b where (_, b) = splitAt n lst
-
-{-@ test2 :: n: {v : Int | v >= 0} -> lst: {v : [a] | n < len v} -> {v : [a] | len v = n } @-}
-test2 :: Int -> [a] -> [a]
-test2 n lst = a where (a, _) = splitAt n lst
-
-{-@ test3 :: n: {v : Int | v >= 0} -> lst: {v : [a] | n < len v} -> {v : [a] | len v = len lst } @-}
-test3 :: Int -> [a] -> [a]
-test3 n lst = a ++ b where (a, b) = splitAt n lst
diff --git a/tests/todo/T765.hs b/tests/todo/T765.hs
deleted file mode 100644
--- a/tests/todo/T765.hs
+++ /dev/null
@@ -1,10 +0,0 @@
--- | issue #765 we get complete gibberish for inferred types
--- * nothing for 'gunk'
--- * {v = 1} for `z`
-
-module Bar where
-
-{-@ bar :: Nat -> Nat @-}
-bar :: Int -> Int 
-bar z = let gunk = z + 1 
-        in gunk
diff --git a/tests/todo/T770.hs b/tests/todo/T770.hs
deleted file mode 100644
--- a/tests/todo/T770.hs
+++ /dev/null
@@ -1,37 +0,0 @@
-{- This fails with
-
-```
-/Users/rjhala/research/stack/liquidhaskell/.stack-work/install/x86_64-osx/lts-5.9/7.10.3/share/x86_64-osx-ghc-7.10.3/liquidhaskell-0.6.0.0/include/Prelude.spec:43:20: Error: GHC Error
-
-43 | type FF      = {v: Bool          | not (Prop v)}
-                        ^
-
-    Not in scope: type constructor or class `Bool'
-```
-
-if we UNCOMMENT import (1) then we get the error
-
-```
- /Users/rjhala/research/stack/liquidhaskell/.stack-work/install/x86_64-osx/lts-5.9/7.10.3/share/x86_64-osx-ghc-7.10.3/liquidhaskell-0.6.0.0/include/GHC/CString.spec:7:10: Error: GHC Error
-
- 7 |   -> {v:[Char] | v ~~ x && len v == strLen x}
-              ^
-
-     Not in scope: type constructor or class `Char'
-```
-
-if we UNCOMMENT import (2) then we get no errors
-
--}
-
-module Wrenn where
-
-import Prelude ()
-
-import Data.Int
-
--- (1) import Data.Bool
--- (2) import Data.Char
-
-incr :: Int
-incr = 1
diff --git a/tests/todo/T771.hs b/tests/todo/T771.hs
deleted file mode 100644
--- a/tests/todo/T771.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-{- This fails with the error:
-
-```
- /Users/rjhala/research/stack/liquidhaskell/tests/todo/T771.hs:7:13: Error: Bad Type Specification
- Wrenn.incr :: (Num a) => a -> {VV : a | VV == thing}
-     Sort Error in Refinement: {VV : a_amT | VV == thing}
-     Unbound Symbol thing
-```
-
-which is accurate, but misleading, as the *real* problem is you can't have
-binders on typeclass constraints.
-
--}
-
-module Wrenn where
-
-{-@ incr :: thing:(Num a) => a -> {v:a | v = thing} @-}
-
-incr :: (Num a) => a -> a
-incr x = x
diff --git a/tests/todo/T772.hs b/tests/todo/T772.hs
deleted file mode 100644
--- a/tests/todo/T772.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
-
-module LiquidR where
-
-class R m where
-
-class (R a, R b) => UnarySubscript a b where
-  indexUnary :: a -> b -> [a]
-
-{-@ instance (R t, R u) => UnarySubscript t u where
-      indexUnary :: a:t -> b:{v:_ | 1 + 2 = 3 } -> t
-  @-}
-instance (R a, R b) => UnarySubscript a b
-
--- Note this works:
---   indexUnary :: a:t -> b:{v:_ | 1 + 2 = 3 } -> [t]
-
-{-@ predicate Bloop A = (size A) = 0 @-}
-
--- UNCOMMENT; (error omitted for brevity)
-{-@ class (R t, R u, R v) => Addition t u v where
-    add :: a:t ->
-           b:u ->
-          {c:v | ArithmeticResult a b c }
-@-}
-class (R a, R b, R c) => Addition a b c | a b -> c  where
-  add  :: a -> b -> c
-  add  = unimplemented
diff --git a/tests/todo/T776.hs b/tests/todo/T776.hs
deleted file mode 100644
--- a/tests/todo/T776.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-{- | There are 2 bugs here, that have to do with `--prune-unsorted`.
-
-     1. Why is the `prod` measure being used in the generic `size`
-        function where it doesn't fit?
-
-     2. Why are we getting such a meaningless error message?!
-
-        At the very least some mention of try `prune-unsorted` ?
-
-        Can we not put in a simple check in Bare for now:
-
-        The measure `prod` is not-polymorphic, please run with --prune-unsorted.
-        
- -}
-
-{-@ LIQUID "--prune-unsorted" @-}
-
-module LiquidR where
-
-{-@ measure size @-}
-size        :: [a] -> Int
-size []     = 0
-size (_:xs) = 1 + size xs
-
-{-@ measure prod @-}
-prod :: [Int] -> Int
-prod []     = 1
-prod (x:xs) = x + prod xs
diff --git a/tests/todo/T781.hs b/tests/todo/T781.hs
deleted file mode 100644
--- a/tests/todo/T781.hs
+++ /dev/null
@@ -1,88 +0,0 @@
--- | Issue 781: why the lame error message, even though we HAVE source information.
-
-{-# LANGUAGE ScopedTypeVariables #-}
-{-@ LIQUID "--no-termination" @-}
-module Class () where
-
-import Language.Haskell.Liquid.Prelude
-import Prelude hiding (sum, length, (!!), Functor(..))
-
-{- qualif Size(v:Int, xs:a): v = size xs @-}
-{- qualif Size(v:Int, xs:MList a): v = size xs @-}
-
-data MList a = Nil | Cons a (MList a)
-
-{-@ (!!) :: xs:MList a -> {v:Nat | v < size xs} -> a @-}
-(!!) :: MList a -> Int -> a
-(Cons x _)  !! 0 = x
-(Cons _ xs) !! i = xs !! (i - 1)
-
-{-@ class measure sz :: forall a. a -> Int  @-}
-
-{-@ class Sized s where
-      size :: forall a. x:s a -> {v:Nat | v = sz x}
-  @-}
-class Sized s where
-  size :: s a -> Int
-
-instance Sized MList where
-  {-@ instance measure size :: MList a -> Int
-      sz (Nil)       = 0
-      sz (Cons x xs) = 1 + sz xs
-    @-}
-  size = length
-
-{-@ length :: xs:MList a -> {v:Nat | v = sz xs} @-}
-length :: MList a -> Int
-length Nil         = 0
-length (Cons _ xs) = 1 + length xs
-
-{-@ bob :: xs:MList a -> {v:Nat | v = sz xs} @-}
-bob :: MList a -> Int
-bob = length
-
-
-instance Sized [] where
-  {-@ instance measure sz :: [a] -> Int
-      sz ([])   = 0
-      sz (x:xs) = 1 + (sz xs)
-    @-}
-  size [] = 0
-  size (_:xs) = 1 + size xs
-
-{-@ class (Sized s) => Indexable s where
-      index :: forall a. x:s a -> {v:Nat | v < sz x} -> a
-  @-}
-class (Sized s) => Indexable s where
-  index :: s a -> Int -> a
-
-
-
-instance Indexable MList where
-  index = (!!)
-
-{-@ sum :: Indexable s => s Int -> Int @-}
-sum :: Indexable s => s Int -> Int
-sum xs = go n 0
-  where
-    n = size xs
-    go (d::Int) i
-      | i < n     = index xs i + go (d-1) (i+1)
-      | otherwise = 0
-
-
-{-@ sumMList :: MList Int -> Int @-}
-sumMList :: MList Int -> Int
-sumMList xs = go max 0
-  where
-    max = size xs
-    go (d::Int) i
-      | i < max   = index xs i + go (d-1) (i+1)
-      | otherwise = 0
-
-
-{-@ x :: {v:MList Int | (sz v) = 3}  @-}
-x :: MList Int
-x = 1 `Cons` (2 `Cons` (3 `Cons` Nil))
-
-foo = liquidAssert $ size (Cons 1 Nil) == size [1]
diff --git a/tests/todo/T791.hs b/tests/todo/T791.hs
deleted file mode 100644
--- a/tests/todo/T791.hs
+++ /dev/null
@@ -1,23 +0,0 @@
-import Prelude hiding (null, head, tail, notElem, empty)
-
-import Data.Vector hiding (singleton, empty)
-import qualified Data.Vector.Mutable as M
-import qualified Data.Vector as V
-import Control.Monad.Primitive
-
-{-@ measure mvlen :: forall a. (MVector s a) -> Int @-}
-{-@ invariant {mv:MVector s a | 0 <= mvlen mv } @-}
-{-@ assume Data.Vector.Mutable.new :: PrimMonad m => n:Nat -> m ({vs:MVector (PrimState m) a | mvlen vs == n }) @-}
-
-{-@ minimal :: v:Vector a -> Vector a @-}
-minimal :: Vector a -> Vector a
-minimal v = create (M.new n >>= (\x -> go n x))
-  where
-    {-@ n :: {n:Nat | n == vlen v} @-}
-    n = V.length v
-    {-@ go :: n:Nat -> {mv:MVector (PrimState m) a | mvlen mv == n} -> m (MVector (PrimState m) a) @-}
-    go :: (PrimMonad m) => Int -> MVector (PrimState m) a -> m (MVector (PrimState m) a)
-    go _ mv = pure mv
-
-{-@ qualif EqLen(v:MVector s a, x:Vector b): (mvlen v == vlen x) @-}
-{-@ qualif MVLen(v:MVector s a, n:Int): (mvlen v == n) @-}
diff --git a/tests/todo/T791a.hs b/tests/todo/T791a.hs
deleted file mode 100644
--- a/tests/todo/T791a.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-import Prelude hiding (null, head, tail, notElem, empty)
-
-import Data.Vector hiding (singleton, empty)
-import qualified Data.Vector.Mutable as M
-import Control.Monad.Primitive
-import qualified Data.Vector as V
-
-minimal1 mickey = create (M.new 0 >>= go)
-
-{-@ go :: {v:MVector (PrimState m) a | false } -> m (MVector (PrimState m) a) @-}
-go :: (PrimMonad m) => MVector (PrimState m) a -> m (MVector (PrimState m) a)
-go mv = pure mv
diff --git a/tests/todo/T870.hs b/tests/todo/T870.hs
deleted file mode 100644
--- a/tests/todo/T870.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-
--- https://github.com/ucsd-progsys/liquidhaskell/issues/870 
--- the following succeeds normally, but fails if we switch on the higher-order 
-
-{- LIQUID "--higherorder" @-}
-
-import Prelude hiding (splitAt)
-
-
-data Vec a = Nil | Cons a (Vec a)
-
-{-@ invariant {v:Vec a | 0 <= vlen v} @-}
-
-{-@ measure vlen :: Vec a -> Int
-    vlen Nil         = 0
-    vlen (Cons x xs) = 1 + vlen xs
-  @-}
-
-
-{-@ splitAt :: n:Nat
-            -> a:{Vec t|vlen a >= n}
-            -> {b:(Vec t, Vec t)|vlen (snd b) = vlen a - n && n = vlen (fst b)} @-}
-
-splitAt :: Int -> Vec a -> (Vec a, Vec a)
-splitAt 0         as  = (Nil, as)
-splitAt n (Cons a as) = let (b1, b2) = splitAt (n - 1) as
-                        in (Cons a b1, b2)
-
diff --git a/tests/todo/T995.hs b/tests/todo/T995.hs
deleted file mode 100644
--- a/tests/todo/T995.hs
+++ /dev/null
@@ -1,42 +0,0 @@
-{-@ LIQUID "--exact-data-con" @-}
-{-@ LIQUID "--automatic-instances=liquidinstances" @-}
-
-module Basics
-  ( Peano(..)
-  , toNat
-  ) where
-
-import           Prelude (Char, Int)
-import qualified Prelude
-import           Language.Haskell.Liquid.ProofCombinators
-
---------------------------------------------------------------------------------
--- | Booleans ------------------------------------------------------------------
---------------------------------------------------------------------------------
-
-{-@ data Bool = True | False @-}
-data Bool = True | False
-
---------------------------------------------------------------------------------
--- | Peano ---------------------------------------------------------------------
---------------------------------------------------------------------------------
-
-{-@ data Peano [toNat] = O | S Peano @-}
-data Peano = O | S Peano
-
-{-@ measure toNat @-}
-{-@ toNat :: Peano -> Nat @-}
-toNat :: Peano -> Int
-toNat O     = 0
-toNat (S n) = 1 Prelude.+ toNat n
-
-{-@ reflect natEven @-}
-natEven :: Peano -> Bool
-natEven O         = True
-natEven (S O)     = False
-natEven (S (S n)) = natEven n
-
--- fails
-{-@ test_Even4 :: { natEven (S (S (S (S O)))) == True } @-}
-test_Even4 :: Proof
-test_Even4 = trivial
diff --git a/tests/todo/T996.hs b/tests/todo/T996.hs
deleted file mode 100644
--- a/tests/todo/T996.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-{-@ LIQUID "--exact-data-con"                      @-}
-
-module Induction where
-
-import qualified Prelude
-import           Prelude (Char, Int)
-import Language.Haskell.Liquid.ProofCombinators
-
-{-@ data Peano [toNat] = O | S Peano @-}
-data Peano = O | S Peano
-
-{-@ measure toNat @-}
-{-@ toNat :: Peano -> Nat @-}
-toNat :: Peano -> Int
-toNat O     = 0
-toNat (S n) = 1 Prelude.+ toNat n
-
-{-@ reflect plus @-}
-plus :: Peano -> Peano -> Peano
-plus O     n = n
-plus (S m) n = S (plus m n)
-
-{-@ data Bool = True | False @-}
-data Bool = True | False
-
-{-@ reflect even @-}
-even :: Peano -> Bool
-even O         = True
-even (S O)     = False
-even (S (S n)) = even n
-
-{-@ thmPlusCom :: n:Peano -> m:Peano -> { plus n m == plus m n} @-}
-thmPlusCom :: Peano -> Peano -> Proof
-thmPlusCom O     m = trivial
-thmPlusCom (S n) m = [ thmPlusCom n m ] *** QED
diff --git a/tests/todo/T997.hs b/tests/todo/T997.hs
deleted file mode 100644
--- a/tests/todo/T997.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-{-@ LIQUID "--exact-data-con"                      @-}
-{-@ LIQUID "--higherorder"                         @-}
-{-@ LIQUID "--totality"                            @-}
-{-@ LIQUID "--automatic-instances=liquidinstances" @-}
-
-{-@ data List [llen] = Nil | Cons {lTl :: List} @-}
-data List = Nil | Cons List
-
-{-@ measure llen @-}
-{-@ llen :: List -> Nat @-}
-llen :: List -> Int
-llen Nil      = 0
-llen (Cons t) = 1 + llen t
-
-{-@ reflect sz @-}
-{-@ sz :: List -> Nat @-}
-sz :: List -> Int
-sz Nil      = 0
-sz (Cons t) = 1 + sz t
-
--- THIS IS OK
-{-@ ok :: { llen ((Cons Nil)) == 1 } @-}
-ok = ()
-
--- THIS IS NOT
-{-@ fails :: { sz (Cons Nil) == 1 } @-}
-fails = ()
- 
diff --git a/tests/todo/T997a.hs b/tests/todo/T997a.hs
deleted file mode 100644
--- a/tests/todo/T997a.hs
+++ /dev/null
@@ -1,33 +0,0 @@
-{-@ LIQUID "--exact-data-con"                      @-}
-{-@ LIQUID "--higherorder"                         @-}
-{-@ LIQUID "--totality"                            @-}
-{-@ LIQUID "--automatic-instances=liquidinstances" @-}
-{-@ LIQUID "--diff"                                @-}
-
-module Lists where
-
-import Language.Haskell.Liquid.ProofCombinators
-
-
-{-@ data List [llen] = Nil | Cons {lHd :: Int, lTl :: List} @-}
-data List = Nil | Cons Int List
-
-{-@ measure llen @-}
-{-@ llen :: List -> Nat @-}
-llen :: List -> Int
-llen Nil        = 0
-llen (Cons h t) = 1 Prelude.+ llen t
-
-{-@ reflect beqList @-}
-beqList :: List -> List -> Bool
-beqList (Cons x xs) (Cons y ys) = x == y && beqList xs ys
-beqList Nil         Nil         = True
-beqList Nil         (Cons y ys) = False
-beqList (Cons x xs) Nil         = False
-
-
-{-@ testBeqList2 :: { beqList (Cons 1 Nil) (Cons 1 Nil) } @-}
-testBeqList2  = trivial
-
-{-@ testBeqList3 :: { beqList (Cons 1 (Cons 2 Nil)) (Cons 1 (Cons 3 Nil)) == False } @-}
-testBeqList3  = trivial
diff --git a/tests/todo/Times.hs b/tests/todo/Times.hs
deleted file mode 100644
--- a/tests/todo/Times.hs
+++ /dev/null
@@ -1,61 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-module Times where
-
-import Foreign
-
-{-@ times :: forall <p :: Int -> a -> Prop>. 
-             n:Nat -> a<p 0> -> (m:{Nat | m <= n} -> a<p m> -> a<p (m+1)>) -> a<p n>
-  @-}
-times :: Int -> a -> (Int -> a -> a) -> a
-times n z f = go 0 z
-  where
-    go m z | m == n    = z
-           | otherwise = go (m+1) (f m z)
-
-{-@ predicate Btwn Lo N Hi = Lo <= N && N < Hi @-}
-{-@ predicate Uint8 N = Btwn 0 N 256 @-}
-
-
-{-@ assume addUint8 :: x:{Int | Uint8 x} -> y:{Int | Uint8 y && Uint8 (x+y)}
-                    -> {v:Int | Uint8 v && v = x + y}
-  @-}
-addUint8 :: Int -> Int -> Int
-addUint8 = (+)
-
-{-@ ten :: {v:Int | Uint8 v} @-}
-ten = times 10 0 (\n x -> add1 x)
-
-{-@ gt10 :: x:Int -> {v:Bool | Prop v <=> x >= 10} @-}
-gt10 :: Int -> Bool
-gt10 x = x >= 10
-
-{-@ add1 :: x:{Int | Btwn 0 x 255} -> {v:Int | Uint8 v && v = x + 1} @-}
-add1 x = addUint8 x 1
-
-{-@ qualif TimesTwo(v:int, x:int): v = x * 2 @-}
-{-@ qualif PlusTwo(v:int, x:int): v = x + 2 @-}
-
-timesM :: Int -> (Int -> IO ()) -> IO ()
-timesM n f = go 0
-  where
-    go m | m == n    = return ()
-         | otherwise = f m >> go (m+1)
-
-{-@ tenM :: Ptr <{\x -> x = 0}> Int -> IO () @-}
-tenM :: Ptr Int -> IO ()
-tenM p = timesM 10 $ \i -> do
-           x <- peek p
-           poke p $ x `addUint8` 1
-
-{-@ data Ptr a <p :: a -> Prop> = GHC.Ptr.Ptr (x::GHC.Base.Addr#) @-}
-
-{-@ poke :: forall <p :: a -> Prop>. (Storable a)
-         => Ptr <p> a
-         -> a<p>
-         -> (IO ())
-  @-}
-
-{-@ peek :: forall <p :: a -> Prop>. (Storable a)
-         => (Ptr <p> a)
-         -> (IO (a<p>))
-  @-}
diff --git a/tests/todo/TreeMap.hs b/tests/todo/TreeMap.hs
deleted file mode 100644
--- a/tests/todo/TreeMap.hs
+++ /dev/null
@@ -1,55 +0,0 @@
-module Trees where
-
-{- LIQUID "--no-termination" @-}
-
-import Language.Haskell.Liquid.Prelude
-
-data Tree a = Leaf a | Node [Tree a] 
-
-{-@ data Tree a = Leaf (xx :: a) | Node (subtrees :: {vv : [{v:Tree a | size v < sizes vv}] | true}) @-}
-
-{-@ measure size  @-}
-{-@ measure sizes @-}
-
-{-@ invariant {v: [Tree a] | sizes v >= size (head v)} @-}
-{-@ invariant {v: [Tree a] | sizes v >= 0}             @-}
-{-@ invariant {v: Tree a   | size v >= 0}              @-}
-
-{-@ measure head :: [a] -> a 
-    head (x:xs) = x
-  @-}
-
-{-@ size           :: x:Tree a -> {v:Nat | v = size x} / [size x, 0] @-}
-size :: Tree a -> Int
-size (Leaf _)  = 1
-size (Node xs) = 1 + sizes xs
-
-{-@ sizes         :: xs:[Tree a] -> {v:Nat | v = sizes xs} / [sizes xs, len xs] @-}
-sizes :: [Tree a ] -> Int
-sizes []      = 0
-sizes (t:ts)  = size t + sizes ts
-
-{- data Tree a [sizes] @-}
-
-
-{-@ tmap :: _ -> tt:Tree a -> Tree b / [size tt, 1, 0] @-}
--- tmap f tt = case tt of
-tmap f (Leaf x) = Leaf (f x)
-tmap f tt@(Node ts) = Node (goo f (Node ts) (lemmasize ts (Node ts)))
-
-{-@ lemmasize :: ts:[Tree a] -> tt:{v:Tree a | ts = subtrees v} -> [{v:Tree a | size v < size tt}] @-}
-lemmasize :: [Tree a] -> Tree a  -> [Tree a]
-lemmasize _ (Node (t:ts)) = t : lemmasize ts (Node ts)
-
-
-{-@ goo :: (a -> b) -> tt:Tree a -> ts:[{v: Tree a | size v < size tt}] -> [Tree b] / [size tt, 0, len ts] @-}
-goo :: (a -> b) -> Tree a -> [Tree a] -> [Tree b]
-goo f tt [] = []
-goo f tt (t:ts) = tmap f t : goo f tt ts
-
-{-@ qualif SZ(v:Tree a, x:Tree a): size v < size x @-}
-
-{-@ qual :: xs:[Tree a] -> {v:Tree a | size v = 1 + sizes xs} @-}
-qual :: [Tree a] -> Tree a
-qual = undefined
-
diff --git a/tests/todo/TreeMap0.hs b/tests/todo/TreeMap0.hs
deleted file mode 100644
--- a/tests/todo/TreeMap0.hs
+++ /dev/null
@@ -1,54 +0,0 @@
-module Trees where
-
-{-@ LIQUID "--no-termination" @-}
-
-import Language.Haskell.Liquid.Prelude
-
-data Tree a = Leaf a | Node [Tree a] 
-
-{-@ data Tree a = Leaf (xx :: a) | Node (yy :: {mickeymouse : [{v:Tree a | size v < sizes mickeymouse}] | true}) @-}
-
-{-@ measure size  @-}
-{-@ measure sizes  @-}
-
-{-@ invariant {v: [Tree a] | sizes v >= 0  } @-}
-{-@ invariant {v: Tree a | size v >= 0  } @-}
-
-{-@ size           :: t:Tree a -> {v:Nat | v = size t} / [size t, 0] @-}
-size :: Tree a -> Int
-size (Leaf _)  = 1
-size (Node xs) = 1 + sizes xs
-
-{-@ sizes         :: xs:[Tree a] -> {v:Nat | v = sizes xs} / [sizes xs, len xs] @-}
-sizes :: [Tree a ] -> Int
-sizes []      = 0
-sizes (t:ts)  = size t + sizes ts
-
-{-@ test1 :: tt:Tree a -> Tree a / [size tt] @-}
-test1 tt = case tt of
-             Leaf x  -> Leaf x
-             Node ts -> liquidAssert (sizes ts < size tt) $ Node (goo tt ts)
-
-{-@ goo :: tt:Tree a -> [{v: Tree a | size v < size tt}] -> [Tree a] @-}
-goo :: Tree a -> [Tree a] -> [Tree a]
-goo _ []      = []
-goo tt (t:ts) = t : goo tt ts
-
-{-@ test2 :: tt:Tree a -> Tree a / [size tt] @-}
-test2 tt = case tt of
-             Leaf x  -> Leaf x
-             Node ts -> liquidAssert (sizes ts < size tt) $ Node (moo ts ts)
-
-{-@ moo :: ts:[Tree a] -> [{v: Tree a | size v < sizes ts}] -> [Tree a] @-}
-moo :: [Tree a] -> [Tree a] -> [Tree a]
-moo _  []      = []
-moo ts (t:ts') = t : moo ts ts'
-
-
-
-{-@ qualif SZ(v:a, x:b): size v < size x @-}
-
-foo tt = case tt of
-           Leaf x  -> () 
-           Node ts -> liquidAssert (1 + sizes ts == size tt) ()
-
diff --git a/tests/todo/TypeError.hs b/tests/todo/TypeError.hs
deleted file mode 100644
--- a/tests/todo/TypeError.hs
+++ /dev/null
@@ -1,60 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE ExtendedDefaultRules #-}
-
-
-{-@ LIQUID "--autoproofs"      @-}
-{-@ LIQUID "--totality"        @-}
-{-@ LIQUID "--exact-data-cons" @-}
-module Append where
-
-import Axiomatize
-import Equational
-import Prelude hiding (return, (>>=))
-
-
-data L a = N 
-
--- | Definition of the list monad
-
-{-@ axiomatize return @-}
-$(axiomatize
-  [d| return :: a -> L a
-      return x = N
-    |])
-
-{-@ axiomatize append @-}
-$(axiomatize
-  [d| append :: L a -> L a -> L a
-      append N ys        = ys
-    |])
-
-{-@ axiomatize bind @-}
-$(axiomatize
-  [d| bind :: L a -> (a -> L a) -> L a
-      bind N        f = N
-    |])
-
-
--- | Right Identity m >>= return ≡  m
-{-@ prop_right_identity :: Eq a => L a -> {v:Proof | bind N return == N } @-}
-prop_right_identity :: Eq a => L a -> Proof
-prop_right_identity N =  refl (bind N return) `by` pr1 
-  where
-    e1  = bind N return
-    pr1 = axiom_bind_N return
-    e2  = N
-
-
-
--- | List definition
-
-
-instance Eq a => Eq (L a) where
-  N == N                 = True
-
-{-@ data L [llen] @-}
-{-@ invariant {v: L a | llen v >= 0} @-}
-
-{-@ measure llen @-}
-llen :: L a -> Int
-llen N = 0
diff --git a/tests/todo/TypeFun.hs b/tests/todo/TypeFun.hs
deleted file mode 100644
--- a/tests/todo/TypeFun.hs
+++ /dev/null
@@ -1,45 +0,0 @@
-{-# LANGUAGE DataKinds    #-}
-{-# LANGUAGE FlexibleContexts    #-}
-{-# LANGUAGE FlexibleInstances    #-}
-{-# LANGUAGE FunctionalDependencies    #-}
-{-# LANGUAGE MultiParamTypeClasses    #-}
-{-# LANGUAGE RankNTypes   #-}
-{-# LANGUAGE TypeFamilies #-}
-{-# LANGUAGE TypeOperators #-}
-{-# LANGUAGE UndecidableInstances #-}
-module TypeFun where
-
-{-@ predicate Btwn Lo N Hi = Lo <= N && N < Hi @-}
-
-{-@ addUint8 :: x:_ -> y:{_ | Btwn 0 (x+y) 256} -> {v:_ | v = x + y} @-}
-addUint8 :: Int -> Int -> Int
-addUint8 = (+)
-
-{-@ double :: Def (Arr (Cons {v:Int | Btwn 0 v 128} Nil) Int) @-}
-double = proc body
-  where 
-    {-@ body :: {v:Int | Btwn 0 v 128} -> _ @-}
-    body x = Body $ x `addUint8` x
-
-type Arr = (:->)
-
-type Cons = '(:)
-type Nil = '[]
-
-data Proc k = [k] :-> k
-
-proc :: forall proc impl. IvoryProcDef proc impl => impl -> Def proc
-proc x = Def
-
-data Def (proc :: Proc *)
-  = Def
-
-data Body r = Body r
-
-class IvoryProcDef (proc :: Proc *) impl | impl -> proc where
-
-instance IvoryProcDef ('[] :-> a) (Body a) where
-
-instance IvoryProcDef (args :-> ret) k
-      => IvoryProcDef ((a ': args) :-> ret) (a -> k) where
-
diff --git a/tests/todo/TypeSynonyms.hs b/tests/todo/TypeSynonyms.hs
deleted file mode 100644
--- a/tests/todo/TypeSynonyms.hs
+++ /dev/null
@@ -1,26 +0,0 @@
-{-# LANGUAGE DataKinds #-} -- Type level straings
-{-# LANGUAGE TypeOperators #-}
-{-# LANGUAGE KindSignatures #-}
-
-module Foo where
-import GHC.TypeLits
-
-{-@ foo :: x:Int -> {v:Int | v > x } @-}
-
-foo :: x  ::: Int -> (v ::: Int || v > x) 
-bar :: xs ::: [a] -> (v ::: Int || v == length xs)
-
-
-
-bar xs = length xs
-foo x = x + 1
-
-infixr 7 :::
-infixr 6 ||
-
-type x ::: t = t
-type t || p  = t
-type x > y   = Bool
-type x == y   = Bool
--- type (x :: Symbol) > (y :: Symbol)   = Bool
-
diff --git a/tests/todo/UnboundSigs.hs b/tests/todo/UnboundSigs.hs
deleted file mode 100644
--- a/tests/todo/UnboundSigs.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module DependeTypes where
-
-
-
-data MI s
-  = Small { mi_input :: String  }
-
-
-{-@ Small :: forall s. {v:String | s == v } -> MI s @-}
diff --git a/tests/todo/UnfoldDataCons.hs b/tests/todo/UnfoldDataCons.hs
deleted file mode 100644
--- a/tests/todo/UnfoldDataCons.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-
-{-@ boo :: [{v:a | false }] -> {v:[a] | len v == 0 } @-}
-boo :: [a] -> [a]
-boo []     = [] 
-boo (x:xs) = (x:xs)
-
-
-{-@ foo :: [{v:a | false }] -> {v:[a] | len v == 0 } @-}
-foo :: [a] -> [a]
-foo x = x 
diff --git a/tests/todo/Unsound.hs b/tests/todo/Unsound.hs
deleted file mode 100644
--- a/tests/todo/Unsound.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module Unsound where
-
-{-@ assume magic :: {v:() | false} @-}
-magic :: ()
-magic = undefined 
-
-bar = head []
diff --git a/tests/todo/UnsoundMeasure.hs b/tests/todo/UnsoundMeasure.hs
deleted file mode 100644
--- a/tests/todo/UnsoundMeasure.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Blank where
-
--- This example is unsound due to non-recursive definition of llen 
-
-import Language.Haskell.Liquid.Prelude
-
-data L a = N | C a (L a)
-
-
-{-@ measure llen :: (L a) -> Int 
-    llen(N) = 0
-    llen(C x xs) = 1 + (llen (C x xs))
-  @-}
-  
-foo :: L a -> L a
-foo (C _ xs) = liquidAssert (0==1) xs
diff --git a/tests/todo/Until.hs b/tests/todo/Until.hs
deleted file mode 100644
--- a/tests/todo/Until.hs
+++ /dev/null
@@ -1,52 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-module Until where
-
-import Prelude hiding (until)
-
-{-@ until :: forall <p :: a -> Prop, i :: a -> Prop>.
-             (a:a<i> -> {v:Bool | Prop v <=> papp1 p a})
-          -> ({v:a<i> | not (papp1 p v)} -> a<i>)
-          -> a<i>
-          -> a<p>
-  @-}
-until :: (a -> Bool) -> (a -> a) -> a -> a
-until p f = go
-  where
-    go x | p x          = x
-         | otherwise    = go (f x)
-
-{-@ predicate Btwn Lo N Hi = Lo <= N && N < Hi @-}
-{-@ predicate Uint8 N = Btwn 0 N 256 @-}
-
-
-{-@ assume addUint8 :: x:{Int | Uint8 x} -> y:{Int | Uint8 y && Uint8 (x+y)}
-                    -> {v:Int | Uint8 v && v = x + y}
-  @-}
-addUint8 :: Int -> Int -> Int
-addUint8 = (+)
-
-{-@ ten :: {v:Int | Uint8 v && v >= 10} @-}
-ten = until (\x -> gt10 x) (\x -> add1 x) 0 
-
-{-@ gt10 :: x:Int -> {v:Bool | Prop v <=> x >= 10} @-}
-gt10 :: Int -> Bool
-gt10 x = x >= 10
-
-{-@ add1 :: x:{Int | Btwn 0 x 255} -> {v:Int | Uint8 v && v = x +1} @-}
-add1 x = addUint8 x 1
-
-
-{-@ untilMono :: (x:{Int | Uint8 x && x <= 10} -> {v:Bool | Prop v <=> x >= 10})
-              -> ({v:Int | Uint8 v && v < 10} -> {v:Int | Uint8 v && v <= 10})
-              -> {v:Int | Uint8 v && v <= 10}
-              -> {v:Int | Uint8 v && v >= 10}
-  @-}
-untilMono :: (Int -> Bool) -> (Int -> Int) -> Int -> Int
--- untilMono p f x = until p f x
-untilMono p f = go
-  where
-    go x | p x          = x
-         | otherwise    = go (f x)
-
-{-@ tenMono :: {v:Int | Uint8 v && v >= 10} @-}
-tenMono = untilMono gt10 add1 0 
diff --git a/tests/todo/UseBound.hs b/tests/todo/UseBound.hs
deleted file mode 100644
--- a/tests/todo/UseBound.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-module UseBound where
-
-import ImportBound
-
--- This crashes because the type of `by` has a bound Chain that
--- is unknown at import
-
-myby = by
diff --git a/tests/todo/VerifiedNum.hs b/tests/todo/VerifiedNum.hs
deleted file mode 100644
--- a/tests/todo/VerifiedNum.hs
+++ /dev/null
@@ -1,31 +0,0 @@
-module VerifiedNum where
-
--- Hiding numeric operations, because they get by default translated to SMT equivalent
-import Prelude hiding (Num(..))
-
-import qualified Prelude as Prelude 
-
-class VerifiedNum a where 
-  (+) :: a -> a -> a 
-  (-) :: a -> a -> a 
-
-{-@ predicate BoundInt X = 0 < X + 10000 && X < 10000 @-}
-
-{-@ type OkInt N = {v:Int | BoundInt N => v == N} @-}
-
-{-@ type ValidInt = {v:Int | BoundInt v} @-}
-
-
-instance VerifiedNum Int where
-{-@ instance VerifiedNum Int where 
-    + :: x:Int -> y:Int -> OkInt {x + y} 
-  @-}
-	x + y = (Prelude.+) x y  
-{-@ instance VerifiedNum Int where 
-    - :: x:Int -> y:Int -> OkInt {x - y} 
-  @-}
-	x - y = (Prelude.-) x y  
-
-
-
-
diff --git a/tests/todo/WBL-crash.hs b/tests/todo/WBL-crash.hs
deleted file mode 100644
--- a/tests/todo/WBL-crash.hs
+++ /dev/null
@@ -1,177 +0,0 @@
-
------------------------------------------------------------------------
--- Weight-Biased Leftist Heap, verified using LiquidHaskell -----------
------------------------------------------------------------------------
--- ORIGINAL SOURCE ----------------------------------------------------
------------------------------------------------------------------------
--- Copyright: 2014, Jan Stolarek, Politechnika Łódzka                --
---                                                                   --
--- License: See LICENSE file in root of the repo                     --
--- Repo address: https://github.com/jstolarek/dep-typed-wbl-heaps-hs --
---                                                                   --
--- Basic implementation of weight-biased leftist heap. No proofs     --
--- and no dependent types. Uses a two-pass merging algorithm.        --
------------------------------------------------------------------------
-
-{-@ LIQUID "--no-termination" @-}
-
-module WBL where
-
-type Priority = Int
-
-type Rank     = Int
-
-type Nat      = Int
-
-data Heap a   = Empty | Node { pri   :: a
-                             , rnk   :: Rank
-                             , left  :: Heap a
-                             , right :: Heap a
-                             }
-
-{-@ data Heap a <q :: a -> a -> Prop> =
-      Empty | Node { pri   :: a
-                   , rnk   :: Nat
-                   , left  :: {v: Heap<q> (a<q pri>) | ValidRank v}
-                   , right :: {v: Heap<q> (a<q pri>) | ValidRank v}
-                   }
- @-}
-
-{-@ predicate ValidRank V = okRank V && realRank V = rank V  @-}
-{-@ type PHeap a = {v:OHeap a | ValidRank v}                 @-}
-{-@ type OHeap a = Heap <{\root v -> root <= v}> a           @-}
-
-{-@ measure okRank @-}
-okRank :: Heap a -> Bool
-okRank (Empty)        = True
-okRank (Node p k l r) = realRank l >= realRank r && k == 1 + realRank l + realRank r
-
-{-@ measure realRank @-}
-realRank :: Heap a -> Int
-realRank (Empty)        = 0
-realRank (Node p k l r) = 1 + realRank l + realRank r
-
-{-@ measure rank @-}
-{-@ rank :: h:PHeap a -> {v:Nat | v = realRank h} @-}
-rank Empty          = 0
-rank (Node _ r _ _) = r
-
-
--- Creates heap containing a single element with a given Priority
-{-@ singleton :: a -> PHeap a  @-}
-singleton p = Node p 1 Empty Empty
-
--- Note [Two-pass merging algorithm]
--- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
--- We use a two-pass implementation of merging algorithm. One pass,
--- implemented by merge, performs merging in a top-down manner. Second
--- one, implemented by makeT, ensures that rank invariant of weight
--- biased leftist tree is not violated after merging.
---
--- Notation:
---
---  h1, h2 - heaps being merged
---  p1, p2 - priority of root element in h1 and h2
---  l1     - left  subtree in the first  heap
---  r1     - right subtree in the first  heap
---  l2     - left  subtree in the second heap
---  r2     - right subtree in the second heap
---
--- Merge function analyzes four cases. Two of them are base cases:
---
---    a) h1 is empty - return h2
---
---    b) h2 is empty - return h1
---
--- The other two cases form the inductive definition of merge:
---
---    c) priority p1 is higher than p2 - p1 becomes new root, l1
---       becomes its one child and result of merging r1 with h2
---       becomes the other child:
---
---               p1
---              /  \
---             /    \
---            l1  r1+h2 -- here "+" denotes merging
---
---    d) priority p2 is higher than p2 - p2 becomes new root, l2
---       becomes its one child and result of merging r2 with h1
---       becomes the other child.
---
---               p2
---              /  \
---             /    \
---            l2  r2+h1
---
--- Note that there is no guarantee that rank of r1+h2 (or r2+h1) will
--- be smaller than rank of l1 (or l2). To ensure that merged heap
--- maintains the rank invariant we pass both childred - ie. either l1
--- and r1+h2 or l2 and r2+h1 - to makeT, which creates a new node by
--- inspecting sizes of children and swapping them if necessary.
-
--- makeT takes an element (Priority) and two heaps (trees). It
--- constructs a new heap with element at the root and two heaps as
--- children. makeT ensures that WBL heap rank invariant is maintained
--- in the newly created tree by reversing left and right subtrees when
--- necessary (note the inversed r and l in the False alternative of
--- case expression).
-{-@ makeT   :: p:a -> h1:PHeap {v:a | p <= v} -> h2:PHeap {v:a | p <= v}
-            -> {v:PHeap a | realRank v = 1 + realRank h1 + realRank h2} @-}
-makeT p l r = case rank l >= rank r of
-                True  ->  Node p (1 + rank l + rank r) l r
-                False ->  Node p (1 + rank l + rank r) r l
-
--- merge combines two heaps into one. There are two base cases and two
--- recursive cases - see [Two-pass Merging algorithm]. Recursive cases
--- call makeT to ensure that rank invariant is maintained after
--- merging.
-{-@ merge :: (Ord a) => h1:PHeap a -> h2:PHeap a -> {v:PHeap a | realRank v = realRank h1 + realRank h2}  @-}
-merge Empty h2 = h2
-merge h1 Empty = h1
-merge h1@(Node p1 k1 l1 r1) h2@(Node p2 k2 l2 r2) = case p1 < p2 of
-  True  -> makeT p1 l1 (merge r1 (Node p2 k2 l2 r2))
-  False -> makeT p2 l2 (merge (Node p1 k1 l1 r1) r2)
-
--- Inserting into a heap is performed by merging that heap with newly
--- created singleton heap.
-{-@ insert :: (Ord a) => a -> PHeap a -> PHeap a @-}
-insert p h = merge (singleton p) h
-
--- findMin returns element with highest priority, ie. root
--- element. Here we encounter first serious problem: we can't return
--- anything sensible for empty node.
-{-@ findMin :: PHeap a -> a @-}
-findMin Empty          = undefined
-findMin (Node p _ _ _) = p
-
--- and write a safer version of findMinM
-{-@ findMinM :: PHeap a -> Maybe a @-}
-findMinM Empty          = Nothing
-findMinM (Node p _ _ _) = Just p
-
--- deleteMin removes the element with the highest priority by merging
--- subtrees of a root element. Again the case of empty heap is
--- problematic. We could give it semantics by returning Empty, but
--- this just doesn't feel right. Why should we be able to remove
--- elements from an empty heap?
-{-@ deleteMin :: (Ord a) => PHeap a -> PHeap a @-}
-deleteMin Empty          = undefined -- should we insert empty?
-deleteMin (Node _ _ l r) = merge l r
-
--- As a quick sanity check let's construct some examples. Here's a
--- heap constructed by inserting following priorities into an empty
--- heap: 3, 0, 1, 2.
-{-@ heap :: PHeap Int @-}
-heap = insert (2 :: Int)
-      (insert 1
-      (insert 0
-      (insert 3 Empty)))
-
--- Example usage of findMin
-findMinInHeap :: Priority
-findMinInHeap = findMin heap
-
--- Example usage of deleteMin
-deleteMinFromHeap :: Heap Int
-deleteMinFromHeap = deleteMin heap
diff --git a/tests/todo/When.hs b/tests/todo/When.hs
deleted file mode 100644
--- a/tests/todo/When.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-module When (foo, fooOk) where
-
-{-@ assume div :: x:_ -> y:{_ | y /= 0} -> _ @-}
-
-{- when :: b:Bool -> {v:_ | ???} -> _ -}
-when b x = if b then x else return ()
-
-
-foo :: Int -> IO ()
-foo x = when (x > 0) $ print (1 `div` x)
-
-{-@ whenT :: b:_ -> ({v:_ | Prop b} -> _) -> _ @-}
-whenT :: Bool -> (() -> IO ()) -> IO ()
-whenT b k = if b then k () else return ()
-
-fooOk :: Int -> IO ()
-fooOk x = whenT (x > 0) $ \() -> print (1 `div` x)
diff --git a/tests/todo/absref-crash0.hs b/tests/todo/absref-crash0.hs
deleted file mode 100644
--- a/tests/todo/absref-crash0.hs
+++ /dev/null
@@ -1,34 +0,0 @@
-{-@ LIQUID "--short-names"    @-}
-module Foo where
-
-data List a = N | C a (List a)
-
-
-{-@ crashC :: forall a b <p :: List a -> b -> Prop>.
-               x:a -> xs: List a 
-               -> ys:b<p (C x xs)> 
-               -> b<p ys>                            @-}
-crashC :: a -> List a -> b -> b 
-crashC = undefined
-
-
-{-@ crashN :: forall a b <p :: List a -> b -> Prop>.
-               x:a -> xs: List a 
-               -> ys:b<p N> 
-               -> b<p ys>                            @-}
-crashN :: a -> List a -> b -> b 
-crashN = undefined
-
-
--- Currenlty the liternals are grapped only from the haskell code
--- and not from the types. 
--- Thus the above two specifications cash unless
--- N and C appear in the Haskell code, as below 
-
-{-
-cons :: a -> List a -> List a
-cons = C 
-
-nil :: List a 
-nil = N
--}
diff --git a/tests/todo/aliasConst.hs b/tests/todo/aliasConst.hs
deleted file mode 100644
--- a/tests/todo/aliasConst.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module Foo where
-
--- TODO: Expressions inside applications of type and predicate aliases.
-
-{-@ predicate Rng Lo V Hi = (Lo <= V && V < Hi) @-}
-
-{-@ bog :: {v:Int | (Rng 0 v 10)} @-}
-bog :: Int
-bog = 5
diff --git a/tests/todo/aliasError.hs b/tests/todo/aliasError.hs
deleted file mode 100644
--- a/tests/todo/aliasError.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Foo where
-
--- TODO: return a civilized error message about the line number with the
--- problematic predicate application, instead of just a groan about safeZip
--- failing.
-
-{-@ predicate Rng Lo V Hi = (Lo <= V && V < Hi) @-}
-{-@ type NNN a b  = {v:[(a, b)] | 0 <= 0} @-}
-
-{-@ bog :: {v:Int | (Rng 0 10 11)} @-}
-bog :: Int
-bog = 5
-
-{-@ foo :: NNN Int @-}
-foo :: [(Int, Char)]
-foo = [(1, 'c')]
diff --git a/tests/todo/appCheck.hs b/tests/todo/appCheck.hs
deleted file mode 100644
--- a/tests/todo/appCheck.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-module Foo where
-
-import Language.Haskell.Liquid.Prelude
-
-prop :: Bool
-prop = undefined
-
-{-@ app :: forall <p :: a -> Prop, q :: a -> Prop>. 
-   {x:a<q> -> a<p> -> {v:a | v <= x}}
-   {a<q> -> a<p>}
-   Num a => (a<p> -> b) -> a<q> -> b @-}
-app :: Num a => (a -> b) -> a -> b
-app f x = if prop then app f (x+1) else f x
-
-
-{-@ check :: Ord a => x:a ->  {v:a | x <= v} -> () @-}
-check :: Ord a => a ->  a -> ()
-check x y | x <= y = ()
-          | otherwise = liquidError ""
-
-main i = app (check i) i       
diff --git a/tests/todo/apply.hs b/tests/todo/apply.hs
deleted file mode 100644
--- a/tests/todo/apply.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-module StateMonad where
-
-data ST a = S (Int -> (a, Int))
-{-@ data ST a <p1 :: old:Int -> a -> Prop,
-               p2 :: old:Int -> Int -> Prop> 
-     = S (x::(state:Int -> (a<p1 state>, Int<p2 state>))) 
-  @-}
-
-
-{-@
-apply :: forall a <p1 :: old:Int -> a -> Prop, 
-                   p2 :: old:Int -> Int -> Prop>.
-          instate:(ST a) <p1, p2> -> x:Int -> (a<p1 x>, Int<p2 x>)
-  @-}
-apply :: ST a -> Int -> (a, Int)
-apply (S f) x = f x
-
diff --git a/tests/todo/baderror.hs b/tests/todo/baderror.hs
deleted file mode 100644
--- a/tests/todo/baderror.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module DataBase   where
-
-import qualified Data.Set
-
-{-@ (\\) :: Eq a => forall<p :: a -> Prop>. xs:[a<p>] -> ys:[a] -> {v:[a<p>] | (listElts v)  = (Set_dif (listElts xs) (listElts ys))} @-}
-(\\) :: Eq a => [a] -> [a] -> [a]
-[]     \\ _ = []
-(x:xs) \\ ys = if x `elem` ys then xs \\ ys else x:(xs \\ ys)
-
diff --git a/tests/todo/baffled.hs b/tests/todo/baffled.hs
deleted file mode 100644
--- a/tests/todo/baffled.hs
+++ /dev/null
@@ -1,140 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{- LIQUID "--diffcheck"     @-}
-
-module AVL where
-
-main :: IO ()
-main = return ()
-
--- Source: https://gist.github.com/gerard/109729
-
--- | PORTED from: http://docs.camlcity.org/docs/godipkg/4.00/godi-ocaml/lib/ocaml/std-lib/map.ml
-
-
-data AVL k v = Leaf
-             | Node { key :: k
-                    , val :: v
-                    , lt  :: AVL k v
-                    , rt  :: AVL k v
-                    , ht  :: Int }
-               deriving (Show, Eq)
-
-{-@ data AVL k v = Leaf
-                 | Node { key :: k
-                        , val :: v
-                        , lt  :: AVLL k v key
-                        , rt  :: AVLR k v key
-                        , ht  :: AVLH lt rt 
-                        }
-  @-}
-
-{-@ type AVLL k v Key    = AVL {k:k | k < Key} v             @-}
-{-@ type AVLR k v Key    = AVL {k:k | Key < k} v             @-}
-{-@ type AVLH L R        = {v:Nat   | Ht v L R && Bal L R 2} @-}
-{-@ type AVLN k v N      = {v:AVL k v | tht v = N}           @-}
-
-{-@ predicate LeMax1 V X Y = V <= if X >= Y then 1+X else 1+Y   @-}
-{-@ predicate EqMax1 V X Y = V = if X >= Y then 1+X else 1+Y   @-}
-{-@ predicate Diff X Y N = 0 <= X - Y + N && X - Y <= N      @-}
-{-@ predicate Bal L R N  = Diff (tht L) (tht R) N      @-}
-{-@ predicate Ht V L R   = EqMax1 V (tht L) (tht R)      @-}
-
-{-@ invariant {v:AVL k v | 0 <= ht v} @-}
-
-{-@ measure tht          :: AVL k v -> Int
-    tht (Leaf)           = 0
-    tht (Node k v l r z) = if (tht l >= tht r) then (1 + tht l) else (1 + tht r)
-  @-}
-
-{-@ height              :: t:_ -> {v:Nat | v = tht t} @-}
-height (Leaf)           = 0 :: Int
-height (Node k v l r z) = if (height l >= height r) then (1 + height l) else (1 + height r)
- 
-                        
-empty = Leaf
-
-{-@ ht :: t:AVL k v -> {v:Nat | v = tht t}  @-}
-
-{-@ create     :: key:k -> v -> l:AVLL k v key -> r:{AVLR k v key | Bal l r 2} -> {v:AVL k v | Ht (tht v) l r} @-}
-create k v l r = Node k v l r (nodeHeight l r) 
-
-{-@ nodeHeight :: l:_ -> r:_ -> {v:Nat | Ht v l r} @-}
-nodeHeight l r = h
-  where
-   h           = if hl >= hr then hl + 1 else hr + 1
-   hl          = height l
-   hr          = height r 
-
-{-@ singleton  :: k -> v -> AVLN k v 1 @-}
-singleton k v  = Node k v Leaf Leaf 1 
-
-{-@ fox :: k -> v -> thing:AVL k v -> {v: AVL k v | tht thing - 1 <= tht v && tht v <= tht thing + 1} @-}
-fox :: k -> v -> AVL k v -> AVL k v
-fox key val tree = error "z"
-
-
-{-@ predicate HtDiff S T D = (tht S) - (tht T) == D @-}
-
-{-@ add :: k -> v -> t:AVL k v -> {v: AVL k v | (tht t - 1 <= tht v || tht t - 2 = tht v) && tht v <= tht t + 1} @-}
-add k' v' t@(Node k v l r h)
-  -- RJ: This case is obviously fine
-  
-  | k' == k     = Node k' v' l r h  
-
-  -- RJ: Maddeningly, this case is fine too
-                  
---   | k' <  k     = let mickey = fox k' v' l
---                   in
---                      bal k v mickey r   
-  -- NV: This is fine
---   | k < k', height l >= height r = let mouse = fox k' v' r  in
---                                   bal k v l mouse 
-
-  -- RJ: HEREHEREHERE this is the problem (I GIVE UP)
-  -- here it might be the case that 'tht t - 2 = tht v'
-     | k < k', height l < height r = let mouse = fox k' v' r  in
-                                   bal k v l mouse 
-
-
-
-add k' v' Leaf  = singleton k' v'
-
-{-@ bal         :: key:k -> v -> l:AVLL k v key -> r:{AVLR k v key | Bal l r 3} -> {v:AVL k v  | tht l <= tht v && tht r <= tht v && (tht l >= tht r => tht v <= 1 + tht l) && (tht r >= tht l => tht v <= 1 + tht r) } @-}
-bal :: k -> v -> AVL k v -> AVL k v -> AVL k v
-bal k v l r 
-  | hl > hr + 2 = balL   k v l r
-  | hr > hl + 2 = balR   k v l r 
-  | otherwise   = create k v l r 
-  where
-    hl          = height l
-    hr          = height r
-
-
-{-@ balL :: k:_ -> v:_ -> l:AVLL k v k -> r:AVLN {v:_ | k < v} v {(tht l) - 3} -> {v:AVL k v | tht l <= tht v && tht v <= 1 + tht l} @-}    
-balL k v l@(Node lk lv ll lr _) r
-  | height ll >= height lr = let tmp = create k v lr r in lAssert (height tmp <= height l) $ create lk lv ll tmp
-  | otherwise              = case lr of
-                               Node lrk lrv lrl lrr _ -> create lrk lrv (create lk lv ll lrl) (create k v lrr r)
-                               Leaf                   -> die  "all done" 
-
--- balL k v (Node lk lv ll lr@(Node lrk lrv lrl lrr _) _) r
---   | height ll < height lr  = create lrk lrv (create lk lv ll lrl) (create k v lrr r)
-
-{-@ balR :: k:_ -> v:_ -> l:AVLL k v k -> r:AVLN {v:_ | k < v} v {(tht l) + 3} -> {v: AVL k v | tht r <= tht v && tht v <= 1 + tht r} @-}    
-balR k v l r@(Node rk rv rl rr _) 
-  | height rr >= height rl = create rk rv (create k v l rl) rr
-  | otherwise              = case rl of 
-                              Node rlk rlv rll rlr _ -> create rlk rlv (create k v l rll) (create rk rv rlr rr)
-                              Leaf                   -> die "all done"
-                              
--- balR k v l r@(Node rk rv rl@(Node rlk rlv rll rlr _) rr _)
---   | height rr < height rl  = create rlk rlv (create k v l rll) (create rk rv rlr rr) 
-
-{-@ die :: {v:String | false } -> a @-}
-die x = error x
-
-{-@ lAssert    :: {v:Bool | Prop v} -> a -> a @-}
-lAssert True x = x
-lAssert _    z = z
-
diff --git a/tests/todo/binsearch.hs b/tests/todo/binsearch.hs
deleted file mode 100644
--- a/tests/todo/binsearch.hs
+++ /dev/null
@@ -1,32 +0,0 @@
-module BinSearch where
-
-import Language.Haskell.Liquid.Prelude
-import Data.Vector
-
-foobar = div
-
-gobble n lo hi 
-  | hi < lo   = True 
-  | otherwise = let mid = (hi - lo) `div` 2 
-                in assert (mid >= 0)
-
-z = gobble n 0 n
-    where n = choose 0
-
-
---binarySearch :: (Ord a) => Vector a -> a -> Int -> Int -> Maybe Int
---binarySearch haystack needle lo hi
---  | hi < lo	        = Nothing
---  | pivot > needle	= binarySearch haystack needle lo (mid - 1)
---  | pivot < needle	= binarySearch haystack needle (mid + 1) hi
---  | otherwise	    = Just mid
---  where mid	    = lo + ((hi - lo) `div` 2)
---        pivot	= haystack ! mid
---
---runBinarySearch haystack needle 
---  = binarySearch haystack needle 0 (Data.Vector.length haystack)
---
---pos = runBinarySearch vec val
---  where vec = fromList [0..siz]
---        siz = choose 0
---        val = choose 1
diff --git a/tests/todo/boolparse.hs b/tests/todo/boolparse.hs
deleted file mode 100644
--- a/tests/todo/boolparse.hs
+++ /dev/null
@@ -1,19 +0,0 @@
-module Goo where
-
-
--- It would be nice to parse the below: 
-
-{-@ type BoolP P = {v:Bool | Prop v <=> P} @-}
-
--- The below works fine (obviously)
-{- type BoolP P = {v:Bool | true } @-}
-
--- We can then write things like:
-
-{-@ inline gt @-}
-gt :: Int -> Int -> Bool
-gt x y = x > y
-
-{-@ isNat :: x:Int -> BoolP {gt x 0} @-}
-isNat :: Int -> Bool
-isNat x = x > 0
diff --git a/tests/todo/cases.hs b/tests/todo/cases.hs
deleted file mode 100644
--- a/tests/todo/cases.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-module Zoo where
-
-import Language.Haskell.Liquid.Prelude
-
-data L a = C a (L a) | N | C2 a a (L a)
-
-bob (C x _) = x
-bob _       = liquidError "asdasd"
diff --git a/tests/todo/cont.hs b/tests/todo/cont.hs
deleted file mode 100644
--- a/tests/todo/cont.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-module Cont (funkyId, funkyIds) where
-
-------------------------------------------------------------------------------------------
-{-@ funkyId :: x:Int -> {v:Int | v = x} @-}
-funkyId :: Int -> Int
-funkyId n = cont (\_ -> n)
-
-
-{-@ cont :: forall <p :: Int -> Prop>. (() -> Int<p>) -> Int<p> @-}
-cont :: (() -> Int) -> Int
-cont f = f () 
-------------------------------------------------------------------------------------------
-
-{-@ funkyIds :: a -> n:Int -> {v:[a] | (len v) = n} @-}
-funkyIds :: a -> Int -> [a]
-funkyIds y n = conts y (\_ -> n)
-
-{-@ conts :: forall <p :: Int -> Prop>. a -> (() -> Int<p>) -> exists z:Int<p>. {v:[a] | z = (len v)} @-}
-{-@ conts :: forall <p :: Int -> Prop>. a -> (() -> Int<p>) -> {v:[a] | (p (len v))} @-}
-conts :: a -> (() -> Int) -> [a] 
-conts x f = clone (f ()) x 
-
-{-@ clone :: n:Int -> a -> {v:[a] | (len v) = n} @-}
-clone :: Int -> a -> [a]
-clone = undefined
diff --git a/tests/todo/contra.hs b/tests/todo/contra.hs
deleted file mode 100644
--- a/tests/todo/contra.hs
+++ /dev/null
@@ -1,68 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-
-module Foo () where
-
-import Language.Haskell.Liquid.Prelude (liquidAssert)
-import Data.IORef
-
-{-@ type Upto N = {v:Nat | v < N} @-} 
-
-{-@ job :: IO () @-}
-job = do
-  p <- newIORef (0 :: Int)
-  writeIORef p 10
-  v <- readIORef p
-  liquidAssert (v == 0) $ return ()
-  
-{-@ bob :: Nat -> IO () @-}
-bob n = do
-  t <- newIO (n+1) (\_ -> 0)
-  setIO t 0 100
-  r <- getIO t 0
-  liquidAssert (r == 0) $ return ()
-
- 
-data IOArr a = IOA { size :: Int
-                   , pntr :: IORef (Arr a)
-                   }
-
-data Arr a   = A { alen :: Int
-                 , aval :: Int -> a
-                 }
-
-
-
-{-@ data IOArr a <p :: Int -> a -> Prop>
-      = IOA { size :: Nat
-            , pntr :: IORef ({v:Arr<p> a | alen v = size})
-            }
-  @-}
-
-
-{-@ data Arr a <p :: Int -> a -> Prop>
-             = A { alen :: Nat 
-                 , aval :: i:Upto alen -> a<p i>
-                 }
-  @-}
-
-
-
-{-@ newIO :: forall <p :: Int -> a -> Prop>.
-               n:Nat -> (i:Upto n -> a<p i>) -> IO ({v: IOArr<p> a | size v = n})
-  @-}
-newIO :: Int -> (Int -> a) -> IO (IOArr a)
-newIO n f = undefined
-
-{-@ getIO :: forall <p :: Int -> a -> Prop>.
-              a:IOArr<p> a -> i:Upto (size a) -> IO (a<p i>)
-  @-}
-getIO :: IOArr a -> Int-> IO a
-getIO a@(IOA sz p) i = undefined
-
-{-@ setIO :: forall <p :: Int -> a -> Prop>.
-              a:IOArr<p> a -> i:Upto (size a) -> a<p i> -> IO ()
-  @-}
-setIO :: IOArr a -> Int -> a -> IO ()
-setIO a@(IOA sz p) i v = undefined
-
diff --git a/tests/todo/decr.hs b/tests/todo/decr.hs
deleted file mode 100644
--- a/tests/todo/decr.hs
+++ /dev/null
@@ -1,127 +0,0 @@
--- | The below gives a reasonable error message when
---   we REMOVE the liquid signature (with the termination metric)
---   but gives an incomprehensible "termination error" otherwise.
---   # Issue 1. Why?!
---
--- | The above error goes away if you give an explicit HS type
---   signature, which causes a different GHC core term to be analyzed.
---   I suppose this is because the refined-type is for the top-level
---   binder, not the inner-letrec. BUT THEN, we should produce
---   THE SAME ERROR as if there was NO refined-signature AND add to
---   the error message, "Please make sure you add a HS type signature too"
-
-module Blank  where
-
-{-@ spacePrefix :: _ -> s:_ -> _ / [len s] @-}
-
--- spacePrefix :: String -> String -> Bool
-spacePrefix str (c:cs)
-  | isSpace c   = spacePrefix str cs
-  | otherwise   = take (length str) (c:cs) == str
-spacePrefix _ _ = False
-
-isSpace :: Char -> Bool
-isSpace = undefined
-
-
-{- This is GHC core _without_ the signature:
-[ Blank.spacePrefix :: [GHC.Types.Char] -> [GHC.Types.Char] -> GHC.Types.Bool
- [LclIdX, Str=DmdType]
- Blank.spacePrefix =
-   let {
-     $dEq_a16t :: GHC.Classes.Eq [GHC.Types.Char]
-     [LclId, Str=DmdType]
-     $dEq_a16t =
-       GHC.Classes.$fEq[] @ GHC.Types.Char GHC.Classes.$fEqChar } in
-   letrec {
-     spacePrefix [Occ=LoopBreaker]
-       :: [GHC.Types.Char] -> [GHC.Types.Char] -> GHC.Types.Bool
-     [LclId, Str=DmdType]
-     spacePrefix =
-       \ (str :: [GHC.Types.Char]) (ds_d16X :: [GHC.Types.Char]) ->
-         case ds_d16X of lq_anf$_d172 {
-           [] ->
-             (\ _ [Occ=Dead, OS=OneShot] -> GHC.Types.False) GHC.Prim.void#;
-           : c cs ->
-             let {
-               lq_anf$_d173 :: GHC.Types.Bool
-               [LclId, Str=DmdType]
-               lq_anf$_d173 = Blank.isSpace c } in
-             case lq_anf$_d173 of lq_anf$_d174 {
-               GHC.Types.False ->
-                 (\ _ [Occ=Dead, OS=OneShot] ->
-                    let {
-                      lq_anf$_d175 :: GHC.Types.Int
-                      [LclId, Str=DmdType]
-                      lq_anf$_d175 =
-                        Data.Foldable.length
-                          @ [] Data.Foldable.$fFoldable[] @ GHC.Types.Char str } in
-                    let {
-                      lq_anf$_d176 :: [GHC.Types.Char]
-                      [LclId, Str=DmdType]
-                      lq_anf$_d176 = GHC.Types.: @ GHC.Types.Char c cs } in
-                    let {
-                      lq_anf$_d177 :: [GHC.Types.Char]
-                      [LclId, Str=DmdType]
-                      lq_anf$_d177 =
-                        GHC.List.take @ GHC.Types.Char lq_anf$_d175 lq_anf$_d176 } in
-                    GHC.Classes.== @ [GHC.Types.Char] $dEq_a16t lq_anf$_d177 str)
-                   GHC.Prim.void#;
-               GHC.Types.True -> spacePrefix str cs
-             }
-         }; } in
-   spacePrefix]
-
- -}
-
-{- This is GHC core _with_ the signature
-
-*************** Transform Rec Expr CoreBinds *****************
-[Blank.isSpace :: GHC.Types.Char -> GHC.Types.Bool
- [LclIdX, Str=DmdType]
- Blank.isSpace =
-   GHC.Err.undefined @ (GHC.Types.Char -> GHC.Types.Bool),
- $dEq_a16d :: GHC.Classes.Eq [GHC.Types.Char]
- [LclId, Str=DmdType]
- $dEq_a16d =
-   GHC.Classes.$fEq[] @ GHC.Types.Char GHC.Classes.$fEqChar,
- Blank.spacePrefix [Occ=LoopBreaker]
-   :: GHC.Base.String -> GHC.Base.String -> GHC.Types.Bool
- [LclIdX, Str=DmdType]
- Blank.spacePrefix =
-   \ (str :: GHC.Base.String) (ds_d16D :: [GHC.Types.Char]) ->
-     case ds_d16D of lq_anf$_d16I {
-       [] ->
-         (\ _ [Occ=Dead, OS=OneShot] -> GHC.Types.False) GHC.Prim.void#;
-       : c cs ->
-         let {
-           lq_anf$_d16J :: GHC.Types.Bool
-           [LclId, Str=DmdType]
-           lq_anf$_d16J = Blank.isSpace c } in
-         case lq_anf$_d16J of lq_anf$_d16K {
-           GHC.Types.False ->
-             (\ _ [Occ=Dead, OS=OneShot] ->
-                let {
-                  lq_anf$_d16L :: GHC.Types.Int
-                  [LclId, Str=DmdType]
-                  lq_anf$_d16L =
-                    Data.Foldable.length
-                      @ [] Data.Foldable.$fFoldable[] @ GHC.Types.Char str } in
-                let {
-                  lq_anf$_d16M :: [GHC.Types.Char]
-                  [LclId, Str=DmdType]
-                  lq_anf$_d16M = GHC.Types.: @ GHC.Types.Char c cs } in
-                let {
-                  lq_anf$_d16N :: [GHC.Types.Char]
-                  [LclId, Str=DmdType]
-                  lq_anf$_d16N =
-                    GHC.List.take @ GHC.Types.Char lq_anf$_d16L lq_anf$_d16M } in
-                GHC.Classes.== @ [GHC.Types.Char] $dEq_a16d lq_anf$_d16N str)
-               GHC.Prim.void#;
-           GHC.Types.True -> Blank.spacePrefix str cs
-         }
-     };]
-*************** Slicing Out Unchanged CoreBinds *****************
-
-
- -}
diff --git a/tests/todo/doubleError.hs b/tests/todo/doubleError.hs
deleted file mode 100644
--- a/tests/todo/doubleError.hs
+++ /dev/null
@@ -1,15 +0,0 @@
--- https://github.com/ucsd-progsys/liquidhaskell/issues/427
-
-module Blank where
-
-{-@ measure myprop @-} 
-myprop :: Double -> Bool
-myprop x = (fromIntegral (floor d) - d) == 0.0
-  where d = (x / 3.0)
-
-{-@ type Mytype = {v:Double | myprop v} @-}
-type Mytype = Double
-
-{-@ ok :: Mytype @-}
-ok :: Mytype
-ok = 6.0
diff --git a/tests/todo/dyn.hs b/tests/todo/dyn.hs
deleted file mode 100644
--- a/tests/todo/dyn.hs
+++ /dev/null
@@ -1,43 +0,0 @@
-module Dyn where
-
-import Data.Dynamic 
-import Data.Maybe
-
-b0    = put 0 ("cat" :: String) 
-      $ put 1 (12    :: Int) 
-      $ emp
-
-ok    = 10 `plus` (get 1 b0)
-
-bad   = 10 `plus` (get 0 b0)
-
--------------------------------------------------
-plus :: Int -> Int -> Int
-plus = (+)
-
-concat :: String -> String -> String
-concat = (++)
--------------------------------------------------
-
-type Field   = Int
-
-newtype DBox = DB [(Field, Dynamic)]
-
-emp :: DBox 
-emp = DB []
-
-put :: (Typeable a) => Field -> a -> DBox -> DBox 
-put k v (DB b) = DB ((k, toDyn v) : b)
-
-get :: (Typeable a) => Field -> DBox -> a 
-get k (DB kvs) = ofD $ fromMaybe err $ lookup k kvs 
-  where 
-    err        = error $ "NOT FOUND" ++ show k
-
-{-@ toD :: (Typeable a) => x:a -> {v:Dyn | (tag v) = (typeRep a)} @-}
-toD :: (Typeable a) => a -> Dynamic 
-toD = toDyn 
-
-{-@ ofD :: {v:Dyn | (tag v) = (typeRep a)} -> a @-}
-ofD :: (Typeable a) => Dynamic -> a
-ofD = fromMaybe (error "DYNAMIC ERROR") . fromDynamic 
diff --git a/tests/todo/empty-or.hs b/tests/todo/empty-or.hs
deleted file mode 100644
--- a/tests/todo/empty-or.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-module EmptyOr where
-
-import GHC.Base
-import GHC.ForeignPtr
-import GHC.Ptr
-
-{-@ updPtr :: forall <q :: Ptr a -> Prop>.
-              (z:Ptr a -> (Ptr a)<q>) -> x:ForeignPtr a
-           -> exists [p:(Ptr a)<q>].{v:ForeignPtr a | (fpLen v) = (pLen p)}
-  @-}
-updPtr :: (Ptr a -> Ptr a) -> ForeignPtr a -> ForeignPtr a
-updPtr f (ForeignPtr p c) = case f (Ptr p) of { Ptr q -> ForeignPtr q c }
-{-# INLINE updPtr #-}
-
-{-@ measure addrLen :: Addr# -> Int @-}
-{-@ measure pLen :: Ptr a -> Int
-    pLen (Ptr a) = (addrLen a)
-  @-}
-{-@ measure fpLen :: ForeignPtr a -> Int
-    fpLen (ForeignPtr a c) = (addrLen a)
-  @-}
diff --git a/tests/todo/err0.hs b/tests/todo/err0.hs
deleted file mode 100644
--- a/tests/todo/err0.hs
+++ /dev/null
@@ -1,17 +0,0 @@
--- | Error Message Test: parse error in spec
-
-module Err0 where
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ qualif Zog(v:FooBar, x:FooBar): v = x + @-}
-
-data FooBar = Foo Int
-
-
-x = choose 0
-
-prop_abs ::  Bool
-prop_abs = if x > 0 then baz x else False
-
-baz gooberding = liquidAssertB (gooberding >= 0)
diff --git a/tests/todo/err1.hs b/tests/todo/err1.hs
deleted file mode 100644
--- a/tests/todo/err1.hs
+++ /dev/null
@@ -1,26 +0,0 @@
--- | Error Message Test: ghc error
-
-module Err1 where
-
-import Language.Haskell.Liquid.Prelude
-
-toss :: Boo 
-toss = (choose 0) > 10
-
-prop_abs :: Bool
-prop_abs = if toss 
-             then (if toss then liquidAssertB toss else False) 
-             else False
-
-
-foo :: Int -> Int
-foo x = (liquidAssert (x > 0) x) + 1
-
-goo = foo 12
-
-incr :: Int -> Int
-incr zzz = zzz + 1
-
-zoo = incr 29
-
-
diff --git a/tests/todo/err10.hs b/tests/todo/err10.hs
deleted file mode 100644
--- a/tests/todo/err10.hs
+++ /dev/null
@@ -1,11 +0,0 @@
-{--! run liquid with no-termination -}
-
-module Intro where
-
-import Language.Haskell.Liquid.Prelude  (liquidAssert)
-
--- doesn't work with WEB demo (just says "ERROR" with no message...
---
-{-@ Prelude.head :: {v:[a] | false} -> a @-}
-
-bob z = head z
diff --git a/tests/todo/err11.hs b/tests/todo/err11.hs
deleted file mode 100644
--- a/tests/todo/err11.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module ParsingErrorWoes where
-  
-{-@ measure vsize :: a -> Int                                   @-}
-{-@ type AOkIdx X          = {v:Nat | (OkRng v X (-1))}         @-}
-{-@ predicate InRng V L U  = (L <= V && V <= U)                 @-}
-{-@ predicate OkRng V X N  = (InRng V 0 ((vsize X) - (N + 1)))  @-}
-
-foo :: Int
-foo = 0
diff --git a/tests/todo/err12.hs b/tests/todo/err12.hs
deleted file mode 100644
--- a/tests/todo/err12.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-module BareCrash where
-
-{-@ measure isReal :: Space -> Prop
-    isReal (Null)       = false
-    isReal (Rreal pv n) = true
- @-}
-
-
-data Space = Null | Real Int Int 
-  deriving (Show, Eq)
diff --git a/tests/todo/err13.hs b/tests/todo/err13.hs
deleted file mode 100644
--- a/tests/todo/err13.hs
+++ /dev/null
@@ -1,3 +0,0 @@
-{-@ plus :: x:a -> y:a -> {v:a | v = x} @-}
-plus :: a -> a -> a
-plus = undefined
diff --git a/tests/todo/err2.hs b/tests/todo/err2.hs
deleted file mode 100644
--- a/tests/todo/err2.hs
+++ /dev/null
@@ -1,26 +0,0 @@
--- | Error Message Test: liquid-ghc type divergence 
-
-module Err1 where
-
-import Language.Haskell.Liquid.Prelude
-
-{-@ toss :: Int @-}
-toss     = (choose 0) > 10
-
-prop_abs :: Bool
-prop_abs = if toss 
-             then (if toss then liquidAssertB toss else False) 
-             else False
-
-
-foo :: Int -> Int
-foo x = (liquidAssert (x > 0) x) + 1
-
-goo = foo 12
-
-incr :: Int -> Int
-incr zzz = zzz + 1
-
-zoo = incr 29
-
-
diff --git a/tests/todo/err3.hs b/tests/todo/err3.hs
deleted file mode 100644
--- a/tests/todo/err3.hs
+++ /dev/null
@@ -1,26 +0,0 @@
--- | Error Message Test: ghc parse error
-
-module Err1 where
-
-import Language.Haskell.Liquid.Prelude
-
-toss :: Boo 
-toss = (choose 0) > 10
-
-prop_abs :: Bool
-prop_abs = if toss 
-             then (if toss then liquidAssertB toss else False) 
-             els False
-
-
-foo :: Int -> Int
-foo x = (liquidAssert (x > 0) x) + 1
-
-goo = foo 12
-
-incr :: Int -> Int
-incr zzz = zzz + 1
-
-zoo = incr 29
-
-
diff --git a/tests/todo/err4.hs b/tests/todo/err4.hs
deleted file mode 100644
--- a/tests/todo/err4.hs
+++ /dev/null
@@ -1,9 +0,0 @@
--- | Error Message Test: liquid type error
-
-module Err0 where
-
-{-@ zonk :: {v:Int | v = 0} @-}
-zonk     = (12 :: Int)
-
-{-@ tonk :: {v:Int | v = 0} @-}
-tonk     = (45 :: Int)
diff --git a/tests/todo/err5.hs b/tests/todo/err5.hs
deleted file mode 100644
--- a/tests/todo/err5.hs
+++ /dev/null
@@ -1,11 +0,0 @@
-module Test0 where
-
-import Language.Haskell.Liquid.Prelude
-
-x = choose 0
-
-prop_abs = if x > 0 then baz x else False
-
-gob z = liquidAssertB (z `geq` 10)
-
-baz z = liquidAssertB (z `geq` 100)
diff --git a/tests/todo/err6.hs b/tests/todo/err6.hs
deleted file mode 100644
--- a/tests/todo/err6.hs
+++ /dev/null
@@ -1,8 +0,0 @@
--- | Error Message Test: liquid type error
-
-module Err0 where
-
-{-@ zonk :: {v:Int | v = z} @-}
-zonk     = (12 :: Int)
-
-
diff --git a/tests/todo/err7.hs b/tests/todo/err7.hs
deleted file mode 100644
--- a/tests/todo/err7.hs
+++ /dev/null
@@ -1,7 +0,0 @@
--- | Error Message Test: liquid type error
-
-module Err0 where
-
-{-@ tonk :: {v:Int | (Prop v) = v } @-}
-tonk     = (12 :: Int)
-
diff --git a/tests/todo/err8.hs b/tests/todo/err8.hs
deleted file mode 100644
--- a/tests/todo/err8.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module Blank where
-
--- instead of "ERROR ERROR ERROR" fail GRACEFULLY when spec has unknown var
-
-{-@ zoo :: Nat @-}
-
-{-@ x :: Poo @-}
-x :: Int
-x = 12
diff --git a/tests/todo/err9.hs b/tests/todo/err9.hs
deleted file mode 100644
--- a/tests/todo/err9.hs
+++ /dev/null
@@ -1,11 +0,0 @@
-module Blank where
-
-
-{-@ type ListN a N = {v:[a] | (len v) = N} @-}
-
--- TODO: extend parser to allow expressions, at the very least, 
---       literals as arguments! Currently, the below is rejected by the parser.
-
-{-@ xs :: (ListN Int 2) @-}
-xs :: [Int]
-xs = [1,2] 
diff --git a/tests/todo/existsAbs.hs b/tests/todo/existsAbs.hs
deleted file mode 100644
--- a/tests/todo/existsAbs.hs
+++ /dev/null
@@ -1,81 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-
-
-
-module Exists where
-
-import Prelude hiding (exists)
-
-
-
-{-
-exists :: forall <p :: Bool -> Prop, q :: a -> Bool -> Prop, r :: a -> Prop>.
-          (x:a -> Bool<q x>) -> [a<r>] -> Bool<p>
-
-1. The result is True
-    forall x::a, v :: Bool . r x => q x True  |- v = True => p v 
-2. The result is False
-    forall x::a, v :: Bool . r x /\ q x True => false  |- v = False => p v 
-
-Eg:
-1. If all the elements of the list satisfy q x True, then the result is true
-exists isPos ([1, 2]  :: [Pos])        :: {v = True}
-2. If all the elements of the list contradict q x True, then the result is false
-exists isPos ([0, -1] :: [NonPos]) :: {v = False}
-3. Otherwise, I have no info
-exists isPos ([1, 0]  :: [Nat])        :: {true}
-
--}
-
-
-
-
-
-
-{-@ exists :: forall <p :: Bool -> Prop, q :: a -> Bool -> Prop, r :: a -> Prop>.
-                  {x::a, flag:: {v:Bool<q x> | Prop v}, y::a<r>, bb::{v:Bool | x = y} |- {v:Bool | Prop v <=> Prop flag } <: Bool<p>}
-                  {x::a, flag:: {v:Bool<q x> | Prop v}, y::a<r>, bb::{v:Bool | x != y} |- {v:Bool | not (Prop v) <=> Prop flag } <: Bool<p>}
-                  (x:a -> Bool<q x>) -> [a<r>] -> Bool<p>
-  @-}
-
-
-exists :: (a -> Bool) -> [a] -> Bool
-exists f (x:xs)
-  | f x       = True
-  | otherwise = exists f xs 
-exists _ []   = False
-	
-{-@ isPos :: x:Int -> {v:Bool | Prop v <=> x > 0} @-}
-isPos :: Int -> Bool
-isPos n = n > 0
-
-
-{-@ isNeg :: x:Int -> {v:Bool | Prop v <=> x < 0} @-}
-isNeg :: Int -> Bool
-isNeg n = n < 0
-
-prop0 :: Bool
-{- prop0 :: {v:Bool | Prop v} @-}
-prop0 = exists isPos [0, 1]
-prop1 :: Bool
-{- prop1 :: {v:Bool | not (Prop v)} @-}
-prop1 = exists isPos [0, -1]
-
-{-
--- | `positives` works by instantiating:
--- p := \v   -> 0 < v
--- q := \x v -> Prop v <=> 0 < x  (NV ??)
-
-
-{- positives :: [Int] -> [{v:Int | v > 0}] @-}
-positives xs = filter isPos xs
-
-
--- | `negatives` works by instantiating:
--- p := \v   -> 0 > v
--- q := \x v -> Prop v <=> x < 0
-
-{- negatives :: [Int] -> [{v:Int | v < 0}] @-}
-negatives xs = filter isNeg xs
--}
diff --git a/tests/todo/false.hs b/tests/todo/false.hs
deleted file mode 100644
--- a/tests/todo/false.hs
+++ /dev/null
@@ -1,12 +0,0 @@
-module Foo where
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--native" @-}
-
-{-@ foo :: {v:a | false} @-}
-foo  = foo
-
-
-nat :: Int
-{-@ nat :: Nat @-}
-nat = 42
diff --git a/tests/todo/fft.hs b/tests/todo/fft.hs
deleted file mode 100644
--- a/tests/todo/fft.hs
+++ /dev/null
@@ -1,84 +0,0 @@
-{-# LANGUAGE BangPatterns #-}
-
-module FFT where
-
-import Prelude hiding ((++))
-import qualified Data.ByteString.Lazy.Char8      as BS
-import qualified Data.ByteString.Lex.Lazy.Double as BS
-import qualified Data.Vector as V
-import Data.Vector ((!),(++),Vector)
-import Data.List hiding ((++))
-import Data.Complex
-import System.Environment
-
-headerSize bs = (+) 4 (BS.length . BS.concat . Prelude.take 4 . BS.lines $ bs)  
- 
-dropHeader bs = BS.drop (headerSize bs) $ bs
-
-main = do
-   [f] <- getArgs
-   s   <- BS.readFile f
-   print . V.map (round. realPart) . ifft_CT. fft_CT . parse $ (dropHeader s)
-
-dft :: Vector (Double) -> Vector (Complex Double)
-dft xr = V.map (\k -> V.sum (V.imap (arg k) xr)) (numvec n)
- where
-   n = V.length xr
-   nf = fromIntegral n
-   numvec n = V.enumFromStepN 0 1 n
-   arg k i x = (x:+0) * exp (-2 * pi * kf * ifl * (0:+1)/nf)
-             where
-               kf = fromIntegral k
-               ifl = fromIntegral i
-     
-idft :: Vector (Complex Double) -> Vector (Complex Double)
-idft xs = V.map (\k ->(/) (V.sum (V.imap (arg k) xs)) nf) (numvec n)
- where
-   n = V.length xs
-   nf = fromIntegral n
-   numvec n = V.enumFromStepN 0 1 n
-   arg k i x = x * exp (2 * pi * kf * ifl * (0:+1)/nf)
-             where
-               kf = fromIntegral k
-               ifl = fromIntegral i
-
-fft_CT xs = if V.length xs == 1 then
-             dft xs
-           else
-             let xtop = V.zipWith3 fft_top (fft_CT xse) (fft_CT xso) (V.enumFromStepN 0 1 m)
-             
-                 xbottom = V.zipWith3 fft_bottom (fft_CT xse) (fft_CT xso) (V.enumFromStepN 0 1 m)
-                 xse = V.map (xs !) (V.enumFromStepN 0 2 m)
-                 xso = V.map (xs !) (V.enumFromStepN 1 2 m)
-                 n = V.length xs
-                 nf = fromIntegral n
-                 m = n `div` 2
-                 fft_top xe xo k = xe + xo * exp (-2 * (0:+1) * pi * k / nf)
-                 fft_bottom xe xo k = xe - xo * exp (-2 * (0:+1) * pi * k / nf)
-             in              
-                 xtop ++ xbottom
-
-ifft_CT xs = if V.length xs == 1 then
-              idft xs
-           else
-              let xtop = V.zipWith3 fft_top (ifft_CT xse) (ifft_CT xso) (V.enumFromStepN 0 1 m)
-                  xtop_scaled = V.map (/2) xtop
-                  xbottom = V.zipWith3 fft_bottom (ifft_CT xse) (ifft_CT xso) (V.enumFromStepN 0 1 m)
-                  xbottom_scaled = V.map (/2) xbottom
-                  xse = V.map (xs !) (V.enumFromStepN 0 2 m)
-                  xso = V.map (xs !) (V.enumFromStepN 1 2 m)
-                  n = V.length xs
-                  nf = fromIntegral n
-                  m = n `div` 2
-                  fft_top xe xo k = xe + xo * exp (2 * (0:+1) * pi * k / nf)
-                  fft_bottom xe xo k = xe - xo * exp (2 * (0:+1) * pi * k / nf)
-             in              
-                xtop_scaled ++ xbottom_scaled
-
-
--- Fill a new vector from a file containing a list of numbers.
-parse = V.unfoldr step
- where
-   step !s = case BS.readDouble s of
-     Nothing       -> Nothing
-     Just (!k, !t) -> Just (k, BS.tail t)
diff --git a/tests/todo/fio.hs b/tests/todo/fio.hs
deleted file mode 100644
--- a/tests/todo/fio.hs
+++ /dev/null
@@ -1,104 +0,0 @@
-module RIO where
-
-import Prelude hiding (read)
-
-{-@ data FIO a <pre :: World -> Prop, post :: World -> a -> World -> Prop> 
-  = FIO (rs :: (x:World<pre> -> (a, World)<\w -> {v:World<post x w> | true}>))
-  @-}
-data FIO a  = FIO {runState :: World -> (a, World)}
-
-{-@ runState :: forall <pre :: World -> Prop, post :: World -> a -> World -> Prop>. 
-                FIO <pre, post> a -> x:World<pre> -> (a, World)<\w -> {v:World<post x w> | true}> @-}
-
-data World  = W
-
-
--- | forall m k v k'. sel (upd m k v) k' = if (k == k') then v else sel m k'
-
-{-@ measure sel :: World -> FilePath -> Int          @-}
-{-@ measure upd :: World -> FilePath -> Int -> World @-}
-
-
-{-@ open :: fp:FilePath -> FIO <{\w0 -> true}, {\w0 r w1 -> w1 = w0  && sel w0 fp = 1}> () @-}
-open :: FilePath -> FIO () 
-open = undefined
-
-{-@ read :: fp:FilePath -> FIO <{\w0 -> sel w0 fp = 1}, {\w0 r w1 -> w1 = w0}> String @-}
-read :: FilePath -> FIO String
-read = undefined
-
---------------------------
-
-
-{-@
-bind :: forall < pre   :: World -> Prop 
-               , pre2  :: World -> Prop 
-               , p     :: a -> Prop
-               , post1 :: World -> a -> World -> Prop
-               , post2 :: World -> b -> World -> Prop
-               , post :: World -> b -> World -> Prop>.
-       {w:World<pre> -> x:a -> World<post1 w x> -> World<pre2>}        
-       {w:World<pre> -> y:a -> w2:World<post1 w y> -> x:b -> World<post2 w2 x> -> World<post w x>}        
-       FIO <pre, post1> a
-    -> (a -> FIO <pre2, post2> b)
-    -> FIO <pre, post> b 
-
-  @-}
-bind :: FIO a -> (a -> FIO b) -> FIO b
-bind (FIO g) f = FIO (\x -> case g x of {(y, s) -> (runState (f y)) s})    
-
-
--- is the precondition true or p?
-{-@ ret :: forall <p :: World -> Prop>.
-           x:a -> FIO <p, {\w0 y w1 -> w0 == w1 && y == x }> a @-}
-ret :: a -> FIO a
-ret w      = FIO $ \x -> (w, x)
-
-
-ok1 f = open f
-
-{-@ fail1 :: FilePath -> FIO String @-}
-fail1 :: FilePath -> FIO String
-fail1 f   = read f
-
-
-ok2 f = open f `bind` \_ -> read f
-
-instance Monad FIO where
-
-{-@ instance Monad FIO where
- >>= :: forall < pre   :: World -> Prop 
-               , pre2  :: World -> Prop 
-               , p     :: a -> Prop
-               , post1 :: World -> a -> World -> Prop
-               , post2 :: World -> b -> World -> Prop
-               , post :: World -> b -> World -> Prop>.
-       {w:World<pre> -> x:a -> World<post1 w x> -> World<pre2>}        
-       {w:World<pre> -> y:a -> w2:World<post1 w y> -> x:b -> World<post2 w2 x> -> World<post w x>}        
-       FIO <pre, post1> a
-    -> (a -> FIO <pre2, post2> b)
-    -> FIO <pre, post> b ;
- >>  :: forall < pre   :: World -> Prop 
-               , pre2  :: World -> Prop 
-               , p     :: a -> Prop
-               , post1 :: World -> a -> World -> Prop
-               , post2 :: World -> b -> World -> Prop
-               , post :: World -> b -> World -> Prop>.
-       {w:World<pre> -> x:a -> World<post1 w x> -> World<pre2>}        
-       {w:World<pre> -> y:a -> w2:World<post1 w y> -> x:b -> World<post2 w2 x> -> World<post w x>}        
-       FIO <pre, post1> a
-    -> FIO <pre2, post2> b
-    -> FIO <pre, post> b ;
- return :: forall <p :: World -> Prop>.
-           x:a -> FIO <p, {\w0 y w1 -> w0 == w1 && y == x }> a
-  @-}  
-  (FIO g) >>= f = FIO $ \x -> case g x of {(y, s) -> (runState (f y)) s} 
-  (FIO g) >>  f = FIO $ \x -> case g x of {(y, s) -> (runState f    ) s}    
-  return w      = FIO $ \x -> (w, x)
-  fail          = error
-
-
-{-@ ok3   :: FilePath -> FIO String @-}
-ok3 f = do open f
-           read f
-
diff --git a/tests/todo/fixme.hs b/tests/todo/fixme.hs
deleted file mode 100644
--- a/tests/todo/fixme.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-{-@ LIQUID "--exactdc" @-}
-
-import A 
-
-{-@ lazy bar @-}
-{-@ bar :: Foo a b -> {v:Foo a b | isFoo v} @-}
-bar :: Foo a b -> Foo a b
-bar x | isFoo x 
-  = x 
-bar x = bar x 
diff --git a/tests/todo/fixme.lhs b/tests/todo/fixme.lhs
deleted file mode 100644
--- a/tests/todo/fixme.lhs
+++ /dev/null
@@ -1,18 +0,0 @@
-
-\begin{code}
-
-import Prelude hiding (length)
-data List a = Emp | (:+:) a (List a)
-
-{-@ measure length @-}
-{-@ length :: List a -> Int  @-}
-length :: List a -> Int 
-length Emp = 0 
-length (xs :+: xss) = 1 + length xss
-
-{-@ measure nestedSize @-}
-{-@ nestedSize :: List (List a) -> Nat @-}
-nestedSize :: List (List a) -> Int
-nestedSize Emp = 0
-nestedSize (xs :+: xss) = length xs + nestedSize xss
-\end{code}
diff --git a/tests/todo/funrec.hs b/tests/todo/funrec.hs
deleted file mode 100644
--- a/tests/todo/funrec.hs
+++ /dev/null
@@ -1,5 +0,0 @@
-module Foo () where
-
-data F a = F { f :: Int -> a }
-
-{-@ data F a = F { f :: Nat -> a } @-}
diff --git a/tests/todo/gadtEval.hs b/tests/todo/gadtEval.hs
deleted file mode 100644
--- a/tests/todo/gadtEval.hs
+++ /dev/null
@@ -1,91 +0,0 @@
-
-module Eval () where 
-
-import Language.Haskell.Liquid.Prelude (liquidError)
-
--- "Classic" GADT 
--- 
--- data Expr a where
---   I :: Int -> Expr Int
---   B :: Bool -> Expr Bool
---   Eq :: Expr a -> Expr a -> Expr Bool
---   Pl :: Expr Int -> Expr Int -> Expr Int
--- 
--- eval :: Expr a -> a
--- eval (I i)      = i
--- eval (B b)      = b
--- eval (Eq e1 e2) = (eval e1) == (eval e2)
--- eval (Pl e1 e2) = (eval e1) + (eval e2)
-
-data Ty   = TInt 
-          | TBool
-
-data Expr = I     Int
-          | B     Bool
-          | Equal Expr Expr
-          | Plus  Expr Expr
-          deriving (Eq, Show)
-
-
-{-@ check          :: e:ValidExpr  -> {v:Ty | (v = (eType e))} @-}
-check (I _)        = TInt
-check (B _)        = TBool
-check (Plus e1 e2) = TInt
-check (Equal _ _)  = TBool
-
-{-@ Strict eval @-}
-
-{-@ eval           :: e:ValidExpr  -> {v:ValidExpr | ((isValue v) && (((eType e) = (eType v))))} @-}
-eval e@(I _)       = e
-eval e@(B _)       = e
-eval (Plus e1 e2)  = (eval e1) `plus` (eval e2)
-eval (Equal e1 e2) = (eval e1) `equal` (eval e2)
-
-plus (I i) (I j)   = I (i + j)
-plus _       _     = liquidError "don't worry, its impossible" 
-
-equal (I i) (I j)  = B (i == j)
-equal (B x) (B y)  = B (x == y)
-equal _       _    = liquidError "don't worry, its impossible" 
-
--- | The next two are silly, for scraping quals. Yuck. Should scrape from measure-DEFS etc.
-
-{-@ toInt :: IntExpr -> Int @-}
-toInt (I i) = i
-toInt _     = liquidError "impossible"
-
-{-@ toBool :: BoolExpr -> Bool @-}
-toBool (B b) = b
-toBool _     = liquidError "impossible"
-
-
-{-@ predicate TInt X   = ((eType X) = TInt)  @-}
-{-@ predicate TBool X  = ((eType X) = TBool) @-}
-
-
-{-@ type ValidExpr     = {v: Expr | (isValid v)}                @-}
-{-@ type IntExpr       = {v: Expr | ((isValue v) && (TInt  v))} @-}
-{-@ type BoolExpr      = {v: Expr | ((isValue v) && (TBool v))} @-}
-
-
-{-@ measure isValue       :: Expr -> Prop
-    isValue (I i)         = true
-    isValue (B b)         = true
-    isValue (Equal e1 e2) = false 
-    isValue (Plus e1 e2)  = false
-  @-}  
-
-{-@ measure eType       :: Expr -> Ty 
-    eType (I i)         = TInt  
-    eType (Plus  e1 e2) = TInt 
-    eType (B b)         = TBool 
-    eType (Equal e1 e2) = TBool 
-  @-}
-
-{-@ measure isValid       :: Expr -> Prop
-    isValid (I i)         = true
-    isValid (B b)         = true
-    isValid (Equal e1 e2) = (((eType e1) = (eType e2)) && (isValid e1) && (isValid e2))
-    isValid (Plus e1 e2)  = ((TInt e1) && (TInt e2) && (isValid e1) && (isValid e2))
-  @-}
-
diff --git a/tests/todo/if.hs b/tests/todo/if.hs
deleted file mode 100644
--- a/tests/todo/if.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-module If where
-
--- what's a reasonable type to give to `if_` so that we can verify `bog` ? 
-
-{-@ type TT = {v: Bool |     (Prop v)} @-}
-{-@ type FF = {v: Bool | not (Prop v)} @-}
-
-
-{-@ if_  :: b:Bool -> x:a -> y:a -> a @-}
-if_ :: Bool -> a -> a -> a
-if_ True  x _ = x
-if_ False _ y = y
-
-
-{-@ bog :: Nat @-}
-bog :: Int
-bog =
-  let b  = (0 < 1)      -- :: TT
-      xs = [1 ,  2,  3] -- :: [Nat]
-      ys = [-1, -2, -3] -- :: [Int]
-      zs = if_ b xs ys  -- :: [Nat] 
-  in 
-      case xs of
-        h:_ -> h 
-        _   -> 0
-
-
diff --git a/tests/todo/inccheck0.hs b/tests/todo/inccheck0.hs
deleted file mode 100644
--- a/tests/todo/inccheck0.hs
+++ /dev/null
@@ -1,40 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-
-module Test0 () where
-
-{-@ decr :: x:Int -> {v:Int | v < x} @-}
-decr :: Int -> Int
-decr xo = xo - 100
-
-{-@ plus :: x:Int -> y:Int -> {v:Int | v = x + y} @-}
-plus :: Int -> Int -> Int
-plus x yo = x + yo
-
-{-@ goo :: Int -> Nat @-}
-goo :: Int -> Int
-goo x = x +  1
-
-{-@ incr :: x:Int -> {v:Int | v > x} @-}
-incr :: Int -> Int
-incr xoo = xoo  `plus` zaa
-  where
-     zaa = a00 - b00
-     a00 = 300
-     b00 = 2
-
-{-@ jog :: x:Int -> {v:Int | v = x} @-}
-jog  :: Int -> Int
-jog x = x `plus` z
-  where 
-    z = a - b
-    a = 2
-    b = 2
-
-{-@ ping, pong :: n:Int -> {v:Int | v > n} @-}
-ping, pong :: Int -> Int
-ping 0 = 1
-ping n = 1 `plus` pong (n-1)
-
-pong 0 = 1 
-pong n = 1 `plus` ping (n-1)
diff --git a/tests/todo/intP.hs b/tests/todo/intP.hs
deleted file mode 100644
--- a/tests/todo/intP.hs
+++ /dev/null
@@ -1,6 +0,0 @@
-module Qoo where
-
-{-@ intid :: forall <r :: y0: Int -> Bool>. i: Int<r> -> Int<r> @-}
-intid :: Int -> Int
-intid i = i
-
diff --git a/tests/todo/kmpMonad.hs b/tests/todo/kmpMonad.hs
deleted file mode 100644
--- a/tests/todo/kmpMonad.hs
+++ /dev/null
@@ -1,180 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--short-names"    @-}
-{- LIQUID "--diff"           @-}
-
-module KMP (search) where
-
-import Language.Haskell.Liquid.Prelude (liquidError, liquidAssert)
-import Data.IORef
-import Control.Applicative ((<$>))
-import qualified Data.Map as M
-import Prelude hiding (map)
-
-{-@ type Upto N = {v:Nat | v < N} @-}
-
----------------------------------------------------------------------------
-{-@ search :: pat:String -> str:String -> IO (Maybe (Upto (len str))) @-}
----------------------------------------------------------------------------
-search :: String -> String -> IO (Maybe Int)
-search pat str = do
-  p <- ofListIO pat
-  s <- ofListIO str
-  kmpSearch p s
-
----------------------------------------------------------------------------
--- | Do the Search --------------------------------------------------------
----------------------------------------------------------------------------
-
-kmpSearch p@(IOA m _) s@(IOA n _) = do
-  t <- kmpTable p
-  find p s t 0 0
-
-find p@(IOA m _) s@(IOA n _) t = go
-  where
-    go i j
-      | i >= n    = return $ Nothing
-      | j >= m    = return $ Just (i - m)
-      | otherwise = do si <- getIO s i
-                       pj <- getIO p j
-                       tj <- getIO t j
-                       case () of
-                        _ | si == pj  -> go (i+1) (j+1)
-                          | j == 0    -> go (i+1) j
-                          | otherwise -> go i     tj
-
----------------------------------------------------------------------------
--- | Make Table -----------------------------------------------------------
----------------------------------------------------------------------------
-
--- BUG WHAT's going on?
-{-@ bob :: Nat -> IO () @-}
-bob n = do
-  t <- newIO (n + 1) (\_ -> 0)
-  setIO t 0 100
-  r <- getIO t 0
-  liquidAssert (r == 0) $ return ()
-
-
-kmpTable p@(IOA m _) = do
-  t <- newIO m (\_ -> 0)
-  fill p t 1 0
-  return t
-
-fill p t@(IOA m _) = go
-  where
-    go i j
-      | i < m - 1  = do
-          pi <- getIO p (id i)
-          pj <- getIO p j
-          case () of
-            _ | pi == pj -> do
-                  let i' = i + 1
-                  let j' = j + 1
-                  setIO t i' j'
-                  go i' j'
-              | j == 0 -> do
-                  let i' = i + 1
-                  setIO t i' 0
-                  go i' j
-              | otherwise -> do
-                  j' <- getIO t j
-                  go i j'
-      | otherwise = return t
-
-
--------------------------------------------------------------------------------
--- | An Imperative Array ------------------------------------------------------
--------------------------------------------------------------------------------
-
-data IOArr a = IOA { size :: Int
-                   , pntr :: IORef (Arr a)
-                   }
-
-{-@ data IOArr a <p :: Int -> a -> Prop>
-      = IOA { size :: Nat
-            , pntr :: IORef ({v:Arr<p> a | alen v = size})
-            }
-  @-}
-
-
-{-@ newIO :: forall <p :: Int -> a -> Prop>.
-               n:Nat -> (i:Upto n -> a<p i>) -> IO ({v: IOArr<p> a | size v = n})
-  @-}
-newIO n f = IOA n <$> newIORef (new n f)
-
-{-@ getIO :: forall <p :: Int -> a -> Prop>.
-              a:IOArr<p> a -> i:Upto (size a) -> IO (a<p i>)
-  @-}
-getIO a@(IOA sz p) i
-  = do arr   <- readIORef p
-       return $ (arr ! i)
-
-{-@ setIO :: forall <p :: Int -> a -> Prop>.
-              a:IOArr<p> a -> i:Upto (size a) -> a<p i> -> IO ()
-  @-}
-setIO a@(IOA sz p) i v
-  = do arr     <- readIORef p
-       let arr' = set arr i v
-       writeIORef p arr'
-
-
-{-@ ofListIO :: xs:[a] -> IO ({v:IOArr a | size v = len xs}) @-}
-ofListIO xs  = newIO n f
-  where
-    n        = length xs
-    m        = M.fromList $ zip [0..] xs
-    f i      = (M.!) m i
-
-
-{-@ mapIO :: (a -> b) -> a:IOArr a -> IO ({v:IOArr b | size v = size a}) @-}
-mapIO f (IOA n p)
-  = do a <- readIORef p
-       IOA n <$> newIORef (map f a)
-
-
-
--------------------------------------------------------------------------------
--- | A Pure Array -------------------------------------------------------------
--------------------------------------------------------------------------------
-
-data Arr a   = A { alen :: Int
-                 , aval :: Int -> a
-                 }
-
-{-@ data Arr a <p :: Int -> a -> Prop>
-             = A { alen :: Nat
-                 , aval :: i:Upto alen -> a<p i>
-                 }
-  @-}
-
-
-{-@ new :: forall <p :: Int -> a -> Prop>.
-             n:Nat -> (i:Upto n -> a<p i>) -> {v: Arr<p> a | alen v = n}
-  @-}
-new n v = A { alen = n
-            , aval = \i -> if (0 <= i && i < n)
-                             then v i
-                             else liquidError "Out of Bounds!"
-            }
-
-{-@ (!) :: forall <p :: Int -> a -> Prop>.
-             a:Arr<p> a -> i:Upto (alen a) -> a<p i>
-  @-}
-
-(A _ f) ! i = f i
-
-{-@ set :: forall <p :: Int -> a -> Prop>.
-             a:Arr<p> a -> i:Upto (alen a) -> a<p i> -> {v:Arr<p> a | alen v = alen a}
-  @-}
-set a@(A _ f) i v = a { aval = \j -> if (i == j) then v else f j }
-
-
-{-@ ofList :: xs:[a] -> {v:Arr a | alen v = len xs} @-}
-ofList xs = new n f
-  where
-    n     = length xs
-    m     = M.fromList $ zip [0..] xs
-    f i   = (M.!) m i
-
-{-@ map :: (a -> b) -> a:Arr a -> {v:Arr b | alen v = alen a} @-}
-map f a@(A n z) = A n (f . z)
diff --git a/tests/todo/liftbug.hs b/tests/todo/liftbug.hs
deleted file mode 100644
--- a/tests/todo/liftbug.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-module AVL where
-
-data Tree = Nil | Tree Int Tree Tree
-
-{-@ measure height @-}
-height :: Tree -> Int
-height Nil          = 0 :: Int
-height (Tree _ l r) = (if height l > height r then 1 + height l else 1 + height r)
-
diff --git a/tests/todo/linspace-crash.hs b/tests/todo/linspace-crash.hs
deleted file mode 100644
--- a/tests/todo/linspace-crash.hs
+++ /dev/null
@@ -1,207 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-
-{-@ LIQUID "--no-termination" @-}
-{-@ LIQUID "--diff" @-}
-
-module LinSpace (dotPV, sameSpace, enumCVP) where
-
-import Language.Haskell.Liquid.Prelude (liquidAssert, liquidError)
-import Prelude hiding (zipWith)
-
-data PVector = PVector { 
-    vec       :: [Integer]      -- vector coordinates
-  , muCoeff   :: [Integer]      -- <vec,bn*>det^2(b[1..n-1]) : ... 
-  , orthSpace :: Space PVector  -- lattice basis
-  } deriving (Show, Eq)
-
--- | Orthogonalized vector bn* and squared lattice determinant 
-data Space a = Null | Real a Integer
-  deriving (Show, Eq)
-
-{-@ data PVector = PVector { 
-      vec_  :: [Integer]   
-    , mu_   :: [Integer] 
-    , orth_ :: {v: (Space (PVectorN (len vec_))) | dim v = (len mu_)}
-    } 
-  @-}
-
-{-@ measure dim     :: (Space PVector) -> Int 
-    dim (Null)      = 0
-    dim (Real pv n) = 1 + (dim (orthSpace pv))
-  @-}
-
-{-@ measure spaceVec     :: (Space PVector) -> PVector
-    spaceVec (Real pv n) = pv
-  @-}
-
-{-@ measure vec :: PVector -> [Integer]
-    vec (PVector v m o) = v 
-  @-}
-
-{-@ measure muCoeff :: PVector -> [Integer]
-    muCoeff (PVector v m o) = m 
-  @-}
-
-{-@ measure orthSpace :: PVector -> (Space PVector)
-    orthSpace (PVector p m o) = o
-  @-}
-
-{-@ invariant {v: PVector | (Inv v) }    @-}
-{-@ invariant {v: Space PVector | (dim v) >= 0 } @-}
-
--- RJ: Helpers for defining properties
-
-{-@ predicate Inv V        = (dim (orthSpace V)) = (len (muCoeff V)) @-}
-{-@ predicate SameLen  X Y = ((len (vec X))  = (len (vec Y)))  @-}
-{-@ predicate SameOrth X Y = ((orthSpace X) = (orthSpace Y)) @-}
-
--- RJ: Useful type aliases for specs
-
-{-@ type SameSpace X       = {v:PVector | ((Inv v) && (SameLen X v) && (SameOrth X v))} @-}
-{-@ type PVectorN N        = {v: PVector | (len (vec v)) = N}   @-} 
-{-@ type PVectorP P        = {v: PVector | (SameLen v P)}       @-} 
-
---------------------
-
-{-@ dim         :: s:(Space PVector) -> {v:Int | v = (dim s)} @-}
-dim Null        = (0 :: Int)
-dim (Real pv _) = 1 + dim (orthSpace_ pv)
-
-sameSpace         :: PVector -> PVector -> Bool
-sameSpace pv1 pv2 = (length (vec pv1) == length (vec pv2)) && (orthSpace pv1 == orthSpace pv2)
-
-
-{-@ muCoeff_   :: p:PVector -> {v:[Integer] | v = (muCoeff p) }            @-}
-muCoeff_ (PVector v m o) = m
-
-{-@ orthSpace_ :: p:PVector -> {v:(Space (PVectorP p)) | v = (orthSpace p)} @-} 
-orthSpace_ (PVector v m o) = o
-
-{-@ vec_       :: p:PVector -> {v:[Integer] | v = (vec p)}                  @-}
-vec_     (PVector v m o) = v
-
---------------------
-
--- squared determinant of orthSpace
-detPV :: PVector -> Integer 
-detPV (PVector _ _ Null)       = 1
-detPV (PVector _ _ (Real _ n)) = n
-
-
-{-@ liftPV :: pv:PVector -> {v:(PVectorP pv) | ((orthSpace v) = (orthSpace (spaceVec (orthSpace pv))) && ((dim (orthSpace v)) = (dim (orthSpace pv)) - 1))} @-}
-liftPV (PVector v (m:mu) (Real pv _)) = PVector v mu (orthSpace_ pv)
-
-{-@ dot :: (Num a) => xs:[a] -> {v:[a] | (len v) = (len xs)} -> a @-}
-dot xs ys = sum (zipWith (*) xs ys)
-
--- scaled dot product of two projected vectors: output is <v*,w*>det^2(orthSpace) 
-{-@ dotPV :: pv1:PVector -> pv2:(SameSpace pv1) -> Integer @-}
-dotPV (PVector v1 [] _) (PVector v2 [] _) 
-  = dot v1 v2
-dotPV pv1@(PVector _ mu1 _) pv2@(PVector _ mu2 _) 
-  = liquidAssert (length mu1 == length mu2) q
-  where
-    dd          = dotPV (liftPV pv1) (liftPV pv2)
-    Real pv0 rr = orthSpace_ pv1       -- same as orthSpace v2
-    x           = dd * rr - (head mu1) * (head mu2)
-    (q, 0)      = divMod x (detPV pv0) -- check remainder is 0
-
--- ASSERT: (x .+. y) ==> sameSpace x y
-{-@ (.+.) :: x:PVector -> (SameSpace x) -> (SameSpace x) @-}
-(PVector v1 m1 o) .+. (PVector v2 m2 _) = PVector (zipWith  (+) v1 v2) (zipWith (+) m1 m2) o
-
--- ASSERT: (x .-. y) ==> sameSpace x y
-{-@ (.-.) :: x:PVector -> (SameSpace x) -> (SameSpace x) @-}
-(PVector v1 m1 o) .-. (PVector v2 m2 _) = PVector (zipWith  (-) v1 v2) (zipWith (-) m1 m2) o
-
-{-@ (*.) :: Integer -> x:PVector -> (SameSpace x) @-}
-(*.) :: Integer -> PVector -> PVector
-x *. (PVector v m o) = PVector (map (x *)  v) (map (x *) m) o
-
--- Some auxiliary functions
-
-{-@ space2vec :: n:Int -> s:(Space (PVectorN n)) -> {v: (PVectorN n) | (orthSpace v) = s} @-}
-space2vec (n :: Int) sp@(Real bn r) = PVector (vec_ bn) (r : muCoeff_ bn) sp
-
-{-@ makeSpace :: p:PVector -> (Space (PVectorP p)) @-}
-makeSpace pvec = Real pvec (dotPV pvec pvec)
-
-{-@ makePVector :: vs:[Integer] -> s:(Space (PVectorN (len vs))) -> {v: (PVectorN (len vs)) | (orthSpace v) = s} @-}
-makePVector :: [Integer] -> Space PVector -> PVector
-makePVector v s@Null = PVector v [] s 
-makePVector v s@(Real s1 _) = 
-  let v1 = makePVector v (orthSpace_ s1) 
-  in PVector v (dotPV v1 s1 : muCoeff_ v1)  s
-
-{-@ gramSchmidt :: n:Nat -> [(List Integer n)] -> (Space (PVectorN n)) @-}
-gramSchmidt (n :: Int) = foldl (\sp v -> makeSpace (makePVector v sp)) Null 
-
-{-@ getBasis :: n:Nat -> Space (PVectorN n) -> [(List Integer n)] @-}
-getBasis (n::Int) s = worker s [] 
-  where
-    worker Null bs = bs
-    worker (Real pv _) bs = worker (orthSpace_ pv) (vec pv : bs)
-
-{-@ qualif EqMu(v:PVector, x:PVector): (len (muCoeff v)) = (len (muCoeff x)) @-}
-
-sizeReduce1 :: PVector -> PVector
-sizeReduce1 pv@(PVector v (m:_) sn@(Real _ r)) = 
-  let c  = div (2*m + r) (2*r) -- division with rounded remainder
-      n  = length v    
-  in  pv  .-.  (c *. (space2vec n sn))
-
--- ASSERT: sameSpace (sizeReduce x) x
-{-@ sizeReduce :: x:PVector -> (SameSpace x) @-}
-sizeReduce pv@(PVector v [] Null) = pv
-sizeReduce pv@(PVector _ _ sp@(Real _ _)) = 
-  let pv1 = sizeReduce1 pv
-      (PVector v mu _) = sizeReduce (liftPV pv1)
-  in PVector v (head (muCoeff_ pv1) : mu) sp
-
--- Two example algorithms using the library: enumCVP and lll
-
-enumCVP :: PVector -> Integer -> Maybe [Integer]
-enumCVP (PVector v mu Null) r 
-  | dot v v < r = Just v 
-  | otherwise   = Nothing 
-enumCVP t@(PVector _ (_:_) (Real bn _)) r = 
-  let t0 = sizeReduce1  t
-      cs = if (head (muCoeff_ t0) < 0) 
-           then 0 : concat [[x,negate x] | x <- [1,2..]]
-           else 0 : concat [[negate x,x] | x <- [1,2..]]
-      branch :: (Integer, Maybe [Integer]) -> [PVector] -> (Integer, Maybe [Integer])
-      branch (r,v) (t:ts) = 
-        if (dotPV t t >= r * detPV t) then (r,v)
-        else case enumCVP t r of
-          Nothing -> branch (r,v) ts
-          Just w  -> branch (dot w w, Just w) ts
-  in snd $ branch (r,Nothing) [liftPV t0 .+. (c *. bn) | c <- cs]
-
--- make this parametric on n
-{- Fraction free LLL Algorithm with exact arithmetic and delta=99/100 -}
-{-@ lll :: n:Nat -> [(List Integer n)] -> [(List Integer n)] @-}
-lll :: Int -> [[Integer]] -> [[Integer]]
-lll n = getBasis n . lll_worker n Null Nothing
-
-{-@ lll_worker :: n:Nat -> (Space (PVectorN n)) -> (Maybe (PVectorN n)) -> [(List Integer n)] -> (Space (PVectorN n)) @-}
-lll_worker (n :: Int) bs Nothing [] = bs
-lll_worker n bs Nothing (v:vs)      = lll_worker n bs (Just (makePVector v bs)) vs
-lll_worker n Null (Just pv) vs      = lll_worker n (makeSpace pv) Nothing vs
-lll_worker n (Real bn r) (Just pv) vs = 
-    let pv1 = sizeReduce pv
-        pv2 = liftPV pv1
-    in if (100*(dotPV pv2 pv2) < 99*r)
-       then lll_worker n (orthSpace_ bn) (Just pv2) (vec bn : vs)
-       else lll_worker n (makeSpace pv1) Nothing vs
-
-------------------------------------------------------------------------------------
--- RJ: Included for illustration...
-------------------------------------------------------------------------------------
-
-{-@ type List a N = {v : [a] | (len v) = N} @-}
-
-{-@ zipWith :: (a -> b -> c) -> xs:[a] -> (List b (len xs)) -> (List c (len xs)) @-}
-zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
-zipWith _ [] []         = []
-zipWith _ (_:_) []      = liquidError "Dead Code"
-zipWith _ [] (_:_)      = liquidError "Dead Code"
diff --git a/tests/todo/linspace.hs b/tests/todo/linspace.hs
deleted file mode 100644
--- a/tests/todo/linspace.hs
+++ /dev/null
@@ -1,210 +0,0 @@
-{-# LANGUAGE ScopedTypeVariables #-}
-
-{-@ LIQUID "--no-termination" @-}
-
-module LinSpace (dotPV, sameSpace, enumCVP) where
-
-import Language.Haskell.Liquid.Prelude (liquidAssume, liquidAssert, liquidError)
-import Prelude hiding (zipWith)
-
-data PVector = PVector { 
-    vec       :: [Integer]      -- vector coordinates
-  , muCoeff   :: [Integer]      -- <vec,bn*>det^2(b[1..n-1]) : ... 
-  , orthSpace :: Space PVector  -- lattice basis
-  } deriving (Show, Eq)
-
--- | Orthogonalized vector bn* and squared lattice determinant 
-data Space a = Null | Real a Integer
-  deriving (Show, Eq)
-
-{-@ data PVector = PVector { 
-      vec_  :: [Integer]   
-    , mu_   :: [Integer] 
-    , orth_ :: {v: (Space (PVectorN (len vec_))) | (dim v) = (len mu_)}
-    } 
-  @-}
-
-{-@ data Space [dim] @-}
-
-{-@ measure dim     :: (Space PVector) -> Int 
-    dim (Null)      = 0
-    dim (Real pv n) = 1 + (dim (orthSpace pv))
-  @-}
-
-{-@ measure spaceVec     :: (Space PVector) -> PVector
-    spaceVec (Real pv n) = pv
-  @-}
-
-{-@ measure vec :: PVector -> [Integer]
-    vec (PVector v m o) = v 
-  @-}
-
-{-@ measure muCoeff :: PVector -> [Integer]
-    muCoeff (PVector v m o) = m 
-  @-}
-
-{-@ measure orthSpace :: PVector -> (Space PVector)
-    orthSpace (PVector p m o) = o
-  @-}
-
-{-@ invariant {v: PVector | (Inv v) }    @-}
-{-@ invariant {v: Space PVector | (dim v) >= 0 } @-}
-
--- RJ: Helpers for defining properties
-
-{-@ predicate Inv V        = (dim (orthSpace V)) = (len (muCoeff V)) @-}
-{-@ predicate SameLen  X Y = ((len (vec X))  = (len (vec Y)))  @-}
-{-@ predicate SameOrth X Y = ((orthSpace X) = (orthSpace Y)) @-}
-
--- RJ: Useful type aliases for specs
-
-{-@ type SameSpace X       = {v:PVector | ((Inv v) && (SameLen X v) && (SameOrth X v))} @-}
-{-@ type PVectorN N        = {v: PVector | (len (vec v)) = N}   @-} 
-{-@ type PVectorP P        = {v: PVector | (SameLen v P)}       @-} 
-
---------------------
-
-{-@ dim         :: s:(Space PVector) -> {v:Int | v = (dim s)} @-}
-dim Null        = (0 :: Int)
-dim (Real pv _) = 1 + dim (orthSpace_ pv)
-
-sameSpace         :: PVector -> PVector -> Bool
-sameSpace pv1 pv2 = (length (vec pv1) == length (vec pv2)) && (orthSpace pv1 == orthSpace pv2)
-
-
-{-@ muCoeff_   :: p:PVector -> {v:[Integer] | v = (muCoeff p) }            @-}
-muCoeff_ (PVector v m o) = m
-
-{-@ orthSpace_ :: p:PVector -> {v:(Space (PVectorP p)) | v = (orthSpace p)} @-} 
-orthSpace_ (PVector v m o) = o
-
-{-@ vec_       :: p:PVector -> {v:[Integer] | v = (vec p)}                  @-}
-vec_     (PVector v m o) = v
-
---------------------
-
--- squared determinant of orthSpace
-detPV :: PVector -> Integer 
-detPV (PVector _ _ Null)       = 1
-detPV (PVector _ _ (Real _ n)) = n
-
-
-{-@ liftPV :: pv:PVector -> {v:(PVectorP pv) | ((orthSpace v) = (orthSpace (spaceVec (orthSpace pv))) && ((dim (orthSpace v)) = (dim (orthSpace pv)) - 1))} @-}
-liftPV (PVector v (m:mu) (Real pv _)) = PVector v mu (orthSpace_ pv)
-
-{-@ dot :: (Num a) => xs:[a] -> {v:[a] | (len v) = (len xs)} -> a @-}
-dot xs ys = sum (zipWith (*) xs ys)
-
--- scaled dot product of two projected vectors: output is <v*,w*>det^2(orthSpace) 
-{-@ dotPV :: pv1:PVector -> pv2:(SameSpace pv1) -> Integer @-}
-dotPV (PVector v1 [] _) (PVector v2 [] _) 
-  = dot v1 v2
-dotPV pv1@(PVector _ mu1 _) pv2@(PVector _ mu2 _) 
-  = liquidAssert (length mu1 == length mu2) q
-  where
-    dd          = dotPV (liftPV pv1) (liftPV pv2)
-    Real pv0 rr = orthSpace_ pv1                         -- same as orthSpace v2
-    x           = dd * rr - (head mu1) * (head mu2)
-    (q, 0)      = divMod x (liquidAssume (rem /= 0) rem) -- check remainder is 0
-    rem         = detPV pv0
-
--- ASSERT: (x .+. y) ==> sameSpace x y
-{-@ (.+.) :: x:PVector -> (SameSpace x) -> (SameSpace x) @-}
-(PVector v1 m1 o) .+. (PVector v2 m2 _) = PVector (zipWith  (+) v1 v2) (zipWith (+) m1 m2) o
-
--- ASSERT: (x .-. y) ==> sameSpace x y
-{-@ (.-.) :: x:PVector -> (SameSpace x) -> (SameSpace x) @-}
-(PVector v1 m1 o) .-. (PVector v2 m2 _) = PVector (zipWith  (-) v1 v2) (zipWith (-) m1 m2) o
-
-{-@ (*.) :: Integer -> x:PVector -> (SameSpace x) @-}
-(*.) :: Integer -> PVector -> PVector
-x *. (PVector v m o) = PVector (map (x *)  v) (map (x *) m) o
-
--- Some auxiliary functions
-
-{-@ space2vec :: n:Int -> s:(Space (PVectorN n)) -> {v: (PVectorN n) | (orthSpace v) = s} @-}
-space2vec (n :: Int) sp@(Real bn r) = PVector (vec_ bn) (r : muCoeff_ bn) sp
-
-{-@ makeSpace :: p:PVector -> (Space (PVectorP p)) @-}
-makeSpace pvec = Real pvec (dotPV pvec pvec)
-
-{-@ makePVector :: vs:[Integer] -> s:(Space (PVectorN (len vs))) -> {v: (PVectorN (len vs)) | (orthSpace v) = s} @-}
-makePVector :: [Integer] -> Space PVector -> PVector
-makePVector v s@Null = PVector v [] s 
-makePVector v s@(Real s1 _) = 
-  let v1 = makePVector v (orthSpace_ s1) 
-  in PVector v (dotPV v1 s1 : muCoeff_ v1)  s
-
-{-@ gramSchmidt :: n:Nat -> [(List Integer n)] -> (Space (PVectorN n)) @-}
-gramSchmidt (n :: Int) = foldl (\sp v -> makeSpace (makePVector v sp)) Null 
-
-{-@ getBasis :: n:Nat -> Space (PVectorN n) -> [(List Integer n)] @-}
-getBasis (n::Int) s = worker s [] 
-  where
-    worker Null bs = bs
-    worker (Real pv _) bs = worker (orthSpace_ pv) (vec pv : bs)
-
-{-@ qualif EqMu(v:PVector, x:PVector): (len (muCoeff v)) = (len (muCoeff x)) @-}
-
-sizeReduce1 :: PVector -> PVector
-sizeReduce1 pv@(PVector v (m:_) sn@(Real _ r)) = 
-  let c  = div (2*m + r) (liquidAssume (r2 /= 0) r2) -- division with rounded remainder
-      r2 = 2 * r
-      n  = length v    
-  in  pv  .-.  (c *. (space2vec n sn))
-
--- ASSERT: sameSpace (sizeReduce x) x
-{-@ sizeReduce :: x:PVector -> (SameSpace x) @-}
-sizeReduce pv@(PVector v [] Null) = pv
-sizeReduce pv@(PVector _ _ sp@(Real _ _)) = 
-  let pv1 = sizeReduce1 pv
-      (PVector v mu _) = sizeReduce (liftPV pv1)
-  in PVector v (head (muCoeff_ pv1) : mu) sp
-
--- Two example algorithms using the library: enumCVP and lll
-
-enumCVP :: PVector -> Integer -> Maybe [Integer]
-enumCVP (PVector v mu Null) r 
-  | dot v v < r = Just v 
-  | otherwise   = Nothing 
-enumCVP t@(PVector _ (_:_) (Real bn _)) r = 
-  let t0 = sizeReduce1  t
-      cs = if (head (muCoeff_ t0) < 0) 
-           then 0 : concat [[x,negate x] | x <- [1,2..]]
-           else 0 : concat [[negate x,x] | x <- [1,2..]]
-      branch :: (Integer, Maybe [Integer]) -> [PVector] -> (Integer, Maybe [Integer])
-      branch (r,v) (t:ts) = 
-        if (dotPV t t >= r * detPV t) then (r,v)
-        else case enumCVP t r of
-          Nothing -> branch (r,v) ts
-          Just w  -> branch (dot w w, Just w) ts
-  in snd $ branch (r,Nothing) [liftPV t0 .+. (c *. bn) | c <- cs]
-
--- make this parametric on n
-{- Fraction free LLL Algorithm with exact arithmetic and delta=99/100 -}
-{-@ lll :: n:Nat -> [(List Integer n)] -> [(List Integer n)] @-}
-lll :: Int -> [[Integer]] -> [[Integer]]
-lll n = getBasis n . lll_worker n Null Nothing
-
-{-@ lll_worker :: n:Nat -> (Space (PVectorN n)) -> (Maybe (PVectorN n)) -> [(List Integer n)] -> (Space (PVectorN n)) @-}
-lll_worker (n :: Int) bs Nothing [] = bs
-lll_worker n bs Nothing (v:vs)      = lll_worker n bs (Just (makePVector v bs)) vs
-lll_worker n Null (Just pv) vs      = lll_worker n (makeSpace pv) Nothing vs
-lll_worker n (Real bn r) (Just pv) vs = 
-    let pv1 = sizeReduce pv
-        pv2 = liftPV pv1
-    in if (100*(dotPV pv2 pv2) < 99*r)
-       then lll_worker n (orthSpace_ bn) (Just pv2) (vec bn : vs)
-       else lll_worker n (makeSpace pv1) Nothing vs
-
-------------------------------------------------------------------------------------
--- RJ: Included for illustration...
-------------------------------------------------------------------------------------
-
-{-@ type List a N = {v : [a] | (len v) = N} @-}
-
-{-@ zipWith :: (a -> b -> c) -> xs:[a] -> (List b (len xs)) -> (List c (len xs)) @-}
-zipWith f (a:as) (b:bs) = f a b : zipWith f as bs
-zipWith _ [] []         = []
-zipWith _ (_:_) []      = liquidError "Dead Code"
-zipWith _ [] (_:_)      = liquidError "Dead Code"
diff --git a/tests/todo/list-screen.hs b/tests/todo/list-screen.hs
deleted file mode 100644
--- a/tests/todo/list-screen.hs
+++ /dev/null
@@ -1,113 +0,0 @@
-{-@ LIQUID "--no-termination" @-}
-
-module ListDemo where
-
------------------------------------------------------------------------
--- 1. Lets define a List data-type
------------------------------------------------------------------------
-
-data List a = E | (:::) { h :: a, t :: List a }
-
--- We'll want to use the "cons" in an infix fashion
-
-infixr  9 ::: 
-
--- Ok, now here are some lists
-
-aList :: List Int
-aList = 0 ::: 2 ::: 7 ::: E
-
--- Lets define some simple refinements.
-
--- | The set of things  that are greater then `N`
-
-{-@ type Geq a N = {v:a | N <= v} @-}
-
--- | now we can define the *natural* and *positive* numbers as:
-
-{-@ type Nat   = Geq Int 0    @-}
-{-@ type Grand = Geq Int 1000 @-}
-
--- > Lets go back and see if we can refine our lists:
-
-{- up  :: List Grand @-}
-
--- Whoops, that didn't work of course, how about
-
-{- up  :: List Nat  @-}
-
------------------------------------------------------------------------
--- 2. Lets write a function that generates a sequence: n, n+1, n+2, ...
------------------------------------------------------------------------
-
-{-@ countUp :: n:Nat -> List Nat @-}
-countUp n  = n ::: countUp (n + 1)
-
--- > How shall we type it? Well, one option:
-
-{- countUp :: n:Nat -> List Nat @-}
-
--- So if you start with a `Nat` you get a list of `Nat`
-
--- > How about 
-
-{- countUp :: n:Nat -> List Grand @-}
-
--- Of course not! Lets see the error. Ah, so you can do:
-
-{- countUp :: n:Grand -> List Grand @-}
-
-
------------------------------------------------------------------------
--- 3. ORDERED sequences ...
------------------------------------------------------------------------
-
--- Now, really we want to say that `countUp` returns ORDERED sequences,
--- i.e. it returns an INCREASING list of numbers (starting at `n`).
-
--- Lets specify this by REFINING `List` to only allow INCREASING sequences ...
-
--- > Lets look at the data type.
--- > Key: INCREASING means `t` must ONLY contain values GREATER THAN head `h`.
-                                      
--- that is,
-
--- t :: List (Geq a h)
-
--- lets specify that in a REFINED definition of `List`
-
-{-@ data List a = E | (:::) { h :: a, t :: List (Geq a h) } @-}
-
--- Now lets look at some lists
-
-ups = 0 ::: 1 ::: 3 ::: E 
-
--- But how about
-
-downs = 7 ::: 2 ::: E
-
--- > Now lets go back and revisit `countUp` ... whoops there is an ERROR!
--- > This is because we only know the TAIL is a list of Nat, we ALSO need that
--- > the tail is greater than `n` and so ...
-
-{- countUp :: n:Nat -> List (Geq n) @-}
-
-
-insert x E          = x ::: E
-insert x (y ::: ys)
-  | x <= y          = x ::: y ::: ys
-  | otherwise       = y ::: insert x ys
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/todo/lit01.hs b/tests/todo/lit01.hs
deleted file mode 100644
--- a/tests/todo/lit01.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-module Nats (poo) where
-
-import Language.Haskell.Liquid.Prelude 
-
-poo :: () 
-poo = liquidAssert (alice /= bob) () 
-
--- && bob == charlie) ()
-
-alice :: String 
-alice = "I am a dog"
-
-bob :: String 
-bob = "I am a cat"
-
-charlie :: String 
-charlie = "I am a cat"
diff --git a/tests/todo/mapreduce.hs b/tests/todo/mapreduce.hs
deleted file mode 100644
--- a/tests/todo/mapreduce.hs
+++ /dev/null
@@ -1,140 +0,0 @@
-{-@ LIQUID "--higherorder"         @-}
-{-@ LIQUID "--totality"            @-}
-{-@ LIQUID "--exactdc"             @-}
-{-@ LIQUID "--no-measure-fields"   @-}
-
-
-module DivideAndQunquer where 
-
-import Prelude hiding (error, map, take, drop)
-import Language.Haskell.Liquid.ProofCombinators 
-
-{-@ reflect mapReduce @-}
-mapReduce :: Int -> (List a -> b) -> (b -> b -> b) -> List a -> b 
-mapReduce n f op N  = f N  
-mapReduce n f op is = reduce op (map f (chunk n is)) 
-
-chunk  :: Int -> List a -> List (List a)
-map    :: (a -> b) -> List a -> List b
-reduce :: (b -> b -> b) -> List b -> b  
-
-{-@ mapReduceTheorem :: n:Int -> f:(List a -> b) -> op:(b -> b -> b) -> is:List a
-      -> distributionThm:(is1:List a -> is2:List a -> {op (f is1) (f is2) == f (append is1 is2)} ) -> 
-      { f is == mapReduce n f op is } / [llen is] @-}
-mapReduceTheorem :: Int -> (List a -> b) -> (b -> b -> b) -> List a -> (List a -> List a -> Proof)  -> Proof 
-mapReduceTheorem n f op N _
-  =   mapReduce n f op N 
-  ==. f N 
-  *** QED 
-
-mapReduceTheorem n f op is _ 
-  | llen is <= n || n <= 1 
-  =   mapReduce n f op is 
-  ==. reduce op (map f (chunk n is))
-  ==. reduce op (map f (C is N))
-  ==. reduce op (f is `C` map f N)
-  ==. reduce op (f is `C` N)
-  ==. f is
-  *** QED 
-
-mapReduceTheorem n f op is distributionThm 
-  = undefined   
-{-  =   mapReduce n f op is 
-  ==. reduce op (map f (chunk n is))
-  ==. reduce op (map f (C (take n is) (chunk n (drop n is))))
-  ==. reduce op (f (take n is) `C` map f (chunk n (drop n is)))
-  ==. op (f (take n is)) (reduce op (map f (chunk n (drop n is))))
-  ==. op (f (take n is)) (mapReduce n f op (drop n is))
-  ==. op (f (take n is)) (f (drop n is))
-        ? mapReduceTheorem n f op (drop n is) distributionThm
-  ==. f (append (take n is) (drop n is))
-        ? distributionThm (take n is) (drop n is)
-  ==. f is 
-        ? appendTakeDrop n is
-  *** QED  
- -}
--------------------------------------------------------------------------------
------------  List Definition --------------------------------------------------
--------------------------------------------------------------------------------
-
-
-{-@ data List [llen] a = N | C {lhead :: a, ltail :: List a} @-}
-data List a = N | C a (List a)
-
-llen :: List a -> Int 
-{-@ measure llen @-}
-{-@ llen :: List a -> Nat @-}
-llen N        = 0 
-llen (C _ xs) = 1 + llen xs
-
--------------------------------------------------------------------------------
------------  List Manipulation ------------------------------------------------
--------------------------------------------------------------------------------
-{-@ reflect map @-}
-{-@ map :: (a -> b) -> xs:List a -> {v:List b | llen v == llen xs } @-}
-map _  N       = N
-map f (C x xs) = f x `C` map f xs 
-
-{-@ reflect append @-}
-append :: List a -> List a -> List a 
-append N        ys = ys  
-append (C x xs) ys = x `C` (append xs ys)
-
-{-@ reflect reduce @-}
-{-@ reduce :: (b -> b -> b) -> is:{List b | 1 <= llen is } -> b @-}  
-reduce _  (C x N)  = x 
-reduce op (C x xs) = op x (reduce op xs)
-
-{-@ reflect chunk @-}
-{-@ chunk :: i:Int -> xs:List a -> {v:List (List a) | (1 <= llen v) &&  (if (i <= 1 || llen xs <= i) then (llen v == 1) else (llen v < llen xs)) } / [llen xs] @-}
-chunk i xs 
-  | i <= 1 
-  = C xs N 
-  | llen xs <= i 
-  = C xs N 
-  | otherwise
-  = C (take i xs) (chunk i (drop i xs))
-
-{-@ reflect drop @-}
-{-@ drop :: i:Nat -> xs:{List a | i <= llen xs } -> {v:List a | llen v == llen xs - i } @-} 
-drop :: Int -> List a -> List a 
-drop i N = N 
-drop i (C x xs)
-  | i == 0 
-  = C x xs  
-  | otherwise 
-  = drop (i-1) xs 
-
-{-@ reflect take @-}
-{-@ take :: i:Nat -> xs:{List a | i <= llen xs } -> {v:List a | llen v == i} @-} 
-take :: Int -> List a -> List a 
-take i N = N 
-take i (C x xs)
-  | i == 0 
-  = N  
-  | otherwise 
-  = C x (take (i-1) xs)
-
--- | Helper Theorem 
-{-@ appendTakeDrop :: i:Nat -> xs:{List a | i <= llen xs} 
-  -> {xs == append (take i xs) (drop i xs) }  @-}
-
-appendTakeDrop :: Int -> List a -> Proof 
-appendTakeDrop i N 
-  =   append (take i N) (drop i N)
-  ==. append N N 
-  ==. N 
-  *** QED 
-appendTakeDrop i (C x xs)
-  | i == 0 
-  =   append (take 0 (C x xs)) (drop 0 (C x xs))
-  ==. append N (C x xs)
-  ==. C x xs 
-  *** QED 
-  | otherwise
-  =   append (take i (C x xs)) (drop i (C x xs))
-  ==. append (C x (take (i-1) xs)) (drop (i-1) xs)
-  ==. C x (append (take (i-1) xs) (drop (i-1) xs))
-  ==. C x xs ? appendTakeDrop (i-1) xs 
-  *** QED 
-
diff --git a/tests/todo/maps.hs b/tests/todo/maps.hs
deleted file mode 100644
--- a/tests/todo/maps.hs
+++ /dev/null
@@ -1,36 +0,0 @@
-module Maps where
-
-import Prelude hiding (lookup)
-import Data.Map
-
-{-@ prop0   :: _ -> x:_ -> y:{_ | y == x} -> TT @-}
-prop0       :: Map Int Int -> Int -> Int -> Bool
-prop0 m x y = (a == b)
-  where
-    a       = m ! x 
-    b       = m ! y 
-
-{-@ prop1   :: _ -> x:_ -> y:{_ | y /= x} -> TT @-}
-prop1       :: Map Int Int -> Int -> Int -> Bool
-prop1 m x y = (z == 10)
-  where
-    m1      = insert x 10 m 
-    m2      = insert y 20 m1
-    z       = m2 ! x 
-
-{-@ prop2   :: _ -> x:_ -> y:{_ | y == x} -> TT @-}
-prop2 m x y = (z == 20)
-  where
-    m1      = insert x 10 m 
-    m2      = insert y 20 m1
-    z       = m2 ! x
-
------------------------------------------------------------------------
-
-{-@ embed Map as Map_t @-}
-{-@ measure Map_select :: Map k v -> k -> v @-}
-{-@ measure Map_store  :: Map k v -> k -> v -> Map k v @-}
-{-@ assume (!)         :: (Ord k) => m:Map k v -> k:k -> {v:v | v = Map_select m k} @-}
-{-@ assume insert      :: (Ord k) => key:k -> value:v -> m:Map k v -> {n:Map k v | n = Map_store m key value} @-}
-
------------------------------------------------------------------------
diff --git a/tests/todo/maybe0.hs b/tests/todo/maybe0.hs
deleted file mode 100644
--- a/tests/todo/maybe0.hs
+++ /dev/null
@@ -1,45 +0,0 @@
-module Foo where
-
--- remove the ! and it is safe...
-data MaybeS a = NothingS | JustS !a
-
-{-@ measure isJustS :: forall a. MaybeS a -> Bool 
-    isJustS (JustS x)  = true
-    isJustS (NothingS) = false
-  @-}
-
-{-@ measure fromJustS :: forall a. MaybeS a -> a
-    fromJustS (JustS x) = x 
-  @-}
-
-gloop = poop True
-
-{-@ poop :: z:a -> {v: MaybeS a | fromJustS(v) = z} @-}
-poop z = JustS z
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/todo/maybe0000.hs b/tests/todo/maybe0000.hs
deleted file mode 100644
--- a/tests/todo/maybe0000.hs
+++ /dev/null
@@ -1,55 +0,0 @@
-module Foo where
-
-data MaybeS a = NothingS | JustS a
-
--- crashes with : 
--- Fixpoint: Testing Solution 
--- z3Pred: error converting && [ (isJust(lq_anf__ddc) <=> false)
---                             ; (lq_anf__ddc = ds_dd9)
---                             ; (fromJustS([gloop#r9K]) = True#6u)
---                             ; (Bexp True#6u)
---                             ; (~ ((Bexp False#68)))]
---
--- Fatal error: exception Failure("Z3: type error")
-
-
-myisJust :: Maybe a -> Bool
-myisJust Nothing  = True
-myisJust (Just x) = False
-
-{-@ measure fromJustS :: MaybeS a -> a
-    fromJustS (JustS x) = x 
-  @-}
-
-gloop :: MaybeS Bool
-gloop = poop True
-
-{- poop :: z:a -> {v: MaybeS a | fromJustS(v) = z} @-}
-poop z = JustS z
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/todo/maybe4.hs b/tests/todo/maybe4.hs
deleted file mode 100644
--- a/tests/todo/maybe4.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-module Foo where
-
-
-moo = poo z z 
-  where z       = blerg True 
-        blerg True = Nothing
-
-{-@ poo :: x:Maybe a -> {v: Maybe a | v = x } -> Bool @-}
-poo :: Maybe a -> Maybe a -> Bool
-poo x y = True
-
-
-
-
-
-
-
diff --git a/tests/todo/measbug.hs b/tests/todo/measbug.hs
deleted file mode 100644
--- a/tests/todo/measbug.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module MeasureBug where
-
-data Heap a   = Empty | Node { pri   :: a
-                             , rnk   :: Int 
-                             , left  :: Heap a
-                             , right :: Heap a
-                             }
-{-@ data Heap [zoo] @-}
-
-{-@ invariant {v:Heap a| (zoo v) >=0} @-}
-
-{-@ measure zoo @-}
-zoo :: Heap a -> Int
-zoo (Empty)        = 0
-zoo (Node _ _ l r) = 1 + zoo l + zoo r
diff --git a/tests/todo/measfield.hs b/tests/todo/measfield.hs
deleted file mode 100644
--- a/tests/todo/measfield.hs
+++ /dev/null
@@ -1,11 +0,0 @@
-module Goo (Vec (..)) where
-
-data Vec a = V { vsz :: Int, velems :: [a] }
-
-{-@ data Vec a  = V { vsz :: Int, velems :: {v:[a] | len v = vsz} } @-}
-
-{-@ foo :: x:Vec a -> {v:[a] | len v = vsz x} @-}
-foo v = velems v 
-
-{-@ bar :: x:Vec a -> {v:[a] | len v = vsz x} @-}
-bar (V _ ys) = ys 
diff --git a/tests/todo/overload.hs b/tests/todo/overload.hs
deleted file mode 100644
--- a/tests/todo/overload.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-module Overload where
-
-import Data.Monoid
-
-bar1, bar2 :: List Int
-
-type List a = [a]
-
-{-@ type ListN a N = { v:[a] | len v == N } @-}
-
-{-@ instance Monoid (List a) where
-      mempty  :: ListN a 0
-      mappend :: xs:[a] -> ys:[a] -> ListN a {len xs + len ys}
-      mconcat :: List (List a) -> List a
-  @-}
-
-{-@ bar1 :: ListN Int 6 @-}
-bar1 = [1,2,3] ++ [4,5,6]
-
-{-@ bar2 :: ListN Int 6 @-}
-bar2 = [1,2,3] <> [4,5,6]
diff --git a/tests/todo/partialmeasureOld.hs b/tests/todo/partialmeasureOld.hs
deleted file mode 100644
--- a/tests/todo/partialmeasureOld.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-module Head where
-
-{-@ measure hd :: [a] -> a
-    hd (x:xs) = x
-  @-}
-
--- Strengthened constructors
---   data [a] where
---     []  :: [a]    -- as before
---     (:) :: x:a -> xs:[a] -> {v:[a] | hd v = x}
-
-{-@ cons :: x:a -> _ -> {v:[a] | hd v = x} @-}
-cons x xs = x : xs
-
-{-@ test :: {v:_ | hd v = 0} @-}
-test     :: [Int]
-test     =  cons 0 [1,2,3,4]
-
-
-
-
diff --git a/tests/todo/ptr.hs b/tests/todo/ptr.hs
deleted file mode 100644
--- a/tests/todo/ptr.hs
+++ /dev/null
@@ -1,195 +0,0 @@
-{--! run liquid with idirs=../../benchmarks/bytestring-0.9.2.1 idirs=../../include no-termination -}
-{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans #-}
-
--- GET THIS TO WORK WITHOUT THE "base" measure and realated theorem,
--- but with raw pointer arithmetic. I.e. give plusPtr the right signature:
---   (v = base + off)
--- Can do so now, by:
---
---   embed Ptr as int 
---
--- but the problem is that then it throws off all qualifier definitions like
---  
---   qualif EqPLen(v: ForeignPtr a, x: Ptr a): (fplen v) = (plen x)
---   qualif EqPLen(v: Ptr a, x: ForeignPtr a): (plen v) = (fplen x) 
--- 
--- because there is no such thing as Ptr a by the time we get to Fixpoint. yuck.
--- Meaning we have to rewrite the above to the rather lame:
-
---   qualif EqPLenPOLY2(v: a, x: b): (plen v) = (fplen x)           
-
-
-module Data.ByteString (
-        ByteString,            -- abstract, instances: Eq, Ord, Show, Read, Data, Typeable, Monoid
-        foldl                  -- :: (a -> Word8 -> a) -> a -> ByteString -> a
-  ) where
-
-import Language.Haskell.Liquid.Prelude
-
-import qualified Prelude as P
-import Prelude hiding           (reverse,head,tail,last,init,null
-                                ,length,map,lines,foldl,foldr,unlines
-                                ,concat,any,take,drop,splitAt,takeWhile
-                                ,dropWhile,span,break,elem,filter,maximum
-                                ,minimum,all,concatMap,foldl1,foldr1
-                                ,scanl,scanl1,scanr,scanr1
-                                ,readFile,writeFile,appendFile,replicate
-                                ,getContents,getLine,putStr,putStrLn,interact
-                                ,zip,zipWith,unzip,notElem)
-
-import Data.ByteString.Internal
-import Data.ByteString.Unsafe
-import Data.ByteString.Fusion
-
-import qualified Data.List as List
-
-import Data.Word                (Word8)
-import Data.Maybe               (listToMaybe)
-import Data.Array               (listArray)
-import qualified Data.Array as Array ((!))
-
--- Control.Exception.bracket not available in yhc or nhc
-#ifndef __NHC__
-import Control.Exception        (bracket, assert)
-import qualified Control.Exception as Exception
-#else
-import IO			(bracket)
-#endif
-import Control.Monad            (when)
-
-import Foreign.C.String         (CString, CStringLen)
-import Foreign.C.Types          (CSize)
-import Foreign.ForeignPtr
-import Foreign.Marshal.Alloc    (allocaBytes, mallocBytes, reallocBytes, finalizerFree)
-import Foreign.Marshal.Array    (allocaArray)
-import Foreign.Ptr
-import Foreign.Storable         (Storable(..))
-
--- hGetBuf and hPutBuf not available in yhc or nhc
-import System.IO                (stdin,stdout,hClose,hFileSize
-                                ,hGetBuf,hPutBuf,openBinaryFile
-                                ,Handle,IOMode(..))
-
-import Data.Monoid              (Monoid, mempty, mappend, mconcat)
-
-#if !defined(__GLASGOW_HASKELL__)
-import System.IO.Unsafe
-import qualified System.Environment
-import qualified System.IO      (hGetLine)
-#endif
-
-#if defined(__GLASGOW_HASKELL__)
-
-import System.IO                (hGetBufNonBlocking)
-import System.IO.Error          (isEOFError)
-
-import GHC.Handle
-import GHC.Prim                 (Word#, (+#), writeWord8OffAddr#)
-import GHC.Base                 (build)
-import GHC.Word hiding (Word8)
-import GHC.Ptr                  (Ptr(..))
-import GHC.ST                   (ST(..))
-import GHC.IOBase
-
-#endif
-
--- An alternative to Control.Exception (assert) for nhc98
-#ifdef __NHC__
-#define assert  assertS "__FILE__ : __LINE__"
-assertS :: String -> Bool -> a -> a
-assertS _ True  = id
-assertS s False = error ("assertion failed at "++s)
-#endif
-
--- LIQUID
-import GHC.IO.Buffer
-import Language.Haskell.Liquid.Prelude (intCSize)
-import qualified Data.ByteString.Lazy.Internal 
-import qualified Data.ByteString.Fusion
-import qualified Data.ByteString.Internal
-import qualified Data.ByteString.Unsafe
-import qualified Foreign.C.Types
-
-{-@ memcpy_ptr_baoff :: p:(Ptr a) 
-                     -> RawBuffer b 
-                     -> Int 
-                     -> {v:CSize | (OkPLen v p)} -> IO (Ptr ())
-  @-}
-memcpy_ptr_baoff :: Ptr a -> RawBuffer b -> Int -> CSize -> IO (Ptr ())
-memcpy_ptr_baoff = error "LIQUIDCOMPAT"
-
-readCharFromBuffer :: RawBuffer b -> Int -> IO (Char, Int)
-readCharFromBuffer x y = error "LIQUIDCOMPAT"
-
-wantReadableHandleLIQUID :: String -> Handle -> (Handle__ -> IO a) -> IO a
-wantReadableHandleLIQUID x y f = error $ show $ liquidCanaryFusion 12 -- "LIQUIDCOMPAT"
-
-{-@ qualif Gimme(v:a, n:b, acc:a): (len v) = (n + 1 + (len acc)) @-}
-{-@ qualif Zog(v:a, p:a)         : (plen p) <= (plen v)          @-}
-{-@ qualif Zog(v:a)              : 0 <= (plen v)                 @-}
-
-{- type ByteStringNE   = {v:ByteString | (bLength v) > 0} @-}
-{- type ByteStringSZ B = {v:ByteString | (bLength v) = (bLength B)} @-}
--- -----------------------------------------------------------------------------
---
--- Useful macros, until we have bang patterns
---
-
-#define STRICT1(f) f a | a `seq` False = undefined
-#define STRICT2(f) f a b | a `seq` b `seq` False = undefined
-#define STRICT3(f) f a b c | a `seq` b `seq` c `seq` False = undefined
-#define STRICT4(f) f a b c d | a `seq` b `seq` c `seq` d `seq` False = undefined
-#define STRICT5(f) f a b c d e | a `seq` b `seq` c `seq` d `seq` e `seq` False = undefined
-
--- -----------------------------------------------------------------------------
-
-{-@ foldl :: (a -> Word8 -> a) -> a -> ByteString -> a @-}
-foldl :: (a -> Word8 -> a) -> a -> ByteString -> a
-foldl f v (PS x s l) = inlinePerformIO $ withForeignPtr x $ \ptr ->
-        lgo v (ptr `plusPtr` s) (ptr `plusPtr` (s+l))
-    where
-        STRICT3(lgo)
-        lgo z p q | eqPtr p q    = return z
-                  | otherwise = do c <- peek p
-                                   lgo (f z c) (p `plusPtr` 1) q
-{-# INLINE foldl #-}
-
-{- liquid_thm_ptr_cmp :: p:PtrV a
-                       -> q:{v:(PtrV a) | ((plen v) <= (plen p) && v != p && (pbase v) = (pbase p))} 
-                       -> {v: (PtrV a)  | ((v = p) && ((plen q) < (plen p))) } 
-  @-}
-liquid_thm_ptr_cmp :: Ptr a -> Ptr a -> Ptr a
-liquid_thm_ptr_cmp p q = p 
-
--- | 'foldl\'' is like 'foldl', but strict in the accumulator.
--- Though actually foldl is also strict in the accumulator.
-foldl' :: (a -> Word8 -> a) -> a -> ByteString -> a
-foldl' = foldl
-{-# INLINE foldl' #-}
-
-
--- | Perform an operation with a temporary ByteString
-withPtr :: ForeignPtr a -> (Ptr a -> IO b) -> b
-withPtr fp io = inlinePerformIO (withForeignPtr fp io)
-{-# INLINE withPtr #-}
-
--- Common up near identical calls to `error' to reduce the number
--- constant strings created when compiled:
-{-@ errorEmptyList :: {v:String | false} -> a @-}
-errorEmptyList :: String -> a
-errorEmptyList fun = moduleError fun "empty ByteString"
-{-# NOINLINE errorEmptyList #-}
-
-moduleError :: String -> String -> a
-moduleError fun msg = error ("Data.ByteString." ++ fun ++ ':':' ':msg)
-{-# NOINLINE moduleError #-}
-
--- LIQUID -- -- Find from the end of the string using predicate
--- LIQUID -- findFromEndUntil :: (Word8 -> Bool) -> ByteString -> Int
--- LIQUID -- STRICT2(findFromEndUntil)
--- LIQUID -- findFromEndUntil f ps@(PS x s l) =
--- LIQUID --     if null ps then 0
--- LIQUID --     else if f (last ps) then l
--- LIQUID --          else findFromEndUntil f (PS x s (l-1))
-
-
diff --git a/tests/todo/ptr2.hs b/tests/todo/ptr2.hs
deleted file mode 100644
--- a/tests/todo/ptr2.hs
+++ /dev/null
@@ -1,146 +0,0 @@
-{-@ LIQUID "--idirs=../../benchmarks/bytestring-0.9.2.1/" @-}
-{-@ LIQUID "--idirs=../../include" @-}
-{-@ LIQUID "--no-termination" @-}
-{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans #-}
-
--- look for `n0` and `n1` below. Why does this work with `n1` but not `n0` or `0-1` ?
--- the latter is likely some wierd qualifier issue.
-
-
-module Data.ByteString (
-        ByteString,            -- abstract, instances: Eq, Ord, Show, Read, Data, Typeable, Monoid
-        foldr                  -- :: (a -> Word8 -> a) -> a -> ByteString -> a
-  , wantReadableHandleLIQUID
-  ) where
-
-
-import qualified Prelude as P
-import Prelude hiding           (reverse,head,tail,last,init,null
-                                ,length,map,lines,foldl,foldr,unlines
-                                ,concat,any,take,drop,splitAt,takeWhile
-                                ,dropWhile,span,break,elem,filter,maximum
-                                ,minimum,all,concatMap,foldl1,foldr1
-                                ,scanl,scanl1,scanr,scanr1
-                                ,readFile,writeFile,appendFile,replicate
-                                ,getContents,getLine,putStr,putStrLn,interact
-                                ,zip,zipWith,unzip,notElem)
-
-import Data.ByteString.Internal
-import Data.ByteString.Unsafe
-import Data.ByteString.Fusion
-
-import qualified Data.List as List
-
-import Data.Word                (Word8)
-import Data.Maybe               (listToMaybe)
-import Data.Array               (listArray)
-import qualified Data.Array as Array ((!))
-
--- Control.Exception.bracket not available in yhc or nhc
-#ifndef __NHC__
-import Control.Exception        (bracket, assert)
-import qualified Control.Exception as Exception
-#else
-import IO			(bracket)
-#endif
-import Control.Monad            (when)
-
-import Foreign.C.String         (CString, CStringLen)
-import Foreign.C.Types          (CSize)
-import Foreign.ForeignPtr
-import Foreign.Marshal.Alloc    (allocaBytes, mallocBytes, reallocBytes, finalizerFree)
-import Foreign.Marshal.Array    (allocaArray)
-import Foreign.Ptr
-import Foreign.Storable         (Storable(..))
-
--- hGetBuf and hPutBuf not available in yhc or nhc
-import System.IO                (stdin,stdout,hClose,hFileSize
-                                ,hGetBuf,hPutBuf,openBinaryFile
-                                ,Handle,IOMode(..))
-
-import Data.Monoid              (Monoid, mempty, mappend, mconcat)
-
-#if !defined(__GLASGOW_HASKELL__)
-import System.IO.Unsafe
-import qualified System.Environment
-import qualified System.IO      (hGetLine)
-#endif
-
-#if defined(__GLASGOW_HASKELL__)
-
-import System.IO                (hGetBufNonBlocking)
-import System.IO.Error          (isEOFError)
-
-import GHC.Handle
-import GHC.Prim                 (Word#, (+#), writeWord8OffAddr#)
-import GHC.Base                 (build)
-import GHC.Word hiding (Word8)
-import GHC.Ptr                  (Ptr(..))
-import GHC.ST                   (ST(..))
-import GHC.IOBase
-
-#endif
-
--- An alternative to Control.Exception (assert) for nhc98
-#ifdef __NHC__
-#define assert  assertS "__FILE__ : __LINE__"
-assertS :: String -> Bool -> a -> a
-assertS _ True  = id
-assertS s False = error ("assertion failed at "++s)
-#endif
-
--- LIQUID
-import GHC.IO.Buffer
-import Language.Haskell.Liquid.Foreign (intCSize, eqPtr) 
-import qualified Data.ByteString.Lazy.Internal 
-import qualified Data.ByteString.Fusion
-import qualified Data.ByteString.Internal
-import qualified Data.ByteString.Unsafe
-import qualified Foreign.C.Types
-
-{-@ memcpy_ptr_baoff :: p:(Ptr a) 
-                     -> RawBuffer b 
-                     -> Int 
-                     -> {v:CSize | (OkPLen v p)} -> IO (Ptr ())
-  @-}
-memcpy_ptr_baoff :: Ptr a -> RawBuffer b -> Int -> CSize -> IO (Ptr ())
-memcpy_ptr_baoff = error "LIQUIDCOMPAT"
-
-readCharFromBuffer :: RawBuffer b -> Int -> IO (Char, Int)
-readCharFromBuffer x y = error "LIQUIDCOMPAT"
-
-wantReadableHandleLIQUID :: String -> Handle -> (Handle__ -> IO a) -> IO a
-wantReadableHandleLIQUID x y f = error $ show $ liquidCanaryFusion 12 -- "LIQUIDCOMPAT"
-
-{-@ qualif Gimme(v:a, n:b, acc:a): (len v) = (n + 1 + (len acc)) @-}
-{-@ qualif Zog(v:a, p:a)         : (plen p) <= (plen v)          @-}
-{-@ qualif Zog(v:a)              : 0 <= (plen v)                 @-}
-
-{- type ByteStringNE   = {v:ByteString | (bLength v) > 0} @-}
-{- type ByteStringSZ B = {v:ByteString | (bLength v) = (bLength B)} @-}
--- -----------------------------------------------------------------------------
---
--- Useful macros, until we have bang patterns
---
--- -----------------------------------------------------------------------------
-{-@ foldr :: (Word8 -> a -> a) -> a -> ByteString -> a @-}
-foldr :: (Word8 -> a -> a) -> a -> ByteString -> a
-foldr k v (PS x s l) = inlinePerformIO $ withForeignPtr x $ \ptr ->
-        ugo k v (ptr `plusPtr` (s+l-1)) (ptr `plusPtr` (s-1))
-
-{-@ ugo :: (Word8 -> a -> a) -> a -> p:(PtrV Word8) -> {v:Ptr Word8 | ((pbase v) = (pbase p) &&  (plen v) >= (plen p)) } -> IO a @-}
-ugo :: (Word8 -> a -> a) -> a -> Ptr Word8 -> Ptr Word8 -> IO a
-ugo k z p q | eqPtr q p   = return z
-            | otherwise = do c  <- peek p
-                             let n0  = -1               -- BAD  
-                             let n1  = 0 - 1            -- OK
-                             let p' = p `plusPtr` n1 {- BAD (0 - 1) -}
-                             ugo k (c `k` z) p' q -- tail recursive
-
-
-{- liquid_thm_ptr_cmp' :: p:PtrV a
-                        -> q:{v:(PtrV a) | ((plen v) >= (plen p) && v != p && (pbase v) = (pbase p))} 
-                        -> {v: (PtrV a)  | ((v = p) && ((plen v) > 0) && ((plen q) > (plen p))) } 
-  @-}
-liquid_thm_ptr_cmp' :: Ptr a -> Ptr a -> Ptr a
-liquid_thm_ptr_cmp' p q = undefined 
diff --git a/tests/todo/ptr3.hs b/tests/todo/ptr3.hs
deleted file mode 100644
--- a/tests/todo/ptr3.hs
+++ /dev/null
@@ -1,117 +0,0 @@
-{--! run liquid with idirs=../../benchmarks/bytestring-0.9.2.1 idirs=../../include no-termination -}
-{-# OPTIONS_GHC -cpp -fglasgow-exts -fno-warn-orphans #-}
-
--- look for `n0` and `n1` below. Why does this work with `n1` but not `n0` or `0-1` ?
--- the latter is likely some wierd qualifier issue.
-
-
-module Data.ByteString (
-        ByteString,            -- abstract, instances: Eq, Ord, Show, Read, Data, Typeable, Monoid
-  ) where
-
-import Language.Haskell.Liquid.Prelude
-
-import qualified Prelude as P
-import Prelude hiding           (reverse,head,tail,last,init,null
-                                ,length,map,lines,foldl,foldr,unlines
-                                ,concat,any,take,drop,splitAt,takeWhile
-                                ,dropWhile,span,break,elem,filter,maximum
-                                ,minimum,all,concatMap,foldl1,foldr1
-                                ,scanl,scanl1,scanr,scanr1
-                                ,readFile,writeFile,appendFile,replicate
-                                ,getContents,getLine,putStr,putStrLn,interact
-                                ,zip,zipWith,unzip,notElem)
-
-import Data.ByteString.Internal
-import Data.ByteString.Unsafe
-import Data.ByteString.Fusion
-
-import qualified Data.List as List
-
-import Data.Word                (Word8)
-import Data.Maybe               (listToMaybe)
-import Data.Array               (listArray)
-import qualified Data.Array as Array ((!))
-
--- Control.Exception.bracket not available in yhc or nhc
-#ifndef __NHC__
-import Control.Exception        (bracket, assert)
-import qualified Control.Exception as Exception
-#else
-import IO			(bracket)
-#endif
-import Control.Monad            (when)
-
-import Foreign.C.String         (CString, CStringLen)
-import Foreign.C.Types          (CSize)
-import Foreign.ForeignPtr
-import Foreign.Marshal.Alloc    (allocaBytes, mallocBytes, reallocBytes, finalizerFree)
-import Foreign.Marshal.Array    (allocaArray)
-import Foreign.Ptr
-import Foreign.Storable         (Storable(..))
-
--- hGetBuf and hPutBuf not available in yhc or nhc
-import System.IO                (stdin,stdout,hClose,hFileSize
-                                ,hGetBuf,hPutBuf,openBinaryFile
-                                ,Handle,IOMode(..))
-
-import Data.Monoid              (Monoid, mempty, mappend, mconcat)
-
-#if !defined(__GLASGOW_HASKELL__)
-import System.IO.Unsafe
-import qualified System.Environment
-import qualified System.IO      (hGetLine)
-#endif
-
-#if defined(__GLASGOW_HASKELL__)
-
-import System.IO                (hGetBufNonBlocking)
-import System.IO.Error          (isEOFError)
-
-import GHC.Handle
-import GHC.Prim                 (Word#, (+#), writeWord8OffAddr#)
-import GHC.Base                 (build)
-import GHC.Word hiding (Word8)
-import GHC.Ptr                  (Ptr(..))
-import GHC.ST                   (ST(..))
-import GHC.IOBase
-
-#endif
-
--- An alternative to Control.Exception (assert) for nhc98
-#ifdef __NHC__
-#define assert  assertS "__FILE__ : __LINE__"
-assertS :: String -> Bool -> a -> a
-assertS _ True  = id
-assertS s False = error ("assertion failed at "++s)
-#endif
-
--- LIQUID
-import GHC.IO.Buffer
-import Language.Haskell.Liquid.Prelude (intCSize) 
-import qualified Data.ByteString.Lazy.Internal 
-import qualified Data.ByteString.Fusion
-import qualified Data.ByteString.Internal
-import qualified Data.ByteString.Unsafe
-import qualified Foreign.C.Types
-
--- WHY ON EARTH IS THAT LIQUIDASSERT NEEDED?!!!!
-
-{-@ split :: Word8 -> ByteStringNE -> [ByteString] @-}
-split :: Word8 -> ByteString -> [ByteString]
--- split _ (PS _ _ 0) = []
-split w (PS xanadu s l) = inlinePerformIO $ withForeignPtr xanadu $ \pz -> do
-    let p   = liquidAssert (fpLen xanadu == pLen pz) pz
-    let ptr = p `plusPtr` s
-        loop n =
-            let q = inlinePerformIO $ memchr (ptr `plusPtr` n)
-                                           w (fromIntegral (l-n))
-            in if isNullPtr q {- LIQUID q == nullPtr -}
-                then [PS xanadu (s+n) (l-n)]
-                else let i' = q `minusPtr` ptr 
-                         i  = liquidAssert (i < l) i'       -- LIQUID MYSTERY: why is assert NEEDED HERE (it is!)
-                     in PS xanadu (s+n) (i-n) : loop (i+1)
-
-    return (loop 0)
-
-
diff --git a/tests/todo/read.hs b/tests/todo/read.hs
deleted file mode 100644
--- a/tests/todo/read.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-module Read where
-
-import Language.Haskell.Liquid.Prelude
-
-data Foo = Foo deriving Read
-
-bad  = liquidAssertB (0 == 1)
-bad' = liquidAssert  (0 == 1) True
diff --git a/tests/todo/satsolver.hs b/tests/todo/satsolver.hs
deleted file mode 100644
--- a/tests/todo/satsolver.hs
+++ /dev/null
@@ -1,56 +0,0 @@
-module SatSolver where
-
--- | Formula
-
-type Var     = Int
-data Lit     = Pos Var | Neg Var
-type Clause  = [Lit]
-type Formula = [Clause]
-
--- | Assignment
-
-type Asgn = [(Var, Bool)]
-
--- | Top-level "solver"
-
-{-@ solve :: f:_ -> Maybe {a:Asgn | sat a f} @-}
-solve   :: Formula -> Maybe Asgn
-solve f = find (\a -> sat a f) (asgns f) 
-
-find :: (a -> Bool) -> [a] -> Maybe a
-find f [] = Nothing
-find f (x:xs) | f x       = Just x 
-              | otherwise = Nothing 
--- | Generate all assignments
-
-asgns :: Formula -> [Asgn] -- generates all possible T/F vectors
-asgns = undefined
- 
-
--- | Satisfaction
-
-{-@ measure sat @-}
-sat :: Asgn -> Formula -> Bool
-sat a []         = True
-sat a (c:cs)     = satCls a c && sat a cs
-
-{-@ measure satCls @-}
-satCls :: Asgn -> Clause -> Bool
-satCls a []      = False
-satCls a (l:ls)  = satLit a l || satCls a ls
-
-{-@ measure satLit @-}
-satLit :: Asgn -> Lit -> Bool
-satLit a (Pos x) = isTrue x a 
-satLit a (Neg x) = isFalse x a
-
-{-@ measure isTrue @-}
-isTrue           :: Var -> Asgn -> Bool
-isTrue x ((y, v):as)  = if x == y then v else isTrue x as 
-isTrue _ []           = False 
-
-{-@ measure isFalse @-}
-isFalse          :: Var -> Asgn -> Bool
-isFalse x ((y, v):as) = if x == y then not v else isFalse x as 
-isFalse _ []          = False 
-
diff --git a/tests/todo/satsolver0.hs b/tests/todo/satsolver0.hs
deleted file mode 100644
--- a/tests/todo/satsolver0.hs
+++ /dev/null
@@ -1,62 +0,0 @@
-module SatSolver where
-
-{-@ LIQUID "--no-termination" @-}
-
--- | Formula
-
-type Var     = Int
-data Lit     = Pos Var | Neg Var
-type Clause  = [Lit]
-type Formula = [Clause]
-
--- | Assignment
-
-type Asgn = [(Var, Bool)]
-
--- | Top-level "solver"
-
-{-@ solve :: f:_ -> Maybe {a:Asgn | Prop (sat a f)} @-}
-solve   :: Formula -> Maybe Asgn
-solve f = go (asgns f)
-  where
-  	go []     = Nothing
-  	go (x:xs) | sat x f = Just x
-  	          | otherwise = go xs 
-
--- | Generate all assignments
-
-asgns :: Formula -> [Asgn] -- generates all possible T/F vectors
-asgns = undefined
- 
-
--- | Satisfaction
-
-{-@ measure sat :: Asgn -> Formula -> Bool @-}
-sat :: Asgn -> Formula -> Bool
-{-@ sat :: a:Asgn -> f:Formula -> {v:Bool | Prop (sat a f)} @-}
-sat a []         = True
-sat a (c:cs)     = satCls a c && sat a cs
-
-{- measure satCls @-}
-satCls :: Asgn -> Clause -> Bool
-satCls a []      = False
-satCls a (l:ls)  = satLit a l || satCls a ls
-
-{- measure satLit @-}
-satLit :: Asgn -> Lit -> Bool
-satLit a (Pos x) = isTrue x a 
-satLit a (Neg x) = isFalse x a
-
-{- measure isTrue @-}
-isTrue           :: Var -> Asgn -> Bool
-isTrue x ((y, v):as)  = if x == y then v else isTrue x as 
-isTrue _ []           = False 
-
-{- measure isFalse @-}
-isFalse          :: Var -> Asgn -> Bool
-isFalse x ((y, v):as) = if x == y then not v else isFalse x as 
-isFalse _ []          = False
-
-
-
-
diff --git a/tests/todo/splash-total.hs b/tests/todo/splash-total.hs
deleted file mode 100644
--- a/tests/todo/splash-total.hs
+++ /dev/null
@@ -1,162 +0,0 @@
-{-@ LIQUID "--totality" @-}
-
-module SplashTotal where
-
-import Prelude hiding (foldr1, head)
-
-head       :: [a] -> a
-incr       :: Int -> Int
-average    :: [Int] -> Int
-group      :: (Eq a) => [a] -> [[a]]
-foldr1     :: (a -> a -> a) -> [a] -> a
-impossible :: String -> a
-merge      :: Ord a => [a] -> [a] ->  [a]
-fib        :: Int -> Int
-ups        :: [Int]
-insertSort :: (Ord a) => [a] -> [a]
-insert     :: (Ord a) => a -> [a] -> [a]
-
--- REPLACE `-` with `+`
-
-{-@ incr :: Nat -> Nat @-}
-incr x = x + 1
-
-{-@ impossible :: {v: String | False} -> a @-}
-impossible = error
-
---------------------------------------------------------------------------------
-
--- TOTALITY A 1
-{- type NonEmpty a = {v:[a] | 0 < len v } @-}
-
--- replace input with NonEmpty a
-
-
-
-
-
-
-
-{-@ type NonEmpty a = {v:[a] | 0 < len v} @-}
-
-{-@ head :: NonEmpty a -> a @-}
-head (x:_) = x
-
-
-
-
-
-
--- head []    = impossible "head on empty list"
-
-
-
-
-
-
-
-
-
-
--- TOTALITY A 2
-
--- replace output with NonEmpty a
-
-
--- >>> unstutter "ssslllyttthhherrrinnn"
--- "slytherin"
-unstutter :: String -> String
-unstutter = map head . group
-
-{-@ group :: (Eq a) => [a] -> [[a]] @-}
-group []      = []
-group (x:xs)  = (x:ys) : group zs
-  where
-    (ys, zs)  = span (x ==) xs
-
-
-
---------------------------------------------------------------------------------
--- replace input with NonEmpty a
--- ADD signature: foldr1 :: (a -> a -> a) -> {v:[a] | len v > 0} -> a
-
-
-{-@ foldr1 :: (a -> a -> a) -> [a] -> a @-}
-foldr1 op (x:xs) = foldr op x xs
-foldr1 _  _      = impossible "foldr1 on empty list"
-
-{-@ average :: [Int] -> Int @-}
-average xs = foldr1 (+) xs `div` length xs
-
-
---------------------------------------------------------------------------------
-
--- TERMINATION
--- ADD / [len xs + len ys]
-
-
-{-@ fib :: Nat -> Nat @-}
-fib 0 = 1
-fib 1 = 1
-fib n = fib (n-1) + fib (n-2)
-
-
-
-
-
-
-                                              -- .
-
-{-@ merge :: Ord a => xs:[a] -> ys:[a] -> [a]
-                    / [ len xs + len ys]  @-}
-merge xs []         = xs
-merge [] ys         = ys
-merge (x:xs) (y:ys)
-  | x <= y          = x : merge xs (y:ys)
-  | otherwise       = y : merge (x:xs) ys
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------------
-
--- type OrdList a = [a]<{\x v -> x <= v}>       .
--- USER DEFINED INVARIANTS
-
-{-@ type OrdList a = [a]<{\x v -> x <= v}> @-}
-
-
-{-@ ups :: OrdList Int @-}
-ups = [1, 2, 3, 4, 5]
-
-{-@ insertSort :: (Ord a) => [a] -> OrdList a @-}
-insertSort = foldr insert []
-
-{-@ insert :: (Ord a) => a -> OrdList a -> OrdList a @-}
-insert x []     = [x]
-insert x (y:ys)
-  | x <= y      = x : y : ys
-  | otherwise   = y : insert x ys
-
-
-
-
-
---------------------------------------------------------------------------------
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------------
diff --git a/tests/todo/splash-vector.hs b/tests/todo/splash-vector.hs
deleted file mode 100644
--- a/tests/todo/splash-vector.hs
+++ /dev/null
@@ -1,81 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-module SplashVector where
-
-import Prelude hiding (length)
-import Data.Vector (Vector, (!), length)
--- import qualified Data.Vector            as V
-import qualified Data.ByteString        as B
-import qualified Data.ByteString.Unsafe as B
-
-vectorSum :: (Num a) => Vector a -> a
-dotProduct :: (Num a) => Vector a -> Vector a -> a
-
--- vectorSum  :: `[0 .. n] ` with `[0 .. n - 1]`
--- dotProduct :: (Num a) => x:Vector a -> {y:Vector a | vlen y = vlen x} -> a
--- type VectorN a N = {v:Vector a | vlen v == N}
--- dotProduct :: (Num a) => x:Vector a -> VectorN a {vlen x} -> a
-
-
-
-{-@ vectorSum :: (Num a) => Vector a -> a @-}
-vectorSum x = sum [ x ! i | i <- [ 0 .. n - 1 ]]
-  where
-    n       = length x
-
-
-{-@ type VectorN a N = {v:Vector a | vlen v == N} @-}
-
-{- type VectorX a X = {v:Vector a | vlen v == vlen X} -}
-
-{-@ type VectorEq a X = {v:Vector a | vlen v == vlen X} @-}
-
-{-@ dotProduct :: (Num a) => x:Vector a -> VectorEq a x -> a @-}
-dotProduct x y = sum [ (x ! i) * (y ! i) | i <- [0 .. n - 1]]
-  where
-    n          = length x
-
-
-
-
-
-
--- 60
--- 6
--- 16
--- 14
-
-
-liquid :: B.ByteString
-liquid = B.unsafeTake 14 (pack "LiquidHaskell  ")
-
-
-
-{-@ assume pack :: s:String -> {v:B.ByteString | bslen v == len s} @-}
-pack :: String -> B.ByteString
-pack = undefined
-
-{-@ foo :: n:Int -> [{v:Nat | v <= n}] @-}
-foo :: Int -> [Int]
-foo n = [0 .. n]
-
-{-@ assume GHC.Enum.enumFromTo :: (Enum a) => lo:a -> hi:a -> [{v:a | lo <= v && v <= hi}] @-}
-
-{-@ assume B.unsafeTake
-    :: n : Nat
-    -> { i : B.ByteString | n <= bslen i }
-    -> { o : B.ByteString | bslen o == n }
-  @-}
-
-
-
-
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------------
diff --git a/tests/todo/stacks1.hs b/tests/todo/stacks1.hs
deleted file mode 100644
--- a/tests/todo/stacks1.hs
+++ /dev/null
@@ -1,112 +0,0 @@
-module StackSet where
-
-import Data.Set (Set(..)) 
-
-data LL a = Nil | Cons { head :: a, tail :: LL a }
-
-{-@ data LL a = Nil | Cons { head :: a 
-                           , tail :: {v: LL a | not (Set_mem head (LLElts v))  } } 
-  @-}
-
-{-@ measure LLElts     :: LL a -> (Set a) 
-    LLElts (Nil)       = {v | (Set_emp v)}
-    LLElts (Cons x xs) = {v | v = (Set_cup (Set_sng x) (LLElts xs)) }
-  @-}
-
-{-@ predicate Disjoint x y   = (Set_emp (Set_cap x y))            @-}  
-{-@ predicate NotIn    x y = not (Set_mem x (LLElts y))           @-} 
-
-
----------------------------------------------------------------------------------------------
-
-{-@ measure StackElts    :: Stack a -> (Set a) 
-    StackElts (St f u d) = (Set_cup (Set_sng f) (Set_cup (LLElts u) (LLElts d)))
-  @-}
-
-{-@ data Stack a = St { focus  :: a    
-                      , up     :: {vu: LL a | (NotIn focus vu) } 
-                      , down   :: {vd: LL a | ((NotIn focus vd) && (Disjoint (LLElts up) (LLElts vd))) } 
-                      } 
-  @-}
-
-data Stack a = St { focus  :: !a    
-                  , up     :: !(LL a) 
-                  , down   :: !(LL a)
-                  } 
-
----------------------------------------------------------------------------------------------
-
---| Super Vanilla Operations on Stacks
-
-{-@ fresh :: a -> Stack a @-}
-fresh x = St x Nil Nil
-
-{-@ moveUp :: Stack a -> Stack a @-}
-moveUp (St x (Cons y ys) zs) = St y ys (Cons x zs)
-moveUp s                     = s 
-
-{-@ moveDn :: Stack a -> Stack a @-}
-moveDn (St x ys (Cons z zs)) = St z (Cons x ys) zs
-moveDn s                     = s 
-
-
----------------------------------------------------------------------------------------------
-
-{-@ measure MaybeStackElts :: Maybe (Stack a) -> (Set a) 
-    MaybeStackElts Nothing  = {v | (? Set_emp(v))  }
-    MaybeStackElts (Just s) = {v | v = StackElts s }
-  @-}
-
-{-@ measure WorkspaceElts :: Workspace i l a -> (Set a) 
-    WorkspaceElts (Workspace t l s) = (MaybeStackElts s) 
-  @-}
-
-data Workspace i l a = Workspace  { tag :: !i, layout :: l, stack :: Maybe (Stack a) }
-
----------------------------------------------------------------------------------------------
-
-{-@ measure ScreenElts :: Screen i l a sid sd -> (Set a) 
-    ScreenElts (ScreenElts w s d) = (WorkspaceElts w) 
-  @-}
-
-data Screen i l a sid sd = Screen { workspace :: !(Workspace i l a)
-                                  , screen :: !sid
-                                  , screenDetail :: !sd }
-
----------------------------------------------------------------------------------------------
-
-{-@ measure ListScreenElts :: [Screen i l a sid sd] -> (Set a) 
-    ListScreenElts ([])    =  {v | (Set_emp v)}
-    ListScreenElts (x:xs)  =  {v | v = (Set_cup (ScreenElts x) (ListScreenElts xs)) }
-  @-}
-
-
-{-@ measure ListWorkspaceElts :: [Workspace i l a] -> (Set a) 
-    ListWorkspaceElts ([])    =  {v | (Set_emp v)}
-    ListWorkspaceElts (x:xs)  =  {v | v = (Set_cup (WorkspaceElts x) (ListWorkspaceElts xs)) }
-  @-}
-
-data StackSet i l a sid sd =
-    StackSet { current  :: !(Screen i l a sid sd)    
-             , visible  :: {v : [Screen i l a sid sd] | (Disjoint  (ScreenElts current)     (ListScreenElts v)) }
-             , hidden   :: {v : [Workspace i l a]     | ((Disjoint (ScreenElts current)     (ListWorkspaceElts v)) && 
-                                                         (Disjoint (ListScreenElts visible) (ListWorkspaceElts v))) }        
-             , floating :: M.Map a RationalRect
-             } 
-
-data RationalRect = RationalRect Rational Rational Rational Rational
-
-----------------------------------------------------------------------------------------------------------------
-
-new :: (Integral s) => l -> [i] -> [sd] -> StackSet i l a s sd
-new l wids m 
-  | not (null wids) && length m <= length wids && not (null m)
-  = StackSet cur visi unseen M.empty
-  where (seen,unseen) = L.splitAt (length m) $ map (\i -> Workspace i l Nothing) wids
-        (cur:visi)    = [ Screen i s sd |  (i, s, sd) <- zip3 seen [0..] m ]
-                -- now zip up visibles with their screen id
-new _ _ _ = abort "non-positive argument to StackSet.new"
-
-
-abort :: {v: String | (0 = 1) } -> a
-abort x = error $ "xmonad: StackSet: " ++ x
diff --git a/tests/todo/state.hs b/tests/todo/state.hs
deleted file mode 100644
--- a/tests/todo/state.hs
+++ /dev/null
@@ -1,74 +0,0 @@
-module Compose where
-
-
-
-
-data ST s a = ST {runState :: s -> s}
-
-{-@ data ST s a <p :: s -> Prop, q :: s -> s -> Prop> = ST (runState :: x:s<p> -> s<q x>) @-}
-
-
-
-
-{-@ 
-cmp :: forall < pref :: s -> Prop, postf :: s -> s -> Prop
-              , pre  :: s -> Prop, postg :: s -> s -> Prop
-              , post :: s -> s -> Prop
-              >. 
-       {y:s -> s<postg y> -> s<pref>}
-       {x:s<pre> -> z:s<postg x> -> s<postf z> -> s<post x> }
-       f:(ST <pref, postf> s a)
-    -> g:(ST <pre , postg> s b)
-    ->   (ST <pre , post > s b)
-@-}
-
-cmp :: ST s a
-    -> ST s b
-    -> ST s b
-
-cmp (ST f) (ST g) = ST $ \s -> f (g s)
-
-
-{-@ incr :: ST <{\x -> x >= 0}, {\x v -> v = x + 1}> Nat Int @-}
-incr :: ST Int Int 
-incr = ST $ \x -> x + 1
-
-{-@ incr2 :: ST <{\x -> x >= 0}, {\x v -> v = x + 4}> Nat Int @-}
-incr2 :: ST Int Int 
-incr2 = cmp incr incr
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/tests/todo/tdb.hs b/tests/todo/tdb.hs
deleted file mode 100644
--- a/tests/todo/tdb.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module Main where
-
-zero' :: Int
-zero' = 0
-{-@ zero' :: {v: Int | false } @-}
-
--- Throws NASTY GHC error because "Int" is not a tycon * -> *
--- Should be some nicer error message that we can produce...
-{-@ print' :: Int {v: Int | true } -> IO () @-}
-print' :: Int -> IO ()
-print' = print
-
-main = print' zero'
diff --git a/tests/todo/trans.lhs b/tests/todo/trans.lhs
deleted file mode 100644
--- a/tests/todo/trans.lhs
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-module Tx where
-
-import Language.Haskell.Liquid.Prelude
-
-{- THIS IS A RANDOM COMMENT -}
-
-{-@ foo :: x: Int -> Int @-}
-foo :: Int -> Int
-foo x = x + 1
-
-{-@ transpose :: n:Int
-              -> m:{v:Int | v > 0} 
-              -> {v:[{v:[a] | len(v) = n}] | len(v) = m} 
-              -> {v:[{v:[a] | len(v) = m}] | len(v) = n} 
-  @-}
-transpose :: Int -> Int -> [[a]] -> [[a]]
-transpose 0 _ _              = []
-transpose n m ((x:xs) : xss) = (x : map head xss) : transpose (n - 1) m (xs : map tail xss)
-transpose n m ([] : _)       = liquidError "transpose1" 
-transpose n m []             = liquidError "transpose2"
-
--- NEEDS TAGS: map head xss = [ h | (h:_) <- xss]
--- NEEDS TAGS: map tail xss = [t | (_:t) <- xss]
-
-
diff --git a/tests/todo/tupleplus.hs b/tests/todo/tupleplus.hs
deleted file mode 100644
--- a/tests/todo/tupleplus.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-module Goo where
-
-
-{-@ foo :: x:_ -> {v:_ | fst v + snd v = x} @-}
-foo :: Int -> (Int, Int)
-foo x = (2, x-2)
-
-
-{-@ test10 :: {v:_ | Prop v} @-}
-test10     = x + y == 10
-  where
-    (x, y) = foo 10
-
--- THESE are also in GHC.Base.Spec
-{-@ qualif Fst(v:a, y:b): v = fst y @-}
-{-@ qualif Snd(v:a, y:b): v = snd y @-}
-
-
diff --git a/tests/todo/txrec0.hs b/tests/todo/txrec0.hs
deleted file mode 100644
--- a/tests/todo/txrec0.hs
+++ /dev/null
@@ -1,27 +0,0 @@
-module Test where
-
-{-@ type OList a = [a]<{v: a | (v >= fld)}> @-}
-
-{-@ filterGt :: (Ord a) => Maybe a -> OList a -> OList a @-}
-
-filterGt ::  Ord a => Maybe a -> [a] -> [a]
-filterGt Nothing  xs = xs
-filterGt (Just x) xs = filter' x xs
--- The following works fine, because toplevel recs go through TXREC?
--- filterGt (Just x) xs = filter'' x xs
-  where filter' _  []     = [] 
-        filter' b' (x:xs) = case compare b' x of 
-                              GT -> x : filter' b' xs 
-                              LT -> x:xs 
-                              EQ -> xs 
-
-filter'' _  []     = [] 
-filter'' b' (x:xs) = case compare b' x of 
-                      GT -> x : filter'' b' xs 
-                      LT -> x:xs 
-                      EQ -> xs 
-
-
-
-
--- {- filter' :: (Ord a) => a -> OList a -> OList a @-}
diff --git a/tests/todo/vector2.hs b/tests/todo/vector2.hs
deleted file mode 100644
--- a/tests/todo/vector2.hs
+++ /dev/null
@@ -1,15 +0,0 @@
-module Vec0 where
-
-import qualified Data.Vector as V 
-
-propVec = (vs V.! 3) == 3
-  where xs    = [1,2,3,4] :: [Int]
-        vs    = V.fromList xs
-        
-{-@ unsafeLookup :: V.Vector a -> Int -> a @-}
-unsafeLookup x i = x V.! i
-
-{-@ safeLookup :: V.Vector a -> Int -> Maybe a @-}
-safeLookup x i 
-  | 0 <= i && i < V.length x = Just (x V.! i)
-  | otherwise                = Nothing 
