Embed WASM parsers and document deployment
ober
a5e53a2930b3c84f610dd65fe38312c4faff4524
new file mode 100644 --- /dev/null +++ b/.gitsafe.json @@ -0,0 +1,10 @@ +{ + "severity": "medium", + "entropy": true, + "allowlist": { + "patterns": [ + "048828bf500ef3099601c5161783a72f965fa3e5e2aedc037374880de3b81c57", + "b93cf8c6eef9ab3895065465a92a5f7e15f4726577b4adad630e7ba47eb7349c" + ] + } +} --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # jerbuild bundles Chez Scheme + the jerboa stdlib + the jerboa-native Rust # crate, so building jdns needs only jerbuild + a C compiler + cargo (with the # wasm32-unknown-unknown target for the sandbox payloads). No jerboa checkout. -JERBUILD ?= $(shell if [ -x "$(CURDIR)/../jerboa/dist/jerbuild" ]; then printf '%s\n' "$(CURDIR)/../jerboa/dist/jerbuild"; elif command -v jerbuild >/dev/null 2>&1; then command -v jerbuild; else printf '%s\n' jerbuild; fi) +JERBUILD ?= $(shell if command -v jerbuild >/dev/null 2>&1; then command -v jerbuild; else printf '%s\n' jerbuild; fi) JH := $(shell $(JERBUILD) --jerboa-home 2>/dev/null) ifeq ($(JH),) $(error jerbuild not found on PATH (or '$(JERBUILD) --jerboa-home' failed). Install jerbuild, or set JERBUILD=/path/to/jerbuild) --- a/README.md +++ b/README.md @@ -69,13 +69,17 @@ JDNS_ALLOW_SANDBOX_FALLBACK=1 jdns ... jdns --allow-sandbox-fallback ... ``` -The WASM DNS parser and WASM CDB reader are used when available. To require -them and fail instead of falling back to in-process parsing, set: - -```sh -JDNS_REQUIRE_WASM_PARSER=1 -JDNS_REQUIRE_WASM_CDB=1 -``` +The WASM DNS parser and WASM CDB reader are embedded into the binary at build +time (`lib/jerboa-dns/wasm-embedded.ss`, regenerated by `wasm/build.sh`), so +the sandbox is active with no files on disk, including inside the chroot. +If the wasmi runtime itself is not linked in, startup/query handling fails +closed by default. The only in-process parser fallback is the explicit +development opt-out `JDNS_ALLOW_IN_PROCESS_PARSER=1` or +`JDNS_ALLOW_IN_PROCESS_CDB=1`. + +`JDNS_PARSER_WASM` / `JDNS_CDB_WASM` point at on-disk modules as an explicit +development override (useful for testing a rebuilt parser without relinking); +they are not needed in production. ## Zone Updates new file mode 100644 --- /dev/null +++ b/docs/deploy.md @@ -0,0 +1,120 @@ +# Deploying jerboa-dns + +This is the production deployment checklist for `jdns` as an authoritative +tinydns replacement. + +## 1. Build Or Select Artifacts + +For a local host build: + +```sh +make clean +make binary +make test +make security +make fuzz-check +``` + +For a release candidate, prefer the release gate: + +```sh +make release-evidence JERBUILD=/path/to/jerbuild +``` + +Static release artifacts are named by target, for example +`jdns-linux-amd64` and `jdns-data-linux-amd64`. The matching static build +scripts under `static/` build both the daemon and zone compiler. Release +candidates must ship with the matching `dist/release-evidence/` bundle. + +## 2. Files To Install + +Install these files on the target: + +- `jdns` or the target-specific `jdns-*` daemon binary. +- `jdns-data` or the target-specific `jdns-data-*` compiler, unless CDB files + are compiled off-host. +- `data.cdb`, generated from the zone source. +- The reviewed release evidence bundle for the exact binary. + +Do not install separate `*.wasm` files for production. The DNS packet parser +and CDB reader modules are embedded into the binary by `wasm/build.sh`, and the +daemon uses them without reading parser files from disk or from inside the +chroot. + +## 3. Compile Zone Data + +Compile zone source into a CDB on a build host or control-plane host: + +```sh +./jdns-data zones/example.sexp data.cdb +``` + +Publish updates by writing the new CDB in the same directory and atomically +renaming it over the live `data.cdb`. The checked-in compiler already follows +that pattern. The daemon validates replacements off the request path and keeps +serving the last valid snapshot if a replacement is malformed or unstable. + +## 4. Runtime Layout + +Create a minimal root directory for the daemon, owned by root and writable only +by the deployment/update process: + +```sh +install -d -o root -g root -m 0755 /var/jdns +install -m 0644 data.cdb /var/jdns/data.cdb +``` + +Run the daemon with `--root /var/jdns --data data.cdb`. The data path is +relative to the root after sandbox setup. + +## 5. Privileges And Sandbox + +If binding as root, configure both a non-zero UID and non-zero GID for the +serving process. The daemon clears supplementary groups, drops privileges, and +verifies that root cannot be regained before serving. + +Production must not set these development overrides: + +- `JDNS_RETAIN_PRIVILEGES=1` +- `JDNS_ALLOW_SANDBOX_FALLBACK=1` +- `JDNS_ALLOW_IN_PROCESS_PARSER=1` +- `JDNS_ALLOW_IN_PROCESS_CDB=1` +- `JDNS_PARSER_WASM` +- `JDNS_CDB_WASM` + +The WASM parser and CDB reader are required by default. If a binary was built +without the wasmi runtime, it fails closed instead of silently serving with the +in-process parsers. + +## 6. Start And Smoke Test + +Example foreground start: + +```sh +UID=53 GID=53 ./jdns --ip 0.0.0.0 --port 53 --root /var/jdns --data data.cdb +``` + +Smoke test from another shell: + +```sh +dig @127.0.0.1 example.com SOA +time=2 +tries=1 +dig @127.0.0.1 example.com SOA +tcp +time=2 +tries=1 +``` + +Startup logs should show the CDB opened with `parser=sandboxed`. Any +`parser=in-process` or `wasm_*_fallback` log is a release blocker unless it was +from an explicitly marked local development run. + +## 7. Edge Controls + +`jdns` is authoritative-only and does not recurse. `ANY` responses are +minimized, but production still requires external edge rate limiting until +native response-rate limiting is implemented. Keep the rate-limit evidence with +the release packet as described in `docs/release-evidence.md`. + +## 8. Rollback + +Keep the previous daemon binary and previous known-good `data.cdb` together. +Rollback is either replacing the binary and restarting, or atomically renaming +the previous CDB back over `data.cdb`. Check logs after rollback and repeat the +UDP and TCP smoke queries. --- a/docs/threat-model.md +++ b/docs/threat-model.md @@ -23,8 +23,10 @@ cases must be modeled before release. - Network boundary: UDP and TCP packets are hostile. - Parser boundary: DNS wire messages and CDB records are parsed from - untrusted bytes; WASM parsers are preferred and can be required with - `JDNS_REQUIRE_WASM_PARSER=1` and `JDNS_REQUIRE_WASM_CDB=1`. + untrusted bytes; the WASM sandbox parsers are embedded in the binary and + required by default (no files on disk, including inside the chroot). If the + wasmi runtime is not linked in, startup/query handling fails closed unless a + development-only `JDNS_ALLOW_IN_PROCESS_*` opt-out is explicit. - Filesystem boundary: startup reads config and CDB files before sandboxing; runtime should operate inside `ROOT`. - Privilege boundary: sockets are bound before chroot, supplementary groups are --- a/lib/jerboa-dns/wasm-cdb.ss +++ b/lib/jerboa-dns/wasm-cdb.ss @@ -3,7 +3,9 @@ ;;; ;;; Mirrors the shape of (jerboa-dns cdb) cdb-find-all, but the ;;; attacker-influenced bytes (the CDB file contents) are walked by -;;; the wasm module — never by the host directly. +;;; the wasm module — never by the host directly. The module bytes are +;;; embedded in the binary via (jerboa-dns wasm-embedded), so the sandbox +;;; works after chroot with no files on disk. ;;; ;;; The wasm module exports: ;;; alloc(len) -> ptr in linear memory @@ -57,7 +59,8 @@ (except (jerboa prelude) meta atom?) (std wasm sandbox) (jerboa-dns cdb) - (jerboa-dns log)) + (jerboa-dns log) + (jerboa-dns wasm-embedded)) ;; Tag bytes — must match wasm/cdb/src/lib.rs. (def TAG-REC #x02) @@ -82,13 +85,17 @@ ;; inspect the CDB. This matches wasm/cdb/src/lib.rs::CDB_CAP. (def MAX-CDB-BYTES (* 16 1024 1024)) - (def (resolve-wasm-path) - (or (getenv "JDNS_CDB_WASM") - (find file-exists? - '("lib/jerboa-dns/sandbox/cdb_parser.wasm" - "sandbox/cdb_parser.wasm" - "/etc/jdns/cdb_parser.wasm")) - "lib/jerboa-dns/sandbox/cdb_parser.wasm")) + ;; Module bytes come from the binary itself: the payloads are embedded + ;; via (jerboa-dns wasm-embedded) at build time, so the sandbox never + ;; depends on files inside the chroot. JDNS_CDB_WASM is an explicit + ;; development override for testing a rebuilt module without relinking. + (def (cdb-module-bytes) + (let ([override (getenv "JDNS_CDB_WASM")]) + (if (and override + (not (string=? override "")) + (file-exists? override)) + (load-wasm-bytes override) + cdb-parser-wasm-bytes))) (def %module #f) @@ -104,13 +111,9 @@ [(not (wasm-sandbox-available?)) #f] [else (try - (let* ([path (resolve-wasm-path)] - [bytes (and (file-exists? path) (load-wasm-bytes path))]) - (if (not bytes) - #f - (let ([m (wasm-sandbox-load bytes)]) - (set! %module m) - #t))) + (let ([m (wasm-sandbox-load (cdb-module-bytes))]) + (set! %module m) + #t) (catch (e) (set! %module #f) #f))])) (def (wasm-cdb-shutdown!) @@ -119,15 +122,25 @@ (set! %module #f))) (def (sandbox-available?) - (and (wasm-sandbox-available?) - (file-exists? (resolve-wasm-path)))) - - (def *require-sandbox?* #f) + ;; The module is embedded in the binary, so availability reduces to + ;; the wasmi runtime being linked in. + (wasm-sandbox-available?)) + + ;; Fail closed by default: the sandboxed CDB walker is required, and a + ;; binary without the wasmi runtime refuses to serve rather than silently + ;; parsing attacker-influenced bytes in-process. The only escape is the + ;; explicit development opt-out JDNS_ALLOW_IN_PROCESS_CDB=1. + ;; (JDNS_REQUIRE_WASM_CDB is accepted for backwards compatibility but no + ;; longer changes anything: required is the default posture.) + (def *require-sandbox?* #t) + + (def (truthy-env? name) + (let ([v (getenv name)]) + (and v (not (member v '("" "0" "false")))))) (def (require-sandbox?) - (or *require-sandbox?* - (let ([v (getenv "JDNS_REQUIRE_WASM_CDB")]) - (and v (not (member v '("" "0" "false"))))))) + (and *require-sandbox?* + (not (truthy-env? "JDNS_ALLOW_IN_PROCESS_CDB")))) (def (set-require-sandbox! flag) (set! *require-sandbox?* (and flag #t))) @@ -138,7 +151,7 @@ (set! *warned-fallback?* #t) (log-info 'wasm_cdb_fallback 'reason reason - 'hint "set JDNS_REQUIRE_WASM_CDB=1 to error instead"))) + 'hint "in-process fallback allowed by JDNS_ALLOW_IN_PROCESS_CDB=1 (development only)"))) ;; ========== Reader record ========== ;; Carries both the wasm instance (when sandboxed) and the underlying @@ -189,13 +202,12 @@ [inst (try-load-into-sandbox bv)]) (when (and (not inst) (require-sandbox?)) (error 'open-sandboxed-cdb - "JDNS_REQUIRE_WASM_CDB set but sandbox unavailable for this CDB")) + "WASM CDB sandbox required but unavailable (wasmi runtime not linked in); refusing to serve in-process")) (when (not inst) (warn-fallback-once! (cond [(not (wasm-sandbox-available?)) "libjerboa_native not loaded"] - [(not (file-exists? (resolve-wasm-path))) "wasm module missing on disk"] - [else "cdb_finalize rejected the file"]))) + [else "cdb module load or finalize failed"]))) (make-sandboxed-cdb-reader inst bv fallback #f (make-mutex)))) (def (try-load-into-sandbox bv) --- a/lib/jerboa-dns/wasm-dns.ss +++ b/lib/jerboa-dns/wasm-dns.ss @@ -5,8 +5,10 @@ ;;; (values id qname qtype qclass) ;;; or #f for "not a query I can answer" (matching parse-query's contract). ;;; -;;; The actual parsing happens in lib/jerboa-dns/sandbox/dns_parser.wasm -;;; (Rust, no_std) running inside wasmi. The host only sees a tagged +;;; The actual parsing happens in the dns_parser wasm module (Rust, no_std) +;;; running inside wasmi. The module bytes are embedded in the binary via +;;; (jerboa-dns wasm-embedded) — no file on disk is required, which matters +;;; because initialization happens after chroot. The host only sees a tagged ;;; record — a tiny deterministic grammar trivial to validate. ;;; ;;; The wasm module exports: @@ -42,7 +44,8 @@ (except (jerboa prelude) meta atom?) (std wasm sandbox) (jerboa-dns protocol) - (jerboa-dns log)) + (jerboa-dns log) + (jerboa-dns wasm-embedded)) ;; Tag bytes — must match wasm/src/lib.rs. (def TAG-QUERY #x01) @@ -61,14 +64,17 @@ ;; at 4096 too. DNS UDP w/o EDNS is 512; with EDNS up to ~4 KB. (def MAX-INPUT 4096) - (def (resolve-wasm-path) - (or (getenv "JDNS_PARSER_WASM") - ;; Search the same places the Makefile populates. - (find file-exists? - '("lib/jerboa-dns/sandbox/dns_parser.wasm" - "sandbox/dns_parser.wasm" - "/etc/jdns/dns_parser.wasm")) - "lib/jerboa-dns/sandbox/dns_parser.wasm")) + ;; Module bytes come from the binary itself: the payloads are embedded + ;; via (jerboa-dns wasm-embedded) at build time, so the sandbox never + ;; depends on files inside the chroot. JDNS_PARSER_WASM is an explicit + ;; development override for testing a rebuilt module without relinking. + (def (dns-module-bytes) + (let ([override (getenv "JDNS_PARSER_WASM")]) + (if (and override + (not (string=? override "")) + (file-exists? override)) + (load-wasm-bytes override) + dns-parser-wasm-bytes))) (def %module #f) (def %instance #f) @@ -84,15 +90,11 @@ [(not (wasm-sandbox-available?)) #f] [else (try - (let* ([path (resolve-wasm-path)] - [bytes (and (file-exists? path) (load-wasm-bytes path))]) - (if (not bytes) - #f - (let* ([m (wasm-sandbox-load bytes)] - [i (wasm-sandbox-instantiate m)]) - (set! %module m) - (set! %instance i) - #t))) + (let* ([m (wasm-sandbox-load (dns-module-bytes))] + [i (wasm-sandbox-instantiate m)]) + (set! %module m) + (set! %instance i) + #t) (catch (e) (set! %module #f) (set! %instance #f) @@ -107,18 +109,25 @@ (set! %module #f))) (def (sandbox-available?) - (and (wasm-sandbox-available?) - (file-exists? (resolve-wasm-path)))) + ;; The module is embedded in the binary, so availability reduces to + ;; the wasmi runtime being linked in. + (wasm-sandbox-available?)) - ;; Operator can force sandbox-or-fail mode by setting either the env - ;; var or this in-process flag. This closes the silent-fallback gap - ;; called out in vs-djbdns.md (issue F). - (def *require-sandbox?* #f) + ;; Fail closed by default: the sandboxed query parser is required, and a + ;; binary without the wasmi runtime refuses to parse rather than silently + ;; handling hostile packets in-process. The only escape is the explicit + ;; development opt-out JDNS_ALLOW_IN_PROCESS_PARSER=1. + ;; (JDNS_REQUIRE_WASM_PARSER is accepted for backwards compatibility but no + ;; longer changes anything: required is the default posture.) + (def *require-sandbox?* #t) + + (def (truthy-env? name) + (let ([v (getenv name)]) + (and v (not (member v '("" "0" "false")))))) (def (require-sandbox?) - (or *require-sandbox?* - (let ([v (getenv "JDNS_REQUIRE_WASM_PARSER")]) - (and v (not (member v '("" "0" "false"))))))) + (and *require-sandbox?* + (not (truthy-env? "JDNS_ALLOW_IN_PROCESS_PARSER")))) (def (set-require-sandbox! flag) (set! *require-sandbox?* (and flag #t))) @@ -129,7 +138,7 @@ (set! *warned-fallback?* #t) (log-info 'wasm_dns_fallback 'reason reason - 'hint "set JDNS_REQUIRE_WASM_PARSER=1 to error instead"))) + 'hint "in-process fallback allowed by JDNS_ALLOW_IN_PROCESS_PARSER=1 (development only)"))) ;; ---------- Output decoder ---------- @@ -232,13 +241,10 @@ (cond [(or (negative? pkt-len) (> pkt-len MAX-INPUT)) #f] [(not (sandbox-available?)) - (let ([reason (cond - [(not (wasm-sandbox-available?)) - "libjerboa_native not loaded"] - [else "wasm module missing on disk"])]) + (let ([reason "libjerboa_native not loaded"]) (when (require-sandbox?) (error 'parse-query-sandboxed - "JDNS_REQUIRE_WASM_PARSER set but sandbox unavailable" + "WASM DNS parser sandbox required but unavailable (wasmi runtime not linked in)" reason)) (warn-fallback-once! reason) (parse-query-fallback pkt-bv pkt-len))] new file mode 100644 --- /dev/null +++ b/lib/jerboa-dns/wasm-embedded.ss @@ -0,0 +1,779 @@ +#!chezscheme +;;; (jerboa-dns wasm-embedded) — wasm sandbox payloads embedded in the binary. +;;; +;;; AUTO-GENERATED by wasm/embed-gen.py from lib/jerboa-dns/sandbox/*.wasm. +;;; Do not edit by hand: run `make wasm` (or sh wasm/build.sh) to regenerate +;;; after changing the Rust parsers. The sha256 digests below must match +;;; dist/release-evidence/wasm-sha256.txt for a release build. +;;; +;;; (jerboa-dns wasm-dns) and (jerboa-dns wasm-cdb) load these bytevectors +;;; directly, so the wasmi sandbox needs no files on disk — in particular +;;; nothing inside the chroot. JDNS_PARSER_WASM / JDNS_CDB_WASM remain as +;;; explicit development overrides. + +(library (jerboa-dns wasm-embedded) + (export + dns-parser-wasm-bytes + cdb-parser-wasm-bytes + dns-parser-wasm-sha256 + cdb-parser-wasm-sha256) + (import (chezscheme)) + + ;; dns_parser.wasm: 5434 bytes, sha256 048828bf500ef3099601c5161783a72f965fa3e5e2aedc037374880de3b81c57 + (define dns-parser-wasm-bytes + #vu8( 0 97 115 109 1 0 0 0 1 83 12 96 2 127 127 1 + 127 96 3 127 127 127 1 127 96 1 127 0 96 6 127 127 + 127 127 127 127 0 96 3 127 127 127 0 96 5 127 127 127 + 127 127 0 96 1 127 1 127 96 4 127 127 127 127 1 127 + 96 0 0 96 6 127 127 127 127 127 127 1 127 96 4 127 + 127 127 127 0 96 5 127 127 127 127 127 1 127 3 19 18 + 2 3 1 4 0 5 6 7 8 9 1 4 4 0 10 11 + 0 4 4 5 1 112 1 2 2 5 3 1 0 19 6 25 + 3 127 1 65 128 128 192 0 11 127 0 65 212 133 200 0 + 11 127 0 65 224 133 200 0 11 7 67 6 6 109 101 109 + 111 114 121 2 0 5 97 108 108 111 99 0 6 11 112 97 + 114 115 101 95 113 117 101 114 121 0 7 5 114 101 115 101 + 116 0 8 10 95 95 100 97 116 97 95 101 110 100 3 1 + 11 95 95 104 101 97 112 95 98 97 115 101 3 2 9 7 + 1 0 65 1 11 1 13 10 247 34 18 3 0 0 11 55 + 0 2 64 32 2 32 1 73 13 0 32 2 32 4 75 13 + 0 32 0 32 2 32 1 107 54 2 4 32 0 32 3 32 + 1 106 54 2 0 15 11 32 1 32 2 32 4 32 5 16 + 142 128 128 128 0 0 11 83 1 1 127 2 64 2 64 32 + 2 32 1 79 13 0 32 2 65 1 106 34 3 32 1 73 + 13 1 32 3 32 1 65 148 131 192 128 0 16 140 128 128 + 128 0 0 11 32 2 32 1 65 132 131 192 128 0 16 140 + 128 128 128 0 0 11 32 0 32 2 106 45 0 0 65 8 + 116 32 0 32 3 106 45 0 0 114 11 60 1 1 127 65 + 1 33 3 2 64 32 1 32 2 65 128 254 3 113 65 8 + 118 16 132 128 128 128 0 65 1 113 13 0 32 1 32 2 + 16 132 128 128 128 0 33 3 11 32 0 65 125 54 2 4 + 32 0 32 3 54 2 0 11 55 1 2 127 65 1 33 2 + 2 64 32 0 40 2 8 34 3 32 0 40 2 4 79 13 + 0 32 0 32 3 65 1 106 54 2 8 32 0 40 2 0 + 32 3 106 32 1 58 0 0 65 0 33 2 11 32 2 11 + 44 0 2 64 32 1 32 3 71 13 0 2 64 32 1 69 + 13 0 32 0 32 2 32 1 252 10 0 0 11 15 11 32 + 1 32 3 32 4 16 145 128 128 128 0 0 11 72 1 1 + 127 65 0 65 0 40 2 208 133 200 128 0 34 1 32 0 + 65 7 106 65 120 113 106 34 0 54 2 208 133 200 128 0 + 2 64 32 0 65 128 128 8 75 13 0 32 1 65 208 133 + 192 128 0 106 15 11 65 0 65 128 128 8 54 2 208 133 + 200 128 0 65 0 11 140 8 2 12 127 1 126 35 128 128 + 128 128 0 65 192 2 107 34 4 36 128 128 128 128 0 65 + 126 33 5 2 64 32 1 65 128 32 75 13 0 65 127 33 + 5 32 2 65 208 133 192 128 0 73 13 0 32 0 65 208 + 133 192 128 0 73 13 0 65 127 32 0 32 1 106 34 6 + 32 6 32 0 73 27 65 208 133 200 128 0 75 13 0 65 + 127 32 2 32 3 106 34 6 32 6 32 2 73 27 65 208 + 133 200 128 0 75 13 0 65 124 33 5 32 1 65 12 73 + 13 0 32 0 44 0 2 65 0 72 13 0 32 0 32 1 + 65 4 16 130 128 128 128 0 65 255 255 3 113 65 1 71 + 13 0 65 0 33 7 32 0 32 1 65 0 16 130 128 128 + 128 0 33 8 2 64 65 128 2 69 13 0 32 4 65 52 + 106 65 0 65 128 2 252 11 0 11 65 12 33 9 65 1 + 33 10 65 0 33 11 65 0 33 12 2 64 2 64 3 64 + 2 64 32 7 65 229 0 71 13 0 65 122 33 5 12 4 + 11 3 64 65 123 33 5 32 9 32 1 79 13 4 2 64 + 32 0 32 9 106 45 0 0 34 6 13 0 32 11 65 255 + 1 77 13 3 12 4 11 2 64 32 6 65 192 1 113 34 + 13 69 13 0 2 64 32 13 65 192 1 70 13 0 65 120 + 33 5 12 6 11 32 9 65 1 106 34 13 32 1 79 13 + 5 65 120 33 5 32 6 65 63 113 65 8 116 32 0 32 + 13 106 45 0 0 114 34 6 32 9 79 13 5 32 13 32 + 14 32 10 65 1 113 27 33 14 32 7 65 1 106 33 7 + 32 10 32 12 114 33 12 65 0 33 10 32 6 33 9 12 + 2 11 65 120 33 5 32 6 65 63 75 13 4 65 123 33 + 5 32 9 65 1 106 34 13 32 6 106 32 1 75 13 4 + 32 11 65 1 106 34 5 32 6 106 34 15 65 255 1 75 + 13 3 2 64 32 11 65 255 1 75 13 0 32 4 65 52 + 106 32 11 106 32 6 58 0 0 32 4 65 40 106 32 5 + 32 15 32 4 65 52 106 65 128 2 65 212 131 192 128 0 + 16 129 128 128 128 0 32 4 40 2 40 32 4 40 2 44 + 32 0 32 13 106 32 6 65 228 131 192 128 0 16 133 128 + 128 128 0 32 6 65 1 106 34 5 32 9 106 33 9 32 + 5 32 11 106 33 11 12 1 11 11 11 32 11 65 128 2 + 65 196 131 192 128 0 16 140 128 128 128 0 0 11 32 4 + 65 52 106 32 11 106 65 0 58 0 0 32 14 32 9 32 + 12 65 1 113 27 34 6 65 5 106 32 1 75 13 1 32 + 0 32 1 32 6 65 1 106 16 130 128 128 128 0 33 9 + 32 0 32 1 32 6 65 3 106 16 130 128 128 128 0 33 + 6 32 4 32 3 54 2 184 2 32 4 32 2 54 2 180 + 2 65 125 33 5 32 3 69 13 1 32 2 65 1 58 0 + 0 32 4 65 1 54 2 188 2 32 4 65 32 106 32 4 + 65 180 2 106 32 8 16 131 128 128 128 0 2 64 32 4 + 40 2 32 65 1 113 69 13 0 32 4 40 2 36 33 5 + 12 2 11 32 4 40 2 188 2 34 1 32 4 40 2 184 + 2 34 3 32 1 32 3 75 27 33 0 32 11 65 1 106 + 34 13 173 33 16 32 4 40 2 180 2 33 2 2 64 3 + 64 2 64 32 16 66 255 0 86 13 0 32 1 32 3 79 + 13 4 32 2 32 1 106 32 16 60 0 0 32 11 32 1 + 106 65 2 106 34 0 32 3 75 13 4 32 4 65 24 106 + 32 1 65 1 106 32 0 32 2 32 3 65 164 131 192 128 + 0 16 129 128 128 128 0 32 4 40 2 24 32 4 40 2 + 28 32 4 65 52 106 32 13 65 180 131 192 128 0 16 133 + 128 128 128 0 32 4 32 0 54 2 188 2 32 4 65 16 + 106 32 4 65 180 2 106 32 9 16 131 128 128 128 0 32 + 4 40 2 16 65 1 113 69 13 2 32 4 40 2 20 33 + 5 12 4 11 32 0 32 1 70 13 3 32 2 32 1 106 + 32 16 167 65 128 1 114 58 0 0 32 16 66 7 136 33 + 16 32 1 65 1 106 33 1 12 0 11 11 32 4 65 8 + 106 32 4 65 180 2 106 32 6 16 131 128 128 128 0 2 + 64 32 4 40 2 8 65 1 113 69 13 0 32 4 40 2 + 12 33 5 12 2 11 32 4 40 2 188 2 34 1 32 4 + 40 2 184 2 79 13 1 32 4 40 2 180 2 32 1 106 + 65 255 1 58 0 0 32 1 65 1 106 33 5 12 1 11 + 65 121 33 5 11 32 4 65 192 2 106 36 128 128 128 128 + 0 32 5 11 13 0 65 0 65 0 54 2 208 133 200 128 + 0 11 177 6 2 8 127 1 126 2 64 2 64 32 1 13 + 0 32 5 65 1 106 33 6 32 0 40 2 8 33 7 65 + 45 33 8 12 1 11 65 43 65 128 128 196 0 32 0 40 + 2 8 34 7 65 128 128 128 1 113 34 1 27 33 8 32 + 1 65 21 118 32 5 106 33 6 11 2 64 2 64 32 7 + 65 128 128 128 4 113 13 0 65 0 33 2 12 1 11 2 + 64 2 64 32 3 65 16 73 13 0 32 2 32 3 16 144 + 128 128 128 0 33 1 12 1 11 2 64 32 3 13 0 65 + 0 33 1 12 1 11 32 3 65 3 113 33 9 2 64 2 + 64 32 3 65 4 79 13 0 65 0 33 10 65 0 33 1 + 12 1 11 32 3 65 12 113 33 11 65 0 33 10 65 0 + 33 1 3 64 32 1 32 2 32 10 106 34 12 44 0 0 + 65 191 127 74 106 32 12 65 1 106 44 0 0 65 191 127 + 74 106 32 12 65 2 106 44 0 0 65 191 127 74 106 32 + 12 65 3 106 44 0 0 65 191 127 74 106 33 1 32 11 + 32 10 65 4 106 34 10 71 13 0 11 11 32 9 69 13 + 0 32 2 32 10 106 33 12 3 64 32 1 32 12 44 0 + 0 65 191 127 74 106 33 1 32 12 65 1 106 33 12 32 + 9 65 127 106 34 9 13 0 11 11 32 1 32 6 106 33 + 6 11 2 64 2 64 32 6 32 0 47 1 12 34 11 79 + 13 0 2 64 2 64 2 64 32 7 65 128 128 128 8 113 + 13 0 32 11 32 6 107 33 13 65 0 33 1 65 0 33 + 11 2 64 2 64 2 64 32 7 65 29 118 65 3 113 14 + 4 2 0 1 0 2 11 32 13 33 11 12 1 11 32 13 + 65 254 255 3 113 65 1 118 33 11 11 32 7 65 255 255 + 255 0 113 33 6 32 0 40 2 4 33 9 32 0 40 2 + 0 33 10 3 64 32 1 65 255 255 3 113 32 11 65 255 + 255 3 113 79 13 2 65 1 33 12 32 1 65 1 106 33 + 1 32 10 32 6 32 9 40 2 16 17 128 128 128 128 0 + 128 128 128 128 0 69 13 0 12 5 11 11 32 0 32 0 + 41 2 8 34 14 167 65 128 128 128 255 121 113 65 176 128 + 128 128 2 114 54 2 8 65 1 33 12 32 0 40 2 0 + 34 10 32 0 40 2 4 34 9 32 8 32 2 32 3 16 + 143 128 128 128 0 13 3 65 0 33 1 32 11 32 6 107 + 65 255 255 3 113 33 2 3 64 32 1 65 255 255 3 113 + 32 2 79 13 2 65 1 33 12 32 1 65 1 106 33 1 + 32 10 65 48 32 9 40 2 16 17 128 128 128 128 0 128 + 128 128 128 0 69 13 0 12 4 11 11 65 1 33 12 32 + 10 32 9 32 8 32 2 32 3 16 143 128 128 128 0 13 + 2 32 10 32 4 32 5 32 9 40 2 12 17 129 128 128 + 128 0 128 128 128 128 0 13 2 65 0 33 1 32 13 32 + 11 107 65 255 255 3 113 33 0 3 64 32 1 65 255 255 + 3 113 34 2 32 0 73 33 12 32 2 32 0 79 13 3 + 32 1 65 1 106 33 1 32 10 32 6 32 9 40 2 16 + 17 128 128 128 128 0 128 128 128 128 0 69 13 0 12 3 + 11 11 65 1 33 12 32 10 32 4 32 5 32 9 40 2 + 12 17 129 128 128 128 0 128 128 128 128 0 13 1 32 0 + 32 14 55 2 8 65 0 15 11 65 1 33 12 32 0 40 + 2 0 34 1 32 0 40 2 4 34 10 32 8 32 2 32 + 3 16 143 128 128 128 0 13 0 32 1 32 4 32 5 32 + 10 40 2 12 17 129 128 128 128 0 128 128 128 128 0 33 + 12 11 32 12 11 193 4 1 9 127 32 0 33 3 32 2 + 33 4 2 64 32 0 65 232 7 73 13 0 32 1 65 124 + 106 33 5 65 0 33 6 32 0 33 7 2 64 2 64 3 + 64 32 7 32 7 65 144 206 0 110 34 3 65 144 206 0 + 108 107 34 8 65 255 255 3 113 65 228 0 110 33 9 2 + 64 2 64 32 2 32 6 106 34 4 65 124 106 32 2 79 + 13 0 32 5 32 2 106 34 10 32 9 65 1 116 34 11 + 45 0 244 131 192 128 0 58 0 0 32 4 65 125 106 32 + 2 73 13 1 32 4 65 125 106 32 2 65 188 133 192 128 + 0 16 140 128 128 128 0 0 11 32 4 65 124 106 32 2 + 65 188 133 192 128 0 16 140 128 128 128 0 0 11 32 10 + 65 1 106 32 11 65 245 131 192 128 0 106 45 0 0 58 + 0 0 2 64 32 4 65 126 106 32 2 79 13 0 32 10 + 65 2 106 32 8 32 9 65 228 0 108 107 65 1 116 65 + 254 255 7 113 34 9 45 0 244 131 192 128 0 58 0 0 + 32 4 65 127 106 32 2 79 13 2 32 10 65 3 106 32 + 9 65 245 131 192 128 0 106 45 0 0 58 0 0 32 5 + 65 124 106 33 5 32 6 65 124 106 33 6 32 7 65 255 + 172 226 4 75 33 4 32 3 33 7 32 4 69 13 3 12 + 1 11 11 32 4 65 126 106 32 2 65 188 133 192 128 0 + 16 140 128 128 128 0 0 11 32 4 65 127 106 32 2 65 + 188 133 192 128 0 16 140 128 128 128 0 0 11 32 2 32 + 6 106 33 4 11 2 64 2 64 32 3 65 9 75 13 0 + 32 3 33 10 32 4 33 7 12 1 11 32 3 65 255 255 + 3 113 65 228 0 110 33 10 2 64 2 64 32 4 65 126 + 106 34 7 32 2 79 13 0 32 1 32 7 106 32 3 32 + 10 65 228 0 108 107 65 255 255 3 113 65 1 116 34 6 + 45 0 244 131 192 128 0 58 0 0 32 4 65 127 106 34 + 4 32 2 79 13 1 32 1 32 4 106 32 6 65 245 131 + 192 128 0 106 45 0 0 58 0 0 12 2 11 32 7 32 + 2 65 188 133 192 128 0 16 140 128 128 128 0 0 11 32 + 4 32 2 65 188 133 192 128 0 16 140 128 128 128 0 0 + 11 2 64 2 64 32 0 69 13 0 32 10 69 13 1 11 + 2 64 32 7 65 127 106 34 7 32 2 73 13 0 32 7 + 32 2 65 188 133 192 128 0 16 140 128 128 128 0 0 11 + 32 1 32 7 106 32 10 65 1 116 45 0 245 131 192 128 + 0 58 0 0 11 32 7 11 71 1 1 127 35 128 128 128 + 128 0 65 32 107 34 3 36 128 128 128 128 0 32 3 32 + 1 54 2 16 32 3 32 0 54 2 12 32 3 65 1 59 + 1 28 32 3 32 2 54 2 24 32 3 32 3 65 12 106 + 54 2 20 32 3 65 20 106 16 128 128 128 128 0 0 11 + 95 2 1 127 1 126 35 128 128 128 128 0 65 32 107 34 + 3 36 128 128 128 128 0 32 3 32 1 54 2 12 32 3 + 32 0 54 2 8 32 3 65 129 128 128 128 0 173 66 32 + 134 34 4 32 3 65 8 106 173 132 55 3 24 32 3 32 + 4 32 3 65 12 106 173 132 55 3 16 65 168 128 192 128 + 0 32 3 65 16 106 32 2 16 139 128 128 128 0 0 11 + 81 1 1 127 35 128 128 128 128 0 65 16 107 34 2 36 + 128 128 128 128 0 32 1 65 1 65 1 65 0 32 2 65 + 6 106 32 0 40 2 0 32 2 65 6 106 65 10 16 138 + 128 128 128 0 34 0 106 65 10 32 0 107 16 137 128 128 + 128 0 33 0 32 2 65 16 106 36 128 128 128 128 0 32 + 0 11 205 2 2 1 127 1 126 35 128 128 128 128 0 65 + 32 107 34 4 36 128 128 128 128 0 2 64 2 64 2 64 + 32 0 32 2 75 13 0 32 1 32 2 75 13 1 65 129 + 128 128 128 0 173 66 32 134 33 5 32 0 32 1 77 13 + 2 32 4 32 0 54 2 8 32 4 32 1 54 2 12 32 + 4 32 5 32 4 65 12 106 173 132 55 3 24 32 4 32 + 5 32 4 65 8 106 173 132 55 3 16 65 128 128 192 128 + 0 32 4 65 16 106 32 3 16 139 128 128 128 0 0 11 + 32 4 32 0 54 2 8 32 4 32 2 54 2 12 32 4 + 65 129 128 128 128 0 173 66 32 134 34 5 32 4 65 12 + 106 173 132 55 3 24 32 4 32 5 32 4 65 8 106 173 + 132 55 3 16 65 223 128 192 128 0 32 4 65 16 106 32 + 3 16 139 128 128 128 0 0 11 32 4 32 1 54 2 8 + 32 4 32 2 54 2 12 32 4 65 129 128 128 128 0 173 + 66 32 134 34 5 32 4 65 12 106 173 132 55 3 24 32 + 4 32 5 32 4 65 8 106 173 132 55 3 16 65 152 129 + 192 128 0 32 4 65 16 106 32 3 16 139 128 128 128 0 + 0 11 32 4 32 1 54 2 8 32 4 32 2 54 2 12 + 32 4 32 5 32 4 65 12 106 173 132 55 3 24 32 4 + 32 5 32 4 65 8 106 173 132 55 3 16 65 152 129 192 + 128 0 32 4 65 16 106 32 3 16 139 128 128 128 0 0 + 11 73 0 2 64 32 2 65 128 128 196 0 70 13 0 32 + 0 32 2 32 1 40 2 16 17 128 128 128 128 0 128 128 + 128 128 0 69 13 0 65 1 15 11 2 64 32 3 13 0 + 65 0 15 11 32 0 32 3 32 4 32 1 40 2 12 17 + 129 128 128 128 0 128 128 128 128 0 11 244 6 1 8 127 + 2 64 2 64 32 1 32 0 65 3 106 65 124 113 34 2 + 32 0 107 34 3 73 13 0 32 1 32 3 107 34 4 65 + 4 73 13 0 32 4 65 3 113 33 5 65 0 33 6 65 + 0 33 1 2 64 32 2 32 0 70 13 0 65 0 33 7 + 65 0 33 1 2 64 32 0 32 2 107 34 8 65 124 75 + 13 0 65 0 33 7 65 0 33 1 3 64 32 1 32 0 + 32 7 106 34 2 44 0 0 65 191 127 74 106 32 2 65 + 1 106 44 0 0 65 191 127 74 106 32 2 65 2 106 44 + 0 0 65 191 127 74 106 32 2 65 3 106 44 0 0 65 + 191 127 74 106 33 1 32 7 65 4 106 34 7 13 0 11 + 11 32 0 32 7 106 33 2 3 64 32 1 32 2 44 0 + 0 65 191 127 74 106 33 1 32 2 65 1 106 33 2 32 + 8 65 1 106 34 8 13 0 11 11 32 0 32 3 106 33 + 8 2 64 32 5 69 13 0 32 8 32 4 65 252 255 255 + 255 7 113 106 34 2 44 0 0 65 191 127 74 33 6 32 + 5 65 1 70 13 0 32 6 32 2 44 0 1 65 191 127 + 74 106 33 6 32 5 65 2 70 13 0 32 6 32 2 44 + 0 2 65 191 127 74 106 33 6 11 32 4 65 2 118 33 + 3 32 6 32 1 106 33 7 3 64 32 8 33 4 32 3 + 69 13 2 32 3 65 192 1 32 3 65 192 1 73 27 34 + 6 65 3 113 33 5 2 64 2 64 32 6 65 2 116 34 + 9 65 240 7 113 34 1 13 0 65 0 33 2 12 1 11 + 32 4 32 1 106 33 0 65 0 33 2 32 4 33 1 3 + 64 32 1 65 12 106 40 2 0 34 8 65 127 115 65 7 + 118 32 8 65 6 118 114 65 129 130 132 8 113 32 1 65 + 8 106 40 2 0 34 8 65 127 115 65 7 118 32 8 65 + 6 118 114 65 129 130 132 8 113 32 1 65 4 106 40 2 + 0 34 8 65 127 115 65 7 118 32 8 65 6 118 114 65 + 129 130 132 8 113 32 1 40 2 0 34 8 65 127 115 65 + 7 118 32 8 65 6 118 114 65 129 130 132 8 113 32 2 + 106 106 106 106 33 2 32 1 65 16 106 34 1 32 0 71 + 13 0 11 11 32 3 32 6 107 33 3 32 4 32 9 106 + 33 8 32 2 65 8 118 65 255 129 252 7 113 32 2 65 + 255 129 252 7 113 106 65 129 128 4 108 65 16 118 32 7 + 106 33 7 32 5 69 13 0 11 32 4 32 6 65 252 1 + 113 65 2 116 106 34 2 40 2 0 34 1 65 127 115 65 + 7 118 32 1 65 6 118 114 65 129 130 132 8 113 33 1 + 2 64 32 5 65 1 70 13 0 32 2 40 2 4 34 8 + 65 127 115 65 7 118 32 8 65 6 118 114 65 129 130 132 + 8 113 32 1 106 33 1 32 5 65 2 70 13 0 32 2 + 40 2 8 34 2 65 127 115 65 7 118 32 2 65 6 118 + 114 65 129 130 132 8 113 32 1 106 33 1 11 32 1 65 + 8 118 65 255 129 28 113 32 1 65 255 129 252 7 113 106 + 65 129 128 4 108 65 16 118 32 7 106 33 7 12 1 11 + 2 64 32 1 13 0 65 0 15 11 32 1 65 3 113 33 + 8 2 64 2 64 32 1 65 4 79 13 0 65 0 33 2 + 65 0 33 7 12 1 11 32 1 65 124 113 33 3 65 0 + 33 2 65 0 33 7 3 64 32 7 32 0 32 2 106 34 + 1 44 0 0 65 191 127 74 106 32 1 65 1 106 44 0 + 0 65 191 127 74 106 32 1 65 2 106 44 0 0 65 191 + 127 74 106 32 1 65 3 106 44 0 0 65 191 127 74 106 + 33 7 32 3 32 2 65 4 106 34 2 71 13 0 11 11 + 32 8 69 13 0 32 0 32 2 106 33 1 3 64 32 7 + 32 1 44 0 0 65 191 127 74 106 33 7 32 1 65 1 + 106 33 1 32 8 65 127 106 34 8 13 0 11 11 32 7 + 11 95 2 1 127 1 126 35 128 128 128 128 0 65 32 107 + 34 3 36 128 128 128 128 0 32 3 32 1 54 2 8 32 + 3 32 0 54 2 12 32 3 65 129 128 128 128 0 173 66 + 32 134 34 4 32 3 65 12 106 173 132 55 3 24 32 3 + 32 4 32 3 65 8 106 173 132 55 3 16 65 170 130 192 + 128 0 32 3 65 16 106 32 2 16 139 128 128 128 0 0 + 11 11 214 5 1 0 65 128 128 192 0 11 204 5 22 115 + 108 105 99 101 32 105 110 100 101 120 32 115 116 97 114 116 + 115 32 97 116 32 192 13 32 98 117 116 32 101 110 100 115 + 32 97 116 32 192 0 32 105 110 100 101 120 32 111 117 116 + 32 111 102 32 98 111 117 110 100 115 58 32 116 104 101 32 + 108 101 110 32 105 115 32 192 18 32 98 117 116 32 116 104 + 101 32 105 110 100 101 120 32 105 115 32 192 0 18 114 97 + 110 103 101 32 115 116 97 114 116 32 105 110 100 101 120 32 + 192 34 32 111 117 116 32 111 102 32 114 97 110 103 101 32 + 102 111 114 32 115 108 105 99 101 32 111 102 32 108 101 110 + 103 116 104 32 192 0 16 114 97 110 103 101 32 101 110 100 + 32 105 110 100 101 120 32 192 34 32 111 117 116 32 111 102 + 32 114 97 110 103 101 32 102 111 114 32 115 108 105 99 101 + 32 111 102 32 108 101 110 103 116 104 32 192 0 47 114 117 + 115 116 99 47 101 52 48 56 57 52 55 98 102 100 50 48 + 48 97 102 52 50 100 98 51 50 50 100 97 102 48 102 97 + 100 102 101 55 101 50 54 100 51 98 100 49 47 108 105 98 + 114 97 114 121 47 99 111 114 101 47 115 114 99 47 102 109 + 116 47 110 117 109 46 114 115 0 100 110 115 47 115 114 99 + 47 108 105 98 46 114 115 0 38 99 111 112 121 95 102 114 + 111 109 95 115 108 105 99 101 58 32 115 111 117 114 99 101 + 32 115 108 105 99 101 32 108 101 110 103 116 104 32 40 192 + 43 41 32 100 111 101 115 32 110 111 116 32 109 97 116 99 + 104 32 100 101 115 116 105 110 97 116 105 111 110 32 115 108 + 105 99 101 32 108 101 110 103 116 104 32 40 192 1 41 0 + 0 0 27 1 16 0 14 0 0 0 143 0 0 0 7 0 + 0 0 27 1 16 0 14 0 0 0 143 0 0 0 33 0 + 0 0 27 1 16 0 14 0 0 0 7 1 0 0 17 0 + 0 0 27 1 16 0 14 0 0 0 7 1 0 0 49 0 + 0 0 27 1 16 0 14 0 0 0 219 0 0 0 9 0 + 0 0 27 1 16 0 14 0 0 0 220 0 0 0 12 0 + 0 0 27 1 16 0 14 0 0 0 221 0 0 0 14 0 + 0 0 48 48 48 49 48 50 48 51 48 52 48 53 48 54 + 48 55 48 56 48 57 49 48 49 49 49 50 49 51 49 52 + 49 53 49 54 49 55 49 56 49 57 50 48 50 49 50 50 + 50 51 50 52 50 53 50 54 50 55 50 56 50 57 51 48 + 51 49 51 50 51 51 51 52 51 53 51 54 51 55 51 56 + 51 57 52 48 52 49 52 50 52 51 52 52 52 53 52 54 + 52 55 52 56 52 57 53 48 53 49 53 50 53 51 53 52 + 53 53 53 54 53 55 53 56 53 57 54 48 54 49 54 50 + 54 51 54 52 54 53 54 54 54 55 54 56 54 57 55 48 + 55 49 55 50 55 51 55 52 55 53 55 54 55 55 55 56 + 55 57 56 48 56 49 56 50 56 51 56 52 56 53 56 54 + 56 55 56 56 56 57 57 48 57 49 57 50 57 51 57 52 + 57 53 57 54 57 55 57 56 57 57 207 0 16 0 75 0 + 0 0 87 2 0 0 5 0 0 0 +)) + + (define dns-parser-wasm-sha256 "048828bf500ef3099601c5161783a72f965fa3e5e2aedc037374880de3b81c57") + + ;; cdb_parser.wasm: 6475 bytes, sha256 b93cf8c6eef9ab3895065465a92a5f7e15f4726577b4adad630e7ba47eb7349c + (define cdb-parser-wasm-bytes + #vu8( 0 97 115 109 1 0 0 0 1 78 12 96 2 127 127 1 + 127 96 3 127 127 127 1 127 96 1 127 0 96 4 127 127 + 127 127 0 96 5 127 127 127 127 127 0 96 1 127 1 127 + 96 0 1 127 96 4 127 127 127 127 1 127 96 0 0 96 + 6 127 127 127 127 127 127 1 127 96 3 127 127 127 0 96 + 5 127 127 127 127 127 1 127 3 23 22 2 3 0 1 3 + 4 5 6 6 5 7 8 9 1 10 10 0 3 11 0 10 + 1 4 5 1 112 1 2 2 5 4 1 0 146 2 6 25 + 3 127 1 65 128 128 192 0 11 127 0 65 168 134 196 8 + 11 127 0 65 176 134 196 8 11 7 112 9 6 109 101 109 + 111 114 121 2 0 5 97 108 108 111 99 0 6 14 99 100 + 98 95 98 117 102 102 101 114 95 112 116 114 0 7 12 99 + 100 98 95 99 97 112 97 99 105 116 121 0 8 12 99 100 + 98 95 102 105 110 97 108 105 122 101 0 9 9 99 100 98 + 95 113 117 101 114 121 0 10 5 114 101 115 101 116 0 11 + 10 95 95 100 97 116 97 95 101 110 100 3 1 11 95 95 + 104 101 97 112 95 98 97 115 101 3 2 9 7 1 0 65 + 1 11 1 16 10 139 42 22 3 0 0 11 48 0 2 64 + 32 2 65 7 73 13 0 32 0 32 2 65 121 106 54 2 + 4 32 0 32 1 65 7 106 54 2 0 15 11 65 7 32 + 2 32 2 32 3 16 145 128 128 128 0 0 11 69 0 2 + 64 2 64 2 64 32 1 14 2 0 2 1 11 65 0 65 + 0 65 164 131 192 128 0 16 143 128 128 128 0 0 11 32 + 0 47 0 0 34 1 65 8 116 32 1 65 8 118 114 15 + 11 65 1 65 1 65 180 131 192 128 0 16 143 128 128 128 + 0 0 11 171 1 1 3 127 2 64 2 64 2 64 2 64 + 32 2 32 1 79 13 0 32 2 65 1 106 34 3 32 1 + 79 13 1 32 2 65 2 106 34 4 32 1 79 13 2 32 + 2 65 3 106 34 5 32 1 73 13 3 32 5 32 1 65 + 244 131 192 128 0 16 143 128 128 128 0 0 11 32 2 32 + 1 65 196 131 192 128 0 16 143 128 128 128 0 0 11 32 + 3 32 1 65 212 131 192 128 0 16 143 128 128 128 0 0 + 11 32 4 32 1 65 228 131 192 128 0 16 143 128 128 128 + 0 0 11 32 0 32 3 106 45 0 0 65 8 116 32 0 + 32 2 106 45 0 0 114 32 0 32 4 106 45 0 0 65 + 16 116 114 32 0 32 5 106 45 0 0 65 24 116 114 11 + 153 1 1 6 127 65 0 33 4 32 3 33 5 2 64 3 + 64 65 1 33 6 65 120 33 7 32 5 32 2 79 13 1 + 32 1 32 5 106 45 0 0 34 8 65 63 75 13 1 2 + 64 32 8 13 0 32 4 65 255 1 70 13 2 32 5 32 + 3 107 65 1 106 33 7 65 0 33 6 12 2 11 65 1 + 33 6 32 5 32 8 65 1 106 65 255 1 113 34 9 106 + 34 8 32 5 73 13 1 32 8 32 2 75 13 1 32 4 + 32 9 106 34 9 32 4 73 13 1 32 8 33 5 32 9 + 33 4 32 9 65 255 1 77 13 0 11 11 32 0 32 7 + 54 2 4 32 0 32 6 54 2 0 11 44 0 2 64 32 + 1 32 3 71 13 0 2 64 32 1 69 13 0 32 0 32 + 2 32 1 252 10 0 0 11 15 11 32 1 32 3 32 4 + 16 148 128 128 128 0 0 11 72 1 1 127 65 0 65 0 + 40 2 160 134 196 136 0 34 1 32 0 65 7 106 65 120 + 113 106 34 0 54 2 160 134 196 136 0 2 64 32 0 65 + 128 128 4 75 13 0 32 1 65 160 134 192 136 0 106 15 + 11 65 0 65 128 128 4 54 2 160 134 196 136 0 65 0 + 11 8 0 65 160 134 192 128 0 11 7 0 65 128 128 128 + 8 11 191 1 1 5 127 2 64 2 64 2 64 32 0 65 + 128 16 79 13 0 65 0 33 1 12 1 11 65 126 33 2 + 65 0 33 1 32 0 65 128 128 128 8 75 13 1 65 0 + 33 2 65 0 33 3 3 64 2 64 32 3 65 128 16 71 + 13 0 32 0 33 1 12 3 11 65 160 134 192 128 0 32 + 0 32 3 16 131 128 128 128 0 33 4 2 64 65 160 134 + 192 128 0 32 0 32 3 65 4 106 16 131 128 128 128 0 + 34 5 69 13 0 65 0 33 1 32 4 65 128 16 73 13 + 2 32 5 65 255 255 255 255 1 75 13 2 32 5 65 3 + 116 34 5 32 4 106 34 4 32 5 73 13 2 32 4 32 + 0 75 13 2 11 32 3 65 8 106 33 3 12 0 11 11 + 65 123 33 2 11 65 0 32 1 54 2 164 134 196 136 0 + 32 2 11 197 11 2 20 127 1 126 35 128 128 128 128 0 + 65 48 107 34 4 36 128 128 128 128 0 2 64 2 64 65 + 0 40 2 164 134 196 136 0 34 5 13 0 65 124 33 6 + 12 1 11 2 64 32 1 65 255 125 106 65 255 125 75 13 + 0 65 126 33 6 12 1 11 65 127 33 6 32 1 32 0 + 106 34 7 32 1 73 13 0 32 3 32 2 106 34 8 65 + 160 134 196 136 0 75 13 0 32 2 65 160 134 192 136 0 + 73 13 0 32 7 65 160 134 196 136 0 75 13 0 32 0 + 65 160 134 192 136 0 73 13 0 32 8 32 3 73 13 0 + 65 133 42 33 7 65 0 33 6 2 64 3 64 32 1 32 + 6 70 13 1 32 0 32 6 106 33 8 32 6 65 1 106 + 33 6 32 7 65 33 108 32 8 45 0 0 115 33 7 12 + 0 11 11 65 160 134 192 128 0 32 5 32 7 65 3 116 + 65 248 15 113 34 6 16 131 128 128 128 0 33 9 2 64 + 2 64 2 64 2 64 2 64 65 160 134 192 128 0 32 5 + 32 6 65 4 114 16 131 128 128 128 0 34 8 13 0 32 + 3 13 1 12 4 11 32 8 65 255 255 255 255 1 77 13 + 1 12 2 11 32 2 65 255 1 58 0 0 65 1 33 6 + 12 3 11 32 8 65 3 116 34 6 32 9 106 34 10 32 + 6 73 13 0 32 10 32 5 75 13 0 32 9 65 4 106 + 33 11 32 7 65 8 118 32 8 112 33 12 65 0 33 13 + 65 0 33 14 65 0 33 15 3 64 2 64 2 64 32 14 + 32 8 70 13 0 65 160 134 192 128 0 32 5 32 12 65 + 3 116 34 6 32 9 106 16 131 128 128 128 0 33 10 65 + 160 134 192 128 0 32 5 32 11 32 6 106 16 131 128 128 + 128 0 34 6 13 1 11 32 13 32 3 79 13 3 32 2 + 32 13 106 65 255 1 58 0 0 32 13 65 1 106 33 6 + 12 4 11 2 64 32 10 32 7 71 13 0 32 6 65 128 + 16 73 13 2 32 6 65 119 75 13 2 32 6 65 8 106 + 34 16 32 5 75 13 2 65 160 134 192 128 0 32 5 32 + 6 16 131 128 128 128 0 33 10 65 160 134 192 128 0 32 + 5 32 6 65 4 106 16 131 128 128 128 0 34 17 32 10 + 32 16 106 34 6 106 34 18 32 5 75 13 2 32 6 32 + 10 73 13 2 32 18 32 17 73 13 2 32 10 32 1 71 + 13 0 2 64 2 64 2 64 32 16 32 1 106 34 10 32 + 16 73 13 0 32 10 32 5 75 13 0 32 16 65 160 134 + 192 128 0 106 32 0 32 1 16 149 128 128 128 0 13 3 + 2 64 32 15 65 63 77 13 0 65 121 33 6 12 8 11 + 32 17 32 10 106 34 6 32 17 73 13 1 32 6 32 5 + 75 13 1 65 122 33 6 32 17 65 7 73 13 7 32 10 + 65 160 134 192 128 0 106 34 10 32 17 16 130 128 128 128 + 0 33 19 32 4 65 40 106 32 10 32 17 65 148 131 192 + 128 0 16 129 128 128 128 0 32 4 40 2 44 33 16 32 + 4 40 2 40 33 18 2 64 2 64 2 64 2 64 2 64 + 2 64 2 64 32 19 65 255 255 3 113 34 19 65 126 106 + 14 5 4 6 6 4 1 0 11 2 64 32 19 65 116 106 + 14 4 4 6 6 0 6 11 32 16 65 3 73 13 13 32 + 4 65 16 106 32 18 32 16 65 2 16 132 128 128 128 0 + 32 4 40 2 20 33 18 32 4 40 2 16 65 1 113 69 + 13 1 32 18 33 6 12 13 11 32 4 65 32 106 32 18 + 32 16 65 0 16 132 128 128 128 0 32 4 40 2 36 33 + 19 32 4 40 2 32 65 1 113 69 13 1 32 19 33 6 + 12 12 11 32 18 65 2 106 32 16 71 13 11 12 3 11 + 32 4 65 24 106 32 18 32 16 32 19 16 132 128 128 128 + 0 32 4 40 2 28 33 18 32 4 40 2 24 65 1 113 + 69 13 1 32 18 33 6 12 10 11 32 4 65 8 106 32 + 18 32 16 65 0 16 132 128 128 128 0 32 4 40 2 12 + 33 6 2 64 32 4 40 2 8 34 18 65 1 113 13 0 + 32 6 32 16 70 13 2 11 32 6 65 122 32 18 65 1 + 113 27 33 6 12 9 11 32 16 32 19 32 18 106 65 20 + 106 71 13 8 11 32 10 32 17 16 130 128 128 128 0 33 + 18 32 10 45 0 6 33 20 32 10 45 0 5 33 21 32 + 10 45 0 4 33 22 32 10 45 0 3 33 23 32 10 45 + 0 2 33 19 32 4 32 10 32 17 65 132 131 192 128 0 + 16 129 128 128 128 0 65 125 33 6 32 13 32 3 79 13 + 7 32 4 40 2 4 33 16 32 4 40 2 0 33 17 32 + 2 32 13 106 65 2 58 0 0 32 13 65 1 106 34 10 + 32 3 79 13 7 32 2 32 10 106 32 18 65 8 118 58 + 0 0 32 13 65 2 106 34 10 32 3 79 13 7 32 2 + 32 10 106 32 18 58 0 0 32 13 65 3 106 34 10 32 + 3 79 13 7 32 2 32 10 106 32 19 58 0 0 32 13 + 65 4 106 34 10 32 3 79 13 7 32 2 32 10 106 32 + 23 58 0 0 32 13 65 5 106 34 10 32 3 79 13 7 + 32 2 32 10 106 32 22 58 0 0 32 13 65 6 106 34 + 10 32 3 79 13 7 32 2 32 10 106 32 21 58 0 0 + 32 13 65 7 106 34 10 32 3 79 13 7 32 2 32 10 + 106 32 20 58 0 0 32 13 65 8 106 33 10 32 16 173 + 33 24 2 64 3 64 32 24 66 128 1 84 13 1 32 3 + 32 10 70 13 9 32 2 32 10 106 32 24 167 65 128 1 + 114 58 0 0 32 24 66 7 136 33 24 32 10 65 1 106 + 33 10 12 0 11 11 32 10 32 3 79 13 7 32 2 32 + 10 106 34 18 32 24 60 0 0 32 16 32 10 106 65 1 + 106 34 13 32 3 75 13 7 32 13 32 10 77 13 2 32 + 18 65 1 106 32 16 32 17 32 16 65 148 132 192 128 0 + 16 133 128 128 128 0 32 15 65 1 106 33 15 12 3 11 + 32 16 32 10 32 5 65 164 132 192 128 0 16 145 128 128 + 128 0 0 11 32 10 32 6 32 5 65 180 132 192 128 0 + 16 145 128 128 128 0 0 11 32 10 65 1 106 34 6 32 + 6 32 16 106 32 3 65 132 132 192 128 0 16 145 128 128 + 128 0 0 11 65 0 32 12 65 1 106 34 6 32 6 32 + 8 70 27 33 12 32 14 65 1 106 33 14 12 0 11 11 + 65 123 33 6 12 1 11 65 125 33 6 11 32 4 65 48 + 106 36 128 128 128 128 0 32 6 11 13 0 65 0 65 0 + 54 2 160 134 196 136 0 11 177 6 2 8 127 1 126 2 + 64 2 64 32 1 13 0 32 5 65 1 106 33 6 32 0 + 40 2 8 33 7 65 45 33 8 12 1 11 65 43 65 128 + 128 196 0 32 0 40 2 8 34 7 65 128 128 128 1 113 + 34 1 27 33 8 32 1 65 21 118 32 5 106 33 6 11 + 2 64 2 64 32 7 65 128 128 128 4 113 13 0 65 0 + 33 2 12 1 11 2 64 2 64 32 3 65 16 73 13 0 + 32 2 32 3 16 147 128 128 128 0 33 1 12 1 11 2 + 64 32 3 13 0 65 0 33 1 12 1 11 32 3 65 3 + 113 33 9 2 64 2 64 32 3 65 4 79 13 0 65 0 + 33 10 65 0 33 1 12 1 11 32 3 65 12 113 33 11 + 65 0 33 10 65 0 33 1 3 64 32 1 32 2 32 10 + 106 34 12 44 0 0 65 191 127 74 106 32 12 65 1 106 + 44 0 0 65 191 127 74 106 32 12 65 2 106 44 0 0 + 65 191 127 74 106 32 12 65 3 106 44 0 0 65 191 127 + 74 106 33 1 32 11 32 10 65 4 106 34 10 71 13 0 + 11 11 32 9 69 13 0 32 2 32 10 106 33 12 3 64 + 32 1 32 12 44 0 0 65 191 127 74 106 33 1 32 12 + 65 1 106 33 12 32 9 65 127 106 34 9 13 0 11 11 + 32 1 32 6 106 33 6 11 2 64 2 64 32 6 32 0 + 47 1 12 34 11 79 13 0 2 64 2 64 2 64 32 7 + 65 128 128 128 8 113 13 0 32 11 32 6 107 33 13 65 + 0 33 1 65 0 33 11 2 64 2 64 2 64 32 7 65 + 29 118 65 3 113 14 4 2 0 1 0 2 11 32 13 33 + 11 12 1 11 32 13 65 254 255 3 113 65 1 118 33 11 + 11 32 7 65 255 255 255 0 113 33 6 32 0 40 2 4 + 33 9 32 0 40 2 0 33 10 3 64 32 1 65 255 255 + 3 113 32 11 65 255 255 3 113 79 13 2 65 1 33 12 + 32 1 65 1 106 33 1 32 10 32 6 32 9 40 2 16 + 17 128 128 128 128 0 128 128 128 128 0 69 13 0 12 5 + 11 11 32 0 32 0 41 2 8 34 14 167 65 128 128 128 + 255 121 113 65 176 128 128 128 2 114 54 2 8 65 1 33