var __create = Object.create; var __getProtoOf = Object.getPrototypeOf; var __defProp = Object.defineProperty; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; function __accessProp(key) { return this[key]; } var __toESMCache_node; var __toESMCache_esm; var __toESM = (mod, isNodeMode, target) => { var canCache = mod != null && typeof mod === "object"; if (canCache) { var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap; var cached = cache.get(mod); if (cached) return cached; } target = mod != null ? __create(__getProtoOf(mod)) : {}; const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target; for (let key of __getOwnPropNames(mod)) if (!__hasOwnProp.call(to, key)) __defProp(to, key, { get: __accessProp.bind(mod, key), enumerable: true }); if (canCache) cache.set(mod, to); return to; }; var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports); var __returnValue = (v) => v; function __exportSetter(name, newValue) { this[name] = __returnValue.bind(null, newValue); } var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true, configurable: true, set: __exportSetter.bind(all, name) }); }; // node_modules/mithril/render/vnode.js var require_vnode = __commonJS((exports, module) => { function Vnode(tag, key, attrs, children, text, dom) { return { tag, key, attrs, children, text, dom, is: undefined, domSize: undefined, state: undefined, events: undefined, instance: undefined }; } Vnode.normalize = function(node) { if (Array.isArray(node)) return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined); if (node == null || typeof node === "boolean") return null; if (typeof node === "object") return node; return Vnode("#", undefined, undefined, String(node), undefined, undefined); }; Vnode.normalizeChildren = function(input) { var children = new Array(input.length); var numKeyed = 0; for (var i = 0;i < input.length; i++) { children[i] = Vnode.normalize(input[i]); if (children[i] !== null && children[i].key != null) numKeyed++; } if (numKeyed !== 0 && numKeyed !== input.length) { throw new TypeError(children.includes(null) ? "In fragments, vnodes must either all have keys or none have keys. You may wish to consider using an explicit keyed empty fragment, m.fragment({key: ...}), instead of a hole." : "In fragments, vnodes must either all have keys or none have keys."); } return children; }; module.exports = Vnode; }); // node_modules/mithril/render/hyperscriptVnode.js var require_hyperscriptVnode = __commonJS((exports, module) => { var Vnode = require_vnode(); module.exports = function(attrs, children) { if (attrs == null || typeof attrs === "object" && attrs.tag == null && !Array.isArray(attrs)) { if (children.length === 1 && Array.isArray(children[0])) children = children[0]; } else { children = children.length === 0 && Array.isArray(attrs) ? attrs : [attrs, ...children]; attrs = undefined; } return Vnode("", attrs && attrs.key, attrs, children); }; }); // node_modules/mithril/util/hasOwn.js var require_hasOwn = __commonJS((exports, module) => { module.exports = {}.hasOwnProperty; }); // node_modules/mithril/render/emptyAttrs.js var require_emptyAttrs = __commonJS((exports, module) => { module.exports = {}; }); // node_modules/mithril/render/cachedAttrsIsStaticMap.js var require_cachedAttrsIsStaticMap = __commonJS((exports, module) => { var emptyAttrs = require_emptyAttrs(); module.exports = new Map([[emptyAttrs, true]]); }); // node_modules/mithril/render/hyperscript.js var require_hyperscript = __commonJS((exports, module) => { var Vnode = require_vnode(); var hyperscriptVnode = require_hyperscriptVnode(); var hasOwn = require_hasOwn(); var emptyAttrs = require_emptyAttrs(); var cachedAttrsIsStaticMap = require_cachedAttrsIsStaticMap(); var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g; var selectorCache = Object.create(null); function isEmpty(object) { for (var key in object) if (hasOwn.call(object, key)) return false; return true; } function isFormAttributeKey(key) { return key === "value" || key === "checked" || key === "selectedIndex" || key === "selected"; } function compileSelector(selector) { var match, tag = "div", classes = [], attrs = {}, isStatic = true; while (match = selectorParser.exec(selector)) { var type = match[1], value = match[2]; if (type === "" && value !== "") tag = value; else if (type === "#") attrs.id = value; else if (type === ".") classes.push(value); else if (match[3][0] === "[") { var attrValue = match[6]; if (attrValue) attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\"); if (match[4] === "class") classes.push(attrValue); else { attrs[match[4]] = attrValue === "" ? attrValue : attrValue || true; if (isFormAttributeKey(match[4])) isStatic = false; } } } if (classes.length > 0) attrs.className = classes.join(" "); if (isEmpty(attrs)) attrs = emptyAttrs; else cachedAttrsIsStaticMap.set(attrs, isStatic); return selectorCache[selector] = { tag, attrs, is: attrs.is }; } function execSelector(state, vnode) { vnode.tag = state.tag; var attrs = vnode.attrs; if (attrs == null) { vnode.attrs = state.attrs; vnode.is = state.is; return vnode; } if (hasOwn.call(attrs, "class")) { if (attrs.class != null) attrs.className = attrs.class; attrs.class = null; } if (state.attrs !== emptyAttrs) { var className = attrs.className; attrs = Object.assign({}, state.attrs, attrs); if (state.attrs.className != null) attrs.className = className != null ? String(state.attrs.className) + " " + String(className) : state.attrs.className; } if (state.tag === "input" && hasOwn.call(attrs, "type")) { attrs = Object.assign({ type: attrs.type }, attrs); } vnode.is = attrs.is; vnode.attrs = attrs; return vnode; } function hyperscript(selector, attrs, ...children) { if (selector == null || typeof selector !== "string" && typeof selector !== "function" && typeof selector.view !== "function") { throw Error("The selector must be either a string or a component."); } var vnode = hyperscriptVnode(attrs, children); if (typeof selector === "string") { vnode.children = Vnode.normalizeChildren(vnode.children); if (selector !== "[") return execSelector(selectorCache[selector] || compileSelector(selector), vnode); } if (vnode.attrs == null) vnode.attrs = {}; vnode.tag = selector; return vnode; } module.exports = hyperscript; }); // node_modules/mithril/render/trust.js var require_trust = __commonJS((exports, module) => { var Vnode = require_vnode(); module.exports = function(html) { if (html == null) html = ""; return Vnode("<", undefined, undefined, html, undefined, undefined); }; }); // node_modules/mithril/render/fragment.js var require_fragment = __commonJS((exports, module) => { var Vnode = require_vnode(); var hyperscriptVnode = require_hyperscriptVnode(); module.exports = function(attrs, ...children) { var vnode = hyperscriptVnode(attrs, children); if (vnode.attrs == null) vnode.attrs = {}; vnode.tag = "["; vnode.children = Vnode.normalizeChildren(vnode.children); return vnode; }; }); // node_modules/mithril/hyperscript.js var require_hyperscript2 = __commonJS((exports, module) => { var hyperscript = require_hyperscript(); hyperscript.trust = require_trust(); hyperscript.fragment = require_fragment(); module.exports = hyperscript; }); // node_modules/mithril/render/delayedRemoval.js var require_delayedRemoval = __commonJS((exports, module) => { module.exports = new WeakMap; }); // node_modules/mithril/render/domFor.js var require_domFor = __commonJS((exports, module) => { var delayedRemoval = require_delayedRemoval(); function* domFor(vnode) { var dom = vnode.dom; var domSize = vnode.domSize; var generation = delayedRemoval.get(dom); if (dom != null) do { var nextSibling = dom.nextSibling; if (delayedRemoval.get(dom) === generation) { yield dom; domSize--; } dom = nextSibling; } while (domSize); } module.exports = domFor; }); // node_modules/mithril/render/render.js var require_render = __commonJS((exports, module) => { var Vnode = require_vnode(); var delayedRemoval = require_delayedRemoval(); var domFor = require_domFor(); var cachedAttrsIsStaticMap = require_cachedAttrsIsStaticMap(); module.exports = function() { var nameSpace = { svg: "http://www.w3.org/2000/svg", math: "http://www.w3.org/1998/Math/MathML" }; var currentRedraw; var currentRender; function getDocument(dom) { return dom.ownerDocument; } function getNameSpace(vnode) { return vnode.attrs && vnode.attrs.xmlns || nameSpace[vnode.tag]; } function checkState(vnode, original) { if (vnode.state !== original) throw new Error("'vnode.state' must not be modified."); } function callHook(vnode) { var original = vnode.state; try { return this.apply(original, arguments); } finally { checkState(vnode, original); } } function activeElement(dom) { try { return getDocument(dom).activeElement; } catch (e) { return null; } } function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) { for (var i = start;i < end; i++) { var vnode = vnodes[i]; if (vnode != null) { createNode(parent, vnode, hooks, ns, nextSibling); } } } function createNode(parent, vnode, hooks, ns, nextSibling) { var tag = vnode.tag; if (typeof tag === "string") { vnode.state = {}; if (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks); switch (tag) { case "#": createText(parent, vnode, nextSibling); break; case "<": createHTML(parent, vnode, ns, nextSibling); break; case "[": createFragment(parent, vnode, hooks, ns, nextSibling); break; default: createElement(parent, vnode, hooks, ns, nextSibling); } } else createComponent(parent, vnode, hooks, ns, nextSibling); } function createText(parent, vnode, nextSibling) { vnode.dom = getDocument(parent).createTextNode(vnode.children); insertDOM(parent, vnode.dom, nextSibling); } var possibleParents = { caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup" }; function createHTML(parent, vnode, ns, nextSibling) { var match = vnode.children.match(/^\s*?<(\w+)/im) || []; var temp = getDocument(parent).createElement(possibleParents[match[1]] || "div"); if (ns === "http://www.w3.org/2000/svg") { temp.innerHTML = '' + vnode.children + ""; temp = temp.firstChild; } else { temp.innerHTML = vnode.children; } vnode.dom = temp.firstChild; vnode.domSize = temp.childNodes.length; var fragment = getDocument(parent).createDocumentFragment(); var child; while (child = temp.firstChild) { fragment.appendChild(child); } insertDOM(parent, fragment, nextSibling); } function createFragment(parent, vnode, hooks, ns, nextSibling) { var fragment = getDocument(parent).createDocumentFragment(); if (vnode.children != null) { var children = vnode.children; createNodes(fragment, children, 0, children.length, hooks, null, ns); } vnode.dom = fragment.firstChild; vnode.domSize = fragment.childNodes.length; insertDOM(parent, fragment, nextSibling); } function createElement(parent, vnode, hooks, ns, nextSibling) { var tag = vnode.tag; var attrs = vnode.attrs; var is = vnode.is; ns = getNameSpace(vnode) || ns; var element = ns ? is ? getDocument(parent).createElementNS(ns, tag, { is }) : getDocument(parent).createElementNS(ns, tag) : is ? getDocument(parent).createElement(tag, { is }) : getDocument(parent).createElement(tag); vnode.dom = element; if (attrs != null) { setAttrs(vnode, attrs, ns); } insertDOM(parent, element, nextSibling); if (!maybeSetContentEditable(vnode)) { if (vnode.children != null) { var children = vnode.children; createNodes(element, children, 0, children.length, hooks, null, ns); if (vnode.tag === "select" && attrs != null) setLateSelectAttrs(vnode, attrs); } } } function initComponent(vnode, hooks) { var sentinel; if (typeof vnode.tag.view === "function") { vnode.state = Object.create(vnode.tag); sentinel = vnode.state.view; if (sentinel.$$reentrantLock$$ != null) return; sentinel.$$reentrantLock$$ = true; } else { vnode.state = undefined; sentinel = vnode.tag; if (sentinel.$$reentrantLock$$ != null) return; sentinel.$$reentrantLock$$ = true; vnode.state = vnode.tag.prototype != null && typeof vnode.tag.prototype.view === "function" ? new vnode.tag(vnode) : vnode.tag(vnode); } initLifecycle(vnode.state, vnode, hooks); if (vnode.attrs != null) initLifecycle(vnode.attrs, vnode, hooks); vnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode)); if (vnode.instance === vnode) throw Error("A view cannot return the vnode it received as argument"); sentinel.$$reentrantLock$$ = null; } function createComponent(parent, vnode, hooks, ns, nextSibling) { initComponent(vnode, hooks); if (vnode.instance != null) { createNode(parent, vnode.instance, hooks, ns, nextSibling); vnode.dom = vnode.instance.dom; vnode.domSize = vnode.instance.domSize; } else { vnode.domSize = 0; } } function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) { if (old === vnodes || old == null && vnodes == null) return; else if (old == null || old.length === 0) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns); else if (vnodes == null || vnodes.length === 0) removeNodes(parent, old, 0, old.length); else { var isOldKeyed = old[0] != null && old[0].key != null; var isKeyed = vnodes[0] != null && vnodes[0].key != null; var start = 0, oldStart = 0; if (!isOldKeyed) while (oldStart < old.length && old[oldStart] == null) oldStart++; if (!isKeyed) while (start < vnodes.length && vnodes[start] == null) start++; if (isOldKeyed !== isKeyed) { removeNodes(parent, old, oldStart, old.length); createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns); } else if (!isKeyed) { var commonLength = old.length < vnodes.length ? old.length : vnodes.length; start = start < oldStart ? start : oldStart; for (;start < commonLength; start++) { o = old[start]; v = vnodes[start]; if (o === v || o == null && v == null) continue; else if (o == null) createNode(parent, v, hooks, ns, getNextSibling(old, start + 1, nextSibling)); else if (v == null) removeNode(parent, o); else updateNode(parent, o, v, hooks, getNextSibling(old, start + 1, nextSibling), ns); } if (old.length > commonLength) removeNodes(parent, old, start, old.length); if (vnodes.length > commonLength) createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns); } else { var oldEnd = old.length - 1, end = vnodes.length - 1, map, o, v, oe, ve, topSibling; while (oldEnd >= oldStart && end >= start) { oe = old[oldEnd]; ve = vnodes[end]; if (oe.key !== ve.key) break; if (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns); if (ve.dom != null) nextSibling = ve.dom; oldEnd--, end--; } while (oldEnd >= oldStart && end >= start) { o = old[oldStart]; v = vnodes[start]; if (o.key !== v.key) break; oldStart++, start++; if (o !== v) updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), ns); } while (oldEnd >= oldStart && end >= start) { if (start === end) break; if (o.key !== ve.key || oe.key !== v.key) break; topSibling = getNextSibling(old, oldStart, nextSibling); moveDOM(parent, oe, topSibling); if (oe !== v) updateNode(parent, oe, v, hooks, topSibling, ns); if (++start <= --end) moveDOM(parent, o, nextSibling); if (o !== ve) updateNode(parent, o, ve, hooks, nextSibling, ns); if (ve.dom != null) nextSibling = ve.dom; oldStart++; oldEnd--; oe = old[oldEnd]; ve = vnodes[end]; o = old[oldStart]; v = vnodes[start]; } while (oldEnd >= oldStart && end >= start) { if (oe.key !== ve.key) break; if (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns); if (ve.dom != null) nextSibling = ve.dom; oldEnd--, end--; oe = old[oldEnd]; ve = vnodes[end]; } if (start > end) removeNodes(parent, old, oldStart, oldEnd + 1); else if (oldStart > oldEnd) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns); else { var originalNextSibling = nextSibling, vnodesLength = end - start + 1, oldIndices = new Array(vnodesLength), li = 0, i = 0, pos = 2147483647, matched = 0, map, lisIndices; for (i = 0;i < vnodesLength; i++) oldIndices[i] = -1; for (i = end;i >= start; i--) { if (map == null) map = getKeyMap(old, oldStart, oldEnd + 1); ve = vnodes[i]; var oldIndex = map[ve.key]; if (oldIndex != null) { pos = oldIndex < pos ? oldIndex : -1; oldIndices[i - start] = oldIndex; oe = old[oldIndex]; old[oldIndex] = null; if (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns); if (ve.dom != null) nextSibling = ve.dom; matched++; } } nextSibling = originalNextSibling; if (matched !== oldEnd - oldStart + 1) removeNodes(parent, old, oldStart, oldEnd + 1); if (matched === 0) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns); else { if (pos === -1) { lisIndices = makeLisIndices(oldIndices); li = lisIndices.length - 1; for (i = end;i >= start; i--) { v = vnodes[i]; if (oldIndices[i - start] === -1) createNode(parent, v, hooks, ns, nextSibling); else { if (lisIndices[li] === i - start) li--; else moveDOM(parent, v, nextSibling); } if (v.dom != null) nextSibling = vnodes[i].dom; } } else { for (i = end;i >= start; i--) { v = vnodes[i]; if (oldIndices[i - start] === -1) createNode(parent, v, hooks, ns, nextSibling); if (v.dom != null) nextSibling = vnodes[i].dom; } } } } } } } function updateNode(parent, old, vnode, hooks, nextSibling, ns) { var oldTag = old.tag, tag = vnode.tag; if (oldTag === tag && old.is === vnode.is) { vnode.state = old.state; vnode.events = old.events; if (shouldNotUpdate(vnode, old)) return; if (typeof oldTag === "string") { if (vnode.attrs != null) { updateLifecycle(vnode.attrs, vnode, hooks); } switch (oldTag) { case "#": updateText(old, vnode); break; case "<": updateHTML(parent, old, vnode, ns, nextSibling); break; case "[": updateFragment(parent, old, vnode, hooks, nextSibling, ns); break; default: updateElement(old, vnode, hooks, ns); } } else updateComponent(parent, old, vnode, hooks, nextSibling, ns); } else { removeNode(parent, old); createNode(parent, vnode, hooks, ns, nextSibling); } } function updateText(old, vnode) { if (old.children.toString() !== vnode.children.toString()) { old.dom.nodeValue = vnode.children; } vnode.dom = old.dom; } function updateHTML(parent, old, vnode, ns, nextSibling) { if (old.children !== vnode.children) { removeDOM(parent, old); createHTML(parent, vnode, ns, nextSibling); } else { vnode.dom = old.dom; vnode.domSize = old.domSize; } } function updateFragment(parent, old, vnode, hooks, nextSibling, ns) { updateNodes(parent, old.children, vnode.children, hooks, nextSibling, ns); var domSize = 0, children = vnode.children; vnode.dom = null; if (children != null) { for (var i = 0;i < children.length; i++) { var child = children[i]; if (child != null && child.dom != null) { if (vnode.dom == null) vnode.dom = child.dom; domSize += child.domSize || 1; } } } vnode.domSize = domSize; } function updateElement(old, vnode, hooks, ns) { var element = vnode.dom = old.dom; ns = getNameSpace(vnode) || ns; if (old.attrs != vnode.attrs || vnode.attrs != null && !cachedAttrsIsStaticMap.get(vnode.attrs)) { updateAttrs(vnode, old.attrs, vnode.attrs, ns); } if (!maybeSetContentEditable(vnode)) { updateNodes(element, old.children, vnode.children, hooks, null, ns); } } function updateComponent(parent, old, vnode, hooks, nextSibling, ns) { vnode.instance = Vnode.normalize(callHook.call(vnode.state.view, vnode)); if (vnode.instance === vnode) throw Error("A view cannot return the vnode it received as argument"); updateLifecycle(vnode.state, vnode, hooks); if (vnode.attrs != null) updateLifecycle(vnode.attrs, vnode, hooks); if (vnode.instance != null) { if (old.instance == null) createNode(parent, vnode.instance, hooks, ns, nextSibling); else updateNode(parent, old.instance, vnode.instance, hooks, nextSibling, ns); vnode.dom = vnode.instance.dom; vnode.domSize = vnode.instance.domSize; } else { if (old.instance != null) removeNode(parent, old.instance); vnode.domSize = 0; } } function getKeyMap(vnodes, start, end) { var map = Object.create(null); for (;start < end; start++) { var vnode = vnodes[start]; if (vnode != null) { var key = vnode.key; if (key != null) map[key] = start; } } return map; } var lisTemp = []; function makeLisIndices(a) { var result = [0]; var u = 0, v = 0, i = 0; var il = lisTemp.length = a.length; for (var i = 0;i < il; i++) lisTemp[i] = a[i]; for (var i = 0;i < il; ++i) { if (a[i] === -1) continue; var j = result[result.length - 1]; if (a[j] < a[i]) { lisTemp[i] = j; result.push(i); continue; } u = 0; v = result.length - 1; while (u < v) { var c = (u >>> 1) + (v >>> 1) + (u & v & 1); if (a[result[c]] < a[i]) { u = c + 1; } else { v = c; } } if (a[i] < a[result[u]]) { if (u > 0) lisTemp[i] = result[u - 1]; result[u] = i; } } u = result.length; v = result[u - 1]; while (u-- > 0) { result[u] = v; v = lisTemp[v]; } lisTemp.length = 0; return result; } function getNextSibling(vnodes, i, nextSibling) { for (;i < vnodes.length; i++) { if (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom; } return nextSibling; } function moveDOM(parent, vnode, nextSibling) { if (vnode.dom != null) { var target; if (vnode.domSize == null || vnode.domSize === 1) { target = vnode.dom; } else { target = getDocument(parent).createDocumentFragment(); for (var dom of domFor(vnode)) target.appendChild(dom); } insertDOM(parent, target, nextSibling); } } function insertDOM(parent, dom, nextSibling) { if (nextSibling != null) parent.insertBefore(dom, nextSibling); else parent.appendChild(dom); } function maybeSetContentEditable(vnode) { if (vnode.attrs == null || vnode.attrs.contenteditable == null && vnode.attrs.contentEditable == null) return false; var children = vnode.children; if (children != null && children.length === 1 && children[0].tag === "<") { var content = children[0].children; if (vnode.dom.innerHTML !== content) vnode.dom.innerHTML = content; } else if (children != null && children.length !== 0) throw new Error("Child node of a contenteditable must be trusted."); return true; } function removeNodes(parent, vnodes, start, end) { for (var i = start;i < end; i++) { var vnode = vnodes[i]; if (vnode != null) removeNode(parent, vnode); } } function tryBlockRemove(parent, vnode, source, counter) { var original = vnode.state; var result = callHook.call(source.onbeforeremove, vnode); if (result == null) return; var generation = currentRender; for (var dom of domFor(vnode)) delayedRemoval.set(dom, generation); counter.v++; Promise.resolve(result).finally(function() { checkState(vnode, original); tryResumeRemove(parent, vnode, counter); }); } function tryResumeRemove(parent, vnode, counter) { if (--counter.v === 0) { onremove(vnode); removeDOM(parent, vnode); } } function removeNode(parent, vnode) { var counter = { v: 1 }; if (typeof vnode.tag !== "string" && typeof vnode.state.onbeforeremove === "function") tryBlockRemove(parent, vnode, vnode.state, counter); if (vnode.attrs && typeof vnode.attrs.onbeforeremove === "function") tryBlockRemove(parent, vnode, vnode.attrs, counter); tryResumeRemove(parent, vnode, counter); } function removeDOM(parent, vnode) { if (vnode.dom == null) return; if (vnode.domSize == null || vnode.domSize === 1) { parent.removeChild(vnode.dom); } else { for (var dom of domFor(vnode)) parent.removeChild(dom); } } function onremove(vnode) { if (typeof vnode.tag !== "string" && typeof vnode.state.onremove === "function") callHook.call(vnode.state.onremove, vnode); if (vnode.attrs && typeof vnode.attrs.onremove === "function") callHook.call(vnode.attrs.onremove, vnode); if (typeof vnode.tag !== "string") { if (vnode.instance != null) onremove(vnode.instance); } else { if (vnode.events != null) vnode.events._ = null; var children = vnode.children; if (Array.isArray(children)) { for (var i = 0;i < children.length; i++) { var child = children[i]; if (child != null) onremove(child); } } } } function setAttrs(vnode, attrs, ns) { for (var key in attrs) { setAttr(vnode, key, null, attrs[key], ns); } } function setAttr(vnode, key, old, value, ns) { if (key === "key" || value == null || isLifecycleMethod(key) || old === value && !isFormAttribute(vnode, key) && typeof value !== "object") return; if (key[0] === "o" && key[1] === "n") return updateEvent(vnode, key, value); if (key.slice(0, 6) === "xlink:") vnode.dom.setAttributeNS("http://www.w3.org/1999/xlink", key.slice(6), value); else if (key === "style") updateStyle(vnode.dom, old, value); else if (hasPropertyKey(vnode, key, ns)) { if (key === "value") { if ((vnode.tag === "input" || vnode.tag === "textarea") && vnode.dom.value === "" + value) return; if (vnode.tag === "select" && old !== null && vnode.dom.value === "" + value) return; if (vnode.tag === "option" && old !== null && vnode.dom.value === "" + value) return; if (vnode.tag === "input" && vnode.attrs.type === "file" && "" + value !== "") { console.error("`value` is read-only on file inputs!"); return; } } if (vnode.tag === "input" && key === "type") vnode.dom.setAttribute(key, value); else vnode.dom[key] = value; } else { if (typeof value === "boolean") { if (value) vnode.dom.setAttribute(key, ""); else vnode.dom.removeAttribute(key); } else vnode.dom.setAttribute(key === "className" ? "class" : key, value); } } function removeAttr(vnode, key, old, ns) { if (key === "key" || old == null || isLifecycleMethod(key)) return; if (key[0] === "o" && key[1] === "n") updateEvent(vnode, key, undefined); else if (key === "style") updateStyle(vnode.dom, old, null); else if (hasPropertyKey(vnode, key, ns) && key !== "className" && key !== "title" && !(key === "value" && (vnode.tag === "option" || vnode.tag === "select" && vnode.dom.selectedIndex === -1 && vnode.dom === activeElement(vnode.dom))) && !(vnode.tag === "input" && key === "type")) { vnode.dom[key] = null; } else { var nsLastIndex = key.indexOf(":"); if (nsLastIndex !== -1) key = key.slice(nsLastIndex + 1); if (old !== false) vnode.dom.removeAttribute(key === "className" ? "class" : key); } } function setLateSelectAttrs(vnode, attrs) { if ("value" in attrs) { if (attrs.value === null) { if (vnode.dom.selectedIndex !== -1) vnode.dom.value = null; } else { var normalized = "" + attrs.value; if (vnode.dom.value !== normalized || vnode.dom.selectedIndex === -1) { vnode.dom.value = normalized; } } } if ("selectedIndex" in attrs) setAttr(vnode, "selectedIndex", null, attrs.selectedIndex, undefined); } function updateAttrs(vnode, old, attrs, ns) { var val; if (old != null) { if (old === attrs && !cachedAttrsIsStaticMap.has(attrs)) { console.warn("Don't reuse attrs object, use new object for every redraw, this will throw in next major"); } for (var key in old) { if ((val = old[key]) != null && (attrs == null || attrs[key] == null)) { removeAttr(vnode, key, val, ns); } } } if (attrs != null) { for (var key in attrs) { setAttr(vnode, key, old && old[key], attrs[key], ns); } } } function isFormAttribute(vnode, attr) { return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && (vnode.dom === activeElement(vnode.dom) || vnode.tag === "option" && vnode.dom.parentNode === activeElement(vnode.dom)); } function isLifecycleMethod(attr) { return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate"; } function hasPropertyKey(vnode, key, ns) { return ns === undefined && (vnode.tag.indexOf("-") > -1 || vnode.is || key !== "href" && key !== "list" && key !== "form" && key !== "width" && key !== "height") && key in vnode.dom; } function updateStyle(element, old, style) { if (old === style) {} else if (style == null) { element.style = ""; } else if (typeof style !== "object") { element.style = style; } else if (old == null || typeof old !== "object") { element.style = ""; for (var key in style) { var value = style[key]; if (value != null) { if (key.includes("-")) element.style.setProperty(key, String(value)); else element.style[key] = String(value); } } } else { for (var key in old) { if (old[key] != null && style[key] == null) { if (key.includes("-")) element.style.removeProperty(key); else element.style[key] = ""; } } for (var key in style) { var value = style[key]; if (value != null && (value = String(value)) !== String(old[key])) { if (key.includes("-")) element.style.setProperty(key, value); else element.style[key] = value; } } } } function EventDict() { this._ = currentRedraw; } EventDict.prototype = Object.create(null); EventDict.prototype.handleEvent = function(ev) { var handler = this["on" + ev.type]; var result; if (typeof handler === "function") result = handler.call(ev.currentTarget, ev); else if (typeof handler.handleEvent === "function") handler.handleEvent(ev); var self = this; if (self._ != null) { if (ev.redraw !== false) (0, self._)(); if (result != null && typeof result.then === "function") { Promise.resolve(result).then(function() { if (self._ != null && ev.redraw !== false) (0, self._)(); }); } } if (result === false) { ev.preventDefault(); ev.stopPropagation(); } }; function updateEvent(vnode, key, value) { if (vnode.events != null) { vnode.events._ = currentRedraw; if (vnode.events[key] === value) return; if (value != null && (typeof value === "function" || typeof value === "object")) { if (vnode.events[key] == null) vnode.dom.addEventListener(key.slice(2), vnode.events, false); vnode.events[key] = value; } else { if (vnode.events[key] != null) vnode.dom.removeEventListener(key.slice(2), vnode.events, false); vnode.events[key] = undefined; } } else if (value != null && (typeof value === "function" || typeof value === "object")) { vnode.events = new EventDict; vnode.dom.addEventListener(key.slice(2), vnode.events, false); vnode.events[key] = value; } } function initLifecycle(source, vnode, hooks) { if (typeof source.oninit === "function") callHook.call(source.oninit, vnode); if (typeof source.oncreate === "function") hooks.push(callHook.bind(source.oncreate, vnode)); } function updateLifecycle(source, vnode, hooks) { if (typeof source.onupdate === "function") hooks.push(callHook.bind(source.onupdate, vnode)); } function shouldNotUpdate(vnode, old) { do { if (vnode.attrs != null && typeof vnode.attrs.onbeforeupdate === "function") { var force = callHook.call(vnode.attrs.onbeforeupdate, vnode, old); if (force !== undefined && !force) break; } if (typeof vnode.tag !== "string" && typeof vnode.state.onbeforeupdate === "function") { var force = callHook.call(vnode.state.onbeforeupdate, vnode, old); if (force !== undefined && !force) break; } return false; } while (false); vnode.dom = old.dom; vnode.domSize = old.domSize; vnode.instance = old.instance; vnode.attrs = old.attrs; vnode.children = old.children; vnode.text = old.text; return true; } var currentDOM; return function(dom, vnodes, redraw) { if (!dom) throw new TypeError("DOM element being rendered to does not exist."); if (currentDOM != null && dom.contains(currentDOM)) { throw new TypeError("Node is currently being rendered to and thus is locked."); } var prevRedraw = currentRedraw; var prevDOM = currentDOM; var hooks = []; var active = activeElement(dom); var namespace = dom.namespaceURI; currentDOM = dom; currentRedraw = typeof redraw === "function" ? redraw : undefined; currentRender = {}; try { if (dom.vnodes == null) dom.textContent = ""; vnodes = Vnode.normalizeChildren(Array.isArray(vnodes) ? vnodes : [vnodes]); updateNodes(dom, dom.vnodes, vnodes, hooks, null, namespace === "http://www.w3.org/1999/xhtml" ? undefined : namespace); dom.vnodes = vnodes; if (active != null && activeElement(dom) !== active && typeof active.focus === "function") active.focus(); for (var i = 0;i < hooks.length; i++) hooks[i](); } finally { currentRedraw = prevRedraw; currentDOM = prevDOM; } }; }; }); // node_modules/mithril/render.js var require_render2 = __commonJS((exports, module) => { module.exports = require_render()(); }); // node_modules/mithril/api/mount-redraw.js var require_mount_redraw = __commonJS((exports, module) => { var Vnode = require_vnode(); module.exports = function(render, schedule, console2) { var subscriptions = []; var pending = false; var offset = -1; function sync() { for (offset = 0;offset < subscriptions.length; offset += 2) { try { render(subscriptions[offset], Vnode(subscriptions[offset + 1]), redraw); } catch (e) { console2.error(e); } } offset = -1; } function redraw() { if (!pending) { pending = true; schedule(function() { pending = false; sync(); }); } } redraw.sync = sync; function mount(root, component) { if (component != null && component.view == null && typeof component !== "function") { throw new TypeError("m.mount expects a component, not a vnode."); } var index = subscriptions.indexOf(root); if (index >= 0) { subscriptions.splice(index, 2); if (index <= offset) offset -= 2; render(root, []); } if (component != null) { subscriptions.push(root, component); render(root, Vnode(component), redraw); } } return { mount, redraw }; }; }); // node_modules/mithril/mount-redraw.js var require_mount_redraw2 = __commonJS((exports, module) => { var render = require_render2(); module.exports = require_mount_redraw()(render, typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : null, typeof console !== "undefined" ? console : null); }); // node_modules/mithril/querystring/build.js var require_build = __commonJS((exports, module) => { module.exports = function(object) { if (Object.prototype.toString.call(object) !== "[object Object]") return ""; var args = []; for (var key in object) { destructure(key, object[key]); } return args.join("&"); function destructure(key2, value) { if (Array.isArray(value)) { for (var i = 0;i < value.length; i++) { destructure(key2 + "[" + i + "]", value[i]); } } else if (Object.prototype.toString.call(value) === "[object Object]") { for (var i in value) { destructure(key2 + "[" + i + "]", value[i]); } } else args.push(encodeURIComponent(key2) + (value != null && value !== "" ? "=" + encodeURIComponent(value) : "")); } }; }); // node_modules/mithril/pathname/build.js var require_build2 = __commonJS((exports, module) => { var buildQueryString = require_build(); module.exports = function(template, params) { if (/:([^\/\.-]+)(\.{3})?:/.test(template)) { throw new SyntaxError("Template parameter names must be separated by either a '/', '-', or '.'."); } if (params == null) return template; var queryIndex = template.indexOf("?"); var hashIndex = template.indexOf("#"); var queryEnd = hashIndex < 0 ? template.length : hashIndex; var pathEnd = queryIndex < 0 ? queryEnd : queryIndex; var path = template.slice(0, pathEnd); var query = {}; Object.assign(query, params); var resolved = path.replace(/:([^\/\.-]+)(\.{3})?/g, function(m, key, variadic) { delete query[key]; if (params[key] == null) return m; return variadic ? params[key] : encodeURIComponent(String(params[key])); }); var newQueryIndex = resolved.indexOf("?"); var newHashIndex = resolved.indexOf("#"); var newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex; var newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex; var result = resolved.slice(0, newPathEnd); if (queryIndex >= 0) result += template.slice(queryIndex, queryEnd); if (newQueryIndex >= 0) result += (queryIndex < 0 ? "?" : "&") + resolved.slice(newQueryIndex, newQueryEnd); var querystring = buildQueryString(query); if (querystring) result += (queryIndex < 0 && newQueryIndex < 0 ? "?" : "&") + querystring; if (hashIndex >= 0) result += template.slice(hashIndex); if (newHashIndex >= 0) result += (hashIndex < 0 ? "" : "&") + resolved.slice(newHashIndex); return result; }; }); // node_modules/mithril/request/request.js var require_request = __commonJS((exports, module) => { var buildPathname = require_build2(); var hasOwn = require_hasOwn(); module.exports = function($window, oncompletion) { function PromiseProxy(executor) { return new Promise(executor); } function makeRequest(url, args) { return new Promise(function(resolve, reject) { url = buildPathname(url, args.params); var method = args.method != null ? args.method.toUpperCase() : "GET"; var body = args.body; var assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(body instanceof $window.FormData || body instanceof $window.URLSearchParams); var responseType = args.responseType || (typeof args.extract === "function" ? "" : "json"); var xhr = new $window.XMLHttpRequest, aborted = false, isTimeout = false; var original = xhr, replacedAbort; var abort = xhr.abort; xhr.abort = function() { aborted = true; abort.call(this); }; xhr.open(method, url, args.async !== false, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined); if (assumeJSON && body != null && !hasHeader(args, "content-type")) { xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8"); } if (typeof args.deserialize !== "function" && !hasHeader(args, "accept")) { xhr.setRequestHeader("Accept", "application/json, text/*"); } if (args.withCredentials) xhr.withCredentials = args.withCredentials; if (args.timeout) xhr.timeout = args.timeout; xhr.responseType = responseType; for (var key in args.headers) { if (hasOwn.call(args.headers, key)) { xhr.setRequestHeader(key, args.headers[key]); } } xhr.onreadystatechange = function(ev) { if (aborted) return; if (ev.target.readyState === 4) { try { var success = ev.target.status >= 200 && ev.target.status < 300 || ev.target.status === 304 || /^file:\/\//i.test(url); var response = ev.target.response, message; if (responseType === "json") { if (!ev.target.responseType && typeof args.extract !== "function") { try { response = JSON.parse(ev.target.responseText); } catch (e) { response = null; } } } else if (!responseType || responseType === "text") { if (response == null) response = ev.target.responseText; } if (typeof args.extract === "function") { response = args.extract(ev.target, args); success = true; } else if (typeof args.deserialize === "function") { response = args.deserialize(response); } if (success) { if (typeof args.type === "function") { if (Array.isArray(response)) { for (var i = 0;i < response.length; i++) { response[i] = new args.type(response[i]); } } else response = new args.type(response); } resolve(response); } else { var completeErrorResponse = function() { try { message = ev.target.responseText; } catch (e) { message = response; } var error = new Error(message); error.code = ev.target.status; error.response = response; reject(error); }; if (xhr.status === 0) { setTimeout(function() { if (isTimeout) return; completeErrorResponse(); }); } else completeErrorResponse(); } } catch (e) { reject(e); } } }; xhr.ontimeout = function(ev) { isTimeout = true; var error = new Error("Request timed out"); error.code = ev.target.status; reject(error); }; if (typeof args.config === "function") { xhr = args.config(xhr, args, url) || xhr; if (xhr !== original) { replacedAbort = xhr.abort; xhr.abort = function() { aborted = true; replacedAbort.call(this); }; } } if (body == null) xhr.send(); else if (typeof args.serialize === "function") xhr.send(args.serialize(body)); else if (body instanceof $window.FormData || body instanceof $window.URLSearchParams) xhr.send(body); else xhr.send(JSON.stringify(body)); }); } PromiseProxy.prototype = Promise.prototype; PromiseProxy.__proto__ = Promise; function hasHeader(args, name) { for (var key in args.headers) { if (hasOwn.call(args.headers, key) && key.toLowerCase() === name) return true; } return false; } return { request: function(url, args) { if (typeof url !== "string") { args = url; url = url.url; } else if (args == null) args = {}; var promise = makeRequest(url, args); if (args.background === true) return promise; var count = 0; function complete() { if (--count === 0 && typeof oncompletion === "function") oncompletion(); } return wrap(promise); function wrap(promise2) { var then = promise2.then; promise2.constructor = PromiseProxy; promise2.then = function() { count++; var next = then.apply(promise2, arguments); next.then(complete, function(e) { complete(); if (count === 0) throw e; }); return wrap(next); }; return promise2; } } }; }; }); // node_modules/mithril/request.js var require_request2 = __commonJS((exports, module) => { var mountRedraw = require_mount_redraw2(); module.exports = require_request()(typeof window !== "undefined" ? window : null, mountRedraw.redraw); }); // node_modules/mithril/util/decodeURIComponentSafe.js var require_decodeURIComponentSafe = __commonJS((exports, module) => { var validUtf8Encodings = /%(?:[0-7]|(?!c[01]|e0%[89]|ed%[ab]|f0%8|f4%[9ab])(?:c|d|(?:e|f[0-4]%[89ab])[\da-f]%[89ab])[\da-f]%[89ab])[\da-f]/gi; module.exports = function(str) { return String(str).replace(validUtf8Encodings, decodeURIComponent); }; }); // node_modules/mithril/querystring/parse.js var require_parse = __commonJS((exports, module) => { var decodeURIComponentSafe = require_decodeURIComponentSafe(); module.exports = function(string) { if (string === "" || string == null) return {}; if (string.charAt(0) === "?") string = string.slice(1); var entries = string.split("&"), counters = {}, data = {}; for (var i = 0;i < entries.length; i++) { var entry = entries[i].split("="); var key = decodeURIComponentSafe(entry[0]); var value = entry.length === 2 ? decodeURIComponentSafe(entry[1]) : ""; if (value === "true") value = true; else if (value === "false") value = false; var levels = key.split(/\]\[?|\[/); var cursor = data; if (key.indexOf("[") > -1) levels.pop(); for (var j = 0;j < levels.length; j++) { var level = levels[j], nextLevel = levels[j + 1]; var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10)); if (level === "") { var key = levels.slice(0, j).join(); if (counters[key] == null) { counters[key] = Array.isArray(cursor) ? cursor.length : 0; } level = counters[key]++; } else if (level === "__proto__") break; if (j === levels.length - 1) cursor[level] = value; else { var desc = Object.getOwnPropertyDescriptor(cursor, level); if (desc != null) desc = desc.value; if (desc == null) cursor[level] = desc = isNumber ? [] : {}; cursor = desc; } } } return data; }; }); // node_modules/mithril/pathname/parse.js var require_parse2 = __commonJS((exports, module) => { var parseQueryString = require_parse(); module.exports = function(url) { var queryIndex = url.indexOf("?"); var hashIndex = url.indexOf("#"); var queryEnd = hashIndex < 0 ? url.length : hashIndex; var pathEnd = queryIndex < 0 ? queryEnd : queryIndex; var path = url.slice(0, pathEnd).replace(/\/{2,}/g, "/"); if (!path) path = "/"; else { if (path[0] !== "/") path = "/" + path; } return { path, params: queryIndex < 0 ? {} : parseQueryString(url.slice(queryIndex + 1, queryEnd)) }; }; }); // node_modules/mithril/pathname/compileTemplate.js var require_compileTemplate = __commonJS((exports, module) => { var parsePathname = require_parse2(); module.exports = function(template) { var templateData = parsePathname(template); var templateKeys = Object.keys(templateData.params); var keys = []; var regexp = new RegExp("^" + templateData.path.replace(/:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g, function(m, key, extra) { if (key == null) return "\\" + m; keys.push({ k: key, r: extra === "..." }); if (extra === "...") return "(.*)"; if (extra === ".") return "([^/]+)\\."; return "([^/]+)" + (extra || ""); }) + "\\/?$"); return function(data) { for (var i = 0;i < templateKeys.length; i++) { if (templateData.params[templateKeys[i]] !== data.params[templateKeys[i]]) return false; } if (!keys.length) return regexp.test(data.path); var values = regexp.exec(data.path); if (values == null) return false; for (var i = 0;i < keys.length; i++) { data.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1]); } return true; }; }; }); // node_modules/mithril/util/censor.js var require_censor = __commonJS((exports, module) => { var hasOwn = require_hasOwn(); var magic = /^(?:key|oninit|oncreate|onbeforeupdate|onupdate|onbeforeremove|onremove)$/; module.exports = function(attrs, extras) { var result = {}; if (extras != null) { for (var key in attrs) { if (hasOwn.call(attrs, key) && !magic.test(key) && extras.indexOf(key) < 0) { result[key] = attrs[key]; } } } else { for (var key in attrs) { if (hasOwn.call(attrs, key) && !magic.test(key)) { result[key] = attrs[key]; } } } return result; }; }); // node_modules/mithril/api/router.js var require_router = __commonJS((exports, module) => { var Vnode = require_vnode(); var hyperscript = require_hyperscript(); var decodeURIComponentSafe = require_decodeURIComponentSafe(); var buildPathname = require_build2(); var parsePathname = require_parse2(); var compileTemplate = require_compileTemplate(); var censor = require_censor(); module.exports = function($window, mountRedraw) { var p = Promise.resolve(); var scheduled = false; var ready = false; var hasBeenResolved = false; var dom, compiled, fallbackRoute; var currentResolver, component, attrs, currentPath, lastUpdate; var RouterRoot = { onremove: function() { ready = hasBeenResolved = false; $window.removeEventListener("popstate", fireAsync, false); }, view: function() { var vnode = Vnode(component, attrs.key, attrs); if (currentResolver) return currentResolver.render(vnode); return [vnode]; } }; var SKIP = route.SKIP = {}; function resolveRoute() { scheduled = false; var prefix = $window.location.hash; if (route.prefix[0] !== "#") { prefix = $window.location.search + prefix; if (route.prefix[0] !== "?") { prefix = $window.location.pathname + prefix; if (prefix[0] !== "/") prefix = "/" + prefix; } } var path = decodeURIComponentSafe(prefix).slice(route.prefix.length); var data = parsePathname(path); Object.assign(data.params, $window.history.state); function reject(e) { console.error(e); route.set(fallbackRoute, null, { replace: true }); } loop(0); function loop(i) { for (;i < compiled.length; i++) { if (compiled[i].check(data)) { var payload = compiled[i].component; var matchedRoute = compiled[i].route; var localComp = payload; var update = lastUpdate = function(comp) { if (update !== lastUpdate) return; if (comp === SKIP) return loop(i + 1); component = comp != null && (typeof comp.view === "function" || typeof comp === "function") ? comp : "div"; attrs = data.params, currentPath = path, lastUpdate = null; currentResolver = payload.render ? payload : null; if (hasBeenResolved) mountRedraw.redraw(); else { hasBeenResolved = true; mountRedraw.mount(dom, RouterRoot); } }; if (payload.view || typeof payload === "function") { payload = {}; update(localComp); } else if (payload.onmatch) { p.then(function() { return payload.onmatch(data.params, path, matchedRoute); }).then(update, path === fallbackRoute ? null : reject); } else update(); return; } } if (path === fallbackRoute) { throw new Error("Could not resolve default route " + fallbackRoute + "."); } route.set(fallbackRoute, null, { replace: true }); } } function fireAsync() { if (!scheduled) { scheduled = true; setTimeout(resolveRoute); } } function route(root, defaultRoute, routes) { if (!root) throw new TypeError("DOM element being rendered to does not exist."); compiled = Object.keys(routes).map(function(route2) { if (route2[0] !== "/") throw new SyntaxError("Routes must start with a '/'."); if (/:([^\/\.-]+)(\.{3})?:/.test(route2)) { throw new SyntaxError("Route parameter names must be separated with either '/', '.', or '-'."); } return { route: route2, component: routes[route2], check: compileTemplate(route2) }; }); fallbackRoute = defaultRoute; if (defaultRoute != null) { var defaultData = parsePathname(defaultRoute); if (!compiled.some(function(i) { return i.check(defaultData); })) { throw new ReferenceError("Default route doesn't match any known routes."); } } dom = root; $window.addEventListener("popstate", fireAsync, false); ready = true; resolveRoute(); } route.set = function(path, data, options) { if (lastUpdate != null) { options = options || {}; options.replace = true; } lastUpdate = null; path = buildPathname(path, data); if (ready) { fireAsync(); var state = options ? options.state : null; var title = options ? options.title : null; if (options && options.replace) $window.history.replaceState(state, title, route.prefix + path); else $window.history.pushState(state, title, route.prefix + path); } else { $window.location.href = route.prefix + path; } }; route.get = function() { return currentPath; }; route.prefix = "#!"; route.Link = { view: function(vnode) { var child = hyperscript(vnode.attrs.selector || "a", censor(vnode.attrs, ["options", "params", "selector", "onclick"]), vnode.children); var options, onclick, href; if (child.attrs.disabled = Boolean(child.attrs.disabled)) { child.attrs.href = null; child.attrs["aria-disabled"] = "true"; } else { options = vnode.attrs.options; onclick = vnode.attrs.onclick; href = buildPathname(child.attrs.href, vnode.attrs.params); child.attrs.href = route.prefix + href; child.attrs.onclick = function(e) { var result; if (typeof onclick === "function") { result = onclick.call(e.currentTarget, e); } else if (onclick == null || typeof onclick !== "object") {} else if (typeof onclick.handleEvent === "function") { onclick.handleEvent(e); } if (result !== false && !e.defaultPrevented && (e.button === 0 || e.which === 0 || e.which === 1) && (!e.currentTarget.target || e.currentTarget.target === "_self") && !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey) { e.preventDefault(); e.redraw = false; route.set(href, null, options); } }; } return child; } }; route.param = function(key) { return attrs && key != null ? attrs[key] : attrs; }; return route; }; }); // node_modules/mithril/route.js var require_route = __commonJS((exports, module) => { var mountRedraw = require_mount_redraw2(); module.exports = require_router()(typeof window !== "undefined" ? window : null, mountRedraw); }); // node_modules/mithril/index.js var require_mithril = __commonJS((exports, module) => { var hyperscript = require_hyperscript2(); var mountRedraw = require_mount_redraw2(); var request = require_request2(); var router = require_route(); var m = function m2() { return hyperscript.apply(this, arguments); }; m.m = hyperscript; m.trust = hyperscript.trust; m.fragment = hyperscript.fragment; m.Fragment = "["; m.mount = mountRedraw.mount; m.route = router; m.render = require_render2(); m.redraw = mountRedraw.redraw; m.request = request.request; m.parseQueryString = require_parse(); m.buildQueryString = require_build(); m.parsePathname = require_parse2(); m.buildPathname = require_build2(); m.vnode = require_vnode(); m.censor = require_censor(); m.domFor = require_domFor(); module.exports = m; }); // src/browser.ts var import_mithril = __toESM(require_mithril(), 1); // src/index.ts var exports_src = {}; __export(exports_src, { unpackPixels: () => unpackPixels, pad32: () => pad32, packedSize: () => packedSize, packPixels: () => packPixels, loadBinFile: () => loadBinFile, isCustomFont: () => isCustomFont, customFontOrdinal: () => customFontOrdinal, buildBinBuffer: () => buildBinBuffer, StringToSectionType: () => StringToSectionType, StringToElementType: () => StringToElementType, SectionTypeToString: () => SectionTypeToString, SectionType: () => SectionType, MonoDisplayRenderer: () => MonoDisplayRenderer, MonoDisplayParser: () => MonoDisplayParser, MonoDisplayFile: () => MonoDisplayFile, MonoDisplayDriver: () => MonoDisplayDriver, MONOFORMAT_MAGIC_HEADER: () => MONOFORMAT_MAGIC_HEADER, FileVersion: () => FileVersion, ElementTypeToString: () => ElementTypeToString, ElementType: () => ElementType, CUSTOM_FONT_BASE: () => CUSTOM_FONT_BASE, BinaryReader: () => BinaryReader }); // src/types.ts var FileVersion; ((FileVersion2) => { FileVersion2[FileVersion2["Illegal"] = 0] = "Illegal"; FileVersion2[FileVersion2["V1"] = 1] = "V1"; })(FileVersion ||= {}); var SectionType; ((SectionType2) => { SectionType2[SectionType2["ElementsAlways"] = 1] = "ElementsAlways"; SectionType2[SectionType2["ElementsTimespan"] = 2] = "ElementsTimespan"; SectionType2[SectionType2["CustomFont"] = 32] = "CustomFont"; })(SectionType ||= {}); var SectionTypeToString = Object.fromEntries(Object.keys(SectionType).filter((k) => isNaN(Number(k))).map((k) => [SectionType[k], k])); var StringToSectionType = Object.fromEntries(Object.keys(SectionType).filter((k) => isNaN(Number(k))).map((k) => [k, SectionType[k]])); var ElementType; ((ElementType2) => { ElementType2[ElementType2["Image2D"] = 1] = "Image2D"; ElementType2[ElementType2["Animation"] = 2] = "Animation"; ElementType2[ElementType2["HorizontalScroll"] = 3] = "HorizontalScroll"; ElementType2[ElementType2["VerticalScroll"] = 4] = "VerticalScroll"; ElementType2[ElementType2["Line"] = 5] = "Line"; ElementType2[ElementType2["ClippedText"] = 16] = "ClippedText"; ElementType2[ElementType2["HScrollText"] = 17] = "HScrollText"; ElementType2[ElementType2["VScrollText"] = 18] = "VScrollText"; ElementType2[ElementType2["CurrentTime"] = 32] = "CurrentTime"; })(ElementType ||= {}); var ElementTypeToString = Object.fromEntries(Object.keys(ElementType).filter((k) => isNaN(Number(k))).map((k) => [ElementType[k], k])); var StringToElementType = Object.fromEntries(Object.keys(ElementType).filter((k) => isNaN(Number(k))).map((k) => [k, ElementType[k]])); var CUSTOM_FONT_BASE = 32768; function isCustomFont(fontIndex) { return fontIndex >= CUSTOM_FONT_BASE; } function customFontOrdinal(fontIndex) { return fontIndex - CUSTOM_FONT_BASE; } // src/helper.ts function packPixels(pixels, width, height) { const total = width * height; const packed = new Uint8Array(total + 7 >> 3); for (let i = 0;i < total; i++) { if (pixels[i]) packed[i >> 3] = (packed[i >> 3] ?? 0) | 1 << (i & 7); } return packed; } function unpackPixels(packed, width, height) { const total = width * height; const pixels = new Uint8Array(total); for (let i = 0;i < total; i++) { pixels[i] = (packed[i >> 3] ?? 0) >> (i & 7) & 1; } return pixels; } function packedSize(width, height) { return width * height + 7 >> 3; } function pad32(byteCount) { return 4 - (byteCount & 3) & 3; } class BinaryReader { view; pos = 0; constructor(buffer) { this.view = buffer instanceof ArrayBuffer ? new DataView(buffer) : new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength); } get offset() { return this.pos; } get byteLength() { return this.view.byteLength; } get remaining() { return this.view.byteLength - this.pos; } readByte() { this.#need(1); return this.view.getUint8(this.pos++); } readUint16() { this.#need(2); const v = this.view.getUint16(this.pos, true); this.pos += 2; return v; } readShort() { return this.readUint16(); } readInt16() { this.#need(2); const v = this.view.getInt16(this.pos, true); this.pos += 2; return v; } readUint24() { this.#need(3); const v = this.view.getUint8(this.pos) | this.view.getUint8(this.pos + 1) << 8 | this.view.getUint8(this.pos + 2) << 16; this.pos += 3; return v; } readUint32() { this.#need(4); const v = this.view.getUint32(this.pos, true); this.pos += 4; return v; } readUint64() { this.#need(8); const lo = BigInt(this.view.getUint32(this.pos, true)); const hi = BigInt(this.view.getUint32(this.pos + 4, true)); this.pos += 8; return hi << 32n | lo; } readBytes(n) { this.#need(n); const s = new Uint8Array(this.view.buffer, this.pos, n); this.pos += n; return s; } readUtf8(n) { return new TextDecoder().decode(this.readBytes(n)); } seek(pos) { if (pos < 0 || pos > this.view.byteLength) { throw new RangeError(`seek(${pos}) out of [0, ${this.view.byteLength}]`); } this.pos = pos; } #need(n) { if (this.remaining < n) throw new RangeError(`BinaryReader: need ${n} byte(s) at offset ${this.pos}, ${this.remaining} remain`); } } // src/parser.ts var MONOFORMAT_MAGIC_HEADER = 1663794863; class MonoDisplayParser { parse(buffer) { const r = new BinaryReader(buffer); const magic = r.readUint32(); if (magic !== MONOFORMAT_MAGIC_HEADER) throw new Error(`Bad magic 0x${magic.toString(16)} - expected 0x632B7EAF`); const version = r.readUint32(); if (version === 0 || version > 1) throw new Error(`Unsupported version ${version}`); const numSections = r.readUint16(); r.readUint16(); const sections = []; for (let i = 0;i < numSections; i++) { const sectionType = r.readByte(); const sectionSize = r.readUint24(); const sectionStart = r.offset; const dataSize = sectionSize - 4; const sectionEnd = sectionStart + dataSize; switch (sectionType) { case 1 /* ElementsAlways */: sections.push(this.#parseElementsSection(r, 1 /* ElementsAlways */, false, sectionEnd)); break; case 2 /* ElementsTimespan */: sections.push(this.#parseElementsSection(r, 2 /* ElementsTimespan */, true, sectionEnd)); break; case 32 /* CustomFont */: sections.push(this.#parseCustomFont(r, dataSize)); break; default: break; } r.seek(sectionStart + dataSize); } return { sections }; } #parseFlags(raw) { return { drawFront: !!(raw & 1), drawBack: !!(raw & 2), clearBuffer: !!(raw & 4) }; } #parseElementsSection(r, type, hasTimestamp, sectionEnd) { const flags = this.#parseFlags(r.readUint16()); const numElements = r.readUint16(); let startTimestamp = 0n, endTimestamp = 0n; if (hasTimestamp) { startTimestamp = r.readUint64(); endTimestamp = r.readUint64(); } const elements = []; for (let i = 0;i < numElements; i++) { if (r.offset + 2 > sectionEnd) break; const el = this.#parseElement(r); if (el === null) break; elements.push(el); } if (hasTimestamp) { return { sectionType: 2 /* ElementsTimespan */, flags, startTimestamp, endTimestamp, elements }; } return { sectionType: 1 /* ElementsAlways */, flags, elements }; } #parseCustomFont(r, dataSize) { const actualSize = r.readUint24(); r.readByte(); const fontData = new Uint8Array(r.readBytes(Math.min(actualSize, dataSize - 4))); return { sectionType: 32 /* CustomFont */, fontData }; } #parseElement(r) { const elementStart = r.offset; const type = r.readUint16(); switch (type) { case 1 /* Image2D */: return this.#parseImage2D(r, elementStart); case 2 /* Animation */: return this.#parseAnimation(r, elementStart); case 3 /* HorizontalScroll */: return this.#parseHScroll(r, elementStart); case 4 /* VerticalScroll */: return this.#parseVScroll(r, elementStart); case 5 /* Line */: return this.#parseLine(r); case 16 /* ClippedText */: return this.#parseClippedText(r, elementStart); case 17 /* HScrollText */: return this.#parseHScrollText(r, elementStart); case 32 /* CurrentTime */: return this.#parseCurrentTime(r); default: return null; } } #alignTo4(start, current) { const end = start + (current - start + 3 & ~3); } #parseImage2D(r, start) { const xOffset = r.readUint16(); const yOffset = r.readUint16(); const width = r.readUint16(); const height = r.readUint16(); r.readUint16(); const packed = r.readBytes(packedSize(width, height)); const pixels = unpackPixels(new Uint8Array(packed), width, height); const dataRead = 12 + packed.byteLength; r.seek(start + dataRead + pad32(dataRead)); return { type: 1 /* Image2D */, xOffset, yOffset, image: { pixels, width, height } }; } #parseAnimation(r, start) { const xOffset = r.readUint16(); const yOffset = r.readUint16(); const width = r.readUint16(); const height = r.readUint16(); const numFrames = r.readUint16(); const updateInterval = r.readUint16(); r.readUint16(); const frameBytes = packedSize(width, height); const frames = []; for (let f = 0;f < numFrames; f++) { const packed = r.readBytes(frameBytes); frames.push({ pixels: unpackPixels(new Uint8Array(packed), width, height), width, height }); } const dataRead = 16 + numFrames * frameBytes; r.seek(start + dataRead + pad32(dataRead)); return { type: 2 /* Animation */, xOffset, yOffset, width, height, updateInterval, frames }; } #parseScrollFlags(raw) { return { endless: !!(raw & 1), invertDirection: !!(raw & 2), padStart: !!(raw & 4), padEnd: !!(raw & 8) }; } #parseHScroll(r, start) { const xOffset = r.readUint16(); const yOffset = r.readUint16(); const width = r.readUint16(); const height = r.readUint16(); const contentWidth = r.readUint16(); const flagsByte = r.readByte(); const scrollSpeed = r.readByte(); r.readUint16(); const packed = r.readBytes(packedSize(contentWidth, height)); const pixels = unpackPixels(new Uint8Array(packed), contentWidth, height); const dataRead = 16 + packed.byteLength; r.seek(start + dataRead + pad32(dataRead)); return { type: 3 /* HorizontalScroll */, xOffset, yOffset, width, height, contentWidth, scrollSpeed, flags: this.#parseScrollFlags(flagsByte), content: { pixels, width: contentWidth, height } }; } #parseVScroll(r, start) { const xOffset = r.readUint16(); const yOffset = r.readUint16(); const width = r.readUint16(); const height = r.readUint16(); const contentHeight = r.readUint16(); const flagsByte = r.readByte(); const scrollSpeed = r.readByte(); r.readUint16(); const packed = r.readBytes(packedSize(width, contentHeight)); const pixels = unpackPixels(new Uint8Array(packed), width, contentHeight); const dataRead = 16 + packed.byteLength; r.seek(start + dataRead + pad32(dataRead)); return { type: 4 /* VerticalScroll */, xOffset, yOffset, width, height, contentHeight, scrollSpeed, flags: this.#parseScrollFlags(flagsByte), content: { pixels, width, height: contentHeight } }; } #parseLine(r) { const xOrigin = r.readUint16(); const yOrigin = r.readUint16(); const xTarget = r.readUint16(); const yTarget = r.readUint16(); const lineStyle = r.readByte(); const flagsByte = r.readByte(); return { type: 5 /* Line */, xOrigin, yOrigin, xTarget, yTarget, lineStyle, invertPixels: !!(flagsByte & 1) }; } #parseClippedText(r, start) { const xOffset = r.readUint16(); const yOffset = r.readUint16(); const width = r.readUint16(); const height = r.readUint16(); const fontIndex = r.readUint16(); const textLen = r.readUint16(); const text = r.readUtf8(textLen); const dataRead = 14 + textLen; r.seek(start + dataRead + pad32(dataRead)); return { type: 16 /* ClippedText */, xOffset, yOffset, width, height, fontIndex, text }; } #parseCurrentTime(r) { const xOffset = r.readUint16(); const yOffset = r.readUint16(); const width = r.readUint16(); const height = r.readUint16(); const fontIndex = r.readUint16(); const utcOffsetMinutes = r.readInt16(); const flagsByte = r.readByte(); r.readByte(); return { type: 32 /* CurrentTime */, xOffset, yOffset, width, height, fontIndex, utcOffsetMinutes, flags: { clock12h: !!(flagsByte & 1), showHours: !!(flagsByte & 2), showMinutes: !!(flagsByte & 4), showSeconds: !!(flagsByte & 8) } }; } #parseHScrollText(r, start) { const xOffset = r.readUint16(); const yOffset = r.readUint16(); const width = r.readUint16(); const height = r.readUint16(); const flagsByte = r.readByte(); const scrollSpeed = r.readByte(); const fontIndex = r.readUint16(); const textLen = r.readUint16(); const text = r.readUtf8(textLen); const dataRead = 16 + textLen; r.seek(start + dataRead + pad32(dataRead)); return { type: 17 /* HScrollText */, xOffset, yOffset, width, height, scrollSpeed, fontIndex, flags: this.#parseScrollFlags(flagsByte), text }; } } // src/font/fonts/u8g2_font_5x7_mf_u8g2font.ts var u8g2_font_5x7_mf_u8g2font = [191, 2, 3, 2, 3, 3, 1, 1, 4, 5, 7, 0, 255, 6, 255, 6, 0, 1, 42, 2, 114, 7, 90, 32, 5, 125, 125, 30, 33, 8, 125, 173, 176, 29, 202, 1, 34, 9, 125, 157, 82, 18, 37, 57, 3, 35, 11, 125, 237, 36, 25, 148, 202, 160, 148, 1, 36, 9, 125, 237, 165, 182, 37, 201, 12, 37, 9, 125, 141, 48, 202, 154, 194, 24, 38, 10, 125, 237, 44, 201, 42, 89, 18, 3, 39, 7, 125, 173, 176, 206, 2, 40, 8, 125, 173, 44, 108, 205, 1, 41, 9, 125, 157, 52, 108, 203, 17, 0, 42, 9, 125, 237, 36, 203, 182, 74, 12, 43, 9, 125, 253, 48, 26, 164, 48, 7, 44, 7, 125, 125, 22, 173, 6, 45, 8, 125, 125, 202, 144, 147, 0, 46, 7, 125, 125, 186, 166, 3, 47, 7, 125, 125, 36, 107, 39, 48, 12, 125, 173, 44, 137, 146, 40, 137, 146, 44, 7, 49, 8, 125, 173, 76, 108, 155, 1, 50, 9, 125, 29, 169, 152, 213, 134, 24, 51, 11, 125, 141, 33, 140, 212, 36, 138, 116, 0, 52, 11, 125, 173, 76, 74, 162, 33, 11, 115, 0, 53, 11, 125, 141, 33, 9, 215, 36, 138, 116, 0, 54, 10, 125, 29, 41, 156, 42, 81, 164, 3, 55, 11, 125, 141, 33, 204, 194, 44, 204, 17, 0, 56, 10, 125, 29, 169, 36, 85, 162, 72, 7, 57, 10, 125, 29, 169, 18, 69, 99, 164, 3, 58, 8, 125, 109, 77, 71, 52, 29, 59, 9, 125, 109, 77, 71, 180, 34, 0, 60, 8, 125, 125, 36, 171, 150, 1, 61, 9, 125, 125, 108, 136, 135, 28, 4, 62, 8, 125, 237, 180, 86, 71, 0, 63, 10, 125, 173, 44, 9, 179, 28, 202, 1, 64, 11, 125, 29, 169, 146, 40, 137, 146, 234, 0, 65, 12, 125, 29, 169, 18, 37, 67, 18, 37, 81, 12, 66, 10, 125, 141, 169, 50, 85, 162, 100, 7, 67, 9, 125, 29, 169, 18, 150, 34, 29, 68, 12, 125, 141, 169, 18, 37, 81, 18, 37, 59, 0, 69, 11, 125, 141, 33, 9, 167, 48, 28, 98, 0, 70, 10, 125, 141, 33, 9, 167, 176, 14, 1, 71, 11, 125, 29, 169, 18, 38, 74, 20, 205, 0, 72, 14, 125, 141, 40, 137, 146, 33, 137, 146, 40, 137, 98, 0, 73, 8, 125, 157, 45, 108, 155, 1, 74, 9, 125, 189, 176, 37, 138, 116, 0, 75, 11, 125, 141, 40, 41, 105, 90, 18, 149, 1, 76, 8, 125, 141, 176, 227, 16, 3, 77, 14, 125, 141, 40, 25, 146, 33, 137, 146, 40, 137, 98, 0, 78, 13, 125, 141, 40, 81, 18, 165, 162, 36, 74, 20, 3, 79, 12, 125, 29, 169, 18, 37, 81, 18, 69, 58, 0, 80, 11, 125, 141, 169, 18, 37, 83, 152, 67, 0, 81, 12, 125, 29, 169, 18, 37, 81, 162, 68, 106, 2, 82, 11, 125, 141, 169, 18, 37, 83, 18, 149, 1, 83, 9, 125, 29, 169, 53, 42, 233, 0, 84, 7, 125, 157, 45, 236, 14, 85, 13, 125, 141, 40, 137, 146, 40, 137, 146, 40, 210, 1, 86, 12, 125, 141, 40, 137, 146, 40, 137, 34, 77, 7, 87, 14, 125, 141, 40, 137, 146, 40, 25, 146, 33, 137, 98, 0, 88, 12, 125, 141, 40, 137, 34, 77, 170, 68, 49, 0, 89, 10, 125, 157, 82, 18, 37, 89, 88, 7, 90, 9, 125, 141, 33, 204, 26, 135, 24, 91, 8, 125, 157, 41, 108, 156, 1, 92, 7, 125, 221, 238, 32, 0, 93, 7, 125, 157, 177, 211, 12, 94, 8, 125, 173, 44, 201, 89, 1, 95, 7, 125, 125, 198, 33, 6, 96, 7, 125, 157, 52, 103, 6, 97, 11, 125, 125, 112, 137, 146, 68, 74, 98, 0, 98, 10, 125, 141, 48, 156, 42, 81, 178, 3, 99, 8, 125, 125, 80, 10, 83, 29, 100, 11, 125, 189, 48, 90, 162, 36, 138, 102, 0, 101, 9, 125, 125, 80, 74, 140, 58, 0, 102, 11, 125, 173, 44, 137, 178, 45, 204, 17, 0, 103, 10, 125, 125, 112, 137, 34, 41, 93, 0, 104, 11, 125, 141, 48, 156, 42, 81, 18, 197, 0, 105, 9, 125, 173, 28, 17, 107, 51, 0, 106, 10, 125, 189, 28, 10, 75, 73, 22, 1, 107, 10, 125, 141, 176, 18, 105, 73, 84, 6, 108, 7, 125, 29, 177, 219, 12, 109, 11, 125, 125, 44, 137, 134, 36, 74, 162, 24, 110, 10, 125, 125, 108, 170, 68, 73, 20, 3, 111, 9, 125, 125, 80, 170, 68, 145, 14, 112, 10, 125, 125, 108, 170, 68, 201, 20, 2, 113, 11, 125, 125, 112, 137, 146, 40, 26, 19, 0, 114, 9, 125, 125, 108, 170, 132, 57, 4, 115, 8, 125, 125, 112, 81, 149, 29, 116, 9, 125, 157, 48, 219, 194, 84, 6, 117, 11, 125, 125, 44, 74, 162, 36, 138, 102, 0, 118, 11, 125, 125, 48, 137, 146, 40, 201, 114, 0, 119, 11, 125, 125, 44, 74, 162, 100, 72, 134, 24, 120, 9, 125, 125, 44, 138, 52, 169, 12, 121, 10, 125, 125, 44, 74, 162, 74, 86, 3, 122, 9, 125, 125, 108, 200, 106, 67, 12, 123, 8, 125, 189, 154, 88, 141, 1, 124, 7, 125, 173, 176, 119, 0, 125, 10, 125, 157, 52, 212, 194, 44, 71, 0, 126, 7, 125, 157, 238, 204, 0, 160, 5, 125, 125, 30, 161, 8, 125, 173, 28, 10, 219, 1, 162, 10, 125, 253, 108, 41, 37, 217, 22, 1, 163, 9, 125, 125, 41, 219, 42, 50, 0, 164, 11, 125, 221, 44, 153, 146, 104, 201, 82, 0, 165, 10, 125, 157, 82, 146, 101, 91, 152, 3, 166, 8, 125, 253, 48, 135, 194, 28, 167, 11, 125, 45, 41, 212, 146, 76, 140, 36, 0, 168, 7, 125, 157, 58, 55, 0, 169, 12, 125, 157, 37, 83, 146, 73, 73, 180, 100, 1, 170, 9, 125, 29, 41, 201, 116, 22, 0, 171, 9, 125, 125, 48, 146, 218, 49, 0, 172, 9, 125, 125, 202, 16, 230, 32, 0, 173, 7, 125, 125, 210, 78, 2, 174, 11, 125, 157, 37, 27, 146, 105, 210, 146, 5, 175, 7, 125, 141, 33, 231, 6, 176, 9, 125, 173, 44, 201, 114, 22, 0, 177, 11, 125, 173, 48, 26, 164, 48, 26, 84, 0, 178, 9, 125, 29, 49, 11, 117, 26, 0, 179, 9, 125, 29, 77, 204, 116, 26, 0, 180, 7, 125, 173, 44, 231, 0, 181, 11, 125, 125, 44, 74, 162, 36, 74, 166, 16, 182, 13, 125, 157, 69, 73, 148, 40, 137, 146, 40, 137, 1, 183, 8, 125, 125, 80, 211, 105, 0, 184, 7, 125, 125, 230, 44, 3, 185, 9, 125, 173, 76, 204, 118, 18, 0, 186, 9, 125, 157, 44, 201, 114, 38, 0, 187, 9, 125, 125, 44, 42, 73, 57, 8, 188, 9, 125, 141, 176, 41, 147, 198, 4, 189, 9, 125, 141, 176, 69, 204, 66, 5, 190, 11, 125, 13, 77, 204, 148, 76, 26, 19, 0, 191, 10, 125, 173, 28, 202, 194, 36, 203, 1, 192, 12, 125, 29, 169, 18, 37, 67, 18, 37, 81, 12, 193, 12, 125, 29, 169, 18, 37, 67, 18, 37, 81, 12, 194, 12, 125, 29, 169, 18, 37, 67, 18, 37, 81, 12, 195, 12, 125, 29, 169, 18, 37, 67, 18, 37, 81, 12, 196, 12, 125, 141, 40, 146, 42, 67, 18, 37, 81, 12, 197, 12, 125, 29, 77, 170, 12, 73, 148, 68, 49, 0, 198, 12, 125, 157, 165, 148, 40, 83, 18, 37, 50, 0, 199, 10, 125, 29, 169, 18, 150, 34, 45, 3, 200, 11, 125, 141, 33, 9, 167, 48, 28, 98, 0, 201, 11, 125, 141, 33, 9, 167, 48, 28, 98, 0, 202, 11, 125, 141, 33, 9, 167, 48, 28, 98, 0, 203, 11, 125, 141, 33, 9, 167, 48, 28, 98, 0, 204, 8, 125, 157, 45, 108, 155, 1, 205, 8, 125, 157, 45, 108, 155, 1, 206, 8, 125, 157, 45, 108, 155, 1, 207, 8, 125, 157, 45, 108, 155, 1, 208, 12, 125, 141, 45, 73, 148, 40, 137, 146, 100, 7, 209, 13, 125, 141, 68, 137, 18, 165, 162, 36, 74, 20, 3, 210, 12, 125, 29, 169, 18, 37, 81, 18, 69, 58, 0, 211, 12, 125, 29, 169, 18, 37, 81, 18, 69, 58, 0, 212, 12, 125, 29, 169, 18, 37, 81, 18, 69, 58, 0, 213, 12, 125, 29, 169, 18, 37, 81, 18, 69, 58, 0, 214, 12, 125, 141, 40, 146, 42, 81, 18, 69, 58, 0, 215, 9, 125, 125, 44, 138, 52, 169, 12, 216, 12, 125, 157, 37, 81, 18, 75, 162, 36, 59, 0, 217, 13, 125, 141, 40, 137, 146, 40, 137, 146, 40, 210, 1, 218, 13, 125, 141, 40, 137, 146, 40, 137, 146, 40, 210, 1, 219, 13, 125, 141, 40, 137, 146, 40, 137, 146, 40, 210, 1, 220, 11, 125, 141, 40, 142, 146, 40, 137, 34, 29, 221, 10, 125, 157, 82, 18, 37, 89, 88, 7, 222, 10, 125, 141, 112, 170, 76, 97, 14, 1, 223, 10, 125, 29, 169, 82, 170, 68, 73, 29, 224, 11, 125, 157, 52, 91, 162, 36, 145, 146, 24, 225, 11, 125, 173, 44, 92, 162, 36, 145, 146, 24, 226, 12, 125, 173, 44, 137, 150, 40, 73, 164, 36, 6, 227, 11, 125, 157, 110, 75, 148, 36, 82, 18, 3, 228, 11, 125, 157, 250, 18, 37, 137, 148, 196, 0, 229, 11, 125, 29, 77, 91, 162, 36, 145, 146, 24, 230, 9, 125, 125, 112, 73, 148, 218, 12, 231, 9, 125, 125, 84, 10, 83, 45, 2, 232, 9, 125, 157, 52, 147, 18, 163, 14, 233, 9, 125, 173, 44, 148, 18, 163, 14, 234, 10, 125, 157, 44, 201, 164, 196, 168, 3, 235, 10, 125, 141, 36, 71, 164, 196, 168, 3, 236, 9, 125, 157, 52, 19, 107, 51, 0, 237, 9, 125, 173, 44, 20, 107, 51, 0, 238, 9, 125, 173, 44, 137, 196, 218, 12, 239, 8, 125, 157, 186, 88, 155, 1, 240, 10, 125, 157, 84, 146, 42, 81, 164, 3, 241, 10, 125, 157, 78, 83, 37, 74, 162, 24, 242, 10, 125, 157, 52, 147, 42, 81, 164, 3, 243, 10, 125, 173, 44, 148, 42, 81, 164, 3, 244, 10, 125, 29, 29, 145, 42, 81, 164, 3, 245, 10, 125, 157, 110, 82, 37, 138, 116, 0, 246, 9, 125, 157, 186, 84, 137, 34, 29, 247, 8, 125, 109, 125, 200, 117, 0, 248, 9, 125, 125, 112, 73, 44, 201, 14, 249, 11, 125, 157, 52, 170, 68, 73, 20, 205, 0, 250, 11, 125, 173, 172, 148, 68, 73, 20, 205, 0, 251, 11, 125, 29, 61, 74, 162, 36, 138, 102, 0, 252, 11, 125, 157, 114, 148, 68, 73, 20, 205, 0, 253, 10, 125, 173, 172, 148, 68, 149, 172, 6, 254, 10, 125, 221, 112, 170, 68, 201, 20, 2, 255, 10, 125, 157, 114, 148, 68, 149, 172, 6, 0, 0, 0, 4, 255, 255, 0, 0]; // src/font/fonts/u8g2_font_5x7_tf.u8g2font.ts var u8g2_font_5x7_tf_u8g2font = [ 191, 0, 2, 2, 3, 3, 3, 4, 4, 5, 7, 0, 255, 6, 255, 6, 0, 1, 10, 2, 22, 6, 47, 32, 5, 0, 189, 1, 33, 6, 177, 177, 25, 41, 34, 7, 91, 183, 73, 86, 0, 35, 10, 45, 177, 171, 134, 170, 134, 170, 0, 36, 9, 45, 177, 91, 245, 78, 105, 1, 37, 8, 52, 177, 201, 177, 119, 0, 38, 9, 44, 177, 139, 41, 86, 49, 5, 39, 5, 153, 183, 25, 40, 7, 114, 177, 83, 205, 0, 41, 8, 114, 177, 137, 169, 82, 0, 42, 7, 107, 177, 73, 213, 106, 43, 10, 45, 177, 205, 40, 14, 153, 81, 4, 44, 7, 91, 175, 83, 37, 0, 45, 6, 12, 181, 25, 1, 46, 6, 82, 177, 25, 1, 47, 7, 36, 179, 143, 109, 0, 48, 8, 115, 177, 171, 92, 21, 0, 49, 7, 115, 177, 75, 178, 53, 50, 9, 52, 177, 83, 49, 199, 114, 4, 51, 10, 52, 177, 25, 57, 105, 36, 147, 2, 52, 10, 52, 177, 141, 170, 26, 49, 39, 0, 53, 10, 52, 177, 25, 122, 35, 153, 20, 0, 54, 10, 52, 177, 83, 121, 69, 153, 20, 0, 55, 10, 52, 177, 25, 57, 230, 152, 35, 0, 56, 10, 52, 177, 83, 49, 169, 40, 147, 2, 57, 10, 52, 177, 83, 81, 166, 157, 20, 0, 58, 7, 106, 177, 25, 113, 4, 59, 8, 51, 175, 179, 145, 42, 1, 60, 7, 107, 177, 77, 117, 1, 61, 8, 28, 179, 25, 25, 141, 0, 62, 7, 107, 177, 201, 85, 9, 63, 9, 115, 177, 107, 166, 12, 19, 0, 64, 9, 52, 177, 83, 81, 221, 72, 1, 65, 9, 52, 177, 83, 81, 142, 41, 3, 66, 10, 52, 177, 89, 113, 164, 40, 71, 2, 67, 9, 52, 177, 83, 81, 151, 73, 1, 68, 9, 52, 177, 89, 209, 57, 18, 0, 69, 9, 52, 177, 25, 122, 229, 60, 2, 70, 8, 52, 177, 25, 122, 229, 26, 71, 9, 52, 177, 83, 81, 167, 153, 6, 72, 8, 52, 177, 137, 114, 76, 51, 73, 7, 115, 177, 89, 177, 53, 74, 8, 52, 177, 111, 203, 164, 0, 75, 10, 52, 177, 137, 42, 73, 153, 202, 0, 76, 7, 52, 177, 201, 221, 35, 77, 9, 52, 177, 137, 227, 136, 102, 0, 78, 8, 52, 177, 137, 107, 169, 51, 79, 9, 52, 177, 83, 209, 153, 20, 0, 80, 10, 52, 177, 89, 81, 142, 148, 51, 0, 81, 10, 60, 175, 83, 209, 92, 73, 163, 0, 82, 9, 52, 177, 89, 81, 142, 212, 12, 83, 10, 52, 177, 83, 49, 101, 84, 38, 5, 84, 7, 115, 177, 89, 177, 11, 85, 8, 52, 177, 137, 158, 73, 1, 86, 9, 52, 177, 137, 206, 36, 21, 0, 87, 9, 52, 177, 137, 230, 56, 98, 0, 88, 10, 52, 177, 137, 50, 73, 21, 101, 0, 89, 8, 115, 177, 73, 86, 89, 1, 90, 9, 52, 177, 25, 57, 182, 71, 0, 91, 7, 115, 177, 25, 177, 57, 92, 9, 36, 179, 201, 40, 163, 140, 2, 93, 7, 115, 177, 153, 205, 17, 94, 5, 83, 185, 107, 95, 6, 12, 177, 25, 1, 96, 6, 82, 185, 137, 1, 97, 8, 36, 177, 27, 81, 169, 2, 98, 10, 52, 177, 201, 121, 69, 57, 18, 0, 99, 6, 35, 177, 155, 89, 100, 8, 52, 177, 175, 70, 148, 105, 101, 8, 36, 177, 83, 105, 100, 5, 102, 9, 52, 177, 173, 202, 153, 35, 0, 103, 9, 44, 175, 27, 49, 169, 140, 6, 104, 8, 52, 177, 201, 121, 69, 51, 105, 8, 115, 177, 203, 72, 86, 3, 106, 9, 123, 175, 205, 176, 84, 21, 0, 107, 9, 52, 177, 201, 85, 146, 169, 12, 108, 7, 115, 177, 145, 93, 3, 109, 8, 36, 177, 73, 105, 72, 25, 110, 7, 36, 177, 89, 209, 12, 111, 8, 36, 177, 83, 81, 38, 5, 112, 9, 44, 175, 89, 81, 142, 148, 1, 113, 8, 44, 175, 27, 81, 166, 29, 114, 8, 36, 177, 89, 81, 103, 0, 115, 8, 36, 177, 27, 26, 13, 5, 116, 9, 52, 177, 203, 113, 230, 140, 4, 117, 7, 36, 177, 137, 102, 26, 118, 7, 99, 177, 73, 86, 5, 119, 7, 36, 177, 137, 114, 28, 120, 8, 36, 177, 137, 73, 170, 24, 121, 9, 44, 175, 137, 50, 149, 37, 0, 122, 8, 36, 177, 25, 177, 28, 1, 123, 8, 115, 177, 77, 73, 214, 1, 124, 5, 177, 177, 57, 125, 9, 115, 177, 201, 81, 197, 20, 1, 126, 7, 20, 185, 75, 42, 1, 160, 5, 0, 189, 1, 161, 6, 177, 177, 73, 35, 162, 9, 52, 175, 141, 35, 53, 103, 2, 163, 8, 44, 177, 85, 113, 86, 2, 164, 10, 45, 177, 201, 105, 166, 184, 114, 0, 165, 9, 115, 177, 73, 170, 90, 49, 1, 166, 6, 169, 177, 81, 2, 167, 8, 123, 175, 155, 170, 146, 11, 168, 6, 75, 187, 73, 1, 169, 11, 61, 175, 91, 89, 165, 169, 146, 78, 11, 170, 6, 27, 183, 91, 73, 171, 7, 29, 179, 139, 178, 1, 172, 6, 20, 179, 25, 57, 173, 5, 75, 181, 25, 174, 11, 61, 175, 91, 121, 164, 57, 117, 90, 0, 175, 6, 12, 187, 25, 1, 176, 6, 91, 183, 235, 2, 177, 11, 53, 177, 205, 40, 14, 153, 81, 28, 2, 178, 6, 98, 181, 81, 6, 179, 6, 98, 181, 25, 105, 180, 6, 82, 185, 83, 0, 181, 8, 44, 175, 137, 230, 72, 25, 182, 8, 52, 177, 27, 106, 245, 3, 183, 6, 82, 181, 25, 1, 184, 6, 82, 175, 83, 0, 185, 7, 99, 181, 75, 50, 13, 186, 6, 27, 183, 235, 2, 187, 8, 29, 179, 137, 165, 76, 0, 188, 9, 60, 175, 201, 205, 168, 118, 0, 189, 9, 60, 175, 201, 45, 29, 179, 0, 190, 10, 60, 175, 145, 58, 170, 168, 118, 0, 191, 9, 115, 177, 203, 48, 197, 84, 1, 192, 9, 52, 177, 83, 81, 142, 41, 3, 193, 9, 52, 177, 83, 81, 142, 41, 3, 194, 9, 52, 177, 83, 81, 142, 41, 3, 195, 9, 52, 177, 83, 81, 142, 41, 3, 196, 10, 52, 177, 137, 73, 197, 49, 101, 0, 197, 9, 52, 177, 147, 42, 142, 41, 3, 198, 9, 52, 177, 27, 169, 26, 170, 37, 199, 10, 60, 175, 83, 81, 151, 73, 70, 0, 200, 9, 52, 177, 25, 122, 229, 60, 2, 201, 9, 52, 177, 25, 122, 229, 60, 2, 202, 9, 52, 177, 25, 122, 229, 60, 2, 203, 9, 52, 177, 25, 122, 229, 60, 2, 204, 7, 115, 177, 89, 177, 53, 205, 7, 115, 177, 89, 177, 53, 206, 7, 115, 177, 89, 177, 53, 207, 7, 115, 177, 89, 177, 53, 208, 9, 52, 177, 153, 105, 117, 141, 4, 209, 8, 52, 177, 73, 115, 169, 51, 210, 9, 52, 177, 83, 209, 153, 20, 0, 211, 9, 52, 177, 83, 209, 153, 20, 0, 212, 9, 52, 177, 83, 209, 153, 20, 0, 213, 9, 52, 177, 83, 209, 153, 20, 0, 214, 10, 52, 177, 137, 73, 69, 51, 41, 0, 215, 8, 36, 177, 137, 73, 170, 24, 216, 9, 52, 177, 27, 233, 72, 71, 2, 217, 8, 52, 177, 137, 158, 73, 1, 218, 8, 52, 177, 137, 158, 73, 1, 219, 8, 52, 177, 137, 158, 73, 1, 220, 10, 52, 177, 137, 25, 69, 51, 41, 0, 221, 8, 115, 177, 73, 86, 89, 1, 222, 10, 52, 177, 201, 43, 142, 148, 51, 0, 223, 9, 52, 177, 83, 81, 149, 86, 2, 224, 10, 52, 177, 203, 40, 142, 168, 84, 1, 225, 9, 52, 177, 173, 71, 84, 170, 0, 226, 9, 52, 177, 173, 210, 136, 74, 21, 227, 10, 52, 177, 75, 42, 142, 168, 84, 1, 228, 9, 52, 177, 171, 225, 136, 74, 21, 229, 9, 52, 177, 147, 114, 68, 165, 10, 230, 8, 36, 177, 27, 105, 197, 1, 231, 8, 107, 175, 155, 89, 37, 0, 232, 10, 52, 177, 203, 40, 170, 52, 178, 2, 233, 9, 52, 177, 173, 85, 26, 89, 1, 234, 10, 52, 177, 139, 41, 170, 52, 178, 2, 235, 10, 52, 177, 73, 25, 171, 52, 178, 2, 236, 8, 115, 177, 201, 73, 86, 3, 237, 7, 115, 177, 43, 101, 53, 238, 7, 115, 177, 171, 102, 53, 239, 8, 115, 177, 73, 89, 86, 3, 240, 10, 52, 177, 203, 200, 138, 50, 41, 0, 241, 9, 52, 177, 75, 42, 173, 104, 6, 242, 10, 52, 177, 203, 40, 170, 40, 147, 2, 243, 9, 52, 177, 173, 85, 148, 73, 1, 244, 10, 52, 177, 211, 88, 69, 153, 20, 0, 245, 10, 52, 177, 75, 42, 170, 40, 147, 2, 246, 10, 52, 177, 171, 161, 138, 50, 41, 0, 247, 9, 44, 177, 211, 112, 100, 168, 0, 248, 9, 36, 177, 27, 105, 164, 145, 0, 249, 9, 52, 177, 203, 168, 52, 211, 0, 250, 7, 52, 177, 109, 154, 105, 251, 8, 52, 177, 211, 48, 154, 105, 252, 9, 52, 177, 171, 81, 52, 211, 0, 253, 9, 60, 175, 109, 202, 84, 150, 0, 254, 10, 52, 175, 201, 43, 202, 145, 50, 0, 255, 10, 60, 175, 171, 81, 148, 169, 44, 1, 0, 0, 0, 4, 255, 255, 0, 0 ]; // src/font/fonts/u8g2_font_HelvetiPixel_tr_u8g2font.ts var u8g2_font_HelvetiPixel_tr_u8g2font = [95, 0, 3, 2, 4, 4, 2, 4, 5, 9, 12, 0, 253, 8, 254, 8, 254, 1, 83, 2, 187, 3, 231, 32, 5, 0, 98, 5, 33, 6, 129, 227, 196, 37, 34, 7, 51, 54, 69, 98, 9, 35, 16, 134, 226, 85, 146, 37, 201, 176, 212, 146, 104, 88, 106, 73, 4, 36, 14, 149, 162, 85, 182, 84, 148, 108, 75, 148, 202, 22, 1, 37, 18, 136, 163, 78, 22, 37, 81, 165, 24, 197, 81, 152, 148, 42, 81, 150, 0, 38, 15, 135, 34, 150, 24, 101, 81, 40, 38, 145, 166, 100, 210, 20, 39, 6, 49, 182, 196, 0, 40, 11, 163, 26, 85, 18, 37, 81, 91, 148, 5, 41, 12, 163, 26, 69, 22, 101, 81, 75, 148, 68, 0, 42, 8, 53, 178, 69, 82, 89, 26, 43, 10, 85, 166, 85, 24, 13, 82, 24, 1, 44, 7, 50, 218, 76, 162, 0, 45, 6, 19, 42, 197, 0, 46, 6, 17, 227, 68, 0, 47, 10, 147, 30, 85, 75, 84, 137, 74, 0, 48, 10, 133, 162, 205, 146, 249, 150, 44, 0, 49, 8, 131, 99, 85, 178, 68, 61, 50, 10, 133, 162, 205, 146, 133, 89, 199, 65, 51, 12, 133, 162, 205, 146, 133, 145, 26, 106, 201, 2, 52, 14, 134, 226, 101, 168, 37, 81, 37, 75, 134, 49, 77, 0, 53, 12, 133, 162, 197, 49, 28, 210, 80, 75, 22, 0, 54, 12, 133, 162, 205, 146, 137, 67, 146, 217, 146, 5, 55, 12, 133, 162, 197, 32, 102, 97, 22, 102, 97, 6, 56, 12, 133, 162, 205, 146, 105, 201, 146, 217, 146, 5, 57, 12, 133, 162, 205, 146, 217, 146, 33, 172, 44, 0, 58, 6, 81, 227, 68, 22, 59, 8, 114, 218, 76, 158, 40, 0, 60, 7, 86, 230, 165, 100, 54, 61, 8, 53, 170, 197, 160, 14, 2, 62, 8, 86, 230, 133, 108, 50, 2, 63, 11, 133, 162, 205, 146, 105, 141, 57, 20, 1, 64, 20, 136, 159, 214, 144, 133, 73, 180, 40, 81, 162, 68, 137, 52, 68, 105, 52, 40, 0, 65, 14, 135, 34, 94, 156, 38, 97, 146, 149, 6, 37, 85, 3, 66, 13, 133, 227, 197, 144, 100, 218, 160, 100, 182, 65, 1, 67, 13, 135, 34, 214, 16, 133, 114, 123, 24, 13, 9, 0, 68, 13, 134, 35, 198, 16, 101, 73, 232, 45, 25, 34, 0, 69, 11, 133, 227, 197, 49, 28, 146, 176, 56, 8, 70, 10, 133, 227, 197, 49, 28, 146, 176, 17, 71, 15, 135, 34, 214, 16, 133, 114, 109, 72, 147, 48, 26, 18, 0, 72, 10, 134, 35, 70, 104, 28, 6, 209, 49, 73, 6, 129, 227, 196, 65, 74, 9, 132, 98, 93, 111, 82, 162, 0, 75, 15, 134, 35, 70, 150, 68, 149, 76, 76, 178, 168, 150, 132, 1, 76, 8, 133, 227, 69, 216, 199, 65, 77, 16, 135, 99, 70, 186, 13, 217, 82, 81, 42, 82, 36, 69, 106, 0, 78, 12, 133, 227, 69, 54, 77, 74, 162, 36, 210, 45, 79, 12, 135, 34, 214, 86, 73, 93, 147, 44, 155, 0, 80, 12, 133, 227, 197, 144, 100, 182, 65, 9, 139, 0, 81, 12, 135, 34, 214, 86, 73, 93, 147, 72, 27, 4, 82, 13, 134, 35, 198, 160, 132, 198, 97, 137, 106, 73, 24, 83, 12, 133, 227, 205, 146, 169, 106, 170, 37, 11, 0, 84, 9, 133, 162, 197, 32, 133, 125, 2, 85, 10, 134, 35, 70, 232, 199, 100, 72, 0, 86, 15, 135, 34, 70, 170, 38, 89, 148, 85, 194, 36, 141, 51, 0, 87, 17, 137, 162, 70, 150, 105, 153, 86, 233, 148, 52, 37, 109, 197, 44, 2, 88, 14, 133, 227, 69, 150, 148, 146, 44, 204, 146, 40, 169, 5, 89, 12, 133, 162, 69, 166, 37, 165, 36, 11, 155, 0, 90, 9, 134, 226, 197, 53, 236, 117, 24, 91, 8, 162, 27, 197, 210, 47, 2, 92, 10, 147, 30, 69, 84, 139, 106, 81, 1, 93, 8, 162, 218, 132, 210, 47, 3, 94, 10, 85, 174, 85, 150, 68, 73, 77, 11, 95, 6, 22, 218, 197, 1, 96, 6, 34, 250, 68, 20, 97, 11, 85, 162, 205, 146, 37, 131, 150, 12, 1, 98, 12, 133, 227, 69, 88, 28, 146, 204, 54, 40, 0, 99, 10, 85, 162, 205, 146, 137, 89, 178, 0, 100, 10, 133, 162, 101, 203, 160, 217, 146, 33, 101, 10, 85, 162, 205, 146, 13, 67, 58, 4, 102, 10, 131, 34, 85, 18, 37, 75, 212, 2, 103, 12, 117, 154, 205, 160, 217, 146, 33, 76, 22, 0, 104, 10, 133, 227, 69, 88, 28, 146, 204, 45, 105, 7, 113, 227, 68, 50, 8, 106, 9, 146, 218, 76, 150, 116, 81, 0, 107, 11, 132, 163, 69, 214, 164, 36, 82, 82, 10, 108, 6, 129, 227, 196, 65, 109, 12, 87, 99, 198, 162, 68, 145, 20, 73, 145, 84, 110, 9, 85, 227, 197, 144, 100, 110, 1, 111, 9, 85, 162, 205, 146, 217, 146, 5, 112, 12, 117, 219, 197, 144, 100, 182, 65, 9, 67, 0, 113, 10, 117, 154, 205, 160, 217, 146, 33, 44, 114, 9, 84, 163, 69, 50, 68, 89, 13, 115, 9, 84, 98, 205, 16, 138, 67, 2, 116, 9, 115, 34, 77, 148, 44, 81, 45, 117, 9, 85, 227, 69, 230, 150, 12, 1, 118, 11, 85, 162, 69, 166, 37, 165, 36, 139, 0, 119, 13, 87, 34, 70, 20, 73, 145, 210, 45, 202, 18, 0, 120, 10, 85, 162, 69, 150, 212, 42, 181, 0, 121, 12, 117, 154, 69, 166, 37, 165, 36, 11, 35, 13, 122, 9, 85, 162, 197, 160, 181, 13, 2, 123, 11, 179, 22, 85, 18, 181, 100, 81, 91, 0, 124, 7, 161, 219, 196, 67, 0, 125, 11, 179, 22, 69, 22, 181, 37, 81, 75, 4, 126, 8, 36, 175, 77, 162, 36, 0, 0, 0, 0, 4, 255, 255, 0, 0]; // src/font/fonts/u8g2_font_micropixel_tf_u8g2font.ts var u8g2_font_micropixel_tf_u8g2font = [187, 0, 2, 2, 3, 4, 2, 4, 5, 8, 12, 255, 253, 5, 254, 6, 255, 0, 245, 1, 245, 5, 253, 32, 5, 0, 177, 2, 33, 6, 41, 81, 178, 2, 34, 7, 19, 153, 146, 84, 0, 35, 10, 45, 209, 86, 13, 85, 13, 85, 1, 36, 10, 60, 175, 26, 71, 138, 122, 232, 4, 37, 6, 36, 177, 18, 123, 38, 10, 45, 209, 150, 83, 92, 50, 170, 0, 39, 5, 17, 91, 34, 40, 7, 58, 111, 166, 58, 3, 41, 8, 58, 111, 18, 83, 75, 1, 42, 6, 27, 153, 146, 58, 43, 7, 27, 147, 150, 86, 2, 44, 5, 17, 79, 34, 45, 5, 10, 117, 34, 46, 5, 9, 81, 18, 47, 7, 43, 145, 90, 149, 17, 48, 9, 44, 177, 166, 226, 152, 73, 1, 49, 6, 170, 145, 182, 26, 50, 8, 44, 177, 166, 98, 115, 4, 51, 9, 44, 177, 166, 98, 21, 147, 2, 52, 8, 44, 177, 18, 229, 208, 5, 53, 9, 44, 177, 50, 244, 70, 35, 1, 54, 9, 44, 177, 166, 242, 138, 73, 1, 55, 9, 44, 177, 50, 114, 172, 35, 0, 56, 10, 44, 177, 166, 98, 82, 49, 41, 0, 57, 9, 44, 177, 166, 98, 218, 73, 1, 58, 6, 41, 81, 146, 3, 59, 6, 49, 79, 146, 5, 60, 6, 26, 115, 38, 3, 61, 6, 27, 147, 178, 7, 62, 7, 26, 115, 18, 21, 0, 63, 9, 44, 177, 166, 98, 77, 37, 0, 64, 10, 45, 209, 182, 178, 26, 169, 90, 0, 65, 8, 44, 177, 166, 226, 152, 50, 66, 10, 44, 177, 178, 226, 72, 113, 36, 0, 67, 8, 44, 177, 54, 114, 141, 6, 68, 9, 44, 177, 178, 162, 57, 18, 0, 69, 8, 44, 177, 50, 244, 202, 35, 70, 8, 44, 177, 50, 244, 202, 25, 71, 8, 44, 177, 54, 114, 154, 105, 72, 8, 44, 177, 18, 229, 152, 50, 73, 7, 43, 145, 178, 98, 53, 74, 7, 43, 145, 38, 203, 5, 75, 9, 44, 177, 18, 85, 146, 169, 12, 76, 7, 43, 145, 18, 155, 3, 77, 9, 45, 209, 146, 215, 74, 90, 7, 78, 8, 44, 177, 18, 151, 154, 50, 79, 9, 44, 177, 166, 162, 153, 20, 0, 80, 9, 44, 177, 178, 226, 72, 57, 3, 81, 8, 44, 177, 166, 162, 165, 6, 82, 9, 44, 177, 178, 226, 72, 81, 6, 83, 10, 44, 177, 54, 50, 210, 104, 36, 0, 84, 7, 43, 145, 178, 98, 11, 85, 8, 44, 177, 18, 157, 73, 1, 86, 8, 44, 177, 18, 93, 49, 2, 87, 9, 45, 209, 146, 173, 164, 186, 0, 88, 9, 44, 177, 18, 101, 82, 81, 6, 89, 8, 43, 145, 146, 84, 89, 1, 90, 9, 44, 177, 50, 114, 82, 121, 4, 91, 7, 58, 111, 178, 186, 4, 92, 7, 43, 145, 18, 115, 25, 93, 7, 58, 111, 162, 186, 6, 94, 6, 19, 153, 214, 0, 95, 6, 12, 177, 50, 2, 96, 6, 18, 121, 18, 3, 97, 7, 27, 145, 182, 146, 0, 98, 8, 43, 145, 18, 163, 74, 11, 99, 6, 27, 145, 182, 5, 100, 7, 43, 145, 90, 173, 36, 101, 6, 26, 113, 178, 4, 102, 8, 43, 145, 154, 210, 138, 9, 103, 8, 43, 141, 182, 146, 92, 0, 104, 8, 43, 145, 18, 163, 74, 42, 105, 6, 41, 81, 146, 6, 106, 8, 186, 76, 150, 83, 165, 0, 107, 8, 35, 145, 146, 86, 82, 1, 108, 6, 41, 81, 50, 4, 109, 8, 29, 209, 50, 82, 165, 10, 110, 7, 27, 145, 162, 146, 10, 111, 7, 27, 145, 50, 210, 8, 112, 8, 43, 141, 162, 210, 138, 17, 113, 7, 43, 141, 182, 146, 44, 114, 7, 27, 145, 50, 146, 4, 115, 7, 27, 145, 166, 146, 2, 116, 7, 42, 113, 146, 86, 12, 117, 7, 27, 145, 146, 84, 18, 118, 7, 27, 145, 146, 84, 5, 119, 8, 29, 209, 146, 146, 234, 2, 120, 6, 27, 145, 146, 58, 121, 8, 43, 141, 146, 84, 146, 11, 122, 7, 27, 145, 178, 210, 0, 123, 9, 59, 143, 154, 98, 202, 49, 7, 124, 5, 49, 81, 114, 125, 10, 59, 143, 146, 99, 78, 49, 69, 0, 126, 7, 20, 181, 150, 84, 2, 160, 5, 0, 177, 2, 161, 6, 41, 81, 146, 6, 162, 9, 44, 175, 26, 71, 138, 51, 1, 163, 9, 44, 177, 170, 226, 72, 113, 4, 164, 10, 45, 209, 146, 211, 76, 113, 229, 0, 165, 9, 43, 145, 146, 84, 181, 18, 0, 166, 6, 49, 79, 34, 5, 167, 12, 60, 177, 54, 50, 82, 49, 105, 52, 18, 0, 168, 7, 21, 217, 162, 70, 18, 169, 10, 45, 209, 182, 178, 26, 57, 45, 0, 170, 7, 27, 153, 182, 146, 0, 171, 7, 29, 211, 22, 101, 3, 172, 6, 19, 147, 50, 3, 174, 9, 45, 209, 182, 226, 85, 45, 0, 175, 6, 12, 187, 50, 2, 176, 7, 27, 153, 50, 210, 8, 177, 8, 43, 145, 150, 86, 70, 3, 178, 7, 35, 155, 162, 215, 0, 179, 7, 35, 155, 34, 229, 2, 180, 6, 18, 121, 166, 0, 181, 8, 43, 141, 146, 212, 144, 17, 182, 11, 45, 209, 54, 86, 82, 49, 197, 148, 0, 183, 5, 9, 85, 18, 184, 7, 155, 106, 150, 23, 0, 185, 6, 162, 155, 162, 26, 186, 7, 27, 157, 50, 210, 8, 187, 8, 29, 211, 18, 75, 153, 0, 191, 9, 44, 173, 150, 169, 88, 41, 0, 192, 11, 68, 177, 150, 81, 198, 42, 142, 41, 3, 193, 10, 68, 177, 90, 83, 42, 142, 41, 3, 194, 11, 68, 177, 166, 98, 134, 42, 142, 41, 3, 195, 11, 68, 177, 150, 84, 198, 42, 142, 41, 3, 196, 10, 60, 177, 18, 51, 84, 113, 76, 25, 197, 10, 60, 177, 166, 98, 82, 113, 76, 25, 198, 12, 47, 17, 55, 70, 204, 99, 197, 28, 71, 0, 199, 11, 68, 171, 54, 114, 141, 102, 70, 49, 1, 200, 11, 68, 177, 150, 81, 198, 42, 142, 41, 3, 201, 10, 68, 177, 90, 227, 161, 87, 30, 1, 202, 11, 68, 177, 22, 83, 134, 67, 175, 60, 2, 203, 10, 60, 177, 146, 50, 28, 122, 229, 17, 204, 9, 67, 145, 146, 51, 90, 177, 26, 205, 9, 67, 145, 154, 50, 90, 177, 26, 206, 8, 67, 145, 214, 94, 177, 26, 207, 9, 59, 145, 146, 242, 138, 213, 0, 208, 10, 173, 176, 54, 227, 72, 101, 90, 0, 209, 11, 68, 177, 150, 84, 134, 113, 169, 41, 3, 210, 11, 68, 177, 150, 81, 198, 42, 154, 73, 1, 211, 10, 68, 177, 90, 83, 42, 154, 73, 1, 212, 11, 68, 177, 166, 98, 134, 42, 154, 73, 1, 213, 11, 68, 177, 150, 84, 198, 42, 154, 73, 1, 214, 10, 60, 177, 18, 51, 84, 209, 76, 10, 215, 6, 27, 147, 146, 58, 216, 10, 174, 208, 170, 99, 26, 43, 102, 9, 217, 11, 68, 177, 150, 81, 134, 209, 153, 20, 0, 218, 9, 68, 177, 90, 227, 232, 76, 10, 219, 11, 68, 177, 166, 98, 70, 209, 153, 20, 0, 220, 10, 60, 177, 18, 51, 138, 206, 164, 0, 221, 10, 67, 145, 154, 50, 74, 170, 172, 0, 222, 9, 44, 177, 146, 87, 28, 41, 3, 223, 9, 44, 177, 178, 162, 42, 85, 2, 224, 8, 51, 145, 146, 51, 92, 73, 225, 8, 51, 145, 154, 50, 92, 73, 226, 8, 51, 145, 214, 70, 43, 9, 227, 10, 52, 177, 150, 84, 198, 170, 84, 0, 228, 8, 43, 145, 146, 50, 90, 73, 229, 10, 59, 145, 50, 210, 200, 104, 37, 1, 230, 7, 28, 177, 54, 82, 28, 231, 8, 51, 139, 182, 85, 94, 0, 232, 7, 50, 113, 18, 227, 18, 233, 7, 50, 113, 166, 151, 0, 234, 8, 51, 145, 214, 86, 81, 1, 235, 8, 43, 145, 146, 178, 138, 10, 236, 7, 50, 113, 18, 115, 42, 237, 7, 50, 113, 166, 83, 5, 238, 8, 51, 145, 214, 70, 177, 2, 239, 9, 43, 145, 146, 50, 138, 21, 0, 240, 12, 60, 177, 146, 98, 149, 81, 26, 49, 41, 0, 241, 10, 52, 177, 150, 84, 134, 50, 181, 0, 242, 9, 51, 145, 146, 51, 26, 105, 4, 243, 9, 51, 145, 154, 50, 26, 105, 4, 244, 8, 51, 145, 214, 30, 105, 4, 245, 10, 52, 177, 150, 84, 134, 171, 90, 0, 246, 8, 43, 145, 146, 242, 72, 35, 247, 8, 43, 145, 150, 209, 70, 9, 248, 10, 173, 174, 142, 210, 76, 113, 101, 4, 249, 9, 51, 145, 146, 51, 74, 42, 9, 250, 9, 51, 145, 154, 50, 74, 42, 9, 251, 8, 51, 145, 214, 78, 42, 9, 252, 8, 43, 145, 146, 114, 82, 73, 253, 10, 67, 141, 154, 50, 74, 42, 201, 5, 254, 10, 67, 143, 18, 163, 74, 106, 197, 8, 255, 10, 59, 141, 146, 114, 82, 73, 46, 0, 0, 0, 0, 4, 255, 255, 0, 0]; // src/font/fonts/u8g2_font_micropixel_tr_u8g2font.ts var u8g2_font_micropixel_tr_u8g2font = [95, 0, 2, 2, 3, 3, 2, 4, 4, 6, 9, 255, 254, 5, 254, 6, 255, 0, 239, 1, 234, 2, 195, 32, 5, 128, 216, 0, 33, 6, 169, 168, 172, 0, 34, 6, 147, 204, 36, 21, 35, 10, 173, 232, 85, 67, 85, 67, 85, 0, 36, 10, 188, 215, 198, 145, 162, 30, 58, 1, 37, 6, 164, 216, 196, 30, 38, 9, 173, 232, 229, 20, 151, 140, 42, 39, 5, 145, 173, 8, 40, 7, 186, 183, 169, 206, 0, 41, 8, 186, 183, 196, 212, 82, 0, 42, 6, 155, 204, 164, 14, 43, 7, 155, 201, 165, 149, 0, 44, 5, 145, 167, 8, 45, 5, 138, 186, 8, 46, 5, 137, 168, 4, 47, 7, 171, 200, 86, 101, 4, 48, 9, 172, 216, 169, 56, 102, 82, 0, 49, 6, 234, 200, 173, 6, 50, 8, 172, 216, 169, 216, 28, 1, 51, 9, 172, 216, 169, 88, 197, 164, 0, 52, 8, 172, 216, 68, 57, 116, 1, 53, 9, 172, 216, 12, 189, 209, 72, 0, 54, 9, 172, 216, 169, 188, 98, 82, 0, 55, 8, 172, 216, 140, 28, 235, 8, 56, 9, 172, 216, 169, 152, 84, 76, 10, 57, 9, 172, 216, 169, 152, 118, 82, 0, 58, 6, 169, 168, 228, 0, 59, 6, 177, 167, 100, 1, 60, 6, 154, 185, 201, 0, 61, 6, 155, 201, 236, 1, 62, 6, 154, 185, 68, 5, 63, 8, 172, 216, 169, 88, 83, 9, 64, 10, 173, 232, 173, 172, 70, 170, 22, 0, 65, 8, 172, 216, 169, 56, 166, 12, 66, 9, 172, 216, 172, 56, 82, 28, 9, 67, 8, 172, 216, 141, 92, 163, 1, 68, 8, 172, 216, 172, 104, 142, 4, 69, 8, 172, 216, 12, 189, 242, 8, 70, 8, 172, 216, 12, 189, 114, 6, 71, 8, 172, 216, 141, 156, 102, 26, 72, 8, 172, 216, 68, 57, 166, 12, 73, 7, 171, 200, 172, 88, 13, 74, 7, 171, 200, 201, 114, 1, 75, 9, 172, 216, 68, 149, 100, 42, 3, 76, 7, 171, 200, 196, 230, 0, 77, 9, 173, 232, 228, 181, 146, 214, 1, 78, 8, 172, 216, 196, 165, 166, 12, 79, 8, 172, 216, 169, 104, 38, 5, 80, 9, 172, 216, 172, 56, 82, 206, 0, 81, 8, 172, 216, 169, 104, 169, 1, 82, 9, 172, 216, 172, 56, 82, 148, 1, 83, 9, 172, 216, 141, 140, 52, 26, 9, 84, 7, 171, 200, 172, 216, 2, 85, 8, 172, 216, 68, 103, 82, 0, 86, 8, 172, 216, 68, 87, 140, 0, 87, 9, 173, 232, 100, 43, 169, 46, 0, 88, 9, 172, 216, 68, 153, 84, 148, 1, 89, 8, 171, 200, 36, 85, 86, 0, 90, 9, 172, 216, 140, 156, 84, 30, 1, 91, 7, 186, 183, 172, 46, 1, 92, 7, 171, 200, 196, 92, 6, 93, 7, 186, 183, 168, 174, 1, 94, 5, 147, 204, 53, 95, 6, 140, 216, 140, 0, 96, 6, 146, 188, 196, 0, 97, 6, 155, 200, 173, 36, 98, 8, 171, 200, 196, 168, 210, 2, 99, 6, 155, 200, 109, 1, 100, 7, 171, 200, 86, 43, 9, 101, 6, 154, 184, 44, 1, 102, 8, 171, 200, 166, 180, 98, 2, 103, 8, 171, 198, 173, 36, 23, 0, 104, 8, 171, 200, 196, 168, 146, 10, 105, 6, 169, 168, 164, 1, 106, 8, 122, 166, 229, 84, 41, 0, 107, 8, 163, 200, 164, 149, 84, 0, 108, 6, 169, 168, 12, 1, 109, 8, 157, 232, 140, 84, 169, 2, 110, 7, 155, 200, 168, 164, 2, 111, 7, 155, 200, 140, 52, 2, 112, 8, 171, 198, 168, 180, 98, 4, 113, 7, 171, 198, 173, 36, 11, 114, 7, 155, 200, 140, 36, 1, 115, 7, 155, 200, 169, 164, 0, 116, 7, 170, 184, 164, 21, 3, 117, 7, 155, 200, 36, 149, 4, 118, 7, 155, 200, 36, 85, 1, 119, 8, 157, 232, 164, 164, 186, 0, 120, 6, 155, 200, 164, 14, 121, 8, 171, 198, 36, 149, 228, 2, 122, 6, 155, 200, 172, 52, 123, 9, 187, 199, 166, 152, 114, 204, 1, 124, 5, 177, 168, 28, 125, 9, 187, 199, 228, 152, 83, 76, 17, 126, 7, 148, 218, 37, 149, 0, 0, 0, 0, 4, 255, 255, 0, 0]; // src/font/fonts/u8g2_font_NokiaSmallPlain_tf_u8g2font.ts var u8g2_font_NokiaSmallPlain_tf_u8g2font = [148, 0, 2, 2, 3, 4, 2, 4, 5, 7, 8, 0, 255, 7, 255, 7, 255, 1, 34, 2, 43, 5, 72, 32, 5, 0, 113, 2, 33, 7, 57, 81, 50, 84, 0, 34, 7, 19, 155, 146, 84, 0, 35, 13, 61, 209, 86, 166, 52, 84, 53, 84, 153, 18, 0, 36, 10, 68, 175, 26, 71, 74, 243, 208, 9, 37, 10, 60, 177, 162, 86, 140, 178, 90, 2, 38, 12, 61, 209, 150, 83, 76, 185, 74, 50, 170, 0, 39, 5, 17, 91, 34, 40, 7, 66, 111, 166, 122, 6, 41, 8, 66, 111, 18, 83, 151, 2, 42, 10, 45, 211, 86, 199, 33, 115, 74, 0, 43, 10, 45, 211, 154, 81, 28, 50, 163, 8, 44, 6, 18, 111, 166, 0, 45, 6, 12, 183, 50, 2, 46, 5, 9, 81, 18, 47, 9, 59, 145, 90, 197, 42, 70, 0, 48, 9, 60, 177, 166, 162, 103, 82, 0, 49, 6, 186, 145, 182, 122, 50, 10, 60, 177, 178, 81, 78, 42, 231, 17, 51, 11, 60, 177, 178, 81, 78, 26, 229, 145, 0, 52, 9, 60, 177, 30, 85, 146, 67, 23, 53, 10, 60, 177, 178, 242, 70, 57, 143, 4, 54, 10, 60, 177, 166, 242, 138, 102, 82, 0, 55, 10, 60, 177, 50, 114, 204, 49, 151, 0, 56, 11, 60, 177, 166, 162, 76, 42, 202, 164, 0, 57, 10, 60, 177, 166, 162, 153, 118, 82, 0, 58, 6, 161, 113, 18, 3, 59, 7, 42, 111, 150, 161, 2, 60, 10, 60, 177, 30, 219, 40, 163, 140, 2, 61, 8, 28, 179, 50, 50, 26, 1, 62, 11, 60, 177, 146, 81, 70, 25, 197, 54, 0, 63, 10, 60, 177, 178, 81, 172, 51, 21, 1, 64, 12, 61, 209, 182, 178, 26, 106, 169, 156, 22, 0, 65, 9, 60, 177, 166, 162, 57, 166, 12, 66, 10, 60, 177, 178, 226, 72, 209, 28, 9, 67, 8, 60, 177, 54, 114, 55, 26, 68, 9, 60, 177, 178, 162, 231, 72, 0, 69, 9, 60, 177, 50, 244, 202, 245, 8, 70, 9, 60, 177, 50, 244, 202, 109, 0, 71, 9, 60, 177, 54, 114, 154, 102, 26, 72, 9, 60, 177, 18, 229, 152, 206, 0, 73, 6, 57, 81, 114, 4, 74, 7, 59, 145, 218, 115, 1, 75, 10, 60, 177, 18, 85, 146, 89, 166, 50, 76, 8, 60, 177, 146, 123, 143, 0, 77, 10, 61, 209, 146, 215, 74, 42, 105, 59, 78, 10, 61, 209, 146, 167, 74, 114, 219, 1, 79, 9, 61, 209, 182, 178, 119, 90, 0, 80, 10, 60, 177, 178, 162, 57, 82, 206, 0, 81, 10, 69, 207, 182, 178, 87, 181, 97, 0, 82, 9, 60, 177, 178, 162, 57, 82, 51, 83, 11, 60, 177, 54, 114, 70, 26, 229, 145, 0, 84, 13, 61, 209, 50, 100, 70, 25, 101, 148, 81, 70, 17, 85, 8, 60, 177, 18, 125, 38, 5, 86, 11, 61, 209, 146, 237, 84, 166, 156, 81, 4, 87, 15, 63, 17, 147, 161, 134, 41, 199, 84, 166, 58, 101, 84, 2, 88, 10, 61, 209, 146, 117, 170, 171, 90, 7, 89, 12, 61, 209, 146, 117, 170, 51, 202, 40, 163, 8, 90, 9, 60, 177, 50, 114, 108, 231, 17, 92, 9, 59, 145, 18, 115, 172, 99, 0, 95, 6, 13, 207, 50, 4, 97, 9, 44, 177, 166, 81, 26, 49, 13, 98, 10, 60, 177, 146, 243, 138, 230, 72, 0, 99, 7, 43, 145, 54, 107, 1, 100, 9, 60, 177, 94, 141, 104, 166, 1, 101, 9, 44, 177, 166, 226, 216, 72, 1, 102, 7, 58, 113, 166, 86, 11, 103, 10, 52, 175, 54, 162, 76, 59, 41, 0, 104, 9, 60, 177, 146, 243, 138, 206, 0, 105, 7, 57, 81, 146, 134, 0, 106, 8, 66, 111, 150, 83, 75, 1, 107, 10, 60, 177, 146, 75, 149, 100, 42, 3, 108, 6, 57, 81, 114, 4, 109, 11, 45, 209, 50, 82, 165, 146, 74, 170, 0, 110, 7, 44, 177, 178, 162, 51, 111, 9, 44, 177, 166, 162, 153, 20, 0, 112, 10, 52, 175, 178, 162, 28, 41, 103, 0, 113, 9, 52, 175, 54, 162, 76, 187, 0, 114, 8, 43, 145, 146, 134, 44, 1, 115, 7, 43, 145, 182, 243, 2, 116, 8, 58, 113, 146, 210, 42, 3, 117, 7, 44, 177, 18, 157, 105, 118, 10, 45, 209, 146, 117, 42, 83, 142, 0, 119, 10, 45, 209, 146, 85, 82, 157, 41, 1, 120, 9, 44, 177, 18, 101, 82, 81, 6, 121, 9, 52, 175, 18, 205, 180, 147, 2, 122, 8, 44, 177, 50, 98, 123, 4, 126, 8, 61, 209, 114, 123, 143, 1, 160, 5, 0, 113, 2, 161, 7, 57, 81, 146, 134, 0, 163, 10, 60, 177, 54, 114, 158, 57, 142, 0, 164, 10, 52, 177, 18, 147, 138, 50, 169, 24, 165, 12, 61, 209, 146, 83, 53, 100, 222, 25, 69, 0, 167, 10, 67, 143, 86, 173, 164, 210, 170, 0, 191, 9, 60, 177, 154, 169, 28, 107, 52, 192, 10, 60, 177, 150, 81, 84, 113, 76, 25, 193, 9, 60, 177, 90, 171, 56, 166, 12, 194, 10, 60, 177, 166, 98, 82, 113, 76, 25, 195, 10, 60, 177, 150, 84, 84, 113, 76, 25, 196, 10, 60, 177, 18, 51, 84, 113, 76, 25, 197, 9, 60, 177, 38, 173, 56, 166, 12, 198, 11, 62, 241, 58, 82, 157, 242, 72, 177, 115, 199, 9, 68, 175, 54, 114, 55, 154, 9, 200, 10, 60, 177, 150, 81, 26, 122, 229, 17, 201, 9, 60, 177, 90, 14, 189, 242, 8, 202, 9, 60, 177, 90, 141, 189, 242, 8, 203, 10, 60, 177, 86, 163, 161, 87, 30, 1, 204, 8, 58, 113, 18, 85, 23, 0, 205, 7, 58, 113, 166, 122, 1, 206, 7, 59, 145, 214, 217, 5, 207, 9, 59, 145, 146, 50, 138, 93, 0, 209, 10, 61, 209, 102, 166, 60, 85, 146, 59, 210, 10, 61, 209, 154, 97, 92, 217, 78, 11, 211, 9, 61, 209, 94, 175, 108, 167, 5, 212, 10, 61, 209, 154, 83, 26, 219, 78, 11, 214, 10, 61, 209, 86, 83, 43, 219, 105, 1, 216, 10, 61, 209, 54, 228, 149, 230, 161, 0, 217, 9, 60, 177, 150, 81, 233, 76, 10, 218, 8, 60, 177, 218, 116, 38, 5, 219, 10, 60, 177, 166, 98, 70, 209, 76, 10, 220, 10, 60, 177, 18, 51, 138, 206, 164, 0, 223, 10, 67, 143, 86, 169, 149, 212, 138, 0, 224, 11, 60, 177, 150, 81, 212, 40, 141, 152, 6, 225, 10, 60, 177, 30, 163, 70, 105, 196, 52, 226, 11, 60, 177, 166, 98, 210, 40, 141, 152, 6, 227, 11, 60, 177, 150, 84, 212, 40, 141, 152, 6, 228, 10, 60, 177, 86, 67, 141, 210, 136, 105, 229, 10, 60, 177, 90, 197, 140, 210, 136, 105, 230, 10, 46, 241, 166, 50, 170, 198, 204, 74, 231, 8, 51, 143, 54, 107, 149, 0, 232, 11, 60, 177, 150, 81, 84, 113, 108, 164, 0, 233, 10, 60, 177, 90, 171, 56, 54, 82, 0, 234, 11, 60, 177, 166, 98, 82, 113, 108, 164, 0, 235, 10, 60, 177, 86, 67, 21, 199, 70, 10, 236, 8, 58, 113, 18, 85, 23, 0, 237, 7, 58, 113, 166, 83, 11, 238, 7, 59, 145, 214, 217, 5, 239, 9, 59, 145, 146, 50, 138, 93, 0, 241, 9, 60, 177, 150, 84, 90, 209, 25, 242, 10, 60, 177, 150, 81, 84, 209, 76, 10, 243, 9, 60, 177, 90, 171, 104, 38, 5, 244, 10, 60, 177, 166, 98, 82, 209, 76, 10, 246, 10, 60, 177, 18, 51, 84, 209, 76, 10, 248, 10, 44, 177, 54, 162, 26, 105, 36, 0, 249, 9, 60, 177, 150, 81, 233, 76, 3, 250, 8, 60, 177, 218, 116, 166, 1, 251, 10, 60, 177, 166, 98, 70, 209, 76, 3, 252, 9, 60, 177, 18, 51, 138, 206, 52, 0, 0, 0, 4, 255, 255, 0, 0]; // src/font/fonts/u8g2_font_smolfont_tf_u8g2font.ts var u8g2_font_smolfont_tf_u8g2font = [187, 0, 2, 2, 3, 4, 2, 4, 4, 5, 10, 255, 254, 5, 255, 5, 0, 0, 226, 1, 204, 5, 130, 32, 5, 0, 113, 1, 33, 6, 41, 81, 89, 1, 34, 6, 19, 151, 73, 42, 35, 7, 43, 145, 73, 253, 0, 36, 7, 59, 143, 139, 207, 4, 37, 8, 43, 145, 73, 49, 149, 41, 38, 9, 59, 143, 137, 35, 165, 67, 2, 39, 5, 17, 87, 17, 40, 7, 42, 113, 83, 101, 0, 41, 8, 42, 113, 137, 41, 41, 0, 42, 6, 27, 149, 73, 29, 43, 7, 27, 147, 75, 43, 1, 44, 5, 17, 79, 17, 45, 5, 11, 149, 25, 46, 5, 137, 113, 9, 47, 7, 43, 145, 173, 202, 8, 48, 7, 43, 145, 91, 214, 2, 49, 7, 43, 145, 75, 178, 26, 50, 8, 43, 145, 25, 41, 166, 52, 51, 8, 43, 145, 153, 41, 143, 0, 52, 8, 43, 145, 73, 106, 196, 2, 53, 8, 43, 145, 25, 81, 47, 0, 54, 8, 43, 145, 155, 35, 141, 0, 55, 6, 43, 145, 153, 29, 56, 8, 43, 145, 25, 169, 53, 2, 57, 8, 43, 145, 25, 105, 196, 17, 58, 6, 25, 83, 73, 1, 59, 7, 178, 78, 203, 148, 2, 60, 6, 26, 115, 147, 1, 61, 6, 27, 147, 217, 3, 62, 6, 26, 115, 137, 10, 63, 9, 51, 143, 81, 101, 202, 48, 1, 64, 7, 43, 145, 59, 212, 8, 65, 8, 43, 145, 91, 106, 168, 0, 66, 8, 43, 145, 81, 105, 165, 17, 67, 8, 43, 145, 91, 50, 141, 0, 68, 8, 43, 145, 81, 201, 26, 1, 69, 8, 43, 145, 25, 81, 197, 1, 70, 8, 43, 145, 25, 81, 197, 8, 71, 8, 51, 143, 155, 73, 141, 24, 72, 8, 43, 145, 137, 105, 40, 21, 73, 7, 43, 145, 89, 177, 26, 74, 7, 43, 145, 45, 213, 2, 75, 8, 43, 145, 73, 106, 37, 21, 76, 7, 43, 145, 137, 205, 1, 77, 8, 43, 145, 73, 99, 40, 21, 78, 7, 43, 145, 81, 201, 21, 79, 8, 43, 145, 25, 201, 26, 1, 80, 8, 43, 145, 25, 105, 197, 8, 81, 7, 51, 143, 91, 214, 14, 82, 8, 43, 145, 81, 73, 173, 2, 83, 7, 43, 145, 155, 23, 0, 84, 7, 43, 145, 89, 177, 5, 85, 7, 43, 145, 73, 174, 36, 86, 8, 43, 145, 137, 73, 149, 9, 87, 8, 43, 145, 85, 106, 168, 0, 88, 7, 43, 145, 73, 101, 85, 89, 7, 43, 145, 85, 101, 5, 90, 7, 43, 145, 153, 169, 28, 91, 7, 42, 113, 89, 149, 0, 92, 7, 43, 145, 137, 185, 12, 93, 7, 42, 113, 81, 213, 0, 94, 5, 19, 151, 107, 95, 5, 11, 145, 25, 96, 6, 18, 119, 137, 1, 97, 6, 27, 145, 59, 2, 98, 8, 35, 145, 137, 42, 141, 0, 99, 6, 27, 145, 25, 113, 100, 7, 35, 145, 77, 71, 0, 101, 6, 27, 145, 25, 106, 102, 7, 27, 145, 25, 42, 2, 103, 8, 35, 143, 25, 41, 201, 0, 104, 8, 35, 145, 137, 113, 164, 0, 105, 6, 33, 81, 73, 2, 106, 7, 42, 111, 203, 73, 1, 107, 7, 27, 145, 73, 171, 0, 108, 7, 34, 113, 73, 149, 0, 109, 7, 27, 145, 73, 67, 5, 110, 7, 27, 145, 81, 73, 5, 111, 7, 27, 145, 25, 105, 4, 112, 8, 35, 143, 25, 105, 69, 0, 113, 7, 35, 143, 171, 118, 0, 114, 6, 27, 145, 155, 17, 115, 7, 27, 145, 83, 73, 1, 116, 6, 34, 113, 73, 75, 117, 7, 27, 145, 73, 42, 9, 118, 7, 27, 145, 137, 169, 2, 119, 7, 35, 145, 85, 67, 5, 120, 6, 27, 145, 73, 29, 121, 7, 35, 145, 85, 101, 2, 122, 6, 27, 145, 145, 81, 123, 7, 43, 145, 83, 117, 20, 124, 6, 41, 81, 25, 2, 125, 8, 43, 145, 145, 57, 37, 5, 126, 6, 27, 147, 137, 51, 160, 5, 0, 113, 1, 161, 6, 49, 79, 73, 35, 162, 8, 43, 143, 29, 114, 68, 0, 163, 8, 51, 143, 155, 42, 206, 0, 164, 8, 43, 145, 73, 67, 13, 21, 165, 9, 51, 143, 73, 213, 74, 43, 1, 166, 6, 169, 113, 81, 2, 167, 8, 43, 145, 27, 169, 26, 9, 168, 6, 11, 153, 73, 1, 169, 8, 59, 143, 217, 35, 238, 1, 170, 7, 27, 149, 25, 105, 1, 171, 6, 27, 147, 27, 81, 172, 6, 19, 147, 153, 1, 174, 8, 51, 143, 25, 105, 213, 3, 175, 5, 11, 153, 25, 176, 6, 27, 149, 235, 2, 177, 8, 43, 145, 75, 43, 163, 1, 178, 6, 27, 149, 217, 3, 179, 6, 27, 149, 153, 35, 180, 6, 18, 119, 83, 0, 181, 8, 35, 143, 73, 106, 72, 0, 182, 8, 51, 143, 91, 42, 201, 2, 183, 5, 9, 89, 9, 184, 6, 146, 141, 137, 1, 185, 6, 26, 119, 91, 1, 186, 6, 18, 119, 25, 1, 187, 7, 27, 147, 145, 35, 1, 191, 9, 51, 143, 203, 48, 197, 148, 4, 192, 10, 67, 145, 201, 25, 46, 53, 84, 0, 193, 10, 67, 145, 77, 25, 46, 53, 84, 0, 194, 9, 67, 145, 107, 163, 165, 134, 10, 195, 10, 67, 145, 145, 26, 45, 53, 84, 0, 196, 10, 59, 145, 73, 25, 45, 53, 84, 0, 197, 9, 59, 145, 107, 45, 53, 84, 0, 198, 9, 44, 177, 27, 169, 26, 42, 9, 199, 9, 59, 141, 91, 50, 141, 84, 2, 200, 10, 67, 145, 201, 25, 141, 168, 226, 0, 201, 10, 67, 145, 77, 25, 141, 168, 226, 0, 202, 9, 67, 145, 107, 143, 168, 226, 0, 203, 9, 59, 145, 73, 121, 68, 21, 7, 204, 9, 67, 145, 201, 25, 173, 88, 13, 205, 9, 67, 145, 77, 25, 173, 88, 13, 206, 8, 67, 145, 107, 175, 88, 13, 207, 8, 59, 145, 73, 121, 197, 106, 208, 8, 172, 144, 147, 105, 168, 106, 209, 9, 67, 145, 145, 90, 37, 87, 0, 210, 10, 67, 145, 201, 25, 141, 100, 141, 0, 211, 10, 67, 145, 77, 25, 141, 100, 141, 0, 212, 9, 67, 145, 107, 143, 100, 141, 0, 213, 9, 67, 145, 145, 122, 36, 107, 4, 214, 9, 59, 145, 73, 121, 36, 107, 4, 215, 6, 27, 147, 73, 29, 216, 13, 189, 174, 71, 105, 166, 152, 98, 138, 43, 35, 0, 217, 9, 67, 145, 201, 25, 37, 87, 18, 218, 9, 67, 145, 77, 25, 37, 87, 18, 219, 8, 67, 145, 107, 39, 87, 18, 220, 9, 59, 145, 73, 57, 185, 146, 0, 221, 9, 67, 145, 77, 25, 171, 178, 2, 222, 8, 43, 145, 137, 42, 173, 8, 223, 10, 59, 141, 81, 105, 165, 33, 35, 0, 224, 8, 51, 145, 201, 25, 174, 17, 225, 8, 51, 145, 77, 25, 174, 17, 226, 7, 51, 145, 107, 163, 35, 227, 8, 51, 145, 145, 26, 29, 1, 228, 8, 43, 145, 73, 25, 29, 1, 229, 7, 51, 145, 235, 92, 35, 230, 8, 28, 177, 27, 41, 141, 0, 231, 8, 43, 141, 25, 113, 149, 0, 232, 8, 51, 145, 201, 25, 13, 53, 233, 8, 51, 145, 77, 25, 13, 53, 234, 7, 51, 145, 107, 15, 53, 235, 8, 43, 145, 73, 121, 168, 1, 236, 7, 178, 80, 137, 57, 21, 237, 7, 178, 80, 137, 57, 21, 238, 8, 179, 112, 107, 163, 88, 1, 239, 8, 171, 112, 73, 25, 197, 10, 240, 8, 43, 145, 203, 105, 85, 0, 241, 8, 51, 145, 145, 90, 37, 21, 242, 9, 51, 145, 201, 25, 141, 52, 2, 243, 9, 51, 145, 77, 25, 141, 52, 2, 244, 8, 51, 145, 107, 143, 52, 2, 245, 8, 51, 145, 145, 122, 164, 17, 246, 8, 43, 145, 73, 121, 164, 17, 247, 8, 43, 145, 203, 104, 163, 4, 248, 10, 173, 174, 71, 105, 166, 184, 50, 2, 249, 9, 51, 145, 201, 25, 37, 149, 4, 250, 9, 51, 145, 77, 25, 37, 149, 4, 251, 8, 51, 145, 107, 39, 149, 4, 252, 8, 43, 145, 73, 57, 169, 36, 253, 9, 59, 145, 77, 25, 171, 50, 1, 254, 8, 35, 145, 137, 99, 68, 0, 255, 9, 51, 145, 73, 25, 170, 50, 1, 0, 0, 0, 4, 255, 255, 0, 0]; // src/font/fonts/u8g2_font_spleen12x24_me_u8g2font.ts var u8g2_font_spleen12x24_me_u8g2font = [122, 2, 4, 2, 4, 5, 1, 4, 5, 12, 24, 0, 251, 15, 251, 17, 253, 2, 163, 5, 225, 18, 235, 32, 9, 140, 15, 127, 254, 255, 55, 0, 33, 14, 140, 15, 127, 134, 82, 255, 123, 34, 169, 158, 43, 0, 34, 12, 140, 15, 127, 172, 200, 255, 247, 252, 159, 0, 35, 21, 140, 15, 127, 86, 34, 223, 12, 14, 50, 34, 255, 223, 12, 14, 50, 34, 223, 115, 2, 36, 39, 140, 15, 127, 184, 84, 56, 24, 104, 20, 50, 137, 76, 34, 147, 200, 36, 58, 133, 112, 48, 84, 232, 36, 50, 137, 76, 34, 147, 200, 20, 154, 193, 64, 40, 213, 211, 2, 37, 27, 140, 15, 127, 14, 69, 27, 11, 35, 133, 213, 66, 170, 148, 42, 165, 138, 149, 194, 72, 97, 163, 25, 233, 57, 4, 38, 32, 140, 15, 127, 118, 131, 156, 68, 37, 242, 87, 18, 221, 32, 38, 81, 137, 20, 17, 213, 68, 165, 81, 137, 52, 131, 208, 64, 162, 231, 0, 39, 11, 140, 15, 127, 184, 212, 239, 249, 191, 2, 40, 18, 140, 15, 127, 146, 161, 210, 169, 82, 234, 111, 165, 90, 183, 123, 40, 0, 41, 17, 140, 15, 127, 232, 214, 83, 173, 212, 95, 74, 149, 14, 247, 36, 0, 42, 24, 140, 15, 127, 62, 20, 169, 36, 186, 65, 82, 54, 56, 136, 41, 7, 57, 137, 74, 164, 231, 45, 0, 43, 15, 140, 15, 127, 126, 40, 181, 27, 12, 116, 82, 123, 190, 5, 44, 12, 140, 15, 127, 254, 159, 72, 45, 237, 169, 1, 45, 12, 140, 15, 127, 254, 237, 96, 160, 231, 207, 1, 46, 11, 140, 15, 127, 254, 159, 75, 245, 92, 1, 47, 25, 140, 15, 127, 34, 169, 82, 170, 148, 42, 165, 74, 169, 82, 170, 148, 42, 165, 74, 169, 82, 170, 167, 1, 48, 36, 140, 15, 127, 102, 131, 149, 72, 35, 147, 200, 36, 170, 137, 104, 16, 209, 40, 36, 94, 104, 36, 131, 144, 100, 37, 145, 73, 100, 26, 145, 106, 176, 231, 6, 49, 19, 140, 15, 127, 118, 195, 65, 78, 161, 139, 72, 253, 239, 6, 3, 61, 39, 0, 50, 20, 140, 15, 127, 102, 131, 149, 72, 35, 147, 186, 244, 207, 36, 131, 131, 60, 23, 0, 51, 24, 140, 15, 127, 102, 131, 149, 72, 35, 147, 90, 202, 6, 90, 83, 39, 50, 141, 72, 53, 216, 115, 3, 52, 17, 140, 15, 127, 70, 82, 71, 254, 63, 26, 28, 4, 165, 238, 185, 1, 53, 25, 140, 15, 127, 70, 131, 131, 136, 76, 34, 117, 58, 24, 104, 77, 157, 200, 52, 34, 213, 96, 207, 13, 0, 54, 31, 140, 15, 127, 102, 131, 65, 72, 37, 145, 58, 29, 12, 68, 42, 141, 76, 34, 147, 200, 36, 50, 137, 76, 35, 82, 13, 246, 220, 0, 55, 16, 140, 15, 127, 70, 131, 131, 136, 76, 234, 210, 167, 190, 231, 12, 56, 34, 140, 15, 127, 102, 131, 149, 72, 35, 147, 200, 36, 50, 141, 72, 53, 88, 137, 52, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 57, 30, 140, 15, 127, 102, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 211, 168, 68, 131, 129, 212, 19, 149, 104, 48, 200, 115, 3, 58, 13, 140, 15, 127, 254, 74, 170, 231, 212, 158, 43, 0, 59, 14, 140, 15, 127, 254, 74, 170, 103, 45, 181, 180, 167, 6, 60, 12, 140, 15, 127, 198, 74, 127, 235, 239, 185, 0, 61, 16, 140, 15, 127, 126, 52, 56, 200, 179, 26, 28, 228, 249, 17, 0, 62, 12, 140, 15, 127, 86, 90, 127, 233, 239, 57, 4, 63, 19, 140, 15, 127, 102, 131, 149, 72, 35, 147, 90, 122, 106, 79, 36, 213, 115, 5, 64, 38, 140, 15, 127, 110, 6, 43, 145, 70, 38, 145, 73, 36, 11, 137, 100, 33, 145, 44, 36, 146, 133, 68, 178, 144, 72, 22, 18, 201, 96, 162, 213, 14, 6, 121, 78, 0, 65, 35, 140, 15, 127, 102, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 66, 37, 140, 15, 127, 70, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 81, 105, 6, 3, 145, 74, 35, 147, 200, 36, 50, 137, 76, 162, 210, 12, 6, 122, 110, 0, 67, 18, 140, 15, 127, 102, 131, 129, 70, 41, 245, 191, 213, 14, 6, 122, 46, 0, 68, 36, 140, 15, 127, 70, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 165, 25, 12, 244, 220, 0, 69, 22, 140, 15, 127, 102, 131, 129, 70, 41, 245, 116, 48, 16, 73, 189, 213, 14, 6, 122, 46, 0, 70, 19, 140, 15, 127, 102, 131, 129, 70, 41, 245, 116, 48, 16, 73, 253, 158, 75, 0, 71, 29, 140, 15, 127, 102, 131, 129, 70, 41, 245, 205, 64, 34, 147, 200, 36, 50, 137, 76, 34, 211, 168, 68, 131, 129, 158, 11, 0, 72, 35, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 73, 16, 140, 15, 127, 86, 131, 129, 78, 234, 255, 221, 96, 160, 231, 4, 74, 16, 140, 15, 127, 86, 131, 129, 78, 234, 255, 114, 54, 208, 115, 6, 75, 34, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 74, 35, 18, 13, 6, 41, 145, 149, 70, 38, 145, 73, 100, 18, 153, 68, 166, 231, 2, 76, 15, 140, 15, 127, 70, 82, 255, 111, 181, 131, 129, 158, 11, 0, 77, 36, 140, 15, 127, 70, 50, 201, 104, 50, 136, 12, 34, 138, 65, 66, 226, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 231, 2, 78, 39, 140, 15, 127, 70, 50, 201, 74, 178, 146, 12, 66, 146, 65, 72, 162, 208, 72, 20, 26, 137, 191, 81, 72, 52, 10, 137, 104, 16, 17, 13, 34, 170, 137, 106, 207, 5, 0, 79, 34, 140, 15, 127, 102, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 80, 26, 140, 15, 127, 70, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 81, 105, 6, 3, 145, 212, 239, 185, 4, 81, 36, 140, 15, 127, 102, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 226, 111, 20, 26, 201, 32, 53, 152, 106, 165, 122, 44, 0, 82, 36, 140, 15, 127, 70, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 81, 105, 6, 3, 145, 74, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 244, 92, 0, 83, 22, 140, 15, 127, 102, 131, 129, 70, 41, 117, 171, 29, 108, 77, 93, 106, 6, 3, 61, 55, 0, 84, 14, 140, 15, 127, 70, 131, 131, 152, 212, 255, 247, 92, 1, 85, 35, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 86, 32, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 35, 114, 37, 209, 13, 146, 122, 174, 0, 87, 36, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 226, 197, 32, 33, 25, 68, 6, 145, 209, 68, 166, 231, 2, 88, 34, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 35, 82, 13, 86, 34, 141, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 89, 27, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 163, 18, 13, 6, 82, 95, 78, 6, 247, 156, 0, 90, 17, 140, 15, 127, 70, 131, 131, 168, 75, 255, 212, 116, 112, 144, 231, 2, 91, 15, 140, 15, 255, 193, 64, 36, 245, 255, 127, 58, 24, 168, 1, 92, 25, 140, 15, 127, 164, 84, 43, 213, 74, 181, 82, 173, 84, 43, 213, 74, 181, 82, 173, 84, 43, 213, 67, 1, 93, 14, 140, 15, 239, 193, 64, 234, 255, 255, 209, 96, 160, 7, 94, 18, 140, 15, 127, 120, 116, 168, 144, 105, 68, 42, 137, 78, 207, 255, 53, 0, 95, 11, 140, 15, 127, 254, 255, 233, 224, 32, 13, 96, 11, 140, 15, 127, 176, 214, 61, 255, 159, 2, 97, 27, 140, 15, 127, 62, 28, 12, 178, 166, 162, 193, 64, 163, 146, 200, 36, 50, 137, 76, 163, 18, 13, 6, 122, 46, 0, 98, 31, 140, 15, 127, 70, 82, 167, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 165, 25, 12, 244, 220, 0, 99, 18, 140, 15, 127, 190, 28, 12, 52, 74, 169, 223, 106, 7, 3, 61, 23, 0, 100, 31, 140, 15, 127, 198, 82, 71, 131, 129, 70, 37, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 244, 92, 0, 101, 26, 140, 15, 127, 190, 28, 12, 52, 42, 137, 76, 34, 147, 200, 36, 131, 131, 136, 212, 86, 59, 24, 232, 185, 0, 102, 18, 140, 15, 127, 134, 3, 217, 82, 234, 112, 48, 200, 73, 253, 61, 103, 0, 103, 34, 140, 15, 127, 190, 28, 12, 52, 42, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 52, 42, 209, 96, 16, 213, 74, 149, 162, 193, 32, 3, 104, 30, 140, 15, 127, 70, 82, 167, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 233, 185, 0, 105, 16, 140, 15, 127, 134, 82, 61, 201, 32, 234, 63, 29, 228, 185, 1, 106, 15, 140, 15, 127, 134, 82, 61, 145, 212, 255, 151, 186, 65, 14, 107, 26, 140, 15, 127, 86, 82, 143, 188, 81, 73, 100, 3, 157, 66, 39, 145, 105, 84, 34, 43, 141, 74, 207, 5, 0, 108, 13, 140, 15, 127, 118, 82, 255, 79, 15, 244, 156, 0, 109, 22, 140, 15, 127, 190, 27, 68, 68, 18, 133, 70, 226, 255, 127, 38, 145, 73, 100, 122, 46, 0, 110, 29, 140, 15, 127, 190, 27, 12, 68, 42, 141, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 207, 5, 0, 111, 28, 140, 15, 127, 190, 28, 172, 68, 26, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 68, 170, 193, 158, 27, 0, 112, 30, 140, 15, 127, 190, 27, 12, 68, 42, 141, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 42, 205, 96, 32, 146, 122, 9, 113, 30, 140, 15, 127, 190, 28, 12, 52, 42, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 52, 42, 209, 96, 32, 245, 5, 0, 114, 15, 140, 15, 127, 190, 28, 12, 52, 42, 137, 212, 191, 231, 18, 115, 19, 140, 15, 127, 62, 28, 156, 72, 221, 14, 6, 90, 169, 147, 193, 61, 39, 0, 116, 17, 140, 15, 127, 118, 82, 135, 131, 65, 78, 234, 79, 15, 244, 156, 0, 117, 29, 140, 15, 127, 190, 147, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 84, 162, 193, 64, 207, 5, 0, 118, 25, 140, 15, 127, 190, 147, 73, 100, 18, 153, 68, 38, 145, 73, 100, 26, 145, 43, 137, 110, 144, 212, 115, 5, 119, 22, 140, 15, 127, 190, 147, 73, 100, 18, 153, 196, 255, 255, 70, 33, 17, 73, 6, 121, 46, 0, 120, 26, 140, 15, 127, 190, 147, 73, 100, 26, 145, 74, 162, 27, 4, 7, 57, 137, 74, 228, 70, 38, 145, 233, 185, 0, 121, 32, 140, 15, 127, 190, 147, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 84, 162, 193, 64, 234, 82, 51, 24, 104, 0, 122, 17, 140, 15, 127, 190, 27, 28, 68, 149, 254, 233, 224, 32, 207, 5, 0, 123, 19, 140, 15, 127, 208, 32, 167, 148, 250, 165, 112, 185, 53, 245, 91, 237, 32, 13, 124, 11, 140, 15, 127, 90, 169, 255, 255, 158, 22, 125, 19, 140, 15, 247, 65, 214, 212, 111, 181, 203, 161, 82, 234, 151, 186, 65, 30, 3, 126, 18, 140, 15, 127, 254, 100, 36, 81, 104, 20, 26, 133, 68, 180, 231, 111, 0, 127, 9, 140, 15, 127, 254, 255, 55, 0, 160, 9, 140, 15, 127, 254, 255, 55, 0, 161, 14, 140, 15, 127, 134, 82, 61, 145, 212, 255, 158, 43, 0, 162, 33, 140, 15, 127, 222, 72, 117, 131, 129, 70, 162, 210, 168, 52, 42, 141, 74, 163, 210, 168, 52, 42, 141, 76, 162, 27, 12, 116, 82, 61, 41, 0, 163, 25, 140, 15, 127, 134, 67, 133, 76, 163, 210, 168, 164, 134, 131, 129, 76, 234, 82, 170, 28, 28, 228, 185, 0, 164, 25, 140, 15, 127, 206, 69, 42, 137, 110, 144, 27, 172, 68, 254, 106, 176, 27, 228, 36, 42, 145, 158, 115, 0, 165, 30, 140, 15, 127, 70, 50, 137, 76, 35, 114, 37, 145, 73, 116, 131, 224, 32, 169, 27, 12, 116, 82, 221, 96, 160, 147, 234, 185, 2, 166, 14, 140, 15, 127, 90, 169, 191, 39, 146, 250, 123, 90, 0, 167, 29, 140, 15, 127, 210, 129, 76, 162, 210, 168, 180, 218, 225, 96, 37, 242, 87, 131, 225, 214, 74, 163, 146, 200, 6, 122, 82, 0, 168, 11, 140, 15, 127, 66, 145, 123, 254, 127, 5, 169, 35, 140, 15, 127, 30, 15, 86, 34, 141, 76, 34, 89, 72, 20, 26, 137, 66, 35, 81, 104, 36, 10, 141, 68, 178, 144, 200, 52, 34, 213, 96, 207, 13, 0, 170, 22, 140, 15, 127, 244, 32, 43, 213, 13, 100, 18, 153, 68, 55, 208, 99, 6, 123, 254, 75, 0, 171, 24, 140, 15, 127, 126, 40, 81, 73, 84, 18, 149, 68, 37, 209, 73, 116, 18, 157, 68, 39, 209, 115, 13, 172, 13, 140, 15, 127, 126, 52, 56, 136, 250, 158, 31, 1, 173, 10, 140, 15, 127, 254, 241, 96, 207, 63, 174, 37, 140, 15, 127, 30, 15, 86, 34, 141, 76, 162, 152, 88, 40, 18, 18, 133, 34, 33, 81, 76, 44, 20, 9, 137, 66, 145, 144, 200, 52, 34, 213, 96, 207, 13, 0, 175, 10, 140, 15, 127, 240, 96, 207, 255, 63, 176, 19, 140, 15, 127, 210, 65, 78, 34, 147, 200, 36, 50, 137, 110, 144, 231, 255, 8, 177, 18, 140, 15, 127, 158, 75, 237, 6, 3, 157, 212, 158, 98, 48, 208, 243, 22, 178, 17, 140, 15, 127, 210, 65, 78, 34, 85, 122, 34, 27, 236, 249, 47, 1, 179, 19, 140, 15, 127, 210, 65, 78, 34, 21, 110, 165, 50, 137, 110, 144, 231, 63, 5, 180, 11, 140, 15, 127, 10, 165, 123, 254, 63, 6, 181, 18, 140, 15, 127, 190, 19, 249, 255, 143, 38, 131, 140, 98, 98, 234, 37, 0, 182, 32, 140, 15, 127, 102, 131, 129, 70, 33, 241, 255, 141, 66, 34, 26, 68, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 209, 115, 1, 183, 11, 140, 15, 127, 254, 137, 84, 207, 63, 1, 184, 11, 140, 15, 127, 254, 127, 41, 181, 52, 3, 185, 15, 140, 15, 127, 90, 229, 112, 16, 245, 114, 144, 231, 63, 5, 186, 22, 140, 15, 127, 210, 65, 78, 34, 147, 200, 36, 50, 137, 110, 144, 7, 13, 246, 252, 151, 0, 187, 24, 140, 15, 127, 126, 36, 209, 73, 116, 18, 157, 68, 39, 81, 73, 84, 18, 149, 68, 37, 209, 243, 4, 188, 26, 140, 15, 127, 176, 114, 56, 136, 58, 178, 17, 13, 18, 74, 63, 145, 90, 232, 20, 186, 193, 82, 170, 199, 2, 189, 26, 140, 15, 127, 176, 114, 56, 136, 58, 178, 17, 13, 18, 74, 159, 12, 50, 18, 83, 165, 39, 178, 193, 30, 10, 190, 28, 140, 15, 127, 236, 32, 39, 145, 10, 183, 50, 137, 205, 32, 162, 244, 39, 82, 11, 157, 66, 55, 88, 74, 245, 88, 0, 191, 19, 140, 15, 127, 134, 82, 61, 145, 212, 210, 83, 51, 141, 72, 53, 216, 115, 3, 192, 37, 140, 15, 31, 173, 61, 106, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 146, 193, 65, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 122, 46, 0, 193, 37, 140, 15, 63, 165, 61, 106, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 146, 193, 65, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 122, 46, 0, 194, 40, 140, 15, 167, 65, 78, 162, 18, 233, 33, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 195, 41, 140, 15, 159, 141, 102, 48, 208, 104, 246, 152, 193, 74, 164, 145, 73, 100, 18, 153, 68, 38, 145, 73, 6, 7, 17, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 233, 185, 0, 196, 37, 140, 15, 119, 145, 123, 200, 96, 37, 210, 200, 36, 50, 137, 76, 34, 147, 200, 36, 131, 131, 136, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 244, 92, 0, 197, 41, 140, 15, 167, 65, 78, 34, 147, 232, 6, 185, 193, 74, 164, 145, 73, 100, 18, 153, 68, 38, 145, 73, 6, 7, 17, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 233, 185, 0, 198, 35, 140, 15, 127, 102, 131, 129, 70, 162, 210, 168, 52, 42, 141, 74, 163, 210, 168, 6, 55, 86, 26, 149, 70, 165, 81, 105, 84, 26, 149, 102, 160, 231, 2, 199, 20, 140, 15, 127, 102, 131, 129, 70, 41, 245, 191, 213, 14, 6, 58, 169, 165, 25, 0, 200, 24, 140, 15, 31, 173, 61, 106, 48, 208, 40, 165, 158, 14, 6, 34, 169, 183, 218, 193, 64, 207, 5, 0, 201, 24, 140, 15, 63, 165, 61, 106, 48, 208, 40, 165, 158, 14, 6, 34, 169, 183, 218, 193, 64, 207, 5, 0, 202, 27, 140, 15, 167, 65, 78, 162, 18, 233, 33, 131, 129, 70, 41, 245, 116, 48, 16, 73, 189, 213, 14, 6, 122, 46, 0, 203, 24, 140, 15, 119, 145, 123, 200, 96, 160, 81, 74, 61, 29, 12, 68, 82, 111, 181, 131, 129, 158, 11, 0, 204, 18, 140, 15, 39, 173, 61, 102, 48, 208, 73, 253, 191, 27, 12, 244, 156, 0, 205, 18, 140, 15, 55, 165, 61, 106, 48, 208, 73, 253, 191, 27, 12, 244, 156, 0, 206, 21, 140, 15, 167, 65, 78, 162, 18, 233, 17, 131, 129, 78, 234, 255, 221, 96, 160, 231, 4, 207, 18, 140, 15, 119, 145, 123, 196, 96, 160, 147, 250, 127, 55, 24, 232, 57, 1, 208, 35, 140, 15, 127, 70, 131, 27, 213, 68, 38, 145, 73, 100, 18, 153, 68, 166, 24, 108, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 106, 50, 184, 231, 4, 209, 44, 140, 15, 159, 141, 102, 48, 208, 104, 246, 8, 153, 100, 37, 89, 73, 6, 33, 201, 32, 36, 81, 104, 36, 10, 141, 196, 223, 40, 36, 26, 133, 68, 52, 136, 136, 6, 17, 213, 68, 181, 231, 2, 210, 36, 140, 15, 31, 173, 61, 106, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 17, 169, 6, 123, 110, 0, 211, 36, 140, 15, 63, 165, 61, 106, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 17, 169, 6, 123, 110, 0, 212, 39, 140, 15, 167, 65, 78, 162, 18, 233, 33, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 213, 40, 140, 15, 159, 141, 102, 48, 208, 104, 246, 152, 193, 74, 164, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 164, 26, 236, 185, 1, 214, 36, 140, 15, 119, 145, 123, 200, 96, 37, 210, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 35, 82, 13, 246, 220, 0, 215, 24, 140, 15, 127, 158, 202, 52, 34, 149, 68, 55, 72, 74, 149, 131, 156, 68, 37, 210, 200, 244, 60, 5, 216, 42, 140, 15, 127, 122, 209, 96, 160, 17, 105, 84, 19, 209, 32, 34, 26, 68, 52, 10, 137, 70, 33, 241, 23, 26, 137, 66, 35, 25, 132, 36, 131, 144, 70, 36, 26, 12, 66, 82, 61, 3, 217, 37, 140, 15, 31, 173, 61, 70, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 61, 23, 0, 218, 37, 140, 15, 63, 165, 61, 70, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 61, 23, 0, 219, 39, 140, 15, 167, 65, 78, 162, 18, 233, 101, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 26, 149, 104, 48, 208, 115, 1, 220, 36, 140, 15, 119, 145, 123, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 244, 92, 0, 221, 29, 140, 15, 63, 165, 61, 70, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 84, 162, 193, 64, 234, 203, 201, 224, 158, 19, 0, 222, 33, 140, 15, 127, 46, 164, 166, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 165, 25, 12, 68, 82, 123, 26, 0, 223, 34, 140, 15, 127, 102, 131, 156, 68, 37, 242, 111, 84, 138, 65, 74, 51, 82, 105, 100, 18, 153, 68, 38, 81, 132, 36, 10, 137, 70, 50, 200, 51, 3, 224, 29, 140, 15, 127, 176, 214, 61, 126, 48, 200, 154, 138, 6, 3, 141, 74, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 225, 29, 140, 15, 127, 10, 165, 123, 146, 193, 32, 107, 42, 26, 12, 52, 42, 137, 76, 34, 147, 200, 52, 42, 209, 96, 160, 231, 2, 226, 33, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 244, 96, 144, 53, 21, 13, 6, 26, 149, 68, 38, 145, 73, 100, 26, 149, 104, 48, 208, 115, 1, 227, 35, 140, 15, 127, 176, 72, 51, 200, 72, 44, 52, 154, 61, 124, 48, 200, 154, 138, 6, 3, 141, 74, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 228, 29, 140, 15, 127, 66, 145, 123, 210, 193, 32, 107, 42, 26, 12, 52, 42, 137, 76, 34, 147, 200, 52, 42, 209, 96, 160, 231, 2, 229, 34, 140, 15, 127, 244, 32, 39, 145, 73, 116, 131, 60, 126, 48, 200, 154, 138, 6, 3, 141, 74, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 230, 31, 140, 15, 127, 62, 156, 12, 82, 131, 132, 76, 34, 147, 136, 6, 3, 141, 66, 38, 145, 73, 100, 18, 157, 98, 183, 24, 228, 185, 0, 231, 19, 140, 15, 127, 190, 28, 12, 52, 74, 169, 223, 106, 7, 3, 157, 212, 210, 12, 232, 29, 140, 15, 127, 176, 214, 61, 197, 96, 160, 81, 73, 100, 18, 153, 68, 38, 25, 28, 68, 164, 182, 218, 193, 64, 207, 5, 0, 233, 29, 140, 15, 127, 10, 165, 123, 154, 193, 64, 163, 146, 200, 36, 50, 137, 76, 50, 56, 136, 72, 109, 181, 131, 129, 158, 11, 0, 234, 33, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 248, 96, 160, 81, 73, 100, 18, 153, 68, 38, 25, 28, 68, 164, 182, 218, 193, 64, 207, 5, 0, 235, 29, 140, 15, 127, 66, 145, 123, 218, 193, 64, 163, 146, 200, 36, 50, 137, 76, 50, 56, 136, 72, 109, 181, 131, 129, 158, 11, 0, 236, 16, 140, 15, 127, 176, 214, 61, 197, 32, 234, 63, 29, 228, 185, 1, 237, 16, 140, 15, 127, 10, 165, 123, 154, 65, 212, 127, 58, 200, 115, 3, 238, 20, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 248, 32, 234, 63, 29, 228, 185, 1, 239, 16, 140, 15, 127, 66, 145, 123, 218, 65, 212, 127, 58, 200, 115, 3, 240, 36, 140, 15, 127, 168, 68, 55, 72, 42, 7, 57, 137, 86, 55, 88, 137, 52, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 136, 84, 131, 61, 55, 0, 241, 37, 140, 15, 127, 176, 72, 51, 200, 72, 44, 52, 154, 61, 122, 48, 16, 169, 52, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 61, 23, 0, 242, 30, 140, 15, 127, 176, 214, 61, 197, 96, 37, 210, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 35, 82, 13, 246, 220, 0, 243, 30, 140, 15, 127, 10, 165, 123, 154, 193, 74, 164, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 164, 26, 236, 185, 1, 244, 34, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 248, 96, 37, 210, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 35, 82, 13, 246, 220, 0, 245, 36, 140, 15, 127, 176, 72, 51, 200, 72, 44, 52, 154, 61, 126, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 17, 169, 6, 123, 110, 0, 246, 30, 140, 15, 127, 66, 145, 123, 218, 193, 74, 164, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 164, 26, 236, 185, 1, 247, 17, 140, 15, 127, 190, 149, 234, 41, 6, 3, 61, 133, 84, 207, 115, 0, 248, 33, 140, 15, 127, 190, 202, 12, 22, 18, 209, 68, 53, 17, 13, 34, 26, 133, 196, 11, 141, 100, 16, 146, 172, 36, 35, 137, 98, 176, 201, 51, 7, 249, 31, 140, 15, 127, 176, 214, 61, 92, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 61, 23, 0, 250, 31, 140, 15, 127, 10, 165, 123, 10, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 244, 92, 0, 251, 35, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 176, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 163, 18, 13, 6, 122, 46, 0, 252, 31, 140, 15, 127, 66, 145, 123, 74, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 244, 92, 0, 253, 34, 140, 15, 127, 10, 165, 123, 10, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 164, 46, 53, 131, 129, 6, 254, 32, 140, 15, 127, 58, 169, 167, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 165, 25, 12, 68, 82, 47, 1, 255, 34, 140, 15, 127, 66, 145, 123, 74, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 164, 46, 53, 131, 129, 6, 0, 0, 0, 4, 255, 255, 1, 0, 39, 140, 15, 247, 193, 64, 15, 31, 172, 68, 26, 153, 68, 38, 145, 73, 100, 18, 153, 100, 112, 16, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 158, 11, 0, 1, 1, 31, 140, 15, 127, 78, 6, 3, 61, 122, 48, 200, 154, 138, 6, 3, 141, 74, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 1, 2, 41, 140, 15, 31, 137, 76, 162, 27, 228, 65, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 1, 3, 34, 140, 15, 127, 74, 137, 76, 162, 27, 228, 241, 131, 65, 214, 84, 52, 24, 104, 84, 18, 153, 68, 38, 145, 105, 84, 162, 193, 64, 207, 5, 0, 1, 4, 39, 140, 15, 127, 102, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 83, 14, 165, 218, 65, 24, 1, 5, 30, 140, 15, 127, 62, 28, 12, 178, 166, 162, 193, 64, 163, 146, 200, 36, 50, 137, 76, 163, 18, 13, 6, 74, 83, 237, 32, 12, 1, 6, 21, 140, 15, 63, 165, 61, 106, 48, 208, 40, 165, 254, 183, 218, 193, 64, 207, 5, 0, 1, 7, 21, 140, 15, 127, 10, 165, 123, 154, 193, 64, 163, 148, 250, 173, 118, 48, 208, 115, 1, 1, 8, 24, 140, 15, 167, 65, 78, 162, 18, 233, 33, 131, 129, 70, 41, 245, 191, 213, 14, 6, 122, 46, 0, 1, 9, 25, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 248, 96, 160, 81, 74, 253, 86, 59, 24, 232, 185, 0, 1, 10, 21, 140, 15, 127, 136, 84, 143, 26, 12, 52, 74, 169, 255, 173, 118, 48, 208, 115, 1, 1, 11, 21, 140, 15, 127, 90, 169, 158, 124, 48, 208, 40, 165, 126, 171, 29, 12, 244, 92, 0, 1, 12, 24, 140, 15, 23, 145, 74, 162, 27, 228, 65, 131, 129, 70, 41, 245, 191, 213, 14, 6, 122, 46, 0, 1, 13, 25, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 146, 193, 64, 163, 148, 250, 173, 118, 48, 208, 115, 1, 1, 14, 42, 140, 15, 23, 145, 74, 162, 27, 228, 33, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 165, 25, 12, 244, 220, 0, 1, 15, 36, 140, 15, 23, 145, 74, 162, 27, 228, 161, 30, 13, 6, 26, 149, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 26, 149, 104, 48, 208, 115, 1, 1, 16, 36, 140, 15, 127, 70, 131, 27, 213, 68, 38, 145, 73, 100, 18, 153, 68, 166, 24, 108, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 106, 50, 184, 231, 4, 1, 17, 34, 140, 15, 127, 198, 186, 193, 82, 42, 26, 12, 52, 42, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 52, 42, 209, 96, 160, 231, 2, 1, 18, 25, 140, 15, 247, 193, 64, 15, 31, 12, 52, 74, 169, 167, 131, 129, 72, 234, 173, 118, 48, 208, 115, 1, 1, 19, 30, 140, 15, 127, 78, 6, 3, 61, 124, 48, 208, 168, 36, 50, 137, 76, 34, 147, 12, 14, 34, 82, 91, 237, 96, 160, 231, 2, 1, 20, 28, 140, 15, 31, 137, 76, 162, 27, 228, 65, 131, 129, 70, 41, 245, 116, 48, 16, 73, 189, 213, 14, 6, 122, 46, 0, 1, 21, 33, 140, 15, 127, 74, 137, 76, 162, 27, 228, 41, 6, 3, 141, 74, 34, 147, 200, 36, 50, 201, 224, 32, 34, 181, 213, 14, 6, 122, 46, 0, 1, 22, 25, 140, 15, 127, 136, 84, 143, 26, 12, 52, 74, 169, 167, 131, 129, 72, 234, 173, 118, 48, 208, 115, 1, 1, 23, 29, 140, 15, 127, 90, 169, 158, 124, 48, 208, 168, 36, 50, 137, 76, 34, 147, 12, 14, 34, 82, 91, 237, 96, 160, 231, 2, 1, 24, 25, 140, 15, 127, 102, 131, 129, 70, 41, 245, 116, 48, 16, 73, 189, 213, 14, 6, 74, 83, 237, 32, 12, 1, 25, 30, 140, 15, 127, 190, 28, 12, 52, 42, 137, 76, 34, 147, 200, 36, 131, 131, 136, 212, 86, 59, 24, 40, 77, 181, 131, 48, 0, 1, 26, 28, 140, 15, 23, 145, 74, 162, 27, 228, 65, 131, 129, 70, 41, 245, 116, 48, 16, 73, 189, 213, 14, 6, 122, 46, 0, 1, 27, 34, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 146, 193, 64, 163, 146, 200, 36, 50, 137, 76, 50, 56, 136, 72, 109, 181, 131, 129, 158, 11, 0, 1, 28, 35, 140, 15, 167, 65, 78, 162, 18, 233, 33, 131, 129, 70, 41, 245, 205, 64, 34, 147, 200, 36, 50, 137, 76, 34, 211, 168, 68, 131, 129, 158, 11, 0, 1, 29, 42, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 248, 96, 160, 81, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 131, 168, 86, 170, 20, 13, 6, 25, 0, 1, 30, 35, 140, 15, 31, 137, 76, 162, 27, 228, 65, 131, 129, 70, 41, 245, 205, 64, 34, 147, 200, 36, 50, 137, 76, 34, 211, 168, 68, 131, 129, 158, 11, 0, 1, 31, 41, 140, 15, 127, 74, 137, 76, 162, 27, 228, 41, 6, 3, 141, 74, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 68, 181, 82, 165, 104, 48, 200, 0, 1, 32, 32, 140, 15, 127, 136, 84, 143, 26, 12, 52, 74, 169, 111, 6, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 244, 92, 0, 1, 33, 38, 140, 15, 127, 90, 169, 158, 124, 48, 208, 168, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 168, 68, 131, 65, 84, 43, 85, 138, 6, 131, 12, 0, 1, 34, 31, 140, 15, 127, 102, 131, 129, 70, 41, 245, 205, 64, 34, 147, 200, 36, 50, 137, 76, 34, 211, 168, 68, 131, 129, 78, 106, 105, 6, 1, 35, 39, 140, 15, 127, 140, 212, 210, 158, 102, 48, 208, 168, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 168, 68, 131, 65, 84, 43, 85, 138, 6, 131, 12, 0, 1, 36, 40, 140, 15, 167, 65, 78, 162, 18, 233, 101, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 25, 28, 68, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 231, 2, 1, 37, 35, 140, 15, 167, 65, 78, 162, 18, 233, 165, 78, 7, 3, 145, 74, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 1, 38, 37, 140, 15, 127, 70, 50, 137, 76, 49, 120, 33, 147, 200, 36, 50, 137, 76, 50, 56, 136, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 207, 5, 0, 1, 39, 34, 140, 15, 127, 70, 202, 193, 78, 42, 29, 12, 68, 42, 141, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 207, 5, 0, 1, 40, 23, 140, 15, 159, 141, 102, 48, 208, 104, 246, 144, 193, 64, 39, 245, 255, 110, 48, 208, 115, 2, 1, 41, 23, 140, 15, 127, 176, 72, 51, 200, 72, 44, 52, 154, 61, 126, 16, 245, 159, 14, 242, 220, 0, 1, 42, 20, 140, 15, 247, 193, 64, 143, 30, 12, 116, 82, 255, 239, 6, 3, 61, 39, 0, 1, 43, 18, 140, 15, 127, 78, 6, 3, 61, 124, 16, 245, 159, 14, 242, 220, 0, 1, 44, 22, 140, 15, 31, 137, 76, 162, 27, 228, 49, 131, 129, 78, 234, 255, 221, 96, 160, 231, 4, 1, 45, 21, 140, 15, 127, 74, 137, 76, 162, 27, 228, 41, 6, 81, 255, 233, 32, 207, 13, 0, 1, 46, 20, 140, 15, 127, 86, 131, 129, 78, 234, 255, 221, 96, 160, 52, 213, 14, 210, 0, 1, 47, 20, 140, 15, 127, 134, 82, 61, 201, 32, 234, 63, 29, 36, 77, 181, 131, 56, 0, 1, 48, 20, 140, 15, 127, 136, 84, 15, 26, 12, 116, 82, 255, 239, 6, 3, 61, 39, 0, 1, 49, 15, 140, 15, 127, 190, 28, 68, 253, 167, 131, 60, 55, 0, 1, 50, 39, 140, 15, 127, 54, 131, 204, 32, 162, 210, 168, 52, 42, 141, 74, 163, 210, 168, 52, 42, 141, 74, 163, 210, 168, 52, 42, 141, 74, 35, 154, 12, 18, 131, 60, 55, 0, 1, 51, 22, 140, 15, 127, 86, 34, 247, 216, 65, 200, 255, 255, 209, 32, 34, 117, 169, 27, 132, 0, 1, 52, 22, 140, 15, 167, 65, 78, 162, 18, 233, 17, 131, 129, 78, 234, 255, 114, 54, 208, 115, 6, 1, 53, 21, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 10, 169, 255, 47, 117, 131, 28, 0, 1, 54, 36, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 74, 35, 18, 13, 6, 41, 145, 149, 70, 38, 145, 73, 100, 18, 153, 68, 102, 106, 105, 7, 1, 55, 28, 140, 15, 127, 86, 82, 143, 188, 81, 73, 100, 3, 157, 66, 39, 145, 105, 84, 34, 43, 141, 74, 39, 181, 52, 3, 1, 56, 25, 140, 15, 127, 62, 20, 121, 163, 146, 200, 20, 186, 65, 80, 161, 147, 200, 52, 42, 145, 123, 78, 0, 1, 57, 17, 140, 15, 63, 165, 61, 70, 234, 255, 173, 118, 48, 208, 115, 1, 1, 58, 16, 140, 15, 63, 165, 61, 76, 234, 255, 233, 129, 158, 19, 0, 1, 59, 17, 140, 15, 127, 70, 82, 255, 111, 181, 131, 129, 78, 106, 105, 6, 1, 60, 16, 140, 15, 127, 118, 82, 255, 79, 15, 132, 82, 75, 51, 0, 1, 61, 21, 140, 15, 23, 145, 74, 162, 27, 228, 33, 82, 255, 111, 181, 131, 129, 158, 11, 0, 1, 62, 19, 140, 15, 23, 145, 74, 162, 27, 228, 81, 82, 255, 79, 15, 244, 156, 0, 1, 63, 17, 140, 15, 127, 70, 82, 127, 228, 169, 91, 237, 96, 160, 231, 2, 1, 64, 18, 140, 15, 127, 118, 82, 127, 34, 147, 200, 164, 78, 15, 244, 156, 0, 1, 65, 21, 140, 15, 127, 70, 82, 47, 116, 131, 224, 82, 121, 234, 86, 59, 24, 232, 185, 0, 1, 66, 20, 140, 15, 127, 118, 82, 47, 116, 131, 224, 82, 121, 234, 244, 64, 207, 9, 0, 1, 67, 41, 140, 15, 55, 165, 61, 72, 38, 89, 73, 86, 146, 65, 72, 50, 8, 73, 20, 26, 137, 66, 35, 241, 55, 10, 137, 70, 33, 17, 13, 34, 162, 65, 68, 53, 81, 237, 185, 0, 1, 68, 32, 140, 15, 127, 10, 165, 123, 138, 193, 64, 164, 210, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 244, 92, 0, 1, 69, 41, 140, 15, 127, 70, 50, 201, 74, 178, 146, 12, 66, 146, 65, 72, 162, 208, 72, 20, 26, 137, 191, 81, 72, 52, 10, 137, 104, 16, 17, 13, 34, 170, 137, 106, 38, 181, 180, 3, 1, 70, 30, 140, 15, 127, 190, 27, 12, 68, 42, 141, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 204, 212, 210, 14, 1, 71, 45, 140, 15, 23, 145, 74, 162, 27, 228, 33, 50, 201, 74, 178, 146, 12, 66, 146, 65, 72, 162, 208, 72, 20, 26, 137, 191, 81, 72, 52, 10, 137, 104, 16, 17, 13, 34, 170, 137, 106, 207, 5, 0, 1, 72, 36, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 252, 96, 32, 82, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 122, 46, 0, 1, 73, 32, 140, 15, 119, 169, 165, 61, 213, 96, 32, 82, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 122, 46, 0, 1, 74, 41, 140, 15, 127, 70, 50, 201, 74, 178, 146, 12, 66, 146, 65, 72, 162, 208, 72, 20, 26, 137, 191, 81, 72, 52, 10, 137, 104, 16, 17, 13, 34, 170, 137, 106, 106, 41, 220, 3, 1, 75, 31, 140, 15, 127, 190, 27, 12, 68, 42, 141, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 106, 41, 220, 3, 1, 76, 38, 140, 15, 247, 193, 64, 15, 31, 172, 68, 26, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 68, 170, 193, 158, 27, 0, 1, 77, 32, 140, 15, 127, 78, 6, 3, 61, 124, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 17, 169, 6, 123, 110, 0, 1, 78, 40, 140, 15, 31, 137, 76, 162, 27, 228, 65, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 1, 79, 34, 140, 15, 127, 74, 137, 76, 162, 27, 228, 41, 6, 43, 145, 70, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 26, 145, 106, 176, 231, 6, 1, 80, 40, 140, 15, 47, 137, 74, 162, 146, 232, 49, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 1, 81, 36, 140, 15, 127, 184, 68, 37, 81, 73, 84, 18, 61, 197, 96, 37, 210, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 35, 82, 13, 246, 220, 0, 1, 82, 37, 140, 15, 127, 102, 131, 129, 70, 162, 210, 168, 52, 42, 141, 74, 163, 210, 168, 52, 131, 140, 149, 70, 165, 81, 105, 84, 26, 153, 68, 55, 24, 232, 185, 0, 1, 83, 29, 140, 15, 127, 190, 92, 12, 50, 138, 133, 196, 159, 12, 38, 102, 18, 153, 68, 38, 209, 41, 118, 139, 65, 158, 11, 0, 1, 84, 39, 140, 15, 63, 165, 61, 102, 48, 16, 169, 52, 50, 137, 76, 34, 147, 200, 36, 42, 205, 96, 32, 82, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 158, 11, 0, 1, 85, 19, 140, 15, 127, 10, 165, 123, 154, 193, 64, 163, 146, 72, 253, 123, 46, 1, 1, 86, 38, 140, 15, 127, 70, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 81, 105, 6, 3, 145, 74, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 76, 45, 237, 0, 1, 87, 18, 140, 15, 127, 190, 28, 12, 52, 42, 137, 212, 63, 151, 90, 218, 1, 1, 88, 42, 140, 15, 23, 145, 74, 162, 27, 228, 33, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 81, 105, 6, 3, 145, 74, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 244, 92, 0, 1, 89, 23, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 146, 193, 64, 163, 146, 72, 253, 123, 46, 1, 1, 90, 24, 140, 15, 63, 165, 61, 106, 48, 208, 40, 165, 110, 181, 131, 173, 169, 75, 205, 96, 160, 231, 6, 1, 91, 22, 140, 15, 127, 10, 165, 123, 146, 193, 137, 212, 237, 96, 160, 149, 58, 25, 220, 115, 2, 1, 92, 28, 140, 15, 167, 65, 78, 162, 18, 233, 33, 131, 129, 70, 41, 117, 171, 29, 108, 77, 93, 106, 6, 3, 61, 55, 0, 1, 93, 26, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 244, 224, 68, 234, 118, 48, 208, 74, 157, 12, 238, 57, 1, 1, 94, 24, 140, 15, 127, 102, 131, 129, 70, 41, 117, 171, 29, 108, 77, 93, 106, 6, 3, 161, 212, 210, 14, 1, 95, 21, 140, 15, 127, 62, 28, 156, 72, 221, 14, 6, 90, 169, 147, 193, 157, 212, 210, 14, 1, 96, 28, 140, 15, 23, 145, 74, 162, 27, 228, 65, 131, 129, 70, 41, 117, 171, 29, 108, 77, 93, 106, 6, 3, 61, 55, 0, 1, 97, 26, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 138, 193, 137, 212, 237, 96, 160, 149, 58, 25, 220, 115, 2, 1, 98, 17, 140, 15, 127, 70, 131, 131, 152, 212, 255, 183, 82, 75, 51, 0, 1, 99, 20, 140, 15, 127, 118, 82, 135, 131, 65, 78, 234, 79, 15, 132, 82, 75, 51, 0, 1, 100, 20, 140, 15, 23, 145, 74, 162, 27, 228, 33, 131, 131, 152, 212, 255, 247, 92, 1, 1, 101, 23, 140, 15, 23, 145, 74, 162, 27, 228, 81, 82, 135, 131, 65, 78, 234, 79, 15, 244, 156, 0, 1, 102, 18, 140, 15, 127, 70, 131, 131, 152, 212, 135, 131, 161, 212, 239, 185, 2, 1, 103, 22, 140, 15, 127, 118, 82, 135, 131, 65, 78, 42, 28, 12, 114, 82, 79, 15, 244, 156, 0, 1, 104, 42, 140, 15, 159, 141, 102, 48, 208, 104, 246, 8, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 244, 92, 0, 1, 105, 38, 140, 15, 127, 176, 72, 51, 200, 72, 44, 52, 154, 61, 90, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 61, 23, 0, 1, 106, 39, 140, 15, 247, 193, 64, 15, 150, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 84, 162, 193, 64, 207, 5, 0, 1, 107, 33, 140, 15, 127, 78, 6, 3, 61, 88, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 61, 23, 0, 1, 108, 41, 140, 15, 31, 137, 76, 162, 27, 228, 33, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 1, 109, 35, 140, 15, 127, 74, 137, 76, 162, 27, 228, 225, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 1, 110, 42, 140, 15, 167, 65, 78, 34, 147, 232, 6, 41, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 244, 92, 0, 1, 111, 37, 140, 15, 127, 244, 32, 39, 145, 73, 116, 131, 60, 92, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 61, 23, 0, 1, 112, 41, 140, 15, 47, 137, 74, 162, 146, 232, 17, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 1, 113, 37, 140, 15, 127, 184, 68, 37, 81, 73, 84, 18, 61, 92, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 61, 23, 0, 1, 114, 39, 140, 15, 127, 70, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 40, 77, 181, 131, 48, 0, 1, 115, 32, 140, 15, 127, 190, 147, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 84, 162, 193, 64, 105, 170, 29, 132, 1, 1, 116, 42, 140, 15, 167, 65, 78, 162, 18, 233, 101, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 196, 139, 65, 66, 50, 136, 12, 34, 163, 137, 76, 207, 5, 0, 1, 117, 29, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 176, 76, 34, 147, 200, 36, 254, 255, 55, 10, 137, 72, 50, 200, 115, 1, 1, 118, 32, 140, 15, 167, 65, 78, 162, 18, 233, 101, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 37, 26, 12, 164, 190, 156, 12, 238, 57, 1, 1, 119, 39, 140, 15, 127, 184, 114, 144, 147, 168, 68, 122, 176, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 163, 18, 13, 6, 82, 151, 154, 193, 64, 3, 1, 120, 29, 140, 15, 119, 145, 123, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 169, 47, 39, 131, 123, 78, 0, 1, 121, 20, 140, 15, 63, 165, 61, 102, 112, 16, 117, 233, 159, 154, 14, 14, 242, 92, 0, 1, 122, 20, 140, 15, 127, 10, 165, 123, 138, 193, 65, 84, 233, 159, 14, 14, 242, 92, 0, 1, 123, 21, 140, 15, 127, 136, 84, 143, 25, 28, 68, 93, 250, 167, 166, 131, 131, 60, 23, 0, 1, 124, 20, 140, 15, 127, 90, 169, 158, 120, 112, 16, 85, 250, 167, 131, 131, 60, 23, 0, 1, 125, 23, 140, 15, 23, 145, 74, 162, 27, 228, 33, 131, 131, 168, 75, 255, 212, 116, 112, 144, 231, 2, 1, 126, 24, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 252, 224, 32, 170, 244, 79, 7, 7, 121, 46, 0, 1, 127, 17, 140, 15, 127, 134, 3, 217, 82, 42, 28, 68, 253, 239, 57, 3, 1, 205, 41, 140, 15, 23, 145, 74, 162, 27, 228, 65, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 1, 206, 34, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 138, 193, 32, 107, 42, 26, 12, 52, 42, 137, 76, 34, 147, 200, 52, 42, 209, 96, 160, 231, 2, 1, 207, 22, 140, 15, 23, 145, 74, 162, 27, 228, 49, 131, 129, 78, 234, 255, 221, 96, 160, 231, 4, 1, 208, 21, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 146, 65, 212, 127, 58, 200, 115, 3, 1, 209, 40, 140, 15, 23, 145, 74, 162, 27, 228, 65, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 1, 210, 35, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 146, 193, 74, 164, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 70, 164, 26, 236, 185, 1, 1, 211, 41, 140, 15, 23, 145, 74, 162, 27, 228, 33, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 1, 212, 36, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 188, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 163, 18, 13, 6, 122, 46, 0, 1, 226, 39, 140, 15, 247, 193, 64, 15, 31, 12, 52, 18, 149, 70, 165, 81, 105, 84, 26, 149, 70, 53, 184, 177, 210, 168, 52, 42, 141, 74, 163, 210, 168, 52, 3, 61, 23, 0, 1, 227, 35, 140, 15, 127, 78, 6, 3, 61, 122, 50, 72, 13, 18, 50, 137, 76, 34, 26, 12, 52, 10, 153, 68, 38, 145, 73, 116, 138, 221, 98, 144, 231, 2, 1, 230, 35, 140, 15, 23, 145, 74, 162, 27, 228, 65, 131, 129, 70, 41, 245, 205, 64, 34, 147, 200, 36, 50, 137, 76, 34, 211, 168, 68, 131, 129, 158, 11, 0, 1, 231, 42, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 146, 193, 64, 163, 146, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 163, 18, 13, 6, 81, 173, 84, 41, 26, 12, 50, 0, 1, 232, 40, 140, 15, 23, 145, 74, 162, 27, 228, 33, 50, 137, 76, 34, 147, 200, 36, 50, 137, 74, 35, 18, 13, 6, 41, 145, 149, 70, 38, 145, 73, 100, 18, 153, 68, 166, 231, 2, 1, 233, 32, 140, 15, 23, 145, 74, 162, 27, 228, 49, 82, 143, 188, 81, 73, 100, 3, 157, 66, 39, 145, 105, 84, 34, 43, 141, 74, 207, 5, 0, 1, 234, 38, 140, 15, 127, 102, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 24, 42, 165, 218, 65, 30, 1, 235, 32, 140, 15, 127, 190, 28, 172, 68, 26, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 68, 170, 193, 80, 41, 213, 14, 242, 0, 1, 236, 41, 140, 15, 247, 193, 64, 15, 31, 172, 68, 26, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 68, 170, 193, 80, 41, 213, 14, 242, 0, 1, 237, 35, 140, 15, 127, 78, 6, 3, 61, 124, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 17, 169, 6, 67, 165, 84, 59, 200, 3, 1, 240, 21, 140, 15, 127, 172, 72, 37, 209, 13, 146, 122, 34, 169, 255, 47, 117, 131, 28, 0, 1, 244, 31, 140, 15, 63, 165, 61, 106, 48, 208, 40, 165, 190, 25, 72, 100, 18, 153, 68, 38, 145, 73, 100, 26, 149, 104, 48, 208, 115, 1, 1, 245, 38, 140, 15, 127, 10, 165, 123, 154, 193, 64, 163, 146, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 163, 18, 13, 6, 81, 173, 84, 41, 26, 12, 50, 0, 1, 252, 38, 140, 15, 63, 165, 61, 106, 48, 208, 72, 84, 26, 149, 70, 165, 81, 105, 84, 26, 213, 224, 198, 74, 163, 210, 168, 52, 42, 141, 74, 163, 210, 12, 244, 92, 0, 1, 253, 34, 140, 15, 127, 10, 165, 123, 146, 131, 212, 32, 33, 147, 200, 36, 162, 193, 64, 163, 144, 73, 100, 18, 153, 68, 167, 216, 45, 6, 121, 46, 0, 1, 254, 44, 140, 15, 63, 165, 185, 104, 48, 208, 136, 52, 170, 137, 104, 16, 17, 13, 34, 26, 133, 68, 163, 144, 248, 11, 141, 68, 161, 145, 12, 66, 146, 65, 72, 35, 18, 13, 6, 33, 169, 158, 1, 1, 255, 37, 140, 15, 127, 10, 165, 123, 120, 102, 176, 144, 136, 38, 170, 137, 104, 16, 209, 40, 36, 94, 104, 36, 131, 144, 100, 37, 25, 73, 20, 131, 77, 158, 57, 0, 2, 0, 41, 140, 15, 15, 137, 78, 162, 147, 232, 49, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 2, 1, 35, 140, 15, 127, 168, 68, 39, 209, 73, 116, 18, 61, 122, 48, 200, 154, 138, 6, 3, 141, 74, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 2, 2, 41, 140, 15, 167, 65, 78, 34, 147, 232, 49, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 2, 3, 34, 140, 15, 127, 210, 65, 78, 34, 147, 232, 225, 131, 65, 214, 84, 52, 24, 104, 84, 18, 153, 68, 38, 145, 105, 84, 162, 193, 64, 207, 5, 0, 2, 4, 28, 140, 15, 15, 137, 78, 162, 147, 232, 49, 131, 129, 70, 41, 245, 116, 48, 16, 73, 189, 213, 14, 6, 122, 46, 0, 2, 5, 34, 140, 15, 127, 168, 68, 39, 209, 73, 116, 18, 61, 124, 48, 208, 168, 36, 50, 137, 76, 34, 147, 12, 14, 34, 82, 91, 237, 96, 160, 231, 2, 2, 6, 28, 140, 15, 167, 65, 78, 34, 147, 232, 49, 131, 129, 70, 41, 245, 116, 48, 16, 73, 189, 213, 14, 6, 122, 46, 0, 2, 7, 33, 140, 15, 127, 210, 65, 78, 34, 147, 232, 241, 131, 129, 70, 37, 145, 73, 100, 18, 153, 100, 112, 16, 145, 218, 106, 7, 3, 61, 23, 0, 2, 8, 22, 140, 15, 15, 137, 78, 162, 147, 232, 33, 131, 129, 78, 234, 255, 221, 96, 160, 231, 4, 2, 9, 22, 140, 15, 127, 168, 68, 39, 209, 73, 116, 18, 61, 124, 16, 245, 159, 14, 242, 220, 0, 2, 10, 22, 140, 15, 167, 65, 78, 34, 147, 232, 33, 131, 129, 78, 234, 255, 221, 96, 160, 231, 4, 2, 11, 20, 140, 15, 127, 210, 65, 78, 34, 147, 232, 241, 131, 168, 255, 116, 144, 231, 6, 2, 12, 40, 140, 15, 15, 137, 78, 162, 147, 232, 49, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 2, 13, 36, 140, 15, 127, 168, 68, 39, 209, 73, 116, 18, 61, 124, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 17, 169, 6, 123, 110, 0, 2, 14, 40, 140, 15, 167, 65, 78, 34, 147, 232, 49, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 2, 15, 34, 140, 15, 127, 210, 65, 78, 34, 147, 232, 241, 131, 149, 72, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 72, 53, 216, 115, 3, 2, 16, 42, 140, 15, 15, 137, 78, 162, 147, 232, 17, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 81, 105, 6, 3, 145, 74, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 244, 92, 0, 2, 17, 24, 140, 15, 127, 168, 68, 39, 209, 73, 116, 18, 61, 124, 48, 208, 168, 36, 82, 255, 158, 75, 0, 2, 18, 42, 140, 15, 167, 65, 78, 34, 147, 232, 17, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 81, 105, 6, 3, 145, 74, 35, 147, 200, 36, 50, 137, 76, 34, 147, 200, 244, 92, 0, 2, 19, 22, 140, 15, 127, 210, 65, 78, 34, 147, 232, 241, 131, 129, 70, 37, 145, 250, 247, 92, 2, 2, 20, 41, 140, 15, 15, 137, 78, 162, 147, 232, 17, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 2, 21, 37, 140, 15, 127, 168, 68, 39, 209, 73, 116, 18, 61, 88, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 81, 137, 6, 3, 61, 23, 0, 2, 22, 41, 140, 15, 167, 65, 78, 34, 147, 232, 17, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 2, 23, 35, 140, 15, 127, 210, 65, 78, 34, 147, 232, 209, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 2, 30, 41, 140, 15, 23, 145, 74, 162, 27, 228, 33, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 147, 12, 14, 34, 50, 137, 76, 34, 147, 200, 36, 50, 137, 76, 34, 211, 115, 1, 2, 31, 36, 140, 15, 23, 145, 74, 162, 27, 228, 33, 82, 167, 131, 129, 72, 165, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 233, 185, 0, 2, 38, 39, 140, 15, 127, 136, 84, 143, 26, 172, 68, 26, 153, 68, 38, 145, 73, 100, 18, 153, 100, 112, 16, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 158, 11, 0, 2, 39, 30, 140, 15, 127, 90, 169, 158, 122, 48, 200, 154, 138, 6, 3, 141, 74, 34, 147, 200, 36, 50, 141, 74, 52, 24, 232, 185, 0, 2, 40, 25, 140, 15, 127, 102, 131, 129, 70, 41, 245, 116, 48, 16, 73, 189, 213, 14, 6, 58, 169, 165, 25, 0, 2, 41, 29, 140, 15, 127, 190, 28, 12, 52, 42, 137, 76, 34, 147, 200, 36, 131, 131, 136, 212, 86, 59, 24, 232, 164, 150, 102, 0, 2, 46, 38, 140, 15, 127, 136, 84, 143, 26, 172, 68, 26, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 38, 145, 105, 68, 170, 193, 158, 27, 0, 2, 47, 31, 140, 15, 127, 90, 169, 158, 124, 176, 18, 105, 100, 18, 153, 68, 38, 145, 73, 100, 18, 153, 68, 166, 17, 169, 6, 123, 110, 0, 32, 172, 30, 140, 15, 127, 134, 131, 156, 68, 37, 114, 35, 21, 14, 6, 50, 169, 112, 48, 144, 73, 181, 34, 87, 18, 221, 32, 207, 12, 0, 0]; // src/font/types.ts class MonoDisplayFont { FONT_DATA; constructor(font_data) { this.FONT_DATA = new Uint8Array(font_data.length); for (let i = 0;i < font_data.length; i++) { this.FONT_DATA[i] = font_data[i] || 0; } } } // src/font/u8g2.ts var HDR_SIZE = 23; class BitReader { data; ptr; bitPos; constructor(data, startByte) { this.data = data; this.ptr = startByte; this.bitPos = 0; } read(cnt) { let val = this.data[this.ptr] >> this.bitPos & 255; const newPos = this.bitPos + cnt; if (newPos >= 8) { this.ptr++; val |= this.data[this.ptr] << 8 - this.bitPos; this.bitPos = newPos - 8; } else { this.bitPos = newPos; } return val & (1 << cnt) - 1; } readSigned(cnt) { return this.read(cnt) - (1 << cnt - 1); } } function readU16BE(data, off) { return (data[off] << 8 | data[off + 1]) >>> 0; } function parseHeader(font) { return { m0: font[2], m1: font[3], bitsPerW: font[4], bitsPerH: font[5], bitsPerX: font[6], bitsPerY: font[7], bitsPerDx: font[8], ascentA: font[13], startUpper: HDR_SIZE + readU16BE(font, 17), startLower: HDR_SIZE + readU16BE(font, 19), startUnicode: HDR_SIZE + readU16BE(font, 21) }; } function decodeRLE(br, w, h, m0, m1) { const total = w * h; const bits = new Uint8Array(total); let filled = 0; while (filled < total) { const zeros = br.read(m0); const ones = br.read(m1); let reps = 1; while (br.read(1) === 1) reps++; for (let r = 0;r < reps && filled < total; r++) { for (let p = 0;p < zeros && filled < total; p++) bits[filled++] = 0; for (let p = 0;p < ones && filled < total; p++) bits[filled++] = 1; } } return bits; } function decodeGlyphAt(font, byteOffset, hdr) { const br = new BitReader(font, byteOffset); const w = br.read(hdr.bitsPerW); const h = br.read(hdr.bitsPerH); br.readSigned(hdr.bitsPerX); const yB = br.readSigned(hdr.bitsPerY); const dx = br.readSigned(hdr.bitsPerDx); if (w === 0 || h === 0) { return { cols: new Uint8Array(1), w: 1, h: 0, dx: Math.max(dx, 1), yOff: 0 }; } const bits = decodeRLE(br, w, h, hdr.m0, hdr.m1); const cols = new Uint32Array(w); for (let row = 0;row < h; row++) { for (let col = 0;col < w; col++) { if (bits[row * w + col]) cols[col] |= 1 << row; } } const yOff = hdr.ascentA - yB - h; return { cols, w, h, dx, yOff }; } function u8g2Glyph(cp, font) { if (font.length < HDR_SIZE) return null; const hdr = parseHeader(font); try { if (cp >= 256) { const tableBase = hdr.startUnicode; if (tableBase + 4 > font.length) return null; let glyphStart = tableBase; let pos = tableBase; while (pos + 4 <= font.length) { const delta = readU16BE(font, pos); const lastEncoding = readU16BE(font, pos + 2); pos += 4; if (lastEncoding === 65535) { glyphStart = tableBase + delta; break; } if (lastEncoding >= cp) { glyphStart = tableBase + delta; break; } } let recPos = glyphStart; while (recPos + 3 <= font.length) { const recStart = recPos; const encoding = readU16BE(font, recPos); const jump = font[recPos + 2]; if (jump === 0) break; recPos += 3; if (encoding === cp) return decodeGlyphAt(font, recPos, hdr); recPos = recStart + jump; } return null; } else { let recPos; if (cp >= 97) recPos = hdr.startLower; else if (cp >= 65) recPos = hdr.startUpper; else recPos = HDR_SIZE; while (recPos + 2 <= font.length) { const recStart = recPos; const encoding = font[recPos]; const jump = font[recPos + 1]; if (jump === 0) break; recPos += 2; if (encoding === cp) return decodeGlyphAt(font, recPos, hdr); recPos = recStart + jump; } return null; } } catch { return null; } } function rasterizeText(text, cellHeight, font) { const hdr = parseHeader(font.FONT_DATA); const glyphs = []; for (const char of text) { const cp = char.codePointAt(0) ?? 63; const g = u8g2Glyph(cp, font.FONT_DATA); if (g) glyphs.push(g); } if (glyphs.length === 0) { return { pixels: new Uint8Array(cellHeight), width: 1, height: cellHeight }; } const totalW = glyphs.reduce((sum, g, i) => sum + (i < glyphs.length - 1 ? g.dx : g.w), 0); const pixels = new Uint8Array(totalW * cellHeight); const descent = font.FONT_DATA[14] > 127 ? font.FONT_DATA[14] - 256 : font.FONT_DATA[14]; const fontH = hdr.ascentA - descent; const topPad = Math.floor((cellHeight - fontH) / 2); const baseline = topPad + hdr.ascentA; let x = 0; for (const g of glyphs) { const top = baseline - hdr.ascentA + g.yOff; for (let col = 0;col < g.w; col++) { const colByte = g.cols[col] ?? 0; for (let row = 0;row < g.h; row++) { if (colByte >> row & 1) { const py = top + row; if (py >= 0 && py < cellHeight) { pixels[py * totalW + x + col] = 1; } } } } x += g.dx; } return { pixels, width: totalW, height: cellHeight }; } // src/font/index.ts var u8g2_font_NokiaSmallPlain_tf = new MonoDisplayFont(u8g2_font_NokiaSmallPlain_tf_u8g2font); var u8g2_font_5x7_mf = new MonoDisplayFont(u8g2_font_5x7_mf_u8g2font); var u8g2_font_5x7_tf = new MonoDisplayFont(u8g2_font_5x7_tf_u8g2font); var u8g2_font_HelvetiPixel_tr = new MonoDisplayFont(u8g2_font_HelvetiPixel_tr_u8g2font); var u8g2_font_spleen12x24_me = new MonoDisplayFont(u8g2_font_spleen12x24_me_u8g2font); var u8g2_font_smolfont_tf = new MonoDisplayFont(u8g2_font_smolfont_tf_u8g2font); var u8g2_font_micropixel_tf = new MonoDisplayFont(u8g2_font_micropixel_tf_u8g2font); var u8g2_font_micropixel_tr = new MonoDisplayFont(u8g2_font_micropixel_tr_u8g2font); // src/renderer.ts class MonoDisplayRenderer { ctx; opts; tickTimer = null; tickCount = 0; animState = new Map; hScrollPos = new Map; vScrollPos = new Map; customFonts = []; textCache = new Map; static builtinFonts = { NokiaSmallPlain_tf: u8g2_font_NokiaSmallPlain_tf, "5x7_mf": u8g2_font_5x7_mf }; constructor(canvas, opts) { const ctx = canvas.getContext("2d"); if (!ctx) throw new Error("Cannot get 2D canvas context"); this.ctx = ctx; this.opts = opts; } stop() { if (this.tickTimer !== null) { clearInterval(this.tickTimer); this.tickTimer = null; } this.tickCount = 0; this.animState.clear(); this.hScrollPos.clear(); this.vScrollPos.clear(); this.textCache.clear(); } render(file) { this.stop(); const { displayWidth: dw, displayHeight: dh, scale: s } = this.opts; this.ctx.canvas.width = dw * s; this.ctx.canvas.height = dh * s; this.customFonts = []; for (const section of file.sections) { if (section.sectionType === 32 /* CustomFont */) { this.customFonts.push(section.fontData); } } const tick = () => { this.#renderFile(file); this.tickCount++; }; tick(); this.tickTimer = setInterval(tick, 1000 / this.opts.fps); } #renderFile(file) { const now = BigInt(Math.floor(this.opts.now().getTime() / 1000)); let cleared = false; let elementId = 0; this.ctx.fillStyle = this.opts.offColor; this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); for (const section of file.sections) { if (section.sectionType === 2 /* ElementsTimespan */) { if (now < section.startTimestamp || now >= section.endTimestamp) { elementId += section.elements.length; continue; } } if (section.sectionType !== 1 /* ElementsAlways */ && section.sectionType !== 2 /* ElementsTimespan */) { continue; } const elSection = section; if (elSection.flags.clearBuffer && !cleared) { this.ctx.fillStyle = this.opts.offColor; this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height); cleared = true; } for (const el of elSection.elements) { this.#renderElement(el, elementId++); } } } #renderElement(el, id) { switch (el.type) { case 1 /* Image2D */: this.#blitImage(el.image, el.xOffset, el.yOffset); break; case 2 /* Animation */: this.#renderAnimation(el, id); break; case 3 /* HorizontalScroll */: this.#renderHScroll(el, id); break; case 4 /* VerticalScroll */: this.#renderVScroll(el, id); break; case 5 /* Line */: this.#renderLine(el); break; case 16 /* ClippedText */: this.#renderClippedText(el); break; case 17 /* HScrollText */: this.#renderHScrollText(el, id); break; case 32 /* CurrentTime */: this.#renderCurrentTime(el); break; } } #blitImage(img, ox, oy) { const { ctx, opts: { onColor, scale: s } } = this; ctx.fillStyle = onColor; for (let y = 0;y < img.height; y++) { for (let x = 0;x < img.width; x++) { if (img.pixels[y * img.width + x]) { ctx.fillRect((ox + x) * s, (oy + y) * s, s, s); } } } } #blitClipped(img, ox, oy, viewW, viewH, srcX, srcY) { const { ctx, opts: { onColor, scale: s } } = this; ctx.fillStyle = onColor; for (let y = 0;y < viewH; y++) { for (let x = 0;x < viewW; x++) { const sx = Math.floor(srcX) + x; const sy = Math.floor(srcY) + y; if (sx < 0 || sx >= img.width || sy < 0 || sy >= img.height) continue; if (img.pixels[sy * img.width + sx]) { ctx.fillRect((ox + x) * s, (oy + y) * s, s, s); } } } } #renderAnimation(el, id) { if (el.frames.length === 0) return; let state = this.animState.get(id); if (!state) { state = { frame: 0, counter: 0 }; this.animState.set(id, state); } this.#blitImage(el.frames[state.frame], el.xOffset, el.yOffset); state.counter++; if (state.counter > el.updateInterval) { state.counter = 0; state.frame = (state.frame + 1) % el.frames.length; if (!this.opts.loop && state.frame === 0) state.frame = el.frames.length - 1; } } #renderHScroll(el, id) { let pos = this.hScrollPos.get(id) ?? 0; this.#blitClipped(el.content, el.xOffset, el.yOffset, el.width, el.height, pos, 0); const speed = (el.scrollSpeed + 1) / 16; pos += el.flags.invertDirection ? -speed : speed; if (el.flags.endless) { if (pos >= el.contentWidth) pos -= el.contentWidth; if (pos < 0) pos += el.contentWidth; } else { pos = Math.max(0, Math.min(pos, el.contentWidth - el.width)); } this.hScrollPos.set(id, pos); } #renderVScroll(el, id) { let pos = this.vScrollPos.get(id) ?? 0; this.#blitClipped(el.content, el.xOffset, el.yOffset, el.width, el.height, 0, pos); const speed = (el.scrollSpeed + 1) / 16; pos += el.flags.invertDirection ? -speed : speed; if (el.flags.endless) { if (pos >= el.contentHeight) pos -= el.contentHeight; if (pos < 0) pos += el.contentHeight; } else { pos = Math.max(0, Math.min(pos, el.contentHeight - el.height)); } this.vScrollPos.set(id, pos); } #renderLine(el) { const { ctx, opts: { onColor, offColor, scale: s } } = this; ctx.fillStyle = el.invertPixels ? offColor : onColor; let [x0, y0, x1, y1] = [el.xOrigin, el.yOrigin, el.xTarget, el.yTarget]; const dx = Math.abs(x1 - x0), sx = x0 < x1 ? 1 : -1; const dy = -Math.abs(y1 - y0), sy = y0 < y1 ? 1 : -1; let err = dx + dy; while (true) { ctx.fillRect(x0 * s, y0 * s, s, s); if (x0 === x1 && y0 === y1) break; const e2 = 2 * err; if (e2 >= dy) { err += dy; x0 += sx; } if (e2 <= dx) { err += dx; y0 += sy; } } } #getTextImage(text, height, fontIndex) { const key = `${text}|${fontIndex}|${height}`; const cached = this.textCache.get(key); if (cached) return cached; fontIndex = Math.min(fontIndex, Object.keys(MonoDisplayRenderer.builtinFonts).length - 1); const builtinFont = Object.values(MonoDisplayRenderer.builtinFonts).at(fontIndex) || u8g2_font_NokiaSmallPlain_tf; const customFont = this.customFonts[fontIndex - 32768]; const selectedFont = fontIndex >= 32768 ? customFont || builtinFont : builtinFont; const img = rasterizeText(text, height, selectedFont); this.textCache.set(key, img); return img; } #renderClippedText(el) { const img = this.#getTextImage(el.text, el.height, el.fontIndex); this.#blitClipped(img, el.xOffset, el.yOffset, el.width, el.height, 0, 0); } #renderHScrollText(el, id) { const img = this.#getTextImage(el.text, el.height, el.fontIndex); let pos = this.hScrollPos.get(id) ?? 0; this.#blitClipped(img, el.xOffset, el.yOffset, el.width, el.height, pos, 0); const speed = (el.scrollSpeed + 1) / 16; pos += el.flags.invertDirection ? -speed : speed; if (el.flags.endless) { if (pos >= img.width) pos -= img.width; if (pos < 0) pos += img.width; } else { pos = Math.max(0, Math.min(pos, img.width - el.width)); } this.hScrollPos.set(id, pos); } #renderCurrentTime(el) { const d = new Date(this.opts.now().getTime() + el.utcOffsetMinutes * 60000); const { clock12h, showHours, showMinutes, showSeconds } = el.flags; const parts = []; if (showHours) { const h = d.getUTCHours(); parts.push(String(clock12h ? h % 12 || 12 : h).padStart(2, "0")); } if (showMinutes) parts.push(String(d.getUTCMinutes()).padStart(2, "0")); if (showSeconds) parts.push(String(d.getUTCSeconds()).padStart(2, "0")); const text = parts.join(":"); if (!text) return; const img = this.#getTextImage(text, el.height, el.fontIndex); this.#blitClipped(img, el.xOffset, el.yOffset, el.width, el.height, 0, 0); } } // src/driver.ts class MonoDisplayDriver { canvas; opts; parser; renderer = null; constructor(canvasId, options = {}) { const el = document.getElementById(canvasId); if (!el || el.tagName !== "CANVAS") throw new Error(`#${canvasId} is not a `); this.canvas = el; this.opts = { onColor: options.onColor ?? "#EC0", offColor: options.offColor ?? "#000000", scale: options.scale ?? 1, displayWidth: options.displayWidth ?? 120, displayHeight: options.displayHeight ?? 60, fps: options.fps ?? 25, loop: options.loop ?? true, onError: options.onError ?? ((e) => { throw e; }), now: options.now ?? (() => new Date) }; this.parser = new MonoDisplayParser; } async load(loader) { try { const buffer = await loader(); const file = this.parser.parse(buffer); if (!this.renderer) this.renderer = new MonoDisplayRenderer(this.canvas, this.opts); this.renderer.render(file); } catch (err) { this.opts.onError(err instanceof Error ? err : new Error(String(err))); } } stop() { this.renderer?.stop(); } } // src/file.ts class MonoDisplayFile { sections; version; constructor(sections, version = 1) { this.sections = sections; this.version = version; } toBuffer() { const sections = []; for (const section of this.sections) { switch (section.sectionType) { case 1 /* ElementsAlways */: { sections.push(this.#encodeElementsAlwaysSection(section)); break; } case 2 /* ElementsTimespan */: { sections.push(this.#encodeElementsTimespanSection(section)); break; } case 32 /* CustomFont */: { sections.push(this.#encodeCustomFont(section)); break; } } } const hdrBuf = new ArrayBuffer(12); const hdrView = new DataView(hdrBuf); hdrView.setUint32(0, MONOFORMAT_MAGIC_HEADER, true); hdrView.setUint32(4, this.version, true); hdrView.setUint16(8, sections.length, true); hdrView.setUint16(10, 0, true); return this.#concat(new Uint8Array(hdrBuf), ...sections); } #encodeElementsAlwaysSection(section) { const flagBits = (section.flags.drawFront ?? true ? 1 : 0) | (section.flags.drawBack ?? false ? 2 : 0) | (section.flags.clearBuffer ?? false ? 4 : 0); const encodedEls = section.elements.map((el) => this.#encodeElement(el)); const sectionDataSize = 4 + encodedEls.reduce((s, e) => s + e.byteLength, 0); const sectionSize = 4 + sectionDataSize; const hdr = new Uint8Array(4 + 4); const v = new DataView(hdr.buffer); v.setUint8(0, section.sectionType); v.setUint8(1, sectionSize & 255); v.setUint8(2, sectionSize >> 8 & 255); v.setUint8(3, sectionSize >> 16 & 255); v.setUint16(4, flagBits, true); v.setUint16(6, section.elements.length, true); return this.#concat(hdr, ...encodedEls); } #encodeElementsTimespanSection(section) { const flagBits = (section.flags.drawFront ?? true ? 1 : 0) | (section.flags.drawBack ?? false ? 2 : 0) | (section.flags.clearBuffer ?? false ? 4 : 0); const encodedEls = section.elements.map((el) => this.#encodeElement(el)); const sectionDataSize = 20 + encodedEls.reduce((s, e) => s + e.byteLength, 0); const sectionSize = 4 + sectionDataSize; const hdr = new Uint8Array(4 + 20); const v = new DataView(hdr.buffer); v.setUint8(0, section.sectionType); v.setUint8(1, sectionSize & 255); v.setUint8(2, sectionSize >> 8 & 255); v.setUint8(3, sectionSize >> 16 & 255); v.setUint16(4, flagBits, true); v.setUint16(6, section.elements.length, true); const start = section.startTimestamp ?? 0n; const end = section.endTimestamp ?? 0n; v.setUint32(8, Number(start & 0xFFFFFFFFn), true); v.setUint32(12, Number(start >> 32n & 0xFFFFFFFFn), true); v.setUint32(16, Number(end & 0xFFFFFFFFn), true); v.setUint32(20, Number(end >> 32n & 0xFFFFFFFFn), true); return this.#concat(hdr, ...encodedEls); } #encodeCustomFont(section) { const sectionSize = 4 + section.fontData.length; const hdr = new Uint8Array(4 + 4); const v = new DataView(hdr.buffer); v.setUint8(0, section.sectionType); v.setUint8(1, sectionSize & 255); v.setUint8(2, sectionSize >> 8 & 255); v.setUint8(3, sectionSize >> 16 & 255); v.setUint8(4, section.fontData.length & 255); v.setUint8(5, section.fontData.length >> 8 & 255); v.setUint8(6, section.fontData.length >> 16 & 255); v.setUint8(7, 0); return this.#concat(hdr, section.fontData); } #encodeElement(el) { console.log("encode", el); switch (el.type) { case 1 /* Image2D */: return this.#encodeImage2D(el); case 2 /* Animation */: return this.#encodeAnimation(el); case 3 /* HorizontalScroll */: return this.#encodeHScroll(el); case 4 /* VerticalScroll */: return this.#encodeVScroll(el); case 5 /* Line */: return this.#encodeLine(el); case 16 /* ClippedText */: return this.#encodeClippedText(el); case 17 /* HScrollText */: return this.#encodeHScrollText(el); case 32 /* CurrentTime */: return this.#encodeCurrentTime(el); default: return new Uint8Array; } } #encodeImage2D(el) { const packed = packPixels(el.image.pixels, el.image.width, el.image.height); const fixed = 12; const rawSize = fixed + packed.byteLength; const total = rawSize + pad32(rawSize); const out = new Uint8Array(total); const v = new DataView(out.buffer); v.setUint16(0, 1 /* Image2D */, true); v.setUint16(2, el.xOffset ?? 0, true); v.setUint16(4, el.yOffset ?? 0, true); v.setUint16(6, el.image.width, true); v.setUint16(8, el.image.height, true); v.setUint16(10, 0, true); out.set(packed, 12); return out; } #encodeAnimation(el) { const frameBytes = packedSize(el.width, el.height); const fixed = 16; const rawSize = fixed + el.frames.length * frameBytes; const total = rawSize + pad32(rawSize); const out = new Uint8Array(total); const v = new DataView(out.buffer); v.setUint16(0, 2 /* Animation */, true); v.setUint16(2, el.xOffset ?? 0, true); v.setUint16(4, el.yOffset ?? 0, true); v.setUint16(6, el.width, true); v.setUint16(8, el.height, true); v.setUint16(10, el.frames.length, true); v.setUint16(12, el.updateInterval ?? 0, true); v.setUint16(14, 0, true); let off = 16; for (const f of el.frames) { out.set(packPixels(f.pixels, el.width, el.height), off); off += frameBytes; } return out; } #encodeScrollFlags(f) { return (f?.endless ? 1 : 0) | (f?.invertDirection ? 2 : 0) | (f?.padStart ? 4 : 0) | (f?.padEnd ? 8 : 0); } #encodeHScroll(el) { const packed = packPixels(el.content.pixels, el.contentWidth, el.height); const fixed = 16; const rawSize = fixed + packed.byteLength; const total = rawSize + pad32(rawSize); const out = new Uint8Array(total); const v = new DataView(out.buffer); v.setUint16(0, 3 /* HorizontalScroll */, true); v.setUint16(2, el.xOffset ?? 0, true); v.setUint16(4, el.yOffset ?? 0, true); v.setUint16(6, el.width, true); v.setUint16(8, el.height, true); v.setUint16(10, el.contentWidth, true); v.setUint8(12, this.#encodeScrollFlags(el.flags)); v.setUint8(13, el.scrollSpeed ?? 0); v.setUint16(14, 0, true); out.set(packed, 16); return out; } #encodeVScroll(el) { const packed = packPixels(el.content.pixels, el.width, el.contentHeight); const fixed = 16; const rawSize = fixed + packed.byteLength; const total = rawSize + pad32(rawSize); const out = new Uint8Array(total); const v = new DataView(out.buffer); v.setUint16(0, 4 /* VerticalScroll */, true); v.setUint16(2, el.xOffset ?? 0, true); v.setUint16(4, el.yOffset ?? 0, true); v.setUint16(6, el.width, true); v.setUint16(8, el.height, true); v.setUint16(10, el.contentHeight, true); v.setUint8(12, this.#encodeScrollFlags(el.flags)); v.setUint8(13, el.scrollSpeed ?? 0); v.setUint16(14, 0, true); out.set(packed, 16); return out; } #encodeLine(el) { const out = new Uint8Array(12); const v = new DataView(out.buffer); v.setUint16(0, 5 /* Line */, true); v.setUint16(2, el.xOrigin, true); v.setUint16(4, el.yOrigin, true); v.setUint16(6, el.xTarget, true); v.setUint16(8, el.yTarget, true); v.setUint8(10, el.lineStyle ?? 0); v.setUint8(11, el.invertPixels ? 1 : 0); return out; } #encodeClippedText(el) { const enc = new TextEncoder().encode(el.text); const fixed = 14; const rawSize = fixed + enc.byteLength; const total = rawSize + pad32(rawSize); const out = new Uint8Array(total); const v = new DataView(out.buffer); v.setUint16(0, 16 /* ClippedText */, true); v.setUint16(2, el.xOffset ?? 0, true); v.setUint16(4, el.yOffset ?? 0, true); v.setUint16(6, el.width, true); v.setUint16(8, el.height, true); v.setUint16(10, el.fontIndex ?? 0, true); v.setUint16(12, enc.byteLength, true); out.set(enc, 14); return out; } #encodeHScrollText(el) { const enc = new TextEncoder().encode(el.text); const fixed = 16; const rawSize = fixed + enc.byteLength; const total = rawSize + pad32(rawSize); const out = new Uint8Array(total); const v = new DataView(out.buffer); v.setUint16(0, 17 /* HScrollText */, true); v.setUint16(2, el.xOffset ?? 0, true); v.setUint16(4, el.yOffset ?? 0, true); v.setUint16(6, el.width, true); v.setUint16(8, el.height, true); v.setUint8(10, this.#encodeScrollFlags(el.flags)); console.log("encodeScrollFlags", el.flags, this.#encodeScrollFlags(el.flags)); v.setUint8(11, el.scrollSpeed ?? 0); v.setUint16(12, el.fontIndex ?? 0, true); v.setUint16(14, enc.byteLength, true); out.set(enc, 16); return out; } #encodeCurrentTime(el) { const out = new Uint8Array(16); const v = new DataView(out.buffer); const f = el.flags; const flagsByte = (f?.clock12h ? 1 : 0) | (f?.showHours ?? true ? 2 : 0) | (f?.showMinutes ?? true ? 4 : 0) | (f?.showSeconds ? 8 : 0); v.setUint16(0, 32 /* CurrentTime */, true); v.setUint16(2, el.xOffset ?? 0, true); v.setUint16(4, el.yOffset ?? 0, true); v.setUint16(6, el.width, true); v.setUint16(8, el.height, true); v.setUint16(10, el.fontIndex ?? 0, true); v.setInt16(12, el.utcOffsetMinutes ?? 0, true); v.setUint8(14, flagsByte); v.setUint8(15, 0); return out; } #concat(...parts) { const total = parts.reduce((s, p) => s + p.byteLength, 0); const out = new Uint8Array(total); let off = 0; for (const p of parts) { out.set(p, off); off += p.byteLength; } return out; } } async function loadBinFile(url) { const res = await fetch(url); if (!res.ok) throw new Error(`loadBinFile: HTTP ${res.status} for ${url}`); return res.arrayBuffer(); } function buildBinBuffer(el) { return new MonoDisplayFile([{ sectionType: 1 /* ElementsAlways */, elements: [el], flags: { drawFront: true, drawBack: true, clearBuffer: true } }]).toBuffer(); } // src/themes.ts var _THEMES = ["dark", "light", "auto"]; function _getTheme() { return document.documentElement.getAttribute("data-theme") || "auto"; } function _applyTheme(t) { if (t === "auto") { document.documentElement.removeAttribute("data-theme"); localStorage.removeItem("theme"); } else { document.documentElement.setAttribute("data-theme", t); localStorage.setItem("theme", t); } _updateThemeBtn(); } function cycleTheme() { var cur = _getTheme(), idx = _THEMES.indexOf(cur); _applyTheme(_THEMES[(idx + 1) % _THEMES.length]); } function _detectDR() { return !!(document.querySelector('meta[name="darkreader"]') || document.querySelector("style[data-darkreader-style]") || document.documentElement.getAttribute("data-darkreader-mode")); } function _updateThemeBtn() { var btn = document.getElementById("theme-toggle"); if (!btn) return; var t = _getTheme(), dr = _detectDR(); var lbl = { dark: "☾ dark", light: "☀ light", auto: "⊙ auto" }; btn.textContent = (dr ? "DR · " : "") + (lbl[t] || lbl.auto); btn.title = dr ? "DarkReader active - controlling theme" : "Theme: " + t + " (click to cycle)"; } window.addEventListener("DOMContentLoaded", _updateThemeBtn); // src/browser.ts globalThis.MonoDisplay = exports_src; var W = 120; var H = 60; var file = new MonoDisplayFile([]); var activeSecIndex = null; var activeElIndex = null; var currentFilename = "untitled"; var isDirty = false; var EL_FIELDS = { Image2D: [ { key: "xOffset", label: "X offset", type: "number", default: 0 }, { key: "yOffset", label: "Y offset", type: "number", default: 0 }, { key: "width", label: "Width", type: "number", default: W }, { key: "height", label: "Height", type: "number", default: H } ], Animation: [ { key: "xOffset", label: "X offset", type: "number", default: 0 }, { key: "yOffset", label: "Y offset", type: "number", default: 0 }, { key: "width", label: "Width", type: "number", default: W }, { key: "height", label: "Height", type: "number", default: H }, { key: "updateInterval", label: "Update interval", type: "number", default: 12 }, { key: "frames", label: "Frames", type: "list", default: [] } ], ClippedText: [ { key: "text", label: "Text", type: "text", default: "Hello, World!", full: true }, { key: "xOffset", label: "X offset", type: "number", default: 0 }, { key: "yOffset", label: "Y offset", type: "number", default: 10 }, { key: "width", label: "Width", type: "number", default: 30 }, { key: "height", label: "Height", type: "number", default: 10 }, { key: "fontIndex", label: "Font", type: "font", default: 0 } ], HScrollText: [ { key: "text", label: "Text", type: "text", default: "Scrolling text - ", full: true }, { key: "xOffset", label: "X offset", type: "number", default: 0 }, { key: "yOffset", label: "Y offset", type: "number", default: 10 }, { key: "width", label: "Width", type: "number", default: 30 }, { key: "height", label: "Height", type: "number", default: 10 }, { key: "scrollSpeed", label: "Scroll speed", type: "number", default: 50 }, { key: "fontIndex", label: "Font", type: "font", default: 0 } ], VScrollText: [ { key: "text", label: "Text", type: "text", default: "Scrolling text - ", full: true }, { key: "xOffset", label: "X offset", type: "number", default: 0 }, { key: "yOffset", label: "Y offset", type: "number", default: 32 }, { key: "width", label: "Width", type: "number", default: 30 }, { key: "height", label: "Height", type: "number", default: 10 }, { key: "scrollSpeed", label: "Scroll speed", type: "number", default: 50 }, { key: "fontIndex", label: "Font", type: "font", default: 0 } ], CurrentTime: [ { key: "xOffset", label: "X offset", type: "number", default: 0 }, { key: "yOffset", label: "Y offset", type: "number", default: 8 }, { key: "width", label: "Width", type: "number", default: W }, { key: "height", label: "Height", type: "number", default: H }, { key: "utcOffsetMinutes", label: "UTC offset (min)", type: "number", default: 120 }, { key: "fontIndex", label: "Font", type: "font", default: 0 } ] }; var EL_FLAGS = { HScrollText: [ { key: "endless", label: "Endless" }, { key: "invertDirection", label: "Invert direction" }, { key: "padBefore", label: "Pad Before" }, { key: "padAfter", label: "Pad After" } ], CurrentTime: [ { key: "clock12h", label: "12h mode", default: false }, { key: "showHours", label: "Show hours", default: true }, { key: "showSeconds", label: "Show seconds", default: true } ] }; var EL_TYPES = Object.keys(EL_FIELDS).map((x) => StringToElementType[x]); var DEFAULT_FONTS = Object.keys(MonoDisplayRenderer.builtinFonts); function showConfirm(msg, buttons) { return new Promise((resolve) => { const overlay = document.getElementById("confirm-overlay"); const msgEl = document.getElementById("confirm-msg"); const btnsEl = document.getElementById("confirm-btns"); if (msgEl) msgEl.textContent = msg; if (btnsEl) btnsEl.innerHTML = ""; buttons.forEach((b) => { const btn = document.createElement("button"); btn.className = "cb" + (b.primary ? " primary" : ""); btn.textContent = b.label; btn.onclick = () => { overlay?.classList.remove("show"); resolve(b.action); }; btnsEl?.appendChild(btn); }); overlay?.classList.add("show"); }); } var STORAGE_KEY = "monodisplay_autosave"; function saveToStorage() { try { const buf = file.toBuffer(); const b64 = btoa(String.fromCharCode(...buf)); localStorage.setItem(STORAGE_KEY, JSON.stringify({ filename: currentFilename, data: b64 })); } catch {} } function loadFromStorage() { try { const raw = localStorage.getItem(STORAGE_KEY); if (!raw) return; const { filename, data } = JSON.parse(raw); const bytes = Uint8Array.from(atob(data), (c) => c.charCodeAt(0)); const parsed = new MonoDisplayParser().parse(bytes.buffer); file = new MonoDisplayFile(parsed.sections); currentFilename = filename; const filenameEl = document.getElementById("filename"); if (filenameEl) filenameEl.textContent = filename; isDirty = true; document.getElementById("filename")?.classList.add("dirty"); import_mithril.default.redraw(); } catch {} } function markDirty() { isDirty = true; document.getElementById("filename")?.classList.add("dirty"); saveToStorage(); } function markClean() { isDirty = false; document.getElementById("filename")?.classList.remove("dirty"); } async function guardDirty() { if (!isDirty || !file.sections.length) return true; return showConfirm("You have unsaved changes. Loading a demo will replace the current editor state.", [{ label: "Cancel", action: false }, { label: "Load anyway", primary: true, action: true }]); } function newSec() { return { sectionType: 1 /* ElementsAlways */, elements: [], flags: { clearBuffer: true, drawBack: true, drawFront: true } }; } function createNewElement(type) { const fields = {}; (EL_FIELDS[ElementTypeToString[type]] || []).forEach((f) => fields[f.key] = f.default); const flags = {}; (EL_FLAGS[ElementTypeToString[type]] || []).forEach((f) => flags[f.key] = f.default ?? false); const el = { type, ...fields, flags }; if (type === 1 /* Image2D */) { el.image = { pixels: new Uint8Array(el.width * el.height), width: el.width, height: el.height }; } if (type === 2 /* Animation */) { el.frames = [{ pixels: new Uint8Array(el.width * el.height), width: el.width, height: el.height }]; } return el; } function getSectionByIndex(i) { return i !== null ? file.sections[i] : undefined; } function getElementByIndex(si, ei) { const s = getSectionByIndex(si); return s && "elements" in s ? s.elements[ei] : undefined; } function getCustomFonts() { return file.sections.filter((s) => s.sectionType === 32 /* CustomFont */).map((_, i) => ({ fontname: `CustomFont ${i}`, index: 32768 + i })); } function elSummary(el) { switch (el.type) { case 16 /* ClippedText */: case 17 /* HScrollText */: return el.text.slice(0, 24) + (el.text.length > 24 ? "..." : ""); case 32 /* CurrentTime */: case 1 /* Image2D */: case 3 /* HorizontalScroll */: case 4 /* VerticalScroll */: return `${el.xOffset ?? 0}, ${el.yOffset ?? 0}`; default: return el.type.toString(); } } function addSection() { file.sections.push(newSec()); activeSecIndex = file.sections.length - 1; activeElIndex = null; markDirty(); triggerPreview(); import_mithril.default.redraw(); } function removeSection(si) { file.sections.splice(si, 1); if (activeSecIndex === si) { activeSecIndex = file.sections.length ? file.sections.length - 1 : null; activeElIndex = null; } markDirty(); triggerPreview(); } function toggleSection(si) { activeSecIndex = si; } function setSectionFlag(flag, val) { if (activeSecIndex === null) return; const s = getSectionByIndex(activeSecIndex); if (!s) return; s.flags[flag] = val; markDirty(); triggerPreview(); } function setSectionField(si, key, val) { const s = getSectionByIndex(si); if (!s) return; s[key] = val; markDirty(); triggerPreview(); } function setSectionType(si, sectionType) { const sec = getSectionByIndex(si); if (!sec) return; const wasElementsSection = sec.sectionType !== 32 /* CustomFont */; sec.sectionType = StringToSectionType[sectionType]; if (sec.sectionType === 32 /* CustomFont */) { sec.fontData = new Uint8Array; delete sec.elements; delete sec.flags; } else { if (!wasElementsSection) { sec.elements = []; sec.flags = {}; } delete sec.fontData; if (sec.sectionType === 2 /* ElementsTimespan */) { const now = BigInt(Math.floor(Date.now() / 1000)); sec.startTimestamp = now; sec.endTimestamp = now + 3600n; } else { delete sec.startTimestamp; delete sec.endTimestamp; } } markDirty(); triggerPreview(); } function addElement(si) { const s = getSectionByIndex(si); if (!s || !("elements" in s)) return; s.elements.push(createNewElement(17 /* HScrollText */)); activeElIndex = s.elements.length - 1; activeSecIndex = si; markDirty(); triggerPreview(); } function removeElement(si, ei) { const s = getSectionByIndex(si); if (!s || !("elements" in s)) return; s.elements.splice(ei, 1); activeElIndex = null; markDirty(); triggerPreview(); } function selectElement(si, ei) { if (activeSecIndex === si && activeElIndex === ei) { activeElIndex = null; } else { activeSecIndex = si; activeElIndex = ei; } } function changeElType(si, ei, typeString) { const el = getElementByIndex(si, ei); if (!el) return; const fresh = createNewElement(StringToElementType[typeString]); Object.assign(el, fresh); markDirty(); triggerPreview(); } function setElField(si, ei, key, val) { const el = getElementByIndex(si, ei); if (!el) return; el[key] = val; markDirty(); triggerPreview(); } function setElFlag(si, ei, key, val) { const el = getElementByIndex(si, ei); if (!el) return; el.flags[key] = val; markDirty(); triggerPreview(); } var DEMO = { Checkerboard() { const pixels = new Uint8Array(W * H); for (let y = 0;y < H; y++) for (let x = 0;x < W; x++) pixels[y * W + x] = (x + y) % 2; return new MonoDisplayFile([{ sectionType: 1 /* ElementsAlways */, elements: [{ type: 1 /* Image2D */, image: { pixels, height: H, width: W }, xOffset: 0, yOffset: 0 }], flags: { clearBuffer: true, drawFront: true, drawBack: true } }]); }, Blink() { return new MonoDisplayFile([{ sectionType: 1 /* ElementsAlways */, elements: [{ type: 2 /* Animation */, width: W, height: H, updateInterval: 12, xOffset: 0, yOffset: 0, frames: [ { pixels: new Uint8Array(W * H).fill(1), width: 0, height: 0 }, { pixels: new Uint8Array(W * H).fill(0), width: 0, height: 0 } ] }], flags: { clearBuffer: true, drawFront: true, drawBack: true } }]); }, Text() { return new MonoDisplayFile([{ sectionType: 1 /* ElementsAlways */, elements: [{ type: 16 /* ClippedText */, fontIndex: 0, text: "Hello, World!", xOffset: 0, yOffset: 16, width: 60, height: 10 }], flags: { clearBuffer: true, drawFront: true, drawBack: true } }]); }, Scrolltext() { return new MonoDisplayFile([{ sectionType: 1 /* ElementsAlways */, elements: [{ type: 17 /* HScrollText */, fontIndex: 0, text: "MONO DISPLAY - scrolling ticker - \uD83D\uDE80 ", xOffset: 0, yOffset: 32, width: W, height: 16, scrollSpeed: 50, flags: { endless: true, invertDirection: false, padStart: false, padEnd: false } }], flags: { clearBuffer: true, drawFront: true, drawBack: true } }]); }, Time() { return new MonoDisplayFile([{ sectionType: 1 /* ElementsAlways */, elements: [ { type: 32 /* CurrentTime */, fontIndex: 0, flags: {}, xOffset: 0, yOffset: 8, width: W, height: 16, utcOffsetMinutes: 120 }, { type: 32 /* CurrentTime */, fontIndex: 0, flags: { clock12h: true }, xOffset: 40, yOffset: 16, width: W, height: 16, utcOffsetMinutes: 120 }, { type: 32 /* CurrentTime */, fontIndex: 0, flags: { clock12h: true, showHours: true }, xOffset: 0, yOffset: 24, width: W, height: 16, utcOffsetMinutes: 120 }, { type: 32 /* CurrentTime */, fontIndex: 0, flags: { clock12h: true, showHours: false }, xOffset: 40, yOffset: 32, width: W, height: 16, utcOffsetMinutes: 120 }, { type: 32 /* CurrentTime */, fontIndex: 0, flags: { clock12h: true, showSeconds: true }, xOffset: 80, yOffset: 32, width: W, height: 16, utcOffsetMinutes: 120 } ], flags: { clearBuffer: true, drawFront: true, drawBack: true } }]); } }; var previewTimer = null; function triggerPreview() { if (previewTimer) clearTimeout(previewTimer); previewTimer = setTimeout(() => { try { buildPreview(); } catch (e) { console.warn("preview", e); } }, 150); } function buildPreview() { if (!window.MonoDisplay) return; if (!window._mdDriver) window._mdDriver = new MonoDisplayDriver("canvas_root", { onColor: "#EC0", offColor: "#000", fps: 25 }); window._mdDriver.load(() => Promise.resolve(file.toBuffer())); } function loadBin(input) { const binFile = input.files?.[0]; if (!binFile) return; currentFilename = binFile.name; const filenameEl = document.getElementById("filename"); if (filenameEl) filenameEl.textContent = binFile.name; const reader = new FileReader; reader.onload = (e) => { try { const parsed = new window.MonoDisplay.MonoDisplayParser().parse(e.target.result); file = new MonoDisplayFile(parsed.sections); activeSecIndex = null; activeElIndex = null; triggerPreview(); import_mithril.default.redraw(); } catch (err) { console.warn("Could not parse sections from bin:", err); } }; reader.readAsArrayBuffer(binFile); input.value = ""; markClean(); } function exportBin() { if (!window.MonoDisplay) { alert("MonoDisplay library not loaded."); return; } const blob = new Blob([file.toBuffer()], { type: "application/octet-stream" }); const a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = currentFilename.replace(/\.bin$/, "") + ".bin"; a.click(); markClean(); } function FieldInput(si, ei, field, el) { const val = el[field.key] ?? field.default; switch (field.type) { case "text": return import_mithril.default("textarea", { onchange: (e) => setElField(si, ei, field.key, e.target.value) }, val); case "font": return import_mithril.default("select", { onchange: (e) => setElField(si, ei, field.key, +e.target.value) }, [ ...DEFAULT_FONTS.map((name, i) => import_mithril.default("option", { value: i, selected: val === i }, name)), ...getCustomFonts().map((cf) => import_mithril.default("option", { value: cf.index, selected: val === cf.index }, cf.fontname)) ]); case "list": return import_mithril.default("span"); default: return import_mithril.default("input[type=number]", { value: val, onchange: (e) => setElField(si, ei, field.key, +e.target.value) }); } } var PIXEL_SCALE = 4; function getPixelIndex(img, x, y) { return y * img.width + x; } function drawPixelCanvas(canvas, img) { const ctx = canvas.getContext("2d"); ctx.fillStyle = "#000"; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = "#EC0"; for (let y = 0;y < img.height; y++) { for (let x = 0;x < img.width; x++) { if (img.pixels[getPixelIndex(img, x, y)]) { ctx.fillRect(x * PIXEL_SCALE, y * PIXEL_SCALE, PIXEL_SCALE, PIXEL_SCALE); } } } } var PixelCanvas = { drawing: false, drawValue: 1, view({ attrs: { img, onpaint }, state }) { function pixelFromEvent(e) { const canvas = e.currentTarget; const rect = canvas.getBoundingClientRect(); const scaleX = canvas.width / rect.width; const scaleY = canvas.height / rect.height; const x = Math.floor((e.clientX - rect.left) * scaleX / PIXEL_SCALE); const y = Math.floor((e.clientY - rect.top) * scaleY / PIXEL_SCALE); if (x < 0 || x >= img.width || y < 0 || y >= img.height) return null; return { x, y }; } function paint(e) { const p = pixelFromEvent(e); if (!p) return; img.pixels[getPixelIndex(img, p.x, p.y)] = state.drawValue; onpaint(); drawPixelCanvas(e.currentTarget, img); } return import_mithril.default("canvas.pixel-editor", { width: img.width * PIXEL_SCALE, height: img.height * PIXEL_SCALE, oncreate: ({ dom }) => drawPixelCanvas(dom, img), onupdate: ({ dom }) => drawPixelCanvas(dom, img), onmousedown: (e) => { state.drawing = true; const p = pixelFromEvent(e); if (p) state.drawValue = img.pixels[getPixelIndex(img, p.x, p.y)] ? 0 : 1; paint(e); }, onmousemove: (e) => { if (state.drawing) paint(e); }, onmouseup: () => { state.drawing = false; }, onmouseleave: () => { state.drawing = false; } }); } }; var Image2DEditor = { view({ attrs: { si, ei, el } }) { if (!el.image) { const w = el.width || W; const h = el.height || H; el.image = { pixels: new Uint8Array(w * h), width: w, height: h }; } return import_mithril.default(PixelCanvas, { img: el.image, onpaint: () => { markDirty(); triggerPreview(); } }); } }; var AnimationEditor = { activeFrame: 0, view({ attrs: { si, ei, el }, state }) { const w = el.width || W; const h = el.height || H; if (!el.frames) el.frames = []; if (!el.frames.length) { el.frames.push({ pixels: new Uint8Array(w * h), width: w, height: h }); } state.activeFrame = Math.min(state.activeFrame, el.frames.length - 1); const frame = el.frames[state.activeFrame]; function addFrame() { el.frames.push({ pixels: new Uint8Array(w * h), width: w, height: h }); state.activeFrame = el.frames.length - 1; markDirty(); triggerPreview(); import_mithril.default.redraw(); } function removeFrame(fi) { el.frames.splice(fi, 1); if (!el.frames.length) el.frames.push({ pixels: new Uint8Array(w * h), width: w, height: h }); state.activeFrame = Math.min(state.activeFrame, el.frames.length - 1); markDirty(); triggerPreview(); } return import_mithril.default(".anim-editor", import_mithril.default(".anim-frame-tabs", { key: "tabs" }, el.frames.map((_, fi) => import_mithril.default(".anim-frame-tab", { class: fi === state.activeFrame ? "active" : "", onclick: () => { state.activeFrame = fi; } }, import_mithril.default("span", fi + 1), el.frames.length > 1 ? import_mithril.default("button.x-btn-sm", { onclick: (e) => { e.stopPropagation(); removeFrame(fi); } }, "×") : null)), import_mithril.default("button.add-el", { onclick: addFrame }, "+ frame")), import_mithril.default("div", { key: state.activeFrame }, import_mithril.default(PixelCanvas, { img: frame, onpaint: () => { markDirty(); triggerPreview(); } }))); } }; var ElementItem = { view({ attrs: { si, ei, el } }) { const isActive = activeSecIndex === si && activeElIndex === ei; const typeStr = ElementTypeToString[el.type]; const fields = EL_FIELDS[typeStr] || []; const flags = EL_FLAGS[typeStr] || []; return import_mithril.default(".el-item", { class: isActive ? "active" : "" }, import_mithril.default(".el-item-hdr", { onclick: () => selectElement(si, ei) }, import_mithril.default("span.el-type", typeStr), import_mithril.default("span.el-name", elSummary(el)), import_mithril.default("button.x-btn", { title: "Remove element", onclick: (e) => { e.stopPropagation(); removeElement(si, ei); } }, "X")), isActive && import_mithril.default(".el-fields", import_mithril.default(".field.full", import_mithril.default("label", "Type"), import_mithril.default("select", { onchange: (e) => changeElType(si, ei, e.target.value) }, EL_TYPES.map((t) => import_mithril.default("option", { value: ElementTypeToString[t], selected: t === el.type }, ElementTypeToString[t])))), import_mithril.default(".fields-grid", fields.map((field) => import_mithril.default(`.field${field.full ? ".full" : ""}`, import_mithril.default("label", field.label), FieldInput(si, ei, field, el)))), flags.length ? import_mithril.default(".field.full", import_mithril.default("label", "Flags"), import_mithril.default(".flags-row", flags.map((flag) => import_mithril.default("label.flag-check", import_mithril.default("input[type=checkbox]", { checked: !!el.flags?.[flag.key], onchange: (e) => setElFlag(si, ei, flag.key, e.target.checked) }), " " + flag.label)))) : null, el.type === 1 /* Image2D */ ? import_mithril.default(".field.full", import_mithril.default("label", "Pixels"), import_mithril.default(Image2DEditor, { si, ei, el })) : el.type === 2 /* Animation */ ? import_mithril.default(".field.full", import_mithril.default("label", "Frames"), import_mithril.default(AnimationEditor, { si, ei, el })) : null)); } }; var SectionCard = { view({ attrs: { si } }) { const section = file.sections[si]; if (!section) return null; const isActive = activeSecIndex === si; const typeStr = SectionTypeToString[section.sectionType]; const hdr = import_mithril.default(`.sec-hdr${isActive ? ".active" : ""}`, { onclick: () => toggleSection(si) }, import_mithril.default("span.sec-arrow", "▶"), import_mithril.default("span.sec-label", typeStr), import_mithril.default("button.x-btn", { title: "Remove section", onclick: (e) => { e.stopPropagation(); removeSection(si); } }, "X")); if (section.sectionType === 32 /* CustomFont */) { return import_mithril.default(`.sec-card.open${isActive ? ".active" : ""}`, import_mithril.default(`.sec-hdr${isActive ? ".active" : ""}`, { onclick: () => toggleSection(si) }, import_mithril.default("span.sec-arrow", "▶"), import_mithril.default("span.sec-label", "Custom Font"), import_mithril.default("span.sec-badge", "1 el"), import_mithril.default("button.x-btn", { title: "Remove section", onclick: (e) => { e.stopPropagation(); removeSection(si); } }, "X")), import_mithril.default(".el-list", "?")); } const elSection = section; return import_mithril.default(`.sec-card.open${isActive ? ".active" : ""}`, import_mithril.default(`.sec-hdr${isActive ? ".active" : ""}`, { onclick: () => toggleSection(si) }, import_mithril.default("span.sec-arrow", "▶"), import_mithril.default("span.sec-label", typeStr), import_mithril.default("span.sec-badge", `${elSection.elements.length} el`), import_mithril.default("button.x-btn", { title: "Remove section", onclick: (e) => { e.stopPropagation(); removeSection(si); } }, "X")), section.sectionType === 2 /* ElementsTimespan */ ? import_mithril.default(".el-list", [["Start Time", "startTimestamp"], ["Stop Time", "endTimestamp"]].map(([label, key]) => { let posix = section[key]; if (!posix) { posix = BigInt(Math.floor(Date.now() / 1000)); setSectionField(si, key, posix); } const dtLocal = new Date(Number(posix) * 1000).toISOString().slice(0, 16); return import_mithril.default(".field", import_mithril.default("label", label), import_mithril.default("input[type=datetime-local]", { value: dtLocal, onchange: (e) => { const ms = new Date(e.target.value).getTime(); setSectionField(si, key, BigInt(Math.floor(ms / 1000))); } })); })) : null, import_mithril.default(".el-list", elSection.elements.map((el, ei) => import_mithril.default(ElementItem, { key: String(ei), si, ei, el })), import_mithril.default("button.add-el", { onclick: () => addElement(si) }, "+ add element"))); } }; var SectionsList = { view() { if (!file.sections.length) return import_mithril.default(".empty-state", import_mithril.default.trust("No sections yet.
Use Add section to get started.")); if (activeSecIndex === null && file.sections.length === 1) activeSecIndex = 0; return import_mithril.default("", file.sections.map((_, si) => import_mithril.default(SectionCard, { key: String(si), si }))); } }; var MetaPanel = { view() { const section = getSectionByIndex(activeSecIndex); return import_mithril.default("", import_mithril.default(".meta-row", import_mithril.default("label", "Selected section"), section ? import_mithril.default("select.meta-val.green", { value: SectionTypeToString[section.sectionType], onchange: (e) => activeSecIndex !== null && setSectionType(activeSecIndex, e.target.value) }, Object.values(SectionTypeToString).map((name) => import_mithril.default("option", { value: name, selected: name === SectionTypeToString[section.sectionType] }, name))) : import_mithril.default("span.meta-val.green", "-")), import_mithril.default(".meta-row", import_mithril.default("label", "Elements"), import_mithril.default("span.meta-val", section && "elements" in section ? `${section.elements.length} element(s)` : "-")), import_mithril.default(".meta-row", import_mithril.default("label", "Section flags"), ["drawFront", "drawBack", "clearBuffer"].map((flag, i) => import_mithril.default("label.flag-check", { style: i > 0 ? "margin-left:-8px" : "" }, import_mithril.default("input[type=checkbox]", { checked: section ? !!section.flags?.[flag] : false, onchange: (e) => setSectionFlag(flag, e.target.checked) }), " " + flag)))); } }; var activeDemoName = null; var DemoButtons = { view() { return Object.entries(DEMO).map(([name, fn]) => import_mithril.default("button.tb-btn", { style: activeDemoName === name ? "color:#33ff66" : "", onclick: async () => { const ok = await guardDirty(); if (!ok) return; file = fn(); activeSecIndex = null; activeElIndex = null; currentFilename = name.toLowerCase(); const filenameEl = document.getElementById("filename"); if (filenameEl) filenameEl.textContent = currentFilename; activeDemoName = name; markClean(); triggerPreview(); import_mithril.default.redraw(); } }, name)); } }; import_mithril.default.mount(document.getElementById("sections-wrap"), SectionsList); import_mithril.default.mount(document.getElementById("demo-btns"), DemoButtons); import_mithril.default.mount(document.getElementById("sec-meta"), MetaPanel); async function clearAll() { if (isDirty && file.sections.length) { const ok = await showConfirm("Clear all sections?", [ { label: "Cancel", action: false }, { label: "Clear", primary: true, action: true } ]); if (!ok) return; } file = new MonoDisplayFile([]); activeSecIndex = null; activeElIndex = null; currentFilename = "untitled"; const filenameEl = document.getElementById("filename"); if (filenameEl) filenameEl.textContent = "untitled"; localStorage.removeItem(STORAGE_KEY); markClean(); triggerPreview(); import_mithril.default.redraw(); } Object.assign(window, { loadBin, exportBin, addSection, clearAll, cycleTheme }); loadFromStorage(); triggerPreview();