修改字库为圆体,现在支持更多节日了,增加24/12小时切换功能,美化设计WEBUI界面,单html文件支持,增加两个字库工具checkFont和PC2U2_sfont,运行checkFONT获得sfont当前的字库,使用py脚本可以将PC2LCD的字库文件转为项目支持的格式

This commit is contained in:
5Breeze
2025-07-29 23:08:38 +08:00
parent d7c96e9411
commit b503db77f1
8 changed files with 1705 additions and 813 deletions

View File

@@ -16,8 +16,8 @@
<TargetCommonOption>
<Device>ARMCM0</Device>
<Vendor>ARM</Vendor>
<PackID>ARM.CMSIS.5.6.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<PackID>ARM.Cortex_DFP.1.1.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IROM(0x0,0x0) IRAM(0x0,0x0) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@@ -185,6 +185,8 @@
<uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>0</StupSel>
@@ -351,7 +353,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -481,7 +483,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -580,7 +582,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -1319,7 +1321,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -1403,7 +1405,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -1548,8 +1550,8 @@
<TargetCommonOption>
<Device>ARMCM0</Device>
<Vendor>ARM</Vendor>
<PackID>ARM.CMSIS.5.6.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<PackID>ARM.Cortex_DFP.1.1.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IROM(0x0,0x0) IRAM(0x0,0x0) CPUTYPE("Cortex-M0") CLOCK(12000000) ESEL ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@@ -1717,6 +1719,8 @@
<uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>0</StupSel>
@@ -1883,7 +1887,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -2013,7 +2017,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -2112,7 +2116,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -2851,7 +2855,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -2935,7 +2939,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -3080,8 +3084,8 @@
<TargetCommonOption>
<Device>ARMCM0P</Device>
<Vendor>ARM</Vendor>
<PackID>ARM.CMSIS.5.6.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<PackID>ARM.Cortex_DFP.1.1.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ESEL ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@@ -3249,6 +3253,8 @@
<uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@@ -3415,7 +3421,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -3535,7 +3541,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -3644,7 +3650,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -4317,7 +4323,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -4416,7 +4422,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -4561,8 +4567,8 @@
<TargetCommonOption>
<Device>ARMCM0P</Device>
<Vendor>ARM</Vendor>
<PackID>ARM.CMSIS.5.6.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<PackID>ARM.Cortex_DFP.1.1.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ESEL ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@@ -4730,6 +4736,8 @@
<uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@@ -4896,7 +4904,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -5016,7 +5024,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -5125,7 +5133,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -5798,7 +5806,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -5897,7 +5905,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -6042,8 +6050,8 @@
<TargetCommonOption>
<Device>ARMCM0P</Device>
<Vendor>ARM</Vendor>
<PackID>ARM.CMSIS.5.6.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<PackID>ARM.Cortex_DFP.1.1.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IROM(0x00000000,0x00040000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ESEL ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@@ -6211,6 +6219,8 @@
<uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@@ -6377,7 +6387,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -6497,7 +6507,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -6596,7 +6606,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -7279,7 +7289,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@@ -7363,7 +7373,7 @@
<NoWarn>2</NoWarn>
<uSurpInc>2</uSurpInc>
<useXO>2</useXO>
<uClangAs>2</uClangAs>
<ClangAsOpt>0</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>

97
src/epd/PC2U2_sfont.py Normal file
View File

@@ -0,0 +1,97 @@
import re
import struct
# 读取 font.txt 中的全部内容
with open("font.txt", "r", encoding="gbk", errors="ignore") as f:
lines = f.readlines()
# 用于存储字体数据
font_chars = []
# 临时缓存 bitmap 和字符信息
current_bitmap = []
current_char = ""
width = height = 0
# 正则匹配
bitmap_line_re = re.compile(r'\{([0-9xA-Fa-f, ]+)\}')
char_comment_re = re.compile(r'/\*\s*"(.+?)",\s*(\d+)\s*\*/')
size_comment_re = re.compile(r'/\*\s*\(\s*(\d+)\s*X\s*(\d+)\s*,.*\*/')
for line in lines:
# 如果是bitmap行
bitmap_match = bitmap_line_re.search(line)
if bitmap_match:
hex_str = bitmap_match.group(1)
bytes_list = [int(x, 16) for x in hex_str.split(',')]
current_bitmap.extend(bytes_list)
# 如果是字符注释行
char_match = char_comment_re.search(line)
if char_match:
current_char = char_match.group(1)
# 如果是尺寸注释行
size_match = size_comment_re.search(line)
if size_match:
width = int(size_match.group(1))
height = int(size_match.group(2))
# 生成 FontChar 结构
ucs = ord(current_char)
ft_adv = width
ft_bw = width
ft_bh = height
ft_bx = 0
ft_by = 0
header = [ft_adv, ft_bw, ft_bh, ft_bx, ft_by]
font_chars.append({
"char": current_char,
"ucs": ucs,
"header": header,
"bitmap": current_bitmap.copy()
})
# 清空临时变量
current_bitmap.clear()
current_char = ""
width = height = 0
# 构造 sfont[] 数据
font_count = len(font_chars)
offset = 2 + font_count * 4 # 2 字节总数 + 每个字符 4 字节索引
index_entries = []
data_blocks = []
for fc in font_chars:
# UCS + 偏移
index_entries.append(struct.pack('<HH', fc["ucs"], offset))
# 头 + bitmap
header = bytes(fc["header"])
bitmap = bytes(fc["bitmap"])
data_block = header + bitmap
data_blocks.append(data_block)
offset += len(data_block)
# 最终构建 sfont 数组
sfont_data = struct.pack('<H', font_count) + b''.join(index_entries) + b''.join(data_blocks)
# 输出为C数组
def format_c_array(data, name="sfont"):
lines = [f'static unsigned char {name}[] __attribute__((aligned(4))) = {{']
for i in range(0, len(data), 12):
chunk = ','.join(f'0x{b:02X}' for b in data[i:i+12])
lines.append(f' {chunk},')
lines.append('};')
return '\n'.join(lines)
# 保存为sfont.h
with open("sfont.h", "w", encoding="utf-8") as f:
f.write("#ifndef __sfont__\n#define __sfont__\n\n")
f.write(f"#define sfont_size {len(sfont_data)}\n\n")
f.write(format_c_array(sfont_data))
f.write("\n\n#endif // __sfont__\n")

BIN
src/epd/checkFont.exe Normal file

Binary file not shown.

View File

@@ -1,314 +1,591 @@
#ifndef __sfont__
#define __sfont__
#define sfont_size 4893
#define sfont_size 6983
static unsigned char sfont[] __attribute__((aligned(4))) = {
0xbc, 0x00, 0x20, 0x00, 0xf2, 0x02, 0x21, 0x00, 0xf8, 0x02, 0x22, 0x00, 0x08, 0x03, 0x23, 0x00,
0x10, 0x03, 0x24, 0x00, 0x20, 0x03, 0x25, 0x00, 0x30, 0x03, 0x26, 0x00, 0x3e, 0x03, 0x27, 0x00,
0x4c, 0x03, 0x28, 0x00, 0x54, 0x03, 0x29, 0x00, 0x65, 0x03, 0x2a, 0x00, 0x76, 0x03, 0x2b, 0x00,
0x82, 0x03, 0x2c, 0x00, 0x8e, 0x03, 0x2d, 0x00, 0x97, 0x03, 0x2e, 0x00, 0x9d, 0x03, 0x2f, 0x00,
0xa4, 0x03, 0x30, 0x00, 0xb5, 0x03, 0x31, 0x00, 0xc3, 0x03, 0x32, 0x00, 0xd1, 0x03, 0x33, 0x00,
0xdf, 0x03, 0x34, 0x00, 0xed, 0x03, 0x35, 0x00, 0xfb, 0x03, 0x36, 0x00, 0x09, 0x04, 0x37, 0x00,
0x17, 0x04, 0x38, 0x00, 0x25, 0x04, 0x39, 0x00, 0x33, 0x04, 0x3a, 0x00, 0x41, 0x04, 0x3b, 0x00,
0x4d, 0x04, 0x3c, 0x00, 0x5b, 0x04, 0x3d, 0x00, 0x6b, 0x04, 0x3e, 0x00, 0x74, 0x04, 0x3f, 0x00,
0x84, 0x04, 0x40, 0x00, 0x93, 0x04, 0x41, 0x00, 0xac, 0x04, 0x42, 0x00, 0xba, 0x04, 0x43, 0x00,
0xc8, 0x04, 0x44, 0x00, 0xd6, 0x04, 0x45, 0x00, 0xe4, 0x04, 0x46, 0x00, 0xf2, 0x04, 0x47, 0x00,
0x00, 0x05, 0x48, 0x00, 0x0e, 0x05, 0x49, 0x00, 0x1c, 0x05, 0x4a, 0x00, 0x2a, 0x05, 0x4b, 0x00,
0x3b, 0x05, 0x4c, 0x00, 0x49, 0x05, 0x4d, 0x00, 0x57, 0x05, 0x4e, 0x00, 0x65, 0x05, 0x4f, 0x00,
0x73, 0x05, 0x50, 0x00, 0x81, 0x05, 0x51, 0x00, 0x8f, 0x05, 0x52, 0x00, 0x9e, 0x05, 0x53, 0x00,
0xac, 0x05, 0x54, 0x00, 0xba, 0x05, 0x55, 0x00, 0xc8, 0x05, 0x56, 0x00, 0xd6, 0x05, 0x57, 0x00,
0xe4, 0x05, 0x58, 0x00, 0xfb, 0x05, 0x59, 0x00, 0x09, 0x06, 0x5a, 0x00, 0x17, 0x06, 0x5b, 0x00,
0x25, 0x06, 0x5c, 0x00, 0x36, 0x06, 0x5d, 0x00, 0x45, 0x06, 0x5e, 0x00, 0x56, 0x06, 0x5f, 0x00,
0x5e, 0x06, 0x60, 0x00, 0x64, 0x06, 0x61, 0x00, 0x6c, 0x06, 0x62, 0x00, 0x78, 0x06, 0x63, 0x00,
0x87, 0x06, 0x64, 0x00, 0x93, 0x06, 0x65, 0x00, 0xa2, 0x06, 0x66, 0x00, 0xae, 0x06, 0x67, 0x00,
0xbd, 0x06, 0x68, 0x00, 0xcc, 0x06, 0x69, 0x00, 0xdb, 0x06, 0x6a, 0x00, 0xe9, 0x06, 0x6b, 0x00,
0xfa, 0x06, 0x6c, 0x00, 0x09, 0x07, 0x6d, 0x00, 0x18, 0x07, 0x6e, 0x00, 0x2b, 0x07, 0x6f, 0x00,
0x37, 0x07, 0x70, 0x00, 0x43, 0x07, 0x71, 0x00, 0x52, 0x07, 0x72, 0x00, 0x61, 0x07, 0x73, 0x00,
0x6d, 0x07, 0x74, 0x00, 0x79, 0x07, 0x75, 0x00, 0x87, 0x07, 0x76, 0x00, 0x93, 0x07, 0x77, 0x00,
0x9f, 0x07, 0x78, 0x00, 0xb2, 0x07, 0x79, 0x00, 0xbe, 0x07, 0x7a, 0x00, 0xcd, 0x07, 0x7b, 0x00,
0xd9, 0x07, 0x7c, 0x00, 0xeb, 0x07, 0x7d, 0x00, 0xfc, 0x07, 0x7e, 0x00, 0x0e, 0x08, 0x00, 0x4e,
0x16, 0x08, 0x03, 0x4e, 0x1d, 0x08, 0x07, 0x4e, 0x3c, 0x08, 0x09, 0x4e, 0x59, 0x08, 0x2d, 0x4e,
0x76, 0x08, 0x5d, 0x4e, 0x97, 0x08, 0x8c, 0x4e, 0xb6, 0x08, 0x94, 0x4e, 0xcd, 0x08, 0xb2, 0x4e,
0xea, 0x08, 0xba, 0x4e, 0x09, 0x09, 0x3f, 0x51, 0x28, 0x09, 0x43, 0x51, 0x47, 0x09, 0x49, 0x51,
0x64, 0x09, 0x6b, 0x51, 0x83, 0x09, 0x6d, 0x51, 0xa2, 0x09, 0xac, 0x51, 0xc1, 0x09, 0x06, 0x52,
0xe0, 0x09, 0x1d, 0x52, 0xff, 0x09, 0xa8, 0x52, 0x1e, 0x0a, 0xb3, 0x52, 0x3d, 0x0a, 0x41, 0x53,
0x5c, 0x0a, 0x48, 0x53, 0x7b, 0x0a, 0x58, 0x54, 0x9a, 0x0a, 0xdb, 0x56, 0xb9, 0x0a, 0xfd, 0x56,
0xd6, 0x0a, 0x23, 0x57, 0xf5, 0x0a, 0x04, 0x59, 0x14, 0x0b, 0x0f, 0x59, 0x33, 0x0b, 0x15, 0x59,
0x50, 0x0b, 0x1c, 0x59, 0x6f, 0x0b, 0x27, 0x59, 0x8e, 0x0b, 0x34, 0x59, 0xad, 0x0b, 0x73, 0x59,
0xcc, 0x0b, 0x87, 0x59, 0xeb, 0x0b, 0x89, 0x5b, 0x0a, 0x0c, 0xb5, 0x5b, 0x29, 0x0c, 0xd2, 0x5b,
0x48, 0x0c, 0x0f, 0x5c, 0x67, 0x0c, 0x08, 0x5e, 0x86, 0x0c, 0x73, 0x5e, 0xa5, 0x0c, 0x74, 0x5e,
0xc2, 0x0c, 0x86, 0x5e, 0xe1, 0x0c, 0x8f, 0x5e, 0x00, 0x0d, 0xff, 0x5e, 0x1f, 0x0d, 0xc5, 0x60,
0x3e, 0x0d, 0xca, 0x60, 0x5d, 0x0d, 0x1a, 0x61, 0x7c, 0x0d, 0xac, 0x62, 0x99, 0x0d, 0x59, 0x65,
0xb8, 0x0d, 0xe5, 0x65, 0xd7, 0x0d, 0xe6, 0x65, 0xf4, 0x0d, 0xf6, 0x65, 0x11, 0x0e, 0x0e, 0x66,
0x30, 0x0e, 0x1f, 0x66, 0x4f, 0x0e, 0x25, 0x66, 0x6e, 0x0e, 0x91, 0x66, 0x8d, 0x0e, 0x08, 0x67,
0xac, 0x0e, 0x1f, 0x67, 0xcb, 0x0e, 0x11, 0x68, 0xea, 0x0e, 0xcd, 0x68, 0x09, 0x0f, 0x0d, 0x69,
0x28, 0x0f, 0x63, 0x6b, 0x47, 0x0f, 0xcd, 0x6b, 0x64, 0x0f, 0x34, 0x6c, 0x81, 0x0f, 0x05, 0x6e,
0xa0, 0x0f, 0xe1, 0x6e, 0xbf, 0x0f, 0x36, 0x72, 0xde, 0x0f, 0x7d, 0x76, 0xfd, 0x0f, 0xcb, 0x79,
0x1c, 0x10, 0xcd, 0x79, 0x3b, 0x10, 0xd2, 0x79, 0x5a, 0x10, 0x0b, 0x7a, 0x79, 0x10, 0xcb, 0x7a,
0x98, 0x10, 0xe5, 0x7a, 0xb7, 0x10, 0xef, 0x7a, 0xd6, 0x10, 0x4a, 0x81, 0xf5, 0x10, 0xf3, 0x81,
0x14, 0x11, 0x82, 0x82, 0x31, 0x11, 0x92, 0x82, 0x50, 0x11, 0xf0, 0x86, 0x6f, 0x11, 0xde, 0x8b,
0x8e, 0x11, 0x37, 0x8c, 0xad, 0x11, 0xcd, 0x91, 0xcc, 0x11, 0xf0, 0x95, 0xeb, 0x11, 0x33, 0x96,
0x0a, 0x12, 0x4d, 0x96, 0x27, 0x12, 0x64, 0x96, 0x46, 0x12, 0xe8, 0x96, 0x65, 0x12, 0xea, 0x96,
0x82, 0x12, 0x1c, 0x97, 0xa1, 0x12, 0x32, 0x97, 0xc0, 0x12, 0x52, 0x97, 0xdf, 0x12, 0x99, 0x9f,
0xfe, 0x12, 0x04, 0x01, 0x01, 0x00, 0x0c, 0x00, 0x07, 0x01, 0x0b, 0x03, 0x03, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x06, 0x04, 0x03, 0x01, 0x02, 0x90, 0x90, 0x90,
0x07, 0x06, 0x0b, 0x00, 0x02, 0x48, 0x48, 0x48, 0xfc, 0x48, 0x48, 0x48, 0xfc, 0x48, 0x48, 0x48,
0x07, 0x05, 0x0b, 0x01, 0x02, 0x20, 0x70, 0xa8, 0xa0, 0x60, 0x30, 0x28, 0x28, 0xa8, 0x70, 0x20,
0x08, 0x07, 0x09, 0x00, 0x03, 0x42, 0xa4, 0xa8, 0x48, 0x10, 0x24, 0x2a, 0x4a, 0x84, 0x08, 0x07,
0x09, 0x00, 0x03, 0x30, 0x48, 0x48, 0x50, 0x20, 0x54, 0x88, 0x8c, 0x72, 0x05, 0x01, 0x03, 0x02,
0x02, 0x80, 0x80, 0x80, 0x07, 0x03, 0x0c, 0x02, 0x02, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x40, 0x40, 0x20, 0x07, 0x03, 0x0c, 0x02, 0x02, 0x80, 0x40, 0x40, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x40, 0x40, 0x80, 0x08, 0x07, 0x07, 0x00, 0x04, 0x10, 0x54, 0x38, 0xfe, 0x38,
0x54, 0x10, 0x07, 0x07, 0x07, 0x00, 0x04, 0x10, 0x10, 0x10, 0xfe, 0x10, 0x10, 0x10, 0x05, 0x02,
0x04, 0x01, 0x0a, 0xc0, 0xc0, 0x40, 0x80, 0x07, 0x06, 0x01, 0x00, 0x07, 0xfc, 0x05, 0x02, 0x02,
0x01, 0x0a, 0xc0, 0xc0, 0x07, 0x06, 0x0c, 0x00, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20,
0x20, 0x40, 0x40, 0x80, 0x80, 0x07, 0x06, 0x09, 0x00, 0x03, 0x78, 0x84, 0x84, 0x84, 0x84, 0x84,
0x84, 0x84, 0x78, 0x06, 0x05, 0x09, 0x00, 0x03, 0xe0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0xf8, 0x07, 0x06, 0x09, 0x00, 0x03, 0x78, 0x84, 0x84, 0x08, 0x10, 0x20, 0x40, 0x80, 0xfc, 0x07,
0x06, 0x09, 0x00, 0x03, 0x78, 0x84, 0x04, 0x04, 0x38, 0x04, 0x04, 0x84, 0x78, 0x07, 0x06, 0x09,
0x00, 0x03, 0x18, 0x28, 0x48, 0x48, 0x88, 0x88, 0xfc, 0x08, 0x08, 0x07, 0x06, 0x09, 0x00, 0x03,
0xfc, 0x80, 0x80, 0xf8, 0x04, 0x04, 0x04, 0x84, 0x78, 0x07, 0x06, 0x09, 0x00, 0x03, 0x78, 0x84,
0x80, 0xb8, 0xc4, 0x84, 0x84, 0x84, 0x78, 0x07, 0x06, 0x09, 0x00, 0x03, 0xfc, 0x08, 0x08, 0x10,
0x10, 0x10, 0x20, 0x20, 0x20, 0x07, 0x06, 0x09, 0x00, 0x03, 0x78, 0x84, 0x84, 0x84, 0x78, 0x84,
0x84, 0x84, 0x78, 0x07, 0x06, 0x09, 0x00, 0x03, 0x78, 0x84, 0x84, 0x84, 0x7c, 0x04, 0x04, 0x84,
0x78, 0x06, 0x02, 0x07, 0x02, 0x04, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x06, 0x02, 0x09,
0x02, 0x04, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0x40, 0x80, 0x07, 0x06, 0x0b, 0x00, 0x03,
0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x07, 0x06, 0x04, 0x00, 0x06,
0xfc, 0x00, 0x00, 0xfc, 0x07, 0x06, 0x0b, 0x00, 0x03, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80, 0x07, 0x06, 0x0a, 0x00, 0x03, 0x78, 0x84, 0x84, 0x04, 0x18, 0x10, 0x10,
0x00, 0x10, 0x10, 0x0a, 0x09, 0x0a, 0x00, 0x02, 0x3e, 0x00, 0x41, 0x00, 0x9c, 0x80, 0xa2, 0x80,
0x9e, 0x80, 0xa2, 0x80, 0xa2, 0x80, 0x9e, 0x80, 0x41, 0x00, 0x3e, 0x00, 0x09, 0x08, 0x09, 0x00,
0x03, 0x18, 0x18, 0x24, 0x24, 0x42, 0x42, 0x7e, 0x81, 0x81, 0x07, 0x06, 0x09, 0x00, 0x03, 0xf8,
0x84, 0x84, 0x84, 0xf8, 0x84, 0x84, 0x84, 0xf8, 0x07, 0x06, 0x09, 0x00, 0x03, 0x3c, 0x40, 0x80,
0x80, 0x80, 0x80, 0x80, 0x40, 0x3c, 0x08, 0x07, 0x09, 0x00, 0x03, 0xf8, 0x84, 0x82, 0x82, 0x82,
0x82, 0x82, 0x84, 0xf8, 0x07, 0x06, 0x09, 0x00, 0x03, 0xfc, 0x80, 0x80, 0x80, 0xf8, 0x80, 0x80,
0x80, 0xfc, 0x07, 0x06, 0x09, 0x00, 0x03, 0xfc, 0x80, 0x80, 0x80, 0xf8, 0x80, 0x80, 0x80, 0x80,
0x08, 0x07, 0x09, 0x00, 0x03, 0x3c, 0x42, 0x80, 0x80, 0x8e, 0x82, 0x82, 0x42, 0x3e, 0x08, 0x07,
0x09, 0x00, 0x03, 0x82, 0x82, 0x82, 0x82, 0xfe, 0x82, 0x82, 0x82, 0x82, 0x04, 0x03, 0x09, 0x00,
0x03, 0xe0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xe0, 0x04, 0x03, 0x0c, 0x00, 0x03, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xc0, 0x07, 0x06, 0x09, 0x00, 0x03,
0x84, 0x88, 0x90, 0xa0, 0xc0, 0xa0, 0x90, 0x88, 0x84, 0x07, 0x06, 0x09, 0x00, 0x03, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xfc, 0x09, 0x08, 0x09, 0x00, 0x03, 0xc3, 0xc3, 0xa5, 0xa5,
0x99, 0x99, 0x81, 0x81, 0x81, 0x08, 0x07, 0x09, 0x00, 0x03, 0xc2, 0xc2, 0xa2, 0xa2, 0x92, 0x92,
0x8a, 0x8a, 0x86, 0x08, 0x07, 0x09, 0x00, 0x03, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44,
0x38, 0x07, 0x06, 0x09, 0x00, 0x03, 0xf8, 0x84, 0x84, 0x84, 0x84, 0xf8, 0x80, 0x80, 0x80, 0x08,
0x07, 0x0a, 0x00, 0x03, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x06, 0x07, 0x06,
0x09, 0x00, 0x03, 0xf8, 0x84, 0x84, 0x84, 0xf8, 0x90, 0x88, 0x88, 0x84, 0x07, 0x06, 0x09, 0x00,
0x03, 0x78, 0x84, 0x80, 0x80, 0x78, 0x04, 0x04, 0x84, 0x78, 0x08, 0x07, 0x09, 0x00, 0x03, 0xfe,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x09, 0x00, 0x03, 0x82, 0x82, 0x82,
0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x08, 0x07, 0x09, 0x00, 0x03, 0x82, 0x82, 0x82, 0x44, 0x44,
0x28, 0x28, 0x10, 0x10, 0x0c, 0x0b, 0x09, 0x00, 0x03, 0x84, 0x20, 0x84, 0x20, 0x8a, 0x20, 0x4a,
0x40, 0x51, 0x40, 0x51, 0x40, 0x51, 0x40, 0x20, 0x80, 0x20, 0x80, 0x08, 0x07, 0x09, 0x00, 0x03,
0x82, 0x82, 0x44, 0x28, 0x10, 0x28, 0x44, 0x82, 0x82, 0x08, 0x07, 0x09, 0x00, 0x03, 0x82, 0x44,
0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x07, 0x09, 0x00, 0x03, 0xfe, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80, 0xfe, 0x07, 0x03, 0x0c, 0x02, 0x01, 0xe0, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0xe0, 0x07, 0x05, 0x0a, 0x01, 0x02, 0x80, 0x80, 0x40, 0x40, 0x20,
0x20, 0x10, 0x10, 0x08, 0x08, 0x07, 0x03, 0x0c, 0x02, 0x01, 0xe0, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0xe0, 0x07, 0x05, 0x03, 0x01, 0x02, 0x20, 0x50, 0x88, 0x07, 0x06,
0x01, 0x00, 0x0c, 0xfc, 0x07, 0x03, 0x03, 0x02, 0x03, 0xc0, 0x40, 0x20, 0x07, 0x06, 0x07, 0x00,
0x05, 0x78, 0x04, 0x7c, 0x84, 0x84, 0x84, 0x7c, 0x07, 0x06, 0x0a, 0x00, 0x02, 0x80, 0x80, 0x80,
0xb8, 0xc4, 0x84, 0x84, 0x84, 0xc4, 0xb8, 0x06, 0x05, 0x07, 0x00, 0x05, 0x78, 0x80, 0x80, 0x80,
0x80, 0x80, 0x78, 0x07, 0x06, 0x0a, 0x00, 0x02, 0x04, 0x04, 0x04, 0x74, 0x8c, 0x84, 0x84, 0x84,
0x8c, 0x74, 0x07, 0x06, 0x07, 0x00, 0x05, 0x78, 0x84, 0x84, 0xfc, 0x80, 0x84, 0x78, 0x06, 0x05,
0x0a, 0x00, 0x02, 0x38, 0x40, 0x40, 0xf8, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x07, 0x06, 0x0a,
0x00, 0x05, 0x7c, 0x84, 0x84, 0x84, 0x84, 0x8c, 0x74, 0x04, 0x04, 0x78, 0x07, 0x06, 0x0a, 0x00,
0x02, 0x80, 0x80, 0x80, 0xb8, 0xc4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x02, 0x01, 0x09, 0x00, 0x03,
0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x03, 0x02, 0x0c, 0x00, 0x03, 0x40, 0x00,
0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x06, 0x05, 0x0a, 0x00, 0x02, 0x80,
0x80, 0x80, 0x88, 0x90, 0xa0, 0xc0, 0xa0, 0x90, 0x88, 0x03, 0x01, 0x0a, 0x01, 0x02, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0a, 0x09, 0x07, 0x00, 0x05, 0xb3, 0x00, 0xcc,
0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x88, 0x80, 0x07, 0x06, 0x07, 0x00, 0x05,
0xb8, 0xc4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x08, 0x07, 0x07, 0x00, 0x05, 0x38, 0x44, 0x82, 0x82,
0x82, 0x44, 0x38, 0x07, 0x06, 0x0a, 0x00, 0x05, 0xb8, 0xc4, 0x84, 0x84, 0x84, 0xc4, 0xb8, 0x80,
0x80, 0x80, 0x07, 0x06, 0x0a, 0x00, 0x05, 0x74, 0x8c, 0x84, 0x84, 0x84, 0x8c, 0x74, 0x04, 0x04,
0x04, 0x05, 0x04, 0x07, 0x00, 0x05, 0xb0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x06, 0x05, 0x07,
0x00, 0x05, 0x70, 0x88, 0x80, 0x70, 0x08, 0x88, 0x70, 0x05, 0x04, 0x09, 0x00, 0x03, 0x40, 0x40,
0xf0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x30, 0x07, 0x06, 0x07, 0x00, 0x05, 0x84, 0x84, 0x84, 0x84,
0x84, 0x8c, 0x74, 0x08, 0x07, 0x07, 0x00, 0x05, 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x0a,
0x09, 0x07, 0x00, 0x05, 0x88, 0x80, 0x88, 0x80, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x22, 0x00,
0x22, 0x00, 0x06, 0x05, 0x07, 0x00, 0x05, 0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x08, 0x07,
0x0a, 0x00, 0x05, 0x82, 0x82, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x20, 0x20, 0x06, 0x05, 0x07,
0x00, 0x05, 0xf8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xf8, 0x07, 0x03, 0x0d, 0x02, 0x01, 0x20, 0x40,
0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x20, 0x07, 0x01, 0x0c, 0x03, 0x01,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x07, 0x03, 0x0d, 0x02,
0x01, 0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x80, 0x07, 0x05,
0x03, 0x01, 0x06, 0x40, 0xa8, 0x10, 0x0e, 0x0d, 0x01, 0x00, 0x06, 0xff, 0xf8, 0x0e, 0x0d, 0x0d,
0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x78, 0x0f, 0x80, 0xf4, 0x00,
0x04, 0x00, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x03, 0xf8, 0x0e, 0x0d, 0x0c, 0x00,
0x01, 0xff, 0xf8, 0x08, 0x00, 0x08, 0x00, 0x0f, 0xe0, 0x08, 0x20, 0x08, 0x20, 0x08, 0x20, 0x10,
0x20, 0x10, 0x20, 0x20, 0x20, 0x43, 0x40, 0x80, 0x80, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0x7f, 0xf0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x0e, 0x0b, 0x0e, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04,
0x00, 0xff, 0xe0, 0x84, 0x20, 0x84, 0x20, 0x84, 0x20, 0xff, 0xe0, 0x84, 0x20, 0x04, 0x00, 0x04,
0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00,
0x08, 0x40, 0xff, 0xe0, 0x08, 0x40, 0x08, 0x40, 0x08, 0x40, 0x08, 0x40, 0x10, 0x40, 0x10, 0x40,
0x10, 0x48, 0x20, 0x48, 0xc0, 0x38, 0x0e, 0x0d, 0x09, 0x00, 0x02, 0x3f, 0xe0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x0e, 0x0d, 0x0c,
0x00, 0x01, 0x3f, 0xe0, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3f, 0xc0, 0x04, 0x40,
0x04, 0x40, 0x04, 0x40, 0x08, 0x40, 0x08, 0x40, 0xff, 0xf8, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x04,
0x00, 0x02, 0x00, 0x7f, 0xf0, 0x10, 0x80, 0x09, 0x00, 0xff, 0xf8, 0x02, 0x00, 0x7f, 0xf0, 0x02,
0x00, 0x12, 0x40, 0x22, 0x20, 0x42, 0x10, 0x0e, 0x00, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x04, 0x00,
0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x11, 0x00,
0x10, 0x80, 0x20, 0x40, 0x40, 0x38, 0x80, 0x10, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x08, 0x80, 0x08,
0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x10,
0x80, 0x10, 0x88, 0x20, 0x88, 0xc0, 0x78, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0x3f, 0xe0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x10, 0x80, 0x10, 0x88,
0x20, 0x88, 0xc0, 0x78, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x22, 0x20, 0x12, 0x20, 0x12,
0x40, 0x02, 0x80, 0xff, 0xf8, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x11, 0x00, 0x11, 0x08, 0x21,
0x08, 0xc0, 0xf8, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x00, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80,
0x08, 0x80, 0x08, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x20, 0x20, 0x20, 0x20, 0x40, 0x10,
0x80, 0x08, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff,
0xf8, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x08, 0x40, 0x10, 0x20, 0x10, 0x20, 0x20, 0x10, 0x40,
0x10, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x08, 0x00, 0x0f, 0xc0, 0x10, 0x80, 0x29, 0x00, 0x46, 0x00,
0x05, 0x00, 0x18, 0xc0, 0xe0, 0x38, 0x06, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x00,
0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x08, 0x80, 0x10, 0x80, 0x10, 0x40, 0x20,
0x20, 0x5f, 0xd0, 0x84, 0x48, 0x04, 0x40, 0x08, 0x40, 0x08, 0x40, 0x11, 0x40, 0x60, 0x80, 0x0e,
0x0d, 0x0d, 0x00, 0x00, 0x40, 0x00, 0x23, 0xf8, 0xf8, 0x88, 0x10, 0x88, 0x20, 0x88, 0x28, 0x88,
0x70, 0x88, 0xa8, 0x88, 0x21, 0x08, 0x21, 0x08, 0x22, 0x08, 0x24, 0x50, 0x28, 0x20, 0x0e, 0x0c,
0x0d, 0x00, 0x00, 0x00, 0x80, 0x78, 0x80, 0x00, 0x80, 0x03, 0xf0, 0xf8, 0x90, 0x20, 0x90, 0x20,
0x90, 0x48, 0x90, 0x45, 0x10, 0xfd, 0x10, 0x02, 0x10, 0x04, 0x50, 0x08, 0x20, 0x0e, 0x0d, 0x0d,
0x00, 0x00, 0x08, 0x80, 0xff, 0xf8, 0x08, 0x80, 0x00, 0x00, 0x7f, 0xf8, 0x40, 0x08, 0x84, 0x10,
0x7f, 0xe0, 0x04, 0x20, 0x08, 0x20, 0x08, 0x20, 0x10, 0xa0, 0x60, 0x40, 0x0e, 0x0d, 0x0d, 0x00,
0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xff, 0xf8, 0x02, 0x00, 0x02,
0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x0d, 0x0d, 0x00, 0x00,
0x10, 0x00, 0x10, 0x00, 0x1f, 0xf0, 0x22, 0x00, 0x42, 0x00, 0x02, 0x00, 0xff, 0xf8, 0x02, 0x00,
0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x0b, 0x0d, 0x01, 0x00, 0x3f,
0x80, 0x20, 0x80, 0x3f, 0x80, 0x00, 0x00, 0x7f, 0xc0, 0x40, 0x40, 0x44, 0x40, 0x44, 0x40, 0x44,
0x40, 0x4a, 0x40, 0x11, 0x00, 0x20, 0x80, 0xc0, 0x60, 0x0e, 0x0b, 0x0c, 0x01, 0x01, 0xff, 0xe0,
0x92, 0x20, 0x92, 0x20, 0x92, 0x20, 0x92, 0x20, 0xa2, 0x20, 0xc1, 0xe0, 0x80, 0x20, 0x80, 0x20,
0x80, 0x20, 0xff, 0xe0, 0x80, 0x20, 0x0e, 0x0b, 0x0d, 0x01, 0x00, 0xff, 0xe0, 0x80, 0x20, 0xbf,
0xa0, 0x84, 0x20, 0x84, 0x20, 0xbf, 0xa0, 0x84, 0x20, 0x85, 0x20, 0x84, 0xa0, 0xff, 0xe0, 0x80,
0x20, 0xff, 0xe0, 0x80, 0x20, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x3f, 0xe0, 0x10, 0x40, 0x08, 0x80,
0x05, 0x00, 0x07, 0x00, 0x18, 0xc0, 0xe2, 0x38, 0x02, 0x00, 0x3f, 0xe0, 0x02, 0x00, 0x02, 0x00,
0x02, 0x00, 0xff, 0xf8, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x1e,
0x40, 0x22, 0x60, 0x22, 0x50, 0x54, 0x48, 0x94, 0x48, 0x08, 0x40, 0x14, 0x40, 0x22, 0x40, 0x41,
0x00, 0x80, 0xf8, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0xff, 0xf8, 0x04, 0x00, 0x3f, 0xe0, 0x20, 0x20,
0x3f, 0xe0, 0x20, 0x20, 0x3f, 0xe0, 0x10, 0x00, 0x3f, 0xc0, 0x48, 0x80, 0x07, 0x00, 0xf8, 0xf8,
0x0e, 0x0c, 0x0d, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x07, 0xf0, 0x08, 0x20, 0x18, 0x20, 0x24,
0x40, 0x42, 0x40, 0x02, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x18, 0x00, 0xe0, 0x00, 0x0e,
0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00, 0xff, 0xf8, 0x11, 0x00, 0x11, 0x00, 0x21, 0xf0, 0x22, 0x20,
0x64, 0xa0, 0xaa, 0x40, 0x21, 0x40, 0x20, 0x80, 0x21, 0x40, 0x22, 0x20, 0x3c, 0x18, 0x0e, 0x0d,
0x0d, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xff, 0xf8, 0x02, 0x00, 0x02, 0x00, 0x05,
0x00, 0x05, 0x00, 0x08, 0x80, 0x08, 0x80, 0x10, 0x40, 0x20, 0x20, 0xc0, 0x18, 0x0e, 0x0d, 0x0d,
0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x12, 0x00, 0x02, 0x00, 0xff, 0xf8,
0x02, 0x00, 0x04, 0x80, 0x08, 0x40, 0x10, 0x20, 0x20, 0x10, 0xc0, 0x10, 0x0e, 0x0d, 0x0d, 0x00,
0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0xff, 0xf8, 0x08, 0x80, 0x08, 0x80, 0x11, 0x00, 0x31,
0x00, 0x0a, 0x00, 0x06, 0x00, 0x09, 0x00, 0x10, 0xc0, 0xe0, 0x30, 0x0e, 0x0d, 0x0d, 0x00, 0x00,
0x20, 0x00, 0x23, 0xf8, 0x20, 0x08, 0xfc, 0x08, 0x28, 0x08, 0x28, 0x08, 0x49, 0xf8, 0x48, 0x08,
0x30, 0x08, 0x10, 0x08, 0x28, 0x08, 0x47, 0xf8, 0x80, 0x08, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x04,
0x00, 0x02, 0x00, 0x7f, 0xf8, 0x40, 0x10, 0x84, 0x00, 0x04, 0x00, 0xff, 0xf8, 0x08, 0x80, 0x10,
0x80, 0x0d, 0x00, 0x03, 0x00, 0x0c, 0xc0, 0x70, 0x30, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00,
0x7f, 0xf8, 0x40, 0x08, 0x92, 0x20, 0x0a, 0x40, 0x3f, 0xe0, 0x20, 0x20, 0x3f, 0xe0, 0x20, 0x20,
0x3f, 0xe0, 0x20, 0x20, 0x20, 0xa0, 0x20, 0x40, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00, 0xff,
0xf8, 0x88, 0x88, 0x3f, 0xe0, 0x08, 0x80, 0x3f, 0xe0, 0x08, 0x80, 0xff, 0xf8, 0x10, 0x40, 0x26,
0x20, 0xc1, 0x98, 0x06, 0x00, 0x01, 0x80, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,
0x02, 0x00, 0x02, 0x00, 0x22, 0x40, 0x22, 0x20, 0x22, 0x10, 0x42, 0x08, 0x82, 0x08, 0x02, 0x00,
0x02, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x10, 0x00, 0x1f, 0xf8, 0x50,
0x80, 0x50, 0x80, 0x57, 0xf0, 0x54, 0x90, 0x54, 0x90, 0x54, 0x90, 0x54, 0x90, 0x14, 0x90, 0x24,
0xb0, 0x40, 0x80, 0x80, 0x80, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0x7f, 0xf0, 0x02, 0x00, 0x22, 0x20,
0x12, 0x40, 0x02, 0x00, 0xff, 0xf8, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
0x02, 0x00, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1f, 0xf8, 0x21, 0x00, 0x41,
0x00, 0x9f, 0xe0, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0xff, 0xf8, 0x01, 0x00, 0x01, 0x00, 0x01,
0x00, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xf8, 0x20, 0x00, 0x21, 0x00, 0x21, 0x00,
0x3f, 0xf8, 0x21, 0x00, 0x22, 0x80, 0x22, 0x80, 0x24, 0x40, 0x48, 0x20, 0x50, 0x10, 0xa0, 0x08,
0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xf8, 0x20, 0x00, 0x27, 0xe0, 0x21, 0x40, 0x20,
0x80, 0x3f, 0xf8, 0x20, 0x88, 0x20, 0x90, 0x20, 0x80, 0x40, 0x80, 0x42, 0x80, 0x81, 0x00, 0x0e,
0x0d, 0x0d, 0x00, 0x00, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xff, 0xf8, 0x10, 0x40,
0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x1f, 0xc0, 0x10, 0x40, 0x0e, 0x0d,
0x0d, 0x00, 0x00, 0x20, 0x80, 0x27, 0xf8, 0xa0, 0x80, 0xb3, 0xf0, 0xa8, 0x80, 0xaf, 0xf8, 0x22,
0x10, 0x23, 0xf0, 0x22, 0x10, 0x23, 0xf0, 0x22, 0x10, 0x22, 0x10, 0x22, 0x30, 0x0e, 0x0d, 0x0d,
0x00, 0x00, 0x21, 0x00, 0x20, 0x80, 0xa7, 0xf8, 0xb0, 0x00, 0xab, 0xf0, 0xa2, 0x10, 0x23, 0xf0,
0x20, 0x40, 0x24, 0x50, 0x24, 0x48, 0x28, 0x48, 0x21, 0x40, 0x20, 0x80, 0x0e, 0x0d, 0x0c, 0x00,
0x01, 0x1f, 0xc0, 0x12, 0x40, 0x1f, 0xc0, 0x12, 0x40, 0x7f, 0xf0, 0x42, 0x50, 0x5f, 0xd0, 0x40,
0x30, 0x12, 0x10, 0x51, 0x48, 0x90, 0x40, 0x0f, 0xc0, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x20, 0x80,
0x20, 0x80, 0xf9, 0x00, 0x22, 0x10, 0x27, 0xf8, 0x28, 0x08, 0x33, 0xf0, 0xe2, 0x10, 0x22, 0x10,
0x22, 0x10, 0x22, 0x10, 0xa3, 0xf0, 0x42, 0x10, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x20, 0x80, 0x24,
0x80, 0xfc, 0x80, 0x28, 0xf8, 0xfd, 0x20, 0x11, 0x20, 0x22, 0xa0, 0x78, 0xa0, 0x88, 0x40, 0x1c,
0x40, 0xf0, 0xa0, 0x11, 0x10, 0x32, 0x08, 0x0e, 0x09, 0x0c, 0x02, 0x01, 0xff, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xff, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0xff, 0x80, 0x80, 0x80, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0x1f, 0xc0, 0x10, 0x40, 0x10, 0x40, 0x10,
0x40, 0x1f, 0xc0, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff,
0xf8, 0x0e, 0x0c, 0x0d, 0x01, 0x00, 0x00, 0x40, 0xf0, 0x40, 0x90, 0x40, 0x9f, 0xf0, 0x90, 0x40,
0xf4, 0x40, 0x92, 0x40, 0x92, 0x40, 0x90, 0x40, 0xf0, 0x40, 0x90, 0x40, 0x01, 0x40, 0x00, 0x80,
0x0e, 0x0c, 0x0d, 0x01, 0x00, 0x03, 0xf0, 0xfa, 0x10, 0x8a, 0x10, 0x8a, 0x10, 0xfb, 0xf0, 0x8a,
0x10, 0x8a, 0x10, 0x8b, 0xf0, 0xfa, 0x10, 0x8a, 0x10, 0x04, 0x10, 0x04, 0x50, 0x08, 0x20, 0x0e,
0x0d, 0x0d, 0x00, 0x00, 0x3f, 0xe0, 0x20, 0x20, 0x3f, 0xe0, 0x20, 0x20, 0x3f, 0xe0, 0x02, 0x00,
0x22, 0x00, 0x3f, 0xf0, 0x42, 0x00, 0x3f, 0xe0, 0x02, 0x00, 0x02, 0x00, 0xff, 0xf8, 0x0e, 0x0d,
0x0d, 0x00, 0x00, 0x02, 0x00, 0x7f, 0xf0, 0x02, 0x00, 0x3f, 0xf0, 0x04, 0x00, 0xff, 0xf8, 0x10,
0x40, 0x3f, 0xe0, 0xd0, 0x58, 0x1f, 0xc0, 0x10, 0x40, 0x10, 0x40, 0x1f, 0xc0, 0x0e, 0x0d, 0x0d,
0x00, 0x00, 0x3f, 0xe0, 0x20, 0x20, 0x3f, 0xe0, 0x20, 0x20, 0x3f, 0xe0, 0x04, 0x20, 0x3f, 0xc0,
0x04, 0x80, 0xff, 0xf8, 0x10, 0x40, 0x3f, 0xc0, 0xd0, 0x40, 0x1f, 0xc0, 0x0e, 0x09, 0x0d, 0x02,
0x00, 0x3f, 0x80, 0x20, 0x80, 0x20, 0x80, 0x3f, 0x80, 0x20, 0x80, 0x20, 0x80, 0x3f, 0x80, 0x20,
0x80, 0x20, 0x80, 0x20, 0x80, 0x40, 0x80, 0x42, 0x80, 0x81, 0x00, 0x0e, 0x0d, 0x0d, 0x00, 0x00,
0x44, 0x00, 0x44, 0xf8, 0xfe, 0x88, 0x44, 0x88, 0x7c, 0xf8, 0x44, 0x88, 0x7c, 0x88, 0x44, 0xf8,
0xff, 0x88, 0x00, 0x88, 0x44, 0x88, 0x43, 0x28, 0x82, 0x10, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x20,
0x10, 0x20, 0x10, 0x27, 0x10, 0xf9, 0xf8, 0x25, 0x10, 0x75, 0x10, 0x6a, 0x90, 0xa2, 0x50, 0xa5,
0x10, 0x29, 0x10, 0x30, 0x10, 0x20, 0x50, 0x20, 0x20, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x20, 0x00,
0x27, 0xf0, 0x24, 0x10, 0xff, 0xf0, 0x24, 0x10, 0x77, 0xf0, 0x6c, 0x40, 0xa4, 0x48, 0xa7, 0x50,
0x24, 0x60, 0x25, 0x48, 0x26, 0x48, 0x24, 0x38, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x20, 0x80, 0x20,
0x80, 0x27, 0xf8, 0xf8, 0x80, 0x23, 0xf0, 0x72, 0x10, 0x6b, 0xf0, 0xa2, 0x10, 0xa3, 0xf0, 0x22,
0x10, 0x23, 0xf0, 0x22, 0x10, 0x27, 0xf8, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0xff, 0xf8, 0x02, 0x00,
0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x23, 0xf0, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00,
0x22, 0x00, 0xff, 0xf8, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0x1f, 0xe0, 0x12, 0x20, 0x11, 0x20, 0x10,
0x20, 0xff, 0xf8, 0x22, 0x20, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3f, 0xf8, 0x00, 0x20, 0x00,
0xc0, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x20, 0x7a, 0x40, 0x0a, 0x80,
0x0b, 0x00, 0x13, 0x00, 0x12, 0x80, 0x22, 0x40, 0x42, 0x38, 0x82, 0x10, 0x0a, 0x00, 0x04, 0x00,
0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x40, 0x80, 0x2f, 0xf8, 0x00, 0x80, 0x87, 0xf0, 0x40, 0x80, 0x1f,
0xf8, 0x24, 0x10, 0x27, 0xf0, 0xc4, 0x10, 0x47, 0xf0, 0x44, 0x10, 0x44, 0x50, 0x44, 0x20, 0x0e,
0x0d, 0x0d, 0x00, 0x00, 0x42, 0x40, 0x2f, 0xf0, 0x02, 0x40, 0x9f, 0xf8, 0x42, 0x40, 0x1f, 0xf0,
0x2a, 0x50, 0x2a, 0x50, 0xcb, 0x50, 0x4c, 0xb0, 0x49, 0x10, 0x48, 0x50, 0x48, 0x20, 0x0e, 0x0d,
0x0d, 0x00, 0x00, 0x10, 0x40, 0x10, 0x20, 0x20, 0x10, 0x50, 0x48, 0x90, 0x48, 0x08, 0x80, 0x08,
0x80, 0x05, 0x00, 0x02, 0x00, 0x05, 0x00, 0x08, 0x80, 0x10, 0x40, 0xe0, 0x38, 0x0e, 0x0a, 0x0d,
0x02, 0x00, 0x10, 0x00, 0x20, 0x00, 0xff, 0xc0, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0xff, 0xc0,
0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0x80, 0x40, 0xff, 0xc0, 0x80, 0x40, 0x0e, 0x0d, 0x0d, 0x00,
0x00, 0x0c, 0x40, 0x70, 0x40, 0x10, 0x40, 0x11, 0x48, 0xfd, 0x48, 0x12, 0x50, 0x38, 0x40, 0x34,
0x40, 0x50, 0xa0, 0x50, 0xa0, 0x91, 0x10, 0x12, 0x10, 0x14, 0x08, 0x0e, 0x0d, 0x0d, 0x00, 0x00,
0x0c, 0x40, 0x70, 0x40, 0x10, 0x40, 0x13, 0xf8, 0xfe, 0x48, 0x12, 0x48, 0x32, 0x48, 0x5b, 0xf8,
0x94, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x18,
0x80, 0xe0, 0x80, 0x20, 0x80, 0x22, 0xa0, 0xfa, 0x90, 0x24, 0x88, 0x70, 0x80, 0x68, 0x90, 0xa0,
0x90, 0xa0, 0x20, 0x20, 0x40, 0x20, 0x80, 0x27, 0x00, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x18, 0x00,
0xe3, 0xf0, 0x22, 0x10, 0x22, 0x10, 0xfb, 0xf0, 0x20, 0x00, 0x77, 0xf0, 0x68, 0x80, 0xa0, 0x80,
0xa3, 0xf0, 0x20, 0x80, 0x20, 0x80, 0x27, 0xf8, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x04, 0x00, 0x02,
0x00, 0x02, 0x00, 0x7f, 0xf0, 0x00, 0x40, 0x10, 0x40, 0x10, 0x40, 0x08, 0x80, 0x08, 0x80, 0x08,
0x80, 0x01, 0x00, 0x01, 0x00, 0xff, 0xf8, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x7f, 0xf0,
0x10, 0x40, 0x08, 0x80, 0xff, 0xf8, 0x12, 0x40, 0x1f, 0xc0, 0x12, 0x40, 0x1f, 0xc0, 0x02, 0x00,
0x3f, 0xe0, 0x02, 0x00, 0xff, 0xf8, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x40, 0x40, 0x22, 0x48, 0xfa,
0x48, 0x03, 0xf8, 0x88, 0x00, 0x4b, 0xf8, 0x50, 0x80, 0x13, 0xf8, 0x22, 0xa8, 0x1a, 0xa8, 0xe2,
0xa8, 0x02, 0xa8, 0x02, 0x18, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x01, 0x20, 0x79, 0x20, 0x4f, 0xf8,
0x49, 0x20, 0x7f, 0xf8, 0x48, 0x00, 0x4b, 0xf0, 0x7a, 0x10, 0x4b, 0xf0, 0x4a, 0x10, 0x4a, 0x10,
0xab, 0xf0, 0x92, 0x10, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0xff, 0xf8, 0x04, 0x00, 0x08, 0x00, 0x10,
0x40, 0x3f, 0xe0, 0x02, 0x20, 0x02, 0x00, 0x3f, 0xe0, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xff,
0xf8, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x08, 0x80, 0xff, 0xf8, 0x08, 0x80, 0x00, 0x00, 0x7f, 0xf0,
0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x50, 0x02, 0x20, 0x02, 0x00, 0x02, 0x00,
0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x10, 0x80, 0xff, 0xf8, 0x10, 0x80, 0x10, 0x80, 0x04, 0x00, 0x02,
0x00, 0xff, 0xf8, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1f, 0xe0, 0x0e,
0x0d, 0x0d, 0x00, 0x00, 0x10, 0x80, 0x10, 0x80, 0xfb, 0xe0, 0x10, 0xa0, 0xfa, 0xa0, 0x11, 0x28,
0x52, 0x98, 0x24, 0x08, 0x3f, 0xe0, 0x22, 0x20, 0x3f, 0xe0, 0x02, 0x10, 0xff, 0xf8, 0x0e, 0x0d,
0x0d, 0x00, 0x00, 0x40, 0x18, 0x2e, 0xe0, 0x22, 0x20, 0x04, 0x20, 0xe8, 0xb8, 0x2e, 0xa0, 0x22,
0xa0, 0x22, 0xa0, 0x2a, 0xa0, 0x24, 0xf8, 0x36, 0x00, 0x29, 0x00, 0x10, 0xf8, 0x0e, 0x0d, 0x0d,
0x00, 0x00, 0x08, 0x80, 0x10, 0x40, 0x22, 0x20, 0x45, 0x00, 0x08, 0x80, 0x10, 0x40, 0x20, 0x20,
0xdf, 0xd8, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x1f, 0xc0, 0x10, 0x40, 0x0e, 0x0d, 0x0d, 0x00,
0x00, 0x01, 0xf0, 0x7e, 0x00, 0x02, 0x00, 0xff, 0xf8, 0x22, 0x20, 0x3f, 0xe0, 0x22, 0x20, 0x3f,
0xe0, 0x02, 0x00, 0x7f, 0xf0, 0x02, 0x00, 0x02, 0x00, 0xff, 0xf8, 0x0e, 0x0c, 0x0d, 0x01, 0x00,
0x9f, 0xf0, 0x40, 0x10, 0x80, 0x10, 0xbf, 0xd0, 0x84, 0x10, 0x84, 0x10, 0x9f, 0x90, 0x84, 0x10,
0x84, 0x10, 0xbf, 0xd0, 0x80, 0x10, 0x80, 0x50, 0x80, 0x20, 0x0e, 0x0b, 0x0c, 0x01, 0x01, 0xf7,
0xe0, 0x94, 0x20, 0xa4, 0x20, 0xc4, 0x20, 0xa4, 0x20, 0x97, 0xe0, 0x94, 0x20, 0xd4, 0x20, 0xa4,
0x20, 0x84, 0x20, 0x87, 0xe0, 0x84, 0x20, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00, 0xf3, 0xf0,
0x95, 0x40, 0xa8, 0x80, 0xc1, 0x40, 0xae, 0xb8, 0x90, 0x80, 0x97, 0xf0, 0xd0, 0x80, 0xa4, 0x80,
0x87, 0xf0, 0x80, 0x80, 0x80, 0x80, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x00, 0x80, 0xf0, 0x80, 0x91,
0x40, 0xa2, 0x20, 0xc7, 0xf0, 0xa8, 0x88, 0x90, 0x80, 0x97, 0xf0, 0xd0, 0x80, 0xa4, 0x90, 0x84,
0x88, 0x88, 0x88, 0x81, 0x80, 0x0e, 0x0d, 0x0c, 0x00, 0x01, 0xff, 0xf8, 0x02, 0x00, 0x02, 0x00,
0x7f, 0xf0, 0x42, 0x10, 0x52, 0x90, 0x4a, 0x50, 0x52, 0x90, 0x4a, 0x50, 0x42, 0x10, 0x42, 0x50,
0x42, 0x20, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x7f, 0xf0, 0x02, 0x00, 0x7f, 0xf8, 0x52, 0x48, 0x8a,
0x90, 0x12, 0x40, 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x20, 0x3f, 0xe0, 0x00, 0x20, 0x3f, 0xe0, 0x00,
0x20, 0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x7f, 0xf0, 0x02, 0x00, 0xff, 0xf8, 0x92, 0x48, 0x22, 0x20,
0x10, 0x00, 0xff, 0xf0, 0x11, 0x10, 0x39, 0xf0, 0x55, 0x10, 0x93, 0xf0, 0x11, 0x10, 0x11, 0xf0,
0x0e, 0x0d, 0x0d, 0x00, 0x00, 0x7f, 0xf0, 0x02, 0x00, 0xff, 0xf8, 0x92, 0x48, 0x22, 0x20, 0x79,
0xf0, 0x4b, 0x10, 0x78, 0xe0, 0x13, 0x18, 0x5d, 0xf0, 0x51, 0x10, 0x5d, 0x10, 0xe1, 0xf0, 0x0e,
0x0d, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x7f, 0xf0, 0x02, 0x00, 0x3f, 0xe0, 0x02, 0x00, 0xff, 0xf8,
0x20, 0x20, 0x3f, 0xe0, 0x20, 0x20, 0x3f, 0xe0, 0x20, 0x20, 0x20, 0xa0, 0x20, 0x40, 0x0e, 0x0d,
0x0d, 0x00, 0x00, 0x04, 0x00, 0x04, 0x80, 0x04, 0x40, 0xff, 0xf8, 0x04, 0x00, 0x05, 0x00, 0x05,
0x20, 0x09, 0x20, 0x09, 0x40, 0x11, 0x80, 0x23, 0x08, 0x45, 0x08, 0x88, 0xf8,
0xE1,0x00,0x20,0x00,0x86,0x03,0x21,0x00,0x99,0x03,0x22,0x00,
0xAC,0x03,0x23,0x00,0xBF,0x03,0x24,0x00,0xD2,0x03,0x25,0x00,
0xE5,0x03,0x26,0x00,0xF8,0x03,0x27,0x00,0x0B,0x04,0x28,0x00,
0x1E,0x04,0x29,0x00,0x31,0x04,0x2A,0x00,0x44,0x04,0x2B,0x00,
0x57,0x04,0x2C,0x00,0x6A,0x04,0x2D,0x00,0x7D,0x04,0x2E,0x00,
0x90,0x04,0x2F,0x00,0xA3,0x04,0x30,0x00,0xB6,0x04,0x31,0x00,
0xC9,0x04,0x32,0x00,0xDC,0x04,0x33,0x00,0xEF,0x04,0x34,0x00,
0x02,0x05,0x35,0x00,0x15,0x05,0x36,0x00,0x28,0x05,0x37,0x00,
0x3B,0x05,0x38,0x00,0x4E,0x05,0x39,0x00,0x61,0x05,0x3A,0x00,
0x74,0x05,0x3B,0x00,0x87,0x05,0x3C,0x00,0x9A,0x05,0x3D,0x00,
0xAD,0x05,0x3E,0x00,0xC0,0x05,0x3F,0x00,0xD3,0x05,0x40,0x00,
0xE6,0x05,0x41,0x00,0xF9,0x05,0x42,0x00,0x0C,0x06,0x43,0x00,
0x1F,0x06,0x44,0x00,0x32,0x06,0x45,0x00,0x45,0x06,0x46,0x00,
0x58,0x06,0x47,0x00,0x6B,0x06,0x48,0x00,0x7E,0x06,0x49,0x00,
0x91,0x06,0x4A,0x00,0xA4,0x06,0x4B,0x00,0xB7,0x06,0x4C,0x00,
0xCA,0x06,0x4D,0x00,0xDD,0x06,0x4E,0x00,0xF0,0x06,0x4F,0x00,
0x03,0x07,0x50,0x00,0x16,0x07,0x51,0x00,0x29,0x07,0x52,0x00,
0x3C,0x07,0x53,0x00,0x4F,0x07,0x54,0x00,0x62,0x07,0x55,0x00,
0x75,0x07,0x56,0x00,0x88,0x07,0x57,0x00,0x9B,0x07,0x58,0x00,
0xAE,0x07,0x59,0x00,0xC1,0x07,0x5A,0x00,0xD4,0x07,0x5B,0x00,
0xE7,0x07,0x5C,0x00,0xFA,0x07,0x5D,0x00,0x0D,0x08,0x5E,0x00,
0x20,0x08,0x5F,0x00,0x33,0x08,0x60,0x00,0x46,0x08,0x61,0x00,
0x59,0x08,0x62,0x00,0x6C,0x08,0x63,0x00,0x7F,0x08,0x64,0x00,
0x92,0x08,0x65,0x00,0xA5,0x08,0x66,0x00,0xB8,0x08,0x67,0x00,
0xCB,0x08,0x68,0x00,0xDE,0x08,0x69,0x00,0xF1,0x08,0x6A,0x00,
0x04,0x09,0x6B,0x00,0x17,0x09,0x6C,0x00,0x2A,0x09,0x6D,0x00,
0x3D,0x09,0x6E,0x00,0x50,0x09,0x6F,0x00,0x63,0x09,0x70,0x00,
0x76,0x09,0x71,0x00,0x89,0x09,0x72,0x00,0x9C,0x09,0x73,0x00,
0xAF,0x09,0x74,0x00,0xC2,0x09,0x75,0x00,0xD5,0x09,0x76,0x00,
0xE8,0x09,0x77,0x00,0xFB,0x09,0x78,0x00,0x0E,0x0A,0x79,0x00,
0x21,0x0A,0x7A,0x00,0x34,0x0A,0x7B,0x00,0x47,0x0A,0x7C,0x00,
0x5A,0x0A,0x7D,0x00,0x6D,0x0A,0x7E,0x00,0x80,0x0A,0x00,0x4E,
0x93,0x0A,0x03,0x4E,0xB4,0x0A,0x07,0x4E,0xD5,0x0A,0x09,0x4E,
0xF6,0x0A,0x2D,0x4E,0x17,0x0B,0x5D,0x4E,0x38,0x0B,0x8C,0x4E,
0x59,0x0B,0x94,0x4E,0x7A,0x0B,0xB2,0x4E,0x9B,0x0B,0xBA,0x4E,
0xBC,0x0B,0x3F,0x51,0xDD,0x0B,0x43,0x51,0xFE,0x0B,0x49,0x51,
0x1F,0x0C,0x6B,0x51,0x40,0x0C,0x6D,0x51,0x61,0x0C,0xAC,0x51,
0x82,0x0C,0x06,0x52,0xA3,0x0C,0x1D,0x52,0xC4,0x0C,0xA8,0x52,
0xE5,0x0C,0xB3,0x52,0x06,0x0D,0x41,0x53,0x27,0x0D,0x48,0x53,
0x48,0x0D,0x58,0x54,0x69,0x0D,0xDB,0x56,0x8A,0x0D,0xFD,0x56,
0xAB,0x0D,0x23,0x57,0xCC,0x0D,0x04,0x59,0xED,0x0D,0x0F,0x59,
0x0E,0x0E,0x15,0x59,0x2F,0x0E,0x1C,0x59,0x50,0x0E,0x27,0x59,
0x71,0x0E,0x34,0x59,0x92,0x0E,0x73,0x59,0xB3,0x0E,0x87,0x59,
0xD4,0x0E,0x89,0x5B,0xF5,0x0E,0xB5,0x5B,0x16,0x0F,0xD2,0x5B,
0x37,0x0F,0x0F,0x5C,0x58,0x0F,0x08,0x5E,0x79,0x0F,0x73,0x5E,
0x9A,0x0F,0x74,0x5E,0xBB,0x0F,0x86,0x5E,0xDC,0x0F,0x20,0x00,
0xFD,0x0F,0x8F,0x5E,0x10,0x10,0xFF,0x5E,0x31,0x10,0xC5,0x60,
0x52,0x10,0xCA,0x60,0x73,0x10,0x1A,0x61,0x94,0x10,0xAC,0x62,
0xB5,0x10,0x59,0x65,0xD6,0x10,0xE5,0x65,0xF7,0x10,0xE6,0x65,
0x18,0x11,0xF6,0x65,0x39,0x11,0x0E,0x66,0x5A,0x11,0x1F,0x66,
0x7B,0x11,0x25,0x66,0x9C,0x11,0x91,0x66,0xBD,0x11,0x08,0x67,
0xDE,0x11,0x1F,0x67,0xFF,0x11,0x11,0x68,0x20,0x12,0xCD,0x68,
0x41,0x12,0x0D,0x69,0x62,0x12,0x63,0x6B,0x83,0x12,0xCD,0x6B,
0xA4,0x12,0x34,0x6C,0xC5,0x12,0x05,0x6E,0xE6,0x12,0xE1,0x6E,
0x07,0x13,0x36,0x72,0x28,0x13,0x7D,0x76,0x49,0x13,0xCB,0x79,
0x6A,0x13,0xCD,0x79,0x8B,0x13,0xD2,0x79,0xAC,0x13,0x0B,0x7A,
0xCD,0x13,0xCB,0x7A,0xEE,0x13,0xE5,0x7A,0x0F,0x14,0xEF,0x7A,
0x30,0x14,0x4A,0x81,0x51,0x14,0xF3,0x81,0x72,0x14,0x82,0x82,
0x93,0x14,0x92,0x82,0xB4,0x14,0xF0,0x86,0xD5,0x14,0xDE,0x8B,
0xF6,0x14,0x37,0x8C,0x17,0x15,0xCD,0x91,0x38,0x15,0xF0,0x95,
0x59,0x15,0x33,0x96,0x7A,0x15,0x4D,0x96,0x9B,0x15,0x64,0x96,
0xBC,0x15,0xE8,0x96,0xDD,0x15,0xEA,0x96,0xFE,0x15,0x1C,0x97,
0x1F,0x16,0x32,0x97,0x40,0x16,0x52,0x97,0x61,0x16,0x99,0x9F,
0x82,0x16,0xDF,0x98,0xA3,0x16,0x0B,0x4E,0xC4,0x16,0x7F,0x6E,
0xE5,0x16,0x30,0x57,0x06,0x17,0x43,0x67,0x27,0x17,0xCA,0x76,
0x48,0x17,0xFB,0x8B,0x69,0x17,0x66,0x4E,0x8A,0x17,0x05,0x96,
0xAB,0x17,0x2A,0x82,0xCC,0x17,0x29,0x59,0xED,0x17,0xA4,0x62,
0x0E,0x18,0xEB,0x58,0x2F,0x18,0xAF,0x73,0x50,0x18,0x83,0x58,
0x71,0x18,0x57,0x90,0x92,0x18,0xA7,0x4E,0xB3,0x18,0x5A,0x51,
0xD4,0x18,0xFA,0x5E,0xF5,0x18,0x9B,0x51,0x16,0x19,0x97,0x62,
0x37,0x19,0x18,0x62,0x58,0x19,0x68,0x51,0x79,0x19,0xC8,0x70,
0x9A,0x19,0x88,0x6D,0xBB,0x19,0x32,0x96,0xDC,0x19,0xB0,0x8B,
0xFD,0x19,0x05,0x80,0x1E,0x1A,0xAA,0x5B,0x3F,0x1A,0xD5,0x6C,
0x60,0x1A,0xD7,0x5F,0x81,0x1A,0x3F,0x61,0xA2,0x1A,0x6C,0x51,
0xC3,0x1A,0x6D,0x79,0xE4,0x1A,0x1F,0x61,0x05,0x1B,0x69,0x60,
0x26,0x1B,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x0E,
0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
0x30,0x30,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x14,0x28,
0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x28,0x28,0xFC,0x28,0x48,
0x50,0xFC,0x50,0x50,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,
0x00,0x10,0x38,0x54,0x54,0x30,0x18,0x14,0x54,0x54,0x38,0x10,
0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x44,0xA8,0xA8,
0xB0,0x54,0x1A,0x2A,0x2A,0x44,0x00,0x00,0x07,0x07,0x0E,0x00,
0x00,0x00,0x00,0x00,0x20,0x50,0x50,0x60,0xAC,0xA8,0x98,0x92,
0x7C,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x60,0x60,0x20,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,
0x0E,0x00,0x00,0x00,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,
0x10,0x08,0x08,0x04,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x40,
0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00,
0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xD6,0x38,
0x38,0xD6,0x10,0x10,0x00,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,
0x00,0x00,0x00,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x00,0x00,
0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x20,0xC0,0x07,0x07,0x0E,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x07,
0x07,0x0E,0x00,0x00,0x00,0x02,0x04,0x04,0x04,0x08,0x08,0x10,
0x10,0x20,0x20,0x20,0x40,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,
0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x84,0x48,0x30,0x00,
0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x10,0x70,0x10,
0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x07,0x07,0x0E,0x00,
0x00,0x00,0x00,0x00,0x38,0x44,0x44,0x04,0x08,0x10,0x20,0x44,
0x7C,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x38,
0x44,0x44,0x18,0x04,0x04,0x44,0x44,0x38,0x00,0x00,0x07,0x07,
0x0E,0x00,0x00,0x00,0x00,0x08,0x08,0x18,0x28,0x48,0x48,0x88,
0x7C,0x08,0x1C,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,
0x00,0x7C,0x40,0x40,0x78,0x44,0x04,0x44,0x44,0x38,0x00,0x00,
0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x80,0xB8,
0xC4,0x84,0x84,0x84,0x78,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,
0x00,0x00,0x00,0x7C,0x44,0x48,0x08,0x10,0x10,0x10,0x10,0x10,
0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x78,0x84,
0x84,0x48,0x78,0x84,0x84,0x84,0x78,0x00,0x00,0x07,0x07,0x0E,
0x00,0x00,0x00,0x00,0x00,0x78,0x84,0x84,0x84,0x8C,0x74,0x04,
0x88,0xF0,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x07,
0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
0x00,0x00,0x00,0x10,0x10,0x20,0x07,0x07,0x0E,0x00,0x00,0x00,
0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,
0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,
0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x0E,0x00,
0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,
0x00,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x78,0x84,
0x84,0x84,0x08,0x10,0x10,0x00,0x30,0x30,0x00,0x00,0x07,0x07,
0x0E,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x9A,0xAA,0xAA,0xAA,
0xB4,0x42,0x3C,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x28,0x28,0x28,0x38,0x44,0x44,0xEE,0x00,0x00,
0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xF8,0x44,0x44,0x78,
0x44,0x44,0x44,0x44,0xF8,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,
0x00,0x00,0x00,0x3C,0x44,0x84,0x80,0x80,0x80,0x80,0x44,0x38,
0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xF0,0x48,
0x44,0x44,0x44,0x44,0x44,0x48,0xF0,0x00,0x00,0x07,0x07,0x0E,
0x00,0x00,0x00,0x00,0x00,0xFC,0x44,0x40,0x48,0x78,0x48,0x40,
0x44,0xFC,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,
0xFC,0x42,0x40,0x48,0x78,0x48,0x40,0x40,0xE0,0x00,0x00,0x07,
0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x84,0x80,0x80,
0x8E,0x84,0x44,0x38,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,
0x00,0x00,0xEE,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0xEE,0x00,
0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x7C,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x07,0x07,0x0E,0x00,
0x00,0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x90,0xE0,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xEE,
0x44,0x48,0x50,0x70,0x48,0x48,0x44,0xEE,0x00,0x00,0x07,0x07,
0x0E,0x00,0x00,0x00,0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,
0x40,0x44,0xFC,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,
0x00,0xEE,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0xD6,0x00,0x00,
0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xEE,0x64,0x64,0x54,
0x54,0x54,0x4C,0x4C,0xE4,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,
0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x84,0x48,0x30,
0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xF8,0x44,
0x44,0x44,0x78,0x40,0x40,0x40,0xE0,0x00,0x00,0x07,0x07,0x0E,
0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0xB4,
0x48,0x38,0x0C,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,
0xF8,0x44,0x44,0x78,0x50,0x48,0x48,0x44,0xE6,0x00,0x00,0x07,
0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x40,0x20,0x18,
0x04,0x04,0x44,0x78,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,
0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,
0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xEE,0x44,0x44,
0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x07,0x07,0x0E,0x00,
0x00,0x00,0x00,0x00,0xEE,0x44,0x44,0x48,0x28,0x28,0x28,0x10,
0x10,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xD6,
0x54,0x54,0x54,0x54,0x6C,0x28,0x28,0x28,0x00,0x00,0x07,0x07,
0x0E,0x00,0x00,0x00,0x00,0x00,0xEE,0x44,0x28,0x28,0x10,0x28,
0x28,0x44,0xEE,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,
0x00,0xEE,0x44,0x28,0x28,0x10,0x10,0x10,0x10,0x38,0x00,0x00,
0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x7C,0x88,0x08,0x10,
0x20,0x20,0x40,0x44,0xFC,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,
0x00,0x1C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x1C,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x40,0x40,0x20,
0x20,0x10,0x10,0x10,0x08,0x08,0x04,0x04,0x00,0x07,0x07,0x0E,
0x00,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x70,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x10,0x28,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0x07,0x0E,0x00,0x00,0x00,
0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x38,0x44,0x1C,0x24,0x44,0x3E,0x00,0x00,0x07,0x07,0x0E,0x00,
0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x78,0x44,0x44,0x44,0x44,
0x78,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3C,0x44,0x40,0x40,0x44,0x38,0x00,0x00,0x07,0x07,
0x0E,0x00,0x00,0x00,0x00,0x00,0x0C,0x04,0x04,0x3C,0x44,0x44,
0x44,0x44,0x3E,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x38,0x44,0x7C,0x40,0x44,0x38,0x00,0x00,
0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x1C,0x24,0x20,0xF8,
0x20,0x20,0x20,0x20,0x78,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x48,0x48,0x30,0x40,0x78,
0x44,0x38,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xC0,0x40,
0x40,0x58,0x64,0x44,0x44,0x44,0xEE,0x00,0x00,0x07,0x07,0x0E,
0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x70,0x10,0x10,0x10,
0x10,0x7C,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,
0x08,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x70,0x07,
0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x5C,0x48,
0x50,0x70,0x48,0xEC,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,
0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,
0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF8,0x54,0x54,0x54,0x54,0xD6,0x00,0x00,0x07,0x07,0x0E,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x64,0x44,0x44,0x44,
0xEE,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x44,0x44,0x44,0x44,0x38,0x00,0x00,0x07,0x07,
0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x44,0x44,
0x44,0x44,0x78,0x40,0xE0,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3C,0x44,0x44,0x44,0x44,0x3C,0x04,0x0E,
0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEC,
0x30,0x20,0x20,0x20,0xF8,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x44,0x30,0x08,0x44,0x78,
0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
0x10,0x7C,0x10,0x10,0x10,0x10,0x0C,0x00,0x00,0x07,0x07,0x0E,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0x44,0x44,0x44,
0x44,0x3E,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xEE,0x44,0x48,0x28,0x28,0x10,0x00,0x00,0x07,
0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD6,0x54,
0x54,0x54,0x28,0x28,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xDC,0x48,0x30,0x30,0x48,0xEC,0x00,
0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xEE,0x44,0x28,0x28,0x10,0x10,0x20,0xE0,0x07,0x07,0x0E,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x48,0x10,0x10,0x24,
0x7C,0x00,0x00,0x07,0x07,0x0E,0x00,0x00,0x00,0x0C,0x08,0x08,
0x08,0x08,0x10,0x08,0x08,0x08,0x08,0x08,0x0C,0x00,0x07,0x07,
0x0E,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x07,0x07,0x0E,0x00,0x00,0x00,0x60,
0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x60,0x00,
0x07,0x07,0x0E,0x00,0x00,0x30,0x48,0x06,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x08,
0x00,0x08,0x00,0x08,0x00,0x08,0x18,0x7F,0xE0,0x08,0x00,0x08,
0x00,0x08,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x10,0x07,
0xE0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,
0x08,0x00,0x08,0x00,0x0F,0xF0,0x08,0x10,0x08,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x20,0x10,0x22,0x20,0x41,0xC0,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x00,0x3F,0xF0,0x22,0x10,0x22,0x10,
0x22,0x10,0x22,0x10,0x22,0x10,0x3F,0xF0,0x02,0x00,0x02,0x00,
0x02,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x04,
0x00,0x04,0x00,0x04,0x00,0x3F,0xC0,0x04,0x40,0x04,0x40,0x08,
0x40,0x08,0x40,0x08,0x40,0x10,0x48,0x10,0x48,0x20,0x48,0x40,
0x30,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x00,0x00,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x04,0x00,0x04,
0x00,0x04,0x00,0x3F,0xE0,0x04,0x20,0x04,0x20,0x08,0x20,0x08,
0x20,0x08,0x20,0x08,0x20,0x7F,0xF8,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x02,0x00,0x02,0x00,0x7F,0xF0,0x08,0x40,0x08,0x40,
0xFF,0xF8,0x02,0x00,0x02,0x00,0x3F,0xE0,0x0A,0x40,0x12,0x20,
0x62,0x10,0x0E,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x02,
0x80,0x04,0x80,0x04,0x40,0x08,0x20,0x10,0x20,0x20,0x10,0x40,
0x08,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x08,0x80,0x08,0x80,
0x08,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08,0x80,
0x08,0x80,0x08,0x80,0x10,0x88,0x20,0x88,0x40,0x70,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,
0x00,0x7F,0xF8,0x08,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x08,
0x80,0x10,0x88,0x20,0x88,0xC0,0x78,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x00,0x00,0x22,0x10,0x12,0x20,0x12,0x20,0x0A,0x40,
0x7F,0xF8,0x08,0x80,0x08,0x80,0x08,0x80,0x08,0x80,0x10,0x88,
0x20,0x88,0x40,0xF0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,
0x80,0x00,0x80,0x08,0x80,0x08,0x80,0x08,0x40,0x10,0x40,0x10,
0x40,0x10,0x20,0x20,0x20,0x20,0x10,0x40,0x10,0x40,0x08,0x80,
0x08,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,
0x01,0x00,0x01,0x00,0x7F,0xF8,0x08,0x80,0x08,0x40,0x08,0x20,
0x10,0x20,0x10,0x10,0x20,0x10,0x20,0x08,0x40,0x08,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x08,0x00,0x0F,0xE0,0x18,0x20,0x64,
0x40,0x02,0x80,0x01,0x00,0x0E,0xC0,0x78,0x38,0x07,0x00,0x00,
0x00,0x0C,0x00,0x03,0x80,0x00,0x60,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x04,0x80,0x08,0x40,0x08,0x40,0x10,0x20,0x20,0x10,
0x5F,0xE8,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x20,0x10,0x20,
0x30,0x20,0x41,0xC0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x20,
0x00,0x13,0xF8,0x00,0x88,0x38,0x88,0x08,0x88,0x12,0x88,0x14,
0x88,0x7C,0x88,0x13,0x08,0x11,0x08,0x11,0x08,0x12,0x08,0x14,
0x70,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x40,
0x1C,0x40,0x00,0xF8,0x00,0x48,0x7E,0x48,0x10,0x48,0x14,0x48,
0x24,0x88,0x24,0x88,0x22,0x88,0x7F,0x08,0x01,0x30,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x08,0x40,0x7F,0xF8,0x08,0x40,0x08,
0x40,0x77,0xB8,0x40,0x08,0x44,0x08,0x3F,0xE0,0x04,0x20,0x08,
0x20,0x08,0x20,0x10,0x20,0x60,0xC0,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,
0x7F,0xFC,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,
0x02,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x10,
0x00,0x10,0x00,0x2F,0xF0,0x21,0x00,0x41,0x00,0x01,0x00,0x01,
0x00,0x3F,0xF0,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x1F,0xE0,0x20,0x20,
0x20,0x20,0x3F,0xE0,0x00,0x00,0x3F,0xF0,0x22,0x10,0x22,0x10,
0x22,0x10,0x24,0x10,0x04,0x90,0x18,0x70,0x60,0x08,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x44,0x88,0x44,
0x88,0x44,0x88,0x44,0x88,0x44,0x88,0x48,0x88,0x58,0xF8,0x60,
0x08,0x40,0x08,0x40,0x08,0x3F,0xF0,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x3F,0xF0,0x40,0x08,0x5F,0xE8,0x42,0x08,0x42,0x08,
0x42,0x08,0x5F,0xE8,0x42,0x88,0x42,0x48,0x42,0x48,0x7F,0xE8,
0x40,0x08,0x3F,0xF0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x3F,
0xC0,0x10,0x20,0x08,0x40,0x04,0x40,0x03,0x80,0x03,0x00,0x1C,
0xE0,0x60,0x18,0x02,0x00,0x1F,0xE0,0x02,0x00,0x02,0x00,0x7F,
0xF8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x40,
0x3C,0x40,0x22,0x40,0x22,0x60,0x52,0x50,0x52,0x48,0x14,0x40,
0x14,0x40,0x08,0x40,0x14,0x40,0x23,0x00,0x40,0xFC,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x7F,0xF8,0x02,0x00,0x3D,0xF0,0x3F,
0xF0,0x20,0x10,0x3F,0xF0,0x20,0x10,0x1F,0xE0,0x0F,0xE0,0x38,
0x20,0xC4,0x40,0x03,0x80,0x7C,0x7C,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x04,0x00,0x07,0xF8,0x08,0x08,0x10,0x08,0x10,0x08,
0x70,0x08,0x0C,0x10,0x03,0x10,0x00,0x90,0x00,0x20,0x00,0x40,
0x01,0x80,0x7E,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,
0x00,0x7F,0xF8,0x11,0x00,0x11,0xF0,0x12,0x10,0x25,0x90,0x24,
0x90,0x6C,0x50,0xA2,0x20,0x21,0x40,0x20,0xC0,0x21,0x20,0x0E,
0x18,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,
0x02,0x00,0x7F,0xFC,0x02,0x00,0x03,0x00,0x03,0x00,0x04,0x80,
0x04,0x80,0x08,0x40,0x10,0x20,0x20,0x10,0x40,0x08,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x01,0x00,0x09,0x00,0x05,0x00,0x21,
0x00,0x11,0x00,0x01,0x00,0x7F,0xFC,0x02,0x80,0x02,0x40,0x04,
0x20,0x04,0x20,0x18,0x10,0x60,0x08,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0xFF,0xF8,0x08,0x20,
0x10,0x40,0x10,0x40,0x10,0x40,0x0C,0x80,0x03,0x00,0x03,0xC0,
0x0C,0x30,0x70,0x08,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x20,
0x00,0x23,0xF8,0x78,0x08,0x24,0x08,0x44,0x08,0x48,0x08,0x4B,
0xF8,0x48,0x08,0x28,0x08,0x10,0x08,0x18,0x08,0x27,0xF8,0x40,
0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x3F,0xF0,
0x40,0x08,0x42,0x08,0x44,0x00,0x04,0x00,0x7B,0xF0,0x10,0x40,
0x10,0x40,0x0C,0x80,0x03,0x00,0x06,0xE0,0xF8,0x18,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xF8,0x52,0x28,0x4A,
0x28,0x0A,0x40,0x3F,0xF0,0x20,0x10,0x3F,0xF0,0x20,0x10,0x20,
0x10,0x3F,0xF0,0x20,0x10,0x20,0xF0,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x02,0x00,0x7F,0xF8,0x48,0x88,0x7F,0xF8,0x08,0x80,
0x3F,0xF0,0x08,0x80,0x3F,0x70,0x12,0x20,0x21,0x10,0xC0,0x0C,
0x06,0x00,0x01,0x80,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x02,0x00,0x02,0x00,0x12,0x20,0x22,0x10,0x22,0x10,0x22,
0x10,0x22,0x10,0x42,0x08,0x42,0x08,0x82,0x00,0x02,0x00,0x0E,
0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x07,0xF8,0x10,0x40,
0x50,0x40,0x53,0xF8,0x54,0x48,0x54,0x48,0x54,0x48,0x14,0x48,
0x14,0x48,0x14,0x48,0x24,0x68,0x60,0x50,0x00,0x40,0x0E,0x0E,
0x0E,0x00,0x00,0x00,0x00,0x7F,0xF8,0x02,0x00,0x22,0x10,0x22,
0x10,0x12,0x20,0x0A,0x40,0x0A,0x80,0x7F,0xF8,0x02,0x00,0x02,
0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,
0x00,0x00,0x08,0x00,0x1F,0xF8,0x11,0x00,0x21,0x00,0x41,0x00,
0x1F,0xF8,0x11,0x00,0x11,0x00,0x11,0x00,0x2F,0xF0,0x01,0x00,
0x01,0x00,0x01,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x01,
0x00,0x3F,0xF8,0x41,0x00,0x41,0x00,0x41,0x00,0x5F,0xF8,0x41,
0x80,0x42,0x80,0x42,0x40,0x44,0x40,0x44,0x20,0x48,0x10,0x30,
0x08,0x07,0x07,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x01,0x00,0x3F,0xF8,0x40,0x00,0x4F,0xF0,0x44,
0x10,0x42,0x60,0x41,0x80,0x5F,0xF8,0x41,0x08,0x41,0x08,0x41,
0x10,0x41,0x00,0x07,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x7F,0xF8,0x10,0x20,
0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,
0x1F,0xE0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x20,0x00,0x23,
0xF0,0x60,0x80,0x73,0xF0,0xAF,0xFC,0xA8,0x00,0xA7,0xF8,0xA4,
0x08,0x27,0xF8,0x24,0x08,0x27,0xF8,0x24,0x08,0x24,0x70,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x20,0x80,0x20,0x80,0x63,0x78,
0x73,0xF0,0x6C,0x10,0xAC,0x10,0xA4,0x10,0xA3,0xE0,0x22,0x90,
0x22,0x90,0x24,0x88,0x28,0x88,0x23,0x80,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x3F,0xE0,0x22,0x10,0x3F,0xF0,0x3F,0xF0,0x02,
0x00,0x7F,0xF0,0x42,0x50,0x5F,0xB0,0x40,0x70,0x22,0x00,0x32,
0x10,0x52,0x48,0x0F,0xC8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x01,0x00,0x21,0x20,0x22,0x10,0x72,0x10,0x24,0x38,0x23,0xC8,
0x28,0x00,0x33,0xF0,0x64,0x10,0x24,0x10,0x24,0x10,0x24,0x10,
0x63,0xF0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,
0x80,0x12,0xF0,0x14,0x90,0x7F,0x90,0x09,0x90,0x3D,0x90,0x28,
0x60,0xCA,0x60,0x1C,0x60,0x64,0x90,0x05,0x10,0x1A,0x08,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x20,0x10,
0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x20,0x10,0x20,0x10,
0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x1F,0xE0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,
0x10,0x3F,0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,
0x00,0x7F,0xF8,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x78,0x20,0x48,0x20,0x4F,0xF0,0x48,0x20,0x4A,0x20,
0x79,0x20,0x48,0xA0,0x48,0x60,0x48,0x20,0x48,0x20,0x49,0x20,
0x30,0xE0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x38,0xF8,0x45,
0x08,0x45,0x08,0x45,0x08,0x45,0xF8,0x7D,0x08,0x45,0x08,0x45,
0x08,0x45,0xF8,0x7D,0x08,0x02,0x08,0x04,0x08,0x08,0x38,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x1F,0xE0,0x20,0x10,0x20,0x10,
0x3F,0xF0,0x20,0x10,0x1F,0xE0,0x12,0x00,0x3F,0xF0,0x42,0x00,
0x1F,0xF0,0x02,0x00,0x02,0x00,0x7F,0xF8,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x02,0x00,0x3F,0xE0,0x02,0x00,0x1D,0xE0,0x04,
0x00,0x3F,0xF0,0x08,0x40,0x1F,0xF0,0xF0,0x2C,0x10,0x20,0x1F,
0xE0,0x10,0x20,0x1F,0xE0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x1F,0xE0,0x20,0x10,0x3F,0xF0,0x3F,0xF0,0x02,0x08,0x3F,0xF0,
0x02,0x60,0x7F,0xF8,0x06,0x00,0x79,0xF0,0x1F,0xF0,0x10,0x10,
0x1F,0xF0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x1F,0xE0,0x20,
0x10,0x20,0x10,0x20,0x10,0x3F,0xF0,0x20,0x10,0x20,0x10,0x1F,
0xF0,0x20,0x10,0x20,0x10,0x20,0x10,0x40,0x10,0x40,0xE0,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x24,0x00,0x24,0xF8,0x3C,0x88,
0x24,0x88,0x3C,0xF8,0x24,0x88,0x3C,0x88,0x24,0xF8,0x24,0x88,
0x1B,0x88,0x24,0x88,0x25,0x08,0x43,0x38,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x20,0x00,0x20,0x10,0x27,0x78,0x20,0x90,0x35,
0x50,0x35,0x50,0x63,0x50,0x63,0x30,0xA3,0x30,0x23,0x10,0x24,
0x90,0x28,0x10,0x20,0x30,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x03,0xF0,0x24,0x08,0x24,0x08,0x7F,0xF8,0x34,0x08,0x57,0xF8,
0x6C,0x48,0x64,0x50,0xA6,0x60,0x24,0x40,0x24,0x44,0x25,0xC8,
0x06,0x78,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
0x80,0x23,0xF0,0x78,0x80,0x33,0x70,0x34,0x10,0x6F,0xF0,0x64,
0x10,0xA7,0xF0,0x24,0x10,0x27,0xF0,0x24,0x10,0x07,0xF8,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x01,0x00,
0x01,0x00,0x11,0x00,0x11,0x00,0x11,0xF8,0x11,0x00,0x11,0x00,
0x11,0x00,0x11,0x00,0x11,0x00,0x7F,0xF8,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x1F,0xF0,0x20,0x10,0x22,0x10,0x21,0x10,0x21,
0x10,0x7F,0xF8,0x22,0x10,0x22,0x10,0x21,0x10,0x21,0x10,0x3F,
0xF8,0x00,0x10,0x00,0xF0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x01,0x00,0x01,0x00,0x01,0x08,0x7D,0x10,0x05,0x20,0x05,0xC0,
0x05,0x80,0x09,0x40,0x11,0x20,0x21,0x10,0x41,0x08,0x01,0x00,
0x0E,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x40,0x80,0x2F,
0xF8,0x10,0x80,0x0F,0xF0,0x40,0x80,0x27,0x78,0x07,0xF0,0x14,
0x10,0x17,0xF0,0x24,0x10,0x27,0xF0,0x44,0x10,0x44,0x30,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x40,0x20,0x2F,0xF8,0x10,0x20,
0x00,0x00,0xC7,0xF0,0x22,0x20,0x0F,0xF8,0x0A,0x48,0x2B,0x28,
0x2D,0x68,0x4C,0x98,0x48,0x08,0x48,0x38,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x04,0x80,0x08,0x40,0x10,0x20,0x30,0x10,0x50,
0x28,0x08,0x40,0x08,0x40,0x04,0x80,0x02,0x80,0x01,0x00,0x06,
0x80,0x18,0x60,0x60,0x18,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x02,0x00,0x02,0x00,0x3D,0xF8,0x40,0x08,0x40,0x08,0x40,0x08,
0x40,0x08,0x7F,0xF8,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x08,
0x3F,0xF0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x0C,0x40,0x71,
0x48,0x11,0x48,0x11,0x48,0x7E,0x48,0x12,0x50,0x3A,0x50,0x34,
0xC0,0x54,0xA0,0x91,0x20,0x11,0x10,0x12,0x08,0x14,0x00,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x08,0x40,0x30,0x40,0x20,0x40,
0x23,0xF8,0xFA,0x48,0x32,0x48,0x2A,0x48,0x6A,0x48,0x63,0xF8,
0x20,0x40,0x20,0x40,0x20,0x40,0x00,0x40,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x00,0x40,0x78,0x40,0x20,0x50,0x22,0x50,0x3E,
0x48,0x32,0x48,0x34,0x48,0x6C,0x50,0x60,0x50,0xA0,0x10,0x20,
0x20,0x20,0x40,0x07,0x80,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x09,0xF0,0x72,0x08,0x14,0x08,0x12,0x08,0x79,0xF0,0x10,0x00,
0x3F,0xF0,0x50,0x40,0x50,0x40,0x11,0xF0,0x10,0x40,0x10,0x40,
0x17,0xF8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x02,
0x00,0x01,0x00,0x3E,0xF0,0x00,0x20,0x10,0x20,0x10,0x20,0x10,
0x20,0x10,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x7F,0xF8,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x7F,0xF8,0x08,0x40,
0x08,0x80,0x77,0x70,0x3F,0xF0,0x22,0x10,0x3F,0xF0,0x22,0x10,
0x1F,0xF0,0x3F,0xF0,0x02,0x00,0x7F,0xF8,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x22,0x48,0x22,0x48,0x7E,0x48,0x01,0xB0,0x4B,
0xF8,0x48,0x40,0x49,0xF8,0x4A,0xA8,0x4A,0xA8,0x4A,0xA8,0x52,
0xA8,0x3E,0xA8,0x02,0xB8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x39,0x10,0x49,0x10,0x4F,0xF0,0x49,0x10,0x39,0x10,0x4F,0xF8,
0x48,0x00,0x3B,0xF8,0x4A,0x08,0x4B,0xF8,0x4A,0x08,0x4A,0x08,
0x19,0xF0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,
0xF0,0x08,0x40,0x08,0x40,0x10,0x20,0x3F,0xD0,0x02,0x08,0x02,
0x00,0x3F,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xF8,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x40,0x7F,0xF8,0x10,0x40,
0x00,0x40,0x00,0x00,0x3F,0xF0,0x02,0x10,0x02,0x10,0x02,0x10,
0x02,0x10,0x02,0x90,0x02,0x60,0x02,0x00,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x00,0x20,0x7F,0xF8,0x10,0x20,0x10,0x20,0x02,
0x00,0x01,0x00,0x3E,0xF0,0x10,0x00,0x10,0x00,0x10,0x00,0x10,
0x00,0x10,0x00,0x0F,0xF8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x10,0x80,0x7D,0xE0,0x12,0x90,0x15,0x90,0x78,0x94,0x11,0x58,
0x72,0x28,0x1F,0xE0,0x62,0x10,0x42,0x10,0x3F,0xF0,0x02,0x30,
0x7D,0xC8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x08,0x2E,
0xF0,0x22,0x20,0x04,0xA0,0x64,0xA0,0x27,0xB8,0x21,0xA0,0x29,
0xA0,0x26,0xA0,0x22,0xA0,0x2B,0x50,0x34,0x80,0x08,0x78,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x04,0x40,0x18,0x20,0x60,0x10,
0x03,0x00,0x04,0xC0,0x18,0x20,0x60,0x18,0x1F,0xE0,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x1F,0xE0,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x00,0x30,0x1F,0xC0,0x02,0x00,0x3F,0xF0,0x3F,
0xF0,0x42,0x10,0x42,0x10,0x7F,0xF0,0x42,0x10,0x3F,0xE0,0x3F,
0xF0,0x02,0x00,0x7F,0xF8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x20,0x00,0x2F,0xF8,0x10,0x08,0x20,0x08,0x2F,0xC8,0x21,0x08,
0x21,0x08,0x2F,0xC8,0x21,0x08,0x21,0x08,0x2E,0xC8,0x20,0x08,
0x00,0x38,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x39,0xF0,0x46,
0x08,0x4A,0x08,0x4A,0x08,0x4A,0x08,0x4A,0x08,0x4B,0xF8,0x46,
0x08,0x46,0x08,0x7A,0x08,0x42,0x08,0x42,0x08,0x41,0xF0,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x21,0xE0,0x5A,0x10,0x55,0x20,
0x50,0xC0,0x60,0xC0,0x53,0x78,0x4C,0x40,0x4B,0xF8,0x4A,0x40,
0x74,0x40,0x43,0xF8,0x40,0x40,0x40,0x40,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x20,0xC0,0x51,0x20,0x52,0x10,0x54,0x08,0x6F,
0xF0,0x50,0x80,0x50,0x80,0x4F,0xF8,0x4A,0x80,0x74,0x90,0x48,
0x88,0x40,0x88,0x43,0x80,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x3F,0xF0,0x02,0x00,0x7F,0xF0,0x62,0x88,0x52,0x48,
0x4A,0x28,0x42,0x08,0x72,0x88,0x4A,0x48,0x4A,0x28,0x42,0x08,
0x40,0x70,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x3F,0xF0,0x02,
0x00,0x3F,0xF8,0x42,0x08,0x5E,0xF8,0x42,0x10,0x0A,0x60,0x3F,
0xF0,0x00,0x10,0x00,0x10,0x1F,0xF0,0x00,0x10,0x3F,0xF0,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x3F,0xF0,0x02,0x00,0x7F,0xF8,
0xBE,0xF8,0x02,0x08,0x1E,0x70,0x11,0xF0,0x7E,0x10,0x19,0xF0,
0x36,0x10,0x55,0xF0,0x12,0x10,0x11,0xF0,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x3F,0xF0,0x3F,0xF0,0xC2,0x08,0x1E,0x78,0x3E,
0xF0,0x38,0x80,0x45,0xF0,0x46,0xA0,0x38,0xE0,0x51,0x18,0x59,
0xF0,0x55,0x10,0x6B,0xF0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x02,0x00,0x3F,0xE0,0x02,0x00,0x1F,0xE0,0x7F,0xF8,0x00,0x00,
0x3F,0xF0,0x20,0x10,0x3F,0xF0,0x20,0x10,0x3F,0xF0,0x20,0x10,
0x20,0xE0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x80,0x04,
0x60,0x04,0x00,0x3F,0xF0,0x05,0x00,0x05,0x10,0x05,0x20,0x09,
0x40,0x09,0x40,0x11,0x80,0x23,0x08,0x4D,0x08,0x01,0xF0,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x03,0x00,0x04,0x80,0x1A,0x60,
0x62,0x18,0x3F,0xE0,0x20,0x20,0x3F,0xE0,0x20,0x20,0x3F,0xD0,
0x22,0x20,0x21,0xC0,0x22,0x20,0x1C,0x10,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x7F,0xF8,0x02,0x00,0x02,0x00,0x02,0x00,0x03,
0x80,0x02,0x40,0x02,0x20,0x02,0x10,0x02,0x00,0x02,0x00,0x02,
0x00,0x02,0x00,0x02,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x47,0xF0,0x28,0x10,0x18,0x10,0x0F,0xF0,0x48,0x10,0x27,0xF0,
0x02,0x40,0x0A,0x48,0x2A,0x50,0x26,0x50,0x46,0x60,0x42,0x40,
0x5F,0xF8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x20,0x80,0x20,
0x80,0x24,0x80,0x74,0xF8,0x2F,0x88,0x24,0x88,0x24,0x88,0x24,
0x88,0x24,0xB0,0x2C,0x80,0x34,0x08,0x44,0x08,0x03,0xF0,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x10,0x00,0x17,0xF0,0x12,0x08,
0x32,0x10,0x32,0x10,0x39,0x10,0x51,0x20,0x50,0xA0,0x90,0x40,
0x10,0xC0,0x11,0x20,0x12,0x10,0x1C,0x0C,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x10,0x20,0x08,0x40,0x7F,0xF8,0x00,0x80,0x08,
0x60,0x30,0x10,0x40,0x08,0x3F,0xF0,0x44,0x90,0x44,0x90,0x44,
0x90,0x44,0x90,0x7F,0xFC,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x00,0x80,0x27,0xF0,0x10,0x80,0x0F,0xF8,0x00,0x08,0x61,0x08,
0x24,0xC0,0x23,0x40,0x20,0x40,0x23,0xF0,0x28,0xA0,0x11,0x10,
0x06,0x08,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x40,0x04,
0x30,0x1F,0xC0,0x04,0x40,0x04,0x40,0x04,0x40,0x3F,0xB0,0x04,
0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x00,0xE0,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x27,0xF8,0x20,0x08,0x58,0x88,
0x44,0x88,0x4F,0xC8,0x50,0x48,0x50,0x48,0x4F,0xC8,0x45,0x08,
0x45,0x08,0x49,0x38,0x70,0xC8,0x40,0x38,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x10,0x40,0x38,0x40,0x67,0xB0,0x54,0x00,0x55,
0xE0,0x45,0x20,0x45,0x20,0x7D,0x20,0x55,0x20,0x55,0x20,0x55,
0x28,0x56,0x28,0x1E,0x18,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x1F,0xE0,0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xF8,
0x01,0x00,0x03,0x00,0x02,0x80,0x04,0x40,0x08,0x20,0x10,0x10,
0x60,0x08,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x80,0x20,
0x40,0x21,0xF0,0x7E,0x08,0x24,0x08,0x24,0x08,0x2F,0xF0,0x34,
0x00,0x64,0x00,0x24,0x00,0x24,0x00,0x28,0x00,0x68,0x00,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,
0x02,0x00,0x7F,0xF8,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,
0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xF8,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x20,0x80,0x20,0x80,0x20,
0x80,0x21,0xA0,0x22,0xA0,0x24,0x90,0x28,0x88,0x30,0x80,0x30,
0x80,0x40,0x80,0x00,0x80,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x20,0x80,0x27,0xF8,0x22,0x20,0xF9,0x20,0x26,0xD0,0x27,0xF8,
0x24,0x08,0x27,0xF8,0x27,0xF8,0x39,0x40,0x61,0x44,0x82,0x44,
0x0C,0x38,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x40,0x80,0x27,
0xF0,0x28,0x90,0x07,0xE0,0x0F,0xF8,0x67,0xF0,0x24,0x90,0x24,
0x90,0x24,0x90,0x25,0x50,0x12,0x30,0x2C,0x10,0x47,0xF8,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x3F,0xF8,0x08,0x20,
0x08,0x40,0x04,0x40,0x3F,0xF8,0x20,0x00,0x20,0x00,0x40,0x00,
0x40,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x10,0x20,0x0A,0x20,0x7F,0xF8,0x40,0x08,0x5F,
0xE8,0x10,0x20,0x10,0x20,0x10,0x20,0x0F,0xC0,0x04,0x80,0x08,
0x88,0x10,0x88,0x60,0xF8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x00,0x80,0x37,0xF0,0x10,0x90,0x2F,0xF8,0x40,0x90,0x70,0x90,
0x1F,0xE0,0x57,0xF0,0x50,0x80,0x3F,0xF8,0x30,0x80,0x48,0x80,
0x47,0xFC,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x3F,0xF0,0x40,
0x08,0x44,0x08,0x7F,0xF8,0x0A,0x00,0x12,0x00,0x12,0x00,0x1F,
0xF0,0x02,0x00,0x02,0x00,0x7F,0xF0,0x02,0x00,0x00,0x00,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0x80,0x27,0xF8,
0x78,0x00,0x20,0x00,0x23,0xE0,0x2A,0x20,0x12,0x20,0xE2,0x20,
0x22,0x24,0x22,0x24,0x24,0x28,0x68,0x18,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x10,0x20,0x10,0x90,0x1E,0x88,0x13,0xF8,0x10,
0x80,0x7C,0x80,0x44,0x90,0x44,0x60,0x44,0x60,0x44,0x40,0x44,
0xA8,0x39,0x28,0x02,0x18,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x03,0x00,0x04,0x80,0x08,0x40,0x10,0x20,0x60,0x18,0x1F,0xE0,
0x02,0x00,0x02,0x00,0x3F,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,
0x7F,0xF8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x7F,0x48,0x10,
0x48,0x1E,0x48,0x21,0x48,0x22,0x48,0x52,0x48,0x0C,0x48,0x08,
0x08,0x30,0x78,0x24,0x90,0x24,0x88,0x44,0x88,0x40,0x40,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x80,0x24,0x90,0x12,0xA0,
0x00,0x80,0x4F,0x78,0x28,0x08,0x07,0xF8,0x18,0x08,0x18,0x08,
0x27,0xF8,0x28,0x08,0x48,0x08,0x40,0x30,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x30,0x80,0x48,0x80,0x57,0xF8,0x51,0x00,0x51,
0x00,0x51,0xF0,0x49,0x10,0x4A,0x10,0x6A,0x10,0x52,0x10,0x44,
0x10,0x48,0x10,0x40,0x60,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x27,0xF0,0x10,0x08,0x00,0x08,0x00,0x08,0x60,0x08,0x23,0xF0,
0x24,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x2C,0x08,0x14,0x08,
0x13,0xF8,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x02,
0x10,0x1F,0xE0,0x02,0x40,0x7F,0xFC,0x02,0x00,0x0C,0x00,0x33,
0xF0,0xD0,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x0F,0xE0,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x02,0x00,0x3F,0xF0,0x42,0x08,
0x52,0x08,0x1F,0xE0,0x22,0x00,0x22,0x00,0x7F,0xF8,0x08,0x80,
0x08,0x88,0x08,0x88,0x10,0x88,0x60,0xF0,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x00,0x80,0x20,0x80,0x1F,0xF8,0x00,0x80,0x40,
0x80,0x20,0x80,0x1F,0x70,0x11,0x00,0x12,0x20,0x22,0x20,0x24,
0x10,0x48,0xF8,0x47,0x08,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x3F,0xF0,0x02,0x00,0x02,0x00,0x7F,0xF0,
0x02,0x00,0x2A,0x10,0x2A,0x10,0x49,0x30,0x49,0x48,0x48,0x48,
0x0F,0xC0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x3F,0xF8,0x41,
0x00,0x5E,0xF0,0x5F,0xF0,0x50,0x10,0x4F,0xF0,0x49,0x20,0x49,
0x10,0x57,0x08,0x55,0x10,0x55,0x28,0x94,0xA8,0x07,0xC0,0x0E,
0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x80,0x08,0x80,0x08,0x40,
0x10,0x20,0x20,0x20,0x42,0x10,0x84,0x08,0x04,0x40,0x08,0x20,
0x10,0x20,0x10,0x10,0x3F,0xF0,0x00,0x08,0x0E,0x0E,0x0E,0x00,
0x00,0x00,0x00,0x11,0x00,0x2F,0xF0,0x32,0x90,0x4A,0xA0,0x24,
0x40,0x18,0x20,0x37,0xD8,0xC0,0x00,0x3F,0xF0,0x0A,0x40,0x12,
0x20,0x22,0x10,0x4E,0x08,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,
0x00,0x90,0x3F,0xF0,0x40,0x88,0x4F,0x90,0x4E,0x60,0x51,0x60,
0x51,0x24,0x51,0x58,0x0E,0x88,0x2A,0x10,0x29,0x28,0x49,0x28,
0x4F,0xC0,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x3F,0xF0,0x42,
0x10,0x5F,0xF0,0x43,0x10,0x44,0x90,0x58,0x50,0x40,0x10,0x3F,
0xE0,0x2A,0x10,0x49,0x30,0x48,0xA8,0x48,0x20,0x0F,0xC0,
};
#endif
#endif // __sfont__

View File

@@ -36,30 +36,36 @@
****************************************************************************************
*/
#include "gpio.h"
#include "app_api.h"
#include "app.h"
#include "prf_utils.h"
#include "custs1.h"
#include "custs1_task.h"
#include "user_custs1_def.h"
#include "user_custs1_impl.h"
#include "user_peripheral.h"
#include "user_periph_setup.h"
#include "adc.h"
#include "gpio.h" // GPIO控制相关头文件
#include "app_api.h" // 应用程序API
#include "app.h" // 应用程序核心功能
#include "prf_utils.h" // BLE配置文件工具
#include "custs1.h" // 自定义服务1
#include "custs1_task.h" // 自定义服务1任务
#include "user_custs1_def.h" // 自定义服务1定义
#include "user_custs1_impl.h" // 自定义服务1实现
#include "user_peripheral.h" // 用户外设相关
#include "user_periph_setup.h" // 用户外设设置
#include "adc.h" // ADC(模数转换)相关
#include "epd.h"
#include "epd.h" // 电子墨水屏驱动
/*
* GLOBAL VARIABLE DEFINITIONS
* 全局变量定义
* 这些变量使用__SECTION_ZERO("retention_mem_area0")属性放置在掉电保持内存区域
****************************************************************************************
*/
// 定时器ID用于系统定时任务
ke_msg_id_t timer_used __SECTION_ZERO("retention_mem_area0"); //@RETENTION MEMORY
// 指示计数器用于BLE通知计数
uint16_t indication_counter __SECTION_ZERO("retention_mem_area0"); //@RETENTION MEMORY
// 非数据库值计数器
uint16_t non_db_val_counter __SECTION_ZERO("retention_mem_area0"); //@RETENTION MEMORY
// ADC采样值用于电池电量检测
int adcval;
static uint8_t h24_format = 1; // 24小时制标志
static void get_holiday(void);
@@ -68,58 +74,134 @@ static void get_holiday(void);
****************************************************************************************
*/
/**
* @brief 更新ADC采样值并通过BLE发送电池电压数据
*
* 该函数执行以下操作:
* 1. 校准ADC偏移量
* 2. 获取电池电压采样值
* 3. 将采样值转换为实际电压值
* 4. 通过BLE发送电压值给连接的设备
*
* @return 返回计算后的电压值
*/
int adc1_update(void)
{
adc_offset_calibrate(ADC_INPUT_MODE_SINGLE_ENDED);
adcval = adc_get_vbat_sample(false);
int volt = (adcval*225)>>7;
// 校准ADC偏移使用单端输入模式
adc_offset_calibrate(ADC_INPUT_MODE_SINGLE_ENDED);
// 获取电池电压采样值
adcval = adc_get_vbat_sample(false);
// 将ADC值转换为实际电压值 (单位: mV)
int volt = (adcval*225)>>7;
struct custs1_val_set_req *req = KE_MSG_ALLOC_DYN(CUSTS1_VAL_SET_REQ, prf_get_task_from_id(TASK_ID_CUSTS1), TASK_APP, custs1_val_set_req, DEF_SVC1_ADC_VAL_1_CHAR_LEN);
req->conidx = app_env->conidx;
req->handle = SVC1_IDX_ADC_VAL_1_VAL;
req->length = DEF_SVC1_ADC_VAL_1_CHAR_LEN;
req->value[0] = volt&0xff;
req->value[1] = volt>>8;
KE_MSG_SEND(req);
return volt;
// 分配内存并构造BLE消息
struct custs1_val_set_req *req = KE_MSG_ALLOC_DYN(CUSTS1_VAL_SET_REQ,
prf_get_task_from_id(TASK_ID_CUSTS1),
TASK_APP,
custs1_val_set_req,
DEF_SVC1_ADC_VAL_1_CHAR_LEN);
// 设置连接索引
req->conidx = app_env->conidx;
// 设置特征值句柄
req->handle = SVC1_IDX_ADC_VAL_1_VAL;
// 设置数据长度
req->length = DEF_SVC1_ADC_VAL_1_CHAR_LEN;
// 设置电压值16位低字节在前
req->value[0] = volt&0xff;
req->value[1] = volt>>8;
// 发送BLE消息
KE_MSG_SEND(req);
return volt;
}
/****************************************************************************************/
/**
* 农历年份数据表2020-2051年
* 每个16位数据包含以下信息
* - 高4位(bit 15-12): 闰月月份0表示当年无闰月
* - 低12位(bit 11-0): 每个月的大小月标记1表示大月(30天)0表示小月(29天)
* 例如0x07954
* - 0: 无闰月
* - 7954: 从正月到十二月的大小月情况
*/
static const uint16_t lunar_year_info[32] =
{
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, //2020-2029
0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x0d0b6, 0x0d250, 0x0d520, 0x0dd45, //2030-2039
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x0b255, 0x06d20, 0x0ada0, //2040-2049
0x04b63, 0x09370, //2050-2051
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, //2020-2029
0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x0d0b6, 0x0d250, 0x0d520, 0x0dd45, //2030-2039
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x0b255, 0x06d20, 0x0ada0, //2040-2049
0x04b63, 0x09370, //2050-2051
};
// 额外的农历年份信息,用于标记特殊年份的闰月情况
static const uint32_t lunar_year_info2 = 0x48010000;
// 每个节气相对于"小寒"的秒数
/**
* 24节气时间数据表
* 存储了一年中24个节气相对于"小寒"的时间间隔(以秒为单位)
*
* 节气顺序:
* 1-6月小寒、大寒、立春、雨水、惊蛰、春分
* 7-12月清明、谷雨、立夏、小满、芒种、夏至
* 13-18月小暑、大暑、立秋、处暑、白露、秋分
* 19-24月寒露、霜降、立冬、小雪、大雪、冬至
*/
static int jieqi_info[] =
{
0, 1272283, 2547462, 3828568, 5117483, 6416376,
7726093, 9047327, 10379235, 11721860, 13072410, 14428379,
15787551, 17145937, 18501082, 19850188, 21190911, 22520708,
23839844, 25146961, 26443845, 27730671, 29010666, 30284551,
0, 1272283, 2547462, 3828568, 5117483, 6416376, // 小寒到春分
7726093, 9047327, 10379235, 11721860, 13072410, 14428379, // 清明到夏至
15787551, 17145937, 18501082, 19850188, 21190911, 22520708, // 小暑到秋分
23839844, 25146961, 26443845, 27730671, 29010666, 30284551, // 寒露到冬至
};
// 已知2020年"小寒"相对于1月1日的秒数
/**
* 2020年"小寒"节气的基准时间
* 相对于2020年1月1日的秒数
* 用于计算其他年份的节气时间
*/
#define xiaohan_2020 451804
/**
* 全局时间变量定义
* 公历日期相关变量:
* year: 年份如2025
* month: 月份0-11表示1-12月
* date: 日期0-30表示1-31日
* wday: 星期0-6表示星期日到星期六
*
* 农历日期相关变量:
* l_year: 农历年在lunar_year_info数组中的索引如4表示2024年
* l_month: 农历月份0-11表示正月到腊月最高位1表示闰月
* l_date: 农历日期0-29表示初一到三十
*
* 时间相关变量:
* hour: 小时0-23
* minute: 分钟0-59
* second: 秒0-59
*/
int year=2025, month=0, date=0, wday=3;
int l_year=4, l_month=11, l_date=1;
int hour=0, minute=0, second=0;
/**
* 获取农历月份的天数
*
* @param mon 月份编号最高位为1表示闰月
* @param yinfo_out 输出参数,用于返回年份信息
* @return 返回该月的天数29或30
*/
static int get_lunar_mdays(int mon, int *yinfo_out)
{
int lflag = mon&0x80;
mon &= 0x7f;
// 获取闰月标志(最高位)
int lflag = mon&0x80;
// 获取实际月份(去除闰月标志)
mon &= 0x7f;
// 取得当年的信息
int yinfo = lunar_year_info[l_year];
@@ -327,44 +409,71 @@ static int epd_wait_state;
static timer_hnd epd_wait_hnd;
typedef struct {
char *name;
uint8_t mon;
uint8_t day;
char *name;
uint8_t mon;
uint8_t day;
}HOLIDAY_INFO;
HOLIDAY_INFO hday_info[] = {
{"除夕", 0xc0|12, 30},
{"春节", 0x80| 1, 1},
{"元宵节", 0x80| 1, 15},
{"龙抬头", 0x80| 2, 2},
{"端午", 0x80| 5, 5},
{"七夕", 0x80| 7, 7},
{"中秋节", 0x80| 8, 15},
{"重阳", 0x80| 9, 9},
{"腊八", 0x80|12, 8},
// 农历传统节日0x80 表示农历日期0xc0 表示月末)
{"腊八", 0x80|12, 8}, // 农历腊月初八
{"小年", 0x80|12, 23}, // 农历腊月廿三
{"除夕", 0xc0|12, 30}, // 农历腊月最后一天
{"", 0x80| 1, 1}, // 农历正月初一
{"元宵", 0x80| 1, 15}, // 农历正月十五
{"龙抬头", 0x80| 2, 2}, // 农历二月初二
{"寒食", 0x80| 3, 3}, // 农历三月初三
{"端午", 0x80| 5, 5}, // 农历五月初五
{"七夕节", 0x80| 7, 7}, // 农历七月初七
{"中元节", 0x80| 7, 15}, // 农历七月十五
{"中秋节", 0x80| 8, 15}, // 农历八月十五
{"重阳节", 0x80| 9, 9}, // 农历九月初九
{"下元节", 0x80|10, 15}, // 农历十月十五
{"元旦节", 1, 1},
{"情人节", 2, 14},
{"妇女节", 3, 8},
{"植树", 3, 12},
{"愚人", 4, 1},
{"劳动", 5, 1},
{"青年节", 5, 4},
{"母亲", 5, 0x97}, // 5月第二个周日
{"儿童节", 6, 1},
{"父亲节", 6, 0xa7}, // 6月第三个周日
{"教师节", 9, 10},
{"国庆", 10, 1},
{"程序员", 10, 24},
{"万圣", 11, 1},
{"光棍", 11, 11},
{"平安夜", 12, 24},
// 阳历法定节假日和纪念日
{"元旦", 1, 1},
{"湿地日", 2, 2},
{"情人", 2, 14},
{"妇女", 3, 8},
{"植树", 3, 12},
{"权益日", 3, 15},
{"愚人", 4, 1},
{"读书日", 4, 23},
{"阅读日", 4, 23},
{"航天日", 4, 24},
{"劳动", 5, 1},
{"青年", 5, 4},
{"护士", 5, 12},
{"儿童", 6, 1},
{"环境日", 6, 5},
{"遗产日", 6, 8},
{"建党节", 7, 1},
{"建军节", 8, 1},
{"抗战日", 9, 3},
{"教师节", 9, 10},
{"安全日", 9, 15},
{"烈士日", 9, 30},
{"国庆节", 10, 1},
{"万圣节", 10, 31},
{"消防日", 11, 9},
{"记者节", 11, 8},
{"宪法日", 12, 4},
{"志愿日", 12, 5},
{"公祭日", 12, 13},
{"圣诞节", 12, 25},
{"", 0, 0},
// 特殊周期性节日
{"母亲节", 5, 0x97}, // 5月第二个周日
{"父亲节", 6, 0xa7}, // 6月第三个周日
{"感恩节", 11, 0xa4}, // 11月第四个周四
{"", 0, 0} // 结束标记
};
static char *jieqi_str = "小寒";
static char *holiday_str = "元旦";
static char *holiday_str = "元旦";
static void ldate_str(char *buf)
{
@@ -470,49 +579,113 @@ static uint8_t batt_cal(uint16_t adc_sample)
return batt_lvl;
}
/**
* 绘制电池电量图标
*
* @param x 图标左上角的x坐标
* @param y 图标中心的y坐标
*
* 图标说明:
* - 外框大小16x8像素
* - 电量显示:根据实际电量百分比填充内部
* - 电池正极2x2像素
*/
static void draw_batt(int x, int y)
{
int p = batt_cal(adcval);
p /= 10;
// 获取电池电量百分比并转换为显示段数0-10
int p = batt_cal(adcval);
p /= 10;
draw_rect(x, y-4, x+14, y+4, BLACK);
draw_box(x-2, y-1, x-1, y+1, BLACK);
// 绘制电池外框
draw_rect(x, y-4, x+14, y+4, BLACK);
// 绘制电池正极
draw_box(x-2, y-1, x-1, y+1, BLACK);
draw_box(x+12-p, y-2, x+12, y+2, BLACK);
// 绘制电量填充部分
draw_box(x+12-p, y-2, x+12, y+2, BLACK);
}
/**
* 绘制蓝牙图标
*
* @param x 图标中心的x坐标
* @param y 图标中心的y坐标
*
* 图标说明:
* - 总体大小7x9像素
* - 由一条垂直线和两个对称的三角形组成
*/
static void draw_bt(int x, int y)
{
int i;
int i;
draw_vline(x, y-4, y+4, BLACK);
for(i=0; i<5; i++){
draw_pixel(x-2+i, y-2+i, BLACK);
draw_pixel(x-2+i, y+2-i, BLACK);
}
draw_pixel(x+1, y-3, BLACK);
draw_pixel(x+1, y+3, BLACK);
// 绘制中心竖线
draw_vline(x, y-4, y+4, BLACK);
// 绘制两个对称的三角形
for(i=0; i<5; i++){
// 绘制上三角形的边
draw_pixel(x-2+i, y-2+i, BLACK);
// 绘制下三角形的边
draw_pixel(x-2+i, y+2-i, BLACK);
}
// 绘制三角形的补充点
draw_pixel(x+1, y-3, BLACK);
draw_pixel(x+1, y+3, BLACK);
}
/**
* 电子墨水屏更新等待定时器
*
* 功能说明:
* - 检查电子墨水屏是否处于忙状态
* - 如果忙则40ms后再次检查
* - 如果空闲,则完成更新流程并进入省电模式
*
* 电子墨水屏更新完成后的处理:
* 1. 发送深度睡眠命令(0x10, 0x01)
* 2. 关闭电源
* 3. 关闭硬件接口
* 4. 设置系统进入扩展睡眠模式
*/
static void epd_wait_timer(void)
{
if(epd_busy()){
epd_wait_hnd = app_easy_timer(40, epd_wait_timer);
}else{
epd_wait_hnd = EASY_TIMER_INVALID_TIMER;
epd_cmd1(0x10, 0x01);
epd_power(0);
epd_hw_close();
arch_set_sleep_mode(ARCH_EXT_SLEEP_ON);
}
if(epd_busy()){
// 屏幕仍在忙40ms后再次检查
epd_wait_hnd = app_easy_timer(40, epd_wait_timer);
}else{
// 屏幕更新完成
epd_wait_hnd = EASY_TIMER_INVALID_TIMER;
// 发送深度睡眠命令
epd_cmd1(0x10, 0x01);
// 关闭电源
epd_power(0);
// 关闭硬件接口
epd_hw_close();
// 设置系统进入扩展睡眠模式
arch_set_sleep_mode(ARCH_EXT_SLEEP_ON);
}
}
/**
* 绘制时钟界面
*
* @param flags 显示控制标志
* bit0-1: 更新模式(快速/正常)
* bit2: 是否显示蓝牙图标
*
* 显示内容包括:
* - 电池电量图标
* - 蓝牙连接状态图标(可选)
* - 大字号时间显示
* - 公历日期和星期
* - 农历日期
* - 节气和节日信息
*/
void clock_draw(int flags)
{
char tbuf[64];
char tbuf[64];
if(ota_state){
return;
@@ -533,12 +706,38 @@ void clock_draw(int flags)
}
// 使用大字显示时间
select_font(1);
sprintf(tbuf, "%02d:%02d", hour, minute);
draw_text(12, 25, tbuf, BLACK);
if(h24_format){
// 24小时制
select_font(0);
sprintf(tbuf, "%02d:%02d", hour, minute);
draw_text(5, 25, " ", BLACK);
draw_text(5, 38, " ", BLACK);
select_font(1);
draw_text(12, 25, tbuf, BLACK);
}else{
// 12小时制
int h = hour;
char *ampm = "A";
if(h>=12){
if(h>12) h -= 12;
ampm = "P";
}else if(h==0){
h = 12; // 0点显示为12点
}
sprintf(tbuf, "%02d:%02d", h, minute);
select_font(1);
draw_text(12, 25, tbuf, BLACK);
select_font(0);
// 显示AM/PM
draw_text(5, 25, ampm, BLACK);
draw_text(5, 38, "M", BLACK);
}
// 显示公历日期
sprintf(tbuf, "%4d年%2d月%2d日 星期%s", year, month+1, date+1, wday_str[wday]);
sprintf(tbuf, "%4d年%2d月%2d日 星期%s", year, month+1, date+1, wday_str[wday]);
select_font(0);
draw_text(15, 8, tbuf, BLACK);
@@ -567,33 +766,94 @@ void clock_draw(int flags)
/****************************************************************************************/
void user_svc1_ctrl_wr_ind_handler(ke_msg_id_t const msgid, struct custs1_val_write_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
/**
* 控制点写入指示处理函数
*
* @param msgid 消息ID
* @param param 写入参数
* @param dest_id 目标任务ID
* @param src_id 源任务ID
*
* 处理通过BLE接收到的控制命令
*/
void user_svc1_ctrl_wr_ind_handler(ke_msg_id_t const msgid,
struct custs1_val_write_ind const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
printk("Control Point: %02x\n", param->value[0]);
// 打印接收到的控制命令
printk("Control Point: %02x\n", param->value[0]);
}
void user_svc1_long_val_wr_ind_handler(ke_msg_id_t const msgid, struct custs1_val_write_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
/**
* 长值特征写入指示处理函数
*
* @param msgid 消息ID
* @param param 写入参数
* @param dest_id 目标任务ID
* @param src_id 源任务ID
*
* 处理命令:
* - 0x91: 时钟设置命令
* - 0xA0及以上: OTA升级相关命令
*/
void user_svc1_long_val_wr_ind_handler(ke_msg_id_t const msgid,
struct custs1_val_write_ind const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
//printk("Long value: %d\n", param->length);
if(param->value[0]==0x91){
clock_set((uint8_t*)param->value);
if(param->value[0]==0x91){
// 设置时钟
clock_set((uint8_t*)param->value);
// 更新显示(带蓝牙图标,快速更新模式)
clock_draw(DRAW_BT|UPDATE_FAST);
// 打印当前时间信息
clock_print();
}
else if(param->value[0]==0x90)
{
//修改24-12小时制
h24_format = !h24_format;
clock_draw(DRAW_BT|UPDATE_FAST);
clock_print();
}else if(param->value[0]>=0xa0){
ota_handle((u8*)param->value);
}
else if(param->value[0]>=0xa0)
{
// 处理OTA升级命令
ota_handle((u8*)param->value);
}
}
void user_svc1_long_val_att_info_req_handler(ke_msg_id_t const msgid, struct custs1_att_info_req const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id)
/**
* 长值特征属性信息请求处理函数
*
* @param msgid 消息ID
* @param param 请求参数
* @param dest_id 目标任务ID
* @param src_id 源任务ID
*
* 响应BLE客户端的属性信息请求
*/
void user_svc1_long_val_att_info_req_handler(ke_msg_id_t const msgid,
struct custs1_att_info_req const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
struct custs1_att_info_rsp *rsp = KE_MSG_ALLOC(CUSTS1_ATT_INFO_RSP, src_id, dest_id, custs1_att_info_rsp);
// 分配响应消息内存
struct custs1_att_info_rsp *rsp = KE_MSG_ALLOC(CUSTS1_ATT_INFO_RSP,
src_id,
dest_id,
custs1_att_info_rsp);
// 设置连接索引
rsp->conidx = app_env[param->conidx].conidx;
// 设置属性索引
rsp->att_idx = param->att_idx;
// 设置长度为0
rsp->length = 0;
// 设置状态为无错误
rsp->status = ATT_ERR_NO_ERROR;
// 发送响应消息
KE_MSG_SEND(rsp);
}

View File

@@ -1,64 +0,0 @@
// 创建日志容器与清除按钮
const logDiv = document.createElement("div");
logDiv.id = "fixed-log-window";
document.body.appendChild(logDiv);
// 添加清除按钮
const clearBtn = document.createElement("button");
clearBtn.textContent = "清空日志";
clearBtn.className = "clear-log-btn";
logDiv.appendChild(clearBtn);
// 按钮点击事件
clearBtn.onclick = () => {
logDiv.querySelectorAll(".log-entry").forEach(entry => entry.remove());
};
// 覆盖 console.log保持原有功能
const originalLog = console.log;
console.log = function(...args) {
originalLog(...args);
const logLine = document.createElement("div");
logLine.className = "log-entry";
logLine.textContent = args.join(" ");
logDiv.appendChild(logLine);
logDiv.scrollTop = logDiv.scrollHeight; // 自动滚动
};
// 样式增强
const style = document.createElement("style");
style.textContent = `
#fixed-log-window {
/* 原有样式保持不变 */
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 200px;
background: rgba(0, 0, 0, 0.85);
color: #fff;
overflow-y: auto;
padding: 40px 10px 10px; /* 顶部留出按钮空间 */
font-family: monospace;
}
.clear-log-btn {
position: fixed;
right: 20px;
bottom: 215px;
padding: 4px 12px;
background: #ff4444;
border: none;
color: white;
cursor: pointer;
border-radius: 3px;
}
.clear-log-btn:hover {
background: #cc0000;
}
.log-entry {
padding: 4px 0;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
`;
document.head.appendChild(style);

609
weble/webApp.html Normal file
View File

@@ -0,0 +1,609 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HM CLOCK</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<!-- Tailwind 配置 -->
<script>
tailwind.config = {
theme: {
extend: {
colors: {
primary: '#3B82F6',
secondary: '#10B981',
accent: '#8B5CF6',
warning: '#F59E0B',
danger: '#EF4444',
dark: '#1E293B',
light: '#F8FAFC'
},
fontFamily: {
inter: ['Inter', 'sans-serif'],
},
},
}
}
</script>
<style type="text/tailwindcss">
@layer utilities {
.content-auto {
content-visibility: auto;
}
.btn-hover {
@apply transition-all duration-300 hover:shadow-lg transform hover:-translate-y-0.5;
}
.card-effect {
@apply bg-white rounded-xl shadow-md hover:shadow-lg transition-all duration-300;
}
.text-gradient {
@apply bg-clip-text text-transparent bg-gradient-to-r from-primary to-accent;
}
}
</style>
<style>
body {
font-family: 'Inter', sans-serif;
background-color: #f0f9ff;
background-image:
radial-gradient(at 40% 20%, rgba(59, 130, 246, 0.05) 0px, transparent 50%),
radial-gradient(at 80% 0%, rgba(139, 92, 246, 0.05) 0px, transparent 50%),
radial-gradient(at 0% 50%, rgba(16, 185, 129, 0.05) 0px, transparent 50%);
}
.log-entry {
animation: fadeIn 0.3s ease-in-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(5px); }
to { opacity: 1; transform: translateY(0); }
}
.pulse {
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
</style>
</head>
<body class="min-h-screen p-4 md:p-6 flex justify-center items-start font-inter text-dark">
<div class="w-full max-w-4xl">
<!-- 头部标题 -->
<header class="mb-6 text-center">
<h1 class="text-[clamp(1.8rem,4vw,2.5rem)] font-bold text-gradient mb-2">HM CLOCK 控制中心</h1>
</header>
<!-- 主内容卡片 -->
<div class="card-effect p-5 md:p-6 space-y-6">
<!-- 控制按钮区域 -->
<div class="flex flex-wrap gap-3 md:gap-4">
<button id="connect-button" class="bg-primary text-white px-5 py-2.5 rounded-lg flex items-center gap-2 btn-hover font-medium">
<i class="fa fa-bluetooth"></i> 连接设备
</button>
<button id="setime-button" class="bg-warning text-white px-5 py-2.5 rounded-lg flex items-center gap-2 btn-hover font-medium opacity-50 cursor-not-allowed" disabled>
<i class="fa fa-clock-o"></i> 同步时间
</button>
<button id="upfirm-button" class="bg-accent text-white px-5 py-2.5 rounded-lg flex items-center gap-2 btn-hover font-medium opacity-50 cursor-not-allowed" disabled>
<i class="fa fa-refresh"></i> 固件升级
</button>
<button id="send90-button" class="bg-secondary text-white px-5 py-2.5 rounded-lg flex items-center gap-2 btn-hover font-medium opacity-50 cursor-not-allowed" disabled>
<i class="fa fa-send"></i> 切换时制
</button>
</div>
<!-- 设备信息区域 -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 p-4 bg-gray-50 rounded-lg border border-gray-100">
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center text-primary">
<i class="fa fa-microchip"></i>
</div>
<div>
<p class="text-gray-500 text-sm">设备名称</p>
<p id="device_name" class="font-semibold">未连接</p>
</div>
</div>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-warning/10 flex items-center justify-center text-warning">
<i class="fa fa-bolt"></i>
</div>
<div>
<p class="text-gray-500 text-sm">当前电压</p>
<p id="current_voltage" class="font-semibold">--.- V</p>
</div>
</div>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-secondary/10 flex items-center justify-center text-secondary">
<i class="fa fa-calendar"></i>
</div>
<div>
<p class="text-gray-500 text-sm">设备时间</p>
<p id="current_time" class="font-semibold">--:--:--</p>
</div>
</div>
<div class="flex items-center gap-3">
<div class="w-10 h-10 rounded-full bg-accent/10 flex items-center justify-center text-accent">
<i class="fa fa-laptop"></i>
</div>
<div>
<p class="text-gray-500 text-sm">系统时间</p>
<p id="system_time" class="font-semibold">加载中...</p>
</div>
</div>
</div>
<!-- 进度条区域 -->
<div id="progress-container" class="hidden">
<p class="text-sm font-medium text-gray-600 mb-1">固件升级进度</p>
<div class="h-2 bg-gray-100 rounded-full overflow-hidden">
<div id="update_progress_bar" class="h-full bg-gradient-to-r from-primary to-accent w-0 transition-all duration-300"></div>
</div>
<p id="update_progress_text" class="text-xs text-gray-500 mt-1">0%</p>
<div id="update_progress" class="hidden"></div>
</div>
<!-- 日志终端区域 -->
<div class="space-y-2">
<div class="flex justify-between items-center">
<h3 class="font-semibold text-gray-700 flex items-center gap-2">
<i class="fa fa-terminal text-primary"></i> 设备日志
</h3>
<button id="clear-log-btn" class="text-xs text-gray-500 hover:text-danger transition-colors">
<i class="fa fa-trash-o"></i> 清空日志
</button>
</div>
<div id="log-window" class="bg-gray-900 text-gray-100 text-xs md:text-sm rounded-lg h-48 md:h-64 overflow-y-auto p-3 font-mono">
<div class="text-gray-400 log-entry">终端已启动,等待设备连接...</div>
</div>
</div>
</div>
<!-- 页脚信息 -->
<footer class="mt-6 text-center text-xs text-gray-500">
<p>HM CLOCK蓝牙控制工具 &copy; https://github.com/tpunix/HMCLOCK</p>
</footer>
</div>
<script src="https://cdn.sheetjs.com/crc-32-latest/package/crc32.js"></script>
<script>
// 系统时间更新
function updateSystemTime() {
const now = new Date();
const timeString = now.toLocaleTimeString('zh-CN', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
const dateString = now.toLocaleDateString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
});
document.getElementById('system_time').textContent = `${dateString} ${timeString}`;
}
// 初始化更新系统时间并设置定时器
updateSystemTime();
setInterval(updateSystemTime, 1000);
// 日志系统
const logWindow = document.getElementById('log-window');
const clearLogBtn = document.getElementById('clear-log-btn');
// 自定义日志函数
function log(message, type = 'info') {
const timestamp = new Date().toLocaleTimeString('zh-CN', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
const logLine = document.createElement('div');
logLine.className = 'log-entry mb-1 border-b border-gray-800 pb-1';
let typeIcon = '';
let typeColor = '';
switch(type) {
case 'success':
typeIcon = '<span class="text-green-400 mr-1"><i class="fa fa-check-circle"></i></span>';
typeColor = 'text-green-300';
break;
case 'error':
typeIcon = '<span class="text-red-400 mr-1"><i class="fa fa-exclamation-circle"></i></span>';
typeColor = 'text-red-300';
break;
case 'warning':
typeIcon = '<span class="text-yellow-400 mr-1"><i class="fa fa-exclamation-triangle"></i></span>';
typeColor = 'text-yellow-300';
break;
case 'info':
default:
typeIcon = '<span class="text-blue-400 mr-1"><i class="fa fa-info-circle"></i></span>';
typeColor = 'text-gray-300';
}
logLine.innerHTML = `<span class="text-gray-500 mr-2">[${timestamp}]</span>${typeIcon}<span class="${typeColor}">${message}</span>`;
logWindow.appendChild(logLine);
logWindow.scrollTop = logWindow.scrollHeight;
}
// 替换console.log
const originalLog = console.log;
console.log = function (...args) {
originalLog(...args);
log(args.join(" "));
};
// 清空日志
clearLogBtn.addEventListener('click', () => {
logWindow.innerHTML = '<div class="text-gray-400 log-entry">日志已清空</div>';
});
// 核心功能代码
var connected = false;
var device = null;
var longValue = null;
var deviceTimeInterval = null; // 设备时间更新定时器
var deviceTimeBase = null; // 设备时间基准值
// 格式化时间显示
function formatTime(year, month, mday, hour, min, sec) {
month += 1;
return `${year}-${month.toString().padStart(2, '0')}-${mday.toString().padStart(2, '0')} ${hour.toString().padStart(2, '0')}:${min.toString().padStart(2, '0')}:${sec.toString().padStart(2, '0')}`;
}
// 更新设备时间显示
function updateDeviceTime() {
if (!deviceTimeBase) return;
// 获取基准时间
let { year, month, mday, hour, minute, second } = deviceTimeBase;
// 计算从基准时间开始经过的秒数
const now = new Date();
const elapsedSeconds = Math.floor((now - deviceTimeBase.timestamp) / 1000);
// 更新时间
let totalSeconds = second + elapsedSeconds;
second = totalSeconds % 60;
let totalMinutes = minute + Math.floor(totalSeconds / 60);
minute = totalMinutes % 60;
let totalHours = hour + Math.floor(totalMinutes / 60);
hour = totalHours % 24;
// 此处忽略天数变化,因为设备时间通常不会长时间运行
// 更新显示
document.getElementById('current_time').textContent = formatTime(year, month, mday, hour, minute, second);
}
function onClick() {
if(connected) disconnect();
else connectToDevice();
}
// 连接设备
async function connectToDevice() {
try {
// 更新按钮状态
const connectButton = document.getElementById('connect-button');
connectButton.disabled = true;
connectButton.innerHTML = '<i class="fa fa-spinner fa-spin"></i> 连接中...';
console.log('请求设备...');
device = await navigator.bluetooth.requestDevice({
filters: [{ namePrefix: "DLG-CLOCK" }],
optionalServices: [ 0xff00 ]
});
console.log('设备名称:', device.name);
document.getElementById('device_name').textContent = device.name;
device.ongattserverdisconnected = onDisconnect;
let server = await device.gatt.connect();
console.log('设备已连接');
let service = await server.getPrimaryService(0xff00);
let ctrlPoint = await service.getCharacteristic(0xff03);
let adc1Value = await service.getCharacteristic(0xff02);
longValue = await service.getCharacteristic(0xff01);
let cur_voltage = await adc1Value.readValue();
console.log('当前电压:', cur_voltage.getUint16(0, true) / 1000 + 'V');
document.getElementById('current_voltage').textContent = (cur_voltage.getUint16(0, true) / 1000).toFixed(2) + ' V';
let cur_time = await longValue.readValue();
let year = cur_time.getUint16(0, true),
month = cur_time.getUint8(2),
mday = cur_time.getUint8(3),
hour = cur_time.getUint8(4),
minute = cur_time.getUint8(5),
second = cur_time.getUint8(6);
// 保存设备时间基准值和当前时间戳
deviceTimeBase = {
year, month, mday, hour, minute, second,
timestamp: new Date()
};
// 立即更新设备时间显示
updateDeviceTime();
// 设置定时器每秒更新一次设备时间
if (deviceTimeInterval) clearInterval(deviceTimeInterval);
deviceTimeInterval = setInterval(updateDeviceTime, 1000);
let now = new Date();
document.getElementById('system_time').textContent = formatTime(
now.getFullYear(), now.getMonth(), now.getDate(),
now.getHours(), now.getMinutes(), now.getSeconds()
);
connected = true;
document.getElementById('setime-button').disabled = false;
document.getElementById('upfirm-button').disabled = false;
document.getElementById('send90-button').disabled = false;
document.getElementById('setime-button').classList.remove('opacity-50', 'cursor-not-allowed');
document.getElementById('upfirm-button').classList.remove('opacity-50', 'cursor-not-allowed');
document.getElementById('send90-button').classList.remove('opacity-50', 'cursor-not-allowed');
connectButton.innerHTML = '<i class="fa fa-disconnect"></i> 断开连接';
connectButton.disabled = false;
} catch (error) {
console.log('连接失败:', error);
disconnect();
}
}
// 对时功能
async function onSetTime() {
const setimeButton = document.getElementById('setime-button');
setimeButton.disabled = true;
setimeButton.innerHTML = '<i class="fa fa-spinner fa-spin"></i> 同步中...';
try {
let now = new Date();
let year = now.getFullYear(),
month = now.getMonth(),
mday = now.getDate(),
wday = now.getDay(),
hour = now.getHours(),
minute = now.getMinutes(),
second = now.getSeconds();
let locale_str = now.toLocaleDateString('zh-CN-u-ca-chinese',{month:'numeric',day:'numeric'});
let l_month = locale_str.startsWith('闰') ? 128 : 0;
if (l_month) locale_str = locale_str.slice(1);
let [l_month_num, l_day] = locale_str.split('-').map(Number);
l_month += l_month_num;
let l_year = parseInt(now.toLocaleDateString('zh-CN-u-ca-chinese',{year:'numeric'}));
console.log('农历年:', l_year, '月:', l_month, '日:', l_day);
let buf = new Uint8Array(12);
buf.set([0x91, year % 256, Math.floor(year / 256), month, mday, hour, minute, second, wday, l_year - 2020, l_month - 1, l_day]);
await longValue.writeValue(buf);
// 更新设备时间基准值
deviceTimeBase = {
year, month: month, mday, hour, minute, second,
timestamp: new Date()
};
// 立即更新设备时间显示
updateDeviceTime();
console.log('同步时间成功!');
} catch (error) {
console.log('同步时间失败:', error);
} finally {
setimeButton.innerHTML = '<i class="fa fa-clock-o"></i> 同步时间';
setimeButton.disabled = false;
}
}
// 文件读取辅助函数
function readFileAsArrayBuffer(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsArrayBuffer(file);
});
}
// 固件标识查找
function find_patten(target, patten) {
for (let i = 0; i <= target.length - patten.length; i++) {
let match = true;
for (let j = 0; j < patten.length; j++) {
if (target[i + j] !== patten[j]) {
match = false;
break;
}
}
if (match) return i;
}
return -1;
}
// 发送命令
async function onSend90() {
const send90Button = document.getElementById('send90-button');
send90Button.disabled = true;
send90Button.innerHTML = '<i class="fa fa-spinner fa-spin"></i> 发送中...';
try {
let buf = new Uint8Array([0x90]); // 构造单字节命令
await longValue.writeValue(buf);
console.log('已发送切换命令');
} catch (err) {
console.log('发送失败:', err);
} finally {
send90Button.innerHTML = '<i class="fa fa-send"></i> 发送命令';
send90Button.disabled = false;
}
}
// 固件升级
async function onUpdate() {
const upfirmButton = document.getElementById('upfirm-button');
upfirmButton.disabled = true;
upfirmButton.innerHTML = '<i class="fa fa-spinner fa-spin"></i> 升级中...';
document.getElementById('progress-container').classList.remove('hidden');
let firm_buf, firm_size;
try {
console.log('准备打开文件');
const [handle] = await window.showOpenFilePicker({
types: [{ description: 'Firm files', accept: { 'text/plain': ['.bin'] } }]
});
const file = await handle.getFile();
let abuf = await readFileAsArrayBuffer(file);
firm_buf = new Uint8Array(abuf);
firm_size = file.size;
} catch (err) {
console.log('文件读取失败:', err);
upfirmButton.innerHTML = '<i class="fa fa-refresh"></i> 固件升级';
upfirmButton.disabled = false;
document.getElementById('progress-container').classList.add('hidden');
return;
}
let firm_magic = new Uint8Array([0x79, 0x13, 0xa5, 0xf9, 0x86, 0xec, 0x5a, 0x06]);
let pos = find_patten(firm_buf, firm_magic);
if (pos == -1) {
console.log('无效固件: 未找到版本号!');
upfirmButton.innerHTML = '<i class="fa fa-refresh"></i> 固件升级';
upfirmButton.disabled = false;
document.getElementById('progress-container').classList.add('hidden');
return;
}
let firm_ver = firm_buf[pos + 9] * 256 + firm_buf[pos + 8];
let firm_crc = CRC32.buf(firm_buf);
console.log('固件版本:', firm_ver, '大小:', firm_size, 'CRC:', (firm_crc >>> 0).toString(16));
let buf = new Uint8Array(136);
let view = new DataView(buf.buffer);
buf[0] = 0xa0;
view.setUint16(2, firm_size, true);
await longValue.writeValue(buf);
let sent = 0;
const totalSize = firm_size + 64;
const progressBar = document.getElementById('update_progress_bar');
const progressText = document.getElementById('update_progress_text');
try {
for (let i = 0; i < totalSize; i += 256) {
buf.fill(0xff);
if (i === 0) {
view.setUint32(8, 0x00aa5170, true);
view.setUint32(12, firm_size, true);
view.setUint32(16, firm_crc, true);
view.setUint32(36, 0xa50f0000 + firm_ver, true);
buf[40] = 0;
buf[0] = 0xa2;
buf.set(firm_buf.slice(sent, sent + 64), 72);
await longValue.writeValue(buf);
sent += 64;
} else {
buf[0] = 0xa2;
buf.set(firm_buf.slice(sent, sent + 128), 8);
await longValue.writeValue(buf);
sent += 128;
}
buf[0] = 0xa3;
buf.set(firm_buf.slice(sent, sent + 128), 8);
await longValue.writeValue(buf);
sent += 128;
// 更新进度条
const progress = Math.min(Math.round(100 * sent / totalSize), 100);
progressBar.style.width = `${progress}%`;
progressText.textContent = `${progress}%`;
document.getElementById('update_progress').textContent = `升级进度: ${progress}%`;
}
buf[0] = 0xa4;
buf.fill(0, 1, 4);
await longValue.writeValue(buf);
console.log('升级完成');
} catch (error) {
console.log('升级结束,蓝牙已断开');
} finally {
upfirmButton.innerHTML = '<i class="fa fa-refresh"></i> 固件升级';
upfirmButton.disabled = false;
document.getElementById('progress-container').classList.add('hidden');
}
}
// 断开连接
function disconnect() {
const connectButton = document.getElementById('connect-button');
connectButton.disabled = true;
connectButton.innerHTML = '<i class="fa fa-spinner fa-spin"></i> 断开中...';
document.getElementById('setime-button').disabled = true;
document.getElementById('send90-button').disabled = true;
document.getElementById('upfirm-button').disabled = true;
document.getElementById('setime-button').classList.add('opacity-50', 'cursor-not-allowed');
document.getElementById('upfirm-button').classList.add('opacity-50', 'cursor-not-allowed');
document.getElementById('send90-button').classList.add('opacity-50', 'cursor-not-allowed');
// 清除设备时间更新定时器
if (deviceTimeInterval) {
clearInterval(deviceTimeInterval);
deviceTimeInterval = null;
}
deviceTimeBase = null;
if (device && device.gatt.connected) {
device.gatt.disconnect();
}
onDisconnect();
}
// 断开回调
function onDisconnect() {
device = null;
connected = false;
document.getElementById('device_name').textContent = "未连接";
document.getElementById('current_voltage').textContent = "--.- V";
document.getElementById('current_time').textContent = "--:--:--";
const connectButton = document.getElementById('connect-button');
connectButton.innerHTML = '<i class="fa fa-bluetooth"></i> 连接设备';
connectButton.disabled = false;
console.log('设备已断开连接');
}
// 事件绑定
document.getElementById('connect-button').addEventListener('click', onClick);
document.getElementById('setime-button').addEventListener('click', onSetTime);
document.getElementById('upfirm-button').addEventListener('click', onUpdate);
document.getElementById('send90-button').addEventListener('click', onSend90);
</script>
</body>
</html>

View File

@@ -1,297 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Web Bluetooth Example</title>
</head>
<body>
<button id="connect-button">连接</button>
<button id="setime-button" disabled>对时</button>
<button id="upfirm-button" disabled>升级</button>
<div id="device_name"></div>
<div id="current_voltage"></div>
<div id="current_time"></div>
<div id="system_time"></div>
<div id="update_progress"></div>
<script src="log.js"></script>
<script src="https://cdn.sheetjs.com/crc-32-latest/package/crc32.js"></script>
<script>
var connected = false;
var device = null;
var longValue = null;
function formatTime(year, month, mday, hour, min, sec) {
month += 1;
if(month<10) month = '0'+month;
if(mday<10) mday = '0'+mday;
if(hour<10) hour = '0'+hour;
if(min<10) min = '0'+min;
if(sec<10) sec = '0'+sec;
return year+"-"+month+"-"+mday+" "+hour+":"+min+":"+sec+" ";
}
function onClick() {
if(connected) {
disconnect();
}else{
connectToDevice();
}
}
async function connectToDevice() {
try {
console.log('请求设备...');
device = await navigator.bluetooth.requestDevice({
filters: [{ namePrefix: "DLG-CLOCK"}]
, optionalServices: [ 0xff00 ]
});
console.log('device: ', device.name);
document.getElementById('device_name').textContent = "设备名: "+device.name;
device.ongattserverdisconnected = onDisconnect;
var server = await device.gatt.connect();
console.log('设备已连接!');
var service = await server.getPrimaryService( 0xff00 );
console.log('获得service: ', service.uuid);
var ctrlPoint = await service.getCharacteristic( 0xff03 );
var adc1Value = await service.getCharacteristic( 0xff02 );
longValue = await service.getCharacteristic( 0xff01 );
cur_voltage = await adc1Value.readValue();
console.log('cur_voltage:', cur_voltage);
document.getElementById('current_voltage').textContent = "当前电压: "+cur_voltage.getUint16(0, true);
var year, month, mday, wday, hour, minute, second;
cur_time = await longValue.readValue();
year = cur_time.getUint16(0, true);
month = cur_time.getUint8(2);
mday = cur_time.getUint8(3);
hour = cur_time.getUint8(4);
minute = cur_time.getUint8(5);
second = cur_time.getUint8(6);
document.getElementById('current_time').textContent = "当前时间: "+formatTime(year, month, mday, hour, minute, second);
var buf = new Uint8Array(10);
var today = new Date();
year = today.getFullYear();
month = today.getMonth();
mday = today.getDate();
wday = today.getDay();
hour = today.getHours();
minute = today.getMinutes();
second = today.getSeconds();
document.getElementById('system_time').textContent = "系统时间: "+formatTime(year, month, mday, hour, minute, second);
connected = true;
document.getElementById('setime-button').disabled = false;
document.getElementById('upfirm-button').disabled = false;
document.getElementById('connect-button').textContent = "断开";
} catch (error) {
console.log('连接失败:', error);
disconnect();
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
async function onSetTime() {
document.getElementById('setime-button').disabled = true;
var today = new Date();
year = today.getFullYear();
month = today.getMonth();
mday = today.getDate();
wday = today.getDay();
hour = today.getHours();
minute = today.getMinutes();
second = today.getSeconds();
locale_str = today.toLocaleDateString('zh-CN-u-ca-chinese',{month:'numeric',day:'numeric'});
l_month = 0;
if(locale_str.charAt(0)=='闰'){
l_month = 128;
locale_str = locale_str.substr(1,);
}
lstr_split = locale_str.split('-');
l_month += parseInt(lstr_split[0]);
l_mday = parseInt(lstr_split[1]);
locale_year = today.toLocaleDateString('zh-CN-u-ca-chinese',{year:'numeric'});
l_year = parseInt(locale_year.substr(0,4));
console.log('年:', l_year, '月:', l_month, '日:', l_mday);
var buf = new Uint8Array(12);
buf[0] = 0x91;
buf[1] = year%256;
buf[2] = year/256;
buf[3] = month;
buf[4] = mday;
buf[5] = hour;
buf[6] = minute;
buf[7] = second;
buf[8] = wday;
buf[9] = l_year-2020;
buf[10]= l_month-1;
buf[11]= l_mday;
await longValue.writeValue(buf);
document.getElementById('system_time').textContent = "系统时间: "+formatTime(year, month, mday, hour, minute, second);
console.log('同步时间成功!');
document.getElementById('setime-button').disabled = false;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
function readFileAsArrayBuffer(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsArrayBuffer(file);
});
}
function find_patten(target, patten) {
tlen = target.length;
plen = patten.length;
for(i=0; i<tlen-plen; i++){
for(j=0; j<plen; j++){
if(target[i+j] !== patten[j]){
break;
}
}
if(j==plen)
return i;
}
return -1;
}
async function onUpdate() {
document.getElementById('upfirm-button').disabled = true;
var firm_size;
var firm_buf;
try{
console.log('准备打开文件');
const file_handle = await window.showOpenFilePicker({
types: [{
description: 'Firm files',
accept: {
'text/plain': ['.bin'],
},
}]
});
console.log('选择文件: ', file_handle);
const file = await file_handle[0].getFile();
console.log('file: ', file);
abuf = await readFileAsArrayBuffer(file);
firm_buf = new Uint8Array(abuf);
firm_size = file.size;
}catch(err){
console.log('文件读取失败: ', err);
document.getElementById('upfirm-button').disabled = false;
return;
}
firm_magic = new Uint8Array([0x79, 0x13, 0xa5, 0xf9, 0x86, 0xec, 0x5a, 0x06]);
pos = find_patten(firm_buf, firm_magic);
if(pos == -1) {
console.log('无效固件: 未找到版本号!');
document.getElementById('upfirm-button').disabled = false;
return;
}
firm_ver = firm_buf[pos+9]*256+firm_buf[pos+8];
console.log('固件版本:', firm_ver);
console.log('固件大小:', firm_size);
firm_crc = CRC32.buf(firm_buf);
console.log('固件CRC:', (firm_crc >>> 0).toString(16));
var buf = new Uint8Array(136);
dataView = new DataView(buf.buffer);
console.log('开始升级');
buf[0] = 0xa0;
buf[1] = 0x00;
dataView.setUint16(2, firm_size, true);
await longValue.writeValue(buf);
var pos = 0;
for(i=0; i<firm_size+64; i+=256){
console.log('发送', i);
buf.fill(0xff);
if(i==0){
dataView.setUint32(8+0, 0x00aa5170, true);
dataView.setUint32(8+4, firm_size, true);
dataView.setUint32(8+8, firm_crc, true);
dataView.setUint32(8+28, (0xa50f0000+firm_ver), true);
buf[8+32] = 0;
buf[0] = 0xa2;
buf.set(firm_buf.subarray(pos, pos+64), 8+64);
await longValue.writeValue(buf);
pos += 64;
}else{
buf[0] = 0xa2;
buf.set(firm_buf.subarray(pos, pos+128), 8);
await longValue.writeValue(buf);
pos += 128;
}
buf[0] = 0xa3;
buf.set(firm_buf.subarray(pos, pos+128), 8);
await longValue.writeValue(buf);
pos += 128;
document.getElementById('update_progress').textContent =
'升级进度: '+((100*pos/(firm_size+64))>>0)+'%';
}
console.log('发送完毕');
buf[0] = 0xa4;
buf[1] = 0x00;
buf[2] = 0x00;
buf[3] = 0x00;
await longValue.writeValue(buf);
console.log('升级结束');
document.getElementById('upfirm-button').disabled = false;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
function disconnect() {
document.getElementById('setime-button').disabled = true;
if(!device)
return;
if(device.gatt.connected){
device.gatt.disconnect();
}
onDisconnect();
}
function onDisconnect() {
device = null;
console.log('设备已断开连接');
connected = false;
document.getElementById('setime-button').disabled = true;
document.getElementById('connect-button').textContent = "连接";
}
document.getElementById('connect-button').addEventListener('click', onClick);
document.getElementById('setime-button').addEventListener('click', onSetTime);
document.getElementById('upfirm-button').addEventListener('click', onUpdate);
</script>
</body>
</html>