aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2024-01-18 23:07:21 +0100
committerMarvin Borner2024-01-18 23:07:21 +0100
commit5c713d1e2da06b50fa0016086c2e8443624cbb68 (patch)
tree152e71c0e985daf0d1c550784a8af7abca86e239
parent11a94bd667c706466e7c281f59e918155cba1321 (diff)
Bitmaps should've been recursive
I think? Maybe the topological sort implementation is just wrong
-rw-r--r--readme.md57
-rw-r--r--src/targets/blc.c54
-rw-r--r--src/targets/unblc.c1
-rw-r--r--test/aoc.blc.io (renamed from test/aoc.blc.i)2
-rw-r--r--test/huh.blc.io1
-rw-r--r--test/huh.blc.io.in1
-rw-r--r--test/huh.bruijn18
7 files changed, 65 insertions, 69 deletions
diff --git a/readme.md b/readme.md
index 6e4e686..f266870 100644
--- a/readme.md
+++ b/readme.md
@@ -10,16 +10,47 @@ benchmarking, or general term optimization.
## Targets
-- BLC (sharing by abstraction): Terms having BLoC entry indices get
- abstracted and applied to the respective term. The indices get
- converted to De Bruijn indices. The dependency graph is resolved by
- a topological sort. Flag `bblc` (bits) and `blc` (ASCII 0/1).
-- BLC (unshared): Every BLoC entry gets reinserted into the original
- term. Do not use this if you want efficiency or small files. Flag
- `unbblc` (bits) and `unblc` (ASCII 0/1).
-- Planned: [Effekt](https://effekt-lang.org), Scala, HVM, C, NASM,
- LLVM, JS, Haskell
-
-## Benchmarks
-
-To be evaluated.
+- BLC (sharing by abstraction): Terms having BLoC entry indices get
+ abstracted and applied to the respective term. The indices get
+ converted to De Bruijn indices. The dependency graph is resolved by a
+ topological sort. Flag `bblc` (bits) and `blc` (ASCII 0/1).
+- BLC (unshared): Every BLoC entry gets reinserted into the original
+ term. Do not use this if you want efficiency or small files. Flag
+ `unbblc` (bits) and `unblc` (ASCII 0/1).
+- Planned: “normal” programming languages
+
+## Shared `bblc` benchmarks
+
+Some deliberately unoptimized test cases from `test/`, evaluated using
+`./run` and measured in bits:
+
+| file | bloc | unbblc/orig | bblc |
+|:--------------|:-----|:------------|:------|
+| echo | 56 | 4 | 4 |
+| reverse | 248 | 172 | 172 |
+| churchadd1 | 296 | 390 | 159 |
+| churchadd2 | 368 | 433 | 207 |
+| churcharith | 560 | 1897 | 339 |
+| uni | 576 | 459 | 448 |
+| ternaryvarmod | 1248 | 2330 | 1824 |
+| collatz | 1904 | 2884 | 1986 |
+| ternaryadd | 2240 | 19422 | 2708 |
+| ternaryfac | 2792 | 9599 | 3091 |
+| aoc | 7480 | 50062 | 10861 |
+
+*Huge* and convoluted programs like
+[@woodrush](https:://github.com/woodrush)’s
+[lambda-8cc](https://github.com/woodrush/lambda-8cc) will not get
+smaller by compiling them to shared BLC. The *many* sharable terms get
+abstracted to so many levels that the (unary) BLC indices (in case of
+8cc) can literally be 50 kilobit long. One solution would obviously be a
+BLC variant with binary indices, or just storing and interpreting such
+files in the BLoC format directly (which also uses binary reference
+indices). A better algorithm than standard topological sort for
+resolving the dependencies would also help.
+
+8cc, measured in megabit:
+
+| file | bloc | unbblc/orig | bblc |
+|:-----------|:-----|:------------|:--------|
+| lambda-8cc | 5.13 | 40.72 | 3267.88 |
diff --git a/src/targets/blc.c b/src/targets/blc.c
index 82e0bc4..3d76966 100644
--- a/src/targets/blc.c
+++ b/src/targets/blc.c
@@ -7,6 +7,7 @@
#include <stdlib.h>
#include <string.h>
+#include <assert.h>
#include <stdio.h>
#include <target.h>
@@ -47,6 +48,11 @@ static void fprint_blc_substituted(struct term *term, struct bloc_parsed *bloc,
depth +
(positions_inv[term->u.ref.index] - position) -
1;
+ debug("index=%d depth=%ld ref=%ld inv=%ld pos=%ld sub=%ld\n",
+ index, depth, term->u.ref.index,
+ positions_inv[term->u.ref.index], position,
+ positions_inv[term->u.ref.index] - position);
+ assert(index >= 0);
for (int i = 0; i <= index; i++)
fprintf(file, "1");
fprintf(file, "0");
@@ -91,39 +97,19 @@ static void fprint_blc(size_t *positions, void *closed,
free(positions_inv);
}
-static void bitmap_deps(struct bloc_parsed *bloc, char *bitmap,
- struct term *term)
-{
- switch (term->type) {
- case ABS:
- bitmap_deps(bloc, bitmap, term->u.abs.term);
- break;
- case APP:
- bitmap_deps(bloc, bitmap, term->u.app.lhs);
- bitmap_deps(bloc, bitmap, term->u.app.rhs);
- break;
- case VAR:
- break;
- case REF:
- if (term->u.ref.index + 1 >= bloc->length)
- fatal("invalid ref index %ld\n", term->u.ref.index);
- bitmap[term->u.ref.index] = 1;
- break;
- default:
- fatal("invalid type %d\n", term->type);
- }
-}
-
// TODO: memoize META_CLOSED with term->meta (more complex than you'd think!)
+// TODO: memoize bitmap deps (should be easy)
static unsigned int annotate(struct bloc_parsed *bloc, struct term *term,
- int depth)
+ char *bitmap, int depth)
{
switch (term->type) {
case ABS:
- return annotate(bloc, term->u.abs.term, depth + 1);
+ return annotate(bloc, term->u.abs.term, bitmap, depth + 1);
case APP:;
- unsigned int left = annotate(bloc, term->u.app.lhs, depth);
- unsigned int right = annotate(bloc, term->u.app.rhs, depth);
+ unsigned int left =
+ annotate(bloc, term->u.app.lhs, bitmap, depth);
+ unsigned int right =
+ annotate(bloc, term->u.app.rhs, bitmap, depth);
if ((left & META_OPEN) || (right & META_OPEN))
return META_OPEN;
return META_CLOSED;
@@ -134,8 +120,9 @@ static unsigned int annotate(struct bloc_parsed *bloc, struct term *term,
case REF:
if (term->u.ref.index + 1 >= bloc->length)
fatal("invalid ref index %ld\n", term->u.ref.index);
- struct term *sub = bloc->entries[term->u.ref.index];
- return annotate(bloc, sub, depth);
+ bitmap[term->u.ref.index] = 1;
+ return annotate(bloc, bloc->entries[term->u.ref.index], bitmap,
+ depth);
default:
fatal("invalid type %d\n", term->type);
}
@@ -196,14 +183,13 @@ static void write_blc(struct bloc_parsed *bloc, FILE *file)
{
char **bitmaps = malloc(bloc->length * sizeof(*bitmaps));
for (size_t i = 0; i < bloc->length; i++) {
- unsigned int meta = annotate(bloc, bloc->entries[i], 0);
+ char *bitmap = calloc(bloc->length, 1);
+ unsigned int meta = annotate(bloc, bloc->entries[i], bitmap, 0);
if (!(meta & META_CLOSED)) {
- bitmaps[i] = 0;
+ free(bitmap);
+ bitmaps[i] = 0; // won't be needed
continue;
}
-
- char *bitmap = calloc(bloc->length, 1);
- bitmap_deps(bloc, bitmap, bloc->entries[i]);
bitmaps[i] = bitmap;
}
diff --git a/src/targets/unblc.c b/src/targets/unblc.c
index 1b59f7f..2d10418 100644
--- a/src/targets/unblc.c
+++ b/src/targets/unblc.c
@@ -40,7 +40,6 @@ static void fprint_unblc(struct term *term, struct bloc_parsed *bloc,
static void write_unblc(struct bloc_parsed *bloc, FILE *file)
{
fprint_unblc(bloc->entries[bloc->length - 1], bloc, file);
- fprintf(file, "\n");
}
struct target_spec target_unblc = {
diff --git a/test/aoc.blc.i b/test/aoc.blc.io
index edc2c7a..17928ef 100644
--- a/test/aoc.blc.i
+++ b/test/aoc.blc.io
@@ -1 +1 @@
-0001000101000000010110111011001000110000011010010101010001000111000010111011010000111000010111011010000000000101010001011000000000001000001101011001010111110111001011110110010001100000110100100011000001010000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101000000000111100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101010001010101100000110000000100000001000101100000100101000000010110111011001000110000011010010111100100010001100000100101010110010100000001011011101100000000011110000000000111101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000111001010101111110111101110110101000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111100101010111111011110111011010110110010001100000101000000000011001110111101001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010000010010101000100011100001011101101000011100001011101101000000001010100010110000000000010000011011010010100000001011011101100100011000001101100101111001000110000010110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110110100101000000010110111011001000110000011011001011110010001100000101101001110010101000000010111101011001000100011100001011101101000011100001011101101000000001010100010110000000000010000011010000010010101011100100011000001101001000000010110111011001000110000011010001001011110110010001100000101001000110000010100101000000010111101011001000000010111101011000000100010110000010000011001010000010101000000011110011101000010101100000100000110000010000101000001011011000100000001001010101100000110000101000001010100010110000011000000010110010000000110111010110100000001110000101000001010100010110000011000000010110010000000110111010110100000001100010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011010110100100011000001101001000101000000010110111011010000010010001100000110100111001010100000001011110101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010101110010001100000110100100000001011011101100100011000001101000100101111011001000110000010100100011000001010010100000001011110101100100000001011110101100000010101000000011110011101000010101100000100000110000010000101000001011011000100000001001010101100000110000101000001010100010110000011000000010110010000000110111010110100000001110000101000001010100010110000011000000010110010000000110111010110100000001100010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011010010001100000110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101000000010110111011001110010001100000110100101111011001000110000010100101010001000111000010111011010000111000010111011010000000000101010001011000000000001000001101011001010111110111001011110110010001100000110100100011000001010000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101000000000111100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100100010100000001011011101100100011000001101001011111011100100011000001010010100000101000000010110111011001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010111001000110000011010010100000001011011101100100011000001101001011110110010001100000101000001001010000000111100111010000101100000100000110110100100010101000101100000000000100000110100000100100011000001010010101000100011100001011101101000011100001011101101000000001010100010110000000000010000011010000010010101110010001100000110100101111011001000110000010101001010000000111100111010000101100000100000110110101101000010101011000001100000001000000010001001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010000000101101110110011100100011000001101001011110110010001100000101001010000000111100111010010101000100011100001011101101000011100001011101101000000000010101000101100000000000100000110101100101011111011100101111011001000110000011010010001100000101000000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101001010000010101011100000000011110000101000001010000010100010000010111010000000100101010110000001010110010001000110000010010101011001010000000101101110110000000001111000000000011110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011100101010111111011110111011010100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011110010101011111101111011101101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100100010001100000100101010110010100000001011011101100000000011110000000000111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011110010101011111101111011101101010000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011000000001010101110010001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010110000101011100100000000000110010101011111101111011101101001011111010000000111001000000000001111001010101111110111101110110100101111101000000010010000000000011100101010111111011110111011010010111110100000001110000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000000010101011100100010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001011000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000010010000000000011001010101111110111101110110100101111101000000011001000000000001111001010101111110111101110110100101111101000000011000010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001000000001010101110010001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001011000010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001011001000101010110000000001111000000000000111101111100000000000011101111100000000000011011111010110010000000000010101011111101111011011101010010000000000011001010101111110111101110110101011000010100000101000100000101110100000001001010101100000010101100100010001100000100101010110010100000001011011101100000000011110000000000111101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000111001010101111110111101110110101000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110000000010101011100100010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000101100001010111001000000000001100101010111111011110111011010010111110100000001110010000000000011110010101011111101111011101101001011111010000000100100000000000111001010101111110111101110110100101111101000000011100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000100000000101010111001000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010110000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000100001010111001000000000001110010101011111101111011101101001011111010000000100100000000000110010101011111101111011101101001011111010000000110010000000000011110010101011111101111011101101001011111010000000110000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000000010101011100100010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010110000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010110010001010101100000000011110000000000001111011111000000000000111011111000000000000110111110100100000000000110010101011111101111011101101010110000100000000000110010101011111101111011101101010000000000111001100111011110110100000000011110010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010000000101101110110011100100011000001101001011110110010001100000101000010101000100011100001011101101000011100001011101101000000001010100010101100000110000000100010101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000100011000001001010110010100000001011011101100000001110000000111000011000000101000000010110111011001000000000111001010111110111011010110010000000001100101011111011101101011000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101010100000000011110010100000101010100000101000101011000010001010110000011000000010001001010001101000000101011000000011100001000000000111001010111110111011010010001011111011110101000010000000001100101011111011101101001000101111101111010101000000101011000001000011110100000001000000101011001110100000001000011110101100100010101100000001110000000000111011110000000000110111101010110000000111001010100000001111001110100001000110000010010101100101000000010110111011000000011100000000111011100001100000010100000001011011101100100000000011100101011111011101101011001000000000110010101111101110110101000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101011000000000010101111101110101100101000001010001000001011101000001001010110000001011001000100011000001001010110010100000001011011101100000001110000000011101110000110000001010000000101101110110010000000001110010101111101110110101100100000000011001010111110111011010100001100000010100000001011011101100100000000011001010111110111011010110010000000001110010101111101110110101100101000110100000010101100000001110000100000000011100101011111011101101001000101111101111010100001000000000110010101111101110110100100010111110111101010110010100011010000001010110000000111000010000000001110010101111101110110100100010111110111101010000100000000011001010111110111011010010001011111011110101011000000001010111001000101110010000000001100101011111011101101001011111010000011001000000000111001010111110111011010010111110100000101100001010000000000010101111110110100101011111011101101011001011111010000011000010111001000000000110010101111101110110100101111101000001100100000000011100101011111011101101001011111010000010000000010101110010001010000000000010101111110110100101011111011101101011001011111010000010110000101110010000000001100101011111011101101001011111010000011001000000000111001010111110111011010010111110100000100001010000000000010101111110110100101011111011101101011001011111010000010110010001010110000000111000000000011101111000000000011011110100101000001010100000001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010111100101111110010001100000110100111001000110000010101000000000000101011111101101001010111110111011010000000111001010100000001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101101001010000000101101110110010001100000110110010111100100011000001011010100101010000000101111010110010100000000010111110100111101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010100010101011000001100000001000000010001011000001001010000000101101110110010001100000110100101111001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101101100100011000001010010001000111000010111011010000111000010111011010000001010000000101101110110100111010010001010101010000000111100111010000101011000001100000100000100001010000010110110001000000010010101011000001100001010000010101000101100000110000000101100100000001101110101101000000011100001010000010101000101100000110000000101100100000001101110101101000000011000101001000000000001010101111110111101101110101010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110101100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110010001010110000010000101000000010110111011000001101000010100000001011011101100000101001000100011000001100101011001010000000101101110110000000111000001100001100000010100000001011011101100100000000011100101011111011101101011000001000011000000101000000010110111011001011000000011100100000000011001010111110111011010110101100000100100010101100000100001010000000101101110110000011010000101000000010110111011000001010101101001010100000001111001110100001000110000010010101100101000000010110111011000000011100000000111011100001100000010100000001011011101100100000000011100101011111011101101011001000000000110010101111101110110101000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101011000000000010101111101110101100101000001010100000001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010111100101111110010001100000110100111001000110000010101000000000000101011111101101001010111110111011010000000111001010100000001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101101001010000000101101110110010001100000110110010111100100011000001011010100101010000000101111010110010100000000010111110100111101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010100010101011000001100000001000000010001011000001001010000000101101110110010001100000110100101111001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101101100100011000001010010001000111000010111011010000111000010111011010000001010000000101101110110100111010010001010101010000000111100111010000101011000001100000100000100001010000010110110001000000010010101011000001100001010000010101000101100000110000000101100100000001101110101101000000011100001010000010101000101100000110000000101100100000001101110101101000000011000101001000000000001010101111110111101101110101010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110101100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110010001010110000010000101000000010110111011000001101000010100000001011011101100000101001000100011000001100101011001010000000101101110110000000111000001100001100000010100000001011011101100100000000011100101011111011101101011000001000011000000101000000010110111011001011000000011100100000000011001010111110111011010110101100000100100010101100000100001010000000101101110110000011010000101000000010110111011000001010101011010000000011001100110011001110011100110011011100101000100011100001011101101000011100001011101101000000100010101000101100000000000100000110010001100000101001000101000000010110111011010000010010001100000110100101000000010110111011001000110000011010011110010001100000100100011000001010010100000101000000010110111011001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010111001000110000011010010100000001011011101100100011000001101001011110110010001100000101000001001010000000111100111010000101100000100000110110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101011100100011000001101001011110110010001100000101010010100000001111001110100001011000001000001101101001000001010001010110000100010101100000110000000100010010100011010000001010110000000111000010000000001110010101111101110110100100010111110111101010000100000000011001010111110111011010010001011111011110101010000001010110000010000111101000000010000001010110011101000000010000111101011001000101011000000011100000000001110111100000000001101111010000000011001110011001110011001100110011011101010
+0001000101000000010110111011001000110000011010010101010001000111000010111011010000111000010111011010000000000101010001011000000000001000001101011001010111110111001011110110010001100000110100100011000001010000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101000000000111100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101010001010101100000110000000100000001000101100000100101000000010110111011001000110000011010010111100100010001100000100101010110010100000001011011101100000000011110000000000111101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000111001010101111110111101110110101000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111100101010111111011110111011010110110010001100000101000000000011001110111101001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010000010010101000100011100001011101101000011100001011101101000000001010100010110000000000010000011011010010100000001011011101100100011000001101100101111001000110000010110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110110100101000000010110111011001000110000011011001011110010001100000101101001110010101000000010111101011001000100011100001011101101000011100001011101101000000001010100010110000000000010000011010000010010101011100100011000001101001000000010110111011001000110000011010001001011110110010001100000101001000110000010100101000000010111101011001000000010111101011000000100010110000010000011001010000010101000000011110011101000010101100000100000110000010000101000001011011000100000001001010101100000110000101000001010100010110000011000000010110010000000110111010110100000001110000101000001010100010110000011000000010110010000000110111010110100000001100010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011010110100100011000001101001000101000000010110111011010000010010001100000110100111001010100000001011110101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010101110010001100000110100100000001011011101100100011000001101000100101111011001000110000010100100011000001010010100000001011110101100100000001011110101100000010101000000011110011101000010101100000100000110000010000101000001011011000100000001001010101100000110000101000001010100010110000011000000010110010000000110111010110100000001110000101000001010100010110000011000000010110010000000110111010110100000001100010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011010010001100000110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101000000010110111011001110010001100000110100101111011001000110000010100101010001000111000010111011010000111000010111011010000000000101010001011000000000001000001101011001010111110111001011110110010001100000110100100011000001010000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101000000000111100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100100010100000001011011101100100011000001101001011111011100100011000001010010100000101000000010110111011001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010111001000110000011010010100000001011011101100100011000001101001011110110010001100000101000001001010000000111100111010000101100000100000110110100100010101000101100000000000100000110100000100100011000001010010101000100011100001011101101000011100001011101101000000001010100010110000000000010000011010000010010101110010001100000110100101111011001000110000010101001010000000111100111010000101100000100000110110101101000010101011000001100000001000000010001001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010000000101101110110011100100011000001101001011110110010001100000101001010000000111100111010010101000100011100001011101101000011100001011101101000000000010101000101100000000000100000110101100101011111011100101111011001000110000011010010001100000101000000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101001010000010101011100000000011110000101000001010000010100010000010111010000000100101010110000001010110010001000110000010010101011001010000000101101110110000000001111000000000011110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011100101010111111011110111011010100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011110010101011111101111011101101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100100010001100000100101010110010100000001011011101100000000011110000000000111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011110010101011111101111011101101010000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011000000001010101110010001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010110000101011100100000000000110010101011111101111011101101001011111010000000111001000000000001111001010101111110111101110110100101111101000000010010000000000011100101010111111011110111011010010111110100000001110000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000000010101011100100010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001011000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000010010000000000011001010101111110111101110110100101111101000000011001000000000001111001010101111110111101110110100101111101000000011000010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001000000001010101110010001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001011000010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001011001000101010110000000001111000000000000111101111100000000000011101111100000000000011011111010110010000000000010101011111101111011011101010010000000000011001010101111110111101110110101011000010100000101000100000101110100000001001010101100000010101100100010001100000100101010110010100000001011011101100000000011110000000000111101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000111001010101111110111101110110101000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001100101010111111011110111011010110000110000001010000000101101110110010000000000011001010101111110111101110110101100100000000000111100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110000000010101011100100010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000101100001010111001000000000001100101010111111011110111011010010111110100000001110010000000000011110010101011111101111011101101001011111010000000100100000000000111001010101111110111101110110100101111101000000011100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000100000000101010111001000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010110000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000100001010111001000000000001110010101011111101111011101101001011111010000000100100000000000110010101011111101111011101101001011111010000000110010000000000011110010101011111101111011101101001011111010000000110000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000000010101011100100010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010110000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000010101110010000000000011001010101111110111101110110100101111101000000010010000000000011110010101011111101111011101101001011111010000000110010000000000011100101010111111011110111011010010111110100000001000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010110010001010101100000000011110000000000001111011111000000000000111011111000000000000110111110100100000000000110010101011111101111011101101010110000100000000000110010101011111101111011101101010000000000111001100111011110110100000000011110010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010000000101101110110011100100011000001101001011110110010001100000101000010101000100011100001011101101000011100001011101101000000001010100010101100000110000000100010101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000100011000001001010110010100000001011011101100000001110000000111000011000000101000000010110111011001000000000111001010111110111011010110010000000001100101011111011101101011000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101010100000000011110010100000101010100000101000101011000010001010110000011000000010001001010001101000000101011000000011100001000000000111001010111110111011010010001011111011110101000010000000001100101011111011101101001000101111101111010101000000101011000001000011110100000001000000101011001110100000001000011110101100100010101100000001110000000000111011110000000000110111101010110000000111001010100000001111001110100001000110000010010101100101000000010110111011000000011100000000111011100001100000010100000001011011101100100000000011100101011111011101101011001000000000110010101111101110110101000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101011000000000010101111101110101100101000001010001000001011101000001001010110000001011001000100011000001001010110010100000001011011101100000001110000000011101110000110000001010000000101101110110010000000001110010101111101110110101100100000000011001010111110111011010100001100000010100000001011011101100100000000011001010111110111011010110010000000001110010101111101110110101100101000110100000010101100000001110000100000000011100101011111011101101001000101111101111010100001000000000110010101111101110110100100010111110111101010110010100011010000001010110000000111000010000000001110010101111101110110100100010111110111101010000100000000011001010111110111011010010001011111011110101011000000001010111001000101110010000000001100101011111011101101001011111010000011001000000000111001010111110111011010010111110100000101100001010000000000010101111110110100101011111011101101011001011111010000011000010111001000000000110010101111101110110100101111101000001100100000000011100101011111011101101001011111010000010000000010101110010001010000000000010101111110110100101011111011101101011001011111010000010110000101110010000000001100101011111011101101001011111010000011001000000000111001010111110111011010010111110100000100001010000000000010101111110110100101011111011101101011001011111010000010110010001010110000000111000000000011101111000000000011011110100101000001010100000001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010111100101111110010001100000110100111001000110000010101000000000000101011111101101001010111110111011010000000111001010100000001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101101001010000000101101110110010001100000110110010111100100011000001011010100101010000000101111010110010100000000010111110100111101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010100010101011000001100000001000000010001011000001001010000000101101110110010001100000110100101111001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101101100100011000001010010001000111000010111011010000111000010111011010000001010000000101101110110100111010010001010101010000000111100111010000101011000001100000100000100001010000010110110001000000010010101011000001100001010000010101000101100000110000000101100100000001101110101101000000011100001010000010101000101100000110000000101100100000001101110101101000000011000101001000000000001010101111110111101101110101010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110101100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110010001010110000010000101000000010110111011000001101000010100000001011011101100000101001000100011000001100101011001010000000101101110110000000111000001100001100000010100000001011011101100100000000011100101011111011101101011000001000011000000101000000010110111011001011000000011100100000000011001010111110111011010110101100000100100010101100000100001010000000101101110110000011010000101000000010110111011000001010101101001010100000001111001110100001000110000010010101100101000000010110111011000000011100000000111011100001100000010100000001011011101100100000000011100101011111011101101011001000000000110010101111101110110101000011000000101000000010110111011001000000000110010101111101110110101100100000000011100101011111011101101011000000000010101111101110101100101000001010100000001010001000111000010111011010000111000010111011010000001010100010110000000000010000011010111100101111110010001100000110100111001000110000010101000000000000101011111101101001010111110111011010000000111001010100000001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101101001010000000101101110110010001100000110110010111100100011000001011010100101010000000101111010110010100000000010111110100111101100100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010100010101011000001100000001000000010001011000001001010000000101101110110010001100000110100101111001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101101100100011000001010010001000111000010111011010000111000010111011010000001010000000101101110110100111010010001010101010000000111100111010000101011000001100000100000100001010000010110110001000000010010101011000001100001010000010101000101100000110000000101100100000001101110101101000000011100001010000010101000101100000110000000101100100000001101110101101000000011000101001000000000001010101111110111101101110101010010100000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101011001000000000001010101111110111101101110101011100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110101100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110101100101111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011001000110000010100000000011110010001010110000010000101000000010110111011000001101000010100000001011011101100000101001000100011000001100101011001010000000101101110110000000111000001100001100000010100000001011011101100100000000011100101011111011101101011000001000011000000101000000010110111011001011000000011100100000000011001010111110111011010110101100000100100010101100000100001010000000101101110110000011010000101000000010110111011000001010101011010000000011001100110011001110011100110011011100101000100011100001011101101000011100001011101101000000100010101000101100000000000100000110010001100000101001000101000000010110111011010000010010001100000110100101000000010110111011001000110000011010011110010001100000100100011000001010010100000101000000010110111011001010100010001110000101110110100001110000101110110100000000101010001011000000000001000001101000001001010111001000110000011010010100000001011011101100100011000001101001011110110010001100000101000001001010000000111100111010000101100000100000110110100101010001000111000010111011010000111000010111011010000000010101000101100000000000100000110100000100101011100100011000001101001011110110010001100000101010010100000001111001110100001011000001000001101101001000001010001010110000100010101100000110000000100010010100011010000001010110000000111000010000000001110010101111101110110100100010111110111101010000100000000011001010111110111011010010001011111011110101010000001010110000010000111101000000010000001010110011101000000010000111101011001000101011000000011100000000001110111100000000001101111010000000011001110011001110011001100110011011101010 \ No newline at end of file
diff --git a/test/huh.blc.io b/test/huh.blc.io
deleted file mode 100644
index 36edb97..0000000
--- a/test/huh.blc.io
+++ /dev/null
@@ -1 +0,0 @@
-000101000001010001000001011101000000010010101011000000101011001000100011000001001010101100101000000010110111011000000000111100000000001111011110000110000001010000000101101110110010000000000011110010101011111101111011101101011001000000000001110010101011111101111011101101010000110000001010000000101101110110010000000000011100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001111001010101111110111101110110101100101000100011100110100001110011010000001010101100000000011110000100000000000111100101010111111011110111011010011110100001000000000001110010101011111101111011101101001111010000100000000000110010101011111101111011101101001111010110010001000110000010010101011001010000000101101110110000000001111000000000011101111000011000000101000000010110111011001000000000001111001010101111110111101110110101100100000000000110010101011111101111011101101011000011000000101000000010110111011001000000000001110010101011111101111011101101011001000000000001111001010101111110111101110110101000011000000101000000010110111011001000000000001100101010111111011110111011010110010000000000011100101010111111011110111011010110010100010001110011010000111001101000000101010110000000001111000010000000000011110010101011111101111011101101001111010000100000000000111001010101111110111101110110100111101000010000000000011001010101111110111101110110100111101011001010001000111001101000011100110100000010101011000000000111100001000000000001111001010101111110111101110110100111101000010000000000011100101010111111011110111011010011110100001000000000001100101010111111011110111011010011110101100000000101010111001000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001011000010101110010000000000011001010101111110111101110110100101111101000000011100100000000000111100101010111111011110111011010010111110100000001001000000000001110010101011111101111011101101001011111010000000111000010100000000000001010101111111011101101001010101111110111101110110101100101111101000000010000101011100100000000000111001010101111110111101110110100101111101000000011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001000000001010101110010001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000101100001010000000000000101010111111101110110100101010111111011110111011010110010111110100000001000010101110010000000000011100101010111111011110111011010010111110100000001001000000000001100101010111111011110111011010010111110100000001100100000000000111100101010111111011110111011010010111110100000001100001010111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000011001000000000001110010101011111101111011101101001011111010000000100000000101010111001000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100001010111001000000000001110010101011111101111011101101001011111010000000111001000000000001100101010111111011110111011010010111110100000001001000000000001111001010101111110111101110110100101111101000000010000101011100100000000000110010101011111101111011101101001011111010000000100100000000000111100101010111111011110111011010010111110100000001100100000000000111001010101111110111101110110100101111101000000010000101000000000000010101011111110111011010010101011111101111011101101011001011111010000000101100100010101011000000000111100000000000011110111110000000000001110111110000000000001101111101001010100010001110000101110110100001110000101110110100000000101100000000101111111001000100011000001001010101100101000000010110111011000000000111100000000001110111100001100000010100000001011011101100100000000000111100101010111111011110111011010110010000000000011001010101111110111101110110101100001100000010100000001011011101100100000000000111001010101111110111101110110101100100000000000111100101010111111011110111011010100001100000010100000001011011101100100000000000110010101011111101111011101101011001000000000001110010101011111101111011101101011011111011011000000000111100101000000010110111011000100101000000010110111011000100100010100000001011011101101000001000100000000011110 \ No newline at end of file
diff --git a/test/huh.blc.io.in b/test/huh.blc.io.in
deleted file mode 100644
index 8a0f05e..0000000
--- a/test/huh.blc.io.in
+++ /dev/null
@@ -1 +0,0 @@
-01
diff --git a/test/huh.bruijn b/test/huh.bruijn
deleted file mode 100644
index 7db06c7..0000000
--- a/test/huh.bruijn
+++ /dev/null
@@ -1,18 +0,0 @@
-:import std/Number/Ternary .
-:import std/List .
-
-# main map [ternary! (0 - 0)]
-
-# main [sub (+1b) (+1b)]
-
-# main [pad (+1b) (+2b)]
-
-# main [pad-right (+6) 'a' "hah"]
-
-# main [|((+6) - ∀"hah")]
-
-# main [(+1) - ∀"aa"]
-
-# main [∀([0] : ([0] : {}[0])) - (+0)]
-
-main [∀([0] : ([0] : {}[0])) + (+0)]