OSDN Git Service

Bring in the Nim implementation.
authorSimon Forman <sforman@hushmail.com>
Sat, 15 Jan 2022 23:30:38 +0000 (15:30 -0800)
committerSimon Forman <sforman@hushmail.com>
Sat, 15 Jan 2022 23:30:38 +0000 (15:30 -0800)
25 files changed:
implementations/nim/README.md [new file with mode: 0644]
implementations/nim/defs.nim [new file with mode: 0644]
implementations/nim/defs.txt [new file with mode: 0644]
implementations/nim/htmldocs/defs.html [new file with mode: 0644]
implementations/nim/htmldocs/defs.idx [new file with mode: 0644]
implementations/nim/htmldocs/dochack.js [new file with mode: 0644]
implementations/nim/htmldocs/joy.html [new file with mode: 0644]
implementations/nim/htmldocs/joylib.html [new file with mode: 0644]
implementations/nim/htmldocs/joylib.idx [new file with mode: 0644]
implementations/nim/htmldocs/nimdoc.out.css [new file with mode: 0644]
implementations/nim/htmldocs/printer.html [new file with mode: 0644]
implementations/nim/htmldocs/printer.idx [new file with mode: 0644]
implementations/nim/htmldocs/reader.html [new file with mode: 0644]
implementations/nim/htmldocs/reader.idx [new file with mode: 0644]
implementations/nim/htmldocs/theindex.html [new file with mode: 0644]
implementations/nim/htmldocs/types.html [new file with mode: 0644]
implementations/nim/htmldocs/types.idx [new file with mode: 0644]
implementations/nim/htmldocs/utils.html [new file with mode: 0644]
implementations/nim/htmldocs/utils.idx [new file with mode: 0644]
implementations/nim/joy.nim [new file with mode: 0644]
implementations/nim/joylib.nim [new file with mode: 0644]
implementations/nim/printer.nim [new file with mode: 0644]
implementations/nim/reader.nim [new file with mode: 0644]
implementations/nim/types.nim [new file with mode: 0644]
implementations/nim/utils.nim [new file with mode: 0644]

