Repository: zengming00/node-gd-bmp Branch: master Commit: 12e57cf23250 Files: 14 Total size: 81.8 KB Directory structure: gitextract_s_bnrcdu/ ├── .eslintrc.js ├── .gitignore ├── .vscode/ │ └── launch.json ├── LICENSE ├── README.md ├── output/ │ └── .gitkeep ├── package.json ├── res/ │ └── gb16.uc2 ├── src/ │ ├── BMP24.ts │ ├── demo/ │ │ ├── filter.ts │ │ ├── gb16Font.ts │ │ └── test.ts │ └── font.ts └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintrc.js ================================================ module.exports = { env: { es2021: true, node: true, }, extends: [ 'standard' ], parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: 12, sourceType: 'module', }, plugins: [ '@typescript-eslint' ], rules: { 'padded-blocks': 'off', 'one-var': 'off', 'no-multiple-empty-lines': 'off', 'space-before-function-paren': ['error', { 'anonymous': 'always', 'named': 'never', 'asyncArrow': 'never', }], 'indent': ['error', 4, { 'SwitchCase': 1, }], 'semi': ['error', 'always'], 'quote-props': ['error', 'consistent'], 'comma-dangle': ['error', { 'arrays': 'never', 'objects': 'always-multiline', 'imports': 'never', 'exports': 'never', 'functions': 'never', }], }, }; ================================================ FILE: .gitignore ================================================ /output/*.bmp /dist/ /node_modules/ ================================================ FILE: .vscode/launch.json ================================================ { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "启动程序", "skipFiles": [ "/**" ], "program": "${workspaceFolder}/src/demo/font.ts", "outFiles": [ "${workspaceFolder}/**/*.js" ], }, ] } ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2017 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ 996.icu # node-gd-bmp light and high speed and 100% js implement graphical library, it can running in any platform, BUT only support bmp 24bit format, internal contains 3 fonts # demo 请看 src/demo,里面有关于如何做验证码、如何做图像处理的案例 # API **获得对象的两种方式:** * 构造函数,创建指定宽高的图片对象(初始化为一张全黑的图片) ```javascript import { BMP24 } from 'gd-bmp'; const BMP24 = require('gd-bmp').BMP24; const img = new BMP24(w, h); ``` * 从文件加载bmp (注意!必需确保文件是24位bmp) ```javascript const img = await BMP24.loadFromFile(file); ``` **获取BMP文件数据** ```js obj.getFileData() ``` **Data Url** ```js const img = makeImg(); const dataUrl = img.getDataUrl(); res.setHeader('Content-Type', 'text/html'); res.end(``); ``` **API** ```js // 画点, RGB颜色值(例如红色0xff0000) obj.drawPoint(x, y, rgb) // 画点, rgb:{ blue:number, green:number, red:number }, 注意颜色值要保证在0-255之间(包含0和255) obj.drawPointRGB(x, y, rgb) // 获取像素点颜色, 返回 rgb: { blue:number, green:number, red:number } ,如果xy坐标超出图片范围将抛出错误 obj.getPointRGB(x, y) // 画线 obj.drawLine(x1, y1, x2, y2, rgb) // 画矩形 obj.drawRect(x, y, w, h, rgb) // 实心矩形 obj.fillRect(x, y, w, h, rgb) // 画圆 obj.drawCircle(x, y, r, rgb) //画字符&字符串,font参数为字库,color为RGB颜色值(例如红色0xff0000) obj.drawChar(ch, x, y, font, color) obj.drawString(str, x, y, font, color) ``` # 关于字体和颜色 已经内置了三种规格的字体(仅包含大小写英文字母和数字),可以通过:BMP24.font8x16、BMP24.font12x24和BMP24.font16x32得到 另外你也可以参考demo自己生成和定义字体 demo内包含一个支持中文的字库文件,支持65535个字符,需要占用2M内存 颜色采用数值的方式,按RGB排列,例如:红色0xff0000,绿色0x00ff00,蓝色0x0000ff # 只支持24位bmp 推荐用windows自带的画图工具转码bmp # License MIT ================================================ FILE: output/.gitkeep ================================================ ================================================ FILE: package.json ================================================ { "name": "gd-bmp", "version": "2.0.1", "description": "light and high speed and 100% js implement graphical library, it can running in any platform", "main": "dist/BMP24.js", "typings": "dist/BMP24.d.ts", "files": [ "dist/*" ], "scripts": { "compile": "rm -rf dist && tsc", "lint": "eslint --fix ./src/**/*.ts", "test": "npm run compile && node ./dist/demo/filter", "test2": "npm run compile && node ./dist/demo/test", "prepublish": "npm run lint && npm run compile" }, "keywords": [ "gd", "bmp" ], "author": "zengming", "license": "MIT", "repository": { "type": "git", "url": "git+https://github.com/zengming00/node-gd-bmp.git" }, "bugs": { "url": "https://github.com/zengming00/node-gd-bmp/issues" }, "homepage": "https://github.com/zengming00/node-gd-bmp#readme", "dependencies": { "@types/node": "^14.14.3" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^4.5.0", "@typescript-eslint/parser": "^4.5.0", "eslint": "^7.12.0", "eslint-config-standard": "^15.0.0", "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.2", "typescript": "^4.0.3" } } ================================================ FILE: src/BMP24.ts ================================================ // 初始版本确定于:20161103 18:31 import * as fs from 'fs'; import { IFont, font12x24, font16x32, font8x16 } from './font'; export { IFont }; console.log("The '996' working schedule is inhumane."); console.log('为了您的身体健康,为了国内的软件行业健康发展,请拒绝接受违法的996工作制'); export interface IRGB { red: number; green: number; blue: number; } function makeHeader(buf: Buffer, fileLen: number, dataLen: number, w: number, h: number) { const header = buf; header.write('BM'); header.writeInt32LE(fileLen, 2); // BMP文件大小 header.writeInt8(122, 6); // 特殊标识 header.writeInt32LE(54, 10); header.writeInt32LE(40, 14); header.writeInt32LE(w, 18); // w header.writeInt32LE(h, 22); // h header.writeInt16LE(1, 26); header.writeInt16LE(24, 28); header.writeInt32LE(dataLen, 34); // 数据大小 } export class BMP24 { public static font8x16 = font8x16; public static font12x24 = font12x24; public static font16x32 = font16x32; public w: number; public h: number; public fileLen: number; protected _lineByteNum: number; protected _data: Buffer; constructor(w: number, h: number) { /* BMP数据的每一行必需能被4整除 例如宽度=10则一行的实际字节数=32=Math.ceil(10*3/4)*4,补了2字节的0 例如宽度=11则一行的实际字节数=36=Math.ceil(11*3/4)*4,补了3字节的0 算法: Math.ceil(宽度*每个像素占用的字节/4)*4 */ const lineByteNum = Math.ceil(w * 3 / 4) * 4; // 每行数据的实际字节数 const dataLen = lineByteNum * h; this.w = w; this.h = h; this.fileLen = dataLen + 54; this._lineByteNum = lineByteNum; this._data = Buffer.alloc(this.fileLen); // BMP文件头初始化 makeHeader(this._data, this.fileLen, dataLen, w, h); } // 获取BMP整个文件数据 public getFileData() { return this._data; } public getDataUrl() { return `data:image/bmp;base64,${this._data.toString('base64')}`; } // 获取BMP图像数据 public getData() { return this._data.slice(54); } // 画点 public drawPoint(x: number, y: number, rgb: number) { this.drawPointRGB(x, y, { red: (rgb >> 16) & 0xFF, green: (rgb >> 8) & 0xFF, blue: rgb & 0xFF, }); } // 画点 public drawPointRGB(x: number, y: number, rgb: IRGB) { if (x >= this.w || y >= this.h || x < 0 || y < 0) { return; } // 数据第一行为图像的最底一行,颜色数据在十六进制编辑器中的排列是蓝绿红 const line = this.h - y - 1; // 因为data的第一行是图片的最后一行,所以要反过来 const pos = 54 + (x * 3) + (this._lineByteNum * line); this._data.writeUInt8(rgb.blue, pos); // 蓝 this._data.writeUInt8(rgb.green, pos + 1); // 绿 this._data.writeUInt8(rgb.red, pos + 2); // 红 } /** * 获取像素点颜色, 返回 { blue:number, green:number, red:number } */ public getPointRGB(x: number, y: number): IRGB { if (x >= this.w || y >= this.h || x < 0 || y < 0) { throw new Error('out of range'); } // 数据第一行为图像的最底一行,颜色数据在十六进制编辑器中的排列是蓝绿红 const line = this.h - y - 1; // 因为data的第一行是图片的最后一行,所以要反过来 const pos = 54 + (x * 3) + (this._lineByteNum * line); return { blue: this._data.readUInt8(pos), green: this._data.readUInt8(pos + 1), red: this._data.readUInt8(pos + 2), }; } // 画水平线 public drawLineH(x1: number, x2: number, y: number, rgb: number) { if (x1 > x2) { const tmp = x2; x2 = x1; x1 = tmp; } for (; x1 <= x2; x1++) { this.drawPoint(x1, y, rgb); } } // 画垂直线 public drawLineV(y1: number, y2: number, x: number, rgb: number) { if (y1 > y2) { const tmp = y2; y2 = y1; y1 = tmp; } for (; y1 <= y2; y1++) { this.drawPoint(x, y1, rgb); } } public drawLine(x1: number, y1: number, x2: number, y2: number, rgb: number) { let x = x1; let y = y1; let dx = x2 > x1 ? (x2 - x1) : (x1 - x2); let dy = y2 > y1 ? (y2 - y1) : (y1 - y2); let interchange = false; const s1 = x2 > x1 ? 1 : -1; const s2 = y2 > y1 ? 1 : -1; if (dy > dx) { const temp = dx; dx = dy; dy = temp; interchange = true; } let p = (dy << 1) - dx; for (let i = 0; i <= dx; i++) { this.drawPoint(x, y, rgb); if (p >= 0) { if (interchange) { x += s1; } else { y += s2; } p -= (dx << 1); } if (interchange) { y += s2; } else { x += s1; } p += (dy << 1); } } // 画空心矩形 public drawRect(x: number, y: number, w: number, h: number, rgb: number) { const x2 = x + w - 1; const y2 = y + h - 1; this.drawLineH(x, x2, y, rgb); this.drawLineH(x, x2, y2, rgb); this.drawLineV(y, y2, x, rgb); this.drawLineV(y, y2, x2, rgb); } // 画实心矩形 public fillRect(x: number, y: number, w: number, h: number, rgb: number) { let x2 = x + w - 1; let y2 = y + h - 1; if (x > x2) { const tmp = x2; x2 = x; x = tmp; } if (y > y2) { const tmp = y2; y2 = y; y = tmp; } for (; y <= y2; y++) { for (let xx = x; xx <= x2; xx++) { this.drawPoint(xx, y, rgb); } } } // 画圆,xy为中心点位置 public drawCircle(x: number, y: number, r: number, rgb: number) { let a = 0; let b = r; // c = 1.25 - r; let c = 3 - 2 * r; while (a < b) { this.drawPoint(x + a, y + b, rgb); this.drawPoint(x - a, y + b, rgb); this.drawPoint(x + a, y - b, rgb); this.drawPoint(x - a, y - b, rgb); this.drawPoint(x + b, y + a, rgb); this.drawPoint(x - b, y + a, rgb); this.drawPoint(x + b, y - a, rgb); this.drawPoint(x - b, y - a, rgb); if (c < 0) { c = c + 4 * a + 6; } else { c = c + 4 * (a - b) + 10; b -= 1; } a += 1; } if (a === b) { this.drawPoint(x + a, y + b, rgb); this.drawPoint(x - a, y + b, rgb); this.drawPoint(x + a, y - b, rgb); this.drawPoint(x - a, y + b, rgb); this.drawPoint(x + b, y + a, rgb); this.drawPoint(x - b, y + a, rgb); this.drawPoint(x + b, y - a, rgb); this.drawPoint(x - b, y - a, rgb); } } public drawChar(ch: string, x: number, y: number, font: IFont, color: number) { const index = font.fonts.indexOf(ch); if (index < 0) { return; } const fontData = font.data[index]; let y0 = y; let x0 = x; for (const data of fontData) { x0 = x; for (let b = data; b > 0; b <<= 1) { if (b & 0x80) { this.drawPoint(x0, y0, color); } x0++; } y0++; if ((y0 - y) >= font.h) { y0 = y; x += 8; } } } public drawString(str: string, x: number, y: number, font: IFont, color: number) { for (const c of str) { this.drawChar(c, x, y, font, color); x += font.w; } } // 从文件加载bmp, 注意!必需确保文件是24位bmp public static async loadFromFile(filename: string) { return new Promise(function (resolve, reject) { fs.readFile(filename, (err, data) => { if (err) { return reject(err); } // 简单的判断是否是支持的格式 if (data.readInt32LE(10) !== 54) { return reject(new Error('unsupported format: headlen !== 54')); } if (data.readInt32LE(14) !== 40) { return reject(new Error('unsupported format: bitmapInfoHead.length !== 40')); } if (data.readInt32LE(28) !== 24) { return reject(new Error('unsupported format: only support 24bit bmp')); } const img = new BMP24(0, 0); img.w = data.readInt32LE(18); img.h = data.readInt32LE(22); img.fileLen = data.length; img._lineByteNum = Math.ceil(img.w * 3 / 4) * 4; img._data = data; resolve(img); }); }); } } // /////////////////////////// Copyright zengming 2010-2020 ///////////////////////////////////// ================================================ FILE: src/demo/filter.ts ================================================ import * as fs from 'fs'; import * as path from 'path'; import { BMP24 } from '../BMP24'; // gd-bmp /** * 高斯模糊 * @param {Array} pixes pix array * @param {Number} width 图片的宽度 * @param {Number} height 图片的高度 * @param {Number} radius 取样区域半径, 正数, 可选, 默认为 3.0 * @param {Number} sigma 标准方差, 可选, 默认取值为 radius / 3 * @return {Array} */ function gaussBlur(img: BMP24, radius: number, sigma?: number) { const width = img.w; const height = img.h; const gaussMatrix = []; let gaussSum = 0; let x, y; let r, g, b, a; let i, j, k, len; const mradius = Math.floor(radius || 3); const msigma = sigma || radius / 3; a = 1 / (Math.sqrt(2 * Math.PI) * msigma); b = -1 / (2 * msigma * msigma); // 生成高斯矩阵 for (i = 0, x = -mradius; x <= mradius; x++, i++) { g = a * Math.exp(b * x * x); gaussMatrix[i] = g; gaussSum += g; } // 归一化, 保证高斯矩阵的值在[0,1]之间 for (i = 0, len = gaussMatrix.length; i < len; i++) { gaussMatrix[i] /= gaussSum; } // x 方向一维高斯运算 for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { r = g = b = a = 0; gaussSum = 0; for (j = -mradius; j <= mradius; j++) { k = x + j; if (k >= 0 && k < width) { // 确保 k 没超出 x 的范围 // r,g,b,a 四个一组 // i = (y * width + k) * 4; const c = img.getPointRGB(k, y); r += c.red * gaussMatrix[j + mradius]; g += c.green * gaussMatrix[j + mradius]; b += c.blue * gaussMatrix[j + mradius]; // a += pixes[i + 3] * gaussMatrix[j]; gaussSum += gaussMatrix[j + mradius]; } } // i = (y * width + x) * 4; // 除以 gaussSum 是为了消除处于边缘的像素, 高斯运算不足的问题 // console.log(gaussSum) img.drawPointRGB(x, y, { red: r / gaussSum, green: g / gaussSum, blue: b / gaussSum, }); // pixes[i + 3] = a ; } } // y 方向一维高斯运算 for (x = 0; x < width; x++) { for (y = 0; y < height; y++) { r = g = b = a = 0; gaussSum = 0; for (j = -mradius; j <= mradius; j++) { k = y + j; if (k >= 0 && k < height) { // 确保 k 没超出 y 的范围 // i = (k * width + x) * 4; const c = img.getPointRGB(x, k); r += c.red * gaussMatrix[j + mradius]; g += c.green * gaussMatrix[j + mradius]; b += c.blue * gaussMatrix[j + mradius]; // a += pixes[i + 3] * gaussMatrix[j]; gaussSum += gaussMatrix[j + mradius]; } } // i = (y * width + x) * 4; img.drawPointRGB(x, y, { red: r / gaussSum, green: g / gaussSum, blue: b / gaussSum, }); // pixes[i] = r ; // pixes[i + 1] = g ; // pixes[i + 2] = b ; // pixes[i + 3] = a ; } } } // 锐化 function sharp(img: BMP24, arg: number) { const lamta = arg || 0.6; const width = img.w; const height = img.h; // 根据像素点的左上角、上边和左边像素进行运算 // col 0 1 2 3 4 // row // 0: a:0 b:1 2 3 4 // 1: e:5 c:6 7 8 9 function calculateColor(a: number, b: number, e: number, c: number) { const delta = c - (b + e + a) / 3; let r = c + delta * lamta; // 颜色值边界检查 r = r > 255 ? 255 : r < 0 ? 0 : r; return r; } for (let y = 1; y < height; y++) { for (let x = 1; x < width; x++) { const a = img.getPointRGB(x - 1, y - 1); const b = img.getPointRGB(x, y - 1); const e = img.getPointRGB(x - 1, y); const c = img.getPointRGB(x, y); const color = { red: calculateColor(a.red, b.red, e.red, c.red), green: calculateColor(a.green, b.green, e.green, c.green), blue: calculateColor(a.blue, b.blue, e.blue, c.blue), }; img.drawPointRGB(x, y, color); } } } const srcFile = path.resolve(__dirname, '../../res/lena.bmp'); const sharpFile = path.resolve(__dirname, '../../output/sharp.bmp'); const gaussBlurFile = path.resolve(__dirname, '../../output/gaussBlur.bmp'); async function test() { const img = await BMP24.loadFromFile(srcFile); console.log('w=%d, h=%d', img.w, img.h); console.time('time'); sharp(img, 1); fs.writeFileSync(sharpFile, img.getFileData()); gaussBlur(img, 30); fs.writeFileSync(gaussBlurFile, img.getFileData()); console.log('done.'); console.timeEnd('time'); } test().catch(function (err) { console.log(err); }); ================================================ FILE: src/demo/gb16Font.ts ================================================ import * as fs from 'fs'; import * as http from 'http'; import * as querystring from 'querystring'; import * as path from 'path'; import { BMP24 } from '../BMP24'; const CHAR_H = 16; const EN_CHAR_W = 8; const CN_CHAR_W = 16; // 字库,支持中文,总共65536个字符 const fontPath = path.join(__dirname, '../../res/gb16.uc2'); const fontBuffer = fs.readFileSync(fontPath); function getCharWidthHeight(char: number | string) { const o = { width: CN_CHAR_W, height: CHAR_H }; if (typeof char === 'string') { char = char.charCodeAt(0); } if (char < 128) { o.width = EN_CHAR_W; } return o; } function drawChar(img: BMP24, char: number | string, x: number, y: number, color: number) { if (typeof char === 'string') { char = char.charCodeAt(0); } const offset = char * 32; // 一行两字节,高度16,所以2*16=32字节 const charData = fontBuffer.slice(offset, offset + 32); for (let iy = 0; iy < CHAR_H; iy++) { let data = charData.readUInt16BE(iy * 2); for (let ix = 0; data > 0; ix++) { if (data & (1 << 16)) { img.drawPoint(ix + x, iy + y, color); } data <<= 1; } } } function drawString(img: BMP24, str: string, x: number, y: number, color: number) { for (const c of str) { drawChar(img, c, x, y, color); x += getCharWidthHeight(c).width; } } http.createServer((req, res) => { switch (req.url) { case '/favicon.ico': res.end(); break; default: { if (req.url) { let str = req.url; str = str.substring(str.indexOf('?') + 1); const o = querystring.parse(str); if (typeof o.str === 'string') { const img = new BMP24(100, 40); drawString(img, o.str, 0, 0, 0xff0000); res.setHeader('Content-Type', 'image/bmp'); res.end(img.getFileData()); } else if ((typeof o.start === 'string') && (typeof o.len === 'string')) { console.time('printCharCode'); const img = new BMP24(800, 800); img.fillRect(0, 0, img.w, img.h, 0xffffff); const start = parseInt(o.start, 10); const stop = start + parseInt(o.len, 10); let x = 0, y = 0; for (let i = start; i < stop; i++) { if (x >= (img.w - getCharWidthHeight(i).width)) { y += CHAR_H; x = 0; } drawChar(img, i, x, y, 0xff0000); x += getCharWidthHeight(i).width; } console.timeEnd('printCharCode'); res.setHeader('Content-Type', 'image/bmp'); res.end(img.getFileData()); } } res.end(); } } }).listen(3000); console.log('localhost:3000'); console.log('http://localhost:3000/?str=中国'); console.log('http://localhost:3000/?start=0&len=2000'); ================================================ FILE: src/demo/test.ts ================================================ import * as http from 'http'; import { BMP24 } from '../BMP24'; // gd-bmp import * as font from '../font'; /* 用PCtoLCD2002取字模 行列式扫描,正向取模(高位在前) */ const cnfonts: font.IFont = { // 自定义字模 w: 16, h: 16, fonts: '中国', data: [ [0x01, 0x01, 0x01, 0x01, 0x3F, 0x21, 0x21, 0x21, 0x21, 0x21, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x08, 0x08, 0x08, 0x08, 0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00], /* "中",0 */ [0x00, 0x7F, 0x40, 0x40, 0x5F, 0x41, 0x41, 0x4F, 0x41, 0x41, 0x41, 0x5F, 0x40, 0x40, 0x7F, 0x40, 0x00, 0xFC, 0x04, 0x04, 0xF4, 0x04, 0x04, 0xE4, 0x04, 0x44, 0x24, 0xF4, 0x04, 0x04, 0xFC, 0x04] /* "国",1 */ ], }; // 测试字库 function makeImg2() { const img = new BMP24(300, 140); img.drawString('helloworld', 20, 10, BMP24.font8x16, 0xff0000); img.drawString('helloworld', 20, 25, BMP24.font12x24, 0x00ff00); img.drawString('helloworld', 20, 50, BMP24.font16x32, 0x0000ff); img.drawString('中国', 20, 85, cnfonts, 0xffffff); return img; } function rand(min: number, max: number) { return ~~(Math.random() * (max - min) + min); } // 制造验证码图片 function makeCapcha() { const img = new BMP24(100, 40); img.drawRect(0, 0, img.w, img.h, rand(0, 0xffffff)); img.fillRect(1, 1, img.w - 2, img.h - 2, 0xffffff); img.drawCircle(rand(0, 100), rand(0, 40), rand(10, 40), rand(0, 0xffffff)); img.fillRect(rand(0, 100), rand(0, 40), rand(10, 35), rand(10, 35), rand(0, 0xffffff)); img.drawLine(rand(0, 100), rand(0, 40), rand(0, 100), rand(0, 40), rand(0, 0xffffff)); // 画曲线 const w = img.w / 2; const h = img.h; const color = rand(0, 0xffffff); const y1 = rand(-5, 5); const w2 = rand(10, 15); const h3 = rand(4, 6); const bl = rand(1, 5); for (let i = -w; i < w; i += 0.1) { const yy = Math.floor(h / h3 * Math.sin(i / w2) + h / 2 + y1); const xx = Math.floor(i + w); for (let j = 0; j < bl; j++) { img.drawPoint(xx, yy + j, color); } } const p = 'ABCDEFGHKMNPQRSTUVWXYZ3456789'; let str = ''; for (let a = 0; a < 5; a++) { str += p.charAt(Math.random() * p.length | 0); } const fonts = [BMP24.font8x16, BMP24.font12x24, BMP24.font16x32]; // eslint-disable-next-line one-var let x = 15, y = 8; for (const ch of str) { const f = fonts[Math.random() * fonts.length | 0]; y = 8 + rand(-10, 10); img.drawChar(ch, x, y, f, rand(0, 0xffffff)); x += f.w + rand(2, 8); } return img; } // 测试生成验证码的效率 const start = Date.now(); let n = 0; while ((Date.now() - start) < 1000) { makeCapcha(); // makeImg2(); n++; } console.log(`1秒钟生成:${n}`); http.createServer((req, res) => { switch (req.url) { case '/favicon.ico': res.end(); break; case '/img2': { console.time('makeImg2'); const img = makeImg2(); console.timeEnd('makeImg2'); res.setHeader('Content-Type', 'image/bmp'); res.end(img.getFileData()); break; } case '/data': { const img = makeImg2(); const dataUrl = img.getDataUrl(); res.setHeader('Content-Type', 'text/html'); res.end(``); break; } case '/': default: { console.time('makeCapcha'); const img = makeCapcha(); console.timeEnd('makeCapcha'); res.setHeader('Content-Type', 'image/bmp'); res.end(img.getFileData()); } } }).listen(3000); console.log('localhost:3000'); ================================================ FILE: src/font.ts ================================================ /* 用PCtoLCD2002取字模 行列式扫描,正向取模(高位在前) */ const fonts = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; const font8x16Data = [ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x1E, 0x22, 0x42, 0x42, 0x3F, 0x00, 0x00], /* "a",0 */ [0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00], /* "b",1 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x40, 0x40, 0x40, 0x22, 0x1C, 0x00, 0x00], /* "c",2 */ [0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x02, 0x1E, 0x22, 0x42, 0x42, 0x42, 0x26, 0x1B, 0x00, 0x00], /* "d",3 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x7E, 0x40, 0x40, 0x42, 0x3C, 0x00, 0x00], /* "e",4 */ [0x00, 0x00, 0x00, 0x0F, 0x11, 0x10, 0x10, 0x7E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "f",5 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x44, 0x44, 0x38, 0x40, 0x3C, 0x42, 0x42, 0x3C], /* "g",6 */ [0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00], /* "h",7 */ [0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "i",8 */ [0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x78], /* "j",9 */ [0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x40, 0x4E, 0x48, 0x50, 0x68, 0x48, 0x44, 0xEE, 0x00, 0x00], /* "k",10 */ [0x00, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "l",11 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x49, 0x49, 0x49, 0x49, 0x49, 0xED, 0x00, 0x00], /* "m",12 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00], /* "n",13 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00], /* "o",14 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x44, 0x78, 0x40, 0xE0], /* "p",15 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x22, 0x42, 0x42, 0x42, 0x22, 0x1E, 0x02, 0x07], /* "q",16 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x32, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00], /* "r",17 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x40, 0x3C, 0x02, 0x42, 0x7C, 0x00, 0x00], /* "s",18 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0C, 0x00, 0x00], /* "t",19 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00], /* "u",20 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x28, 0x10, 0x10, 0x00, 0x00], /* "v",21 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x92, 0x92, 0xAA, 0xAA, 0x44, 0x44, 0x00, 0x00], /* "w",22 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x24, 0x18, 0x18, 0x18, 0x24, 0x76, 0x00, 0x00], /* "x",23 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x28, 0x18, 0x10, 0x10, 0xE0], /* "y",24 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x44, 0x08, 0x10, 0x10, 0x22, 0x7E, 0x00, 0x00], /* "z",25 */ [0x00, 0x00, 0x00, 0x10, 0x10, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x44, 0x42, 0x42, 0xE7, 0x00, 0x00], /* "A",26 */ [0x00, 0x00, 0x00, 0xF8, 0x44, 0x44, 0x44, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00], /* "B",27 */ [0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x42, 0x44, 0x38, 0x00, 0x00], /* "C",28 */ [0x00, 0x00, 0x00, 0xF8, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00], /* "D",29 */ [0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x42, 0x42, 0xFC, 0x00, 0x00], /* "E",30 */ [0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00], /* "F",31 */ [0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x80, 0x80, 0x80, 0x8E, 0x84, 0x44, 0x44, 0x38, 0x00, 0x00], /* "G",32 */ [0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00], /* "H",33 */ [0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "I",34 */ [0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF0], /* "J",35 */ [0x00, 0x00, 0x00, 0xEE, 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44, 0x44, 0xEE, 0x00, 0x00], /* "K",36 */ [0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0xFE, 0x00, 0x00], /* "L",37 */ [0x00, 0x00, 0x00, 0xEE, 0x6C, 0x6C, 0x6C, 0x6C, 0x54, 0x54, 0x54, 0x54, 0x54, 0xD6, 0x00, 0x00], /* "M",38 */ [0x00, 0x00, 0x00, 0xC7, 0x62, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x4A, 0x46, 0x46, 0xE2, 0x00, 0x00], /* "N",39 */ [0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00], /* "O",40 */ [0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00], /* "P",41 */ [0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0xB2, 0xCA, 0x4C, 0x38, 0x06, 0x00], /* "Q",42 */ [0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x7C, 0x48, 0x48, 0x44, 0x44, 0x42, 0xE3, 0x00, 0x00], /* "R",43 */ [0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x40, 0x20, 0x18, 0x04, 0x02, 0x42, 0x42, 0x7C, 0x00, 0x00], /* "S",44 */ [0x00, 0x00, 0x00, 0xFE, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00], /* "T",45 */ [0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00], /* "U",46 */ [0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x44, 0x24, 0x24, 0x28, 0x28, 0x18, 0x10, 0x10, 0x00, 0x00], /* "V",47 */ [0x00, 0x00, 0x00, 0xD6, 0x92, 0x92, 0x92, 0x92, 0xAA, 0xAA, 0x6C, 0x44, 0x44, 0x44, 0x00, 0x00], /* "W",48 */ [0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0xE7, 0x00, 0x00], /* "X",49 */ [0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00], /* "Y",50 */ [0x00, 0x00, 0x00, 0x7E, 0x84, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x42, 0x42, 0xFC, 0x00, 0x00], /* "Z",51 */ [0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00], /* "0",52 */ [0x00, 0x00, 0x00, 0x10, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00], /* "1",53 */ [0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x04, 0x04, 0x08, 0x10, 0x20, 0x42, 0x7E, 0x00, 0x00], /* "2",54 */ [0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x04, 0x18, 0x04, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00], /* "3",55 */ [0x00, 0x00, 0x00, 0x04, 0x0C, 0x14, 0x24, 0x24, 0x44, 0x44, 0x7E, 0x04, 0x04, 0x1E, 0x00, 0x00], /* "4",56 */ [0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x58, 0x64, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00], /* "5",57 */ [0x00, 0x00, 0x00, 0x1C, 0x24, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00], /* "6",58 */ [0x00, 0x00, 0x00, 0x7E, 0x44, 0x44, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00], /* "7",59 */ [0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00], /* "8",60 */ [0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x02, 0x24, 0x38, 0x00, 0x00] /* "9",61 */ ]; const font12x24Data = [ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x30, 0x30, 0x07, 0x1C, 0x30, 0x60, 0x60, 0x60, 0x71, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xD0, 0xF0, 0x00, 0x00, 0x00], /* "a",0 */ [0x00, 0x00, 0x00, 0x00, 0x10, 0x70, 0x30, 0x30, 0x30, 0x30, 0x33, 0x3C, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "b",1 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x31, 0x31, 0x61, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00], /* "c",2 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x31, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x31, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x80, 0x00, 0x00, 0x00], /* "d",3 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x10, 0x30, 0x3F, 0x30, 0x30, 0x30, 0x18, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00], /* "e",4 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x0C, 0x0C, 0x0C, 0x7F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x60, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00], /* "f",5 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x30, 0x30, 0x19, 0x1F, 0x30, 0x3E, 0x1F, 0x60, 0x60, 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x90, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x60, 0xE0, 0x80], /* "g",6 */ [0x00, 0x00, 0x00, 0x00, 0x10, 0x70, 0x30, 0x30, 0x30, 0x30, 0x37, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x00, 0x00, 0x00], /* "h",7 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00], /* "i",8 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x33, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00], /* "j",9 */ [0x00, 0x00, 0x00, 0x00, 0x10, 0x70, 0x30, 0x30, 0x30, 0x30, 0x33, 0x31, 0x33, 0x32, 0x36, 0x3E, 0x3B, 0x33, 0x31, 0x31, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xE0, 0x00, 0x00, 0x00], /* "k",10 */ [0x00, 0x00, 0x00, 0x00, 0x02, 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00], /* "l",11 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x77, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, 0x00, 0x00, 0x00], /* "m",12 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x00, 0x00, 0x00], /* "n",13 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00], /* "o",14 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x37, 0x30, 0x30, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "p",15 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x31, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x31, 0x1E, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0], /* "q",16 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0x1A, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "r",17 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x30, 0x30, 0x1C, 0x0F, 0x01, 0x20, 0x20, 0x30, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60, 0x20, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "s",18 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x0C, 0x0C, 0x7F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00], /* "t",19 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x71, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x39, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0, 0x80, 0x00, 0x00, 0x00], /* "u",20 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x38, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x07, 0x07, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "v",21 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x63, 0x63, 0x67, 0x37, 0x35, 0x39, 0x39, 0x39, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0x20, 0x20, 0x20, 0x20, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00], /* "w",22 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x18, 0x19, 0x0D, 0x0E, 0x06, 0x07, 0x0B, 0x19, 0x11, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0x00, 0x00, 0x00], /* "x",23 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x38, 0x18, 0x18, 0x0D, 0x0D, 0x0D, 0x06, 0x06, 0x02, 0x04, 0x04, 0x28, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "y",24 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x21, 0x23, 0x03, 0x07, 0x06, 0x0E, 0x0C, 0x1C, 0x18, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x60, 0xC0, 0x00, 0x00, 0x00], /* "z",25 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x0E, 0x0B, 0x0B, 0x13, 0x11, 0x11, 0x11, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00], /* "A",26 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x61, 0x60, 0x60, 0x60, 0x60, 0x61, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0xC0, 0x40, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "B",27 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00], /* "C",28 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x63, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00], /* "D",29 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x7F, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, 0xC0, 0x00, 0x00, 0x00], /* "E",30 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x61, 0x61, 0x7F, 0x61, 0x61, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "F",31 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x30, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00], /* "G",32 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00], /* "H",33 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00], /* "I",34 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x61, 0x63, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00], /* "J",35 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x60, 0x61, 0x62, 0x62, 0x64, 0x6C, 0x7C, 0x76, 0x67, 0x63, 0x63, 0x61, 0x60, 0x60, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xE0, 0xF0, 0x00, 0x00, 0x00], /* "K",36 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, 0xC0, 0x00, 0x00, 0x00], /* "L",37 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x70, 0x70, 0x70, 0x59, 0x59, 0x59, 0x59, 0x5A, 0x4E, 0x4E, 0x4E, 0x4E, 0x44, 0x44, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00], /* "M",38 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x70, 0x70, 0x58, 0x58, 0x4C, 0x46, 0x46, 0x43, 0x43, 0x41, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xA0, 0xE0, 0xE0, 0x60, 0x60, 0x20, 0x00, 0x00, 0x00], /* "N",39 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x19, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00], /* "O",40 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "P",41 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x6E, 0x32, 0x31, 0x11, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x80, 0x80, 0xE0, 0xC0, 0x00], /* "Q",42 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7F, 0x66, 0x63, 0x63, 0x61, 0x61, 0x60, 0x60, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0x70, 0x00, 0x00, 0x00], /* "R",43 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x30, 0x60, 0x60, 0x60, 0x70, 0x3C, 0x0F, 0x03, 0x00, 0x00, 0x40, 0x40, 0x60, 0x70, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xE0, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "S",44 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x46, 0x86, 0x86, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x20, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "T",45 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00], /* "U",46 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x70, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x18, 0x0D, 0x0D, 0x0D, 0x0F, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "V",47 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x66, 0x66, 0x66, 0x66, 0x67, 0x37, 0x37, 0x3B, 0x3B, 0x3B, 0x3B, 0x39, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "W",48 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x30, 0x18, 0x18, 0x19, 0x0D, 0x0E, 0x06, 0x06, 0x07, 0x0B, 0x0B, 0x19, 0x11, 0x30, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xC0, 0xE0, 0x00, 0x00, 0x00], /* "X",49 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x70, 0x30, 0x30, 0x18, 0x18, 0x0D, 0x0D, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x60, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00], /* "Y",50 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x20, 0x41, 0x01, 0x03, 0x03, 0x03, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0x18, 0x38, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, 0xC0, 0x00, 0x00, 0x00], /* "Z",51 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x19, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x19, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00], /* "0",52 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x3E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00], /* "1",53 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x40, 0x60, 0x60, 0x00, 0x01, 0x01, 0x03, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0xC0, 0xC0, 0x00, 0x00, 0x00], /* "2",54 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x23, 0x61, 0x61, 0x61, 0x01, 0x03, 0x0E, 0x01, 0x00, 0x00, 0x60, 0x60, 0x60, 0x21, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00], /* "3",55 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x05, 0x09, 0x09, 0x11, 0x21, 0x21, 0x41, 0x7F, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x00, 0x00, 0x00], /* "4",56 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x31, 0x20, 0x00, 0x00, 0x60, 0x60, 0x41, 0x21, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00], /* "5",57 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x30, 0x30, 0x20, 0x60, 0x67, 0x68, 0x70, 0x60, 0x60, 0x60, 0x20, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x00, 0x00, 0x00, 0x00], /* "6",58 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x3F, 0x30, 0x20, 0x20, 0x00, 0x01, 0x01, 0x02, 0x02, 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "7",59 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x30, 0x60, 0x60, 0x60, 0x70, 0x3C, 0x0F, 0x33, 0x20, 0x60, 0x60, 0x60, 0x60, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x40, 0xC0, 0x00, 0x80, 0xC0, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00], /* "8",60 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x31, 0x1E, 0x00, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x40, 0x60, 0x60, 0x60, 0xE0, 0x60, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00] /* "9",61 */ ]; const font16x32Data = [ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x18, 0x30, 0x30, 0x00, 0x01, 0x0E, 0x38, 0x30, 0x60, 0x60, 0x60, 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x30, 0x30, 0x30, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x32, 0xF2, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00], /* "a",0 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1B, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x1E, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "b",1 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "c",2 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x10, 0x18, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, 0x5E, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00], /* "d",3 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x18, 0x10, 0x30, 0x30, 0x3F, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x08, 0x0C, 0x0C, 0xFC, 0x00, 0x00, 0x00, 0x04, 0x08, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "e",4 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x3F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xC3, 0x03, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "f",5 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x08, 0x0C, 0x0F, 0x18, 0x18, 0x0F, 0x0F, 0x10, 0x30, 0x30, 0x30, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0xE0, 0x00, 0x00, 0xF0, 0xFC, 0x0E, 0x06, 0x06, 0x06, 0x1C, 0xF0], /* "g",6 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x1B, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00], /* "h",7 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "i",8 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00, 0x08, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0xC0], /* "j",9 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x1B, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x30, 0x60, 0xC0, 0x80, 0x80, 0x80, 0xC0, 0xE0, 0x60, 0x30, 0x38, 0x18, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "k",10 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "l",11 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x77, 0x39, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xCC, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0x8C, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00], /* "m",12 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x1B, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00], /* "n",13 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x08, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "o",14 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x79, 0x1A, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1C, 0x1E, 0x19, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "p",15 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x10, 0x18, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x3C, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x3C, 0xCC, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F], /* "q",16 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x7E, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x66, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "r",17 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x18, 0x18, 0x18, 0x0E, 0x07, 0x01, 0x00, 0x20, 0x20, 0x30, 0x38, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x1C, 0x0C, 0x04, 0x00, 0x00, 0xC0, 0xF0, 0x38, 0x0C, 0x0C, 0x0C, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "s",18 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x07, 0x3F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x88, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "t",19 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x2F, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "u",20 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x1C, 0x0C, 0x0C, 0x0E, 0x06, 0x06, 0x07, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x18, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "v",21 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x71, 0x30, 0x31, 0x31, 0x19, 0x19, 0x1A, 0x1A, 0x0E, 0x0E, 0x0E, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xC6, 0xC4, 0xC4, 0xC4, 0xC8, 0xC8, 0x68, 0x68, 0x70, 0x70, 0x70, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00], /* "w",22 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0E, 0x0E, 0x07, 0x03, 0x03, 0x01, 0x01, 0x02, 0x06, 0x04, 0x08, 0x18, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x10, 0x20, 0x20, 0x40, 0x80, 0xC0, 0xC0, 0xE0, 0x60, 0x30, 0x30, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "x",23 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x32, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x18, 0x10, 0x10, 0x10, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00], /* "y",24 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x30, 0x20, 0x20, 0x00, 0x01, 0x01, 0x03, 0x07, 0x0E, 0x0C, 0x1C, 0x38, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x30, 0x70, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x04, 0x04, 0x0C, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "z",25 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x02, 0x06, 0x04, 0x04, 0x04, 0x0C, 0x08, 0x08, 0x08, 0x1F, 0x10, 0x10, 0x10, 0x30, 0x20, 0x20, 0x60, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "A",26 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0xE0, 0x18, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "B",27 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x08, 0x18, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x1C, 0x0C, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "C",28 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x70, 0x18, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x0C, 0x08, 0x18, 0x70, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "D",29 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x04, 0x06, 0x02, 0x00, 0x10, 0x10, 0x30, 0xF0, 0x30, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x0C, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00], /* "E",30 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x0E, 0x02, 0x03, 0x01, 0x00, 0x08, 0x08, 0x18, 0xF8, 0x18, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "F",31 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0E, 0x08, 0x18, 0x30, 0x30, 0x20, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "G",32 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3F, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "H",33 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "I",34 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x70, 0x71, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x80, 0x00], /* "J",35 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x1B, 0x1D, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x18, 0x10, 0x20, 0x60, 0x40, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0x60, 0x70, 0x30, 0x38, 0x18, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00], /* "K",36 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x0C, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00], /* "L",37 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x38, 0x38, 0x38, 0x38, 0x2C, 0x2C, 0x2C, 0x2C, 0x2E, 0x26, 0x26, 0x26, 0x26, 0x23, 0x23, 0x23, 0x23, 0x23, 0x21, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1C, 0x1C, 0x1C, 0x3C, 0x2C, 0x2C, 0x2C, 0x6C, 0x4C, 0x4C, 0x4C, 0x4C, 0x8C, 0x8C, 0x8C, 0x8C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00], /* "M",38 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x38, 0x3C, 0x2C, 0x2C, 0x2E, 0x26, 0x27, 0x23, 0x23, 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0x88, 0xC8, 0xC8, 0xE8, 0x68, 0x78, 0x38, 0x38, 0x38, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00], /* "N",39 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x18, 0x10, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x30, 0x10, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x30, 0x18, 0x08, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "O",40 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "P",41 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x27, 0x34, 0x38, 0x18, 0x0C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x30, 0x18, 0x08, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x86, 0xCC, 0x4C, 0x68, 0x70, 0xE0, 0x32, 0x3E, 0x1C, 0x00, 0x00], /* "Q",42 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0xE0, 0xC0, 0xC0, 0xE0, 0x60, 0x60, 0x70, 0x30, 0x30, 0x38, 0x18, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "R",43 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x30, 0x18, 0x1E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x10, 0x18, 0x1C, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x1C, 0x0C, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xF0, 0x78, 0x1C, 0x0E, 0x06, 0x06, 0x06, 0x06, 0x0C, 0x18, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "S",44 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x31, 0x21, 0x41, 0x41, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x84, 0x86, 0x82, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "T",45 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x10, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x20, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "U",46 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x18, 0x18, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x06, 0x06, 0x07, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x30, 0x20, 0x20, 0x20, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00], /* "V",47 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x61, 0x61, 0x61, 0x31, 0x30, 0x31, 0x31, 0x31, 0x31, 0x32, 0x1A, 0x1A, 0x1A, 0x1C, 0x1C, 0x1C, 0x0C, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0x86, 0x84, 0x84, 0x84, 0x84, 0xC4, 0xC8, 0xC8, 0xC8, 0xC8, 0x48, 0x68, 0x70, 0x70, 0x70, 0x70, 0x30, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00], /* "W",48 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x18, 0x1C, 0x0C, 0x0C, 0x0E, 0x06, 0x07, 0x03, 0x03, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0x60, 0x60, 0x30, 0x30, 0x18, 0x18, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00], /* "X",49 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x38, 0x18, 0x18, 0x0C, 0x0C, 0x0E, 0x06, 0x06, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x10, 0x10, 0x30, 0x20, 0x20, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "Y",50 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x10, 0x20, 0x20, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x06, 0x0E, 0x0C, 0x1C, 0x18, 0x38, 0x30, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x18, 0x18, 0x30, 0x70, 0x60, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x08, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "Z",51 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x0C, 0x0C, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x0C, 0x0C, 0x18, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "0",52 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "1",53 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0x10, 0x20, 0x20, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x04, 0x04, 0x04, 0x0C, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00], /* "2",54 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x70, 0x30, 0x18, 0x18, 0x18, 0x18, 0x30, 0x60, 0xC0, 0x70, 0x18, 0x08, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x18, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "3",55 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x06, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x70, 0x70, 0xF0, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xFE, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xFE, 0x00, 0x00, 0x00, 0x00], /* "4",56 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x08, 0x08, 0x08, 0x10, 0x10, 0x13, 0x14, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x20, 0x20, 0x10, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x08, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "5",57 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x04, 0x08, 0x18, 0x18, 0x10, 0x30, 0x31, 0x36, 0x3C, 0x38, 0x30, 0x30, 0x30, 0x30, 0x18, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x08, 0x0C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x0C, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x0C, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "6",58 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x38, 0x30, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], /* "7",59 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x38, 0x1C, 0x0E, 0x07, 0x0D, 0x18, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x10, 0xE0, 0xE0, 0x70, 0x38, 0x1C, 0x0C, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00], /* "8",60 */ [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x30, 0x30, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x18, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x20, 0x10, 0x18, 0x08, 0x0C, 0x0C, 0x0C, 0x0C, 0x1C, 0x3C, 0x6C, 0x8C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00] /* "9",61 */ ]; export interface IFont { w: number; h: number; fonts: string; data: number[][]; } export const font8x16: IFont = { w: 8, h: 16, fonts, data: font8x16Data, }; export const font12x24: IFont = { w: 12, h: 24, fonts, data: font12x24Data, }; export const font16x32: IFont = { w: 16, h: 32, fonts, data: font16x32Data, }; ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { /* Basic Options */ "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ "module": "commonjs", /* Specify module code generation: 'commonjs', 'amd', 'system', 'umd' or 'es2015'. */ // "lib": [], /* Specify library files to be included in the compilation: */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ "declaration": true, /* Generates corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ "outDir": "./dist/", /* Redirect output structure to the directory. */ "rootDir": "./src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "removeComments": true, /* Do not emit comments to output. */ // "noEmit": true, /* Do not emit outputs. */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ "strict": true, /* Enable all strict type-checking options. */ "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ "strictNullChecks": true, /* Enable strict null checks. */ "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ /* Additional Checks */ "noUnusedLocals": true, /* Report errors on unused locals. */ // "noUnusedParameters": true, /* Report errors on unused parameters. */ "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */ /* Module Resolution Options */ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ /* Source Map Options */ // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ /* Experimental Options */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ } }