├── .gitignore ├── LICENSE ├── README.md ├── SConscript ├── doc ├── color.png ├── minions.png └── monitor.png ├── examples ├── img2rgb888_cwh.py ├── minions.h ├── minions.jpg ├── minions.png ├── vt_color.c ├── vt_imshow.c ├── vt_lsimg.c └── vt_monitor.c └── src ├── vt100.c └── vt100.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | *.hex 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | .vscode/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Fontaine Hugo a.k.a "Usiten" 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## VT-100 2 | 3 | RT-Thread 的终端 msh 一直是一个非常受大家欢迎的组件,但是终端只能打印基本的字符未免有些单调了,于是我封装了 ANSI Escape 标准,这样就可以在 msh 里实现更加丰富的图形界面了,例如动画和游戏开发。 4 | 5 | ## 显示图片 6 | 7 | 在 examples 目录下有个直接 jpg 生成 C 代码的小工具: 8 | 9 | ``` 10 | python img2rgb888_cwh.py minions.png 11 | ``` 12 | 13 | 然后就可以在控制台打印图片了 14 | 15 | ```C 16 | #include 17 | #include 18 | 19 | #include 20 | #include "minions.h" 21 | 22 | void vt_rgb_buf(int argc, char* arvg[]) 23 | { 24 | vt_draw_rgb888(minions, minions_w, minions_h); 25 | } 26 | MSH_CMD_EXPORT(vt_rgb_buf, draw RGB image in console) 27 | ``` 28 | 29 | ![](doc/minions.png) 30 | 31 | 32 | 33 | ### 实时控制台 34 | 35 | ![](./doc/monitor.png) 36 | 37 | 38 | 39 | ### 绘制色条矩形 40 | 41 | ![](./doc/color.png) 42 | 43 | 44 | 45 | ## 联系方式 46 | 47 | - 维护:Wu Han 48 | - 主页:http://wuhanstudio.cc 49 | - 联系:https://github.com/wuhanstudio/vt100/issues -------------------------------------------------------------------------------- /SConscript: -------------------------------------------------------------------------------- 1 | from building import * 2 | import rtconfig 3 | 4 | # get current directory 5 | cwd = GetCurrentDir() 6 | # The set of source files associated with this SConscript file. 7 | src = Glob('src/*.c') 8 | 9 | if GetDepend('VT100_USING_MONITOR'): 10 | src += Glob('examples/vt_monitor.c') 11 | 12 | if GetDepend('VT100_USING_COLOR'): 13 | src += Glob('examples/vt_color.c') 14 | 15 | if GetDepend('VT100_USING_IMGBUF'): 16 | src += Glob('examples/vt_imshow.c') 17 | 18 | if GetDepend('VT100_USING_LSIMG'): 19 | src += Glob('examples/vt_lsimg.c') 20 | 21 | path = [cwd + '/src'] 22 | path += [cwd + '/examples'] 23 | 24 | group = DefineGroup('vt100', src, depend = ['PKG_USING_VT100'], CPPPATH = path) 25 | 26 | Return('group') 27 | -------------------------------------------------------------------------------- /doc/color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wuhanstudio/vt100/25c78a77ee5e5651bf50b785b1b77e376a5d2b29/doc/color.png -------------------------------------------------------------------------------- /doc/minions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wuhanstudio/vt100/25c78a77ee5e5651bf50b785b1b77e376a5d2b29/doc/minions.png -------------------------------------------------------------------------------- /doc/monitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wuhanstudio/vt100/25c78a77ee5e5651bf50b785b1b77e376a5d2b29/doc/monitor.png -------------------------------------------------------------------------------- /examples/img2rgb888_cwh.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | import os 5 | import sys 6 | 7 | import numpy as np 8 | import matplotlib.pyplot as plt 9 | 10 | 11 | img = plt.imread(sys.argv[1]) 12 | print("Reading from %s" % sys.argv[1]) 13 | 14 | if os.path.splitext(sys.argv[1])[1] == '.png': 15 | print("Rescaling PNG") 16 | img = img * 255 17 | 18 | filename = os.path.splitext(sys.argv[1])[0] 19 | print("Writing to %s" % (filename + '.h')) 20 | print("Image %d x %d" % (img.shape[1], img.shape[0])) 21 | 22 | with open(filename + '.h', 'w+') as f: 23 | f.write("#ifndef __%s_H__\n" % (filename.upper())) 24 | f.write("#define __%s_H__\n" % (filename.upper())) 25 | f.write("\n") 26 | 27 | f.write("const uint8_t %s_w = %d;\n" % (filename, img.shape[1]) ) 28 | f.write("const uint8_t %s_h = %d;\n" % (filename, img.shape[0]) ) 29 | f.write("\n") 30 | 31 | f.write("uint8_t %s[] = {" % filename) 32 | 33 | for w in range(img.shape[0]): 34 | for h in range(img.shape[1]): 35 | f.write("0x%x," % (int(img[w ,h, 0]))) 36 | f.write("\n") 37 | 38 | for w in range(img.shape[0]): 39 | for h in range(img.shape[1]): 40 | f.write("0x%x," % (int(img[w, h, 1]))) 41 | f.write("\n") 42 | 43 | for w in range(img.shape[0]): 44 | for h in range(img.shape[1]): 45 | f.write("0x%x," % (int(img[w, h, 2]))) 46 | f.write("\n") 47 | 48 | f.write("};\n") 49 | 50 | f.write("\n") 51 | f.write("#endif\n") 52 | -------------------------------------------------------------------------------- /examples/minions.h: -------------------------------------------------------------------------------- 1 | #ifndef __MINIONS_H__ 2 | #define __MINIONS_H__ 3 | 4 | #include 5 | 6 | const rt_uint8_t minions_w = 80; 7 | const rt_uint8_t minions_h = 45; 8 | 9 | rt_uint8_t minions[] = {0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xfc,0xfc,0xfb,0xfb,0xfc,0xfe,0xfe,0xfb,0xfc,0xfd,0xfa,0xfb,0xfd,0xfd,0xfd,0xfc,0xfa,0xfa,0xfb,0xfc,0xfb,0xfe,0xfe,0xfe,0xfe,0xfd,0xfc,0xfc,0xfc,0xfe,0xfe,0xfd,0xfc,0xfc,0xfd,0xfa,0xfd,0xfc,0xfb,0xfe,0xfe,0xfc,0xfa,0xf8,0xf1,0xef,0xf2,0xff,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, 10 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xfe,0xfc,0xfa,0xff,0xfb,0xfe,0xfe,0xfe,0xfb,0xfc,0xfd,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xff,0xff,0xff,0xfe,0xfe,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xfe,0xfd,0xff,0xff,0xfd,0xfe,0xfd,0xfb,0xfe,0xfb,0xfa,0xf9,0xf7,0xf2,0xf1,0xf3,0xf8,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, 11 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xfd,0xfe,0xfc,0xff,0xfd,0xfe,0xfe,0xfd,0xfc,0xfd,0xff,0xff,0xf9,0xfa,0xf3,0xd2,0xf4,0xfa,0xfd,0xfd,0xfd,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfa,0xf9,0xff,0xff,0xff,0xf5,0xf2,0xd9,0xd8,0xef,0xf9,0xff,0xfd,0xfa,0xf5,0xfc,0xf6,0xf4,0xf3,0xf1,0xf1,0xfe,0xff,0xfd,0xfd,0xfe,0xfe,0xfe, 12 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xfd,0xfd,0xfb,0xfd,0xff,0xff,0xfd,0xfd,0xff,0xf9,0xe7,0xe3,0xde,0xe0,0xdd,0xde,0xe4,0xe0,0xd8,0xe2,0xeb,0xfd,0xff,0xff,0xfb,0xfd,0xfd,0xfd,0xfd,0xfd,0xff,0xff,0xf1,0xe4,0xda,0xe1,0xe2,0xe3,0xe2,0xe0,0xd7,0xd7,0xe4,0xf4,0xff,0xed,0xf1,0xf2,0xf2,0xf2,0xed,0xf1,0xff,0xfc,0xfd,0xfe,0xfe,0xfe, 13 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfb,0xfc,0xff,0xff,0xff,0xff,0xd3,0xe5,0xeb,0xe6,0xe2,0xdb,0xcc,0xc7,0xc9,0xd5,0xe0,0xdd,0xdf,0xcf,0xc2,0xf8,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xd8,0xdf,0xe1,0xe5,0xe2,0xd4,0xcf,0xcf,0xcf,0xce,0xd4,0xda,0xd5,0xc8,0xad,0xf3,0xf3,0xf0,0xef,0xf3,0xf4,0xef,0xfb,0xfb,0xfe,0xfe,0xfe,0xfe, 14 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfe,0xfc,0xfc,0xfe,0xfd,0xff,0xfc,0xea,0xf8,0xe2,0xd1,0xaf,0xa9,0xb7,0xb7,0xac,0xa5,0xb2,0xb9,0xbd,0xca,0xd8,0xc4,0xcb,0xf6,0xf2,0xf8,0xfc,0xf6,0xe7,0xe7,0xe8,0xdc,0xc2,0xa2,0xa7,0xaa,0xae,0xb4,0xb1,0xa4,0x9a,0xab,0xce,0xca,0xb1,0xdf,0xf2,0xf1,0xf0,0xf1,0xf4,0xf3,0xfe,0xfd,0xfe,0xfe,0xfe, 15 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xfc,0xfb,0xfd,0xfd,0xfd,0xf8,0xf1,0xf5,0xd0,0xad,0xb5,0xc7,0x93,0x82,0x83,0x8e,0x9d,0xac,0xc4,0xb0,0xa4,0xb1,0xd1,0xc5,0xb6,0xf8,0xeb,0xed,0xdc,0xf9,0xec,0xcd,0xa9,0xaa,0xc9,0xaf,0x9b,0x93,0x89,0x82,0x88,0xbc,0xb5,0x9c,0xb0,0xc3,0xa5,0xca,0xf2,0xf0,0xec,0xf1,0xf0,0xff,0xfd,0xfe,0xfe,0xfe, 16 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xff,0xfd,0xfe,0xf9,0xf7,0xef,0xd1,0xae,0xcf,0x8b,0x6e,0xad,0xba,0xb9,0xb7,0xb4,0xb3,0xa5,0xb8,0xcd,0xb4,0xa4,0xbb,0xb9,0xab,0xe7,0xc8,0xfc,0xe1,0xb1,0xa6,0xc5,0xbb,0x9f,0xb2,0xb9,0xb9,0xb7,0xbb,0xb7,0x79,0x7a,0xb9,0xa4,0xa5,0xb6,0xa7,0xdf,0xf2,0xec,0xf0,0xf4,0xf9,0xfe,0xfe,0xfe,0xfe, 17 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf9,0xff,0xfa,0xfe,0xf6,0xf8,0xc1,0xb6,0xc7,0x76,0xb2,0xaf,0xa5,0xa9,0xb2,0xb6,0xb6,0xad,0xa0,0xa1,0xa3,0xbd,0xc0,0xa5,0xbf,0xab,0xb0,0xf5,0xde,0xb0,0xaa,0xc3,0xaa,0xa8,0xae,0xb6,0xbf,0xc2,0xc3,0xba,0xb0,0xb8,0xb5,0x7e,0xbe,0xb0,0xaa,0xab,0xb6,0xea,0xe7,0xea,0xf3,0xf3,0xff,0xfd,0xfe,0xfe, 18 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xff,0xff,0xf2,0xf9,0xbe,0xab,0xb6,0x91,0xa4,0x92,0xb6,0xcd,0xdc,0xe5,0xe8,0xe8,0xe3,0xd5,0xbe,0xa9,0x90,0xaa,0xbf,0xa7,0xbf,0xdf,0xdc,0xb0,0xa8,0xc3,0x9b,0xa8,0xc0,0xd1,0xe3,0xea,0xeb,0xe6,0xe1,0xd8,0xc9,0xb4,0x97,0x85,0xba,0xbb,0xac,0xa8,0xc6,0xf2,0xe5,0xee,0xec,0xff,0xff,0xfd,0xfe, 19 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xf8,0xfa,0xff,0xe7,0xec,0xdc,0xad,0xc3,0x9e,0x87,0xa2,0xca,0xdd,0xec,0xf4,0xf9,0xfa,0xf9,0xf6,0xf2,0xe2,0xd3,0xbb,0x7d,0xb6,0xaf,0x96,0xc8,0xb4,0xa9,0xba,0x85,0xa8,0xc8,0xe4,0xf3,0xf9,0xf8,0xf8,0xf6,0xf3,0xf0,0xea,0xd8,0xb9,0x94,0x83,0xd4,0xb6,0x98,0xaf,0xbb,0xe5,0xe3,0xe6,0xfb,0xfd,0xfd,0xfe, 20 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xff,0xff,0xff,0xcc,0xee,0xc1,0xb7,0x9e,0x70,0x9d,0xc6,0xe2,0xf4,0xfc,0xfe,0xff,0xfe,0xfe,0xfc,0xf8,0xf3,0xec,0xd5,0xad,0x67,0xbd,0xa0,0xad,0xb2,0xb7,0x94,0x9c,0xce,0xe7,0xf7,0xf9,0xfd,0xfd,0xfd,0xfd,0xfb,0xf9,0xf5,0xf0,0xdd,0xb5,0x89,0x9b,0xc8,0xa5,0x90,0x63,0xcf,0xe2,0xe8,0xfa,0xff,0xfd,0xfe, 21 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xd9,0xac,0x84,0x71,0xc5,0xd1,0xba,0xc3,0x65,0x88,0xb4,0xda,0xf2,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xf6,0xe7,0xc9,0x85,0x9f,0xac,0xa9,0xa5,0xb4,0x7b,0xbb,0xe0,0xf7,0xfd,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xfc,0xf9,0xed,0xd2,0xa0,0x5b,0xcf,0xae,0x88,0x86,0x80,0x66,0x84,0xb2,0xef,0xff,0xfe, 22 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xe4,0x86,0x72,0x62,0x6a,0xdc,0xb3,0xbb,0xb2,0x5b,0x9e,0xc7,0xe6,0xf9,0xfe,0xff,0xfd,0xff,0xff,0xe4,0xae,0xb8,0xf7,0xfd,0xf1,0xdb,0xa5,0x8d,0xb8,0xa6,0xa7,0x9a,0x92,0xc9,0xeb,0xfa,0xff,0xca,0xb4,0xd5,0xff,0xfe,0xfe,0xfd,0xfd,0xfb,0xf0,0xe0,0xbc,0x71,0x9d,0xba,0x92,0x8c,0x83,0x52,0x5c,0x6d,0x9e,0xff,0xfe, 23 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xeb,0x90,0x70,0x61,0x5f,0xd1,0xac,0xba,0x8b,0x75,0xb2,0xd2,0xef,0xfc,0xff,0xff,0xfc,0xff,0xa8,0x46,0x63,0x68,0x43,0xe8,0xfa,0xe5,0xb7,0x86,0xbd,0xa5,0xa9,0x8f,0xa2,0xd4,0xf2,0xff,0x64,0x52,0x65,0x63,0x7e,0xff,0xff,0xfc,0xfe,0xfb,0xf7,0xe6,0xcb,0x90,0x7b,0xbc,0xa0,0x89,0x90,0x52,0x61,0x70,0xae,0xff,0xfe, 24 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0x65,0x39,0x38,0x3c,0xb2,0xb1,0xc1,0x7c,0x86,0xb9,0xd9,0xf2,0xfc,0xff,0xff,0xff,0xe8,0x39,0xff,0x1f,0x41,0x56,0x5a,0xff,0xe8,0xc1,0x7c,0xb4,0xa4,0xb2,0x8b,0xaf,0xd7,0xff,0x9a,0x52,0xff,0x1d,0x4c,0x3f,0xaf,0xff,0xfe,0xff,0xfc,0xf8,0xec,0xcf,0x9a,0x68,0xb9,0xa7,0x9b,0x62,0x32,0x32,0x3c,0xa9,0xff,0xfe, 25 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xfa,0x85,0x65,0x62,0x58,0xd7,0xba,0xc0,0x7f,0x86,0xbd,0xdd,0xf5,0xfc,0xff,0xff,0xff,0xa4,0x5b,0x4d,0x25,0x25,0x68,0x4b,0xfe,0xe8,0xbf,0x82,0xb2,0xa9,0xb5,0x8d,0xb8,0xdc,0xff,0x6f,0x64,0x42,0x28,0x2a,0x69,0x7f,0xff,0xff,0xff,0xfd,0xfa,0xed,0xcf,0x9e,0x6f,0xb3,0x9f,0xb2,0x83,0x4f,0x5a,0x66,0xb4,0xff,0xfe, 26 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf1,0x8f,0x74,0x6a,0x56,0xe7,0xbf,0xbd,0x8c,0x80,0xbd,0xe0,0xf6,0xfd,0xff,0xff,0xff,0xc5,0x76,0x70,0x56,0x65,0x83,0x6a,0xff,0xe6,0xba,0x8c,0xb2,0xa6,0xb0,0x8f,0xb6,0xdb,0xfe,0x99,0x82,0x6d,0x56,0x66,0x7c,0x9e,0xff,0xfd,0xff,0xfd,0xfb,0xeb,0xcf,0x99,0x86,0xaf,0xac,0xd6,0x78,0x57,0x64,0x77,0xaa,0xff,0xfe, 27 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xb4,0x7c,0x65,0x52,0xe1,0xd0,0xbb,0xa9,0x66,0xb2,0xdc,0xf6,0xfc,0xff,0xff,0xff,0xff,0x6b,0x85,0x86,0x8f,0x6e,0xb6,0xfa,0xda,0xae,0x95,0xb3,0xb0,0xb4,0x8a,0xaa,0xd2,0xee,0xe7,0x64,0x91,0x8c,0x8c,0x74,0xe8,0xff,0xfc,0xff,0xfb,0xf7,0xe4,0xc7,0x81,0x9d,0xb4,0xce,0xc9,0x79,0x51,0x68,0x8d,0xd6,0xff,0xfe, 28 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xff,0xff,0xff,0xeb,0xc0,0xe0,0xc8,0xb7,0x6d,0x9b,0xd2,0xf1,0xf9,0xfc,0xff,0xfd,0xfd,0xe8,0x73,0x65,0x6e,0xb5,0xff,0xeb,0xce,0x99,0xa6,0xb2,0xb9,0xaa,0x9a,0x8f,0xc3,0xe2,0xfc,0xd5,0x6d,0x66,0x75,0xce,0xff,0xfe,0xff,0xfc,0xf9,0xec,0xd1,0xaf,0x82,0xb8,0xbb,0xe7,0xa5,0xc8,0xd7,0xdc,0xfe,0xff,0xfe,0xfd, 29 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xfe,0xfb,0xff,0xff,0xff,0xd8,0xe0,0xd2,0xb6,0x8d,0x87,0xba,0xdf,0xf5,0xf9,0xfb,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xef,0xd9,0xbc,0x95,0xb8,0xbb,0xcf,0xbf,0xaf,0x87,0xac,0xd0,0xe7,0xf7,0xff,0xff,0xff,0xff,0xff,0xfd,0xfc,0xf9,0xee,0xdb,0xba,0x9f,0xaf,0xb8,0xcf,0xdf,0xab,0xe8,0xe9,0xe5,0xfa,0xfd,0xfe,0xfe, 30 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xfc,0xfe,0xf9,0xfd,0xff,0xeb,0xe2,0xc9,0xae,0x78,0xad,0xcd,0xe2,0xf3,0xf9,0xfb,0xfb,0xfa,0xf7,0xf5,0xf5,0xee,0xda,0xbb,0xab,0xc1,0xb2,0xcb,0xdf,0xd8,0xbd,0xa5,0x90,0xb4,0xd2,0xe6,0xf2,0xf7,0xf8,0xf6,0xf8,0xf5,0xf4,0xe9,0xd6,0xbb,0xbc,0x9e,0xaf,0xb4,0xde,0xd8,0xf5,0xeb,0xed,0xf1,0xfd,0xfd,0xfe,0xfe, 31 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfa,0xff,0xfe,0xf9,0xe1,0xdc,0xbb,0xae,0x67,0xb6,0xca,0xd7,0xdd,0xef,0xf5,0xf3,0xec,0xe9,0xdd,0xc5,0xbb,0xb4,0xbb,0xac,0xc5,0xd5,0xe5,0xdb,0xd0,0xb5,0x9a,0x96,0xb2,0xbc,0xda,0xea,0xf0,0xee,0xee,0xea,0xd9,0xc1,0xc2,0xd0,0x8e,0xb9,0xb9,0xd4,0xe1,0xe6,0xee,0xf5,0xf2,0xf1,0xfc,0xfe,0xfe,0xfe, 32 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfd,0xff,0xff,0xff,0xed,0xdd,0xd8,0xba,0xaa,0x69,0x96,0xd0,0xdf,0xd8,0xd8,0xd7,0xce,0xcf,0xd4,0xce,0xa6,0xb8,0xb0,0xc3,0xdf,0xe4,0x70,0xce,0xe3,0xd8,0xb8,0x9f,0x99,0xc6,0xce,0xcd,0xcd,0xcc,0xcd,0xd0,0xd4,0xd9,0xba,0x78,0xac,0xb1,0xca,0xda,0xe7,0xf4,0xee,0xf6,0xf6,0xf4,0xfc,0xfe,0xfe,0xfe, 33 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xfc,0xff,0xfd,0xfd,0xfe,0xe2,0xdb,0xe0,0xc2,0xb3,0x94,0x71,0x87,0xb1,0xbf,0xc6,0xbf,0xac,0x8c,0x9f,0xb6,0xb2,0xcd,0xde,0xea,0x92,0x96,0x82,0xd9,0xe4,0xd0,0xba,0xa2,0x93,0x91,0xa0,0xba,0xc5,0xc1,0xb5,0x94,0x6f,0x83,0xa6,0xab,0xd5,0xd9,0xd8,0xec,0xf3,0xf4,0xf7,0xf8,0xf4,0xfc,0xfe,0xfe,0xfe, 34 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xfd,0xff,0xfc,0xfc,0xff,0xff,0xe0,0xe3,0xe7,0xce,0xb7,0xb6,0xaf,0x91,0x92,0x97,0x97,0xa4,0xbd,0xae,0xba,0xd0,0xda,0xe0,0xa4,0xae,0xba,0xb8,0xa2,0xdd,0xed,0xe4,0xd0,0xb2,0xaf,0xa9,0x98,0x96,0x90,0x9c,0x9c,0xb2,0xac,0xc3,0xd4,0xd7,0xd3,0xef,0xf6,0xf2,0xf7,0xf6,0xf8,0xf5,0xfc,0xfd,0xfe,0xfe, 35 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xfd,0xff,0xfc,0xfc,0xff,0xfd,0xfe,0xe9,0xe1,0xdc,0xd4,0xd3,0xd1,0xc4,0xb8,0xc8,0xcc,0xca,0xd6,0xd8,0xda,0xdb,0xd4,0xb5,0xbe,0xc5,0xc9,0xc9,0xc7,0xb8,0xd6,0xe6,0xe0,0xdd,0xd5,0xd3,0xc7,0xc8,0xc7,0xcf,0xca,0xd1,0xdd,0xdb,0xcd,0xd4,0xe5,0xf6,0xf3,0xf2,0xf7,0xf7,0xf8,0xf5,0xfb,0xfc,0xfe,0xfe, 36 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xfd,0xff,0xfc,0xfc,0xff,0xfc,0xfd,0xff,0xcf,0xca,0xd8,0xd8,0xe0,0xdc,0xd8,0xe3,0xee,0xe6,0xda,0xde,0xe0,0xcd,0xc1,0xce,0xd2,0xd4,0xd7,0xd7,0xd6,0xd6,0xcd,0xd1,0xd8,0xe4,0xdf,0xe7,0xe6,0xe8,0xef,0xed,0xe8,0xda,0xd5,0xc0,0xa6,0xf0,0xf2,0xf1,0xf4,0xf3,0xf5,0xf7,0xfa,0xf7,0xfa,0xfe,0xfe,0xfe, 37 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xfc,0xff,0xfd,0xfd,0xff,0xfd,0xff,0xfe,0xff,0xff,0xf5,0xeb,0xda,0xd5,0xd9,0xde,0xdb,0xe2,0xda,0xcd,0xc5,0xcc,0xd8,0xe0,0xdc,0xde,0xe1,0xe1,0xe3,0xe2,0xe2,0xdd,0xd3,0xce,0xd1,0xd0,0xe0,0xe5,0xe4,0xe2,0xd8,0xd0,0xd6,0xe0,0xed,0xef,0xf1,0xf3,0xf4,0xf3,0xf5,0xf8,0xfa,0xf7,0xfa,0xfe,0xfe,0xfe, 38 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xfd,0xff,0xfd,0xfe,0xff,0xfd,0xfe,0xfe,0xff,0xfe,0xfe,0xfd,0xfa,0xee,0xe0,0xd8,0xd5,0xd4,0xd6,0xdf,0xe2,0xdf,0xe0,0xe6,0xe5,0xe7,0xeb,0xeb,0xeb,0xeb,0xec,0xf2,0xeb,0xe6,0xe5,0xdc,0xcd,0xc8,0xc7,0xd1,0xdd,0xe0,0xe6,0xe8,0xf4,0xf0,0xf1,0xf4,0xf5,0xf4,0xf6,0xf7,0xfa,0xf7,0xf9,0xfe,0xfe,0xfe, 39 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfe,0xfe,0xfc,0xff,0xff,0xfb,0xfe,0xfd,0xfd,0xff,0xfd,0xfd,0xff,0xfe,0xfa,0xf4,0xed,0xec,0xeb,0xe8,0xe9,0xec,0xee,0xf1,0xf4,0xf6,0xf9,0xf8,0xf8,0xf8,0xf9,0xf5,0xf2,0xf0,0xea,0xe7,0xe6,0xe5,0xe2,0xe5,0xe6,0xe7,0xea,0xed,0xef,0xf3,0xf2,0xf3,0xf6,0xf7,0xf7,0xf5,0xfa,0xf6,0xf9,0xfe,0xfe,0xfe, 40 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfe,0xfe,0xfd,0xff,0xff,0xfc,0xfe,0xfe,0xfb,0xfe,0xfe,0xff,0xfe,0xfe,0xfd,0xfd,0xf9,0xf9,0xf8,0xf5,0xf5,0xf8,0xfc,0xfc,0xfa,0xfc,0xfd,0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf8,0xf6,0xf2,0xee,0xed,0xee,0xed,0xed,0xeb,0xef,0xf1,0xf3,0xf3,0xf4,0xf5,0xf6,0xf8,0xf6,0xf6,0xf9,0xf6,0xf9,0xfe,0xfe,0xfe, 41 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xfe,0xfc,0xfe,0xfe,0xfd,0xfe,0xff,0xfc,0xfe,0xfe,0xfc,0xfc,0xfe,0xfe,0xfb,0xfd,0xfd,0xff,0xfe,0xff,0xff,0xff,0xfe,0xfc,0xfb,0xfe,0xf9,0xfa,0xfc,0xfe,0xfc,0xfd,0xfe,0xff,0xfe,0xfd,0xfe,0xf9,0xf6,0xf5,0xf6,0xf3,0xf3,0xf2,0xf4,0xf4,0xf4,0xf3,0xf6,0xf6,0xf7,0xf7,0xf8,0xf6,0xf9,0xf6,0xf9,0xfe,0xfe,0xfe, 42 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfe,0xfc,0xfe,0xfe,0xfe,0xfd,0xff,0xfc,0xff,0xff,0xff,0xfc,0xfe,0xfd,0xfd,0xfd,0xfd,0xfe,0xfd,0xff,0xfe,0xfd,0xfd,0xfb,0xfb,0xfb,0xfe,0xfe,0xfc,0xff,0xfd,0xfe,0xfe,0xff,0xfd,0xfd,0xfe,0xfe,0xfc,0xfa,0xfd,0xfb,0xfa,0xfa,0xf8,0xf7,0xf6,0xf6,0xf7,0xf8,0xf8,0xf8,0xf9,0xf6,0xf9,0xf6,0xf8,0xfe,0xfe,0xfe, 43 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfe,0xfc,0xfe,0xfd,0xfe,0xfd,0xff,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xf9,0xfc,0xfe,0xfa,0xfe,0xff,0xfe,0xfd,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfb,0xfc,0xff,0xfd,0xfc,0xfe,0xfe,0xfc,0xfb,0xfc,0xff,0xff,0xfe,0xfc,0xfc,0xf8,0xf7,0xf7,0xf9,0xf8,0xf8,0xfa,0xf9,0xf6,0xf7,0xf6,0xf8,0xfe,0xfe,0xfe, 44 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfe,0xfb,0xfe,0xff,0xfc,0xfc,0xff,0xfc,0xfd,0xfd,0xfe,0xfd,0xfd,0xff,0xfc,0xff,0xff,0xfd,0xfc,0xfc,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xfc,0xfd,0xfc,0xfb,0xfb,0xfd,0xfc,0xff,0xff,0xfd,0xfe,0xff,0xff,0xfd,0xff,0xff,0xfe,0xfb,0xfb,0xfb,0xfc,0xfa,0xf9,0xf9,0xfa,0xf9,0xf6,0xfa,0xf5,0xf7,0xfe,0xfe,0xfe, 45 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xfe,0xfb,0xfd,0xff,0xfd,0xfd,0xff,0xfd,0xfd,0xfd,0xfe,0xfd,0xfe,0xff,0xfd,0xfd,0xff,0xfe,0xff,0xfd,0xfb,0xfe,0xfd,0xfd,0xfd,0xfe,0xfd,0xfd,0xfc,0xfe,0xfc,0xfc,0xfc,0xfd,0xfa,0xfb,0xff,0xfd,0xff,0xf7,0xfd,0xfe,0xff,0xfd,0xfc,0xfc,0xfd,0xfe,0xfa,0xf9,0xf9,0xfa,0xf9,0xf6,0xf9,0xf4,0xf6,0xfe,0xfe,0xfe, 46 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xfb,0xfc,0xff,0xff,0xfd,0xff,0xff,0xfe,0xfd,0xff,0xfd,0xff,0xff,0xff,0xfb,0xff,0xfe,0xe7,0xee,0xf2,0xf9,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xf4,0xe7,0xe8,0xf3,0xfb,0xfd,0xfe,0xfc,0xfe,0xfe,0xfd,0xfe,0xf9,0xfa,0xf9,0xfb,0xf9,0xf6,0xf8,0xf1,0xfb,0xff,0xfe,0xfd, 47 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xa7,0xff,0xfc,0xfc,0xfe,0xff,0xff,0xff,0xff,0xfd,0xfc,0xfc,0xfd,0xff,0xfd,0xfc,0xfc,0xfb,0xff,0xff,0xfc,0xf3,0xea,0xed,0xec,0xea,0xe8,0xee,0xf0,0xee,0xeb,0xe9,0xe9,0xe4,0xe6,0xeb,0xf6,0xff,0xff,0xfe,0xfd,0xfc,0xfc,0xfb,0xfe,0xfe,0xfc,0xfb,0xfc,0xfb,0xf9,0xfa,0xf5,0xf4,0xf4,0xf9,0xb5,0xdf,0xff,0xfe, 48 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0x8d,0xdc,0xff,0xfa,0xfd,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfc,0xfe,0xff,0xfd,0xfe,0xfd,0xfc,0xfd,0xfc,0xfa,0xfa,0xff,0xfe,0xff,0xff,0xfc,0xfa,0xf9,0xf6,0xf9,0xfa,0xfa,0xfe,0xfc,0xfc,0xfc,0xf9,0xfa,0xfc,0xfc,0xfd,0xfe,0xfd,0xff,0xfd,0xfd,0xfd,0xfb,0xfb,0xfa,0xfa,0xf5,0xf6,0xee,0xf6,0x63,0xba,0xff,0xfe, 49 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xaa,0x8b,0xdb,0xff,0xfc,0xff,0xf9,0xfe,0xfe,0xfe,0xff,0xfc,0xfe,0xff,0xfd,0xff,0xfe,0xfd,0xfe,0xfe,0xfd,0xff,0xfe,0xfd,0xfe,0xfe,0xfd,0xfe,0xfe,0xff,0xfe,0xfe,0xfe,0xfe,0xfd,0xfd,0xfe,0xfb,0xfd,0xfe,0xfc,0xfe,0xfd,0xfd,0xff,0xfd,0xfd,0xfe,0xfb,0xfa,0xf9,0xf7,0xef,0xe9,0xf4,0x6c,0x4f,0xae,0xff,0xfe, 50 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0x9a,0x93,0x87,0xc9,0xff,0xfd,0xfa,0xfe,0xfe,0xfe,0xff,0xfc,0xfe,0xff,0xfd,0xff,0xff,0xff,0xfc,0xfc,0xfe,0xff,0xfd,0xff,0xff,0xfd,0xfe,0xfe,0xfc,0xff,0xfd,0xfe,0xfc,0xfc,0xfe,0xff,0xff,0xff,0xfe,0xfc,0xfc,0xff,0xfd,0xfd,0xff,0xfc,0xfb,0xfe,0xf9,0xf8,0xf3,0xec,0xf0,0xe7,0x54,0x4c,0x59,0x99,0xff,0xfe, 51 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xe3,0x84,0x86,0x89,0x8b,0xc0,0xff,0xff,0xfe,0xfe,0xfe,0xff,0xfc,0xfe,0xfd,0xfd,0xff,0xff,0xff,0xfc,0xfc,0xfe,0xff,0xfd,0xff,0xff,0xff,0xfd,0xfd,0xfd,0xff,0xfd,0xfd,0xff,0xfc,0xfd,0xff,0xff,0xff,0xfd,0xfe,0xfe,0xfd,0xff,0xff,0xff,0xfc,0xfd,0xfb,0xf7,0xf5,0xed,0xea,0xca,0x50,0x56,0x49,0x40,0x5c,0xff,0xfe, 52 | 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xff,0xf2,0x91,0x72,0x7a,0x89,0x87,0xb5,0xff,0xff,0xfe,0xfc,0xfe,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xfc,0xfc,0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xff,0xfe,0xfe,0xff,0xfe,0xfe,0xff,0xfd,0xfe,0xff,0xff,0xff,0xfd,0xfe,0xfe,0xfd,0xfd,0xfc,0xfd,0xfc,0xfa,0xf7,0xf1,0xee,0xe6,0xb7,0x53,0x4b,0x44,0x46,0x48,0x7b,0xff,0xfe, 53 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xdb,0x89,0x83,0x82,0x8e,0x8e,0x9d,0xfc,0xff,0xfd,0xfc,0xfd,0xfe,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfc,0xfd,0xfd,0xfd,0xfc,0xfe,0xfe,0xfd,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfe,0xfe,0xff,0xfd,0xfc,0xfe,0xfc,0xfc,0xfc,0xfe,0xfc,0xf8,0xf0,0xe5,0xde,0x9b,0x4a,0x52,0x47,0x43,0x47,0x6b,0xff,0xff,0xfe, 54 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xfd,0xf1,0xf3,0xf3,0xf0,0xef,0xf0,0xef,0xef,0xeb,0xec,0xec,0xea,0xe7,0xe8,0xe8,0xe7,0xe8,0xe8,0xe5,0xe6,0xe4,0xe4,0xe2,0xe3,0xe3,0xe3,0xe2,0xe4,0xe2,0xe2,0xe1,0xe2,0xde,0xdb,0xdc,0xd8,0xd4,0xd0,0xcf,0xce,0xcc,0xc9,0xc5,0xc9,0xcf,0xe4,0xff,0xfe,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe, 55 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xef,0xee,0xf2,0xf2,0xee,0xef,0xee,0xee,0xeb,0xe8,0xea,0xe9,0xea,0xe6,0xe6,0xe6,0xe3,0xe2,0xe1,0xe1,0xe2,0xe0,0xe0,0xe1,0xe0,0xe1,0xe2,0xe1,0xe1,0xdf,0xde,0xdd,0xdd,0xdb,0xdc,0xdc,0xd8,0xd6,0xd2,0xcf,0xcb,0xc9,0xc8,0xc7,0xc8,0xc7,0xcd,0xec,0xff,0xfe,0xfd,0xfe,0xfe,0xfe,0xfe, 56 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xff,0xf3,0xed,0xf1,0xf2,0xf1,0xf0,0xf0,0xec,0xeb,0xeb,0xe8,0xe3,0xdc,0xbf,0xd9,0xd8,0xd8,0xde,0xdb,0xdb,0xde,0xdf,0xde,0xde,0xdd,0xdd,0xdd,0xdc,0xe1,0xdf,0xdc,0xda,0xd3,0xd0,0xcf,0xba,0xbe,0xcf,0xce,0xd2,0xd1,0xc9,0xcb,0xc5,0xc7,0xc6,0xc4,0xc7,0xd4,0xfa,0xfc,0xfe,0xfd,0xfe,0xfe,0xfe, 57 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xfb,0xed,0xf0,0xf1,0xf0,0xf0,0xef,0xf1,0xee,0xdf,0xde,0xda,0xe3,0xe6,0xec,0xe4,0xe1,0xd4,0xca,0xc2,0xcd,0xd0,0xd2,0xd6,0xd9,0xda,0xdc,0xdc,0xdd,0xd6,0xd1,0xc9,0xc6,0xd6,0xdc,0xe1,0xe6,0xea,0xe2,0xda,0xcf,0xc3,0xc6,0xcd,0xce,0xc5,0xc6,0xc5,0xc7,0xc9,0xe1,0xfe,0xff,0xfd,0xfe,0xfe,0xfe, 58 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xf4,0xef,0xf2,0xf0,0xf1,0xef,0xf3,0xc9,0xe1,0xeb,0xe6,0xe1,0xd6,0xc4,0xbc,0xc6,0xd2,0xe2,0xe5,0xdc,0xc1,0xa5,0xc9,0xd0,0xd2,0xd3,0xd1,0xd1,0xd5,0xb2,0xcd,0xe2,0xe8,0xdc,0xd1,0xc7,0xc4,0xc5,0xc7,0xcf,0xd8,0xdd,0xcb,0xa2,0xc1,0xc7,0xc7,0xc6,0xc2,0xc6,0xd2,0xf7,0xff,0xfd,0xfe,0xfe,0xfe, 59 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xfb,0xf0,0xf0,0xf2,0xf2,0xf0,0xf0,0xe2,0xfa,0xe3,0xce,0xa7,0xa2,0xac,0xb1,0xad,0xa6,0xab,0xac,0xb0,0xc5,0xd8,0xc1,0xae,0xc2,0xcc,0xcb,0xcb,0xcd,0xbf,0xdf,0xf5,0xd7,0xbc,0xa4,0x9d,0xa6,0xb1,0xb0,0xab,0xa1,0x99,0xa2,0xc2,0xcc,0xab,0xbe,0xca,0xc5,0xc4,0xc8,0xcd,0xe5,0xff,0xfd,0xfe,0xfe,0xfe, 60 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf5,0xef,0xf1,0xf2,0xf0,0xeb,0xf1,0xf9,0xcc,0xaa,0xb1,0xc2,0x8b,0x7b,0x78,0x7c,0x89,0xa1,0xc0,0xb1,0x9e,0xa7,0xd7,0xbe,0xa1,0xb8,0xc0,0xbf,0xb7,0xf6,0xee,0xc7,0xa0,0xa7,0xc4,0xa7,0x8e,0x7f,0x76,0x79,0x80,0xb1,0xae,0x97,0xaa,0xbf,0xa0,0xb9,0xc8,0xc5,0xc7,0xc9,0xd6,0xfe,0xfe,0xfe,0xfe,0xfe, 61 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf1,0xf1,0xf3,0xf3,0xec,0xf2,0xf5,0xc1,0xa6,0xc7,0x80,0x5b,0x92,0x9c,0x9c,0x9d,0x9a,0x96,0x87,0xa2,0xc1,0xb1,0xa0,0xba,0xb6,0x91,0xab,0xa4,0xfa,0xe1,0xac,0xa0,0xba,0xa9,0x86,0x94,0x9c,0xa0,0xa2,0x9d,0x96,0x62,0x6a,0xb3,0xa2,0x9e,0xae,0xa1,0xc0,0xc4,0xc7,0xc9,0xcf,0xf0,0xff,0xfe,0xfe,0xfe, 62 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfb,0xee,0xef,0xf4,0xf0,0xef,0xf4,0xb8,0xaa,0xba,0x60,0x92,0x93,0x98,0xa0,0xa9,0xac,0xab,0xa4,0x94,0x87,0x85,0xaa,0xbd,0x9f,0xb7,0xb2,0x93,0xf3,0xe2,0xab,0xa3,0xb8,0x8f,0x92,0xa2,0xad,0xb5,0xb8,0xb6,0xae,0xa1,0x9e,0x94,0x54,0xac,0xb1,0xa2,0xa4,0xaa,0xc7,0xc4,0xc9,0xc9,0xe3,0xff,0xfd,0xfe,0xfe, 63 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xf7,0xf0,0xed,0xee,0xed,0xfc,0xbc,0xa1,0xad,0x78,0x85,0x92,0xb0,0xc1,0xd1,0xda,0xdd,0xdd,0xd8,0xcd,0xba,0xa1,0x7a,0x94,0xb7,0x9e,0xab,0xe3,0xde,0xa8,0x9c,0xb9,0x84,0x99,0xba,0xcd,0xd9,0xde,0xe0,0xdd,0xd9,0xd0,0xc0,0xaa,0x8a,0x58,0xa8,0xb5,0xa4,0xa6,0xb8,0xc5,0xc5,0xc9,0xd5,0xfe,0xff,0xfd,0xfe, 64 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xff,0xf4,0xf0,0xec,0xd8,0xe9,0xd6,0xa9,0xb8,0x93,0x80,0x9a,0xb9,0xd0,0xe2,0xea,0xef,0xf0,0xf0,0xed,0xe8,0xdf,0xcc,0xad,0x6d,0xac,0xa1,0x96,0xbf,0xb0,0x9c,0xb7,0x75,0xa2,0xc6,0xdb,0xe9,0xef,0xee,0xee,0xef,0xec,0xe8,0xdf,0xcd,0xaf,0x82,0x65,0xc7,0xb2,0x90,0xa8,0xad,0xbc,0xc3,0xce,0xf6,0xff,0xfe,0xfd, 65 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xff,0xf1,0xf1,0xe8,0xcb,0xea,0xb7,0xb5,0x92,0x60,0x92,0xbb,0xd7,0xe9,0xf0,0xf7,0xf8,0xf8,0xf8,0xf5,0xf4,0xef,0xe2,0xca,0xa2,0x5b,0xb5,0x96,0xa5,0xad,0xae,0x88,0x92,0xc3,0xdd,0xf0,0xf2,0xf6,0xf7,0xf7,0xf6,0xf4,0xf2,0xee,0xe3,0xcd,0xaa,0x79,0x83,0xca,0x9c,0x8b,0x61,0xb8,0xba,0xc2,0xf0,0xff,0xff,0xfd, 66 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xd5,0x98,0x7a,0x68,0xc9,0xce,0xb1,0xba,0x5c,0x7d,0xa9,0xcf,0xe7,0xf2,0xf4,0xf8,0xf9,0xfa,0xfb,0xff,0xff,0xf8,0xeb,0xdc,0xbe,0x7a,0x96,0xa3,0xa0,0x9f,0xab,0x70,0xaf,0xd5,0xee,0xf6,0xfd,0xff,0xfc,0xf8,0xf8,0xf6,0xf6,0xf4,0xec,0xdf,0xc2,0x9d,0x4f,0xc7,0xa7,0x7a,0x7c,0x7e,0x5a,0x7a,0xa7,0xf0,0xfe,0xfe, 67 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xe1,0x7a,0x64,0x57,0x5f,0xda,0xae,0xb4,0xa8,0x51,0x93,0xbc,0xdb,0xee,0xf5,0xf9,0xfb,0xf9,0xff,0xe3,0xae,0xb8,0xf5,0xf9,0xe9,0xd0,0x9a,0x83,0xae,0xa0,0xa3,0x91,0x88,0xc0,0xe2,0xf5,0xff,0xc9,0xb7,0xd4,0xff,0xf7,0xf7,0xf9,0xf6,0xf1,0xe9,0xd3,0xb3,0x66,0x92,0xb2,0x8b,0x80,0x7b,0x49,0x54,0x65,0x98,0xff,0xfe, 68 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xe7,0x83,0x66,0x57,0x5b,0xcc,0xa6,0xb5,0x84,0x6a,0xa4,0xc7,0xe4,0xf1,0xf5,0xfb,0xfb,0xff,0xaa,0x57,0x72,0x7b,0x53,0xe5,0xee,0xdb,0xac,0x7b,0xb3,0xa1,0xa4,0x87,0x99,0xce,0xeb,0xff,0x70,0x6b,0x7a,0x75,0x8b,0xff,0xf8,0xf9,0xf6,0xf4,0xed,0xdb,0xc0,0x81,0x72,0xb3,0x96,0x80,0x88,0x4a,0x58,0x6c,0xa3,0xff,0xfe, 69 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xfc,0x58,0x2f,0x2e,0x37,0xad,0xab,0xbc,0x75,0x7b,0xac,0xce,0xe7,0xf0,0xf5,0xfb,0xff,0xe1,0x49,0xff,0x24,0x4d,0x66,0x5f,0xff,0xdd,0xb6,0x72,0xaa,0x9f,0xae,0x82,0xa6,0xd1,0xf7,0x9a,0x6c,0xff,0x23,0x5e,0x55,0xb8,0xff,0xfa,0xf8,0xf5,0xee,0xe0,0xc4,0x8c,0x5f,0xb1,0x9e,0x92,0x59,0x2a,0x2a,0x38,0x9e,0xff,0xfe, 70 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf6,0x79,0x5c,0x54,0x53,0xd3,0xb4,0xbb,0x76,0x7b,0xb0,0xd3,0xea,0xf4,0xf8,0xfa,0xff,0xaa,0x6f,0x51,0x28,0x27,0x72,0x59,0xfc,0xe0,0xb8,0x77,0xa9,0xa5,0xb1,0x85,0xad,0xd2,0xfe,0x77,0x7a,0x44,0x28,0x2b,0x85,0x8b,0xff,0xfb,0xf7,0xf6,0xf1,0xe3,0xc4,0x90,0x67,0xaa,0x98,0xaf,0x7d,0x43,0x4e,0x5a,0xae,0xff,0xfe, 71 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xed,0x82,0x6d,0x5c,0x52,0xe3,0xb9,0xb7,0x84,0x76,0xb0,0xd5,0xeb,0xf4,0xf8,0xfa,0xff,0xc9,0x85,0x72,0x56,0x67,0x92,0x75,0xfb,0xde,0xb3,0x82,0xa9,0xa2,0xac,0x86,0xab,0xd0,0xf8,0x9f,0x96,0x78,0x55,0x6b,0x8b,0xa0,0xff,0xfb,0xf7,0xf6,0xf2,0xe1,0xc5,0x8a,0x7d,0xa6,0xa4,0xd4,0x72,0x4c,0x59,0x6a,0xa5,0xff,0xfe, 72 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xfd,0xa9,0x74,0x57,0x4c,0xde,0xca,0xb4,0xa1,0x5b,0xa5,0xd0,0xe9,0xf4,0xf8,0xfa,0xfc,0xff,0x73,0x98,0x98,0xa2,0x7e,0xba,0xf2,0xd5,0xa7,0x8a,0xab,0xac,0xaf,0x81,0xa0,0xc8,0xe9,0xe5,0x72,0xa4,0xa1,0xab,0x82,0xe1,0xfd,0xfb,0xf8,0xf5,0xed,0xd9,0xbc,0x73,0x95,0xac,0xc4,0xc8,0x73,0x43,0x5a,0x80,0xd3,0xff,0xfe, 73 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xeb,0xd2,0xca,0xb6,0xe2,0xc0,0xb0,0x63,0x93,0xc8,0xe3,0xf4,0xf5,0xf9,0xf8,0xfc,0xea,0x7b,0x6e,0x77,0xb9,0xff,0xe2,0xc6,0x8a,0x9e,0xaa,0xb1,0xa4,0x90,0x86,0xbe,0xda,0xf5,0xd8,0x7c,0x7a,0x7e,0xcc,0xff,0xf7,0xf7,0xf5,0xf2,0xe2,0xcc,0xa1,0x67,0xb3,0xb8,0xd7,0xb1,0xa7,0xab,0xb9,0xf6,0xff,0xfe,0xfe, 74 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xec,0xe7,0xe7,0xc9,0xdf,0xcf,0xb0,0x89,0x71,0xb1,0xd8,0xeb,0xf2,0xf5,0xf5,0xf7,0xfe,0xff,0xfc,0xff,0xfc,0xe8,0xd5,0xa8,0x84,0xb0,0xb2,0xc7,0xbc,0xa5,0x77,0x9c,0xc8,0xe3,0xf3,0xff,0xfc,0xff,0xfe,0xf8,0xf6,0xf5,0xf2,0xe7,0xd2,0xb4,0x89,0x99,0xb1,0xc7,0xe1,0x9c,0xc0,0xbf,0xc8,0xf3,0xff,0xfe,0xfe, 75 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf0,0xef,0xec,0xec,0xdb,0xde,0xc4,0xaa,0x5f,0x8a,0xbb,0xdd,0xea,0xee,0xf2,0xf4,0xf6,0xf7,0xf6,0xf0,0xe3,0xd4,0xb2,0x8b,0xb0,0xae,0xc9,0xdb,0xd5,0xb2,0x9e,0x7d,0xa8,0xc8,0xdc,0xeb,0xf2,0xf5,0xf8,0xf2,0xf1,0xec,0xe2,0xd1,0xb1,0x9b,0x81,0xaf,0xb1,0xd8,0xd4,0xbf,0xc6,0xc7,0xcc,0xf4,0xff,0xfe,0xfe, 76 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf2,0xec,0xed,0xeb,0xea,0xda,0xd4,0xb3,0xa8,0x53,0x90,0xb6,0xd2,0xe2,0xe8,0xe9,0xe8,0xe3,0xdf,0xd5,0xc4,0xad,0x93,0xab,0xa6,0xc2,0xdb,0xe5,0xe2,0xd2,0xaa,0x8f,0x7d,0xa5,0xbb,0xcd,0xda,0xe4,0xe5,0xe0,0xdb,0xd1,0xbf,0xb1,0xaa,0x72,0xad,0xb7,0xd8,0xe2,0xc0,0xc6,0xc5,0xc7,0xcf,0xf4,0xff,0xfe,0xfe, 77 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf2,0xf0,0xec,0xec,0xe9,0xe1,0xd8,0xd0,0xb4,0xa5,0x54,0x73,0xa7,0xb9,0xc7,0xca,0xc7,0xc4,0xbb,0xb7,0xa5,0x82,0xa1,0xab,0xc6,0xdd,0xdb,0x4c,0xbf,0xe6,0xca,0xb1,0x90,0x71,0x99,0xb0,0xbb,0xbd,0xc1,0xbe,0xb7,0xb5,0xae,0x8c,0x56,0x9c,0xac,0xc7,0xd5,0xcb,0xbc,0xc9,0xc8,0xcc,0xd2,0xf4,0xff,0xfe,0xfe, 78 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf1,0xf0,0xec,0xeb,0xea,0xec,0xd4,0xd7,0xdb,0xbe,0xb1,0x89,0x5a,0x64,0x86,0x92,0x97,0x95,0x86,0x6a,0x86,0xb0,0xb6,0xc4,0xde,0xe2,0x62,0x55,0x50,0xcf,0xe8,0xce,0xb2,0xa3,0x83,0x70,0x7f,0x92,0x97,0x94,0x8d,0x71,0x55,0x79,0xad,0xa3,0xca,0xde,0xd0,0xbb,0xc6,0xc7,0xca,0xca,0xd3,0xf3,0xff,0xfe,0xfe, 79 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf0,0xf0,0xec,0xeb,0xeb,0xe9,0xea,0xd3,0xdc,0xdf,0xca,0xb5,0xb3,0xaa,0x87,0x85,0x87,0x8f,0xa1,0xbe,0xac,0xb6,0xcb,0xde,0xe0,0x7f,0x6f,0x75,0x72,0x65,0xd8,0xe9,0xda,0xc5,0xad,0xad,0xa2,0x8c,0x86,0x83,0x94,0x9a,0xb0,0xa6,0xbb,0xdb,0xd6,0xca,0xb6,0xc5,0xc6,0xc8,0xcb,0xc9,0xd4,0xf2,0xff,0xfe,0xfe, 80 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf0,0xf0,0xec,0xeb,0xec,0xea,0xe8,0xe4,0xd7,0xda,0xdc,0xdb,0xd0,0xc8,0xc1,0xb3,0xbf,0xc5,0xc0,0xcb,0xd1,0xd8,0xd7,0xcc,0x7e,0x79,0x88,0x89,0x87,0x88,0x77,0xbe,0xe7,0xde,0xdd,0xd1,0xcc,0xc2,0xc4,0xc3,0xc9,0xc4,0xce,0xdc,0xd6,0xcc,0xbc,0xba,0xbf,0xc4,0xc7,0xc9,0xcb,0xc9,0xd3,0xf2,0xff,0xfe,0xfe, 81 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf2,0xf0,0xee,0xeb,0xec,0xe9,0xea,0xe7,0xea,0xb6,0xc0,0xd8,0xd9,0xe2,0xdb,0xd7,0xe3,0xe3,0xe5,0xde,0xe1,0xd7,0xaa,0x7f,0x8e,0x96,0x98,0x9b,0x9e,0x9e,0x9d,0x8d,0xa4,0xcc,0xde,0xe5,0xe3,0xdf,0xe0,0xe3,0xe4,0xe3,0xd7,0xd0,0xb5,0x8b,0xb6,0xbf,0xc0,0xc3,0xc4,0xc5,0xca,0xcb,0xd2,0xf1,0xff,0xfe,0xfe, 82 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf1,0xf1,0xed,0xec,0xec,0xea,0xea,0xe7,0xe5,0xe4,0xdf,0xce,0xcb,0xc7,0xcf,0xd2,0xd7,0xd7,0xcc,0xb6,0xa3,0x8c,0x97,0x9b,0xa1,0xa4,0xa7,0xaa,0xae,0xb0,0xb1,0xaf,0xad,0xa2,0xa7,0xb5,0xc6,0xd9,0xe2,0xe0,0xda,0xca,0xb1,0xa8,0xae,0xbc,0xbd,0xc2,0xc3,0xc5,0xc6,0xc6,0xca,0xcb,0xd2,0xf0,0xff,0xfe,0xfe, 83 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf1,0xf0,0xed,0xec,0xec,0xeb,0xea,0xe8,0xe5,0xe6,0xe0,0xdf,0xd8,0xcb,0xbe,0xaf,0xa4,0x9d,0x9c,0x9f,0x9f,0xa2,0xa7,0xac,0xac,0xb1,0xb4,0xb8,0xbb,0xbc,0xbc,0xbb,0xb7,0xb6,0xb2,0xa8,0x9b,0x93,0x93,0x93,0x95,0xa0,0xab,0xb3,0xb9,0xbb,0xc1,0xc2,0xc4,0xc5,0xc6,0xc6,0xca,0xcb,0xd2,0xf0,0xff,0xfe,0xfe, 84 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf2,0xef,0xed,0xec,0xed,0xed,0xea,0xeb,0xe6,0xe5,0xe4,0xe3,0xe0,0xd8,0xd0,0xc7,0xbf,0xba,0xb3,0xb1,0xb2,0xb3,0xb5,0xb6,0xba,0xbe,0xc0,0xc3,0xc7,0xc7,0xc6,0xc6,0xc3,0xbf,0xbf,0xb9,0xb6,0xb3,0xaf,0xae,0xb0,0xb2,0xb5,0xb7,0xb9,0xbd,0xbf,0xc3,0xc4,0xc4,0xc3,0xc5,0xc9,0xcc,0xd1,0xf0,0xff,0xfe,0xfe, 85 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xf0,0xef,0xed,0xee,0xec,0xed,0xeb,0xe9,0xe8,0xe8,0xe7,0xe4,0xe2,0xe1,0xda,0xd5,0xd1,0xc9,0xc5,0xc2,0xc2,0xc3,0xc4,0xc6,0xc6,0xcb,0xcf,0xcf,0xd0,0xce,0xcd,0xcd,0xce,0xc9,0xc6,0xc4,0xbf,0xbb,0xba,0xba,0xb9,0xb9,0xba,0xbe,0xbe,0xc0,0xc1,0xc7,0xc6,0xc6,0xc5,0xc6,0xcc,0xcb,0xd1,0xf0,0xff,0xfe,0xfe, 86 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfe,0xfe,0xf0,0xf0,0xee,0xee,0xed,0xed,0xeb,0xe9,0xe9,0xe9,0xe8,0xe6,0xe4,0xe3,0xe1,0xde,0xdb,0xd6,0xd3,0xd0,0xcf,0xce,0xd0,0xd2,0xd4,0xd7,0xd8,0xdb,0xd8,0xd8,0xd7,0xd4,0xd3,0xcf,0xcc,0xca,0xc7,0xc4,0xc3,0xc3,0xbf,0xbf,0xbf,0xc0,0xc1,0xc1,0xc1,0xc5,0xc5,0xc5,0xc6,0xc9,0xca,0xcb,0xd1,0xf1,0xff,0xfe,0xfe, 87 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xfe,0xf0,0xf1,0xee,0xef,0xef,0xee,0xec,0xe9,0xea,0xe8,0xe8,0xe7,0xe5,0xe5,0xe6,0xe2,0xe0,0xe0,0xdd,0xdb,0xdd,0xdd,0xde,0xdf,0xe0,0xde,0xdc,0xdc,0xdb,0xdb,0xdc,0xd9,0xd5,0xd3,0xd0,0xcc,0xcf,0xcd,0xcb,0xc9,0xc7,0xc6,0xc6,0xc3,0xc4,0xc4,0xc4,0xc3,0xc5,0xc4,0xc7,0xca,0xc9,0xcb,0xd1,0xf1,0xff,0xfe,0xfe, 88 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xfe,0xf0,0xf1,0xee,0xef,0xef,0xee,0xec,0xe9,0xea,0xe8,0xea,0xe7,0xe6,0xe5,0xe7,0xe6,0xe5,0xe4,0xe3,0xe2,0xe3,0xe1,0xe1,0xe1,0xe2,0xe2,0xe0,0xe2,0xde,0xde,0xdf,0xdf,0xd8,0xd7,0xd5,0xd1,0xd1,0xd0,0xcf,0xca,0xcc,0xcb,0xc9,0xc7,0xc6,0xc5,0xc5,0xc6,0xc5,0xc5,0xc9,0xca,0xc9,0xc9,0xd1,0xf0,0xff,0xfe,0xfe, 89 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xfe,0xef,0xf2,0xef,0xed,0xee,0xee,0xea,0xeb,0xea,0xea,0xeb,0xe9,0xe9,0xe7,0xe5,0xe5,0xe5,0xe6,0xe3,0xe4,0xe5,0xe6,0xe5,0xe4,0xe4,0xe3,0xe4,0xe3,0xde,0xdd,0xde,0xdf,0xd9,0xd9,0xd7,0xd8,0xd4,0xd1,0xd0,0xcf,0xcc,0xce,0xd0,0xce,0xcb,0xc9,0xc9,0xcb,0xc9,0xc8,0xc8,0xc8,0xca,0xcc,0xd0,0xef,0xff,0xfe,0xfe, 90 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xfe,0xef,0xf1,0xf0,0xee,0xee,0xee,0xec,0xeb,0xea,0xeb,0xea,0xea,0xea,0xe8,0xe7,0xe6,0xe2,0xdf,0xe6,0xe9,0xe5,0xe5,0xe6,0xe4,0xe5,0xe4,0xe4,0xe3,0xde,0xde,0xdd,0xdd,0xd9,0xdb,0xd8,0xda,0xd8,0xd2,0xd1,0xd5,0xd1,0xd0,0xcf,0xcf,0xce,0xcc,0xcd,0xcc,0xca,0xc9,0xc8,0xc8,0xcb,0xcb,0xcf,0xee,0xff,0xfe,0xfe, 91 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xff,0xef,0xf0,0xef,0xef,0xef,0xed,0xee,0xec,0xea,0xea,0xeb,0xea,0xea,0xe8,0xe8,0xe7,0xdf,0xbd,0xc5,0xcd,0xdf,0xe6,0xe8,0xe8,0xe9,0xe8,0xe8,0xe7,0xe2,0xe1,0xe2,0xe0,0xdd,0xda,0xd1,0xbc,0xb0,0xa8,0xcc,0xd8,0xd5,0xd0,0xcd,0xd0,0xcd,0xcc,0xcb,0xcb,0xca,0xca,0xc8,0xc9,0xcb,0xca,0xcd,0xf4,0xff,0xfe,0xfe, 92 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xa7,0xf4,0xf1,0xef,0xee,0xed,0xed,0xee,0xee,0xed,0xea,0xec,0xec,0xea,0xeb,0xe7,0xe7,0xe8,0xe6,0xe4,0xda,0xcb,0xc0,0xc0,0xbe,0xbd,0xc1,0xc2,0xc1,0xc0,0xbd,0xb6,0xb3,0xb1,0xb1,0xb7,0xc3,0xce,0xd8,0xda,0xdc,0xd5,0xd3,0xd2,0xcf,0xd0,0xcf,0xcd,0xce,0xcc,0xc9,0xca,0xc9,0xc9,0xc7,0xcf,0xa1,0xe2,0xff,0xfe, 93 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0x8c,0xc7,0xf5,0xee,0xee,0xee,0xee,0xed,0xed,0xed,0xed,0xeb,0xec,0xea,0xeb,0xe8,0xe8,0xe8,0xe7,0xe7,0xe9,0xe8,0xe6,0xe3,0xe0,0xd5,0xd2,0xcc,0xc8,0xca,0xcb,0xcf,0xd6,0xda,0xdc,0xdd,0xdc,0xdd,0xdc,0xdb,0xdb,0xd8,0xd5,0xd4,0xcf,0xcf,0xd0,0xd0,0xce,0xcc,0xca,0xc8,0xc9,0xc6,0xc3,0xd0,0x4c,0xbd,0xff,0xfe, 94 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xbd,0x89,0xcc,0xf1,0xef,0xed,0xf0,0xee,0xee,0xee,0xee,0xeb,0xec,0xeb,0xeb,0xe9,0xe9,0xe9,0xe5,0xe7,0xe8,0xe6,0xe6,0xe6,0xe6,0xe5,0xe6,0xe5,0xe3,0xe1,0xe0,0xde,0xdd,0xdc,0xdc,0xdb,0xdc,0xdc,0xda,0xd9,0xd9,0xd7,0xd6,0xd4,0xd0,0xcf,0xcf,0xce,0xcd,0xcb,0xc9,0xc6,0xc5,0xc7,0xbc,0x57,0x5e,0xb7,0xff,0xfe, 95 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xbd,0xb2,0x92,0xb8,0xed,0xec,0xec,0xef,0xef,0xee,0xee,0xeb,0xed,0xed,0xec,0xe9,0xea,0xea,0xe8,0xe8,0xe8,0xe6,0xe5,0xe6,0xe6,0xe4,0xe5,0xe6,0xe5,0xe3,0xe2,0xe0,0xde,0xdd,0xdd,0xdc,0xdd,0xdb,0xdc,0xdb,0xda,0xd8,0xd7,0xd3,0xd0,0xd1,0xcc,0xcb,0xcb,0xc8,0xc6,0xc1,0xbf,0xa8,0x55,0x59,0x5c,0x9f,0xff,0xfe, 96 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xe1,0xb7,0xb0,0xb8,0x93,0xad,0xed,0xe8,0xec,0xeb,0xeb,0xee,0xeb,0xeb,0xec,0xec,0xe9,0xea,0xea,0xe7,0xe7,0xe8,0xe7,0xe6,0xe5,0xe6,0xe6,0xe4,0xe4,0xe5,0xe2,0xe0,0xe0,0xdf,0xde,0xdc,0xdb,0xdc,0xdb,0xdc,0xda,0xdc,0xd8,0xd6,0xd6,0xcf,0xd0,0xce,0xc9,0xc9,0xc6,0xbf,0xb6,0x9f,0x4d,0x56,0x5c,0x5a,0x68,0xff,0xfe, 97 | 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xff,0xf1,0xaa,0xa9,0xa5,0xaa,0x9b,0x99,0xdc,0xe9,0xeb,0xec,0xed,0xeb,0xeb,0xea,0xea,0xe9,0xe9,0xea,0xe7,0xe8,0xe7,0xe7,0xe7,0xe7,0xe5,0xe6,0xe4,0xe4,0xe3,0xe2,0xe2,0xe1,0xdf,0xde,0xdc,0xdc,0xdb,0xdc,0xda,0xda,0xd9,0xd8,0xd7,0xd4,0xd0,0xce,0xcc,0xc9,0xc1,0xba,0xac,0x87,0x48,0x5a,0x5d,0x57,0x53,0x85,0xff,0xfe, 98 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xdb,0xa5,0xb1,0xb3,0xa6,0xaf,0x95,0xca,0xdf,0xea,0xeb,0xed,0xec,0xeb,0xeb,0xeb,0xeb,0xeb,0xe9,0xea,0xe8,0xe9,0xe9,0xe9,0xe7,0xe8,0xe7,0xe7,0xe6,0xe5,0xe5,0xe4,0xe2,0xe2,0xdf,0xe0,0xde,0xde,0xdd,0xdb,0xd9,0xd7,0xd8,0xd5,0xd2,0xce,0xca,0xc3,0xb8,0xa5,0x70,0x4f,0x5f,0x5e,0x5b,0x58,0x65,0xff,0xfc,0xfe, 99 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xf5,0xc2,0xb0,0x9d,0x98,0x91,0x8e,0x88,0x84,0x7e,0x7c,0x76,0x6e,0x71,0x71,0x70,0x6f,0x70,0x6f,0x76,0x6b,0x6b,0x6c,0x6c,0x68,0x64,0x62,0x64,0x60,0x63,0x64,0x5d,0x59,0x56,0x54,0x4d,0x52,0x51,0x4d,0x4d,0x4b,0x4e,0x54,0x5d,0x69,0x85,0xbc,0xff,0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, 100 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xff,0xcc,0xa7,0xa0,0x94,0x97,0x90,0x8b,0x88,0x81,0x7c,0x79,0x71,0x6a,0x69,0x6a,0x6c,0x6f,0x6d,0x6b,0x63,0x61,0x6a,0x66,0x62,0x68,0x64,0x63,0x65,0x60,0x5d,0x5f,0x60,0x59,0x58,0x56,0x4e,0x52,0x53,0x4d,0x4d,0x48,0x4b,0x53,0x56,0x59,0x6c,0x84,0xd5,0xff,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, 101 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xde,0xb4,0xa6,0x99,0x93,0x90,0x94,0x92,0x87,0x7f,0x77,0x6c,0x7e,0x7e,0x6f,0x61,0x56,0x50,0x56,0x69,0x5d,0x58,0x5d,0x5e,0x60,0x62,0x5f,0x62,0x5a,0x5a,0x50,0x4a,0x52,0x4c,0x62,0x67,0x6b,0x58,0x48,0x42,0x41,0x47,0x50,0x50,0x53,0x52,0x62,0x73,0xa1,0xf2,0xff,0xfa,0xfe,0xfe,0xfe,0xfe, 102 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xef,0xc3,0xaa,0xa2,0x9c,0x98,0x94,0x9d,0x80,0x95,0xb4,0xd6,0xe8,0xe1,0xdf,0xeb,0xd8,0xbe,0x9a,0x57,0x34,0x5a,0x51,0x57,0x55,0x51,0x4d,0x4d,0x50,0x60,0x49,0x47,0x7d,0xb6,0xe3,0xe4,0xe3,0xe0,0xe4,0xda,0xbb,0x7e,0x4c,0x41,0x55,0x5a,0x55,0x5f,0x64,0x7f,0xbd,0xff,0xf7,0xfe,0xfe,0xfe,0xfe, 103 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xff,0xd4,0xb0,0xa3,0x9e,0x9e,0xa1,0xa2,0xa8,0xda,0xf1,0xe4,0xdd,0xd1,0xc7,0xc8,0xbd,0xd2,0xe5,0xec,0xdb,0x9c,0x42,0x42,0x51,0x4d,0x49,0x56,0x56,0x46,0x46,0x89,0xe6,0xe0,0xd2,0xc3,0xc7,0xd1,0xd1,0xc9,0xcd,0xde,0xd9,0xc9,0x8c,0x5f,0x5e,0x57,0x5e,0x63,0x71,0x8f,0xef,0xfd,0xfe,0xfe,0xfe,0xfe, 104 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf3,0xc0,0xac,0xa2,0xa0,0xa2,0xa9,0xcd,0xfb,0xe1,0xc4,0xa5,0xa6,0xb1,0xb2,0xa8,0x9c,0xaa,0xb0,0xb1,0xc3,0xe2,0xcf,0x62,0x33,0x3f,0x48,0x3f,0x40,0x48,0xe0,0xf3,0xd0,0xc0,0xa6,0x9e,0xa0,0xa4,0xab,0xa9,0xa1,0x92,0xa6,0xc4,0xcf,0x9f,0x79,0x61,0x58,0x61,0x6d,0x81,0xc1,0xff,0xfe,0xfe,0xfe,0xfe, 105 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xde,0xb4,0xaa,0xa1,0xa3,0xac,0xeb,0xf4,0xc7,0xa5,0xae,0xbe,0x88,0x74,0x6b,0x69,0x82,0x9a,0xb9,0xa9,0x96,0xa6,0xc5,0xd5,0x53,0x33,0x3b,0x32,0x4c,0xfb,0xf2,0xbb,0xab,0xa5,0xbc,0xa9,0x86,0x6e,0x6b,0x73,0x80,0xb0,0xa8,0x93,0xa6,0xbe,0xa3,0x7e,0x6a,0x60,0x68,0x7a,0xa0,0xf5,0xff,0xfe,0xfe,0xfe, 106 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xca,0xa9,0xa5,0x9f,0xa0,0xe2,0xf0,0xc7,0xa4,0xc8,0x79,0x42,0x69,0x69,0x70,0x79,0x6d,0x64,0x52,0x7e,0xb7,0xaa,0xa3,0xb1,0xc5,0x48,0x19,0x3e,0xf9,0xd8,0xaf,0x9b,0xb8,0x94,0x5f,0x62,0x6f,0x77,0x77,0x69,0x5f,0x39,0x5c,0xb2,0x9e,0x9a,0xae,0xab,0x75,0x60,0x65,0x73,0x8d,0xdd,0xff,0xfe,0xfe,0xfe, 107 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xfc,0xff,0xf5,0xbb,0xaf,0x98,0xa3,0xcd,0xf7,0xae,0xb2,0xb9,0x41,0x6d,0x7d,0x88,0x9c,0xa6,0xaa,0xad,0xa4,0x95,0x72,0x60,0x96,0xb3,0xa3,0xb5,0xbb,0x5e,0xd6,0xe9,0xa1,0xa7,0xb0,0x70,0x7a,0x94,0xa9,0xb2,0xb5,0xb4,0xad,0x9a,0x8d,0x6d,0x1e,0xa0,0xb1,0x9f,0xa2,0xa7,0x6b,0x71,0x6c,0x87,0xb7,0xff,0xfe,0xfe,0xfe, 108 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfd,0xfe,0xe6,0xb2,0xab,0x90,0xa2,0xff,0xb0,0xa2,0xac,0x55,0x6d,0x8f,0xa3,0xbb,0xcb,0xd4,0xd7,0xd4,0xd0,0xbe,0xb6,0xa0,0x5c,0x79,0xba,0xad,0xa1,0xe5,0xe0,0x9f,0xa5,0x9f,0x6d,0x92,0xae,0xc4,0xd3,0xd9,0xda,0xd6,0xd2,0xc8,0xbc,0xa1,0x72,0x19,0x9b,0xb5,0xa1,0xa6,0x8f,0x58,0x6e,0x7d,0x9b,0xff,0xff,0xfe,0xfe, 109 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xd4,0xae,0x9f,0x9c,0xd7,0xd5,0xab,0xba,0x7f,0x76,0x95,0xb5,0xcf,0xde,0xe4,0xe8,0xea,0xe5,0xe3,0xe0,0xd3,0xc2,0xb1,0x60,0x9f,0xa3,0x95,0xbb,0xac,0xa3,0xa9,0x6c,0x97,0xbd,0xd8,0xe4,0xe9,0xe7,0xe8,0xe7,0xe5,0xdc,0xd8,0xc9,0xa5,0x7d,0x40,0xbe,0xb0,0x8f,0xa9,0x6b,0x73,0x7f,0x96,0xef,0xff,0xfb,0xfe, 110 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xbe,0x9f,0x96,0xc4,0xea,0xb5,0xae,0x8e,0x52,0x8d,0xb5,0xd1,0xe3,0xea,0xef,0xf0,0xf0,0xf0,0xed,0xeb,0xe6,0xdb,0xc5,0x9f,0x58,0xb5,0x98,0xa6,0xac,0xaa,0x83,0x8c,0xbd,0xd7,0xe8,0xea,0xee,0xef,0xef,0xee,0xec,0xea,0xe6,0xde,0xc2,0xae,0x6e,0x6c,0xc7,0xa0,0x8a,0x6a,0x7d,0x69,0x8d,0xdb,0xff,0xf7,0xfe, 111 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf7,0xd0,0x82,0x64,0x5a,0xcb,0xc8,0xaf,0xb4,0x50,0x78,0xa3,0xc9,0xe1,0xec,0xee,0xf1,0xf1,0xf2,0xf3,0xf7,0xf7,0xf0,0xe5,0xd8,0xbb,0x76,0x97,0xa4,0xa1,0x9f,0xa8,0x6b,0xa9,0xcf,0xe7,0xee,0xf5,0xf8,0xf6,0xf0,0xf0,0xee,0xee,0xed,0xe6,0xd6,0xc1,0x9f,0x3e,0xc3,0xa6,0x79,0x8a,0x81,0x50,0x58,0x9a,0xef,0xfa,0xfe, 112 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xdc,0x78,0x62,0x5f,0x5c,0xd5,0xad,0xb3,0xa4,0x47,0x8e,0xb6,0xd5,0xe8,0xee,0xf1,0xf3,0xf2,0xff,0xdd,0xa1,0xae,0xf0,0xf0,0xe0,0xc9,0x96,0x7f,0xb3,0x9f,0xa0,0x8c,0x81,0xb9,0xdb,0xeb,0xfb,0xbf,0xa9,0xc3,0xfd,0xf0,0xf0,0xf0,0xee,0xea,0xe2,0xcb,0xac,0x5d,0x8a,0xb3,0x89,0x83,0x76,0x42,0x57,0x63,0x90,0xff,0xfe, 113 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xe6,0x7c,0x65,0x54,0x56,0xcb,0xa6,0xb5,0x81,0x64,0x9d,0xc1,0xde,0xeb,0xef,0xf2,0xf2,0xff,0x9d,0x36,0x54,0x54,0x33,0xd9,0xe7,0xd1,0xa9,0x75,0xba,0x9f,0xa0,0x80,0x90,0xc6,0xe3,0xf7,0x55,0x46,0x54,0x4e,0x77,0xff,0xf0,0xf0,0xee,0xec,0xe6,0xd5,0xba,0x7d,0x68,0xb6,0x98,0x81,0x87,0x48,0x55,0x68,0x9a,0xff,0xfe, 114 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xfb,0x51,0x2e,0x2b,0x33,0xac,0xab,0xbc,0x72,0x76,0xa5,0xc9,0xe1,0xeb,0xef,0xf2,0xf3,0xe2,0x27,0xf4,0x22,0x33,0x44,0x52,0xf6,0xd4,0xb2,0x6c,0xb1,0x9f,0xaa,0x7b,0x9d,0xc9,0xf0,0x8b,0x41,0xf8,0x1c,0x3a,0x30,0xae,0xfa,0xf1,0xf0,0xed,0xe8,0xdb,0xbe,0x86,0x55,0xb3,0x9f,0x93,0x58,0x27,0x27,0x34,0x96,0xff,0xfe, 115 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xf4,0x71,0x5c,0x56,0x52,0xd2,0xb4,0xbb,0x76,0x71,0xab,0xcd,0xe4,0xed,0xf0,0xf2,0xf9,0x9e,0x4a,0x48,0x2d,0x26,0x5c,0x3d,0xf2,0xd6,0xb3,0x71,0xa7,0xa4,0xad,0x7d,0xa5,0xcc,0xf6,0x64,0x4f,0x38,0x27,0x2b,0x59,0x6f,0xff,0xed,0xf0,0xee,0xe7,0xda,0xc0,0x8b,0x5d,0xab,0x94,0xab,0x7a,0x45,0x50,0x59,0xa4,0xff,0xfe, 116 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xea,0x7b,0x6c,0x5d,0x4f,0xe2,0xb9,0xb7,0x84,0x6c,0xab,0xcf,0xe5,0xed,0xf0,0xf2,0xf5,0xc0,0x6c,0x60,0x59,0x64,0x77,0x60,0xf2,0xd4,0xae,0x7d,0xa6,0xa1,0xa8,0x7f,0xa3,0xcb,0xf1,0x89,0x72,0x65,0x56,0x60,0x62,0x90,0xfc,0xef,0xf0,0xee,0xe8,0xd8,0xc1,0x85,0x73,0xa7,0xa1,0xce,0x6f,0x4c,0x59,0x69,0x9b,0xff,0xfe, 117 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xfc,0xa3,0x6b,0x4e,0x40,0xdb,0xc9,0xb9,0x9f,0x51,0xa2,0xc8,0xe3,0xed,0xf0,0xf2,0xee,0xfc,0x66,0x7c,0x7b,0x78,0x64,0xaf,0xea,0xc7,0xa1,0x85,0xa8,0xab,0xac,0x7a,0x97,0xc1,0xe0,0xdf,0x5e,0x78,0x78,0x7c,0x5f,0xdd,0xf4,0xf1,0xf0,0xed,0xe3,0xd1,0xb8,0x70,0x8a,0xae,0xc0,0xc5,0x6f,0x3c,0x52,0x7e,0xc9,0xff,0xfe, 118 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xad,0x83,0x6f,0xb4,0xdf,0xba,0xa9,0x5a,0x89,0xc0,0xdb,0xeb,0xee,0xf1,0xf0,0xf2,0xe0,0x72,0x5a,0x62,0xb0,0xf7,0xdc,0xc0,0x88,0x9c,0xa7,0xaf,0xa5,0x8d,0x80,0xb8,0xd3,0xf0,0xc9,0x5f,0x58,0x5f,0xc4,0xf9,0xf0,0xf0,0xed,0xea,0xdc,0xcc,0x9b,0x59,0xac,0xb3,0xd2,0xb5,0x70,0x4f,0x64,0xdc,0xff,0xfa,0xfe, 119 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfa,0xff,0xc3,0x8e,0x82,0x79,0xc8,0xdb,0xb2,0x84,0x59,0xac,0xd4,0xe1,0xea,0xed,0xef,0xef,0xf5,0xff,0xfa,0xfd,0xf3,0xe0,0xcf,0xae,0x7b,0xab,0xb0,0xc4,0xb5,0xa3,0x78,0x99,0xc4,0xd7,0xe6,0xfa,0xf2,0xff,0xf7,0xf0,0xee,0xed,0xe9,0xde,0xce,0xb1,0x6f,0x7d,0xb9,0xbb,0xdd,0x68,0x66,0x65,0x89,0xe1,0xff,0xfa,0xfe, 120 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf9,0xff,0xce,0xa0,0x9c,0x80,0xa6,0xdb,0xc1,0xad,0x4b,0x6e,0xbb,0xd0,0xe3,0xe5,0xe9,0xeb,0xeb,0xea,0xec,0xe8,0xdc,0xce,0xb9,0x66,0xa2,0xac,0xc3,0xd3,0xce,0xb9,0x99,0x5f,0x9a,0xc7,0xda,0xe1,0xe6,0xed,0xe6,0xe8,0xe6,0xe2,0xdb,0xcc,0xb4,0x7b,0x53,0xb2,0xb2,0xe2,0xb6,0x50,0x67,0x6b,0x89,0xe1,0xff,0xfa,0xfe, 121 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xca,0xa7,0x97,0x8d,0x80,0xd0,0xd5,0xb1,0xaf,0x3c,0x5b,0xa6,0xcb,0xdc,0xe2,0xe5,0xe3,0xe0,0xdb,0xd3,0xc3,0x98,0x5e,0x7f,0xad,0xbb,0xda,0xe7,0xd7,0xba,0xab,0x87,0x5f,0x8c,0xb6,0xca,0xd6,0xdf,0xe1,0xe2,0xdc,0xd2,0xbb,0x98,0x69,0x3d,0xaa,0xb0,0xc9,0xe1,0x73,0x54,0x64,0x6d,0x89,0xe5,0xff,0xfb,0xfe, 122 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xca,0xa9,0x96,0x8e,0x7c,0x93,0xd4,0xcc,0xb4,0xa8,0x48,0x36,0x67,0x93,0xa4,0xad,0xb4,0xab,0x9c,0x8c,0x69,0x4b,0x8e,0xc0,0xbb,0xda,0xd3,0x1f,0xb1,0xdf,0xd0,0xb5,0x88,0x41,0x5f,0x85,0x99,0xa3,0xad,0xa7,0x9a,0x8a,0x73,0x4e,0x42,0xa6,0xaf,0xc7,0xe6,0x9f,0x43,0x59,0x63,0x6c,0x88,0xe4,0xff,0xfb,0xfe, 123 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc9,0xa9,0x97,0x8a,0x84,0x72,0xa7,0xd6,0xd7,0xb9,0xac,0x8f,0x41,0x29,0x48,0x50,0x50,0x51,0x46,0x32,0x6a,0xab,0xab,0xc2,0xd6,0xe4,0x27,0x0,0x0,0xc9,0xe0,0xc6,0xb0,0xa2,0x71,0x43,0x3a,0x4b,0x4d,0x4b,0x48,0x36,0x31,0x71,0xaf,0xa4,0xd6,0xd6,0xb3,0x4f,0x4c,0x5f,0x61,0x6e,0x80,0xe0,0xff,0xfa,0xfe, 124 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc8,0xa9,0x97,0x8a,0x80,0x79,0x67,0xa4,0xdf,0xe4,0xc9,0xb0,0xb3,0xa9,0x7f,0x78,0x76,0x86,0x9d,0xbd,0xad,0xb4,0xcb,0xd3,0xdd,0x31,0x0,0x2,0x0,0x17,0xc3,0xe0,0xd8,0xc8,0xb4,0xb7,0xa3,0x89,0x7f,0x71,0x87,0x93,0xb1,0xaa,0xc5,0xc2,0xda,0xb6,0x48,0x43,0x50,0x5b,0x5f,0x70,0x7f,0xdf,0xff,0xfa,0xfe, 125 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc9,0xa9,0x97,0x8a,0x81,0x7a,0x6d,0x5f,0x92,0xd1,0xde,0xcd,0xcc,0xc9,0xbe,0xb3,0xc1,0xca,0xc1,0xcc,0xc8,0xd1,0xe2,0xc6,0x2c,0x1,0xc,0x15,0x1a,0x0,0xf,0x99,0xea,0xdf,0xce,0xcc,0xc9,0xc0,0xc4,0xc3,0xc8,0xc1,0xcb,0xd6,0xd1,0xd5,0x96,0x3a,0x46,0x49,0x4b,0x57,0x5d,0x70,0x7f,0xe0,0xff,0xfa,0xfe, 126 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc4,0xa6,0x93,0x8a,0x81,0x79,0x71,0x6d,0x59,0x6d,0x9b,0xdc,0xde,0xd5,0xd2,0xd1,0xd9,0xd6,0xda,0xd6,0xe7,0xce,0x76,0xd,0xe,0x1d,0x1e,0x20,0x21,0x1e,0x16,0xa,0x55,0xbc,0xee,0xe1,0xe0,0xdd,0xdc,0xde,0xe3,0xde,0xdc,0xdb,0x9b,0x61,0x3e,0x45,0x49,0x4c,0x4f,0x54,0x59,0x69,0x80,0xe0,0xff,0xfa,0xfe, 127 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc4,0xa6,0x93,0x8b,0x82,0x7a,0x76,0x71,0x6a,0x68,0x58,0x5b,0x86,0xb7,0xc2,0xc9,0xd5,0xda,0xbc,0x97,0x55,0xe,0x9,0x22,0x1e,0x23,0x28,0x2b,0x25,0x24,0x1f,0x19,0x1b,0x16,0x2e,0x82,0xac,0xcb,0xe0,0xdd,0xcb,0xb2,0x84,0x41,0x34,0x2f,0x3e,0x45,0x47,0x48,0x4b,0x50,0x58,0x69,0x80,0xdf,0xff,0xfa,0xfe, 128 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc4,0xa6,0x94,0x8c,0x83,0x7b,0x77,0x73,0x70,0x65,0x64,0x55,0x4e,0x3d,0x37,0x31,0x2e,0x18,0x16,0x15,0x18,0x1c,0x23,0x1e,0x28,0x2d,0x2e,0x32,0x36,0x33,0x32,0x35,0x30,0x26,0x1a,0xe,0x15,0x14,0x1b,0x1b,0x1d,0x20,0x21,0x32,0x34,0x40,0x37,0x41,0x44,0x47,0x4a,0x4f,0x55,0x6a,0x7f,0xde,0xff,0xfa,0xfe, 129 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc1,0xa5,0x96,0x8f,0x87,0x80,0x74,0x72,0x6d,0x6c,0x68,0x61,0x5a,0x57,0x4e,0x43,0x36,0x32,0x29,0x25,0x26,0x27,0x29,0x2b,0x2e,0x36,0x38,0x3c,0x3e,0x3e,0x3b,0x35,0x34,0x30,0x24,0x25,0x1e,0x22,0x27,0x24,0x2d,0x32,0x34,0x36,0x39,0x3c,0x40,0x40,0x45,0x4a,0x4c,0x51,0x53,0x6a,0x7b,0xdc,0xff,0xfa,0xfe, 130 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc2,0xa5,0x96,0x90,0x86,0x7f,0x7b,0x76,0x71,0x6c,0x69,0x64,0x62,0x61,0x5a,0x52,0x4c,0x45,0x3e,0x38,0x39,0x39,0x3b,0x3d,0x3d,0x45,0x48,0x49,0x4a,0x49,0x48,0x44,0x3b,0x38,0x2e,0x32,0x30,0x2c,0x2c,0x30,0x32,0x35,0x34,0x37,0x3d,0x40,0x41,0x3e,0x42,0x45,0x48,0x4d,0x52,0x69,0x7b,0xdd,0xff,0xfa,0xfe, 131 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc1,0xa3,0x94,0x8f,0x86,0x7f,0x7a,0x77,0x72,0x6e,0x69,0x68,0x68,0x67,0x62,0x5d,0x5a,0x54,0x50,0x4d,0x4e,0x4d,0x4e,0x4f,0x52,0x50,0x55,0x53,0x52,0x4e,0x4f,0x4f,0x49,0x46,0x42,0x44,0x3b,0x36,0x34,0x33,0x36,0x38,0x39,0x3c,0x3f,0x40,0x3f,0x41,0x43,0x45,0x46,0x4b,0x58,0x66,0x7e,0xd7,0xff,0xfb,0xfe, 132 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc1,0xa1,0x93,0x8f,0x86,0x80,0x78,0x76,0x71,0x6f,0x69,0x6a,0x69,0x6a,0x65,0x62,0x61,0x5a,0x5a,0x58,0x57,0x57,0x59,0x5b,0x5c,0x58,0x60,0x57,0x57,0x53,0x4f,0x4d,0x4b,0x4e,0x4f,0x4e,0x44,0x42,0x3f,0x3b,0x3d,0x3c,0x3d,0x3f,0x41,0x41,0x41,0x44,0x45,0x46,0x46,0x4c,0x5c,0x64,0x7f,0xd3,0xff,0xfc,0xfe, 133 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xc1,0xa2,0x93,0x8f,0x86,0x7f,0x78,0x75,0x71,0x6e,0x6b,0x6a,0x6b,0x6a,0x64,0x64,0x64,0x66,0x66,0x65,0x60,0x5f,0x61,0x62,0x64,0x5f,0x66,0x5e,0x5d,0x58,0x54,0x50,0x4c,0x4f,0x4f,0x4c,0x49,0x47,0x48,0x43,0x3d,0x39,0x3a,0x3f,0x42,0x43,0x42,0x47,0x45,0x46,0x48,0x4c,0x5b,0x63,0x7f,0xd2,0xff,0xfc,0xfe, 134 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfb,0xff,0xbf,0x9f,0x92,0x8e,0x86,0x7f,0x7a,0x7a,0x79,0x71,0x6d,0x6a,0x69,0x67,0x64,0x64,0x65,0x65,0x6b,0x65,0x66,0x5d,0x63,0x64,0x67,0x65,0x66,0x65,0x5a,0x5a,0x59,0x55,0x4e,0x48,0x4e,0x47,0x4b,0x54,0x49,0x48,0x50,0x47,0x45,0x3f,0x40,0x44,0x47,0x46,0x48,0x49,0x47,0x50,0x59,0x5e,0x7e,0xd1,0xff,0xfa,0xfe, 135 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xbe,0x9e,0x92,0x8f,0x86,0x7f,0x7c,0x7b,0x7a,0x75,0x71,0x6e,0x6d,0x6b,0x68,0x67,0x5e,0x56,0x67,0x6f,0x64,0x65,0x61,0x63,0x67,0x66,0x66,0x66,0x60,0x5f,0x5e,0x57,0x52,0x4b,0x51,0x4e,0x4c,0x4b,0x46,0x48,0x4b,0x4c,0x49,0x45,0x3b,0x3c,0x42,0x47,0x49,0x4a,0x48,0x50,0x59,0x5c,0x7d,0xd0,0xff,0xfa,0xfe, 136 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0xc0,0x9b,0x95,0x92,0x86,0x80,0x7e,0x7c,0x7b,0x79,0x74,0x71,0x72,0x71,0x6f,0x66,0x59,0x32,0x2f,0x40,0x5a,0x6c,0x63,0x68,0x6c,0x6b,0x6b,0x6b,0x68,0x68,0x66,0x5e,0x58,0x50,0x51,0x3a,0x2a,0x1c,0x42,0x46,0x45,0x51,0x4b,0x48,0x44,0x45,0x49,0x45,0x49,0x4b,0x49,0x51,0x5a,0x5a,0x76,0xd5,0xff,0xfa,0xfe, 137 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xff,0xa7,0xc5,0x94,0x95,0x8a,0x89,0x86,0x7f,0x80,0x7f,0x7a,0x77,0x73,0x7a,0x77,0x6e,0x6a,0x68,0x68,0x5c,0x4b,0x42,0x37,0x34,0x32,0x38,0x36,0x38,0x38,0x32,0x34,0x36,0x37,0x29,0x27,0x2e,0x3a,0x46,0x49,0x44,0x44,0x4a,0x4f,0x4b,0x44,0x46,0x46,0x44,0x45,0x47,0x49,0x4e,0x50,0x4f,0x61,0x77,0x84,0xe2,0xfc,0xfe, 138 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfc,0xff,0x96,0x7d,0x8b,0x9a,0x88,0x85,0x81,0x7f,0x80,0x7f,0x7e,0x76,0x73,0x7a,0x76,0x70,0x6b,0x67,0x68,0x6d,0x72,0x6e,0x68,0x61,0x5c,0x53,0x51,0x4c,0x49,0x46,0x4d,0x4f,0x4e,0x50,0x50,0x51,0x50,0x51,0x4d,0x49,0x43,0x44,0x46,0x4a,0x4a,0x47,0x46,0x46,0x45,0x47,0x4a,0x4d,0x50,0x52,0x63,0x5f,0x2c,0xc2,0xff,0xfe, 139 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xc6,0x86,0x71,0x7e,0x85,0x7c,0x81,0x82,0x80,0x7e,0x7e,0x76,0x72,0x76,0x73,0x71,0x6c,0x68,0x6b,0x68,0x67,0x69,0x6f,0x6b,0x64,0x5f,0x5f,0x5f,0x5e,0x5e,0x5e,0x5d,0x5d,0x62,0x5a,0x54,0x53,0x56,0x4f,0x4b,0x4e,0x4c,0x48,0x48,0x4c,0x4a,0x47,0x48,0x46,0x48,0x48,0x4c,0x48,0x4f,0x3f,0x3e,0x61,0xc4,0xff,0xfe, 140 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xdf,0xbf,0xa7,0x5e,0x73,0x88,0x84,0x80,0x80,0x7f,0x7e,0x76,0x72,0x70,0x6f,0x71,0x6c,0x69,0x68,0x68,0x6a,0x6d,0x6c,0x69,0x68,0x68,0x63,0x63,0x61,0x64,0x62,0x5f,0x5d,0x62,0x5e,0x58,0x54,0x58,0x4f,0x48,0x4b,0x4b,0x4a,0x49,0x4d,0x4d,0x48,0x49,0x45,0x47,0x46,0x4f,0x3b,0x39,0x4a,0x66,0x72,0xae,0xff,0xfe, 141 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xe0,0xd7,0xe4,0xb9,0xad,0x59,0x5a,0x7d,0x73,0x7b,0x80,0x7f,0x76,0x72,0x6f,0x6f,0x71,0x6c,0x69,0x68,0x69,0x69,0x69,0x67,0x68,0x67,0x68,0x66,0x66,0x66,0x63,0x60,0x62,0x64,0x5d,0x5e,0x5d,0x58,0x59,0x4f,0x47,0x47,0x44,0x49,0x51,0x51,0x4d,0x4a,0x47,0x43,0x46,0x3e,0x32,0x2f,0x45,0x68,0x76,0x81,0x71,0xff,0xfe, 142 | 0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xff,0xe8,0xc4,0xc7,0xe8,0xb7,0xad,0x4f,0x46,0x61,0x7c,0x7d,0x78,0x76,0x73,0x71,0x72,0x6e,0x6c,0x6c,0x6b,0x65,0x68,0x65,0x65,0x65,0x6a,0x67,0x69,0x6a,0x69,0x60,0x60,0x62,0x61,0x59,0x5c,0x58,0x5b,0x54,0x4f,0x4c,0x4a,0x49,0x4a,0x50,0x4e,0x46,0x44,0x40,0x3f,0x39,0x2b,0x2c,0x38,0x6f,0x68,0x7b,0x6a,0x88,0xff,0xfd, 143 | 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff,0xc7,0xb2,0xd7,0xe4,0xc3,0xc3,0x64,0x38,0x5d,0x6d,0x76,0x77,0x75,0x74,0x75,0x6e,0x6d,0x6e,0x6e,0x65,0x69,0x66,0x66,0x65,0x6d,0x68,0x68,0x69,0x68,0x61,0x61,0x63,0x61,0x5b,0x5b,0x53,0x5a,0x52,0x4f,0x4f,0x4c,0x4b,0x4a,0x51,0x4d,0x44,0x41,0x39,0x2f,0x1e,0x23,0x62,0x77,0x7d,0x79,0x67,0x58,0xf7,0xff,0xfe, 144 | }; 145 | 146 | #endif 147 | -------------------------------------------------------------------------------- /examples/minions.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wuhanstudio/vt100/25c78a77ee5e5651bf50b785b1b77e376a5d2b29/examples/minions.jpg -------------------------------------------------------------------------------- /examples/minions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wuhanstudio/vt100/25c78a77ee5e5651bf50b785b1b77e376a5d2b29/examples/minions.png -------------------------------------------------------------------------------- /examples/vt_color.c: -------------------------------------------------------------------------------- 1 | /* 2 | * @Description: VT100 Color demo 3 | * @Author: Wu Han 4 | * @Date: 2019-08-24 21:02:52 5 | * @LastEditTime: 2019-08-24 21:34:44 6 | * @LastEditors: Please set LastEditors 7 | */ 8 | 9 | #include 10 | #include "vt100.h" 11 | 12 | static void vt_color(int argc, char* argv[]) 13 | { 14 | vt_hide_cursor(); 15 | vt_clear(); 16 | 17 | // 1. Corlor Bar 18 | for (int i = 0; i < 8; i++) 19 | { 20 | if(i == 0) 21 | { 22 | vt_set_font_color(VT_F_WHITE); 23 | } 24 | else 25 | { 26 | vt_set_font_color((vt_fore_color)(VT_F_BLACK + i - 1)); 27 | } 28 | vt_set_bg_color((vt_back_color)(VT_B_BLACK + i)); 29 | vt_draw_hline(i, 0, 80, ' '); 30 | vt_draw_str_at(i, 31, "Put your text here"); 31 | } 32 | 33 | // 2. Boxes 34 | vt_set_font_color(VT_F_WHITE); 35 | vt_set_bg_color(VT_B_BLACK); 36 | for (int i = 0; i < 7; i++) 37 | { 38 | vt_draw_box(8 + i, 0, 16 - i * 2, 40 - i * 2, '-', '|', '+'); 39 | } 40 | 41 | // 3. Logo 42 | char rt_str[30]; 43 | vt_draw_str_at(14, 40, " \\ | /"); 44 | vt_draw_str_at(15, 40, "- RT - Thread Operating System\n"); 45 | rt_sprintf(rt_str, " / | \\ %ld.%ld.%ld build %s\n", RT_VERSION, RT_SUBVERSION, RT_REVISION, __DATE__); 46 | vt_draw_str_at(16, 40, rt_str); 47 | vt_draw_str_at(17, 40, " 2006 - 2019 Copyright by rt-thread team\n"); 48 | 49 | // 4. Fill box 50 | for (int i = 0; i < 6; i++) 51 | { 52 | vt_set_bg_color((vt_back_color)(VT_B_RED + i)); 53 | vt_fill_box(9, 43 + i * 6, 4, 4, ' '); 54 | } 55 | 56 | for (int i = 5; i >= 0; i--) 57 | { 58 | vt_set_bg_color((vt_back_color)(VT_B_WHITE - i)); 59 | vt_fill_box(19, 43 + i * 6, 4, 4, ' '); 60 | } 61 | 62 | vt_set_bg_color(VT_B_BLACK); 63 | vt_move_to(23, 0); 64 | rt_kprintf("\n"); 65 | 66 | vt_clear_attr(); 67 | vt_show_cursor(); 68 | 69 | } 70 | MSH_CMD_EXPORT(vt_color, vt color demo) 71 | -------------------------------------------------------------------------------- /examples/vt_imshow.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "minions.h" 4 | 5 | static void vt_imshow(int argc, char* arvg[]) 6 | { 7 | vt_draw_rgb888_cwh(minions, minions_h, minions_w); 8 | } 9 | MSH_CMD_EXPORT(vt_imshow, draw RGB image in console) 10 | -------------------------------------------------------------------------------- /examples/vt_lsimg.c: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------*/ 2 | /* TJpgDec Quick Evaluation Program for PCs */ 3 | /*------------------------------------------------*/ 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | /* User defined device identifier */ 11 | typedef struct { 12 | FILE *fp; /* File pointer for input function */ 13 | rt_uint8_t *fbuf; /* Pointer to the frame buffer for output function */ 14 | rt_uint16_t wfbuf; /* Width of the frame buffer [pix] */ 15 | }IODEV; 16 | 17 | 18 | /*------------------------------*/ 19 | /* User defined input funciton */ 20 | /*------------------------------*/ 21 | 22 | static unsigned int vt_in_func (JDEC* jd, rt_uint8_t* buff, unsigned int nbyte) 23 | { 24 | IODEV *dev = (IODEV*)jd->device; /* Device identifier for the session (5th argument of jd_prepare function) */ 25 | 26 | 27 | if (buff) { 28 | /* Read bytes from input stream */ 29 | return (rt_uint16_t)fread(buff, 1, nbyte, dev->fp); 30 | } else { 31 | /* Remove bytes from input stream */ 32 | return fseek(dev->fp, nbyte, SEEK_CUR) ? 0 : nbyte; 33 | } 34 | } 35 | 36 | 37 | /*------------------------------*/ 38 | /* User defined output funciton */ 39 | /*------------------------------*/ 40 | 41 | static int vt_out_func (JDEC* jd, void* bitmap, JRECT* rect) 42 | { 43 | IODEV *dev = (IODEV*)jd->device; 44 | rt_uint8_t *src, *dst; 45 | rt_uint16_t y, bws, bwd; 46 | 47 | 48 | /* Put progress indicator */ 49 | if (rect->left == 0) { 50 | rt_kprintf("\r%lu%%\n", (rect->top << jd->scale) * 100UL / jd->height); 51 | } 52 | 53 | /* Copy the decompressed RGB rectanglar to the frame buffer (assuming RGB888 cfg) */ 54 | src = (rt_uint8_t*)bitmap; 55 | dst = dev->fbuf + 3 * (rect->top * dev->wfbuf + rect->left); /* Left-top of destination rectangular */ 56 | bws = 3 * (rect->right - rect->left + 1); /* Width of source rectangular [byte] */ 57 | bwd = 3 * dev->wfbuf; /* Width of frame buffer [byte] */ 58 | for (y = rect->top; y <= rect->bottom; y++) { 59 | rt_memcpy(dst, src, bws); /* Copy a line */ 60 | src += bws; dst += bwd; /* Next line */ 61 | } 62 | 63 | return 1; /* Continue to decompress */ 64 | } 65 | 66 | 67 | /*------------------------------*/ 68 | /* Program Jpeg_Dec */ 69 | /*------------------------------*/ 70 | 71 | int lsimg (int argc, char* argv[]) 72 | { 73 | void *work; /* Pointer to the decompressor work area */ 74 | JDEC jdec; /* Decompression object */ 75 | JRESULT res; /* Result code of TJpgDec API */ 76 | IODEV devid; /* User defined device identifier */ 77 | 78 | /* Open a JPEG file */ 79 | if (argc < 2) return -1; 80 | devid.fp = fopen(argv[1], "rb"); 81 | if (!devid.fp) return -1; 82 | 83 | /* Allocate a work area for TJpgDec */ 84 | work = rt_malloc(3100); 85 | 86 | /* Prepare to decompress */ 87 | res = jd_prepare(&jdec, vt_in_func, work, 3100, &devid); 88 | if (res == JDR_OK) { 89 | /* Ready to dcompress. Image info is available here. */ 90 | rt_kprintf("Image dimensions: %u by %u. %u bytes used.\n", jdec.width, jdec.height, 3100 - jdec.sz_pool); 91 | 92 | devid.fbuf = rt_malloc(3 * jdec.width * jdec.height); /* Frame buffer for output image (assuming RGB888 cfg) */ 93 | devid.wfbuf = jdec.width; 94 | 95 | res = jd_decomp(&jdec, vt_out_func, 0); /* Start to decompress with 1/1 scaling */ 96 | if (res == JDR_OK) { 97 | /* Decompression succeeded. You have the decompressed image in the frame buffer here. */ 98 | } else { 99 | rt_kprintf("Failed to decompress: rc=%d\n", res); 100 | } 101 | vt_draw_rgb888_whc(devid.fbuf, jdec.height, jdec.width); 102 | rt_free(devid.fbuf); /* Discard frame buffer */ 103 | 104 | } else { 105 | rt_kprintf("Failed to prepare: rc=%d\n", res); 106 | } 107 | 108 | rt_free(work); /* Discard work area */ 109 | 110 | fclose(devid.fp); /* Close the JPEG file */ 111 | 112 | return res; 113 | } 114 | MSH_CMD_EXPORT(lsimg, ls images in msh); 115 | -------------------------------------------------------------------------------- /examples/vt_monitor.c: -------------------------------------------------------------------------------- 1 | /* 2 | * @Description: RT-Thread monitor 3 | * @Author: Wu Han 4 | * @Date: 2019-08-24 20:16:50 5 | * @LastEditTime: 2019-08-24 20:36:32 6 | * @LastEditors: Please set LastEditors 7 | */ 8 | 9 | #include 10 | #include 11 | #include 12 | #include "vt100.h" 13 | 14 | #define LIST_FIND_OBJ_NR 8 15 | 16 | typedef struct 17 | { 18 | rt_list_t *list; 19 | rt_list_t **array; 20 | rt_uint8_t type; 21 | int nr; /* input: max nr, can't be 0 */ 22 | int nr_out; /* out: got nr */ 23 | } list_get_next_t; 24 | 25 | rt_inline void object_split(int len) 26 | { 27 | rt_kprintf("| "); 28 | while (len--) rt_kprintf("-"); 29 | } 30 | 31 | static void list_find_init(list_get_next_t *p, rt_uint8_t type, rt_list_t **array, int nr) 32 | { 33 | struct rt_object_information *info; 34 | rt_list_t *list; 35 | 36 | info = rt_object_get_information((enum rt_object_class_type)type); 37 | list = &info->object_list; 38 | 39 | p->list = list; 40 | p->type = type; 41 | p->array = array; 42 | p->nr = nr; 43 | p->nr_out = 0; 44 | } 45 | 46 | static rt_list_t *list_get_next(rt_list_t *current, list_get_next_t *arg) 47 | { 48 | int first_flag = 0; 49 | rt_ubase_t level; 50 | rt_list_t *node, *list; 51 | rt_list_t **array; 52 | int nr; 53 | 54 | arg->nr_out = 0; 55 | 56 | if (!arg->nr || !arg->type) 57 | { 58 | return (rt_list_t *)RT_NULL; 59 | } 60 | 61 | list = arg->list; 62 | 63 | if (!current) /* find first */ 64 | { 65 | node = list; 66 | first_flag = 1; 67 | } 68 | else 69 | { 70 | node = current; 71 | } 72 | 73 | level = rt_hw_interrupt_disable(); 74 | 75 | if (!first_flag) 76 | { 77 | struct rt_object *obj; 78 | /* The node in the list? */ 79 | obj = rt_list_entry(node, struct rt_object, list); 80 | if ((obj->type & ~RT_Object_Class_Static) != arg->type) 81 | { 82 | rt_hw_interrupt_enable(level); 83 | return (rt_list_t *)RT_NULL; 84 | } 85 | } 86 | 87 | nr = 0; 88 | array = arg->array; 89 | while (1) 90 | { 91 | node = node->next; 92 | 93 | if (node == list) 94 | { 95 | node = (rt_list_t *)RT_NULL; 96 | break; 97 | } 98 | nr++; 99 | *array++ = node; 100 | if (nr == arg->nr) 101 | { 102 | break; 103 | } 104 | } 105 | 106 | rt_hw_interrupt_enable(level); 107 | arg->nr_out = nr; 108 | return node; 109 | } 110 | 111 | 112 | static void vt_list_thread(void) 113 | { 114 | rt_ubase_t level; 115 | list_get_next_t find_arg; 116 | rt_list_t *obj_list[LIST_FIND_OBJ_NR]; 117 | rt_list_t *next = (rt_list_t*)RT_NULL; 118 | const char *item_title = "thread"; 119 | int maxlen; 120 | 121 | list_find_init(&find_arg, RT_Object_Class_Thread, obj_list, sizeof(obj_list)/sizeof(obj_list[0])); 122 | 123 | maxlen = RT_NAME_MAX; 124 | 125 | #ifdef RT_USING_SMP 126 | rt_kprintf("%-*.s cpu pri status sp stack size max used left tick error\n", maxlen, item_title); 127 | object_split(maxlen); 128 | rt_kprintf( "--- --- ------- ---------- ---------- ------ ---------- ---\n"); 129 | #else 130 | rt_kprintf(" %-*.s pri status sp stack size max used left tick error\n", maxlen, item_title); 131 | object_split(maxlen); 132 | rt_kprintf( "---- ------- ---------- ---------- ------ ---------- ---\n"); 133 | #endif /*RT_USING_SMP*/ 134 | 135 | do 136 | { 137 | next = list_get_next(next, &find_arg); 138 | { 139 | int i; 140 | for (i = 0; i < find_arg.nr_out; i++) 141 | { 142 | struct rt_object *obj; 143 | struct rt_thread thread_info, *thread; 144 | 145 | obj = rt_list_entry(obj_list[i], struct rt_object, list); 146 | level = rt_hw_interrupt_disable(); 147 | 148 | if ((obj->type & ~RT_Object_Class_Static) != find_arg.type) 149 | { 150 | rt_hw_interrupt_enable(level); 151 | continue; 152 | } 153 | /* copy info */ 154 | rt_memcpy(&thread_info, obj, sizeof thread_info); 155 | rt_hw_interrupt_enable(level); 156 | 157 | thread = (struct rt_thread*)obj; 158 | { 159 | rt_uint8_t stat; 160 | rt_uint8_t *ptr; 161 | 162 | #ifdef RT_USING_SMP 163 | if (thread->oncpu != RT_CPU_DETACHED) 164 | rt_kprintf("| %-*.*s %3d %3d ", maxlen, RT_NAME_MAX, thread->name, thread->oncpu, thread->current_priority); 165 | else 166 | rt_kprintf("| %-*.*s N/A %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority); 167 | 168 | #else 169 | rt_kprintf("| %-*.*s %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority); 170 | #endif /*RT_USING_SMP*/ 171 | stat = (thread->stat & RT_THREAD_STAT_MASK); 172 | if (stat == RT_THREAD_READY) rt_kprintf(" ready "); 173 | else if (stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend"); 174 | else if (stat == RT_THREAD_INIT) rt_kprintf(" init "); 175 | else if (stat == RT_THREAD_CLOSE) rt_kprintf(" close "); 176 | else if (stat == RT_THREAD_RUNNING) rt_kprintf(" running"); 177 | 178 | #if defined(ARCH_CPU_STACK_GROWS_UPWARD) 179 | ptr = (rt_uint8_t *)thread->stack_addr + thread->stack_size - 1; 180 | while (*ptr == '#')ptr --; 181 | 182 | rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n", 183 | ((rt_ubase_t)thread->sp - (rt_ubase_t)thread->stack_addr), 184 | thread->stack_size, 185 | ((rt_ubase_t)ptr - (rt_ubase_t)thread->stack_addr) * 100 / thread->stack_size, 186 | thread->remaining_tick, 187 | thread->error); 188 | #else 189 | ptr = (rt_uint8_t *)thread->stack_addr; 190 | while (*ptr == '#')ptr ++; 191 | 192 | rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n", 193 | thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp), 194 | thread->stack_size, 195 | (thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 196 | / thread->stack_size, 197 | thread->remaining_tick, 198 | thread->error); 199 | #endif 200 | } 201 | } 202 | } 203 | } 204 | while (next != (rt_list_t*)RT_NULL); 205 | } 206 | 207 | static void vt_monitor(int argc, char* argv[]) 208 | { 209 | // Monitor Time 210 | int time = 10; 211 | char rt_str[30]; 212 | 213 | if(argc > 1) 214 | { 215 | time = atoi(argv[1]); 216 | if(time < 0){ 217 | time = 10; 218 | } 219 | } 220 | 221 | vt_store_screen(); 222 | vt_clearall(); 223 | 224 | vt_set_terminal_default_size(); 225 | 226 | vt_hide_cursor(); 227 | 228 | // Monitor Frame 229 | vt_set_font_color(VT_F_WHITE); 230 | vt_set_bg_color(VT_B_BLACK); 231 | vt_draw_box(0, 0, 23, 80, '-', '|', '+'); 232 | 233 | vt_set_font_color(VT_F_WHITE); 234 | vt_set_bg_color(VT_B_BLACK); 235 | vt_fill_box(1, 1, 21, 78, ' '); 236 | 237 | vt_draw_str_at(2, 23, " \\ | /"); 238 | vt_draw_str_at(3, 23, "- RT - Thread Operating System\n"); 239 | rt_sprintf(rt_str, " / | \\ %ld.%ld.%ld build %s\n", RT_VERSION, RT_SUBVERSION, RT_REVISION, __DATE__); 240 | vt_draw_str_at(4, 23, rt_str); 241 | vt_draw_str_at(5, 23, " 2006 - 2019 Copyright by rt-thread team\n"); 242 | 243 | // Thread Monitor Logo 244 | vt_set_font_color(VT_F_BLACK); 245 | vt_set_bg_color(VT_B_GREEN); 246 | vt_draw_hline(7, 1, 78, ' '); 247 | vt_draw_str_at(7, 33, "Thread Monitor"); 248 | 249 | // Update 250 | for(rt_uint8_t i = time; i > 0; i--) 251 | { 252 | char msg[30]; 253 | vt_move_to(8, 1); 254 | vt_set_font_color(VT_F_WHITE); 255 | vt_set_bg_color(VT_B_BLACK); 256 | vt_list_thread(); 257 | 258 | vt_draw_hline(23, 0, 80, ' '); 259 | rt_sprintf(msg, "Exit in %d seconds", i); 260 | vt_draw_str_at(23, 0, msg); 261 | 262 | rt_thread_mdelay(1000); 263 | } 264 | 265 | vt_set_font_color(VT_F_WHITE); 266 | vt_set_bg_color(VT_B_BLACK); 267 | vt_move_to(23, 0); 268 | rt_kprintf("\n"); 269 | 270 | vt_clear_attr(); 271 | vt_restore_screen(); 272 | vt_show_cursor(); 273 | 274 | } 275 | MSH_CMD_EXPORT(vt_monitor, vt thread monitor) 276 | -------------------------------------------------------------------------------- /src/vt100.c: -------------------------------------------------------------------------------- 1 | /* 2 | * @Description: VT100 drawing library 3 | * @Author: Wu Han 4 | * @Date: 2019-08-24 20:16:50 5 | * @LastEditTime: 2019-08-24 20:35:52 6 | * @LastEditors: Please set LastEditors 7 | */ 8 | 9 | #include 10 | #include "vt100.h" 11 | 12 | /** 13 | * @description: Clear screen 14 | * @param void 15 | * @return: void 16 | */ 17 | void vt_clear(void) 18 | { 19 | rt_kprintf("\033[2J"); 20 | } 21 | 22 | /** 23 | * @description: Delete all lines saved in the scrollback buffer 24 | * @param void 25 | * @return: void 26 | */ 27 | void vt_clear_scrollback(void) 28 | { 29 | rt_kprintf("\033[3J"); 30 | } 31 | 32 | /** 33 | * @description: Clear line after cursor. 34 | * @param void 35 | * @return: void 36 | */ 37 | void vt_clear_line(void) 38 | { 39 | rt_kprintf("\033[K"); 40 | } 41 | 42 | /** 43 | * @description: Clear screen & delete all lines saved in the scrollback buffer & move cursor to (0,0) 44 | * @param void 45 | * @return: void 46 | */ 47 | void vt_clearall(void) 48 | { 49 | vt_clear(); 50 | vt_clear_scrollback(); 51 | vt_move_to(0,0); 52 | } 53 | 54 | /** 55 | * @description: Clear attributes such as colors 56 | * @param void 57 | * @return: void 58 | */ 59 | void vt_clear_attr(void) 60 | { 61 | rt_kprintf("\033[0m"); 62 | } 63 | 64 | /** 65 | * @description: Move cursor up 66 | * @param step Number of steps to move up 67 | * @return: void 68 | */ 69 | void vt_move_up(rt_uint16_t step) 70 | { 71 | rt_kprintf("\033[%dA", step); 72 | } 73 | 74 | /** 75 | * @description: Move cursor down 76 | * @param step Number of steps to move down 77 | * @return: void 78 | */ 79 | void vt_move_down(rt_uint16_t step) 80 | { 81 | rt_kprintf("\033[%dB", step); 82 | } 83 | 84 | /** 85 | * @description: Move cursor right 86 | * @param step Number of steps to move right 87 | * @return: void 88 | */ 89 | void vt_move_right(rt_uint16_t step) 90 | { 91 | rt_kprintf("\033[%dC", step); 92 | } 93 | 94 | /** 95 | * @description: Move cursor left 96 | * @param step Number of steps to move left 97 | * @return: void 98 | */ 99 | void vt_move_left(rt_uint16_t step) 100 | { 101 | rt_kprintf("\033[%dD", step); 102 | } 103 | 104 | /** 105 | * @description: Move cursor to (row, column) 106 | * @param row destination row number, starting from 0 107 | * @param col destination column number, starting from 0 108 | * @return: void 109 | */ 110 | void vt_move_to(rt_uint16_t row, rt_uint16_t col) 111 | { 112 | rt_kprintf("\033[%d;%dH", row + 1, col + 1); 113 | } 114 | 115 | /** 116 | * @description: Hide cursor 117 | * @param void 118 | * @return: void 119 | */ 120 | void vt_hide_cursor(void) 121 | { 122 | rt_kprintf("\033[?25l"); 123 | } 124 | 125 | /** 126 | * @description: Show cursor 127 | * @param void 128 | * @return: void 129 | */ 130 | void vt_show_cursor(void) 131 | { 132 | rt_kprintf("\033[?25h"); 133 | } 134 | 135 | /** 136 | * @description: Save cursor 137 | * @param void 138 | * @return: void 139 | */ 140 | void vt_store_cursor(void) 141 | { 142 | rt_kprintf("\033[s"); 143 | } 144 | 145 | /** 146 | * @description: Load cursor 147 | * @param void 148 | * @return: void 149 | */ 150 | void vt_restore_cursor(void) 151 | { 152 | rt_kprintf("\033[u"); 153 | } 154 | 155 | /** 156 | * @description: Save cursor, use alternate screen buffer, clear screen 157 | * You can use vt_restore_screen() to restore the screen 158 | * @param void 159 | * @return: void 160 | */ 161 | void vt_store_screen(void) 162 | { 163 | rt_kprintf("\033[?1049h"); 164 | } 165 | 166 | /** 167 | * @description: Use normal screen buffer, restore cursor 168 | * @param void 169 | * @return: void 170 | */ 171 | void vt_restore_screen(void) 172 | { 173 | rt_kprintf("\033[?1049l"); 174 | } 175 | 176 | /** 177 | * @description: Set the terminal size of the terminal 178 | * @param row (unit: size of ONE character) 179 | * @param col (unit: size of ONE character) 180 | * @return: void 181 | */ 182 | void vt_set_terminal_size(rt_uint16_t row, rt_uint16_t col) 183 | { 184 | rt_kprintf("\x1b[8;%d;%dt", row, col); 185 | } 186 | 187 | /** 188 | * @description: Set the terminal size as default size (24x80) 189 | * @param: void 190 | * @return: void 191 | */ 192 | void vt_set_terminal_default_size(void) 193 | { 194 | vt_set_terminal_size(VT_DEFAULT_ROW_SIZE, VT_DEFAULT_COL_SIZE); 195 | } 196 | 197 | /** 198 | * @description: Set the terminal position on the screen 199 | * @param col_px (unit: pixel on screen) 200 | * @param row_px (unit: pixel on screen) 201 | * @return: void 202 | */ 203 | void vt_set_terminal_position(rt_uint16_t row_px, rt_uint16_t col_px) 204 | { 205 | rt_kprintf("\033[3;%d;%dt", row_px, col_px); 206 | } 207 | 208 | #if RT_VER_NUM >= 0x40004 209 | #include 210 | #include 211 | extern char finsh_getchar(void); 212 | 213 | /** 214 | * @description: Get the terminal size of the terminal 215 | * @param pointers to row & col (unit: size of ONE character) 216 | * @return: void 217 | */ 218 | void vt_get_terminal_size(rt_uint16_t *row, rt_uint16_t *col) 219 | { 220 | #define VT_TIO_BUFLEN 20 221 | char vt_tio_buf[VT_TIO_BUFLEN]; 222 | unsigned char cnt1, cnt2, cnt3, i; 223 | char row_s[4], col_s[4]; 224 | char *p; 225 | 226 | if(rt_thread_self() != rt_thread_find("tshell")) 227 | { 228 | *col = 0; 229 | *row = 0; 230 | return; 231 | } 232 | 233 | rt_memset(vt_tio_buf, 0, VT_TIO_BUFLEN); 234 | 235 | /* send the command to terminal for getting the window size of the terminal */ 236 | rt_kprintf("\033[18t"); 237 | 238 | /* waiting for the response from the terminal */ 239 | i = 0; 240 | while(i < VT_TIO_BUFLEN) 241 | { 242 | vt_tio_buf[i] = finsh_getchar(); 243 | if(vt_tio_buf[i] != 't') 244 | { 245 | i ++; 246 | } 247 | else 248 | { 249 | break; 250 | } 251 | } 252 | 253 | /* interpreting data eg: "\033[8;1;15t" which means row is 1 and col is 15 (unit: size of ONE character)*/ 254 | rt_memset(row_s,0,4); 255 | rt_memset(col_s,0,4); 256 | cnt1 = 0; 257 | while(vt_tio_buf[cnt1] != ';' && cnt1 < VT_TIO_BUFLEN) 258 | { 259 | cnt1++; 260 | } 261 | cnt2 = ++cnt1; 262 | while(vt_tio_buf[cnt2] != ';' && cnt2 < VT_TIO_BUFLEN) 263 | { 264 | cnt2++; 265 | } 266 | p = row_s; 267 | while(cnt1 < cnt2) 268 | { 269 | *p++ = vt_tio_buf[cnt1++]; 270 | } 271 | p = col_s; 272 | cnt2++; 273 | cnt3 = rt_strlen(vt_tio_buf) - 1; 274 | while(cnt2 < cnt3) 275 | { 276 | *p++ = vt_tio_buf[cnt2++]; 277 | } 278 | 279 | /* load the window size date, started from 0 */ 280 | *col = atoi(col_s) - 1; 281 | *row = atoi(row_s) - 1; 282 | #undef VT_TIO_BUFLEN 283 | } 284 | #endif /* RT_VER_NUM >= 0x40004 */ 285 | 286 | /** 287 | * @description: Maximize the window of terminal 288 | * @param void 289 | * @return: void 290 | */ 291 | void vt_maximize_terminal(void) 292 | { 293 | rt_kprintf("\033[9;1t"); 294 | } 295 | 296 | /** 297 | * @description: Restore the window size of terminal before maximization. 298 | * @param void 299 | * @return: void 300 | */ 301 | void vt_unmaximize_terminal(void) 302 | { 303 | rt_kprintf("\033[9;0t"); 304 | } 305 | 306 | /** 307 | * @description: Set font color 308 | * @param color font color 309 | * @return: void 310 | */ 311 | void vt_set_font_color(vt_fore_color color) 312 | { 313 | rt_kprintf("\033[%dm", color); 314 | } 315 | 316 | /** 317 | * @description: Set background color 318 | * @param color background color 319 | * @return: void 320 | */ 321 | void vt_set_bg_color(vt_back_color color) 322 | { 323 | rt_kprintf("\033[%dm", color); 324 | } 325 | 326 | /** 327 | * @description: Draw a single character at current position 328 | * @param ch character to draw 329 | * @return: void 330 | */ 331 | void vt_draw_char(char ch) 332 | { 333 | rt_kprintf("%c", ch); 334 | } 335 | 336 | /** 337 | * @description: Draw a string at current position 338 | * @param str string to draw 339 | * @return: 340 | */ 341 | void vt_draw_str(char* str) 342 | { 343 | rt_kprintf("%s", str); 344 | } 345 | 346 | /** 347 | * @description: Draw a single character at (row, col) 348 | * @param row 349 | * @param col 350 | * @param ch 351 | * @return: void 352 | */ 353 | void vt_draw_char_at(rt_uint16_t row, rt_uint16_t col, char ch) 354 | { 355 | vt_move_to(row, col); 356 | rt_kprintf("%c", ch); 357 | } 358 | 359 | /** 360 | * @description: Draw a string at (row, col), auto linefeed. 361 | * @param row 362 | * @param col 363 | * @param str 364 | * @return: void 365 | */ 366 | void vt_draw_str_at(rt_uint16_t row, rt_uint16_t col, char* str) 367 | { 368 | vt_move_to(row, col); 369 | rt_kprintf("%s", str); 370 | } 371 | 372 | /** 373 | * @description: Draw a horizontal line beginning at (row, col) with length of (len) 374 | * @param row 375 | * @param col 376 | * @param len 377 | * @param ch 378 | * @return: void 379 | */ 380 | void vt_draw_hline(rt_uint16_t row, rt_uint16_t col, rt_uint16_t len, char ch) 381 | { 382 | rt_uint16_t i; 383 | 384 | vt_move_to(row, col); 385 | for(i = col; i < (col + len); i++){ 386 | vt_draw_char(ch); 387 | } 388 | } 389 | 390 | /** 391 | * @description: Draw a vertical line beginning at (row, col) with length of (len) 392 | * @param row 393 | * @param col 394 | * @param len 395 | * @param ch 396 | * @return: void 397 | */ 398 | void vt_draw_vline(rt_uint16_t row, rt_uint16_t col, rt_uint16_t len, char ch) 399 | { 400 | rt_uint16_t i; 401 | for(i = row; i < (row + len); i++){ 402 | vt_draw_char_at(i, col, ch); 403 | } 404 | } 405 | 406 | /** 407 | * @description: Fill a box with upper left corner at (row, col) with n_rows and n_cols 408 | * @param s_row 409 | * @param s_col 410 | * @param n_row 411 | * @param n_cols 412 | * @param s_row 413 | * @return: void 414 | */ 415 | void vt_fill_box(rt_uint16_t s_row, rt_uint16_t s_col, rt_uint16_t n_rows, rt_uint16_t n_cols, char ch) 416 | { 417 | rt_uint16_t row = 0; 418 | rt_uint16_t col = 0; 419 | for (row = s_row; row < (s_row + n_rows); row++){ 420 | vt_move_to(row, s_col); 421 | for (col = s_col; col < (s_col + n_cols); col++){ 422 | vt_draw_char(ch); 423 | } 424 | } 425 | } 426 | 427 | /** 428 | * @description: Draw a framed box with upper left corner at (row, col) with n_rows and n_cols 429 | * @param s_row starting row 430 | * @param s_col starting col 431 | * @param n_rows height 432 | * @param n_cols width 433 | * @param h_fill horizontal border 434 | * @param v_fill vertical border 435 | * @param c_fill corner character 436 | * @return: void 437 | */ 438 | void vt_draw_box(rt_uint16_t s_row, rt_uint16_t s_col, rt_uint16_t n_rows, rt_uint16_t n_cols, char h_fill, char v_fill, char c_fill) 439 | { 440 | vt_draw_hline(s_row, s_col, n_cols, h_fill); 441 | vt_draw_hline(s_row + n_rows - 1, s_col, n_cols, h_fill); 442 | vt_draw_vline(s_row, s_col, n_rows, v_fill); 443 | vt_draw_vline(s_row, s_col + n_cols - 1, n_rows, v_fill); 444 | 445 | vt_draw_char_at(s_row, s_col, c_fill); 446 | vt_draw_char_at(s_row, s_col + n_cols - 1, c_fill); 447 | vt_draw_char_at(s_row + n_rows - 1, s_col, c_fill); 448 | vt_draw_char_at(s_row + n_rows - 1, s_col + n_cols - 1, c_fill); 449 | } 450 | 451 | /** 452 | * @description: Draw a bitmap with n_rows and n_cols (bytes) 453 | * @param s_row starting row 454 | * @param s_col starting column 455 | * @param n_rows height 456 | * @param n_cols width 457 | * @param bitmap 458 | * @param color_on display background 459 | * @param color off non-display background 460 | * @return: void 461 | */ 462 | void vt_draw_bitmap(rt_uint16_t s_row, rt_uint16_t s_col, rt_uint16_t n_rows, rt_uint16_t n_cols, const rt_uint8_t* bitmap, 463 | vt_back_color color_on, vt_back_color color_off) 464 | { 465 | rt_uint16_t row = 0; 466 | rt_uint16_t col = 0; 467 | for (row = s_row; row < (s_row + n_rows); row++) 468 | { 469 | vt_move_to(row, s_col); 470 | for (col = 0; col < (n_cols * 8); col++) 471 | { 472 | if((bitmap[row] & (1 << col))) 473 | { 474 | vt_set_bg_color(color_on); 475 | } 476 | else 477 | { 478 | vt_set_bg_color(color_off); 479 | } 480 | vt_draw_char(' '); 481 | } 482 | } 483 | } 484 | 485 | void vt_draw_rgb888_cwh(rt_uint8_t* buffer, rt_uint16_t n_rows, rt_uint16_t n_cols) 486 | { 487 | rt_uint16_t row = 0; 488 | rt_uint16_t col = 0; 489 | for (row = 0; row < n_rows; row++) 490 | { 491 | for (col = 0; col < n_cols; col++) 492 | { 493 | rt_uint8_t r = buffer[row * n_cols + col]; 494 | rt_uint8_t g = buffer[n_rows * n_cols + row * n_cols + col]; 495 | rt_uint8_t b = buffer[n_rows * n_cols * 2 + row * n_cols + col]; 496 | rt_kprintf("\x1b[48;2;%d;%d;%dm\x1b[38;2;%d;%d;%dm◾\x1b[39m\x1b[49m", r, g, b, r, g, b); 497 | } 498 | rt_kprintf("\n"); 499 | } 500 | } 501 | 502 | void vt_draw_rgb888_whc(rt_uint8_t* buffer, rt_uint16_t n_rows, rt_uint16_t n_cols) 503 | { 504 | rt_uint16_t row = 0; 505 | rt_uint16_t col = 0; 506 | for (row = 0; row < n_rows; row++) 507 | { 508 | for (col = 0; col < n_cols; col++) 509 | { 510 | rt_uint8_t r = buffer[row * n_cols * 3 + col * 3]; 511 | rt_uint8_t g = buffer[row * n_cols * 3 + col * 3 + 1]; 512 | rt_uint8_t b = buffer[row * n_cols * 3 + col * 3 + 2]; 513 | rt_kprintf("\x1b[48;2;%d;%d;%dm\x1b[38;2;%d;%d;%dm◾\x1b[39m\x1b[49m", r, g, b, r, g, b); 514 | } 515 | rt_kprintf("\n"); 516 | } 517 | } 518 | -------------------------------------------------------------------------------- /src/vt100.h: -------------------------------------------------------------------------------- 1 | /* 2 | * @Description: VT100 drawing library 3 | * @Author: Wu Han 4 | * @Date: 2019-08-24 20:16:50 5 | * @LastEditTime: 2019-08-24 21:04:40 6 | * @LastEditors: Please set LastEditors 7 | */ 8 | 9 | #ifndef __VT100_H__ 10 | #define __VT100_H__ 11 | 12 | #include 13 | 14 | // http://ascii-table.com/ansi-escape-sequences.php 15 | /* VT100 */ 16 | /* cols */ 17 | /* +----------------------------+ */ 18 | /* r |(0, 0) (0, 79) | */ 19 | /* o | | */ 20 | /* w | | */ 21 | /* s |(23, 0) (23, 79)| */ 22 | /* +----------------------------+ */ 23 | /* */ 24 | 25 | #define VT_DEFAULT_ROW_SIZE 24 26 | #define VT_DEFAULT_COL_SIZE 80 27 | 28 | /* foreground Color */ 29 | typedef enum 30 | { 31 | VT_F_BLACK = 30, 32 | VT_F_RED = 31, 33 | VT_F_GREEN = 32, 34 | VT_F_YELLOW = 33, 35 | VT_F_BLUE = 34, 36 | VT_F_PURPLE = 35, 37 | VT_F_CYAN = 36, 38 | VT_F_WHITE = 37 39 | }vt_fore_color; 40 | 41 | /* background Color */ 42 | typedef enum 43 | { 44 | VT_B_BLACK = 40, 45 | VT_B_RED = 41, 46 | VT_B_GREEN = 42, 47 | VT_B_YELLOW = 43, 48 | VT_B_BLUE = 44, 49 | VT_B_PURPLE = 45, 50 | VT_B_CYAN = 46, 51 | VT_B_WHITE = 47 52 | }vt_back_color; 53 | 54 | /* clear */ 55 | void vt_clear(void); 56 | void vt_clear_scrollback(void); 57 | void vt_clear_line(void); 58 | void vt_clearall(void); 59 | 60 | /* attribute */ 61 | void vt_clear_attr(void); 62 | 63 | /* cursor */ 64 | void vt_restore_cursor(void); 65 | void vt_store_cursor(void); 66 | void vt_hide_cursor(void); 67 | void vt_show_cursor(void); 68 | void vt_move_up(rt_uint16_t step); 69 | void vt_move_down(rt_uint16_t step); 70 | void vt_move_right(rt_uint16_t step); 71 | void vt_move_left(rt_uint16_t step); 72 | void vt_move_to(rt_uint16_t row, rt_uint16_t col); 73 | 74 | /* terminal screen */ 75 | void vt_store_screen(void); 76 | void vt_restore_screen(void); 77 | void vt_set_terminal_size(rt_uint16_t row, rt_uint16_t col); 78 | void vt_set_terminal_default_size(void); 79 | void vt_set_terminal_position(rt_uint16_t row_px, rt_uint16_t col_px); 80 | #if RT_VER_NUM >= 0x40004 81 | void vt_get_terminal_size(rt_uint16_t *row, rt_uint16_t *col); 82 | #endif /* RT_VER_NUM >= 0x40004 */ 83 | void vt_maximize_terminal(void); 84 | void vt_unmaximize_terminal(void); 85 | 86 | /* drawing */ 87 | void vt_set_font_color(vt_fore_color color); 88 | void vt_set_bg_color(vt_back_color color); 89 | 90 | void vt_draw_char(char ch); 91 | void vt_draw_char_at(rt_uint16_t row, rt_uint16_t col, char ch); 92 | void vt_draw_str(char* str); 93 | void vt_draw_str_at(rt_uint16_t row, rt_uint16_t col, char* str); 94 | 95 | void vt_draw_hline(rt_uint16_t row, rt_uint16_t col, rt_uint16_t len, char ch); 96 | void vt_draw_vline(rt_uint16_t row, rt_uint16_t col, rt_uint16_t len, char ch); 97 | 98 | void vt_fill_box(rt_uint16_t s_row, rt_uint16_t s_col, rt_uint16_t n_rows, rt_uint16_t n_cols, char ch); 99 | void vt_draw_box(rt_uint16_t s_row, rt_uint16_t s_col, rt_uint16_t n_rows, rt_uint16_t n_cols, char h_fill, char v_fill, char c_fill); 100 | 101 | void vt_draw_bitmap(rt_uint16_t s_row, rt_uint16_t s_col, rt_uint16_t n_rows, rt_uint16_t n_cols, const rt_uint8_t* bitmap, 102 | vt_back_color color_on, vt_back_color color_off); 103 | 104 | /* channel width height */ 105 | void vt_draw_rgb888_cwh(rt_uint8_t* buffer, rt_uint16_t n_rows, rt_uint16_t n_cols); 106 | 107 | /* width height channel */ 108 | void vt_draw_rgb888_whc(rt_uint8_t* buffer, rt_uint16_t n_rows, rt_uint16_t n_cols); 109 | 110 | #endif /*__VT100_H__*/ 111 | --------------------------------------------------------------------------------