diff --git a/implementations/nim/README.md b/implementations/nim/README.md
new file mode 100644 (file)
index 0000000..84cf477
--- /dev/null
@@ -0,0 +1,51 @@
+# Joy interpreter in Nim
+
+This interpreter written in Nim is part of the Thun project, which
+includes interpreters written in Python and Prolog, and some explorations
+towards compilers for Joy written in Prolog.
+
+
+## Building
+
+To build an executable just run:
+
+    nim c joy.nim
+
+To build and immediately run an executable use:
+
+    nim c -r joy.nim
+
+To build a smaller binary do:
+
+    nim c -d:release joy.nim
+    strip --strip-debug joy.exe
+
+
+## Dependencies
+
+- Nim functional programming library https://github.com/vegansk/nimfp
+- Pure Nim (i.e. not GMP) BigInts library https://github.com/def-/nim-bigints
+- ... 
+
+
+## TODOs:
+
+- link to other Thun sub-projects & info on Joy in general
+- ctrl-c should exit cleanly
+- graphics?
+- `words` and `help`?
+- How to integrate docs?
+
+
+nim cc \
+-d:release \
+--stackTrace:off \
+--lineTrace:off \
+--checks:off \
+--assertions:off \
+--debugger:native \
+joy.nim
+
+nim doc --project --index:on --git.url:"https://git.sr.ht/~sforman/Bliss" --git.commit:10b5651ed242fb16c29f2c1f7340d77f65926ca4 --outdir:htmldocs joy.nim
+
+https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/item/types.nim#L26
diff --git a/implementations/nim/defs.nim b/implementations/nim/defs.nim
new file mode 100644 (file)
index 0000000..49c6b4b
--- /dev/null
@@ -0,0 +1,45 @@
+#[
+
+    Copyright © 2021 Simon Forman
+
+    This file is part of Bliss
+
+    Bliss 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 3 of the License, or
+    (at your option) any later version.
+
+    Bliss 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 Bliss.  If not see <http://www.gnu.org/licenses/>.
+
+
+]#
+import streams, strutils, fp, reader, types
+
+proc add_def(def: string, dictionary: var JoyMapType) =
+  let d = read_str(def)
+  let sym = d.head
+  case sym.kind:
+  of joyAtom:
+    dictionary = dictionary + (sym.atomVal, d.tail)
+  else:
+    raise newException(ValueError, def)
+
+proc defs_file2dict(defs_filename: string = "defs.txt"): JoyMapType =
+  var strm = newFileStream(defs_filename, fmRead)
+  var dictionary = newMap[string, JoyListType]()
+  var line = ""
+  if not isNil(strm):
+    while strm.readLine(line):
+      if line.isEmptyOrWhitespace:
+        continue
+      add_def(line, dictionary)
+    strm.close()
+  return dictionary
+
+var dictionary* = defs_file2dict()
diff --git a/implementations/nim/defs.txt b/implementations/nim/defs.txt
new file mode 100644 (file)
index 0000000..5a40424
--- /dev/null
@@ -0,0 +1,115 @@
+-- 1 -
+? dup bool
+&& nulco [nullary [false]] dip branch
+++ 1 +
+|| nulco [nullary] dip [true] branch
+!- 0 >=
+<{} [] swap
+<<{} [] rolldown
+abs dup 0 < [] [neg] branch
+anamorphism [pop []] swap [dip swons] genrec
+app1 grba infrst
+app2 [grba swap grba swap] dip [infrst] cons ii
+app3 3 appN
+appN [grabN] codi map disenstacken
+at drop first
+average [sum] [size] cleave /
+b [i] dip i
+binary unary popd
+ccccons ccons ccons
+ccons cons cons
+clear stack bool [pop stack bool] loop
+cleave fork popdd
+clop cleave popdd
+codi cons dip
+codireco codi reco
+dinfrirst dip infrst
+dipd [dip] codi
+disenstacken ? [uncons ?] loop pop
+down_to_zero [0 >] [dup --] while
+drop [rest] times
+dupd [dup] dip
+dupdd [dup] dipd
+dupdip dupd dip
+dupdipd dup dipd
+enstacken stack [clear] dip
+flatten <{} [concat] step
+fork [i] app2
+fourth rest third
+gcd true [tuck mod dup 0 >] loop pop
+genrec [[genrec] ccccons] nullary swons concat ifte
+grabN <{} [cons] times
+grba [stack popd] dip
+hypot [sqr] ii + sqrt
+ifte [nullary] dipd swap branch
+ii [dip] dupdip i
+infra swons swaack [i] dip swaack
+infrst infra first
+make_generator [codireco] ccons
+mod %
+neg 0 swap -
+not [true] [false] branch
+nulco [nullary] cons
+nullary [stack] dinfrirst
+of swap at
+pam [i] map
+pm [+] [-] clop
+popd [pop] dip
+popdd [pop] dipd
+popop pop pop
+popopop pop popop
+popopd [popop] dip
+popopdd [popop] dipd
+product 1 swap [*] step
+quoted [unit] dip
+range [0 <=] [1 - dup] anamorphism
+range_to_zero unit [down_to_zero] infra
+reco rest cons
+rest [pop] infra
+reverse <{} shunt
+roll> swap swapd
+roll< swapd swap
+rollup roll>
+rolldown roll<
+rrest rest rest
+run <{} infra
+second rest first
+shift uncons [swons] dip
+shunt [swons] step
+size [pop ++] step_zero
+spiral_next [[[abs] ii <=] [[<>] [pop !-] ||] &&] [[!-] [[++]] [[--]] ifte dip] [[pop !-] [--] [++] ifte] ifte
+split_at [drop] [take] clop
+split_list [take reverse] [drop] clop
+sqr dup *
+stackd [stack] dip
+step_zero 0 roll> step
+sum [+] step_zero
+swapd [swap] dip
+swons swap cons
+swoncat swap concat
+tailrec [i] genrec
+take [] roll> [shift] times pop
+ternary binary popd
+third rest second
+tuck dup swapd
+unary nullary popd
+uncons [first] [rest] cleave
+unit [] cons
+unquoted [i] dip
+unswons uncons swap
+while swap nulco dupdipd concat loop
+x dup i
+step [_step0] x
+_step0 _step1 [popopop] [_stept] branch
+_step1 [?] dipd roll<
+_stept [uncons] dipd [dupdipd] dip x
+times [_times0] x
+_times0 _times1 [popopop] [_timest] branch
+_times1 [dup 0 >] dipd roll<
+_timest [[--] dip dupdipd] dip x
+map [_map0] cons [[] [_map?] [_mape]] dip tailrec
+_map? pop bool not
+_mape popd reverse
+_map0 [_map1] dipd _map2
+_map1 stackd shift
+_map2 [infrst] cons dipd roll< swons
diff --git a/implementations/nim/htmldocs/defs.html b/implementations/nim/htmldocs/defs.html
new file mode 100644 (file)
index 0000000..38d6c83
--- /dev/null
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>defs</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">defs</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#8" id="58">Vars</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#dictionary"
+    title="dictionary = defs_file2dict(&quot;defs.txt&quot;)">dictionary</a></li>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="reader.html">reader</a>, <a class="reference external" href="types.html">types</a>
+</dl></div>
+<div class="section" id="8">
+<h1><a class="toc-backref" href="#8">Vars</a></h1>
+<dl class="item">
+<a id="dictionary"></a>
+<dt><pre><a href="defs.html#dictionary"><span class="Identifier">dictionary</span></a> <span class="Other">=</span> <span class="Identifier">defs_file2dict</span><span class="Other">(</span><span class="StringLit">&quot;defs.txt&quot;</span><span class="Other">)</span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/defs.nim#L45"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/defs.nim#L45" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-02-20 03:26:16 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/implementations/nim/htmldocs/defs.idx b/implementations/nim/htmldocs/defs.idx
new file mode 100644 (file)
index 0000000..a112ada
--- /dev/null
@@ -0,0 +1 @@
+dictionary     defs.html#dictionary    defs: dictionary        
diff --git a/implementations/nim/htmldocs/dochack.js b/implementations/nim/htmldocs/dochack.js
new file mode 100644 (file)
index 0000000..a350f8a
--- /dev/null
@@ -0,0 +1,1996 @@
+/* Generated by the Nim Compiler v1.4.2 */
+var framePtr = null;
+var excHandler = 0;
+var lastJSError = null;
+var NTI10436058 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI1214653 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI10595580 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872476 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872472 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872468 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872464 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872460 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872456 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872452 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872448 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872444 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872440 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872436 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872432 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872428 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872424 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872420 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872416 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872412 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872408 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872404 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872400 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872396 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872392 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872388 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1872205 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872293 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872291 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1873628 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1873619 = {size: 0,kind: 25,base: null,node: null,finalizer: null};
+var NTI1873618 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI1872385 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1873626 = {size: 0, kind: 18, base: null, node: null, finalizer: null};
+var NTI1872387 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872269 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872267 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872661 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872273 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872271 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872659 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872657 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872289 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872287 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872655 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872653 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872277 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872275 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872651 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872675 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872281 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872279 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872673 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1208044 = {size: 0,kind: 31,base: null,node: null,finalizer: null};
+var NTI1872767 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872285 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872283 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1208064 = {size: 0,kind: 1,base: null,node: null,finalizer: null};
+var NTI1872231 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872229 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872245 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872243 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872241 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872239 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1872233 = {size: 0, kind: 14, base: null, node: null, finalizer: null};
+var NTI1872614 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872612 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872610 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1872237 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1872235 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1900505 = {size: 0,kind: 24,base: null,node: null,finalizer: null};
+var NTI1214641 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1214649 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1214408 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1214728 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1208013 = {size: 0,kind: 28,base: null,node: null,finalizer: null};
+var NTI1208015 = {size: 0,kind: 29,base: null,node: null,finalizer: null};
+var NTI1214723 = {size: 0,kind: 22,base: null,node: null,finalizer: null};
+var NTI1214617 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1214619 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1214633 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NTI1214637 = {size: 0, kind: 17, base: null, node: null, finalizer: null};
+var NNI1214637 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI1214637.node = NNI1214637;
+var NNI1214633 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI1214633.node = NNI1214633;
+var NNI1214619 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI1214619.node = NNI1214619;
+NTI1214723.base = NTI1214617;
+NTI1214728.base = NTI1214617;
+var NNI1214617 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "parent", len: 0, typ: NTI1214723, name: "parent", sons: null}, 
+{kind: 1, offset: "name", len: 0, typ: NTI1208015, name: "name", sons: null}, 
+{kind: 1, offset: "message", len: 0, typ: NTI1208013, name: "msg", sons: null}, 
+{kind: 1, offset: "trace", len: 0, typ: NTI1208013, name: "trace", sons: null}, 
+{kind: 1, offset: "up", len: 0, typ: NTI1214728, name: "up", sons: null}]};
+NTI1214617.node = NNI1214617;
+var NNI1214408 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI1214408.node = NNI1214408;
+NTI1214617.base = NTI1214408;
+NTI1214619.base = NTI1214617;
+NTI1214633.base = NTI1214619;
+NTI1214637.base = NTI1214633;
+var NNI1214649 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI1214649.node = NNI1214649;
+NTI1214649.base = NTI1214619;
+var NNI1214641 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI1214641.node = NNI1214641;
+NTI1214641.base = NTI1214619;
+NTI1872610.base = NTI1872235;
+NTI1872612.base = NTI1872235;
+NTI1872614.base = NTI1872235;
+var NNI1872233 = {kind: 2, offset: 0, typ: null, name: null, len: 12, sons: {"1": {kind: 1, offset: 1, typ: NTI1872233, name: "ElementNode", len: 0, sons: null}, 
+"2": {kind: 1, offset: 2, typ: NTI1872233, name: "AttributeNode", len: 0, sons: null}, 
+"3": {kind: 1, offset: 3, typ: NTI1872233, name: "TextNode", len: 0, sons: null}, 
+"4": {kind: 1, offset: 4, typ: NTI1872233, name: "CDATANode", len: 0, sons: null}, 
+"5": {kind: 1, offset: 5, typ: NTI1872233, name: "EntityRefNode", len: 0, sons: null}, 
+"6": {kind: 1, offset: 6, typ: NTI1872233, name: "EntityNode", len: 0, sons: null}, 
+"7": {kind: 1, offset: 7, typ: NTI1872233, name: "ProcessingInstructionNode", len: 0, sons: null}, 
+"8": {kind: 1, offset: 8, typ: NTI1872233, name: "CommentNode", len: 0, sons: null}, 
+"9": {kind: 1, offset: 9, typ: NTI1872233, name: "DocumentNode", len: 0, sons: null}, 
+"10": {kind: 1, offset: 10, typ: NTI1872233, name: "DocumentTypeNode", len: 0, sons: null}, 
+"11": {kind: 1, offset: 11, typ: NTI1872233, name: "DocumentFragmentNode", len: 0, sons: null}, 
+"12": {kind: 1, offset: 12, typ: NTI1872233, name: "NotationNode", len: 0, sons: null}}};
+NTI1872233.node = NNI1872233;
+var NNI1872231 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI1872231.node = NNI1872231;
+NTI1872231.base = NTI1214408;
+NTI1872229.base = NTI1872231;
+NTI1872767.base = NTI1872243;
+var NNI1872285 = {kind: 2, len: 10, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "acceptCharset", len: 0, typ: NTI1208015, name: "acceptCharset", sons: null}, 
+{kind: 1, offset: "action", len: 0, typ: NTI1208015, name: "action", sons: null}, 
+{kind: 1, offset: "autocomplete", len: 0, typ: NTI1208015, name: "autocomplete", sons: null}, 
+{kind: 1, offset: "elements", len: 0, typ: NTI1872767, name: "elements", sons: null}, 
+{kind: 1, offset: "encoding", len: 0, typ: NTI1208015, name: "encoding", sons: null}, 
+{kind: 1, offset: "enctype", len: 0, typ: NTI1208015, name: "enctype", sons: null}, 
+{kind: 1, offset: "length", len: 0, typ: NTI1208044, name: "length", sons: null}, 
+{kind: 1, offset: "method", len: 0, typ: NTI1208015, name: "method", sons: null}, 
+{kind: 1, offset: "noValidate", len: 0, typ: NTI1208064, name: "noValidate", sons: null}, 
+{kind: 1, offset: "target", len: 0, typ: NTI1208015, name: "target", sons: null}]};
+NTI1872285.node = NNI1872285;
+NTI1872285.base = NTI1872245;
+NTI1872283.base = NTI1872285;
+var NNI1872281 = {kind: 2, len: 5, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "defaultSelected", len: 0, typ: NTI1208064, name: "defaultSelected", sons: null}, 
+{kind: 1, offset: "selected", len: 0, typ: NTI1208064, name: "selected", sons: null}, 
+{kind: 1, offset: "selectedIndex", len: 0, typ: NTI1208044, name: "selectedIndex", sons: null}, 
+{kind: 1, offset: "text", len: 0, typ: NTI1208015, name: "text", sons: null}, 
+{kind: 1, offset: "value", len: 0, typ: NTI1208015, name: "value", sons: null}]};
+NTI1872281.node = NNI1872281;
+NTI1872281.base = NTI1872245;
+NTI1872279.base = NTI1872281;
+NTI1872673.base = NTI1872279;
+NTI1872675.base = NTI1872279;
+var NNI1872245 = {kind: 2, len: 20, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "className", len: 0, typ: NTI1208015, name: "className", sons: null}, 
+{kind: 1, offset: "classList", len: 0, typ: NTI1872229, name: "classList", sons: null}, 
+{kind: 1, offset: "checked", len: 0, typ: NTI1208064, name: "checked", sons: null}, 
+{kind: 1, offset: "defaultChecked", len: 0, typ: NTI1208064, name: "defaultChecked", sons: null}, 
+{kind: 1, offset: "defaultValue", len: 0, typ: NTI1208015, name: "defaultValue", sons: null}, 
+{kind: 1, offset: "disabled", len: 0, typ: NTI1208064, name: "disabled", sons: null}, 
+{kind: 1, offset: "form", len: 0, typ: NTI1872283, name: "form", sons: null}, 
+{kind: 1, offset: "name", len: 0, typ: NTI1208015, name: "name", sons: null}, 
+{kind: 1, offset: "readOnly", len: 0, typ: NTI1208064, name: "readOnly", sons: null}, 
+{kind: 1, offset: "options", len: 0, typ: NTI1872673, name: "options", sons: null}, 
+{kind: 1, offset: "selectedOptions", len: 0, typ: NTI1872675, name: "selectedOptions", sons: null}, 
+{kind: 1, offset: "clientWidth", len: 0, typ: NTI1208044, name: "clientWidth", sons: null}, 
+{kind: 1, offset: "clientHeight", len: 0, typ: NTI1208044, name: "clientHeight", sons: null}, 
+{kind: 1, offset: "contentEditable", len: 0, typ: NTI1208015, name: "contentEditable", sons: null}, 
+{kind: 1, offset: "isContentEditable", len: 0, typ: NTI1208064, name: "isContentEditable", sons: null}, 
+{kind: 1, offset: "dir", len: 0, typ: NTI1208015, name: "dir", sons: null}, 
+{kind: 1, offset: "offsetHeight", len: 0, typ: NTI1208044, name: "offsetHeight", sons: null}, 
+{kind: 1, offset: "offsetWidth", len: 0, typ: NTI1208044, name: "offsetWidth", sons: null}, 
+{kind: 1, offset: "offsetLeft", len: 0, typ: NTI1208044, name: "offsetLeft", sons: null}, 
+{kind: 1, offset: "offsetTop", len: 0, typ: NTI1208044, name: "offsetTop", sons: null}]};
+NTI1872245.node = NNI1872245;
+NTI1872245.base = NTI1872237;
+NTI1872243.base = NTI1872245;
+var NNI1872277 = {kind: 2, len: 3, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "text", len: 0, typ: NTI1208015, name: "text", sons: null}, 
+{kind: 1, offset: "x", len: 0, typ: NTI1208044, name: "x", sons: null}, 
+{kind: 1, offset: "y", len: 0, typ: NTI1208044, name: "y", sons: null}]};
+NTI1872277.node = NNI1872277;
+NTI1872277.base = NTI1872245;
+NTI1872275.base = NTI1872277;
+NTI1872651.base = NTI1872275;
+NTI1872653.base = NTI1872283;
+var NNI1872289 = {kind: 2, len: 8, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "border", len: 0, typ: NTI1208044, name: "border", sons: null}, 
+{kind: 1, offset: "complete", len: 0, typ: NTI1208064, name: "complete", sons: null}, 
+{kind: 1, offset: "height", len: 0, typ: NTI1208044, name: "height", sons: null}, 
+{kind: 1, offset: "hspace", len: 0, typ: NTI1208044, name: "hspace", sons: null}, 
+{kind: 1, offset: "lowsrc", len: 0, typ: NTI1208015, name: "lowsrc", sons: null}, 
+{kind: 1, offset: "src", len: 0, typ: NTI1208015, name: "src", sons: null}, 
+{kind: 1, offset: "vspace", len: 0, typ: NTI1208044, name: "vspace", sons: null}, 
+{kind: 1, offset: "width", len: 0, typ: NTI1208044, name: "width", sons: null}]};
+NTI1872289.node = NNI1872289;
+NTI1872289.base = NTI1872245;
+NTI1872287.base = NTI1872289;
+NTI1872655.base = NTI1872287;
+NTI1872657.base = NTI1872243;
+var NNI1872273 = {kind: 2, len: 6, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "height", len: 0, typ: NTI1208044, name: "height", sons: null}, 
+{kind: 1, offset: "hspace", len: 0, typ: NTI1208044, name: "hspace", sons: null}, 
+{kind: 1, offset: "src", len: 0, typ: NTI1208015, name: "src", sons: null}, 
+{kind: 1, offset: "width", len: 0, typ: NTI1208044, name: "width", sons: null}, 
+{kind: 1, offset: "type", len: 0, typ: NTI1208015, name: "type", sons: null}, 
+{kind: 1, offset: "vspace", len: 0, typ: NTI1208044, name: "vspace", sons: null}]};
+NTI1872273.node = NNI1872273;
+NTI1872273.base = NTI1872245;
+NTI1872271.base = NTI1872273;
+NTI1872659.base = NTI1872271;
+var NNI1872269 = {kind: 2, len: 4, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "target", len: 0, typ: NTI1208015, name: "target", sons: null}, 
+{kind: 1, offset: "text", len: 0, typ: NTI1208015, name: "text", sons: null}, 
+{kind: 1, offset: "x", len: 0, typ: NTI1208044, name: "x", sons: null}, 
+{kind: 1, offset: "y", len: 0, typ: NTI1208044, name: "y", sons: null}]};
+NTI1872269.node = NNI1872269;
+NTI1872269.base = NTI1872245;
+NTI1872267.base = NTI1872269;
+NTI1872661.base = NTI1872267;
+var NNI1873618 = {kind: 1, offset: "then", len: 0, typ: NTI1873619, name: "then", sons: null};
+NTI1873618.node = NNI1873618;
+NTI1872385.base = NTI1873618;
+var NNI1873626 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "ready", len: 0, typ: NTI1872385, name: "ready", sons: null}, 
+{kind: 1, offset: "onloadingdone", len: 0, typ: NTI1873628, name: "onloadingdone", sons: null}]};
+NTI1873626.node = NNI1873626;
+NTI1872387.base = NTI1873626;
+var NNI1872241 = {kind: 2, len: 23, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "activeElement", len: 0, typ: NTI1872243, name: "activeElement", sons: null}, 
+{kind: 1, offset: "documentElement", len: 0, typ: NTI1872243, name: "documentElement", sons: null}, 
+{kind: 1, offset: "alinkColor", len: 0, typ: NTI1208015, name: "alinkColor", sons: null}, 
+{kind: 1, offset: "bgColor", len: 0, typ: NTI1208015, name: "bgColor", sons: null}, 
+{kind: 1, offset: "body", len: 0, typ: NTI1872243, name: "body", sons: null}, 
+{kind: 1, offset: "charset", len: 0, typ: NTI1208015, name: "charset", sons: null}, 
+{kind: 1, offset: "cookie", len: 0, typ: NTI1208015, name: "cookie", sons: null}, 
+{kind: 1, offset: "defaultCharset", len: 0, typ: NTI1208015, name: "defaultCharset", sons: null}, 
+{kind: 1, offset: "fgColor", len: 0, typ: NTI1208015, name: "fgColor", sons: null}, 
+{kind: 1, offset: "head", len: 0, typ: NTI1872243, name: "head", sons: null}, 
+{kind: 1, offset: "lastModified", len: 0, typ: NTI1208015, name: "lastModified", sons: null}, 
+{kind: 1, offset: "linkColor", len: 0, typ: NTI1208015, name: "linkColor", sons: null}, 
+{kind: 1, offset: "referrer", len: 0, typ: NTI1208015, name: "referrer", sons: null}, 
+{kind: 1, offset: "title", len: 0, typ: NTI1208015, name: "title", sons: null}, 
+{kind: 1, offset: "URL", len: 0, typ: NTI1208015, name: "URL", sons: null}, 
+{kind: 1, offset: "vlinkColor", len: 0, typ: NTI1208015, name: "vlinkColor", sons: null}, 
+{kind: 1, offset: "anchors", len: 0, typ: NTI1872651, name: "anchors", sons: null}, 
+{kind: 1, offset: "forms", len: 0, typ: NTI1872653, name: "forms", sons: null}, 
+{kind: 1, offset: "images", len: 0, typ: NTI1872655, name: "images", sons: null}, 
+{kind: 1, offset: "applets", len: 0, typ: NTI1872657, name: "applets", sons: null}, 
+{kind: 1, offset: "embeds", len: 0, typ: NTI1872659, name: "embeds", sons: null}, 
+{kind: 1, offset: "links", len: 0, typ: NTI1872661, name: "links", sons: null}, 
+{kind: 1, offset: "fonts", len: 0, typ: NTI1872387, name: "fonts", sons: null}]};
+NTI1872241.node = NNI1872241;
+NTI1872241.base = NTI1872237;
+NTI1872239.base = NTI1872241;
+var NNI1872293 = {kind: 2, len: 368, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "alignContent", len: 0, typ: NTI1208015, name: "alignContent", sons: null}, 
+{kind: 1, offset: "alignItems", len: 0, typ: NTI1208015, name: "alignItems", sons: null}, 
+{kind: 1, offset: "alignSelf", len: 0, typ: NTI1208015, name: "alignSelf", sons: null}, 
+{kind: 1, offset: "all", len: 0, typ: NTI1208015, name: "all", sons: null}, 
+{kind: 1, offset: "animation", len: 0, typ: NTI1208015, name: "animation", sons: null}, 
+{kind: 1, offset: "animationDelay", len: 0, typ: NTI1208015, name: "animationDelay", sons: null}, 
+{kind: 1, offset: "animationDirection", len: 0, typ: NTI1208015, name: "animationDirection", sons: null}, 
+{kind: 1, offset: "animationDuration", len: 0, typ: NTI1208015, name: "animationDuration", sons: null}, 
+{kind: 1, offset: "animationFillMode", len: 0, typ: NTI1208015, name: "animationFillMode", sons: null}, 
+{kind: 1, offset: "animationIterationCount", len: 0, typ: NTI1208015, name: "animationIterationCount", sons: null}, 
+{kind: 1, offset: "animationName", len: 0, typ: NTI1208015, name: "animationName", sons: null}, 
+{kind: 1, offset: "animationPlayState", len: 0, typ: NTI1208015, name: "animationPlayState", sons: null}, 
+{kind: 1, offset: "animationTimingFunction", len: 0, typ: NTI1208015, name: "animationTimingFunction", sons: null}, 
+{kind: 1, offset: "backdropFilter", len: 0, typ: NTI1208015, name: "backdropFilter", sons: null}, 
+{kind: 1, offset: "backfaceVisibility", len: 0, typ: NTI1208015, name: "backfaceVisibility", sons: null}, 
+{kind: 1, offset: "background", len: 0, typ: NTI1208015, name: "background", sons: null}, 
+{kind: 1, offset: "backgroundAttachment", len: 0, typ: NTI1208015, name: "backgroundAttachment", sons: null}, 
+{kind: 1, offset: "backgroundBlendMode", len: 0, typ: NTI1208015, name: "backgroundBlendMode", sons: null}, 
+{kind: 1, offset: "backgroundClip", len: 0, typ: NTI1208015, name: "backgroundClip", sons: null}, 
+{kind: 1, offset: "backgroundColor", len: 0, typ: NTI1208015, name: "backgroundColor", sons: null}, 
+{kind: 1, offset: "backgroundImage", len: 0, typ: NTI1208015, name: "backgroundImage", sons: null}, 
+{kind: 1, offset: "backgroundOrigin", len: 0, typ: NTI1208015, name: "backgroundOrigin", sons: null}, 
+{kind: 1, offset: "backgroundPosition", len: 0, typ: NTI1208015, name: "backgroundPosition", sons: null}, 
+{kind: 1, offset: "backgroundRepeat", len: 0, typ: NTI1208015, name: "backgroundRepeat", sons: null}, 
+{kind: 1, offset: "backgroundSize", len: 0, typ: NTI1208015, name: "backgroundSize", sons: null}, 
+{kind: 1, offset: "blockSize", len: 0, typ: NTI1208015, name: "blockSize", sons: null}, 
+{kind: 1, offset: "border", len: 0, typ: NTI1208015, name: "border", sons: null}, 
+{kind: 1, offset: "borderBlock", len: 0, typ: NTI1208015, name: "borderBlock", sons: null}, 
+{kind: 1, offset: "borderBlockColor", len: 0, typ: NTI1208015, name: "borderBlockColor", sons: null}, 
+{kind: 1, offset: "borderBlockEnd", len: 0, typ: NTI1208015, name: "borderBlockEnd", sons: null}, 
+{kind: 1, offset: "borderBlockEndColor", len: 0, typ: NTI1208015, name: "borderBlockEndColor", sons: null}, 
+{kind: 1, offset: "borderBlockEndStyle", len: 0, typ: NTI1208015, name: "borderBlockEndStyle", sons: null}, 
+{kind: 1, offset: "borderBlockEndWidth", len: 0, typ: NTI1208015, name: "borderBlockEndWidth", sons: null}, 
+{kind: 1, offset: "borderBlockStart", len: 0, typ: NTI1208015, name: "borderBlockStart", sons: null}, 
+{kind: 1, offset: "borderBlockStartColor", len: 0, typ: NTI1208015, name: "borderBlockStartColor", sons: null}, 
+{kind: 1, offset: "borderBlockStartStyle", len: 0, typ: NTI1208015, name: "borderBlockStartStyle", sons: null}, 
+{kind: 1, offset: "borderBlockStartWidth", len: 0, typ: NTI1208015, name: "borderBlockStartWidth", sons: null}, 
+{kind: 1, offset: "borderBlockStyle", len: 0, typ: NTI1208015, name: "borderBlockStyle", sons: null}, 
+{kind: 1, offset: "borderBlockWidth", len: 0, typ: NTI1208015, name: "borderBlockWidth", sons: null}, 
+{kind: 1, offset: "borderBottom", len: 0, typ: NTI1208015, name: "borderBottom", sons: null}, 
+{kind: 1, offset: "borderBottomColor", len: 0, typ: NTI1208015, name: "borderBottomColor", sons: null}, 
+{kind: 1, offset: "borderBottomLeftRadius", len: 0, typ: NTI1208015, name: "borderBottomLeftRadius", sons: null}, 
+{kind: 1, offset: "borderBottomRightRadius", len: 0, typ: NTI1208015, name: "borderBottomRightRadius", sons: null}, 
+{kind: 1, offset: "borderBottomStyle", len: 0, typ: NTI1208015, name: "borderBottomStyle", sons: null}, 
+{kind: 1, offset: "borderBottomWidth", len: 0, typ: NTI1208015, name: "borderBottomWidth", sons: null}, 
+{kind: 1, offset: "borderCollapse", len: 0, typ: NTI1208015, name: "borderCollapse", sons: null}, 
+{kind: 1, offset: "borderColor", len: 0, typ: NTI1208015, name: "borderColor", sons: null}, 
+{kind: 1, offset: "borderEndEndRadius", len: 0, typ: NTI1208015, name: "borderEndEndRadius", sons: null}, 
+{kind: 1, offset: "borderEndStartRadius", len: 0, typ: NTI1208015, name: "borderEndStartRadius", sons: null}, 
+{kind: 1, offset: "borderImage", len: 0, typ: NTI1208015, name: "borderImage", sons: null}, 
+{kind: 1, offset: "borderImageOutset", len: 0, typ: NTI1208015, name: "borderImageOutset", sons: null}, 
+{kind: 1, offset: "borderImageRepeat", len: 0, typ: NTI1208015, name: "borderImageRepeat", sons: null}, 
+{kind: 1, offset: "borderImageSlice", len: 0, typ: NTI1208015, name: "borderImageSlice", sons: null}, 
+{kind: 1, offset: "borderImageSource", len: 0, typ: NTI1208015, name: "borderImageSource", sons: null}, 
+{kind: 1, offset: "borderImageWidth", len: 0, typ: NTI1208015, name: "borderImageWidth", sons: null}, 
+{kind: 1, offset: "borderInline", len: 0, typ: NTI1208015, name: "borderInline", sons: null}, 
+{kind: 1, offset: "borderInlineColor", len: 0, typ: NTI1208015, name: "borderInlineColor", sons: null}, 
+{kind: 1, offset: "borderInlineEnd", len: 0, typ: NTI1208015, name: "borderInlineEnd", sons: null}, 
+{kind: 1, offset: "borderInlineEndColor", len: 0, typ: NTI1208015, name: "borderInlineEndColor", sons: null}, 
+{kind: 1, offset: "borderInlineEndStyle", len: 0, typ: NTI1208015, name: "borderInlineEndStyle", sons: null}, 
+{kind: 1, offset: "borderInlineEndWidth", len: 0, typ: NTI1208015, name: "borderInlineEndWidth", sons: null}, 
+{kind: 1, offset: "borderInlineStart", len: 0, typ: NTI1208015, name: "borderInlineStart", sons: null}, 
+{kind: 1, offset: "borderInlineStartColor", len: 0, typ: NTI1208015, name: "borderInlineStartColor", sons: null}, 
+{kind: 1, offset: "borderInlineStartStyle", len: 0, typ: NTI1208015, name: "borderInlineStartStyle", sons: null}, 
+{kind: 1, offset: "borderInlineStartWidth", len: 0, typ: NTI1208015, name: "borderInlineStartWidth", sons: null}, 
+{kind: 1, offset: "borderInlineStyle", len: 0, typ: NTI1208015, name: "borderInlineStyle", sons: null}, 
+{kind: 1, offset: "borderInlineWidth", len: 0, typ: NTI1208015, name: "borderInlineWidth", sons: null}, 
+{kind: 1, offset: "borderLeft", len: 0, typ: NTI1208015, name: "borderLeft", sons: null}, 
+{kind: 1, offset: "borderLeftColor", len: 0, typ: NTI1208015, name: "borderLeftColor", sons: null}, 
+{kind: 1, offset: "borderLeftStyle", len: 0, typ: NTI1208015, name: "borderLeftStyle", sons: null}, 
+{kind: 1, offset: "borderLeftWidth", len: 0, typ: NTI1208015, name: "borderLeftWidth", sons: null}, 
+{kind: 1, offset: "borderRadius", len: 0, typ: NTI1208015, name: "borderRadius", sons: null}, 
+{kind: 1, offset: "borderRight", len: 0, typ: NTI1208015, name: "borderRight", sons: null}, 
+{kind: 1, offset: "borderRightColor", len: 0, typ: NTI1208015, name: "borderRightColor", sons: null}, 
+{kind: 1, offset: "borderRightStyle", len: 0, typ: NTI1208015, name: "borderRightStyle", sons: null}, 
+{kind: 1, offset: "borderRightWidth", len: 0, typ: NTI1208015, name: "borderRightWidth", sons: null}, 
+{kind: 1, offset: "borderSpacing", len: 0, typ: NTI1208015, name: "borderSpacing", sons: null}, 
+{kind: 1, offset: "borderStartEndRadius", len: 0, typ: NTI1208015, name: "borderStartEndRadius", sons: null}, 
+{kind: 1, offset: "borderStartStartRadius", len: 0, typ: NTI1208015, name: "borderStartStartRadius", sons: null}, 
+{kind: 1, offset: "borderStyle", len: 0, typ: NTI1208015, name: "borderStyle", sons: null}, 
+{kind: 1, offset: "borderTop", len: 0, typ: NTI1208015, name: "borderTop", sons: null}, 
+{kind: 1, offset: "borderTopColor", len: 0, typ: NTI1208015, name: "borderTopColor", sons: null}, 
+{kind: 1, offset: "borderTopLeftRadius", len: 0, typ: NTI1208015, name: "borderTopLeftRadius", sons: null}, 
+{kind: 1, offset: "borderTopRightRadius", len: 0, typ: NTI1208015, name: "borderTopRightRadius", sons: null}, 
+{kind: 1, offset: "borderTopStyle", len: 0, typ: NTI1208015, name: "borderTopStyle", sons: null}, 
+{kind: 1, offset: "borderTopWidth", len: 0, typ: NTI1208015, name: "borderTopWidth", sons: null}, 
+{kind: 1, offset: "borderWidth", len: 0, typ: NTI1208015, name: "borderWidth", sons: null}, 
+{kind: 1, offset: "bottom", len: 0, typ: NTI1208015, name: "bottom", sons: null}, 
+{kind: 1, offset: "boxDecorationBreak", len: 0, typ: NTI1208015, name: "boxDecorationBreak", sons: null}, 
+{kind: 1, offset: "boxShadow", len: 0, typ: NTI1208015, name: "boxShadow", sons: null}, 
+{kind: 1, offset: "boxSizing", len: 0, typ: NTI1208015, name: "boxSizing", sons: null}, 
+{kind: 1, offset: "breakAfter", len: 0, typ: NTI1208015, name: "breakAfter", sons: null}, 
+{kind: 1, offset: "breakBefore", len: 0, typ: NTI1208015, name: "breakBefore", sons: null}, 
+{kind: 1, offset: "breakInside", len: 0, typ: NTI1208015, name: "breakInside", sons: null}, 
+{kind: 1, offset: "captionSide", len: 0, typ: NTI1208015, name: "captionSide", sons: null}, 
+{kind: 1, offset: "caretColor", len: 0, typ: NTI1208015, name: "caretColor", sons: null}, 
+{kind: 1, offset: "clear", len: 0, typ: NTI1208015, name: "clear", sons: null}, 
+{kind: 1, offset: "clip", len: 0, typ: NTI1208015, name: "clip", sons: null}, 
+{kind: 1, offset: "clipPath", len: 0, typ: NTI1208015, name: "clipPath", sons: null}, 
+{kind: 1, offset: "color", len: 0, typ: NTI1208015, name: "color", sons: null}, 
+{kind: 1, offset: "colorAdjust", len: 0, typ: NTI1208015, name: "colorAdjust", sons: null}, 
+{kind: 1, offset: "columnCount", len: 0, typ: NTI1208015, name: "columnCount", sons: null}, 
+{kind: 1, offset: "columnFill", len: 0, typ: NTI1208015, name: "columnFill", sons: null}, 
+{kind: 1, offset: "columnGap", len: 0, typ: NTI1208015, name: "columnGap", sons: null}, 
+{kind: 1, offset: "columnRule", len: 0, typ: NTI1208015, name: "columnRule", sons: null}, 
+{kind: 1, offset: "columnRuleColor", len: 0, typ: NTI1208015, name: "columnRuleColor", sons: null}, 
+{kind: 1, offset: "columnRuleStyle", len: 0, typ: NTI1208015, name: "columnRuleStyle", sons: null}, 
+{kind: 1, offset: "columnRuleWidth", len: 0, typ: NTI1208015, name: "columnRuleWidth", sons: null}, 
+{kind: 1, offset: "columnSpan", len: 0, typ: NTI1208015, name: "columnSpan", sons: null}, 
+{kind: 1, offset: "columnWidth", len: 0, typ: NTI1208015, name: "columnWidth", sons: null}, 
+{kind: 1, offset: "columns", len: 0, typ: NTI1208015, name: "columns", sons: null}, 
+{kind: 1, offset: "contain", len: 0, typ: NTI1208015, name: "contain", sons: null}, 
+{kind: 1, offset: "content", len: 0, typ: NTI1208015, name: "content", sons: null}, 
+{kind: 1, offset: "counterIncrement", len: 0, typ: NTI1208015, name: "counterIncrement", sons: null}, 
+{kind: 1, offset: "counterReset", len: 0, typ: NTI1208015, name: "counterReset", sons: null}, 
+{kind: 1, offset: "counterSet", len: 0, typ: NTI1208015, name: "counterSet", sons: null}, 
+{kind: 1, offset: "cursor", len: 0, typ: NTI1208015, name: "cursor", sons: null}, 
+{kind: 1, offset: "direction", len: 0, typ: NTI1208015, name: "direction", sons: null}, 
+{kind: 1, offset: "display", len: 0, typ: NTI1208015, name: "display", sons: null}, 
+{kind: 1, offset: "emptyCells", len: 0, typ: NTI1208015, name: "emptyCells", sons: null}, 
+{kind: 1, offset: "filter", len: 0, typ: NTI1208015, name: "filter", sons: null}, 
+{kind: 1, offset: "flex", len: 0, typ: NTI1208015, name: "flex", sons: null}, 
+{kind: 1, offset: "flexBasis", len: 0, typ: NTI1208015, name: "flexBasis", sons: null}, 
+{kind: 1, offset: "flexDirection", len: 0, typ: NTI1208015, name: "flexDirection", sons: null}, 
+{kind: 1, offset: "flexFlow", len: 0, typ: NTI1208015, name: "flexFlow", sons: null}, 
+{kind: 1, offset: "flexGrow", len: 0, typ: NTI1208015, name: "flexGrow", sons: null}, 
+{kind: 1, offset: "flexShrink", len: 0, typ: NTI1208015, name: "flexShrink", sons: null}, 
+{kind: 1, offset: "flexWrap", len: 0, typ: NTI1208015, name: "flexWrap", sons: null}, 
+{kind: 1, offset: "cssFloat", len: 0, typ: NTI1208015, name: "cssFloat", sons: null}, 
+{kind: 1, offset: "font", len: 0, typ: NTI1208015, name: "font", sons: null}, 
+{kind: 1, offset: "fontFamily", len: 0, typ: NTI1208015, name: "fontFamily", sons: null}, 
+{kind: 1, offset: "fontFeatureSettings", len: 0, typ: NTI1208015, name: "fontFeatureSettings", sons: null}, 
+{kind: 1, offset: "fontKerning", len: 0, typ: NTI1208015, name: "fontKerning", sons: null}, 
+{kind: 1, offset: "fontLanguageOverride", len: 0, typ: NTI1208015, name: "fontLanguageOverride", sons: null}, 
+{kind: 1, offset: "fontOpticalSizing", len: 0, typ: NTI1208015, name: "fontOpticalSizing", sons: null}, 
+{kind: 1, offset: "fontSize", len: 0, typ: NTI1208015, name: "fontSize", sons: null}, 
+{kind: 1, offset: "fontSizeAdjust", len: 0, typ: NTI1208015, name: "fontSizeAdjust", sons: null}, 
+{kind: 1, offset: "fontStretch", len: 0, typ: NTI1208015, name: "fontStretch", sons: null}, 
+{kind: 1, offset: "fontStyle", len: 0, typ: NTI1208015, name: "fontStyle", sons: null}, 
+{kind: 1, offset: "fontSynthesis", len: 0, typ: NTI1208015, name: "fontSynthesis", sons: null}, 
+{kind: 1, offset: "fontVariant", len: 0, typ: NTI1208015, name: "fontVariant", sons: null}, 
+{kind: 1, offset: "fontVariantAlternates", len: 0, typ: NTI1208015, name: "fontVariantAlternates", sons: null}, 
+{kind: 1, offset: "fontVariantCaps", len: 0, typ: NTI1208015, name: "fontVariantCaps", sons: null}, 
+{kind: 1, offset: "fontVariantEastAsian", len: 0, typ: NTI1208015, name: "fontVariantEastAsian", sons: null}, 
+{kind: 1, offset: "fontVariantLigatures", len: 0, typ: NTI1208015, name: "fontVariantLigatures", sons: null}, 
+{kind: 1, offset: "fontVariantNumeric", len: 0, typ: NTI1208015, name: "fontVariantNumeric", sons: null}, 
+{kind: 1, offset: "fontVariantPosition", len: 0, typ: NTI1208015, name: "fontVariantPosition", sons: null}, 
+{kind: 1, offset: "fontVariationSettings", len: 0, typ: NTI1208015, name: "fontVariationSettings", sons: null}, 
+{kind: 1, offset: "fontWeight", len: 0, typ: NTI1208015, name: "fontWeight", sons: null}, 
+{kind: 1, offset: "gap", len: 0, typ: NTI1208015, name: "gap", sons: null}, 
+{kind: 1, offset: "grid", len: 0, typ: NTI1208015, name: "grid", sons: null}, 
+{kind: 1, offset: "gridArea", len: 0, typ: NTI1208015, name: "gridArea", sons: null}, 
+{kind: 1, offset: "gridAutoColumns", len: 0, typ: NTI1208015, name: "gridAutoColumns", sons: null}, 
+{kind: 1, offset: "gridAutoFlow", len: 0, typ: NTI1208015, name: "gridAutoFlow", sons: null}, 
+{kind: 1, offset: "gridAutoRows", len: 0, typ: NTI1208015, name: "gridAutoRows", sons: null}, 
+{kind: 1, offset: "gridColumn", len: 0, typ: NTI1208015, name: "gridColumn", sons: null}, 
+{kind: 1, offset: "gridColumnEnd", len: 0, typ: NTI1208015, name: "gridColumnEnd", sons: null}, 
+{kind: 1, offset: "gridColumnStart", len: 0, typ: NTI1208015, name: "gridColumnStart", sons: null}, 
+{kind: 1, offset: "gridRow", len: 0, typ: NTI1208015, name: "gridRow", sons: null}, 
+{kind: 1, offset: "gridRowEnd", len: 0, typ: NTI1208015, name: "gridRowEnd", sons: null}, 
+{kind: 1, offset: "gridRowStart", len: 0, typ: NTI1208015, name: "gridRowStart", sons: null}, 
+{kind: 1, offset: "gridTemplate", len: 0, typ: NTI1208015, name: "gridTemplate", sons: null}, 
+{kind: 1, offset: "gridTemplateAreas", len: 0, typ: NTI1208015, name: "gridTemplateAreas", sons: null}, 
+{kind: 1, offset: "gridTemplateColumns", len: 0, typ: NTI1208015, name: "gridTemplateColumns", sons: null}, 
+{kind: 1, offset: "gridTemplateRows", len: 0, typ: NTI1208015, name: "gridTemplateRows", sons: null}, 
+{kind: 1, offset: "hangingPunctuation", len: 0, typ: NTI1208015, name: "hangingPunctuation", sons: null}, 
+{kind: 1, offset: "height", len: 0, typ: NTI1208015, name: "height", sons: null}, 
+{kind: 1, offset: "hyphens", len: 0, typ: NTI1208015, name: "hyphens", sons: null}, 
+{kind: 1, offset: "imageOrientation", len: 0, typ: NTI1208015, name: "imageOrientation", sons: null}, 
+{kind: 1, offset: "imageRendering", len: 0, typ: NTI1208015, name: "imageRendering", sons: null}, 
+{kind: 1, offset: "inlineSize", len: 0, typ: NTI1208015, name: "inlineSize", sons: null}, 
+{kind: 1, offset: "inset", len: 0, typ: NTI1208015, name: "inset", sons: null}, 
+{kind: 1, offset: "insetBlock", len: 0, typ: NTI1208015, name: "insetBlock", sons: null}, 
+{kind: 1, offset: "insetBlockEnd", len: 0, typ: NTI1208015, name: "insetBlockEnd", sons: null}, 
+{kind: 1, offset: "insetBlockStart", len: 0, typ: NTI1208015, name: "insetBlockStart", sons: null}, 
+{kind: 1, offset: "insetInline", len: 0, typ: NTI1208015, name: "insetInline", sons: null}, 
+{kind: 1, offset: "insetInlineEnd", len: 0, typ: NTI1208015, name: "insetInlineEnd", sons: null}, 
+{kind: 1, offset: "insetInlineStart", len: 0, typ: NTI1208015, name: "insetInlineStart", sons: null}, 
+{kind: 1, offset: "isolation", len: 0, typ: NTI1208015, name: "isolation", sons: null}, 
+{kind: 1, offset: "justifyContent", len: 0, typ: NTI1208015, name: "justifyContent", sons: null}, 
+{kind: 1, offset: "justifyItems", len: 0, typ: NTI1208015, name: "justifyItems", sons: null}, 
+{kind: 1, offset: "justifySelf", len: 0, typ: NTI1208015, name: "justifySelf", sons: null}, 
+{kind: 1, offset: "left", len: 0, typ: NTI1208015, name: "left", sons: null}, 
+{kind: 1, offset: "letterSpacing", len: 0, typ: NTI1208015, name: "letterSpacing", sons: null}, 
+{kind: 1, offset: "lineBreak", len: 0, typ: NTI1208015, name: "lineBreak", sons: null}, 
+{kind: 1, offset: "lineHeight", len: 0, typ: NTI1208015, name: "lineHeight", sons: null}, 
+{kind: 1, offset: "listStyle", len: 0, typ: NTI1208015, name: "listStyle", sons: null}, 
+{kind: 1, offset: "listStyleImage", len: 0, typ: NTI1208015, name: "listStyleImage", sons: null}, 
+{kind: 1, offset: "listStylePosition", len: 0, typ: NTI1208015, name: "listStylePosition", sons: null}, 
+{kind: 1, offset: "listStyleType", len: 0, typ: NTI1208015, name: "listStyleType", sons: null}, 
+{kind: 1, offset: "margin", len: 0, typ: NTI1208015, name: "margin", sons: null}, 
+{kind: 1, offset: "marginBlock", len: 0, typ: NTI1208015, name: "marginBlock", sons: null}, 
+{kind: 1, offset: "marginBlockEnd", len: 0, typ: NTI1208015, name: "marginBlockEnd", sons: null}, 
+{kind: 1, offset: "marginBlockStart", len: 0, typ: NTI1208015, name: "marginBlockStart", sons: null}, 
+{kind: 1, offset: "marginBottom", len: 0, typ: NTI1208015, name: "marginBottom", sons: null}, 
+{kind: 1, offset: "marginInline", len: 0, typ: NTI1208015, name: "marginInline", sons: null}, 
+{kind: 1, offset: "marginInlineEnd", len: 0, typ: NTI1208015, name: "marginInlineEnd", sons: null}, 
+{kind: 1, offset: "marginInlineStart", len: 0, typ: NTI1208015, name: "marginInlineStart", sons: null}, 
+{kind: 1, offset: "marginLeft", len: 0, typ: NTI1208015, name: "marginLeft", sons: null}, 
+{kind: 1, offset: "marginRight", len: 0, typ: NTI1208015, name: "marginRight", sons: null}, 
+{kind: 1, offset: "marginTop", len: 0, typ: NTI1208015, name: "marginTop", sons: null}, 
+{kind: 1, offset: "mask", len: 0, typ: NTI1208015, name: "mask", sons: null}, 
+{kind: 1, offset: "maskBorder", len: 0, typ: NTI1208015, name: "maskBorder", sons: null}, 
+{kind: 1, offset: "maskBorderMode", len: 0, typ: NTI1208015, name: "maskBorderMode", sons: null}, 
+{kind: 1, offset: "maskBorderOutset", len: 0, typ: NTI1208015, name: "maskBorderOutset", sons: null}, 
+{kind: 1, offset: "maskBorderRepeat", len: 0, typ: NTI1208015, name: "maskBorderRepeat", sons: null}, 
+{kind: 1, offset: "maskBorderSlice", len: 0, typ: NTI1208015, name: "maskBorderSlice", sons: null}, 
+{kind: 1, offset: "maskBorderSource", len: 0, typ: NTI1208015, name: "maskBorderSource", sons: null}, 
+{kind: 1, offset: "maskBorderWidth", len: 0, typ: NTI1208015, name: "maskBorderWidth", sons: null}, 
+{kind: 1, offset: "maskClip", len: 0, typ: NTI1208015, name: "maskClip", sons: null}, 
+{kind: 1, offset: "maskComposite", len: 0, typ: NTI1208015, name: "maskComposite", sons: null}, 
+{kind: 1, offset: "maskImage", len: 0, typ: NTI1208015, name: "maskImage", sons: null}, 
+{kind: 1, offset: "maskMode", len: 0, typ: NTI1208015, name: "maskMode", sons: null}, 
+{kind: 1, offset: "maskOrigin", len: 0, typ: NTI1208015, name: "maskOrigin", sons: null}, 
+{kind: 1, offset: "maskPosition", len: 0, typ: NTI1208015, name: "maskPosition", sons: null}, 
+{kind: 1, offset: "maskRepeat", len: 0, typ: NTI1208015, name: "maskRepeat", sons: null}, 
+{kind: 1, offset: "maskSize", len: 0, typ: NTI1208015, name: "maskSize", sons: null}, 
+{kind: 1, offset: "maskType", len: 0, typ: NTI1208015, name: "maskType", sons: null}, 
+{kind: 1, offset: "maxBlockSize", len: 0, typ: NTI1208015, name: "maxBlockSize", sons: null}, 
+{kind: 1, offset: "maxHeight", len: 0, typ: NTI1208015, name: "maxHeight", sons: null}, 
+{kind: 1, offset: "maxInlineSize", len: 0, typ: NTI1208015, name: "maxInlineSize", sons: null}, 
+{kind: 1, offset: "maxWidth", len: 0, typ: NTI1208015, name: "maxWidth", sons: null}, 
+{kind: 1, offset: "minBlockSize", len: 0, typ: NTI1208015, name: "minBlockSize", sons: null}, 
+{kind: 1, offset: "minHeight", len: 0, typ: NTI1208015, name: "minHeight", sons: null}, 
+{kind: 1, offset: "minInlineSize", len: 0, typ: NTI1208015, name: "minInlineSize", sons: null}, 
+{kind: 1, offset: "minWidth", len: 0, typ: NTI1208015, name: "minWidth", sons: null}, 
+{kind: 1, offset: "mixBlendMode", len: 0, typ: NTI1208015, name: "mixBlendMode", sons: null}, 
+{kind: 1, offset: "objectFit", len: 0, typ: NTI1208015, name: "objectFit", sons: null}, 
+{kind: 1, offset: "objectPosition", len: 0, typ: NTI1208015, name: "objectPosition", sons: null}, 
+{kind: 1, offset: "offset", len: 0, typ: NTI1208015, name: "offset", sons: null}, 
+{kind: 1, offset: "offsetAnchor", len: 0, typ: NTI1208015, name: "offsetAnchor", sons: null}, 
+{kind: 1, offset: "offsetDistance", len: 0, typ: NTI1208015, name: "offsetDistance", sons: null}, 
+{kind: 1, offset: "offsetPath", len: 0, typ: NTI1208015, name: "offsetPath", sons: null}, 
+{kind: 1, offset: "offsetRotate", len: 0, typ: NTI1208015, name: "offsetRotate", sons: null}, 
+{kind: 1, offset: "opacity", len: 0, typ: NTI1208015, name: "opacity", sons: null}, 
+{kind: 1, offset: "order", len: 0, typ: NTI1208015, name: "order", sons: null}, 
+{kind: 1, offset: "orphans", len: 0, typ: NTI1208015, name: "orphans", sons: null}, 
+{kind: 1, offset: "outline", len: 0, typ: NTI1208015, name: "outline", sons: null}, 
+{kind: 1, offset: "outlineColor", len: 0, typ: NTI1208015, name: "outlineColor", sons: null}, 
+{kind: 1, offset: "outlineOffset", len: 0, typ: NTI1208015, name: "outlineOffset", sons: null}, 
+{kind: 1, offset: "outlineStyle", len: 0, typ: NTI1208015, name: "outlineStyle", sons: null}, 
+{kind: 1, offset: "outlineWidth", len: 0, typ: NTI1208015, name: "outlineWidth", sons: null}, 
+{kind: 1, offset: "overflow", len: 0, typ: NTI1208015, name: "overflow", sons: null}, 
+{kind: 1, offset: "overflowAnchor", len: 0, typ: NTI1208015, name: "overflowAnchor", sons: null}, 
+{kind: 1, offset: "overflowBlock", len: 0, typ: NTI1208015, name: "overflowBlock", sons: null}, 
+{kind: 1, offset: "overflowInline", len: 0, typ: NTI1208015, name: "overflowInline", sons: null}, 
+{kind: 1, offset: "overflowWrap", len: 0, typ: NTI1208015, name: "overflowWrap", sons: null}, 
+{kind: 1, offset: "overflowX", len: 0, typ: NTI1208015, name: "overflowX", sons: null}, 
+{kind: 1, offset: "overflowY", len: 0, typ: NTI1208015, name: "overflowY", sons: null}, 
+{kind: 1, offset: "overscrollBehavior", len: 0, typ: NTI1208015, name: "overscrollBehavior", sons: null}, 
+{kind: 1, offset: "overscrollBehaviorBlock", len: 0, typ: NTI1208015, name: "overscrollBehaviorBlock", sons: null}, 
+{kind: 1, offset: "overscrollBehaviorInline", len: 0, typ: NTI1208015, name: "overscrollBehaviorInline", sons: null}, 
+{kind: 1, offset: "overscrollBehaviorX", len: 0, typ: NTI1208015, name: "overscrollBehaviorX", sons: null}, 
+{kind: 1, offset: "overscrollBehaviorY", len: 0, typ: NTI1208015, name: "overscrollBehaviorY", sons: null}, 
+{kind: 1, offset: "padding", len: 0, typ: NTI1208015, name: "padding", sons: null}, 
+{kind: 1, offset: "paddingBlock", len: 0, typ: NTI1208015, name: "paddingBlock", sons: null}, 
+{kind: 1, offset: "paddingBlockEnd", len: 0, typ: NTI1208015, name: "paddingBlockEnd", sons: null}, 
+{kind: 1, offset: "paddingBlockStart", len: 0, typ: NTI1208015, name: "paddingBlockStart", sons: null}, 
+{kind: 1, offset: "paddingBottom", len: 0, typ: NTI1208015, name: "paddingBottom", sons: null}, 
+{kind: 1, offset: "paddingInline", len: 0, typ: NTI1208015, name: "paddingInline", sons: null}, 
+{kind: 1, offset: "paddingInlineEnd", len: 0, typ: NTI1208015, name: "paddingInlineEnd", sons: null}, 
+{kind: 1, offset: "paddingInlineStart", len: 0, typ: NTI1208015, name: "paddingInlineStart", sons: null}, 
+{kind: 1, offset: "paddingLeft", len: 0, typ: NTI1208015, name: "paddingLeft", sons: null}, 
+{kind: 1, offset: "paddingRight", len: 0, typ: NTI1208015, name: "paddingRight", sons: null}, 
+{kind: 1, offset: "paddingTop", len: 0, typ: NTI1208015, name: "paddingTop", sons: null}, 
+{kind: 1, offset: "pageBreakAfter", len: 0, typ: NTI1208015, name: "pageBreakAfter", sons: null}, 
+{kind: 1, offset: "pageBreakBefore", len: 0, typ: NTI1208015, name: "pageBreakBefore", sons: null}, 
+{kind: 1, offset: "pageBreakInside", len: 0, typ: NTI1208015, name: "pageBreakInside", sons: null}, 
+{kind: 1, offset: "paintOrder", len: 0, typ: NTI1208015, name: "paintOrder", sons: null}, 
+{kind: 1, offset: "perspective", len: 0, typ: NTI1208015, name: "perspective", sons: null}, 
+{kind: 1, offset: "perspectiveOrigin", len: 0, typ: NTI1208015, name: "perspectiveOrigin", sons: null}, 
+{kind: 1, offset: "placeContent", len: 0, typ: NTI1208015, name: "placeContent", sons: null}, 
+{kind: 1, offset: "placeItems", len: 0, typ: NTI1208015, name: "placeItems", sons: null}, 
+{kind: 1, offset: "placeSelf", len: 0, typ: NTI1208015, name: "placeSelf", sons: null}, 
+{kind: 1, offset: "pointerEvents", len: 0, typ: NTI1208015, name: "pointerEvents", sons: null}, 
+{kind: 1, offset: "position", len: 0, typ: NTI1208015, name: "position", sons: null}, 
+{kind: 1, offset: "quotes", len: 0, typ: NTI1208015, name: "quotes", sons: null}, 
+{kind: 1, offset: "resize", len: 0, typ: NTI1208015, name: "resize", sons: null}, 
+{kind: 1, offset: "right", len: 0, typ: NTI1208015, name: "right", sons: null}, 
+{kind: 1, offset: "rotate", len: 0, typ: NTI1208015, name: "rotate", sons: null}, 
+{kind: 1, offset: "rowGap", len: 0, typ: NTI1208015, name: "rowGap", sons: null}, 
+{kind: 1, offset: "scale", len: 0, typ: NTI1208015, name: "scale", sons: null}, 
+{kind: 1, offset: "scrollBehavior", len: 0, typ: NTI1208015, name: "scrollBehavior", sons: null}, 
+{kind: 1, offset: "scrollMargin", len: 0, typ: NTI1208015, name: "scrollMargin", sons: null}, 
+{kind: 1, offset: "scrollMarginBlock", len: 0, typ: NTI1208015, name: "scrollMarginBlock", sons: null}, 
+{kind: 1, offset: "scrollMarginBlockEnd", len: 0, typ: NTI1208015, name: "scrollMarginBlockEnd", sons: null}, 
+{kind: 1, offset: "scrollMarginBlockStart", len: 0, typ: NTI1208015, name: "scrollMarginBlockStart", sons: null}, 
+{kind: 1, offset: "scrollMarginBottom", len: 0, typ: NTI1208015, name: "scrollMarginBottom", sons: null}, 
+{kind: 1, offset: "scrollMarginInline", len: 0, typ: NTI1208015, name: "scrollMarginInline", sons: null}, 
+{kind: 1, offset: "scrollMarginInlineEnd", len: 0, typ: NTI1208015, name: "scrollMarginInlineEnd", sons: null}, 
+{kind: 1, offset: "scrollMarginInlineStart", len: 0, typ: NTI1208015, name: "scrollMarginInlineStart", sons: null}, 
+{kind: 1, offset: "scrollMarginLeft", len: 0, typ: NTI1208015, name: "scrollMarginLeft", sons: null}, 
+{kind: 1, offset: "scrollMarginRight", len: 0, typ: NTI1208015, name: "scrollMarginRight", sons: null}, 
+{kind: 1, offset: "scrollMarginTop", len: 0, typ: NTI1208015, name: "scrollMarginTop", sons: null}, 
+{kind: 1, offset: "scrollPadding", len: 0, typ: NTI1208015, name: "scrollPadding", sons: null}, 
+{kind: 1, offset: "scrollPaddingBlock", len: 0, typ: NTI1208015, name: "scrollPaddingBlock", sons: null}, 
+{kind: 1, offset: "scrollPaddingBlockEnd", len: 0, typ: NTI1208015, name: "scrollPaddingBlockEnd", sons: null}, 
+{kind: 1, offset: "scrollPaddingBlockStart", len: 0, typ: NTI1208015, name: "scrollPaddingBlockStart", sons: null}, 
+{kind: 1, offset: "scrollPaddingBottom", len: 0, typ: NTI1208015, name: "scrollPaddingBottom", sons: null}, 
+{kind: 1, offset: "scrollPaddingInline", len: 0, typ: NTI1208015, name: "scrollPaddingInline", sons: null}, 
+{kind: 1, offset: "scrollPaddingInlineEnd", len: 0, typ: NTI1208015, name: "scrollPaddingInlineEnd", sons: null}, 
+{kind: 1, offset: "scrollPaddingInlineStart", len: 0, typ: NTI1208015, name: "scrollPaddingInlineStart", sons: null}, 
+{kind: 1, offset: "scrollPaddingLeft", len: 0, typ: NTI1208015, name: "scrollPaddingLeft", sons: null}, 
+{kind: 1, offset: "scrollPaddingRight", len: 0, typ: NTI1208015, name: "scrollPaddingRight", sons: null}, 
+{kind: 1, offset: "scrollPaddingTop", len: 0, typ: NTI1208015, name: "scrollPaddingTop", sons: null}, 
+{kind: 1, offset: "scrollSnapAlign", len: 0, typ: NTI1208015, name: "scrollSnapAlign", sons: null}, 
+{kind: 1, offset: "scrollSnapStop", len: 0, typ: NTI1208015, name: "scrollSnapStop", sons: null}, 
+{kind: 1, offset: "scrollSnapType", len: 0, typ: NTI1208015, name: "scrollSnapType", sons: null}, 
+{kind: 1, offset: "scrollbar3dLightColor", len: 0, typ: NTI1208015, name: "scrollbar3dLightColor", sons: null}, 
+{kind: 1, offset: "scrollbarArrowColor", len: 0, typ: NTI1208015, name: "scrollbarArrowColor", sons: null}, 
+{kind: 1, offset: "scrollbarBaseColor", len: 0, typ: NTI1208015, name: "scrollbarBaseColor", sons: null}, 
+{kind: 1, offset: "scrollbarColor", len: 0, typ: NTI1208015, name: "scrollbarColor", sons: null}, 
+{kind: 1, offset: "scrollbarDarkshadowColor", len: 0, typ: NTI1208015, name: "scrollbarDarkshadowColor", sons: null}, 
+{kind: 1, offset: "scrollbarFaceColor", len: 0, typ: NTI1208015, name: "scrollbarFaceColor", sons: null}, 
+{kind: 1, offset: "scrollbarHighlightColor", len: 0, typ: NTI1208015, name: "scrollbarHighlightColor", sons: null}, 
+{kind: 1, offset: "scrollbarShadowColor", len: 0, typ: NTI1208015, name: "scrollbarShadowColor", sons: null}, 
+{kind: 1, offset: "scrollbarTrackColor", len: 0, typ: NTI1208015, name: "scrollbarTrackColor", sons: null}, 
+{kind: 1, offset: "scrollbarWidth", len: 0, typ: NTI1208015, name: "scrollbarWidth", sons: null}, 
+{kind: 1, offset: "shapeImageThreshold", len: 0, typ: NTI1208015, name: "shapeImageThreshold", sons: null}, 
+{kind: 1, offset: "shapeMargin", len: 0, typ: NTI1208015, name: "shapeMargin", sons: null}, 
+{kind: 1, offset: "shapeOutside", len: 0, typ: NTI1208015, name: "shapeOutside", sons: null}, 
+{kind: 1, offset: "tabSize", len: 0, typ: NTI1208015, name: "tabSize", sons: null}, 
+{kind: 1, offset: "tableLayout", len: 0, typ: NTI1208015, name: "tableLayout", sons: null}, 
+{kind: 1, offset: "textAlign", len: 0, typ: NTI1208015, name: "textAlign", sons: null}, 
+{kind: 1, offset: "textAlignLast", len: 0, typ: NTI1208015, name: "textAlignLast", sons: null}, 
+{kind: 1, offset: "textCombineUpright", len: 0, typ: NTI1208015, name: "textCombineUpright", sons: null}, 
+{kind: 1, offset: "textDecoration", len: 0, typ: NTI1208015, name: "textDecoration", sons: null}, 
+{kind: 1, offset: "textDecorationColor", len: 0, typ: NTI1208015, name: "textDecorationColor", sons: null}, 
+{kind: 1, offset: "textDecorationLine", len: 0, typ: NTI1208015, name: "textDecorationLine", sons: null}, 
+{kind: 1, offset: "textDecorationSkipInk", len: 0, typ: NTI1208015, name: "textDecorationSkipInk", sons: null}, 
+{kind: 1, offset: "textDecorationStyle", len: 0, typ: NTI1208015, name: "textDecorationStyle", sons: null}, 
+{kind: 1, offset: "textDecorationThickness", len: 0, typ: NTI1208015, name: "textDecorationThickness", sons: null}, 
+{kind: 1, offset: "textEmphasis", len: 0, typ: NTI1208015, name: "textEmphasis", sons: null}, 
+{kind: 1, offset: "textEmphasisColor", len: 0, typ: NTI1208015, name: "textEmphasisColor", sons: null}, 
+{kind: 1, offset: "textEmphasisPosition", len: 0, typ: NTI1208015, name: "textEmphasisPosition", sons: null}, 
+{kind: 1, offset: "textEmphasisStyle", len: 0, typ: NTI1208015, name: "textEmphasisStyle", sons: null}, 
+{kind: 1, offset: "textIndent", len: 0, typ: NTI1208015, name: "textIndent", sons: null}, 
+{kind: 1, offset: "textJustify", len: 0, typ: NTI1208015, name: "textJustify", sons: null}, 
+{kind: 1, offset: "textOrientation", len: 0, typ: NTI1208015, name: "textOrientation", sons: null}, 
+{kind: 1, offset: "textOverflow", len: 0, typ: NTI1208015, name: "textOverflow", sons: null}, 
+{kind: 1, offset: "textRendering", len: 0, typ: NTI1208015, name: "textRendering", sons: null}, 
+{kind: 1, offset: "textShadow", len: 0, typ: NTI1208015, name: "textShadow", sons: null}, 
+{kind: 1, offset: "textTransform", len: 0, typ: NTI1208015, name: "textTransform", sons: null}, 
+{kind: 1, offset: "textUnderlineOffset", len: 0, typ: NTI1208015, name: "textUnderlineOffset", sons: null}, 
+{kind: 1, offset: "textUnderlinePosition", len: 0, typ: NTI1208015, name: "textUnderlinePosition", sons: null}, 
+{kind: 1, offset: "top", len: 0, typ: NTI1208015, name: "top", sons: null}, 
+{kind: 1, offset: "touchAction", len: 0, typ: NTI1208015, name: "touchAction", sons: null}, 
+{kind: 1, offset: "transform", len: 0, typ: NTI1208015, name: "transform", sons: null}, 
+{kind: 1, offset: "transformBox", len: 0, typ: NTI1208015, name: "transformBox", sons: null}, 
+{kind: 1, offset: "transformOrigin", len: 0, typ: NTI1208015, name: "transformOrigin", sons: null}, 
+{kind: 1, offset: "transformStyle", len: 0, typ: NTI1208015, name: "transformStyle", sons: null}, 
+{kind: 1, offset: "transition", len: 0, typ: NTI1208015, name: "transition", sons: null}, 
+{kind: 1, offset: "transitionDelay", len: 0, typ: NTI1208015, name: "transitionDelay", sons: null}, 
+{kind: 1, offset: "transitionDuration", len: 0, typ: NTI1208015, name: "transitionDuration", sons: null}, 
+{kind: 1, offset: "transitionProperty", len: 0, typ: NTI1208015, name: "transitionProperty", sons: null}, 
+{kind: 1, offset: "transitionTimingFunction", len: 0, typ: NTI1208015, name: "transitionTimingFunction", sons: null}, 
+{kind: 1, offset: "translate", len: 0, typ: NTI1208015, name: "translate", sons: null}, 
+{kind: 1, offset: "unicodeBidi", len: 0, typ: NTI1208015, name: "unicodeBidi", sons: null}, 
+{kind: 1, offset: "verticalAlign", len: 0, typ: NTI1208015, name: "verticalAlign", sons: null}, 
+{kind: 1, offset: "visibility", len: 0, typ: NTI1208015, name: "visibility", sons: null}, 
+{kind: 1, offset: "whiteSpace", len: 0, typ: NTI1208015, name: "whiteSpace", sons: null}, 
+{kind: 1, offset: "widows", len: 0, typ: NTI1208015, name: "widows", sons: null}, 
+{kind: 1, offset: "width", len: 0, typ: NTI1208015, name: "width", sons: null}, 
+{kind: 1, offset: "willChange", len: 0, typ: NTI1208015, name: "willChange", sons: null}, 
+{kind: 1, offset: "wordBreak", len: 0, typ: NTI1208015, name: "wordBreak", sons: null}, 
+{kind: 1, offset: "wordSpacing", len: 0, typ: NTI1208015, name: "wordSpacing", sons: null}, 
+{kind: 1, offset: "writingMode", len: 0, typ: NTI1208015, name: "writingMode", sons: null}, 
+{kind: 1, offset: "zIndex", len: 0, typ: NTI1208015, name: "zIndex", sons: null}]};
+NTI1872293.node = NNI1872293;
+NTI1872293.base = NTI1214408;
+NTI1872291.base = NTI1872293;
+var NNI1872237 = {kind: 2, len: 22, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "attributes", len: 0, typ: NTI1872610, name: "attributes", sons: null}, 
+{kind: 1, offset: "childNodes", len: 0, typ: NTI1872612, name: "childNodes", sons: null}, 
+{kind: 1, offset: "children", len: 0, typ: NTI1872614, name: "children", sons: null}, 
+{kind: 1, offset: "data", len: 0, typ: NTI1208015, name: "data", sons: null}, 
+{kind: 1, offset: "firstChild", len: 0, typ: NTI1872235, name: "firstChild", sons: null}, 
+{kind: 1, offset: "lastChild", len: 0, typ: NTI1872235, name: "lastChild", sons: null}, 
+{kind: 1, offset: "nextSibling", len: 0, typ: NTI1872235, name: "nextSibling", sons: null}, 
+{kind: 1, offset: "nodeName", len: 0, typ: NTI1208015, name: "nodeName", sons: null}, 
+{kind: 1, offset: "nodeType", len: 0, typ: NTI1872233, name: "nodeType", sons: null}, 
+{kind: 1, offset: "nodeValue", len: 0, typ: NTI1208015, name: "nodeValue", sons: null}, 
+{kind: 1, offset: "parentNode", len: 0, typ: NTI1872235, name: "parentNode", sons: null}, 
+{kind: 1, offset: "content", len: 0, typ: NTI1872235, name: "content", sons: null}, 
+{kind: 1, offset: "previousSibling", len: 0, typ: NTI1872235, name: "previousSibling", sons: null}, 
+{kind: 1, offset: "ownerDocument", len: 0, typ: NTI1872239, name: "ownerDocument", sons: null}, 
+{kind: 1, offset: "innerHTML", len: 0, typ: NTI1208015, name: "innerHTML", sons: null}, 
+{kind: 1, offset: "outerHTML", len: 0, typ: NTI1208015, name: "outerHTML", sons: null}, 
+{kind: 1, offset: "innerText", len: 0, typ: NTI1208015, name: "innerText", sons: null}, 
+{kind: 1, offset: "textContent", len: 0, typ: NTI1208015, name: "textContent", sons: null}, 
+{kind: 1, offset: "style", len: 0, typ: NTI1872291, name: "style", sons: null}, 
+{kind: 1, offset: "baseURI", len: 0, typ: NTI1208015, name: "baseURI", sons: null}, 
+{kind: 1, offset: "parentElement", len: 0, typ: NTI1872243, name: "parentElement", sons: null}, 
+{kind: 1, offset: "isConnected", len: 0, typ: NTI1208064, name: "isConnected", sons: null}]};
+NTI1872237.node = NNI1872237;
+var NNI1872205 = {kind: 2, len: 23, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "onabort", len: 0, typ: NTI1872388, name: "onabort", sons: null}, 
+{kind: 1, offset: "onblur", len: 0, typ: NTI1872392, name: "onblur", sons: null}, 
+{kind: 1, offset: "onchange", len: 0, typ: NTI1872396, name: "onchange", sons: null}, 
+{kind: 1, offset: "onclick", len: 0, typ: NTI1872400, name: "onclick", sons: null}, 
+{kind: 1, offset: "ondblclick", len: 0, typ: NTI1872404, name: "ondblclick", sons: null}, 
+{kind: 1, offset: "onerror", len: 0, typ: NTI1872408, name: "onerror", sons: null}, 
+{kind: 1, offset: "onfocus", len: 0, typ: NTI1872412, name: "onfocus", sons: null}, 
+{kind: 1, offset: "onkeydown", len: 0, typ: NTI1872416, name: "onkeydown", sons: null}, 
+{kind: 1, offset: "onkeypress", len: 0, typ: NTI1872420, name: "onkeypress", sons: null}, 
+{kind: 1, offset: "onkeyup", len: 0, typ: NTI1872424, name: "onkeyup", sons: null}, 
+{kind: 1, offset: "onload", len: 0, typ: NTI1872428, name: "onload", sons: null}, 
+{kind: 1, offset: "onmousedown", len: 0, typ: NTI1872432, name: "onmousedown", sons: null}, 
+{kind: 1, offset: "onmousemove", len: 0, typ: NTI1872436, name: "onmousemove", sons: null}, 
+{kind: 1, offset: "onmouseout", len: 0, typ: NTI1872440, name: "onmouseout", sons: null}, 
+{kind: 1, offset: "onmouseover", len: 0, typ: NTI1872444, name: "onmouseover", sons: null}, 
+{kind: 1, offset: "onmouseup", len: 0, typ: NTI1872448, name: "onmouseup", sons: null}, 
+{kind: 1, offset: "onreset", len: 0, typ: NTI1872452, name: "onreset", sons: null}, 
+{kind: 1, offset: "onselect", len: 0, typ: NTI1872456, name: "onselect", sons: null}, 
+{kind: 1, offset: "onsubmit", len: 0, typ: NTI1872460, name: "onsubmit", sons: null}, 
+{kind: 1, offset: "onunload", len: 0, typ: NTI1872464, name: "onunload", sons: null}, 
+{kind: 1, offset: "onloadstart", len: 0, typ: NTI1872468, name: "onloadstart", sons: null}, 
+{kind: 1, offset: "onprogress", len: 0, typ: NTI1872472, name: "onprogress", sons: null}, 
+{kind: 1, offset: "onloadend", len: 0, typ: NTI1872476, name: "onloadend", sons: null}]};
+NTI1872205.node = NNI1872205;
+NTI1872205.base = NTI1214408;
+NTI1872237.base = NTI1872205;
+NTI1872235.base = NTI1872237;
+NTI1900505.base = NTI1872235;
+NTI10595580.base = NTI1208015;
+var NNI1214653 = {kind: 2, len: 0, offset: 0, typ: null, name: null, sons: []};
+NTI1214653.node = NNI1214653;
+NTI1214653.base = NTI1214619;
+var NNI10436058 = {kind: 2, len: 2, offset: 0, typ: null, name: null, sons: [{kind: 1, offset: "Field0", len: 0, typ: NTI1208044, name: "Field0", sons: null}, 
+{kind: 1, offset: "Field1", len: 0, typ: NTI1208064, name: "Field1", sons: null}]};
+NTI10436058.node = NNI10436058;
+function makeNimstrLit(c_1475062) {
+      var ln = c_1475062.length;
+  var result = new Array(ln);
+  for (var i = 0; i < ln; ++i) {
+    result[i] = c_1475062.charCodeAt(i);
+  }
+  return result;
+  
+
+  
+}
+function toJSStr(s_1475096) {
+                    var Tmp5;
+            var Tmp7;
+
+  var result_1475097 = null;
+
+    var res_1475170 = newSeq_1475128((s_1475096).length);
+    var i_1475172 = 0;
+    var j_1475174 = 0;
+    L1: do {
+        L2: while (true) {
+        if (!(i_1475172 < (s_1475096).length)) break L2;
+          var c_1475175 = s_1475096[i_1475172];
+          if ((c_1475175 < 128)) {
+          res_1475170[j_1475174] = String.fromCharCode(c_1475175);
+          i_1475172 += 1;
+          }
+          else {
+            var helper_1475198 = newSeq_1475128(0);
+            L3: do {
+                L4: while (true) {
+                if (!true) break L4;
+                  var code_1475199 = c_1475175.toString(16);
+                  if (((code_1475199).length == 1)) {
+                  helper_1475198.push("%0");;
+                  }
+                  else {
+                  helper_1475198.push("%");;
+                  }
+                  
+                  helper_1475198.push(code_1475199);;
+                  i_1475172 += 1;
+                    if (((s_1475096).length <= i_1475172)) Tmp5 = true; else {                      Tmp5 = (s_1475096[i_1475172] < 128);                    }                  if (Tmp5) {
+                  break L3;
+                  }
+                  
+                  c_1475175 = s_1475096[i_1475172];
+                }
+            } while(false);
+++excHandler;
+            Tmp7 = framePtr;
+            try {
+            res_1475170[j_1475174] = decodeURIComponent(helper_1475198.join(""));
+--excHandler;
+} catch (EXC) {
+ var prevJSError = lastJSError;
+ lastJSError = EXC;
+ --excHandler;
+            framePtr = Tmp7;
+            res_1475170[j_1475174] = helper_1475198.join("");
+            lastJSError = prevJSError;
+            } finally {
+            framePtr = Tmp7;
+            }
+          }
+          
+          j_1475174 += 1;
+        }
+    } while(false);
+    if (res_1475170.length < j_1475174) { for (var i=res_1475170.length;i<j_1475174;++i) res_1475170.push(null); }
+               else { res_1475170.length = j_1475174; };
+    result_1475097 = res_1475170.join("");
+
+  return result_1475097;
+
+}
+function raiseException(e_1440218, ename_1440219) {
+    e_1440218.name = ename_1440219;
+    if ((excHandler == 0)) {
+    unhandledException(e_1440218);
+    }
+    
+    throw e_1440218;
+
+  
+}
+function addInt(a_1480419, b_1480420) {
+        var result = a_1480419 + b_1480420;
+    checkOverflowInt(result);
+    return result;
+  
+
+  
+}
+function cstrToNimstr(c_1475079) {
+      var ln = c_1475079.length;
+  var result = new Array(ln);
+  var r = 0;
+  for (var i = 0; i < ln; ++i) {
+    var ch = c_1475079.charCodeAt(i);
+
+    if (ch < 128) {
+      result[r] = ch;
+    }
+    else {
+      if (ch < 2048) {
+        result[r] = (ch >> 6) | 192;
+      }
+      else {
+        if (ch < 55296 || ch >= 57344) {
+          result[r] = (ch >> 12) | 224;
+        }
+        else {
+            ++i;
+            ch = 65536 + (((ch & 1023) << 10) | (c_1475079.charCodeAt(i) & 1023));
+            result[r] = (ch >> 18) | 240;
+            ++r;
+            result[r] = ((ch >> 12) & 63) | 128;
+        }
+        ++r;
+        result[r] = ((ch >> 6) & 63) | 128;
+      }
+      ++r;
+      result[r] = (ch & 63) | 128;
+    }
+    ++r;
+  }
+  return result;
+  
+
+  
+}
+function setConstr() {
+        var result = {};
+    for (var i = 0; i < arguments.length; ++i) {
+      var x = arguments[i];
+      if (typeof(x) == "object") {
+        for (var j = x[0]; j <= x[1]; ++j) {
+          result[j] = true;
+        }
+      } else {
+        result[x] = true;
+      }
+    }
+    return result;
+  
+
+  
+}
+var ConstSet1 = setConstr(17, 16, 4, 18, 27, 19, 23, 22, 21);
+function nimCopy(dest_1490023, src_1490024, ti_1490025) {
+  var result_1495219 = null;
+
+    switch (ti_1490025.kind) {
+    case 21:
+    case 22:
+    case 23:
+    case 5:
+      if (!(isFatPointer_1485401(ti_1490025))) {
+      result_1495219 = src_1490024;
+      }
+      else {
+        result_1495219 = [src_1490024[0], src_1490024[1]];
+      }
+      
+      break;
+    case 19:
+            if (dest_1490023 === null || dest_1490023 === undefined) {
+        dest_1490023 = {};
+      }
+      else {
+        for (var key in dest_1490023) { delete dest_1490023[key]; }
+      }
+      for (var key in src_1490024) { dest_1490023[key] = src_1490024[key]; }
+      result_1495219 = dest_1490023;
+    
+      break;
+    case 18:
+    case 17:
+      if (!((ti_1490025.base == null))) {
+      result_1495219 = nimCopy(dest_1490023, src_1490024, ti_1490025.base);
+      }
+      else {
+      if ((ti_1490025.kind == 17)) {
+      result_1495219 = (dest_1490023 === null || dest_1490023 === undefined) ? {m_type: ti_1490025} : dest_1490023;
+      }
+      else {
+        result_1495219 = (dest_1490023 === null || dest_1490023 === undefined) ? {} : dest_1490023;
+      }
+      }
+      nimCopyAux(result_1495219, src_1490024, ti_1490025.node);
+      break;
+    case 24:
+    case 4:
+    case 27:
+    case 16:
+            if (src_1490024 === null) {
+        result_1495219 = null;
+      }
+      else {
+        if (dest_1490023 === null || dest_1490023 === undefined) {
+          dest_1490023 = new Array(src_1490024.length);
+        }
+        else {
+          dest_1490023.length = src_1490024.length;
+        }
+        result_1495219 = dest_1490023;
+        for (var i = 0; i < src_1490024.length; ++i) {
+          result_1495219[i] = nimCopy(result_1495219[i], src_1490024[i], ti_1490025.base);
+        }
+      }
+    
+      break;
+    case 28:
+            if (src_1490024 !== null) {
+        result_1495219 = src_1490024.slice(0);
+      }
+    
+      break;
+    default: 
+      result_1495219 = src_1490024;
+      break;
+    }
+
+  return result_1495219;
+
+}
+function chckIndx(i_1500086, a_1500087, b_1500088) {
+      var Tmp1;
+
+  var result_1500089 = 0;
+
+  BeforeRet: do {
+      if (!(a_1500087 <= i_1500086)) Tmp1 = false; else {        Tmp1 = (i_1500086 <= b_1500088);      }    if (Tmp1) {
+    result_1500089 = i_1500086;
+    break BeforeRet;
+    }
+    else {
+    raiseIndexError(i_1500086, a_1500087, b_1500088);
+    }
+    
+  } while (false);
+
+  return result_1500089;
+
+}
+function subInt(a_1480437, b_1480438) {
+        var result = a_1480437 - b_1480438;
+    checkOverflowInt(result);
+    return result;
+  
+
+  
+}
+var ConstSet2 = setConstr([65, 90]);
+function chckRange(i_1505016, a_1505017, b_1505018) {
+      var Tmp1;
+
+  var result_1505019 = 0;
+
+  BeforeRet: do {
+      if (!(a_1505017 <= i_1505016)) Tmp1 = false; else {        Tmp1 = (i_1505016 <= b_1505018);      }    if (Tmp1) {
+    result_1505019 = i_1505016;
+    break BeforeRet;
+    }
+    else {
+    raiseRangeError();
+    }
+    
+  } while (false);
+
+  return result_1505019;
+
+}
+var ConstSet3 = setConstr(95, 32, 46);
+var ConstSet4 = setConstr(95, 32, 46);
+function mulInt(a_1480455, b_1480456) {
+        var result = a_1480455 * b_1480456;
+    checkOverflowInt(result);
+    return result;
+  
+
+  
+}
+var ConstSet5 = setConstr([97, 122]);
+var ConstSet6 = setConstr([65, 90], [97, 122]);
+var ConstSet7 = setConstr([97, 122]);
+var ConstSet8 = setConstr([65, 90]);
+var ConstSet9 = setConstr([65, 90], [97, 122]);
+function nimMax(a_1480821, b_1480822) {
+    var Tmp1;
+
+  var result_1480823 = 0;
+
+  BeforeRet: do {
+    if ((b_1480822 <= a_1480821)) {
+    Tmp1 = a_1480821;
+    }
+    else {
+    Tmp1 = b_1480822;
+    }
+    
+    result_1480823 = Tmp1;
+    break BeforeRet;
+  } while (false);
+
+  return result_1480823;
+
+}
+function nimMin(a_1480803, b_1480804) {
+    var Tmp1;
+
+  var result_1480805 = 0;
+
+  BeforeRet: do {
+    if ((a_1480803 <= b_1480804)) {
+    Tmp1 = a_1480803;
+    }
+    else {
+    Tmp1 = b_1480804;
+    }
+    
+    result_1480805 = Tmp1;
+    break BeforeRet;
+  } while (false);
+
+  return result_1480805;
+
+}
+function addChar(x_1525031, c_1525032) {
+    x_1525031.push(c_1525032);
+
+  
+}
+if (!Math.trunc) {
+  Math.trunc = function(v) {
+    v = +v;
+    if (!isFinite(v)) return v;
+    return (v - v % 1) || (v < 0 ? -0 : v === 0 ? v : 0);
+  };
+}
+
+var alternative_10595322 = [null];
+function add_1377211(x_1377214, x_1377214_Idx, y_1377215) {
+          if (x_1377214[x_1377214_Idx] === null) { x_1377214[x_1377214_Idx] = []; }
+      var off = x_1377214[x_1377214_Idx].length;
+      x_1377214[x_1377214_Idx].length += y_1377215.length;
+      for (var i = 0; i < y_1377215.length; ++i) {
+        x_1377214[x_1377214_Idx][off+i] = y_1377215.charCodeAt(i);
+      }
+    
+
+  
+}
+function newSeq_1475128(len_1475131) {
+  var result_1475133 = [];
+
+    result_1475133 = new Array(len_1475131); for (var i=0;i<len_1475131;++i) {result_1475133[i]=null;}
+  return result_1475133;
+
+}
+function unhandledException(e_1435059) {
+    var buf_1435060 = [[]];
+    if (!(((e_1435059.message).length == 0))) {
+    buf_1435060[0].push.apply(buf_1435060[0], makeNimstrLit("Error: unhandled exception: "));;
+    buf_1435060[0].push.apply(buf_1435060[0], e_1435059.message);;
+    }
+    else {
+    buf_1435060[0].push.apply(buf_1435060[0], makeNimstrLit("Error: unhandled exception"));;
+    }
+    
+    buf_1435060[0].push.apply(buf_1435060[0], makeNimstrLit(" ["));;
+    add_1377211(buf_1435060, 0, e_1435059.name);
+    buf_1435060[0].push.apply(buf_1435060[0], makeNimstrLit("]\x0A"));;
+    var cbuf_1440201 = toJSStr(buf_1435060[0]);
+    framePtr = null;
+      if (typeof(Error) !== "undefined") {
+    throw new Error(cbuf_1440201);
+  }
+  else {
+    throw cbuf_1440201;
+  }
+  
+
+  
+}
+function raiseOverflow() {
+    raiseException({message: makeNimstrLit("over- or underflow"), parent: null, m_type: NTI1214637, name: null, trace: [], up: null}, "OverflowDefect");
+
+  
+}
+function checkOverflowInt(a_1480403) {
+        if (a_1480403 > 2147483647 || a_1480403 < -2147483648) raiseOverflow();
+  
+
+  
+}
+function isWhitespace_10570116(text_10570118) {
+         return !/[^\s]/.test(text_10570118);
+  
+
+  
+}
+function isWhitespace_10570133(x_10570135) {
+    var Tmp1;
+    var Tmp2;
+
+  var result_10570136 = false;
+
+    if (!(x_10570135.nodeName == "#text")) Tmp2 = false; else {      Tmp2 = isWhitespace_10570116(x_10570135.textContent);    }    if (Tmp2) Tmp1 = true; else {      Tmp1 = (x_10570135.nodeName == "#comment");    }    result_10570136 = Tmp1;
+
+  return result_10570136;
+
+}
+function isFatPointer_1485401(ti_1485403) {
+  var result_1485404 = false;
+
+  BeforeRet: do {
+    result_1485404 = !((ConstSet1[ti_1485403.base.kind] != undefined));
+    break BeforeRet;
+  } while (false);
+
+  return result_1485404;
+
+}
+function nimCopyAux(dest_1490028, src_1490029, n_1490031) {
+    switch (n_1490031.kind) {
+    case 0:
+      break;
+    case 1:
+            dest_1490028[n_1490031.offset] = nimCopy(dest_1490028[n_1490031.offset], src_1490029[n_1490031.offset], n_1490031.typ);
+    
+      break;
+    case 2:
+          for (var i = 0; i < n_1490031.sons.length; i++) {
+      nimCopyAux(dest_1490028, src_1490029, n_1490031.sons[i]);
+    }
+    
+      break;
+    case 3:
+            dest_1490028[n_1490031.offset] = nimCopy(dest_1490028[n_1490031.offset], src_1490029[n_1490031.offset], n_1490031.typ);
+      for (var i = 0; i < n_1490031.sons.length; ++i) {
+        nimCopyAux(dest_1490028, src_1490029, n_1490031.sons[i][1]);
+      }
+    
+      break;
+    }
+
+  
+}
+function raiseIndexError(i_1460047, a_1460048, b_1460049) {
+    var Tmp1;
+
+    if ((b_1460049 < a_1460048)) {
+    Tmp1 = makeNimstrLit("index out of bounds, the container is empty");
+    }
+    else {
+    Tmp1 = (makeNimstrLit("index ") || []).concat(cstrToNimstr((i_1460047)+"") || [],makeNimstrLit(" not in ") || [],cstrToNimstr((a_1460048)+"") || [],makeNimstrLit(" .. ") || [],cstrToNimstr((b_1460049)+"") || []);
+    }
+    
+    raiseException({message: nimCopy(null, Tmp1, NTI1208013), parent: null, m_type: NTI1214649, name: null, trace: [], up: null}, "IndexDefect");
+
+  
+}
+function toToc_10570150(x_10570152, father_10570153) {
+                var Tmp5;
+            var Tmp6;
+            var Tmp7;
+            var Tmp8;
+      var Tmp15;
+
+    if ((x_10570152.nodeName == "UL")) {
+    var f_10570174 = {heading: null, kids: [], sortId: (father_10570153.kids).length, doSort: false};
+    var i_10570176 = 0;
+    L1: do {
+        L2: while (true) {
+        if (!(i_10570176 < x_10570152.childNodes.length)) break L2;
+          var nxt_10570177 = addInt(i_10570176, 1);
+          L3: do {
+              L4: while (true) {
+                if (!(nxt_10570177 < x_10570152.childNodes.length)) Tmp5 = false; else {                  Tmp5 = isWhitespace_10570133(x_10570152.childNodes[nxt_10570177]);                }              if (!Tmp5) break L4;
+                nxt_10570177 = addInt(nxt_10570177, 1);
+              }
+          } while(false);
+            if (!(nxt_10570177 < x_10570152.childNodes.length)) Tmp8 = false; else {              Tmp8 = (x_10570152.childNodes[i_10570176].nodeName == "LI");            }            if (!Tmp8) Tmp7 = false; else {              Tmp7 = (x_10570152.childNodes[i_10570176].childNodes.length == 1);            }            if (!Tmp7) Tmp6 = false; else {              Tmp6 = (x_10570152.childNodes[nxt_10570177].nodeName == "UL");            }          if (Tmp6) {
+          var e_10570204 = {heading: x_10570152.childNodes[i_10570176].childNodes[0], kids: [], sortId: (f_10570174.kids).length, doSort: false};
+          var it_10570205 = x_10570152.childNodes[nxt_10570177];
+          L9: do {
+            var j_10570213 = 0;
+            var colontmp__10595445 = 0;
+            colontmp__10595445 = it_10570205.childNodes.length;
+            var i_10595446 = 0;
+            L10: do {
+                L11: while (true) {
+                if (!(i_10595446 < colontmp__10595445)) break L11;
+                  j_10570213 = i_10595446;
+                  toToc_10570150(it_10570205.childNodes[j_10570213], e_10570204);
+                  i_10595446 = addInt(i_10595446, 1);
+                }
+            } while(false);
+          } while(false);
+          f_10570174.kids.push(e_10570204);;
+          i_10570176 = addInt(nxt_10570177, 1);
+          }
+          else {
+            toToc_10570150(x_10570152.childNodes[i_10570176], f_10570174);
+            i_10570176 = addInt(i_10570176, 1);
+          }
+          
+        }
+    } while(false);
+    father_10570153.kids.push(f_10570174);;
+    }
+    else {
+    if (isWhitespace_10570133(x_10570152)) {
+    }
+    else {
+    if ((x_10570152.nodeName == "LI")) {
+    var idx_10570252 = [];
+    L12: do {
+      var i_10570260 = 0;
+      var colontmp__10595449 = 0;
+      colontmp__10595449 = x_10570152.childNodes.length;
+      var i_10595450 = 0;
+      L13: do {
+          L14: while (true) {
+          if (!(i_10595450 < colontmp__10595449)) break L14;
+            i_10570260 = i_10595450;
+            if (!(isWhitespace_10570133(x_10570152.childNodes[i_10570260]))) {
+            idx_10570252.push(i_10570260);;
+            }
+            
+            i_10595450 = addInt(i_10595450, 1);
+          }
+      } while(false);
+    } while(false);
+      if (!((idx_10570252).length == 2)) Tmp15 = false; else {        Tmp15 = (x_10570152.childNodes[idx_10570252[chckIndx(1, 0, (idx_10570252).length-1)]].nodeName == "UL");      }    if (Tmp15) {
+    var e_10570294 = {heading: x_10570152.childNodes[idx_10570252[chckIndx(0, 0, (idx_10570252).length-1)]], kids: [], sortId: (father_10570153.kids).length, doSort: false};
+    var it_10570295 = x_10570152.childNodes[idx_10570252[chckIndx(1, 0, (idx_10570252).length-1)]];
+    L16: do {
+      var j_10570303 = 0;
+      var colontmp__10595454 = 0;
+      colontmp__10595454 = it_10570295.childNodes.length;
+      var i_10595455 = 0;
+      L17: do {
+          L18: while (true) {
+          if (!(i_10595455 < colontmp__10595454)) break L18;
+            j_10570303 = i_10595455;
+            toToc_10570150(it_10570295.childNodes[j_10570303], e_10570294);
+            i_10595455 = addInt(i_10595455, 1);
+          }
+      } while(false);
+    } while(false);
+    father_10570153.kids.push(e_10570294);;
+    }
+    else {
+      L19: do {
+        var i_10570319 = 0;
+        var colontmp__10595458 = 0;
+        colontmp__10595458 = x_10570152.childNodes.length;
+        var i_10595459 = 0;
+        L20: do {
+            L21: while (true) {
+            if (!(i_10595459 < colontmp__10595458)) break L21;
+              i_10570319 = i_10595459;
+              toToc_10570150(x_10570152.childNodes[i_10570319], father_10570153);
+              i_10595459 = addInt(i_10595459, 1);
+            }
+        } while(false);
+      } while(false);
+    }
+    
+    }
+    else {
+    father_10570153.kids.push({heading: x_10570152, kids: [], sortId: (father_10570153.kids).length, doSort: false});;
+    }
+    }}
+
+  
+}
+function extractItems_10525075(x_10525077, heading_10525078, items_10525081, items_10525081_Idx) {
+      var Tmp1;
+
+  BeforeRet: do {
+    if ((x_10525077 == null)) {
+    break BeforeRet;
+    }
+    
+      if (!!((x_10525077.heading == null))) Tmp1 = false; else {        Tmp1 = (x_10525077.heading.textContent == heading_10525078);      }    if (Tmp1) {
+    L2: do {
+      var i_10530021 = 0;
+      var colontmp__10595475 = 0;
+      colontmp__10595475 = (x_10525077.kids).length;
+      var i_10595476 = 0;
+      L3: do {
+          L4: while (true) {
+          if (!(i_10595476 < colontmp__10595475)) break L4;
+            i_10530021 = i_10595476;
+            items_10525081[items_10525081_Idx].push(x_10525077.kids[chckIndx(i_10530021, 0, (x_10525077.kids).length-1)].heading);;
+            i_10595476 = addInt(i_10595476, 1);
+          }
+      } while(false);
+    } while(false);
+    }
+    else {
+      L5: do {
+        var i_10530042 = 0;
+        var colontmp__10595479 = 0;
+        colontmp__10595479 = (x_10525077.kids).length;
+        var i_10595480 = 0;
+        L6: do {
+            L7: while (true) {
+            if (!(i_10595480 < colontmp__10595479)) break L7;
+              i_10530042 = i_10595480;
+              var it_10530043 = x_10525077.kids[chckIndx(i_10530042, 0, (x_10525077.kids).length-1)];
+              extractItems_10525075(it_10530043, heading_10525078, items_10525081, items_10525081_Idx);
+              i_10595480 = addInt(i_10595480, 1);
+            }
+        } while(false);
+      } while(false);
+    }
+    
+  } while (false);
+
+  
+}
+function tree_10516020(tag_10516022, kids_10516024) {
+  var result_10516025 = null;
+
+    result_10516025 = document.createElement(toJSStr(tag_10516022));
+    L1: do {
+      var k_10516058 = null;
+      var k_10516058_Idx = 0;
+      var i_10595496 = 0;
+      L2: do {
+          L3: while (true) {
+          if (!(i_10595496 < (kids_10516024).length)) break L3;
+            k_10516058 = kids_10516024; k_10516058_Idx = chckIndx(i_10595496, 0, (kids_10516024).length-1);
+            result_10516025.appendChild(k_10516058[k_10516058_Idx]);
+            i_10595496 = addInt(i_10595496, 1);
+          }
+      } while(false);
+    } while(false);
+
+  return result_10516025;
+
+}
+function text_10516169(s_10516171) {
+  var result_10516172 = null;
+
+    result_10516172 = document.createTextNode(s_10516171);
+
+  return result_10516172;
+
+}
+function sysFatal_1325418(message_1325422) {
+    raiseException({message: nimCopy(null, message_1325422, NTI1208013), m_type: NTI1214641, parent: null, name: null, trace: [], up: null}, "AssertionDefect");
+
+  
+}
+function raiseAssert_1325414(msg_1325416) {
+    sysFatal_1325418(msg_1325416);
+
+  
+}
+function failedAssertImpl_1325480(msg_1325482) {
+    raiseAssert_1325414(msg_1325482);
+
+  
+}
+function uncovered_10575022(x_10575024) {
+      var Tmp1;
+    var Tmp2;
+
+  var result_10575025 = null;
+
+  BeforeRet: do {
+      if (!((x_10575024.kids).length == 0)) Tmp1 = false; else {        Tmp1 = !((x_10575024.heading == null));      }    if (Tmp1) {
+    if (!(x_10575024.heading.hasOwnProperty('__karaxMarker__'))) {
+    Tmp2 = x_10575024;
+    }
+    else {
+    Tmp2 = null;
+    }
+    
+    result_10575025 = Tmp2;
+    break BeforeRet;
+    }
+    
+    result_10575025 = {heading: x_10575024.heading, kids: [], sortId: x_10575024.sortId, doSort: x_10575024.doSort};
+    L3: do {
+      var i_10580036 = 0;
+      var colontmp__10595507 = 0;
+      colontmp__10595507 = (x_10575024.kids).length;
+      var i_10595508 = 0;
+      L4: do {
+          L5: while (true) {
+          if (!(i_10595508 < colontmp__10595507)) break L5;
+            i_10580036 = i_10595508;
+            var y_10580037 = uncovered_10575022(x_10575024.kids[chckIndx(i_10580036, 0, (x_10575024.kids).length-1)]);
+            if (!((y_10580037 == null))) {
+            result_10575025.kids.push(y_10580037);;
+            }
+            
+            i_10595508 = addInt(i_10595508, 1);
+          }
+      } while(false);
+    } while(false);
+    if (((result_10575025.kids).length == 0)) {
+    result_10575025 = null;
+    }
+    
+  } while (false);
+
+  return result_10575025;
+
+}
+function mergeTocs_10585035(orig_10585037, news_10585038) {
+  var result_10585039 = null;
+
+    result_10585039 = uncovered_10575022(orig_10585037);
+    if ((result_10585039 == null)) {
+    result_10585039 = news_10585038;
+    }
+    else {
+      L1: do {
+        var i_10585060 = 0;
+        var colontmp__10595502 = 0;
+        colontmp__10595502 = (news_10585038.kids).length;
+        var i_10595503 = 0;
+        L2: do {
+            L3: while (true) {
+            if (!(i_10595503 < colontmp__10595502)) break L3;
+              i_10585060 = i_10595503;
+              result_10585039.kids.push(news_10585038.kids[chckIndx(i_10585060, 0, (news_10585038.kids).length-1)]);;
+              i_10595503 = addInt(i_10595503, 1);
+            }
+        } while(false);
+      } while(false);
+    }
+    
+
+  return result_10585039;
+
+}
+function buildToc_10585082(orig_10585084, types_10585086, procs_10585087) {
+                      var Tmp7;
+
+  var result_10585088 = null;
+
+    var newStuff_10585104 = {heading: null, kids: [], doSort: true, sortId: 0};
+    L1: do {
+      var t_10595214 = null;
+      var t_10595214_Idx = 0;
+      var i_10595491 = 0;
+      var L_10595492 = (types_10585086).length;
+      L2: do {
+          L3: while (true) {
+          if (!(i_10595491 < L_10595492)) break L3;
+            t_10595214 = types_10585086; t_10595214_Idx = chckIndx(i_10595491, 0, (types_10585086).length-1);
+            var c_10595230 = {heading: t_10595214[t_10595214_Idx].cloneNode(true), kids: [], doSort: true, sortId: 0};
+            t_10595214[t_10595214_Idx].__karaxMarker__ = true;
+            L4: do {
+              var p_10595238 = null;
+              var p_10595238_Idx = 0;
+              var i_10595488 = 0;
+              var L_10595489 = (procs_10585087).length;
+              L5: do {
+                  L6: while (true) {
+                  if (!(i_10595488 < L_10595489)) break L6;
+                    p_10595238 = procs_10585087; p_10595238_Idx = chckIndx(i_10595488, 0, (procs_10585087).length-1);
+                    if (!(p_10595238[p_10595238_Idx].hasOwnProperty('__karaxMarker__'))) {
+                    var xx_10595239 = p_10595238[p_10595238_Idx].parentNode.getElementsByClassName("attachedType");
+                      if (!((xx_10595239).length == 1)) Tmp7 = false; else {                        Tmp7 = (xx_10595239[chckIndx(0, 0, (xx_10595239).length-1)].textContent == t_10595214[t_10595214_Idx].textContent);                      }                    if (Tmp7) {
+                    var q_10595247 = tree_10516020(makeNimstrLit("A"), [text_10516169(p_10595238[p_10595238_Idx].title)]);
+                    q_10595247.setAttribute("href", p_10595238[p_10595238_Idx].getAttribute("href"));
+                    c_10595230.kids.push({heading: q_10595247, kids: [], sortId: 0, doSort: false});;
+                    p_10595238[p_10595238_Idx].__karaxMarker__ = true;
+                    }
+                    
+                    }
+                    
+                    i_10595488 = addInt(i_10595488, 1);
+                    if (!(((procs_10585087).length == L_10595489))) {
+                    failedAssertImpl_1325480(makeNimstrLit("iterators.nim(204, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+                    }
+                    
+                  }
+              } while(false);
+            } while(false);
+            newStuff_10585104.kids.push(c_10595230);;
+            i_10595491 = addInt(i_10595491, 1);
+            if (!(((types_10585086).length == L_10595492))) {
+            failedAssertImpl_1325480(makeNimstrLit("iterators.nim(204, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+            }
+            
+          }
+      } while(false);
+    } while(false);
+    result_10585088 = mergeTocs_10585035(orig_10585084, newStuff_10585104);
+
+  return result_10585088;
+
+}
+function add_10516117(parent_10516119, kid_10516120) {
+      var Tmp1;
+        var Tmp2;
+
+      if (!(parent_10516119.nodeName == "TR")) Tmp1 = false; else {        if ((kid_10516120.nodeName == "TD")) Tmp2 = true; else {          Tmp2 = (kid_10516120.nodeName == "TH");        }        Tmp1 = Tmp2;      }    if (Tmp1) {
+    var k_10516121 = document.createElement("TD");
+    k_10516121.appendChild(kid_10516120);
+    parent_10516119.appendChild(k_10516121);
+    }
+    else {
+    parent_10516119.appendChild(kid_10516120);
+    }
+    
+
+  
+}
+function setClass_10516135(e_10516137, value_10516138) {
+    e_10516137.setAttribute("class", toJSStr(value_10516138));
+
+  
+}
+function toHtml_10530072(x_10530074, isRoot_10530075) {
+      var Tmp1;
+    function HEX3Aanonymous_10535015(a_10535017, b_10535018) {
+          var Tmp1;
+
+      var result_10535019 = 0;
+
+      BeforeRet: do {
+          if (!!((a_10535017.heading == null))) Tmp1 = false; else {            Tmp1 = !((b_10535018.heading == null));          }        if (Tmp1) {
+        var x_10545009 = a_10535017.heading.textContent;
+        var y_10545010 = b_10535018.heading.textContent;
+        if ((x_10545009 < y_10545010)) {
+        result_10535019 = -1;
+        break BeforeRet;
+        }
+        
+        if ((y_10545010 < x_10545009)) {
+        result_10535019 = 1;
+        break BeforeRet;
+        }
+        
+        result_10535019 = 0;
+        break BeforeRet;
+        }
+        else {
+          result_10535019 = subInt(a_10535017.sortId, b_10535018.sortId);
+          break BeforeRet;
+        }
+        
+      } while (false);
+
+      return result_10535019;
+
+    }
+
+  var result_10530076 = null;
+
+  BeforeRet: do {
+    if ((x_10530074 == null)) {
+    result_10530076 = null;
+    break BeforeRet;
+    }
+    
+    if (((x_10530074.kids).length == 0)) {
+    if ((x_10530074.heading == null)) {
+    result_10530076 = null;
+    break BeforeRet;
+    }
+    
+    result_10530076 = x_10530074.heading.cloneNode(true);
+    break BeforeRet;
+    }
+    
+    result_10530076 = tree_10516020(makeNimstrLit("DIV"), []);
+      if (!!((x_10530074.heading == null))) Tmp1 = false; else {        Tmp1 = !(x_10530074.heading.hasOwnProperty('__karaxMarker__'));      }    if (Tmp1) {
+    add_10516117(result_10530076, x_10530074.heading.cloneNode(true));
+    }
+    
+    var ul_10535012 = tree_10516020(makeNimstrLit("UL"), []);
+    if (isRoot_10530075) {
+    setClass_10516135(ul_10535012, makeNimstrLit("simple simple-toc"));
+    }
+    else {
+    setClass_10516135(ul_10535012, makeNimstrLit("simple"));
+    }
+    
+    if (x_10530074.doSort) {
+    x_10530074.kids.sort(HEX3Aanonymous_10535015);
+    }
+    
+    L2: do {
+      var k_10560214 = null;
+      var k_10560214_Idx = 0;
+      var i_10595514 = 0;
+      var L_10595515 = (x_10530074.kids).length;
+      L3: do {
+          L4: while (true) {
+          if (!(i_10595514 < L_10595515)) break L4;
+            k_10560214 = x_10530074.kids; k_10560214_Idx = chckIndx(i_10595514, 0, (x_10530074.kids).length-1);
+            var y_10560215 = toHtml_10530072(k_10560214[k_10560214_Idx], false);
+            if (!((y_10560215 == null))) {
+            add_10516117(ul_10535012, tree_10516020(makeNimstrLit("LI"), [y_10560215]));
+            }
+            
+            i_10595514 = addInt(i_10595514, 1);
+            if (!(((x_10530074.kids).length == L_10595515))) {
+            failedAssertImpl_1325480(makeNimstrLit("iterators.nim(204, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+            }
+            
+          }
+      } while(false);
+    } while(false);
+    if (!((ul_10535012.childNodes.length == 0))) {
+    add_10516117(result_10530076, ul_10535012);
+    }
+    
+    if ((result_10530076.childNodes.length == 0)) {
+    result_10530076 = null;
+    }
+    
+  } while (false);
+
+  return result_10530076;
+
+}
+function replaceById_10516189(id_10516191, newTree_10516192) {
+    var x_10516193 = document.getElementById(id_10516191);
+    x_10516193.parentNode.replaceChild(newTree_10516192, x_10516193);
+    newTree_10516192.id = id_10516191;
+
+  
+}
+function togglevis_10595336(d_10595338) {
+        if (d_10595338.style.display == 'none')
+      d_10595338.style.display = 'inline';
+    else
+      d_10595338.style.display = 'none';
+  
+
+  
+}
+function groupBy(value_10595354) {
+    var toc_10595355 = document.getElementById("toc-list");
+    if ((alternative_10595322[0] == null)) {
+    var tt_10595376 = {heading: null, kids: [], sortId: 0, doSort: false};
+    toToc_10570150(toc_10595355, tt_10595376);
+    tt_10595376 = tt_10595376.kids[chckIndx(0, 0, (tt_10595376.kids).length-1)];
+    var types_10595393 = [[]];
+    var procs_10595410 = [[]];
+    extractItems_10525075(tt_10595376, "Types", types_10595393, 0);
+    extractItems_10525075(tt_10595376, "Procs", procs_10595410, 0);
+    extractItems_10525075(tt_10595376, "Converters", procs_10595410, 0);
+    extractItems_10525075(tt_10595376, "Methods", procs_10595410, 0);
+    extractItems_10525075(tt_10595376, "Templates", procs_10595410, 0);
+    extractItems_10525075(tt_10595376, "Macros", procs_10595410, 0);
+    extractItems_10525075(tt_10595376, "Iterators", procs_10595410, 0);
+    var ntoc_10595418 = buildToc_10585082(tt_10595376, types_10595393[0], procs_10595410[0]);
+    var x_10595419 = toHtml_10530072(ntoc_10595418, true);
+    alternative_10595322[0] = tree_10516020(makeNimstrLit("DIV"), [x_10595419]);
+    }
+    
+    if ((value_10595354 == "type")) {
+    replaceById_10516189("tocRoot", alternative_10595322[0]);
+    }
+    else {
+    replaceById_10516189("tocRoot", tree_10516020(makeNimstrLit("DIV"), []));
+    }
+    
+    togglevis_10595336(document.getElementById("toc-list"));
+
+  
+}
+var db_10595518 = [[]];
+var contents_10595520 = [[]];
+var oldtoc_10605439 = [null];
+var timer_10605440 = [null];
+function raiseRangeError() {
+    raiseException({message: makeNimstrLit("value out of range"), parent: null, m_type: NTI1214653, name: null, trace: [], up: null}, "RangeDefect");
+
+  
+}
+function nsuToLowerAsciiChar(c_9430023) {
+  var result_9430024 = 0;
+
+    if ((ConstSet2[c_9430023] != undefined)) {
+    result_9430024 = chckRange(addInt(c_9430023, 32), 0, 255);
+    }
+    else {
+      result_9430024 = c_9430023;
+    }
+    
+
+  return result_9430024;
+
+}
+function fuzzyMatch_10436054(pattern_10436056, str_10436057) {
+              var Tmp4;
+              var Tmp5;
+                var Tmp6;
+      var Tmp7;
+        var Tmp8;
+
+  var result_10436061 = {Field0: 0, Field1: false};
+
+    var scoreState_10436062 = -100;
+    var headerMatched_10436063 = false;
+    var unmatchedLeadingCharCount_10436065 = 0;
+    var consecutiveMatchCount_10436067 = 0;
+    var strIndex_10436069 = 0;
+    var patIndex_10436071 = 0;
+    var score_10436073 = 0;
+    L1: do {
+        L2: while (true) {
+        if (!((strIndex_10436069 < (str_10436057).length) && (patIndex_10436071 < (pattern_10436056).length))) break L2;
+          L3: do {
+            var patternChar_10436079 = nsuToLowerAsciiChar(pattern_10436056.charCodeAt(chckIndx(patIndex_10436071, 0, (pattern_10436056).length-1)));
+            var strChar_10436080 = nsuToLowerAsciiChar(str_10436057.charCodeAt(chckIndx(strIndex_10436069, 0, (str_10436057).length-1)));
+            if ((ConstSet3[patternChar_10436079] != undefined)) {
+            patIndex_10436071 = addInt(patIndex_10436071, 1);
+            break L3;
+            }
+            
+            if ((ConstSet4[strChar_10436080] != undefined)) {
+            strIndex_10436069 = addInt(strIndex_10436069, 1);
+            break L3;
+            }
+            
+            if ((!(headerMatched_10436063) && (strChar_10436080 == 58))) {
+            headerMatched_10436063 = true;
+            scoreState_10436062 = -100;
+            score_10436073 = ((Math.floor((5.0000000000000000e-001 * score_10436073)))|0);
+            patIndex_10436071 = 0;
+            strIndex_10436069 = addInt(strIndex_10436069, 1);
+            break L3;
+            }
+            
+            if ((strChar_10436080 == patternChar_10436079)) {
+            switch (scoreState_10436062) {
+            case -100:
+            case 20:
+              scoreState_10436062 = 10;
+              break;
+            case 0:
+              scoreState_10436062 = 5;
+              score_10436073 = addInt(score_10436073, scoreState_10436062);
+              break;
+            case 10:
+            case 5:
+              consecutiveMatchCount_10436067 = addInt(consecutiveMatchCount_10436067, 1);
+              scoreState_10436062 = 5;
+              score_10436073 = addInt(score_10436073, mulInt(5, consecutiveMatchCount_10436067));
+              if ((scoreState_10436062 == 10)) {
+              score_10436073 = addInt(score_10436073, 10);
+              }
+              
+              var onBoundary_10450042 = (patIndex_10436071 == ((pattern_10436056).length-1));
+              if ((!(onBoundary_10450042) && (strIndex_10436069 < ((str_10436057).length-1)))) {
+              var nextPatternChar_10450043 = nsuToLowerAsciiChar(pattern_10436056.charCodeAt(chckIndx(addInt(patIndex_10436071, 1), 0, (pattern_10436056).length-1)));
+              var nextStrChar_10450044 = nsuToLowerAsciiChar(str_10436057.charCodeAt(chckIndx(addInt(strIndex_10436069, 1), 0, (str_10436057).length-1)));
+              if (!!((ConstSet5[nextStrChar_10450044] != undefined))) Tmp4 = false; else {                Tmp4 = !((nextStrChar_10450044 == nextPatternChar_10450043));              }              onBoundary_10450042 = Tmp4;
+              }
+              
+              if (onBoundary_10450042) {
+              scoreState_10436062 = 20;
+              score_10436073 = addInt(score_10436073, scoreState_10436062);
+              }
+              
+              break;
+            case -1:
+            case -3:
+              if (!((ConstSet6[str_10436057.charCodeAt(chckIndx(subInt(strIndex_10436069, 1), 0, (str_10436057).length-1))] != undefined))) Tmp5 = true; else {                if (!(ConstSet7[str_10436057.charCodeAt(chckIndx(subInt(strIndex_10436069, 1), 0, (str_10436057).length-1))] != undefined)) Tmp6 = false; else {                  Tmp6 = (ConstSet8[str_10436057.charCodeAt(chckIndx(strIndex_10436069, 0, (str_10436057).length-1))] != undefined);                }                Tmp5 = Tmp6;              }              var isLeadingChar_10480008 = Tmp5;
+              if (isLeadingChar_10480008) {
+              scoreState_10436062 = 10;
+              }
+              else {
+                scoreState_10436062 = 0;
+                score_10436073 = addInt(score_10436073, scoreState_10436062);
+              }
+              
+              break;
+            }
+            patIndex_10436071 = addInt(patIndex_10436071, 1);
+            }
+            else {
+              switch (scoreState_10436062) {
+              case -100:
+                scoreState_10436062 = -3;
+                score_10436073 = addInt(score_10436073, scoreState_10436062);
+                break;
+              case 5:
+                scoreState_10436062 = -1;
+                score_10436073 = addInt(score_10436073, scoreState_10436062);
+                consecutiveMatchCount_10436067 = 0;
+                break;
+              case -3:
+                if ((unmatchedLeadingCharCount_10436065 < 3)) {
+                scoreState_10436062 = -3;
+                score_10436073 = addInt(score_10436073, scoreState_10436062);
+                }
+                
+                unmatchedLeadingCharCount_10436065 = addInt(unmatchedLeadingCharCount_10436065, 1);
+                break;
+              default: 
+                scoreState_10436062 = -1;
+                score_10436073 = addInt(score_10436073, scoreState_10436062);
+                break;
+              }
+            }
+            
+            strIndex_10436069 = addInt(strIndex_10436069, 1);
+          } while(false);
+        }
+    } while(false);
+      if (!(patIndex_10436071 == (pattern_10436056).length)) Tmp7 = false; else {        if ((strIndex_10436069 == (str_10436057).length)) Tmp8 = true; else {          Tmp8 = !((ConstSet9[str_10436057.charCodeAt(chckIndx(strIndex_10436069, 0, (str_10436057).length-1))] != undefined));        }        Tmp7 = Tmp8;      }    if (Tmp7) {
+    score_10436073 = addInt(score_10436073, 10);
+    }
+    
+    var colontmp__10615075 = nimMax(0, score_10436073);
+    var colontmp__10615076 = (0 < score_10436073);
+    nimCopy(result_10436061, {Field0: colontmp__10615075, Field1: colontmp__10615076}, NTI10436058);
+
+  return result_10436061;
+
+}
+function escapeCString_10595537(x_10595540, x_10595540_Idx) {
+    var s_10595541 = [];
+    L1: do {
+      var c_10595542 = 0;
+      var i_10615080 = 0;
+      var L_10615081 = (x_10595540[x_10595540_Idx]).length;
+      L2: do {
+          L3: while (true) {
+          if (!(i_10615080 < L_10615081)) break L3;
+            c_10595542 = x_10595540[x_10595540_Idx].charCodeAt(chckIndx(i_10615080, 0, (x_10595540[x_10595540_Idx]).length-1));
+            switch (c_10595542) {
+            case 38:
+              s_10595541.push.apply(s_10595541, makeNimstrLit("&amp;"));;
+              break;
+            case 60:
+              s_10595541.push.apply(s_10595541, makeNimstrLit("&lt;"));;
+              break;
+            case 62:
+              s_10595541.push.apply(s_10595541, makeNimstrLit("&gt;"));;
+              break;
+            case 34:
+              s_10595541.push.apply(s_10595541, makeNimstrLit("&quot;"));;
+              break;
+            case 39:
+              s_10595541.push.apply(s_10595541, makeNimstrLit("&#039;"));;
+              break;
+            case 47:
+              s_10595541.push.apply(s_10595541, makeNimstrLit("&#x2F;"));;
+              break;
+            default: 
+              addChar(s_10595541, c_10595542);;
+              break;
+            }
+            i_10615080 = addInt(i_10615080, 1);
+          }
+      } while(false);
+    } while(false);
+    x_10595540[x_10595540_Idx] = toJSStr(s_10595541);
+
+  
+}
+function text_10516152(s_10516154) {
+  var result_10516155 = null;
+
+    result_10516155 = document.createTextNode(toJSStr(s_10516154));
+
+  return result_10516155;
+
+}
+function dosearch_10595556(value_10595558) {
+    function HEX3Aanonymous_10605276(a_10605285, b_10605286) {
+      var result_10605292 = 0;
+
+        result_10605292 = subInt(b_10605286["Field1"], a_10605285["Field1"]);
+
+      return result_10605292;
+
+    }
+
+  var result_10595559 = null;
+
+    if (((db_10595518[0]).length == 0)) {
+    var stuff_10595565 = null;
+        var request = new XMLHttpRequest();
+    request.open("GET", "theindex.html", false);
+    request.send(null);
+
+    var doc = document.implementation.createHTMLDocument("theindex");
+    doc.documentElement.innerHTML = request.responseText;
+
+    //parser=new DOMParser();
+    //doc=parser.parseFromString("<html></html>", "text/html");
+
+    stuff_10595565 = doc.documentElement;
+    
+    db_10595518[0] = nimCopy(null, stuff_10595565.getElementsByClassName("reference"), NTI1900505);
+    contents_10595520[0] = nimCopy(null, [], NTI10595580);
+    L1: do {
+      var ahref_10605214 = null;
+      var ahref_10605214_Idx = 0;
+      var i_10615055 = 0;
+      var L_10615056 = (db_10595518[0]).length;
+      L2: do {
+          L3: while (true) {
+          if (!(i_10615055 < L_10615056)) break L3;
+            ahref_10605214 = db_10595518[0]; ahref_10605214_Idx = chckIndx(i_10615055, 0, (db_10595518[0]).length-1);
+            contents_10595520[0].push(ahref_10605214[ahref_10605214_Idx].getAttribute("data-doc-search-tag"));;
+            i_10615055 = addInt(i_10615055, 1);
+            if (!(((db_10595518[0]).length == L_10615056))) {
+            failedAssertImpl_1325480(makeNimstrLit("iterators.nim(204, 11) `len(a) == L` the length of the seq changed while iterating over it"));
+            }
+            
+          }
+      } while(false);
+    } while(false);
+    }
+    
+    var ul_10605226 = tree_10516020(makeNimstrLit("UL"), []);
+    result_10595559 = tree_10516020(makeNimstrLit("DIV"), []);
+    setClass_10516135(result_10595559, makeNimstrLit("search_results"));
+    var matches_10605247 = [];
+    L4: do {
+      var i_10605260 = 0;
+      var colontmp__10615062 = 0;
+      colontmp__10615062 = (db_10595518[0]).length;
+      var i_10615063 = 0;
+      L5: do {
+          L6: while (true) {
+          if (!(i_10615063 < colontmp__10615062)) break L6;
+            i_10605260 = i_10615063;
+            L7: do {
+              var c_10605261 = contents_10595520[0][chckIndx(i_10605260, 0, (contents_10595520[0]).length-1)];
+              if (((c_10605261 == "Examples") || (c_10605261 == "PEG construction"))) {
+              break L7;
+              }
+              
+              var colontmp__10615070 = fuzzyMatch_10436054(value_10595558, c_10605261);
+              var score_10605262 = colontmp__10615070["Field0"];
+              var matched_10605263 = colontmp__10615070["Field1"];
+              if (matched_10605263) {
+              matches_10605247.push({Field0: db_10595518[0][chckIndx(i_10605260, 0, (db_10595518[0]).length-1)], Field1: score_10605262});;
+              }
+              
+            } while(false);
+            i_10615063 = addInt(i_10615063, 1);
+          }
+      } while(false);
+    } while(false);
+    matches_10605247.sort(HEX3Aanonymous_10605276);
+    L8: do {
+      var i_10605331 = 0;
+      var colontmp__10615067 = 0;
+      colontmp__10615067 = nimMin((matches_10605247).length, 29);
+      var i_10615068 = 0;
+      L9: do {
+          L10: while (true) {
+          if (!(i_10615068 < colontmp__10615067)) break L10;
+            i_10605331 = i_10615068;
+            matches_10605247[chckIndx(i_10605331, 0, (matches_10605247).length-1)]["Field0"].innerHTML = matches_10605247[chckIndx(i_10605331, 0, (matches_10605247).length-1)]["Field0"].getAttribute("data-doc-search-tag");
+            escapeCString_10595537(matches_10605247[chckIndx(i_10605331, 0, (matches_10605247).length-1)]["Field0"], "innerHTML");
+            add_10516117(ul_10605226, tree_10516020(makeNimstrLit("LI"), [matches_10605247[chckIndx(i_10605331, 0, (matches_10605247).length-1)]["Field0"]]));
+            i_10615068 = addInt(i_10615068, 1);
+          }
+      } while(false);
+    } while(false);
+    if ((ul_10605226.childNodes.length == 0)) {
+    add_10516117(result_10595559, tree_10516020(makeNimstrLit("B"), [text_10516152(makeNimstrLit("no search results"))]));
+    }
+    else {
+      add_10516117(result_10595559, tree_10516020(makeNimstrLit("B"), [text_10516152(makeNimstrLit("search results"))]));
+      add_10516117(result_10595559, ul_10605226);
+    }
+    
+
+  return result_10595559;
+
+}
+function search() {
+    function wrapper_10605471() {
+        var elem_10605473 = document.getElementById("searchInput");
+        var value_10605474 = elem_10605473.value;
+        if (!(((value_10605474).length == 0))) {
+        if ((oldtoc_10605439[0] == null)) {
+        oldtoc_10605439[0] = document.getElementById("tocRoot");
+        }
+        
+        var results_10610006 = dosearch_10595556(value_10605474);
+        replaceById_10516189("tocRoot", results_10610006);
+        }
+        else {
+        if (!((oldtoc_10605439[0] == null))) {
+        replaceById_10516189("tocRoot", oldtoc_10605439[0]);
+        }
+        }
+
+      
+    }
+
+    if (!((timer_10605440[0] == null))) {
+    clearTimeout(timer_10605440[0]);
+    }
+    
+    timer_10605440[0] = setTimeout(wrapper_10605471, 400);
+
+  
+}
diff --git a/implementations/nim/htmldocs/joy.html b/implementations/nim/htmldocs/joy.html
new file mode 100644 (file)
index 0000000..a8a83f1
--- /dev/null
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>joy</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">joy</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="printer.html">printer</a>, <a class="reference external" href="reader.html">reader</a>, <a class="reference external" href="types.html">types</a>, <a class="reference external" href="joylib.html">joylib</a>, <a class="reference external" href="utils.html">utils</a>, <a class="reference external" href="defs.html">defs</a>
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-02-20 03:26:16 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/implementations/nim/htmldocs/joylib.html b/implementations/nim/htmldocs/joylib.html
new file mode 100644 (file)
index 0000000..0a7c818
--- /dev/null
@@ -0,0 +1,379 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>joylib</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">joylib</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">cons
+      <li><a class="reference" href="#cons%2CJoyState"
+    title="cons(state: var JoyState)">cons,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">dip
+      <li><a class="reference" href="#dip%2CJoyState"
+    title="dip(state: var JoyState)">dip,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">stack
+      <li><a class="reference" href="#stack%2CJoyState"
+    title="stack(state: var JoyState)">stack,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">first
+      <li><a class="reference" href="#first%2CJoyState"
+    title="first(state: var JoyState)">first,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">swap
+      <li><a class="reference" href="#swap%2CJoyState"
+    title="swap(state: var JoyState)">swap,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">dup
+      <li><a class="reference" href="#dup%2CJoyState"
+    title="dup(state: var JoyState)">dup,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">swaack
+      <li><a class="reference" href="#swaack%2CJoyState"
+    title="swaack(state: var JoyState)">swaack,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">concat
+      <li><a class="reference" href="#concat%2CJoyState"
+    title="concat(state: var JoyState)">concat,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">i
+      <li><a class="reference" href="#i%2CJoyState"
+    title="i(state: var JoyState)">i,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">clear
+      <li><a class="reference" href="#clear%2CJoyState"
+    title="clear(state: var JoyState)">clear,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">loop
+      <li><a class="reference" href="#loop%2CJoyState"
+    title="loop(state: var JoyState)">loop,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">branch
+      <li><a class="reference" href="#branch%2CJoyState"
+    title="branch(state: var JoyState)">branch,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">rest
+      <li><a class="reference" href="#rest%2CJoyState"
+    title="rest(state: var JoyState)">rest,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">truthy
+      <li><a class="reference" href="#truthy%2CJoyState"
+    title="truthy(state: var JoyState)">truthy,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">pop
+      <li><a class="reference" href="#pop%2CJoyState"
+    title="pop(state: var JoyState)">pop,<wbr>JoyState</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>, <a class="reference external" href="utils.html">utils</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="swap,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#swap%2CJoyState"><span class="Identifier">swap</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L24"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L24" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="dup,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#dup%2CJoyState"><span class="Identifier">dup</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L29"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L29" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="pop,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#pop%2CJoyState"><span class="Identifier">pop</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L34"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L34" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="cons,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#cons%2CJoyState"><span class="Identifier">cons</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L39"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L39" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="concat,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#concat%2CJoyState"><span class="Identifier">concat</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L44"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L44" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="stack,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#stack%2CJoyState"><span class="Identifier">stack</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L49"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L49" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="swaack,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#swaack%2CJoyState"><span class="Identifier">swaack</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L52"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L52" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="clear,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#clear%2CJoyState"><span class="Identifier">clear</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L58"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L58" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="first,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#first%2CJoyState"><span class="Identifier">first</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L61"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L61" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="rest,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#rest%2CJoyState"><span class="Identifier">rest</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L67"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L67" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="branch,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#branch%2CJoyState"><span class="Identifier">branch</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L73"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L73" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="loop,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#loop%2CJoyState"><span class="Identifier">loop</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L81"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L81" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="i,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#i%2CJoyState"><span class="Identifier">i</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L90"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L90" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="dip,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#dip%2CJoyState"><span class="Identifier">dip</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L94"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L94" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="truthy,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#truthy%2CJoyState"><span class="Identifier">truthy</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/joylib.nim#L99"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/joylib.nim#L99" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-02-20 03:26:16 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/implementations/nim/htmldocs/joylib.idx b/implementations/nim/htmldocs/joylib.idx
new file mode 100644 (file)
index 0000000..7795708
--- /dev/null
@@ -0,0 +1,15 @@
+swap   joylib.html#swap,JoyState       joylib: swap(state: var JoyState)       
+dup    joylib.html#dup,JoyState        joylib: dup(state: var JoyState)        
+pop    joylib.html#pop,JoyState        joylib: pop(state: var JoyState)        
+cons   joylib.html#cons,JoyState       joylib: cons(state: var JoyState)       
+concat joylib.html#concat,JoyState     joylib: concat(state: var JoyState)     
+stack  joylib.html#stack,JoyState      joylib: stack(state: var JoyState)      
+swaack joylib.html#swaack,JoyState     joylib: swaack(state: var JoyState)     
+clear  joylib.html#clear,JoyState      joylib: clear(state: var JoyState)      
+first  joylib.html#first,JoyState      joylib: first(state: var JoyState)      
+rest   joylib.html#rest,JoyState       joylib: rest(state: var JoyState)       
+branch joylib.html#branch,JoyState     joylib: branch(state: var JoyState)     
+loop   joylib.html#loop,JoyState       joylib: loop(state: var JoyState)       
+i      joylib.html#i,JoyState  joylib: i(state: var JoyState)  
+dip    joylib.html#dip,JoyState        joylib: dip(state: var JoyState)        
+truthy joylib.html#truthy,JoyState     joylib: truthy(state: var JoyState)     
diff --git a/implementations/nim/htmldocs/nimdoc.out.css b/implementations/nim/htmldocs/nimdoc.out.css
new file mode 100644 (file)
index 0000000..3706629
--- /dev/null
@@ -0,0 +1,904 @@
+/*
+Stylesheet for use with Docutils/rst2html.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+
+Modified from Chad Skeeters' rst2html-style
+https://bitbucket.org/cskeeters/rst2html-style/
+
+Modified by Boyd Greenfield and narimiran
+*/
+
+:root {
+  --primary-background: #fff;
+  --secondary-background: ghostwhite;
+  --third-background: #e8e8e8;
+  --border: #dde;
+  --text: #222;
+  --anchor: #07b;
+  --anchor-focus: #607c9f;
+  --input-focus: #1fa0eb;
+  --strong: #3c3c3c;
+  --hint: #9A9A9A;
+  --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN4AAAA9CAYAAADCt9ebAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjAzOjQ4KzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMjoyODo0MSswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMzM0ZjAxYS0yMDExLWE1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");
+
+  --keyword: #5e8f60;
+  --identifier: #222;
+  --comment: #484a86;
+  --operator: #155da4;
+  --punctuation: black;
+  --other: black;
+  --escapeSequence: #c4891b;
+  --number: #252dbe;
+  --literal: #a4255b;
+  --raw-data: #a4255b;
+}
+
+[data-theme="dark"] {
+  --primary-background: #171921;
+  --secondary-background: #1e202a;
+  --third-background: #2b2e3b;
+  --border: #0e1014;
+  --text: #fff;
+  --anchor: #8be9fd;
+  --anchor-focus: #8be9fd;
+  --input-focus: #8be9fd;
+  --strong: #bd93f9;
+  --hint: #7A7C85;
+  --nim-sprite-base64: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABMCAYAAABOBlMuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFFmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDggNzkuMTY0MDM2LCAyMDE5LzA4LzEzLTAxOjA2OjU3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMCAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE5LTEyLTAzVDAxOjE4OjIyKzAxOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxOS0xMi0wM1QwMToyMDoxMCswMTowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplZGViMzU3MC1iNmZjLWQy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");
+
+  --keyword: #ff79c6;
+  --identifier: #f8f8f2;
+  --comment: #6272a4;
+  --operator: #ff79c6;
+  --punctuation: #f8f8f2;
+  --other: #f8f8f2;
+  --escapeSequence: #bd93f9;
+  --number: #bd93f9;
+  --literal: #f1fa8c;
+  --raw-data: #8be9fd;
+}
+
+.theme-switch-wrapper {
+  display: flex;
+  align-items: center;
+}
+
+.theme-switch-wrapper em {
+  margin-left: 10px;
+  font-size: 1rem;
+}
+
+.theme-switch {
+  display: inline-block;
+  height: 22px;
+  position: relative;
+  width: 50px;
+}
+
+.theme-switch input {
+  display: none;
+}
+
+.slider {
+  background-color: #ccc;
+  bottom: 0;
+  cursor: pointer;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+  transition: .4s;
+}
+
+.slider:before {
+  background-color: #fff;
+  bottom: 4px;
+  content: "";
+  height: 13px;
+  left: 4px;
+  position: absolute;
+  transition: .4s;
+  width: 13px;
+}
+
+input:checked + .slider {
+  background-color: #66bb6a;
+}
+
+input:checked + .slider:before {
+  transform: translateX(26px);
+}
+
+.slider.round {
+  border-radius: 17px;
+}
+
+.slider.round:before {
+  border-radius: 50%;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%; }
+
+body {
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-weight: 400;
+  font-size: 1.125em;
+  line-height: 1.5;
+  color: var(--text);
+  background-color: var(--primary-background); }
+
+/* Skeleton grid */
+.container {
+  position: relative;
+  width: 100%;
+  max-width: 1050px;
+  margin: 0 auto;
+  padding: 0;
+  box-sizing: border-box; }
+
+.column,
+.columns {
+  width: 100%;
+  float: left;
+  box-sizing: border-box;
+  margin-left: 1%;
+}
+
+.column:first-child,
+.columns:first-child {
+  margin-left: 0; }
+
+.three.columns {
+  width: 22%;
+}
+
+.nine.columns {
+  width: 77.0%; }
+
+.twelve.columns {
+  width: 100%;
+  margin-left: 0; }
+
+@media screen and (max-width: 860px) {
+  .three.columns {
+    display: none;
+  }
+  .nine.columns {
+    width: 98.0%;
+  }
+  body {
+    font-size: 1em;
+    line-height: 1.35;
+  }
+}
+
+cite {
+  font-style: italic !important; }
+
+
+/* Nim search input */
+div#searchInputDiv {
+  margin-bottom: 1em;
+}
+input#searchInput {
+  width: 80%;
+}
+
+/*
+ * Some custom formatting for input forms.
+ * This also fixes input form colors on Firefox with a dark system theme on Linux.
+ */
+input {
+  -moz-appearance: none;
+  background-color: var(--secondary-background);
+  color: var(--text);
+  border: 1px solid var(--border);
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-size: 0.9em;
+  padding: 6px;
+}
+
+input:focus {
+  border: 1px solid var(--input-focus);
+  box-shadow: 0 0 3px var(--input-focus);
+}
+
+select {
+  -moz-appearance: none;
+  background-color: var(--secondary-background);
+  color: var(--text);
+  border: 1px solid var(--border);
+  font-family: "Lato", "Helvetica Neue", "HelveticaNeue", Helvetica, Arial, sans-serif;
+  font-size: 0.9em;
+  padding: 6px;
+}
+
+select:focus {
+  border: 1px solid var(--input-focus);
+  box-shadow: 0 0 3px var(--input-focus);
+}
+
+/* Docgen styles */
+/* Links */
+a {
+  color: var(--anchor);
+  text-decoration: none;
+}
+
+a span.Identifier {
+  text-decoration: underline;
+  text-decoration-color: #aab;
+}
+
+a.reference-toplevel {
+  font-weight: bold;
+}
+
+a.toc-backref {
+  text-decoration: none;
+  color: var(--text); }
+
+a.link-seesrc {
+  color: #607c9f;
+  font-size: 0.9em;
+  font-style: italic; }
+
+a:hover,
+a:focus {
+  color: var(--anchor-focus);
+  text-decoration: underline; }
+
+a:hover span.Identifier {
+  color: var(--anchor);
+}
+
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline; }
+
+sup {
+  top: -0.5em; }
+
+sub {
+  bottom: -0.25em; }
+
+img {
+  width: auto;
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic; }
+
+@media print {
+  * {
+    color: black !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !important; }
+
+  a,
+  a:visited {
+    text-decoration: underline; }
+
+  a[href]:after {
+    content: " (" attr(href) ")"; }
+
+  abbr[title]:after {
+    content: " (" attr(title) ")"; }
+
+  .ir a:after,
+  a[href^="javascript:"]:after,
+  a[href^="#"]:after {
+    content: ""; }
+
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid; }
+
+  thead {
+    display: table-header-group; }
+
+  tr,
+  img {
+    page-break-inside: avoid; }
+
+  img {
+    max-width: 100% !important; }
+
+  @page {
+    margin: 0.5cm; }
+
+  h1 {
+    page-break-before: always; }
+
+  h1.title {
+    page-break-before: avoid; }
+
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3; }
+
+  h2,
+  h3 {
+    page-break-after: avoid; }
+}
+
+
+p {
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+}
+
+small {
+  font-size: 85%; }
+
+strong {
+  font-weight: 600;
+  font-size: 0.95em;
+  color: var(--strong);
+}
+
+em {
+  font-style: italic; }
+
+h1 {
+  font-size: 1.8em;
+  font-weight: 400;
+  padding-bottom: .25em;
+  border-bottom: 6px solid var(--third-background);
+  margin-top: 2.5em;
+  margin-bottom: 1em;
+  line-height: 1.2em; }
+
+h1.title {
+  padding-bottom: 1em;
+  border-bottom: 0px;
+  font-size: 2.5em;
+  text-align: center;
+  font-weight: 900;
+  margin-top: 0.75em;
+  margin-bottom: 0em;
+}
+
+h2 {
+  font-size: 1.3em;
+  margin-top: 2em; }
+
+h2.subtitle {
+  text-align: center; }
+
+h3 {
+  font-size: 1.125em;
+  font-style: italic;
+  margin-top: 1.5em; }
+
+h4 {
+  font-size: 1.125em;
+  margin-top: 1em; }
+
+h5 {
+  font-size: 1.125em;
+  margin-top: 0.75em; }
+
+h6 {
+  font-size: 1.1em; }
+
+
+ul,
+ol {
+  padding: 0;
+  margin-top: 0.5em;
+  margin-left: 0.75em; }
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+  margin-left: 1.25em; }
+
+ul.simple > li {
+    list-style-type: circle;
+}
+
+ul.simple-boot li {
+    list-style-type: none;
+    margin-left: 0em;
+    margin-bottom: 0.5em;
+}
+
+ol.simple > li, ul.simple > li {
+  margin-bottom: 0.2em;
+  margin-left: 0.4em }
+
+ul.simple.simple-toc > li {
+    margin-top: 1em;
+}
+
+ul.simple-toc {
+  list-style: none;
+  font-size: 0.9em;
+  margin-left: -0.3em;
+  margin-top: 1em; }
+
+ul.simple-toc > li {
+    list-style-type: none;
+}
+
+ul.simple-toc-section {
+  list-style-type: circle;
+  margin-left: 0.8em;
+  color: #6c9aae; }
+
+ul.nested-toc-section {
+  list-style-type: circle;
+  margin-left: -0.75em;
+  color: var(--text);
+}
+
+ul.nested-toc-section > li {
+  margin-left: 1.25em;
+}
+
+
+ol.arabic {
+  list-style: decimal; }
+
+ol.loweralpha {
+  list-style: lower-alpha; }
+
+ol.upperalpha {
+  list-style: upper-alpha; }
+
+ol.lowerroman {
+  list-style: lower-roman; }
+
+ol.upperroman {
+  list-style: upper-roman; }
+
+ul.auto-toc {
+  list-style-type: none; }
+
+
+dl {
+  margin-bottom: 1.5em; }
+
+dt {
+  margin-bottom: -0.5em;
+  margin-left: 0.0em; }
+
+dd {
+  margin-left: 2.0em;
+  margin-bottom: 3.0em;
+  margin-top: 0.5em; }
+
+
+hr {
+  margin: 2em 0;
+  border: 0;
+  border-top: 1px solid #aaa; }
+
+blockquote {
+  font-size: 0.9em;
+  font-style: italic;
+  padding-left: 0.5em;
+  margin-left: 0;
+  border-left: 5px solid #bbc;
+}
+
+.pre {
+  font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-weight: 500;
+  font-size: 0.85em;
+  color: var(--text);
+  background-color: var(--third-background);
+  padding-left: 3px;
+  padding-right: 3px;
+  border-radius: 4px;
+}
+
+pre {
+  font-family: "Source Code Pro", Monaco, Menlo, Consolas, "Courier New", monospace;
+  color: var(--text);
+  font-weight: 500;
+  display: inline-block;
+  box-sizing: border-box;
+  min-width: 100%;
+  padding: 0.5em;
+  margin-top: 0.5em;
+  margin-bottom: 0.5em;
+  font-size: 0.85em;
+  white-space: pre !important;
+  overflow-y: hidden;
+  overflow-x: visible;
+  background-color: var(--secondary-background);
+  border: 1px solid var(--border);
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px; }
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll; }
+
+
+/* Nim line-numbered tables */
+.line-nums-table {
+  width: 100%;
+  table-layout: fixed; }
+
+table.line-nums-table {
+  border-radius: 4px;
+  border: 1px solid #cccccc;
+  background-color: ghostwhite;
+  border-collapse: separate;
+  margin-top: 15px;
+  margin-bottom: 25px; }
+
+.line-nums-table tbody {
+  border: none; }
+
+.line-nums-table td pre {
+  border: none;
+  background-color: transparent; }
+
+.line-nums-table td.blob-line-nums {
+  width: 28px; }
+
+.line-nums-table td.blob-line-nums pre {
+  color: #b0b0b0;
+  -webkit-filter: opacity(75%);
+  text-align: right;
+  border-color: transparent;
+  background-color: transparent;
+  padding-left: 0px;
+  margin-left: 0px;
+  padding-right: 0px;
+  margin-right: 0px; }
+
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  margin-top: 0.5em;
+  margin-bottom: 1.5em;
+  border-collapse: collapse;
+  border-color: var(--third-background);
+  border-spacing: 0;
+  font-size: 0.9em;
+}
+
+table th, table td {
+  padding: 0px 0.5em 0px;
+  border-color: var(--third-background);
+}
+
+table th {
+  background-color: var(--third-background);
+  border-color: var(--third-background);
+  font-weight: bold; }
+
+table th.docinfo-name {
+    background-color: transparent;
+    text-align: right;
+}
+
+table tr:hover {
+  background-color: var(--third-background); }
+
+
+/* rst2html default used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0; }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 !important; }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 !important; }
+
+.last, .with-subtitle {
+  margin-bottom: 0 !important; }
+
+.hidden {
+  display: none; }
+
+blockquote.epigraph {
+  margin: 2em 5em; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em; }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden; }
+
+
+div.figure {
+  margin-left: 2em;
+  margin-right: 2em; }
+
+div.footer, div.header {
+  clear: both;
+  text-align: center;
+  color: #666;
+  font-size: smaller; }
+
+div.footer {
+    padding-top: 5em;
+}
+
+div.line-block {
+  display: block;
+  margin-top: 1em;
+  margin-bottom: 1em; }
+
+div.line-block div.line-block {
+  margin-top: 0;
+  margin-bottom: 0;
+  margin-left: 1.5em; }
+
+div.topic {
+  margin: 2em; }
+
+div.search_results {
+  background-color: var(--third-background);
+  margin: 3em;
+  padding: 1em;
+  border: 1px solid #4d4d4d;
+}
+
+div#global-links ul {
+  margin-left: 0;
+  list-style-type: none;
+}
+
+div#global-links > simple-boot {
+    margin-left: 3em;
+}
+
+hr.docutils {
+  width: 75%; }
+
+img.align-left, .figure.align-left, object.align-left {
+  clear: left;
+  float: left;
+  margin-right: 1em; }
+
+img.align-right, .figure.align-right, object.align-right {
+  clear: right;
+  float: right;
+  margin-left: 1em; }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto; }
+
+.align-left {
+  text-align: left; }
+
+.align-center {
+  clear: both;
+  text-align: center; }
+
+.align-right {
+  text-align: right; }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit; }
+
+p.attribution {
+  text-align: right;
+  margin-left: 50%; }
+
+p.caption {
+  font-style: italic; }
+
+p.credits {
+  font-style: italic;
+  font-size: smaller; }
+
+p.label {
+  white-space: nowrap; }
+
+p.rubric {
+  font-weight: bold;
+  font-size: larger;
+  color: maroon;
+  text-align: center; }
+
+p.topic-title {
+  font-weight: bold; }
+
+pre.address {
+  margin-bottom: 0;
+  margin-top: 0;
+  font: inherit; }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+  margin-left: 2em;
+  margin-right: 2em; }
+
+pre.code .ln {
+  color: grey; }
+
+/* line numbers */
+pre.code, code {
+  background-color: #eeeeee; }
+
+pre.code .comment, code .comment {
+  color: #5c6576; }
+
+pre.code .keyword, code .keyword {
+  color: #3B0D06;
+  font-weight: bold; }
+
+pre.code .literal.string, code .literal.string {
+  color: #0c5404; }
+
+pre.code .name.builtin, code .name.builtin {
+  color: #352b84; }
+
+pre.code .deleted, code .deleted {
+  background-color: #DEB0A1; }
+
+pre.code .inserted, code .inserted {
+  background-color: #A3D289; }
+
+span.classifier {
+  font-style: oblique; }
+
+span.classifier-delimiter {
+  font-weight: bold; }
+
+span.option {
+  white-space: nowrap; }
+
+span.problematic {
+  color: #b30000; }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80%; }
+
+span.DecNumber {
+  color: var(--number); }
+
+span.BinNumber {
+  color: var(--number); }
+
+span.HexNumber {
+  color: var(--number); }
+
+span.OctNumber {
+  color: var(--number); }
+
+span.FloatNumber {
+  color: var(--number); }
+
+span.Identifier {
+  color: var(--identifier); }
+
+span.Keyword {
+  font-weight: 600;
+  color: var(--keyword); }
+
+span.StringLit {
+  color: var(--literal); }
+
+span.LongStringLit {
+  color: var(--literal); }
+
+span.CharLit {
+  color: var(--literal); }
+
+span.EscapeSequence {
+  color: var(--escapeSequence); }
+
+span.Operator {
+  color: var(--operator); }
+
+span.Punctuation {
+  color: var(--punctuation); }
+
+span.Comment, span.LongComment {
+  font-style: italic;
+  font-weight: 400;
+  color: var(--comment); }
+
+span.RegularExpression {
+  color: darkviolet; }
+
+span.TagStart {
+  color: darkviolet; }
+
+span.TagEnd {
+  color: darkviolet; }
+
+span.Key {
+  color: #252dbe; }
+
+span.Value {
+  color: #252dbe; }
+
+span.RawData {
+  color: var(--raw-data); }
+
+span.Assembler {
+  color: #252dbe; }
+
+span.Preprocessor {
+  color: #252dbe; }
+
+span.Directive {
+  color: #252dbe; }
+
+span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference,
+span.Other {
+  color: var(--other); }
+
+/* Pop type, const, proc, and iterator defs in nim def blocks */
+dt pre > span.Identifier, dt pre > span.Operator {
+  color: var(--identifier);
+  font-weight: 700; }
+
+dt pre > span.Keyword ~ span.Identifier, dt pre > span.Identifier ~ span.Identifier,
+dt pre > span.Operator ~ span.Identifier, dt pre > span.Other ~ span.Identifier {
+  color: var(--identifier);
+  font-weight: inherit; }
+
+/* Nim sprite for the footer (taken from main page favicon) */
+.nim-sprite {
+  display: inline-block;
+  width: 51px;
+  height: 14px;
+  background-position: 0 0;
+  background-size: 51px 14px;
+  -webkit-filter: opacity(50%);
+  background-repeat: no-repeat;
+  background-image: var(--nim-sprite-base64);
+  margin-bottom: 5px; }
+
+span.pragmadots {
+  /* Position: relative frees us up to make the dots
+  look really nice without fucking up the layout and
+  causing bulging in the parent container */
+  position: relative;
+  /* 1px down looks slightly nicer */
+  top: 1px;
+  padding: 2px;
+  background-color: var(--third-background);
+  border-radius: 4px;
+  margin: 0 2px;
+  cursor: pointer;
+  font-size: 0.8em;
+}
+
+span.pragmadots:hover {
+  background-color: var(--hint);
+}
+span.pragmawrap {
+  display: none;
+}
+
+span.attachedType {
+  display: none;
+  visibility: hidden;
+}
diff --git a/implementations/nim/htmldocs/printer.html b/implementations/nim/htmldocs/printer.html
new file mode 100644 (file)
index 0000000..ae1d280
--- /dev/null
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>printer</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">printer</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">print_stack
+      <li><a class="reference" href="#print_stack%2CJoyListType"
+    title="print_stack(stack: JoyListType): string">print_stack,<wbr>JoyListType</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">print_expression
+      <li><a class="reference" href="#print_expression%2CJoyListType"
+    title="print_expression(stack: JoyListType): string">print_expression,<wbr>JoyListType</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="print_expression,JoyListType"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#print_expression%2CJoyListType"><span class="Identifier">print_expression</span></a><span class="Other">(</span><span class="Identifier">stack</span><span class="Other">:</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">Exception</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/printer.nim#L38"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/printer.nim#L38" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="print_stack,JoyListType"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#print_stack%2CJoyListType"><span class="Identifier">print_stack</span></a><span class="Other">(</span><span class="Identifier">stack</span><span class="Other">:</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">string</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">Exception</span><span class="Other">]</span><span class="Other">,</span>
+    <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/printer.nim#L41"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/printer.nim#L41" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-02-20 03:26:16 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/implementations/nim/htmldocs/printer.idx b/implementations/nim/htmldocs/printer.idx
new file mode 100644 (file)
index 0000000..8e13ce3
--- /dev/null
@@ -0,0 +1,2 @@
+print_expression       printer.html#print_expression,JoyListType       printer: print_expression(stack: JoyListType): string   
+print_stack    printer.html#print_stack,JoyListType    printer: print_stack(stack: JoyListType): string        
diff --git a/implementations/nim/htmldocs/reader.html b/implementations/nim/htmldocs/reader.html
new file mode 100644 (file)
index 0000000..497672b
--- /dev/null
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>reader</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">reader</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">read_str
+      <li><a class="reference" href="#read_str%2Cstring"
+    title="read_str(str: string): JoyListType">read_str,<wbr>string</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="read_str,string"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#read_str%2Cstring"><span class="Identifier">read_str</span></a><span class="Other">(</span><span class="Identifier">str</span><span class="Other">:</span> <span class="Identifier">string</span><span class="Other">)</span><span class="Other">:</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma">
+    <span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">Exception</span><span class="Other">,</span> <span class="Identifier">ValueError</span><span class="Other">,</span> <span class="Identifier">EInvalidPeg</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">RootEffect</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/reader.nim#L99"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/reader.nim#L99" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-02-20 03:26:16 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/implementations/nim/htmldocs/reader.idx b/implementations/nim/htmldocs/reader.idx
new file mode 100644 (file)
index 0000000..74d274d
--- /dev/null
@@ -0,0 +1 @@
+read_str       reader.html#read_str,string     reader: read_str(str: string): JoyListType      
diff --git a/implementations/nim/htmldocs/theindex.html b/implementations/nim/htmldocs/theindex.html
new file mode 100644 (file)
index 0000000..1c8a233
--- /dev/null
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>Index</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">Index</h1>
+    Modules: <a href="defs.html">defs</a>, <a href="joylib.html">joylib</a>, <a href="printer.html">printer</a>, <a href="reader.html">reader</a>, <a href="types.html">types</a>, <a href="utils.html">utils</a>.<br/><p /><h2>API symbols</h2>
+<dl><dt><a name="branch" href="#branch"><span>branch:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: branch(state: var JoyState)" href="joylib.html#branch%2CJoyState">joylib: branch(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="clear" href="#clear"><span>clear:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: clear(state: var JoyState)" href="joylib.html#clear%2CJoyState">joylib: clear(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="concat" href="#concat"><span>concat:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: concat(state: var JoyState)" href="joylib.html#concat%2CJoyState">joylib: concat(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="cons" href="#cons"><span>cons:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: cons(state: var JoyState)" href="joylib.html#cons%2CJoyState">joylib: cons(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="dictionary" href="#dictionary"><span>dictionary:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="defs: dictionary" href="defs.html#dictionary">defs: dictionary</a></li>
+          </ul></dd>
+<dt><a name="dip" href="#dip"><span>dip:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: dip(state: var JoyState)" href="joylib.html#dip%2CJoyState">joylib: dip(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="dup" href="#dup"><span>dup:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: dup(state: var JoyState)" href="joylib.html#dup%2CJoyState">joylib: dup(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="first" href="#first"><span>first:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: first(state: var JoyState)" href="joylib.html#first%2CJoyState">joylib: first(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="i" href="#i"><span>i:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: i(state: var JoyState)" href="joylib.html#i%2CJoyState">joylib: i(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="j_false" href="#j_false"><span>j_false:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="types: j_false" href="types.html#j_false">types: j_false</a></li>
+          </ul></dd>
+<dt><a name="j_loop" href="#j_loop"><span>j_loop:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="types: j_loop" href="types.html#j_loop">types: j_loop</a></li>
+          </ul></dd>
+<dt><a name="joyAtom" href="#joyAtom"><span>joyAtom:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="JoyTypeType.joyAtom" href="types.html#joyAtom">JoyTypeType.joyAtom</a></li>
+          </ul></dd>
+<dt><a name="joyFalse" href="#joyFalse"><span>joyFalse:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="JoyTypeType.joyFalse" href="types.html#joyFalse">JoyTypeType.joyFalse</a></li>
+          </ul></dd>
+<dt><a name="joyInt" href="#joyInt"><span>joyInt:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="JoyTypeType.joyInt" href="types.html#joyInt">JoyTypeType.joyInt</a></li>
+          </ul></dd>
+<dt><a name="joyList" href="#joyList"><span>joyList:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="JoyTypeType.joyList" href="types.html#joyList">JoyTypeType.joyList</a></li>
+          </ul></dd>
+<dt><a name="JoyListType" href="#JoyListType"><span>JoyListType:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="types: JoyListType" href="types.html#JoyListType">types: JoyListType</a></li>
+          </ul></dd>
+<dt><a name="JoyMapType" href="#JoyMapType"><span>JoyMapType:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="types: JoyMapType" href="types.html#JoyMapType">types: JoyMapType</a></li>
+          </ul></dd>
+<dt><a name="joyParseError" href="#joyParseError"><span>joyParseError:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="JoyTypeType.joyParseError" href="types.html#joyParseError">JoyTypeType.joyParseError</a></li>
+          </ul></dd>
+<dt><a name="JoyState" href="#JoyState"><span>JoyState:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="types: JoyState" href="types.html#JoyState">types: JoyState</a></li>
+          </ul></dd>
+<dt><a name="joyTrue" href="#joyTrue"><span>joyTrue:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="JoyTypeType.joyTrue" href="types.html#joyTrue">JoyTypeType.joyTrue</a></li>
+          </ul></dd>
+<dt><a name="JoyType" href="#JoyType"><span>JoyType:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="types: JoyType" href="types.html#JoyType">types: JoyType</a></li>
+          </ul></dd>
+<dt><a name="JoyTypeType" href="#JoyTypeType"><span>JoyTypeType:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="types: JoyTypeType" href="types.html#JoyTypeType">types: JoyTypeType</a></li>
+          </ul></dd>
+<dt><a name="j_true" href="#j_true"><span>j_true:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="types: j_true" href="types.html#j_true">types: j_true</a></li>
+          </ul></dd>
+<dt><a name="loop" href="#loop"><span>loop:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: loop(state: var JoyState)" href="joylib.html#loop%2CJoyState">joylib: loop(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="pop" href="#pop"><span>pop:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: pop(state: var JoyState)" href="joylib.html#pop%2CJoyState">joylib: pop(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="pop_any" href="#pop_any"><span>pop_any:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="utils: pop_any(state: var JoyState): JoyType" href="utils.html#pop_any%2CJoyState">utils: pop_any(state: var JoyState): JoyType</a></li>
+          </ul></dd>
+<dt><a name="pop_bool" href="#pop_bool"><span>pop_bool:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="utils: pop_bool(state: var JoyState): bool" href="utils.html#pop_bool%2CJoyState">utils: pop_bool(state: var JoyState): bool</a></li>
+          </ul></dd>
+<dt><a name="pop_int" href="#pop_int"><span>pop_int:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="utils: pop_int(state: var JoyState): BigInt" href="utils.html#pop_int%2CJoyState">utils: pop_int(state: var JoyState): BigInt</a></li>
+          </ul></dd>
+<dt><a name="pop_list" href="#pop_list"><span>pop_list:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="utils: pop_list(state: var JoyState): JoyListType" href="utils.html#pop_list%2CJoyState">utils: pop_list(state: var JoyState): JoyListType</a></li>
+          </ul></dd>
+<dt><a name="print_expression" href="#print_expression"><span>print_expression:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="printer: print_expression(stack: JoyListType): string" href="printer.html#print_expression%2CJoyListType">printer: print_expression(stack: JoyListType): string</a></li>
+          </ul></dd>
+<dt><a name="print_stack" href="#print_stack"><span>print_stack:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="printer: print_stack(stack: JoyListType): string" href="printer.html#print_stack%2CJoyListType">printer: print_stack(stack: JoyListType): string</a></li>
+          </ul></dd>
+<dt><a name="push_bool" href="#push_bool"><span>push_bool:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="utils: push_bool(a: bool; state: var JoyState)" href="utils.html#push_bool%2Cbool%2CJoyState">utils: push_bool(a: bool; state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="push_int" href="#push_int"><span>push_int:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="utils: push_int(a: BigInt; state: var JoyState)" href="utils.html#push_int%2CBigInt%2CJoyState">utils: push_int(a: BigInt; state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="push_list" href="#push_list"><span>push_list:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="utils: push_list(a: JoyListType; state: var JoyState)" href="utils.html#push_list%2CJoyListType%2CJoyState">utils: push_list(a: JoyListType; state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="read_str" href="#read_str"><span>read_str:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="reader: read_str(str: string): JoyListType" href="reader.html#read_str%2Cstring">reader: read_str(str: string): JoyListType</a></li>
+          </ul></dd>
+<dt><a name="rest" href="#rest"><span>rest:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: rest(state: var JoyState)" href="joylib.html#rest%2CJoyState">joylib: rest(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="stack" href="#stack"><span>stack:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: stack(state: var JoyState)" href="joylib.html#stack%2CJoyState">joylib: stack(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="swaack" href="#swaack"><span>swaack:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: swaack(state: var JoyState)" href="joylib.html#swaack%2CJoyState">joylib: swaack(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="swap" href="#swap"><span>swap:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: swap(state: var JoyState)" href="joylib.html#swap%2CJoyState">joylib: swap(state: var JoyState)</a></li>
+          </ul></dd>
+<dt><a name="truthy" href="#truthy"><span>truthy:</span></a></dt><dd><ul class="simple">
+<li><a class="reference external"
+          data-doc-search-tag="joylib: truthy(state: var JoyState)" href="joylib.html#truthy%2CJoyState">joylib: truthy(state: var JoyState)</a></li>
+          </ul></dd>
+</dl>
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-02-20 03:26:17 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/implementations/nim/htmldocs/types.html b/implementations/nim/htmldocs/types.html
new file mode 100644 (file)
index 0000000..08d908b
--- /dev/null
@@ -0,0 +1,268 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>types</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">types</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#7" id="57">Types</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#JoyListType"
+    title="JoyListType = List[JoyType]">JoyListType</a></li>
+  <li><a class="reference" href="#JoyMapType"
+    title="JoyMapType = Map[string, JoyListType]">JoyMapType</a></li>
+  <li><a class="reference" href="#JoyState"
+    title="JoyState = tuple[stack: JoyListType, expression: JoyListType]">JoyState</a></li>
+  <li><a class="reference" href="#JoyTypeType"
+    title="JoyTypeType = enum
+  joyAtom, joyFalse, joyInt, joyList, joyParseError, joyTrue">JoyTypeType</a></li>
+  <li><a class="reference" href="#JoyType"
+    title="JoyType = ref object
+  case kind*: JoyTypeType
+  of joyAtom:
+    atomVal*: string
+  of joyFalse, joyTrue:
+    nil
+  of joyInt:
+    intVal*: BigInt
+  of joyList:
+    listVal*: JoyListType
+  of joyParseError:
+    errorMessage*: string">JoyType</a></li>
+
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#9" id="59">Lets</a>
+  <ul class="simple simple-toc-section">
+      <li><a class="reference" href="#j_true"
+    title="j_true = JoyType(kind: joyTrue)">j_true</a></li>
+  <li><a class="reference" href="#j_false"
+    title="j_false = JoyType(kind: joyFalse)">j_false</a></li>
+  <li><a class="reference" href="#j_loop"
+    title="j_loop = JoyType(kind: joyAtom, atomVal: &quot;loop&quot;)">j_loop</a></li>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="7">
+<h1><a class="toc-backref" href="#7">Types</a></h1>
+<dl class="item">
+<a id="JoyListType"></a>
+<dt><pre><a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a> <span class="Other">=</span> <span class="Identifier">List</span><span class="Other">[</span><a href="types.html#JoyType"><span class="Identifier">JoyType</span></a><span class="Other">]</span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/types.nim#L26"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/types.nim#L26" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="JoyMapType"></a>
+<dt><pre><a href="types.html#JoyMapType"><span class="Identifier">JoyMapType</span></a> <span class="Other">=</span> <span class="Identifier">Map</span><span class="Other">[</span><span class="Identifier">string</span><span class="Other">,</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a><span class="Other">]</span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/types.nim#L27"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/types.nim#L27" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="JoyState"></a>
+<dt><pre><a href="types.html#JoyState"><span class="Identifier">JoyState</span></a> <span class="Other">=</span> <span class="Keyword">tuple</span><span class="Other">[</span><span class="Identifier">stack</span><span class="Other">:</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a><span class="Other">,</span> <span class="Identifier">expression</span><span class="Other">:</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a><span class="Other">]</span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/types.nim#L29"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/types.nim#L29" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="JoyTypeType"></a>
+<dt><pre><a href="types.html#JoyTypeType"><span class="Identifier">JoyTypeType</span></a> <span class="Other">=</span> <span class="Keyword">enum</span>
+  <span class="Identifier">joyAtom</span><span class="Other">,</span> <span class="Identifier">joyFalse</span><span class="Other">,</span> <span class="Identifier">joyInt</span><span class="Other">,</span> <span class="Identifier">joyList</span><span class="Other">,</span> <span class="Identifier">joyParseError</span><span class="Other">,</span> <span class="Identifier">joyTrue</span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/types.nim#L33"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/types.nim#L33" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="JoyType"></a>
+<dt><pre><a href="types.html#JoyType"><span class="Identifier">JoyType</span></a> <span class="Other">=</span> <span class="Keyword">ref</span> <span class="Keyword">object</span>
+  <span class="Keyword">case</span> <span class="Identifier">kind</span><span class="Operator">*</span><span class="Other">:</span> <a href="types.html#JoyTypeType"><span class="Identifier">JoyTypeType</span></a>
+  <span class="Keyword">of</span> <span class="Identifier">joyAtom</span><span class="Other">:</span>
+    <span class="Identifier">atomVal</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">string</span>
+  <span class="Keyword">of</span> <span class="Identifier">joyFalse</span><span class="Other">,</span> <span class="Identifier">joyTrue</span><span class="Other">:</span>
+    <span class="Keyword">nil</span>
+  <span class="Keyword">of</span> <span class="Identifier">joyInt</span><span class="Other">:</span>
+    <span class="Identifier">intVal</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">BigInt</span>
+  <span class="Keyword">of</span> <span class="Identifier">joyList</span><span class="Other">:</span>
+    <span class="Identifier">listVal</span><span class="Operator">*</span><span class="Other">:</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a>
+  <span class="Keyword">of</span> <span class="Identifier">joyParseError</span><span class="Other">:</span>
+    <span class="Identifier">errorMessage</span><span class="Operator">*</span><span class="Other">:</span> <span class="Identifier">string</span>
+  </pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/types.nim#L41"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/types.nim#L41" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+
+</dl></div>
+<div class="section" id="9">
+<h1><a class="toc-backref" href="#9">Lets</a></h1>
+<dl class="item">
+<a id="j_true"></a>
+<dt><pre><a href="types.html#j_true"><span class="Identifier">j_true</span></a> <span class="Other">=</span> <a href="types.html#JoyType"><span class="Identifier">JoyType</span></a><span class="Other">(</span><span class="Identifier">kind</span><span class="Other">:</span> <span class="DecNumber">joyTrue</span><span class="Other">)</span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/types.nim#L52"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/types.nim#L52" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="j_false"></a>
+<dt><pre><a href="types.html#j_false"><span class="Identifier">j_false</span></a> <span class="Other">=</span> <a href="types.html#JoyType"><span class="Identifier">JoyType</span></a><span class="Other">(</span><span class="Identifier">kind</span><span class="Other">:</span> <span class="DecNumber">joyFalse</span><span class="Other">)</span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/types.nim#L53"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/types.nim#L53" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="j_loop"></a>
+<dt><pre><a href="types.html#j_loop"><span class="Identifier">j_loop</span></a> <span class="Other">=</span> <a href="types.html#JoyType"><span class="Identifier">JoyType</span></a><span class="Other">(</span><span class="Identifier">kind</span><span class="Other">:</span> <span class="DecNumber">joyAtom</span><span class="Other">,</span> <span class="Identifier">atomVal</span><span class="Other">:</span> <span class="StringLit">&quot;loop&quot;</span><span class="Other">)</span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/types.nim#L57"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/types.nim#L57" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-02-20 03:26:16 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/implementations/nim/htmldocs/types.idx b/implementations/nim/htmldocs/types.idx
new file mode 100644 (file)
index 0000000..1d759ea
--- /dev/null
@@ -0,0 +1,14 @@
+JoyListType    types.html#JoyListType  types: JoyListType      
+JoyMapType     types.html#JoyMapType   types: JoyMapType       
+JoyState       types.html#JoyState     types: JoyState 
+joyAtom        types.html#joyAtom      JoyTypeType.joyAtom     
+joyFalse       types.html#joyFalse     JoyTypeType.joyFalse    
+joyInt types.html#joyInt       JoyTypeType.joyInt      
+joyList        types.html#joyList      JoyTypeType.joyList     
+joyParseError  types.html#joyParseError        JoyTypeType.joyParseError       
+joyTrue        types.html#joyTrue      JoyTypeType.joyTrue     
+JoyTypeType    types.html#JoyTypeType  types: JoyTypeType      
+JoyType        types.html#JoyType      types: JoyType  
+j_true types.html#j_true       types: j_true   
+j_false        types.html#j_false      types: j_false  
+j_loop types.html#j_loop       types: j_loop   
diff --git a/implementations/nim/htmldocs/utils.html b/implementations/nim/htmldocs/utils.html
new file mode 100644 (file)
index 0000000..ac1192a
--- /dev/null
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--  This file is generated by Nim. -->
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<!-- Favicon -->
+<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAUAAAAF////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAIAAABbAAAAlQAAAKIAAACbAAAAmwAAAKIAAACVAAAAWwAAAAL///8A////AP///wD///8A////AAAAABQAAADAAAAAYwAAAA3///8A////AP///wD///8AAAAADQAAAGMAAADAAAAAFP///wD///8A////AP///wAAAACdAAAAOv///wD///8A////AP///wD///8A////AP///wD///8AAAAAOgAAAJ3///8A////AP///wAAAAAnAAAAcP///wAAAAAoAAAASv///wD///8A////AP///wAAAABKAAAAKP///wAAAABwAAAAJ////wD///8AAAAAgQAAABwAAACIAAAAkAAAAJMAAACtAAAAFQAAABUAAACtAAAAkwAAAJAAAACIAAAAHAAAAIH///8A////AAAAAKQAAACrAAAAaP///wD///8AAAAARQAAANIAAADSAAAARf///wD///8AAAAAaAAAAKsAAACk////AAAAADMAAACcAAAAnQAAABj///8A////AP///wAAAAAYAAAAGP///wD///8A////AAAAABgAAACdAAAAnAAAADMAAAB1AAAAwwAAAP8AAADpAAAAsQAAAE4AAAAb////AP///wAAAAAbAAAATgAAALEAAADpAAAA/wAAAMMAAAB1AAAAtwAAAOkAAAD/AAAA/wAAAP8AAADvAAAA3gAAAN4AAADeAAAA3gAAAO8AAAD/AAAA/wAAAP8AAADpAAAAtwAAAGUAAAA/AAAA3wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAPwAAAGX///8A////AAAAAEgAAADtAAAAvwAAAL0AAADGAAAA7wAAAO8AAADGAAAAvQAAAL8AAADtAAAASP///wD///8A////AP///wD///8AAAAAO////wD///8A////AAAAAIcAAACH////AP///wD///8AAAAAO////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD4HwAA7/cAAN/7AAD//wAAoYUAAJ55AACf+QAAh+EAAAAAAADAAwAA4AcAAP5/AAD//wAA//8AAA=="/>
+<link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAB3RJTUUH4QQQEwksSS9ZWwAAAk1JREFUWMPtll2ITVEUx39nn/O7Y5qR8f05wtCUUr6ZIS++8pEnkZInPImneaCQ5METNdOkeFBKUhMPRIkHKfEuUZSUlGlKPN2TrgfncpvmnntnmlEyq1Z7t89/rf9a6+y99oZxGZf/XeIq61EdtgKXgdXA0xrYAvBjOIF1AI9zvjcC74BSpndrJPkBWDScTF8Aa4E3wDlgHbASaANmVqlcCnwHvgDvgVfAJ+AikAAvgfVZwLnSVZHZaOuKoQi3ZOMi4NkYkpe1p4J7A8BpYAD49hfIy/oqG0+hLomiKP2L5L+1ubn5115S+3OAn4EnwBlgMzCjyt6ZAnQCJ4A7wOs88iRJHvw50HoujuPBoCKwHWiosy8MdfZnAdcHk8dxXFJ3VQbQlCTJvRBCGdRbD4M6uc5glpY3eAihpN5S5w12diSEcCCEcKUO4ljdr15T76ur1FDDLIQQ3qv71EdDOe3Kxj3leRXyk+pxdWnFWod6Wt2bY3de3aSuUHcPBVimHs7mK9WrmeOF6lR1o9qnzskh2ar2qm1qizpfXaPeVGdlmGN5pb09qMxz1Xb1kLqgzn1RyH7JUXW52lr5e/Kqi9qpto7V1atuUzfnARrV7jEib1T76gG2qxdGmXyiekkt1GswPTtek0aBfJp6YySGBfWg2tPQ0FAYgf1stUfdmdcjarbYJEniKIq6gY/Aw+zWHAC+p2labGpqiorFYgGYCEzN7oQdQClN07O1/EfDyGgC0ALMBdYAi4FyK+4H3gLPsxfR1zRNi+NP7nH5J+QntnXe5B5mpfQAAAAASUVORK5CYII=">
+
+<!-- Google fonts -->
+<link href='https://fonts.googleapis.com/css?family=Lato:400,600,900' rel='stylesheet' type='text/css'/>
+<link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:400,500,600' rel='stylesheet' type='text/css'/>
+
+<!-- CSS -->
+<title>utils</title>
+<link rel="stylesheet" type="text/css" href="nimdoc.out.css">
+
+<script type="text/javascript" src="dochack.js"></script>
+
+<script type="text/javascript">
+function main() {
+  var pragmaDots = document.getElementsByClassName("pragmadots");
+  for (var i = 0; i < pragmaDots.length; i++) {
+    pragmaDots[i].onclick = function(event) {
+      // Hide tease
+      event.target.parentNode.style.display = "none";
+      // Show actual
+      event.target.parentNode.nextElementSibling.style.display = "inline";
+    }
+  }
+
+  const toggleSwitch = document.querySelector('.theme-switch input[type="checkbox"]');
+  function switchTheme(e) {
+      if (e.target.checked) {
+          document.documentElement.setAttribute('data-theme', 'dark');
+          localStorage.setItem('theme', 'dark');
+      } else {
+          document.documentElement.setAttribute('data-theme', 'light');
+          localStorage.setItem('theme', 'light');
+      }
+  }
+
+  toggleSwitch.addEventListener('change', switchTheme, false);
+
+  const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
+  if (currentTheme) {
+    document.documentElement.setAttribute('data-theme', currentTheme);
+
+    if (currentTheme === 'dark') {
+      toggleSwitch.checked = true;
+    }
+  }
+}
+</script>
+
+</head>
+<body onload="main()">
+<div class="document" id="documentId">
+  <div class="container">
+    <h1 class="title">utils</h1>
+    <div class="row">
+  <div class="three columns">
+  <div class="theme-switch-wrapper">
+    <label class="theme-switch" for="checkbox">
+      <input type="checkbox" id="checkbox" />
+      <div class="slider round"></div>
+    </label>
+    &nbsp;&nbsp;&nbsp; <em>Dark Mode</em>
+  </div>
+  <div id="global-links">
+    <ul class="simple">
+    <li>
+      <a href="theindex.html">Index</a>
+    </li>
+    </ul>
+  </div>
+  <div id="searchInputDiv">
+    Search: <input type="text" id="searchInput"
+      onkeyup="search()" />
+  </div>
+  <div>
+    Group by:
+    <select onchange="groupBy(this.value)">
+      <option value="section">Section</option>
+      <option value="type">Type</option>
+    </select>
+  </div>
+  <ul class="simple simple-toc" id="toc-list">
+<li>
+  <a class="reference reference-toplevel" href="#6" id="56">Imports</a>
+  <ul class="simple simple-toc-section">
+    
+  </ul>
+</li>
+<li>
+  <a class="reference reference-toplevel" href="#12" id="62">Procs</a>
+  <ul class="simple simple-toc-section">
+      <ul class="simple nested-toc-section">pop_any
+      <li><a class="reference" href="#pop_any%2CJoyState"
+    title="pop_any(state: var JoyState): JoyType">pop_any,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">pop_bool
+      <li><a class="reference" href="#pop_bool%2CJoyState"
+    title="pop_bool(state: var JoyState): bool">pop_bool,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">push_int
+      <li><a class="reference" href="#push_int%2CBigInt%2CJoyState"
+    title="push_int(a: BigInt; state: var JoyState)">push_int,<wbr>BigInt,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">pop_int
+      <li><a class="reference" href="#pop_int%2CJoyState"
+    title="pop_int(state: var JoyState): BigInt">pop_int,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">push_list
+      <li><a class="reference" href="#push_list%2CJoyListType%2CJoyState"
+    title="push_list(a: JoyListType; state: var JoyState)">push_list,<wbr>JoyListType,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">push_bool
+      <li><a class="reference" href="#push_bool%2Cbool%2CJoyState"
+    title="push_bool(a: bool; state: var JoyState)">push_bool,<wbr>bool,<wbr>JoyState</a></li>
+
+  </ul>
+  <ul class="simple nested-toc-section">pop_list
+      <li><a class="reference" href="#pop_list%2CJoyState"
+    title="pop_list(state: var JoyState): JoyListType">pop_list,<wbr>JoyState</a></li>
+
+  </ul>
+
+  </ul>
+</li>
+
+</ul>
+
+  </div>
+  <div class="nine columns" id="content">
+  <div id="tocRoot"></div>
+  
+  <p class="module-desc"></p>
+  <div class="section" id="6">
+<h1><a class="toc-backref" href="#6">Imports</a></h1>
+<dl class="item">
+<a class="reference external" href="types.html">types</a>
+</dl></div>
+<div class="section" id="12">
+<h1><a class="toc-backref" href="#12">Procs</a></h1>
+<dl class="item">
+<a id="pop_any,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#pop_any%2CJoyState"><span class="Identifier">pop_any</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span><span class="Other">:</span> <a href="types.html#JoyType"><span class="Identifier">JoyType</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/utils.nim#L25"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/utils.nim#L25" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="pop_bool,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#pop_bool%2CJoyState"><span class="Identifier">pop_bool</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">bool</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/utils.nim#L33"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/utils.nim#L33" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="pop_int,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#pop_int%2CJoyState"><span class="Identifier">pop_int</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span><span class="Other">:</span> <span class="Identifier">BigInt</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/utils.nim#L41"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/utils.nim#L41" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="pop_list,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#pop_list%2CJoyState"><span class="Identifier">pop_list</span></a><span class="Other">(</span><span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span><span class="Other">:</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ValueError</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/utils.nim#L49"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/utils.nim#L49" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="push_int,BigInt,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#push_int%2CBigInt%2CJoyState"><span class="Identifier">push_int</span></a><span class="Other">(</span><span class="Identifier">a</span><span class="Other">:</span> <span class="Identifier">BigInt</span><span class="Other">;</span> <span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/utils.nim#L58"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/utils.nim#L58" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="push_list,JoyListType,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#push_list%2CJoyListType%2CJoyState"><span class="Identifier">push_list</span></a><span class="Other">(</span><span class="Identifier">a</span><span class="Other">:</span> <a href="types.html#JoyListType"><span class="Identifier">JoyListType</span></a><span class="Other">;</span> <span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/utils.nim#L61"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/utils.nim#L61" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+<a id="push_bool,bool,JoyState"></a>
+<dt><pre><span class="Keyword">proc</span> <a href="#push_bool%2Cbool%2CJoyState"><span class="Identifier">push_bool</span></a><span class="Other">(</span><span class="Identifier">a</span><span class="Other">:</span> <span class="Identifier">bool</span><span class="Other">;</span> <span class="Identifier">state</span><span class="Other">:</span> <span class="Keyword">var</span> <a href="types.html#JoyState"><span class="Identifier">JoyState</span></a><span class="Other">)</span> <span><span class="Other">{</span><span class="Other pragmadots">...</span><span class="Other">}</span></span><span class="pragmawrap"><span class="Other">{.</span><span class="pragma"><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span></span><span class="Other">.}</span></span></pre></dt>
+<dd>
+
+
+&nbsp;&nbsp;<a
+href="https://git.sr.ht/~sforman/Bliss/tree/10b5651ed242fb16c29f2c1f7340d77f65926ca4/utils.nim#L64"
+class="link-seesrc" target="_blank">Source</a>
+<a href="https://git.sr.ht/~sforman/Bliss/edit/devel/utils.nim#L64" class="link-seesrc" target="_blank" >Edit</a>
+
+</dd>
+
+</dl></div>
+
+  </div>
+</div>
+
+    <div class="row">
+      <div class="twelve-columns footer">
+        <span class="nim-sprite"></span>
+        <br/>
+        <small style="color: var(--hint);">Made with Nim. Generated: 2021-02-20 03:26:16 UTC</small>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
diff --git a/implementations/nim/htmldocs/utils.idx b/implementations/nim/htmldocs/utils.idx
new file mode 100644 (file)
index 0000000..5c4aaee
--- /dev/null
@@ -0,0 +1,7 @@
+pop_any        utils.html#pop_any,JoyState     utils: pop_any(state: var JoyState): JoyType    
+pop_bool       utils.html#pop_bool,JoyState    utils: pop_bool(state: var JoyState): bool      
+pop_int        utils.html#pop_int,JoyState     utils: pop_int(state: var JoyState): BigInt     
+pop_list       utils.html#pop_list,JoyState    utils: pop_list(state: var JoyState): JoyListType       
+push_int       utils.html#push_int,BigInt,JoyState     utils: push_int(a: BigInt; state: var JoyState) 
+push_list      utils.html#push_list,JoyListType,JoyState       utils: push_list(a: JoyListType; state: var JoyState)   
+push_bool      utils.html#push_bool,bool,JoyState      utils: push_bool(a: bool; state: var JoyState)  
diff --git a/implementations/nim/joy.nim b/implementations/nim/joy.nim
new file mode 100644 (file)
index 0000000..d74cb7b
--- /dev/null
@@ -0,0 +1,145 @@
+#[
+
+    Copyright © 2021 Simon Forman
+
+    This file is part of Bliss
+
+    Bliss 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 3 of the License, or
+    (at your option) any later version.
+
+    Bliss 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 Bliss.  If not see <http://www.gnu.org/licenses/>.
+
+
+]#
+import rdstdin, bigints, fp, printer, reader, types, joylib, utils, defs
+
+
+# Handle Ctrl-C by raising an IOError to break out of the mainloop
+# without waiting for the user to press enter.
+proc ctrlc() {.noconv.} =
+  raise newException(IOError, "Got Ctrl-C, bye!")
+
+setControlCHook(ctrlc)
+
+
+proc joy_eval(sym: string, state: var JoyState): JoyState =
+  case sym
+
+  # Integer Math
+
+  of "+": push_int(pop_int(state) + pop_int(state), state)
+  of "*": push_int(pop_int(state) * pop_int(state), state)
+  of "-":
+    let tos = pop_int(state)
+    push_int(pop_int(state) - tos, state)
+  of "/":
+    let tos = pop_int(state)
+    push_int(pop_int(state) div tos, state)
+  of "%":
+    let tos = pop_int(state)
+    push_int(pop_int(state) mod tos, state)
+
+  # Comparision
+
+  of "<":
+    let tos = pop_int(state)
+    let second = pop_int(state)
+    push_bool(second < tos, state)
+  of ">":
+    let tos = pop_int(state)
+    let second = pop_int(state)
+    push_bool(second > tos, state)
+  of "<=":
+    let tos = pop_int(state)
+    let second = pop_int(state)
+    push_bool(second <= tos, state)
+  of ">=":
+    let tos = pop_int(state)
+    let second = pop_int(state)
+    push_bool(second >= tos, state)
+  of "=":
+    let tos = pop_int(state)
+    let second = pop_int(state)
+    push_bool(second == tos, state)
+  of "<>":
+    let tos = pop_int(state)
+    let second = pop_int(state)
+    push_bool(second != tos, state)
+
+  # Boolean logic
+
+  of "and":  # Have to pop, Nim `and` short-circuits.
+    let tos = pop_bool(state)
+    let second = pop_bool(state)
+    push_bool(tos and second, state)
+  of "or":  # Have to pop, Nim `or` short-circuits.
+    let tos = pop_bool(state)
+    let second = pop_bool(state)
+    push_bool(tos or second, state)
+
+  # Built-in Functions and Combinators
+
+  of "bool": truthy(state)
+  of "branch": branch(state)
+  of "clear": clear(state)
+  of "concat": concat(state)
+  of "cons": cons(state)
+  of "dip": dip(state)
+  of "dup": dup(state)
+  of "first": first(state)
+  of "i": i(state)
+  of "loop": loop(state)
+  of "pop": pop(state)
+  of "rest": rest(state)
+  of "stack": stack(state)
+  of "swaack": swaack(state)
+  of "swap": swap(state)
+
+  else:
+    let def = dictionary.get(sym)
+    if def.isEmpty:
+      raise newException(ValueError, "Unknown: " & sym)
+    state.expression = def.get() ++ state.expression
+  state
+
+
+proc joy(state: var JoyState) =
+  while not state.expression.isEmpty:
+    # echo print_stack(state.stack), " . ", print_expression(state.expression)
+    let term = state.expression.head
+    state.expression = state.expression.tail
+    case term.kind
+    of joyInt, joyList, joyTrue, joyFalse:
+      state.stack = term ^^ state.stack
+    of joyAtom:
+      state = joy_eval(term.atomVal, state)
+    of joyParseError:
+      echo term.errorMessage
+      break
+
+
+
+var state0: JoyState = (stack: Nil[JoyType](), expression: Nil[JoyType]())
+var state: JoyState
+while true:
+  try:
+    let e = read_str(readLineFromStdin("joy? "))
+    state = (stack: state0.stack, expression: e)
+  except IOError:
+    break
+  try:
+    joy(state)
+  except:
+    echo getCurrentExceptionMsg()
+    echo print_stack(state0.stack)
+    continue
+  echo print_stack(state.stack)
+  state0 = state
diff --git a/implementations/nim/joylib.nim b/implementations/nim/joylib.nim
new file mode 100644 (file)
index 0000000..f5b20ac
--- /dev/null
@@ -0,0 +1,110 @@
+#[
+
+    Copyright © 2021 Simon Forman
+
+    This file is part of Bliss
+
+    Bliss 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 3 of the License, or
+    (at your option) any later version.
+
+    Bliss 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 Bliss.  If not see <http://www.gnu.org/licenses/>.
+
+
+]#
+import bigints, fp, types, utils
+
+proc branch*(state: var JoyState) =
+  let true_body = pop_list(state)
+  let false_body = pop_list(state)
+  if pop_bool(state):
+    state.expression = true_body ++ state.expression
+  else:
+    state.expression = false_body ++ state.expression
+
+proc clear*(state: var JoyState) =
+  state.stack = Nil[JoyType]()
+
+proc concat*(state: var JoyState) =
+  let tos = pop_list(state)
+  let second = pop_list(state)
+  push_list((second ++ tos), state)
+
+proc cons*(state: var JoyState) =
+  let tos = pop_list(state)
+  let second = pop_any(state)
+  push_list((second ^^ tos), state)
+
+proc dip*(state: var JoyState) =
+  let body = pop_list(state)
+  let tos = pop_any(state)
+  state.expression = body ++ tos ^^ state.expression
+
+proc dup*(state: var JoyState) =
+  if state.stack.isEmpty:
+    raise newException(ValueError, "Cannot dup empty stack.")
+  state.stack = state.stack.head ^^ state.stack
+
+proc first*(state: var JoyState) =
+  let tos = pop_list(state)
+  if tos.isEmpty:
+    raise newException(ValueError, "Cannot take first of empty list.")
+  state.stack = tos.head ^^ state.stack
+
+proc i*(state: var JoyState) =
+  let body = pop_list(state)
+  state.expression = body ++ state.expression
+
+proc loop*(state: var JoyState) =
+  let tos = pop_any(state)
+  case tos.kind:
+  of joyList:
+    if pop_bool(state):
+      state.expression = tos.listVal ++ tos ^^ j_loop ^^ state.expression
+  else:
+    raise newException(ValueError, "Loop body not a list.")
+
+proc pop*(state: var JoyState) =
+  if state.stack.isEmpty:
+    raise newException(ValueError, "Cannot pop empty stack.")
+  state.stack = state.stack.tail
+
+proc rest*(state: var JoyState) =
+  let tos = pop_list(state)
+  if tos.isEmpty:
+    raise newException(ValueError, "Cannot take rest of empty list.")
+  push_list(tos.tail, state)
+
+proc stack*(state: var JoyState) =
+  push_list(state.stack, state)
+
+proc swaack*(state: var JoyState) =
+  let tos = pop_list(state)
+  let stack = state.stack
+  state.stack = tos
+  push_list(stack, state)
+
+proc swap*(state: var JoyState) =
+  let tos = pop_any(state)
+  let second = pop_any(state)
+  state.stack = second ^^ tos ^^ state.stack
+
+proc truthy*(state: var JoyState) =
+  let tos = pop_any(state)
+  case tos.kind:
+  of joyTrue, joyFalse: 
+    state.stack = tos ^^ state.stack
+  of joyInt:
+    push_bool(tos.intVal != zero, state)
+  of joyList:
+    push_bool(not tos.listVal.isEmpty, state)
+  else:
+    raise newException(ValueError, "Cannot Boolify.")
+
diff --git a/implementations/nim/printer.nim b/implementations/nim/printer.nim
new file mode 100644 (file)
index 0000000..102e616
--- /dev/null
@@ -0,0 +1,43 @@
+#[
+
+    Copyright © 2021 Simon Forman
+
+    This file is part of Bliss
+
+    Bliss 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 3 of the License, or
+    (at your option) any later version.
+
+    Bliss 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 Bliss.  If not see <http://www.gnu.org/licenses/>.
+
+
+]#
+import strutils, bigints, fp, types
+
+proc pr_str(thing: JoyType): string
+
+proc joystr(s: JoyListType): string =
+  s.map(pr_str).asSeq.join(" ")
+
+proc pr_str(thing: JoyType): string =
+  case thing.kind
+  of joyAtom: thing.atomVal
+  of joyInt: thing.intVal.toString
+  of joyList: "[" & joystr(thing.listVal) & "]"
+  of joyParseError: thing.errorMessage
+  of joyTrue: "true"
+  of joyFalse: "false"
+
+proc print_expression*(stack: JoyListType): string =
+  joystr(stack)
+
+proc print_stack*(stack: JoyListType): string =
+  joystr(stack.reverse)
+
diff --git a/implementations/nim/reader.nim b/implementations/nim/reader.nim
new file mode 100644 (file)
index 0000000..5e5cee3
--- /dev/null
@@ -0,0 +1,107 @@
+#[
+
+    Copyright © 2021 Simon Forman
+
+    This file is part of Bliss
+
+    Bliss 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 3 of the License, or
+    (at your option) any later version.
+
+    Bliss 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 Bliss.  If not see <http://www.gnu.org/licenses/>.
+
+
+]#
+import pegs, bigints, fp, types
+
+type
+
+  Token = string
+
+  Reader = tuple
+    tokens : seq[Token]
+    position: int
+    eof: bool
+
+let token_pattern = peg"""
+
+  Token <- Bracket / Symbol
+
+  Bracket <- '[' / ']'
+  Symbol <- (!Bracket \S)+
+
+  """
+
+# TODO: Maybe use PEG eventParser?
+
+
+proc peek(reader: Reader): Token =
+  reader.tokens[reader.position]
+
+
+proc next(reader: var Reader): Token =
+  if reader.eof:
+    raise newException(ValueError, "EOF")
+  result = peek(reader)
+  inc reader.position
+  reader.eof = reader.position >= reader.tokens.len
+
+
+proc read_atom(reader: var Reader): JoyType =
+  let tok = next(reader)
+  if tok =~ peg"^('+' / '-' )? \d+$":
+    JoyType(kind: joyInt, intVal: tok.initBigInt)
+  elif tok == "true": j_true
+  elif tok == "false": j_false
+  else: JoyType(kind: joyAtom, atomVal: tok)
+
+
+proc read_form(reader: var Reader): JoyType
+
+
+proc read_list(reader: var Reader): JoyType =
+  var items : seq[JoyType] = @[]
+  discard next(reader)  # Skip the '['.
+  while true:
+    if reader.eof:
+      return JoyType(kind: joyParseError, errorMessage: "EOF while scanning list.")
+    if peek(reader) == "]":
+      discard next(reader)  # Skip the ']'.
+      break
+    items.add(read_form(reader))
+  JoyType(kind: joyList, listVal: items.asList)
+
+
+proc read_form(reader: var Reader): JoyType =
+  if reader.eof:
+    # Blank or empty input, not really an error.
+    JoyType(kind: joyParseError, errorMessage: "")
+  elif peek(reader) == "[":
+    read_list(reader)
+  else:
+    read_atom(reader)
+
+
+proc tokens_to_reader(tokens: seq[Token]): Reader =
+  var reader: Reader = (
+    tokens: tokens,
+    position: 0,
+    eof: tokens.len == 0
+    )
+  reader
+
+
+proc read_str*(str: string): JoyListType =
+  var items : seq[JoyType] = @[]
+  var reader = tokens_to_reader(findAll(str, token_pattern))
+  while not reader.eof:
+    items.add(read_form(reader))
+  items.asList
+
diff --git a/implementations/nim/types.nim b/implementations/nim/types.nim
new file mode 100644 (file)
index 0000000..4e85d73
--- /dev/null
@@ -0,0 +1,58 @@
+#[
+
+    Copyright © 2021 Simon Forman
+
+    This file is part of Bliss
+
+    Bliss 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 3 of the License, or
+    (at your option) any later version.
+
+    Bliss 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 Bliss.  If not see <http://www.gnu.org/licenses/>.
+
+
+]#
+import bigints, fp
+
+type
+
+  JoyListType* = List[JoyType]
+  JoyMapType* = Map[string, JoyListType]
+
+  JoyState* = tuple
+    stack: JoyListType
+    expression: JoyListType
+
+  JoyTypeType* = enum
+    joyAtom,
+    joyFalse,
+    joyInt,
+    joyList,
+    joyParseError,
+    joyTrue
+
+  JoyType* = ref object
+    case kind*: JoyTypeType
+    of joyAtom: atomVal*: string
+    of joyFalse, joyTrue: nil
+    of joyInt: intVal*: BigInt
+    of joyList: listVal*: JoyListType
+    of joyParseError: errorMessage*: string
+
+
+# Singleton values for Boolean type.
+
+let j_true* = JoyType(kind: joyTrue)
+let j_false* = JoyType(kind: joyFalse)
+
+# Singleton values for Symbols.
+
+let j_loop* = JoyType(kind: joyAtom, atomVal: "loop")
+
diff --git a/implementations/nim/utils.nim b/implementations/nim/utils.nim
new file mode 100644 (file)
index 0000000..860ee37
--- /dev/null
@@ -0,0 +1,69 @@
+#[
+
+    Copyright © 2021 Simon Forman
+
+    This file is part of Bliss
+
+    Bliss 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 3 of the License, or
+    (at your option) any later version.
+
+    Bliss 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 Bliss.  If not see <http://www.gnu.org/licenses/>.
+
+
+]#
+import bigints, fp, types
+
+
+proc pop_any*(state: var JoyState): JoyType =
+  # TODO: detect and report nils.
+  if state.stack.isEmpty:
+    raise newException(ValueError, "Not enough values on stack.")
+  let a = state.stack.head
+  state.stack = state.stack.tail
+  return a
+
+proc pop_bool*(state: var JoyState): bool =
+  let a = pop_any(state)
+  case a.kind:
+  of joyTrue: result = true
+  of joyFalse: result = false
+  else:
+    raise newException(ValueError, "Not a Boolean value.")
+
+proc pop_int*(state: var JoyState): BigInt =
+  let a = pop_any(state)
+  case a.kind:
+  of joyInt:
+    return a.intVal
+  else:
+    raise newException(ValueError, "Not an integer.")
+
+proc pop_list*(state: var JoyState): JoyListType =
+  let a = pop_any(state)
+  case a.kind:
+  of joyList:
+    return a.listVal
+  else:
+    raise newException(ValueError, "Not a list.")
+
+
+proc push_int*(a: BigInt, state: var JoyState) =
+  state.stack = JoyType(kind: joyInt, intVal: a) ^^ state.stack
+
+proc push_list*(a: JoyListType, state: var JoyState) =
+  state.stack = JoyType(kind: joyList, listVal: a) ^^ state.stack
+
+proc push_bool*(a: bool, state: var JoyState) =
+  if a:
+    state.stack = j_true ^^ state.stack
+  else:
+    state.stack = j_false ^^ state.stack
+